1. Мегаконкурс в апреле "Приведи друзей на codeby". Дарим деньги, подписку на журнал хакер и выдаем статус "Paid Access". Подробнее ...

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

Строки в С++

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

Наш партнер Genesis Hackspace
  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.339
    Симпатии:
    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.339
    Симпатии:
    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.339
    Симпатии:
    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.339
    Симпатии:
    0
    Это как? Найти длину наибольшего из палиндромов?
     
  13. ermackprogramis

    ermackprogramis Гость

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

    lazybiz Well-Known Member
    C\C++ Team

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

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

    ermackprogramis Гость

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

    lazybiz Well-Known Member
    C\C++ Team

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

    ermackprogramis Гость

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

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    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)
     
Загрузка...

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