Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
ZarinZomanu4
6 / 6 / 0
Регистрация: 27.05.2013
Сообщений: 93
1

Функция определения палиндрома

11.07.2017, 02:33. Просмотров 1163. Ответов 32
Метки нет (Все метки)

Напишите функцию, которая
называется IsPalindrom
возвращает bool
принимает параметр типа string и возвращает, является ли переданная строка палиндромом
Подскажите что не так с кодом?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string>
#include <vector>
using namespace std;
bool IsPalindrom (vector<string> x)
{   vector<string> y;
    for (auto a:x)
    {
         y.push_back(a);
    }
    if (x==y)
      return true;
    else
        return false;
    
    }
    int main() {
        string x;
        cin>> x;
    cout<<IsPalindrom (x);
    
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.07.2017, 02:33
Ответы с готовыми решениями:

Рекурсивная функция определения палиндрома строки.
Написал по заданию из книги Дейтелов. bool testPalindrome( const char arr,...

Не работает функция определения OC
Подскажите почему не работает эта функция? Запускаю под линуксом он должен...

Функция определения длины строки
Подскажите, как написать функцию в С++, аналогичную функции strlen(функцию...

функция определения времени выполнения
подскажите пожалуйста есть ли в С++ функция замера времени исполнения?? суть...

Функция определения простых чисел
Здравствуйте! Это функция определения простых чисел. bool isSimple(int num)...

32
DevAlone
324 / 276 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
Завершенные тесты: 4
11.07.2017, 02:56 2
Цитата Сообщение от ZarinZomanu4 Посмотреть сообщение
Подскажите что не так с кодом?
Всё, ты зачем то вектор строк передаёшь.
Должно быть что-то такое:
C++
1
2
3
4
5
6
7
bool IsPalindrom(const std::string& str)
{
  for(size_t i = 0; i < str.size() / 2; i++)
    if(str[i]!=str[str.size()-1-i])
      return false;
  return true;
}
1
easybudda
Модератор
Эксперт CЭксперт С++
10089 / 6000 / 1503
Регистрация: 25.07.2009
Сообщений: 11,375
11.07.2017, 03:03 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <string>
#include <algorithm>
 
bool is_palindrome(const std::string & s) {
    std::string r(s);
    std::reverse(r.begin(), r.end());
    return s == r;
}
 
int main() {
    std::string s;
    
    while ( std::cout << "String: " && std::getline(std::cin, s) && ! s.empty() )
        std::cout << "Is " << ( ( is_palindrome(s) ) ? "" : "not ") << "a palindrome." << std::endl;
    
    return 0;
}
1
DevAlone
324 / 276 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
Завершенные тесты: 4
11.07.2017, 03:08 4
easybudda, stl головного мозга...
0
easybudda
Модератор
Эксперт CЭксперт С++
10089 / 6000 / 1503
Регистрация: 25.07.2009
Сообщений: 11,375
11.07.2017, 03:17 5
DevAlone, вот это ты ржачно пошутил, ага!

C++
1
2
3
bool is_palindrome(const std::string & s) {
    return ( s.length() < 2 ) ? true : ( s[0] != s[s.length() - 1] ) ? false : is_palindrome(s.substr(1, s.length() - 2));
}
0
dawn artist
Заблокирован
11.07.2017, 03:59 6
Цитата Сообщение от easybudda Посмотреть сообщение
is_palindrome(s.substr(1, s.length() - 2))
Нужно больше временных объектов!
0
ZarinZomanu4
6 / 6 / 0
Регистрация: 27.05.2013
Сообщений: 93
11.07.2017, 11:19  [ТС] 7
Цитата Сообщение от easybudda Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <string>
#include <algorithm>
 
bool is_palindrome(const std::string & s) {
    std::string r(s);
    std::reverse(r.begin(), r.end());
    return s == r;
}
 
int main() {
    std::string s;
    
    while ( std::cout << "String: " && std::getline(std::cin, s) && ! s.empty() )
        std::cout << "Is " << ( ( is_palindrome(s) ) ? "" : "not ") << "a palindrome." << std::endl;
    
    return 0;
}
Можете обьяснить что к чему? не могу понять.
0
easybudda
Модератор
Эксперт CЭксперт С++
10089 / 6000 / 1503
Регистрация: 25.07.2009
Сообщений: 11,375
11.07.2017, 11:32 8
Цитата Сообщение от ZarinZomanu4 Посмотреть сообщение
Можете обьяснить что к чему?
Да всё просто: если длина строки меньше двух - палиндром (строку из одного символа или вообще пустую с какой стороны ни читай...), иначе если первый символ не равен последнему - не палиндром, иначе взять подстроку со второго до предпоследнего символа и проверить её. Кстати, так красивше:
C++
1
2
3
bool is_palindrome(const std::string & s) {
    return ( s.length() < 2 ) || ( s[0] == s[s.length() - 1] ) && is_palindrome(s.substr(1, s.length() - 2));
}
0
ZarinZomanu4
6 / 6 / 0
Регистрация: 27.05.2013
Сообщений: 93
11.07.2017, 11:51  [ТС] 9
Цитата Сообщение от DevAlone Посмотреть сообщение
const std::string& str
можете объяснить эту строчку?

Добавлено через 17 минут
Цитата Сообщение от easybudda Посмотреть сообщение
return ( s.length() < 2 ) || ( s[0] == s[s.length() - 1] ) && is_palindrome(s.substr(1, s.length() - 2)); }
если длина меньше 2 или совпадают 1 и 2 значения возвращается true.мудрено, но разобрался.
Цитата Сообщение от easybudda Посмотреть сообщение
const std::string & s
подскажите почему такая запись?а именно & s?
0
sourcerer
Модератор
Эксперт CЭксперт С++
4860 / 2049 / 324
Регистрация: 20.02.2013
Сообщений: 5,536
Записей в блоге: 24
Завершенные тесты: 1
11.07.2017, 12:03 10
Цитата Сообщение от ZarinZomanu4 Посмотреть сообщение
подскажите почему такая запись?а именно & s?
Это ссылка (reference). Позволяет избежать накладных расходов при копировании. Обычно аргумент передаётся в функцию по значению. Это значит, в функцию передаётся не оригинальный объект, а его копия. Передача по ссылке даёт команду компилятору работать непосредственно с объектом (с оригиналом), а не с его копией.
Сравните две функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
 
void change_arg(int & num) // передача по ссылке
{
    ++num;
    std::cout << "\nThe argument has not been copied. The value of the original variable: "
              << num;
}
 
void do_not_change_arg(int num) // передача по значению
{
    ++num;
    std::cout << "\nThe argument has been copied. The value of the copy: "
              << num;
};
 
int main()
{
    int z = 10;
    change_arg(z);
    std::cout << "\nThe value of z: " << z;
 
    z = 10;
    do_not_change_arg(z);
    std::cout << "\nThe value of z: " << z;
 
    return 0;
}
1
easybudda
Модератор
Эксперт CЭксперт С++
10089 / 6000 / 1503
Регистрация: 25.07.2009
Сообщений: 11,375
11.07.2017, 12:07 11
Цитата Сообщение от ZarinZomanu4 Посмотреть сообщение
подскажите почему такая запись?
В функцию передаётся ссылка на константную строку. Если строка уже существует где-то в памяти, нет смысла копировать её для передачи в параметре. Ну а поскольку строка в функции не должна меняться, передаётся именно const string &.
Цитата Сообщение от ZarinZomanu4 Посмотреть сообщение
мудрено, но разобрался.
Рекурсивные алгоритмы, как правило, логичнее и проще для понимания (к тому же по-своему красивы), но в реальных программах от них лучше уходить. Как верно подметил гражданин с самоопределяющим ником в шестом посте, при каждом рекурсивном вызове создаётся новая строка на пару символов короче исходной, что само по себе накладно. Плюс - стек не резиновый и при достаточно больших входных данных рекурсивная функция запросто приведёт к его переполнению.
1
GbaLog-
Любитель чаепитий
3165 / 1471 / 465
Регистрация: 24.08.2014
Сообщений: 5,204
Записей в блоге: 1
Завершенные тесты: 2
11.07.2017, 12:32 12
100500 раз уже обсуждалось.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <algorithm>
 
bool isPalindrom(const std::string & s)
{ return std::equal(s.begin(), s.begin() + s.size() / 2, s.rbegin()); }
    
 
int main()
{
    std::cout 
        << std::boolalpha
        << isPalindrom("asd") << "\n"
        << isPalindrom("asdsa") << "\n";
}
0
ZarinZomanu4
6 / 6 / 0
Регистрация: 27.05.2013
Сообщений: 93
11.07.2017, 13:02  [ТС] 13
Спасибо за ссылки понял.
0
DevAlone
324 / 276 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
Завершенные тесты: 4
11.07.2017, 14:26 14
Цитата Сообщение от easybudda Посмотреть сообщение
DevAlone, вот это ты ржачно пошутил, ага!
Твоё решение не эффективно, я об этом.

Добавлено через 2 минуты
Цитата Сообщение от ZarinZomanu4 Посмотреть сообщение
C++
1
const std::string& str
можете объяснить эту строчку?
& - передача по ссылке, вместо копирования строки и создания нового объекта компируется только её адрес(обычно 4-8 байт), что значительно эффективнее. const - указывает, что данные, на которые ссылается str не должны меняться.
1
ZarinZomanu4
6 / 6 / 0
Регистрация: 27.05.2013
Сообщений: 93
11.07.2017, 15:05  [ТС] 15
Получилось у меня вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <string>
using namespace std;
bool IsPalindrom (string str)
{
int len = str.size();
if(len>1)
{ for (int i=0;i<len/2; i++)
{
if (str[0]!=str[len-1])
{
return false;
}
}
return true;
}
else
{
return true;
}}
int main() {
string str;
cin>> str;
cout<<IsPalindrom (str);
return 0;
}
Только вот на сайте эта функция проверку почему то не проходит.
0
GbaLog-
Любитель чаепитий
3165 / 1471 / 465
Регистрация: 24.08.2014
Сообщений: 5,204
Записей в блоге: 1
Завершенные тесты: 2
11.07.2017, 15:31 16
Цитата Сообщение от DevAlone Посмотреть сообщение
компируется только её адрес
вообще-то нет.
Цитата Сообщение от ZarinZomanu4 Посмотреть сообщение
Получилось у меня вот так
ты постоянно первый символ с последним сравниваешь.

Добавлено через 14 секунд
Цитата Сообщение от DevAlone Посмотреть сообщение
компируется только её адрес
вообще-то нет.
Цитата Сообщение от ZarinZomanu4 Посмотреть сообщение
Получилось у меня вот так
ты постоянно первый символ с последним сравниваешь.
1
ZarinZomanu4
6 / 6 / 0
Регистрация: 27.05.2013
Сообщений: 93
11.07.2017, 15:37  [ТС] 17
Цитата Сообщение от GbaLog- Посмотреть сообщение
ты постоянно первый символ с последним сравниваешь.
Спасибо увидел.исправил на
C++
1
if (str[i]!=str[len-i-1])
Заработало)
0
Mournful Max
11.07.2017, 15:59
  #18

Не по теме:

Цитата Сообщение от GbaLog- Посмотреть сообщение
Цитата Сообщение от DevAlone Посмотреть сообщение
компируется только её адрес
вообще-то нет.
Грядет война... :D

0
ZarinZomanu4
6 / 6 / 0
Регистрация: 27.05.2013
Сообщений: 93
11.07.2017, 17:06  [ТС] 19
Подскажите, пытаюсь разобраться с векторами.
задача
Напишите функцию, которая
называется PalindromFilter
возвращает vector<string>
принимает vector<string> words и int minLength и возвращает все строки из вектора words, которые являются палиндромами и имеют длину не меньше minLength
Входной вектор содержит не более 100 строк, длина каждой строки не больше 100 символов.
Пример: abacaba, aba 5 abacaba
Пока сообразил такие 2 функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <string>
#include <vector>
using namespace std;
bool IsPalindrom (string str)
 {
    int len = str.size();
  if(len>1)
 {  for (int i=0;i<len/2; i++)
    {
        if (str[i]!=str[len-i-1])
        {
            return false;
        }
        }
        return true;
    }
 else
 {
    return true;
 }}
 vector<string> PalindromFilter(vector<string> words, int minLength)
    {   
        for(int i=0;i<words.size();i++)
    {
    if(IsPalindrom[i]==true && words[i].size()>minLength)
    {
        return word[i];
    }
    }
    
}
Задумка правильная или хромает так же как и реализация?
0
DevAlone
324 / 276 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
Завершенные тесты: 4
11.07.2017, 17:32 20
Цитата Сообщение от GbaLog- Посмотреть сообщение
вообще-то нет.
GbaLog-, с чего это вдруг?

Добавлено через 2 минуты
Цитата Сообщение от ZarinZomanu4 Посмотреть сообщение
if(len>1)
абсолютно бесполезная операция.
И форматируй код нормально, чтоб читать можно было
0
11.07.2017, 17:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2017, 17:32

Функция определения максимума двух чисел
Не понимаю как написать. Для данных вещественных чисел x и y рассчитать,...

функция F(x) в методе определения корней уравн.
Здраствуйте. Стоит задачка найти корни уравнения. в алгоритме встречается...

Функция. Проверка области определения аргумента
#include&lt;iostream&gt; #include&lt;Windows.h&gt; #include&lt;math.h&gt; using namespace std;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru