1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программировании. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление

Строки в С++

Тема в разделе "Вопросы новичков и не только", создана пользователем ermackprogramis, 20 дек 2010.

  1. ermackprogramis

    ermackprogramis Гость

    Репутация:
    0
    Добрый вечер.Помогите, пожалуйста,не знаю как задать так, чтобы прога определяла слова, которые читаются справа налево однаково.
    Вот нормальное условие:

    В строке символов найти слова-палиндромы, которые однаково
    читаются справа налево и наоборот. Найти наибольшую длину этих слов.
    Если таких слов нет, то с каждого слова на непарной позиции убрать гласные и вывести их на экран.
     
  2. Rififi

    Rififi Гость

    Репутация:
    0
    ermackprogramis

    как задать так, чтобы прога определяла слова, которые читаются справа налево однаково.

    в цикле сравнивать первый символ и последний
    на следующей итерации - второй символ и предпоследний
    повторять до тех пор пока останется только один символ для сравнения или ни одного.
     
  3. ermackprogramis

    ermackprogramis Гость

    Репутация:
    0
    Я понял и в тоже время не понял.Не пойму как сделать проверку.Я сначала определяю слова,
    а потом как то нужно их проверить являются они палиндромами или нет.Я вот писал но далее не знаю.
    Код:
    // подключение библиотек
    #include <iostream>
    
    using namespace std; 
    
    // оголошение переменных
    char s[100];
    char scopy[100];
    char word[100][100];
    int n;
    
    //===функция ввода===
    void input()
    {
    cout<<"Input array"<<endl; 
    gets(s);			// ввод массива
    cout<<"Entered array :"<<endl;
    puts(s);			 // вывод массива
    }
    
    void solution()
    {
    strcpy(scopy,s);
    
    char *ptr; // указатель на лексему
    char *delimiter="., _!?:;"; 
    int i=0;
    ptr = strtok(scopy,delimiter); // первое слово рядка
    while(ptr!=NULL) // пошук слів
    {
    strcpy(word[i],ptr); // внесение слова в массив
    i++;
    ptr = strtok(NULL,delimiter); // следующее слово
    }
    n=i;
    }
    
    //===поиск слов-палиндромов===
    void words()
    {
    
    }
    
    //===функция вывода===
    void output()
    {
    for(int i=0;i<n;i++)
    {
    puts(word[i]); // печать слов у столбик
    }
    cout<<"Number of words"<<n<<endl; // количество слов
    }
    
    //===главная функция===
    int main()
    {
    input();
    solution();
    words();
    output();
    system("pause");
    }
    Помоги написать функцию определения слов-палиндромов,пожалуйста
     
  4. ierofant

    ierofant Гость

    Репутация:
    0
    Вот, на скорую руку набросал функцию для проверки. Если аргумент, это слово-палиндром она возвращает true, в противном случае false
    Код:
    bool check_str (std::string _str)
    {
    bool ret = true;
    for (std::string::iterator beg = _str.begin (), end = _str.end () - 1; beg < end; beg++, end--)
    if (*beg != *end) ret = false;
    return ret;
    }
     
  5. lazybiz

    lazybiz Well-Known Member

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    ierofant
    Кстати, если убрать переменную ret, в конце функции возвращать true, а после условия возвращать false то получится немного попроще, и циклу не придется доходить до конца, в случае если слово не палиндром.
     
  6. ierofant

    ierofant Гость

    Репутация:
    0
    Да, конечно можно. Но многими специалистами осуждается несколько точек выхода из функций. В больших фунциях это может усложнить понимание кода. А я стремлюсь к единообразию.

    Добавлено: Но цикл действительно было бы полезно сократить, здесь у меня никаких возражений.

    Код:
    bool check_str (std::string _str)
    {
    bool ret = true;
    for (std::string::iterator beg = _str.begin (), end = _str.end () - 1; beg < end; beg++, end--)
    if (*beg != *end) 
    {
    ret = false;
    break;
    }
    return ret;
    }
     
  7. lazybiz

    lazybiz Well-Known Member

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    Ну ты опять же усложняешь ситуацию)) Если следующее условие срабатывает, т.е.:
    ... то можно смело возвращать false ! И переменная ret здесь опять же не при чем...

    Для данного случая, специалистам не стоит обсуждать несколько точек выхода. Это просто будет бессмысленно и глупо, хоть и работоспособно.
     
  8. Rififi

    Rififi Гость

    Репутация:
    0
    код не мой ;)

    Код:
    int IsPalindrome (char *s)
    {
    char*a,*b,c=0;
    for(a=b=s;a<=b;c=(c?c==1?c=(*a&~32)-65>25u?*++a,
    1:2:c==2?(*--b&~32)-65<26u?3:2:c==3?(*b-65&~32)-
    (*a-65&~32)?*(b=s=0,a),4:*++a,1:0:*++b?0:1));
    return s!=0;
    }
    препод-дестройер((((:)
     
  9. lazybiz

    lazybiz Well-Known Member

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    Rififi
    Убей препода!
     
  10. ermackprogramis

    ermackprogramis Гость

    Репутация:
    0
    Уважаемые я теоретически понял но у меня не получается взгляните пожалуйста
    Код:
    // подключение библиотек
    #include "stdafx.h" 
    #include <iostream>
    
    using namespace std; 
    
    // оглашение переменных
    char s[100];
    char scopy[100];
    char word[100][100],w[25];
    int n;
    
    //===функция ввода===
    void input()
    {
    cout<<"Input array"<<endl; 
    gets(s);			// ввод массива
    cout<<"Enter array :"<<endl; 
    puts(s);			 // вывод массива
    }
    
    //===функция поиска слов===
    void solution()
    {
    strcpy(scopy,s);
    
    char *ptr; // указатель на искаемую лексему
    char *delimiter="., _!?:; \0"; // лексемы
    int i=0;
    ptr = strtok(scopy,delimiter); // первое слово рядка
    while(ptr!=NULL) // поиск слов
    {
    strcpy(word[i],ptr); // занесение слов в массив
    i++;
    ptr = strtok(NULL,delimiter); // следующее слово
    }
    n=i;
    }
    
    //===поиск слов палиндромов===
    bool words(char scopy[100])
    {
    size_t x(0), i, len(strlen(s) - 1), slen(len >> 1);
    for(i = 0; i < slen; ++i) 
    if(s[i] != s[len - i])
    return false; 
    return true;
    }
    
    void longword()
    {
    int max = strlen(word[0]);
    strcpy(w,word[0]);
    for(int i=0;i<n;i++)
    {
    if (max<strlen(word[i]))
    {
    max=strlen(word[i]);
    strcpy(w,word[i]);
    }
    cout<<"Word = "<<w<<" length = "<<max<<endl;
    }
    }
    
    //===функция вывода===
    void output()
    {
    cout<<"========================="<<endl;
    for(int i=0;i<n;i++)
    {
    puts(word[i]);
    }
    cout<<"Number of words"<<n<<endl;
    }
    //===главная функция===
    int main()
    {
    input();
    solution();
    words(scopy);
    longword();
    output();
    system("pause");
    }
     
  11. lazybiz

    lazybiz Well-Known Member

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    Это как? Найти длину наибольшего из палиндромов?
     
  12. ermackprogramis

    ermackprogramis Гость

    Репутация:
    0
    Нет,найбольшего из усех слов
     
  13. lazybiz

    lazybiz Well-Known Member

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    А почему именно этих слов?

    Здесь под словом 'таких' тоже все слова подразумеваются??
     
  14. ermackprogramis

    ermackprogramis Гость

    Репутация:
    0
    Из всех слов которые вводились на начале,определить найбольшее из них
     
  15. lazybiz

    lazybiz Well-Known Member

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    Ты чего мне тут сказки рассказываешь. Какие еще слова. По-условию у тебя строка символов вводится. Я тебе уже пол программы написал, и переделывать ее у меня нет желания.
     
  16. ermackprogramis

    ermackprogramis Гость

    Репутация:
    0
    Я не знаю как показать что бы что слово палиндром,если я не правильно высловился то извини,мне хоть что нибудь уже,хоть какой нибудь код.Хоть что то,что ты сделал может оно...
     
  17. lazybiz

    lazybiz Well-Known Member

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    Ну вот тебе хоть что-то:
    Код:
    #include <iostream.h>
    
    //
    // В строке символов найти слова-палиндромы, которые однаково читаются справа налево и наоборот.
    // Найти наибольшую длину этих слов.
    // Если таких слов нет, то с каждого слова на непарной позиции убрать гласные и вывести их на экран.
    //
    
    char *	separators	= " ,.;/*-+~!@#$%^&*()_+\\";
    
    int is_separator( char c )
    {
    for ( int i = 0; i < strlen( separators ); i++ ) {
    if ( c == separators[i] ) return 1;
    }
    return 0;
    }
    
    int is_palindrom( char *s, int n )
    {
    for ( int i = 0; i < n / 2; i++ ) {
    if ( s[i] != s[n - i - 1] ) return 0;
    }
    return 1;
    }
    
    int main()
    {
    int		i, j, k, len, max = 0;
    char *	s = "abba abcdefedcba apulaz zyz";
    
    for ( i = 0; i < strlen( s ); ) {
    
    while ( is_separator( s[i] ) ) i++;
    j = i;
    while ( !is_separator( s[i] ) && s[i] != '\0' ) i++;
    
    len = i - j;
    if ( len > max ) max = len;
    if ( is_palindrom( &s[j], len ) ) {
    for ( k = j; k < i; k++ ) {
    cout << s[k];
    }
    cout << endl;
    }
    }
    
    cout << "Maksimalnaja dlina slova: " << max;
    return 0;
    }
     
  18. ermackprogramis

    ermackprogramis Гость

    Репутация:
    0
    lazybiz спасибо огромное,то что надо. Вы и представить не можете как я благодарен и от чего вы меня спасли,по гроб жизни помнить буду.Спасибо большое.
     
  19. Rififi

    Rififi Гость

    Репутация:
    0
    ermackprogramis

    ... Вы и представить не можете ... от чего вы меня спасли ...

    Тоже мне, бином Ньютона. От армии, вестимо B)
     
  20. ermackprogramis

    ermackprogramis Гость

    Репутация:
    0
    Какие мы умные,а даже не угадали!!!
     
Загрузка...

Поделиться этой страницей