Форум программистов, компьютерный форум CyberForum.ru

Проверить, является ли введенная строка палиндромом - C++

Восстановить пароль Регистрация
 
Troo
1 / 1 / 0
Регистрация: 09.10.2013
Сообщений: 73
08.01.2014, 20:52     Проверить, является ли введенная строка палиндромом #1
Написать программу, которая проверяет, является ли введенная строка палиндро-
мом
"А роза упала на лапу азора" - выводит что не палиндром

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include<iostream>
#include <string>
#include<math.h>
#include<windows.h>
#include<string.h>
#include<stdio.h>
#include <ctype.h>
 
using namespace std;
 
char bufRus[256];
 
char* Rus(const char* text) {
      CharToOem(text, bufRus);
      return bufRus;
      }
char* deleted(char a[40]);
int palindrom(char a[40]);
 
int main()
{
    char s[40];
    cin.getline(s,40);
    cout << '\n';
    cout<<deleted(s);
    cout << '\n';
    if (palindrom(s)==0) cout<<"Yes"<<endl;
    else cout<<"No"<<endl;
 
    return 0;
}
char* deleted(char a[40])
{
     int n=strlen(a),t=0,p=0;
    for (int i=0;i<n;i++)
    if (a[i]==' '|| a[i]==',' || a[i]=='.' ) {t=t+1;
      for (int j=i;j<n;j++)
       a[j]=a[j+1];}
    a[n-t]='\0';
    for (int i=0;i<n;i++)
    if (a[i]==' '|| a[i]==',' || a[i]=='.' ) t=1;
    if (t==1)
        return deleted(a);
    else return a;
}
int palindrom(char a[40])
{
    int p=0;
    char b[40];
    for (int k=0;k<strlen(a);k++)
    b[k]=a[strlen(a)-k-1];
    for (int f=0;f<strlen(a);f++)
    if (a[f]!=b[f]) p=p+1;
    return p;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2014, 20:52     Проверить, является ли введенная строка палиндромом
Посмотрите здесь:

C++ Проверить, является ли строка, введённая с клавиатуры, палиндромом
Проверить, является ли введенная с клавиатуры строка целым числом C++
Написать функцию, проверяющую является ли введенная строка палиндромом C++
C++ Проверить, является ли строка палиндромом
C++ Проверить является ли строка палиндромом, учитывая пробелы и знаки препинания
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
09.01.2014, 15:56     Проверить, является ли введенная строка палиндромом #2
Не углубляясь в кривизку реализации, могу предположить, что дело в заглавной "А" в начале.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
09.01.2014, 16:45     Проверить, является ли введенная строка палиндромом #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
 
bool is_palindrome(const std::string &str)
{
    return std::equal(str.begin(), std::next(str.begin(), str.size()/2), str.rbegin());
}
 
int main()
{
    std::string tests[] = {
        "abcba",
        "abccba",
        "abccb",
        "a",
        "aa"
    };
    for (const std::string &str : tests)
    {
        std::cout << str << ": " << std::boolalpha << is_palindrome(str) << "\n";
    }
 
    std::string str;
    while (std::cin >> str)
    {
        std::cout << str << ": " << std::boolalpha << is_palindrome(str) << "\n";
    }
}
Добавлено через 2 минуты
Troo, Tulosba, так сойдет? (:

Добавлено через 4 минуты
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
#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
 
bool is_palindrome(const std::string &str)
{
    return std::equal(str.begin(), std::next(str.begin(), str.size()/2), str.rbegin());
}
 
void check(const std::string &str)
{
    std::cout << "Test [" << str << "]: " << std::boolalpha << is_palindrome(str) << "\n";
}
 
int main()
{
    std::string tests[] = {
        "abcba",
        "abccba",
        "abccb",
        "a",
        "aa"
    };
 
    std::for_each(std::begin(tests), std::end(tests), check);
 
    typedef std::istream_iterator<std::string> in;
    std::for_each(in(std::cin), in(), check);
}
Хотел сделать короче, а вышло также (:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
09.01.2014, 16:49     Проверить, является ли введенная строка палиндромом #4
Цитата Сообщение от outoftime Посмотреть сообщение
так сойдет?
Сошло бы. Но исходную проблему с регистром не решает
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
09.01.2014, 16:52     Проверить, является ли введенная строка палиндромом #5
outoftime, фраза "a bcba" является палиндромом, но, судя по всему, твоя программа скажет, что нет
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
09.01.2014, 18:25     Проверить, является ли введенная строка палиндромом #6
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
33
34
35
36
37
#include <iostream>
#include <string>
#include <algorithm>
#include <utility>
#include <iterator>
#include <locale>
 
bool is_palindrome(const std::string &str)
{
    return str.size()
        ? std::equal(str.begin(), std::next(str.begin(), str.size()/2), str.rbegin())
        : false;
}
 
void check(const std::string &str)
{
    std::string res;
    std::locale loc;
    using namespace std::placeholders;
    std::copy_if(str.begin(), str.end(), std::back_inserter(res),
                 std::bind(std::not2(std::equal_to<char>()), _1, ' '));
    std::transform(res.begin(), res.end(), res.begin(), std::bind(std::tolower<char>, _1, loc));
    std::cout << "Test [" << str << "]: " << std::boolalpha << is_palindrome(res) << "\n";
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
    std::string tests[] = {
        "А роза упала на лопу азора"
    };
 
    std::for_each(std::begin(tests), std::end(tests), check);
 
    std::string str;
    while (std::getline(std::cin, str)) check(str);
}
Tulosba, Evg, Ппц, std::tolower не могу заставить с русским работать.

Добавлено через 8 минут
http://www.monkeycoder.co.nz/Communi...php?topic=7631 тут чувак разобрался как заставить std::tolower работать с русской локалью.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
09.01.2014, 18:36     Проверить, является ли введенная строка палиндромом #7
Цитата Сообщение от outoftime Посмотреть сообщение
не могу заставить с русским работать
Проблема еще может крыться в отсутствии необходимой локали.
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
09.01.2014, 18:52     Проверить, является ли введенная строка палиндромом #8
Не проще-ли воспользоваться стеком? Сначала посимвольно вбить туда фразу, а затем вывести её.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
09.01.2014, 19:58     Проверить, является ли введенная строка палиндромом #9
Цитата Сообщение от Arkaniy Посмотреть сообщение
Сначала посимвольно вбить туда фразу, а затем вывести её
Так ведь задача вовсе не в этом

У афтора уже есть готовое решение (видимо, кто-то ему его выдал). Он всего лишь не может решить проблему со строчными/прописными буквами

Вариант из поста #6 является стандартным монстром, родившимся в write-only языках. Смысл школьных задач в том и состоит, чтобы самому всё реализовать, а не использовать трёхэтажные конструкции из шаблонов, в которых без поллитра ничего прочитать невозможно
Troo
1 / 1 / 0
Регистрация: 09.10.2013
Сообщений: 73
09.01.2014, 20:40  [ТС]     Проверить, является ли введенная строка палиндромом #10
Спасибо все, за я поняла что смысл с заглавной буквой "А", поняла как реализовать)
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
09.01.2014, 20:42     Проверить, является ли введенная строка палиндромом #11

Не по теме:

У меня без трёхэтажных конструкций


Сначала нужно изменить кодировку на ср1251
C++
1
system("chcp 1251");
После этого русские буквы будут лежать в таком диапазоне
Код
-32 - а     -64 - А
-1  - я     -33 - Я
проверять каждую букву и, если входит в диапазон заглавных букв, то прибавлять 32.
Только буква "ё" лежит под другим номером. Остальные подходят под этот приём.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
09.01.2014, 21:10     Проверить, является ли введенная строка палиндромом #12
Цитата Сообщение от Arkaniy Посмотреть сообщение
У меня без трёхэтажных конструкций
Так пост #6 не ты писал

Цитата Сообщение от Arkaniy Посмотреть сообщение
После этого русские буквы будут лежать в таком диапазоне
Зачем? Ведь всё уже украдено до нас: tolower, toupper, которые умеют работать в том числе и с учётом локали
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
09.01.2014, 22:15     Проверить, является ли введенная строка палиндромом #13
Цитата Сообщение от Evg Посмотреть сообщение
трёхэтажные конструкции из шаблонов, в которых без поллитра ничего прочитать невозможно
Можете привести мой код к читабельному виду?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
09.01.2014, 22:32     Проверить, является ли введенная строка палиндромом #14
Цитата Сообщение от outoftime Посмотреть сообщение
Можете привести мой код к читабельному виду?
По сути, это будет просто разворачивание stl-ных функций. В первом приближении.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2014, 12:33     Проверить, является ли введенная строка палиндромом
Еще ссылки по теме:

C++ Проверить, является ли введенная с клавиатуры строка дробным отрицательным числом
Проверить является ли строка палиндромом C++
Проверить, является ли введенная с клавиатуры строка шестнадцатеричным числом C++

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
10.01.2014, 12:33     Проверить, является ли введенная строка палиндромом #15
Цитата Сообщение от outoftime Посмотреть сообщение
Можете привести мой код к читабельному виду?
Зачем? Вместо приведения к читабельному виду я бы просто написал без этих монстров. Задача простая, школьного уровня. Преподавателю (да и учащемуся) интересно решение, написанное СВОИМИ руками, а не чужими инструментами

Добавлено через 3 минуты
По смыслу что-то типа этого: Какой язык лучше учить?
Yandex
Объявления
10.01.2014, 12:33     Проверить, является ли введенная строка палиндромом
Ответ Создать тему
Опции темы

Текущее время: 05:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru