Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ «Неделя вторая - Функции - Палиндром» #6

Войти
Регистрация
Восстановить пароль
Рейтинг: 3.00. Голосов: 2.

С++ «Неделя вторая - Функции - Палиндром» #6

Запись от acmades размещена 13.07.2017 в 14:03
Обновил(-а) acmades 15.07.2017 в 13:12 (Изменение категории)

Задание:
Напишите функцию, которая

называется IsPalindrom
возвращает bool
принимает параметр типа string и возвращает, является ли переданная строка палиндромом
Палиндром - это слово или фраза, которые одинаково читаются слева направо и справа налево.

Аргумент функции -> Результат
madam -> true
gentleman -> false

Моё решение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
bool IsPalindrom(string i) { //функция определения палиндрома, принимает строку, возвращает bool
    vector<char> r; //вспомогательный вектор сделаю
    int leight = size(i); //определю размер (сколько букв в строке)
    for (auto ch : i) { //положу строку в вектор
        r.push_back(ch); //каждую букву в вектор положу
    }
    for (auto ch2 : r) { //теперь у меня есть возможность обращаться к символам по индексу вектора
        if (ch2 != r[leight - 1]) return false; //сравниваю первый и последний и т.д. (второй и предпоследний)
        leight--; //"хороший" индекс - с последней буквы до первой дойдет, уменьшается
    }
    return true; //если предыдущий цикл прошел без "фальши", то возвращаем "тру" (значит строка - палиндром)
}
Идея такова: перегнать строку в вектор и, получив доступ к буквам по индексу, сравнивать с концов по буквам, если одинаковые буквы то - палиндром.
С одной стороны вроде нормально получилось(задачу решает), с другой - кажется можно короче как-то. Но я пока не вижу как. Может кто подскажет?
Всего комментариев 6

Комментарии

  1. Старый комментарий
    Мне очень понравилось ваше решение, оно понятно новичку почти полностью, но вот один момент я хотел бы прояснить. Не могли бы вы описать суть работы вот этой вот строки.
    C++
    1
    
    for (auto ch2 : r)
    . Если я правильно понимаю, то происходит переборка всех символов внутри вышеуказанного вектора и после этой переборки индекс каждого символа "складывается" в переменную "сh2". так?
    Запись от Albatrosso размещена 31.07.2017 в 18:59 Albatrosso вне форума
  2. Старый комментарий
    Цитата:
    Сообщение от Albatrosso Просмотреть комментарий
    Мне очень понравилось ваше решение, оно понятно новичку почти полностью, но вот один момент я хотел бы прояснить. Не могли бы вы описать суть работы вот этой вот строки.
    C++
    1
    
    for (auto ch2 : r)
    . Если я правильно понимаю, то происходит переборка всех символов внутри вышеуказанного вектора и после этой переборки индекс каждого символа "складывается" в переменную "сh2". так?
    Да, перебираем символы по порядку. Нет, не после переборки, а во время её. ch2 - это отдельный символ на каждом круге цикла в векторе, каждый раз разный. Начинается он с индекса 0. Начали с начала вектора(начало цикла), в ch2 положился первый символ, потом второй и т.д. А дальше (внутри цикла) уже сравниваем с последним, предпоследним и т.д.
    По крайней мере, у меня такое понимание процесса.
    Запись от acmades размещена 01.08.2017 в 02:10 acmades вне форума
  3. Старый комментарий
    Цитата:
    Сообщение от acmades Просмотреть комментарий
    Да, перебираем символы по порядку. Нет, не после переборки, а во время её. ch2 - это отдельный символ на каждом круге цикла в векторе, каждый раз разный. Начинается он с индекса 0. Начали с начала вектора(начало цикла), в ch2 положился первый символ, потом второй и т.д. А дальше (внутри цикла) уже сравниваем с последним, предпоследним и т.д.
    По крайней мере, у меня такое понимание процесса.
    Благодарен за объяснение)
    Запись от Albatrosso размещена 01.08.2017 в 13:09 Albatrosso вне форума
  4. Старый комментарий
    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    bool IsPalindrom(string s)
    {
        for(int i=0;;i++)
        {
            if (!(s[i] == s[s.size()-i-1]))
                return false;
            else if (( i == (s.size()-i-1) ) || (( i - (s.size()-i-1) ) == 1)) 
                return true;
            else
                continue;
        }
     
    }
    Запись от flash_back размещена 02.10.2017 в 15:40 flash_back вне форума
  5. Старый комментарий
    Цитата:
    Сообщение от flash_back Просмотреть комментарий
    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    bool IsPalindrom(string s)
    {
        for(int i=0;;i++)
        {
            if (!(s[i] == s[s.size()-i-1]))
                return false;
            else if (( i == (s.size()-i-1) ) || (( i - (s.size()-i-1) ) == 1)) 
                return true;
            else
                continue;
        }
    }
    Поддерживаю! Просто тогда я еще не знал, что строку, как массив символов можно использовать и что в цикле
    C++
    1
    
    for(int i=0;/*ТУТ может быть пусто*/;i++)
    Запись от acmades размещена 03.10.2017 в 07:34 acmades вне форума
  6. Старый комментарий
    Аватар для Avazart
    Используйте передачу по константной ссылке.
    C++
    1
    
    bool IsPalindrom(const string& s)
    Запись от Avazart размещена 03.10.2017 в 13:00 Avazart вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru