Строки в С++

Тема в разделе "C/C++/C#", создана пользователем ermackprogramis, 20 дек 2010.

  1. ermackprogramis

    ermackprogramis Гость

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

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

    Rififi Гость

    ermackprogramis

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

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

    ermackprogramis Гость

    Я понял и в тоже время не понял.Не пойму как сделать проверку.Я сначала определяю слова,
    а потом как то нужно их проверить являются они палиндромами или нет.Я вот писал но далее не знаю.
    Код (C++):
    // подключение библиотек
    #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 Гость

    Вот, на скорую руку набросал функцию для проверки. Если аргумент, это слово-палиндром она возвращает true, в противном случае false
    Код (C++):
    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. ermackprogramis

    ermackprogramis Гость

    Спасибо большое!!
     
  6. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

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

    ierofant Гость

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

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

    Код (C++):
    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;
    }
     
  8. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

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

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

    Rififi Гость

    код не мой ;)

    Код (C++):
    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;
    }
    препод-дестройер((((:)
     
  10. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

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

    ermackprogramis Гость

    Уважаемые я теоретически понял но у меня не получается взгляните пожалуйста
    Код (C++):
    // подключение библиотек
    #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");
    }
     
  12. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

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

    ermackprogramis Гость

    Нет,найбольшего из усех слов
     
  14. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

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

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

    ermackprogramis Гость

    Из всех слов которые вводились на начале,определить найбольшее из них
     
  16. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

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

    ermackprogramis Гость

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

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Ну вот тебе хоть что-то:
    Код (C++):
    #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;
    }
     
  19. ermackprogramis

    ermackprogramis Гость

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

    Rififi Гость

    ermackprogramis

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

    Тоже мне, бином Ньютона. От армии, вестимо B)
     
Загрузка...

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