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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 248, средняя оценка - 4.85
Maxvarlamov
1 / 1 / 0
Регистрация: 25.01.2010
Сообщений: 18
#1

Написать функцию, проверяющую является ли введенная строка палиндромом - C++

12.03.2010, 15:08. Просмотров 32592. Ответов 31
Метки нет (Все метки)

Помогите пожалуйста.
Реализовать функцию, которая принимает строку и возвращает истину, если строка является палиндромом.
1
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.03.2010, 15:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Написать функцию, проверяющую является ли введенная строка палиндромом (C++):

Проверить, является ли введенная строка палиндромом - C++
Написать программу, которая проверяет, является ли введенная строка палиндро- мом "А роза упала на лапу азора" - выводит что не...

Написать функцию, которая определяет, является ли строка палиндромом - C++
Всем привет! Облазил весь интернет, но так и не нашел решение задачи, не могу понять что означает bool isPolindrom(const char *s) как я...

Дана строка символов до точки. Составить программу, проверяющую, является ли данная строка палиндромом, т. е. читается ли она слева направо и справа н - C++
Дана строка символов до точки. Составить программу, проверяющую, является ли данная строка палиндромом, т. е. читается ли она слева направо...

Написать программу проверяющую является ли строка полиндромом - C++
Написать программу проверяющую является ли строка полиндромом

Разработать рекурсивную функцию, определяющую является ли заданная строка палиндромом - C++
разработать рекурсивную функцию, определяющую является ли заданная строка палиндромом

Разработать рекурсивную функцию, определяющую, является ли заданная строка палиндромом - C++
Разработать рекурсивную функцию, возвращающую значение: Определяющую, является ли заданная строка палиндромом.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
asics
Freelance
Эксперт С++
2847 / 1784 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
18.05.2011, 23:55 #16
Цитата Сообщение от протест Посмотреть сообщение
является рекурсивной функцией?????
Нет.
Цитата Сообщение от протест Посмотреть сообщение
или как ее написать
Посмотри тут.
0
Olga_
841 / 183 / 16
Регистрация: 01.08.2011
Сообщений: 502
01.08.2011, 18:01 #17
Цитата Сообщение от koc94ok Посмотреть сообщение
а как сделать чтоб из строки выдиралось по слову и проверялось на палиндромность "С"?

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
#include <stdio.h>
#include <string.h>
#define DELIMITERS  " .,:;\n\t"           /* символы-разделители */
#define N 500
 
/* проверка на симметричность */
int Symmetric(char *s)
{
   int i, j;
   i = 0;
   j = strlen(s) - 1;
   while(i < j && s[i] == s[j])
   {
       i++;
       j--;
   }
   return i >= j;
}
 
int main( )
{
   char sentence[N];       /* исходная строка */
   char *word;               /* очередное слово в предложении */
       int flag[256] = {0}, len, i, j;
   len = strlen(DELIMITERS);
   /* если символ с кодом i является символом-разделителем,   то полагаем flag[i] = 1: */
   for (i = 0; i < len; i++)
          flag[DELIMITERS[i]] = 1;
   fgets(sentence, N, stdin);       /* вводим строку с клавиатуры */
   i = 0;
   while (sentence[i])
   {
      /* пропускаем все разделители */
      while (sentence[i] && flag[sentence[i]])
         i++;
      j = i;                                               /* позиция начала нового слова */
      /* определяем позицию окончания очередного слова в строке */
      while (sentence[i] && !flag[sentence[i]])
         i++;
      /* выделяем память для очередного слова: */
      word = (char *)malloc((i - j + 1) * sizeof(char));
      /* копируем в переменную word символы очередного слова */
      strncpy(word, &sentence[j], i - j);
      word[i - j] = '\0';
      if(Symmetric(word))
         puts(word);
      free(word);      /* освобождаем динамическую память */
      word = NULL;
   }
   getchar();
   return 0;
}

Читайте http://www.twirpx.com/file/540580/
1
TheAthlete
153 / 153 / 13
Регистрация: 31.08.2010
Сообщений: 535
01.08.2011, 18:59 #18
Можно еще так сделать

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 <algorithm>
 
using std::cout;
using std::cin;
using std::endl;
using std::string;
using std::equal;
 
bool is_palindrom(const string &s) {
  return equal(s.begin(), s.end(), s.rbegin());
}
 
int main() {
  string palindrom;
  while(cout << "Enter palindrom: ", cin >> palindrom) {
    if (is_palindrom(palindrom))
      cout << " --- Ok. This is palindrom" << endl;
    else
      cout << " --- No. This is not palindrom" << endl;
  }
}
0
dr.curse
388 / 344 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
01.08.2011, 19:32 #19
Цитата Сообщение от Maxvarlamov Посмотреть сообщение
Помогите пожалуйста.
Реализовать функцию, которая принимает строку и возвращает истину, если строка является палиндромом.
C++
1
2
3
4
5
6
bool isPaly(string s)
{
    string s1=s;
    reverse(s1.begin(),s2.begin());
    return (s1==s);
}
0
Olga_
841 / 183 / 16
Регистрация: 01.08.2011
Сообщений: 502
01.08.2011, 19:46 #20
Цитата Сообщение от aram_gyumri Посмотреть сообщение
C++
1
2
3
4
5
6
bool isPaly(string s)
{
    string s1=s;
    reverse(s1.begin(),s2.begin());
    return (s1==s);
}
Такой алгоритм не эффективен для больших строк. А вдруг уже первый и последний символы не совпадают? В этом случае проверку уже надо прекратить. Поэтому именно что-то вроде этого:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
/* проверка на симметричность */
int Symmetric(char *s)
{
   int i, j;
   i = 0;
   j = strlen(s) - 1;
   while(i < j && s[i] == s[j])
   {
       i++;
       j--;
   }
   return i >= j;
}
1
(SkyNet)
22 / 40 / 6
Регистрация: 25.10.2011
Сообщений: 175
07.11.2011, 20:59 #21
Не работает, функции динамической памяти не правельно написаны.

Добавлено через 7 минут
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
#include <stdio.h>
#include <string.h>
#define DELIMITERS  " .,:;\n\t"           /* символы-разделители */
#define N 500
 
/* проверка на симметричность */
int Symmetric(char *s)
{
   int i, j;
   i = 0;
   j = strlen(s) - 1;
   while(i < j && s[i] == s[j])
   {
       i++;
       j--;
   }
   return i >= j;
}
 
int main( )
{
   char sentence[N];       /* исходная строка */
   char *word;               /* очередное слово в предложении */
           int flag[256] = {0}, len, i, j;
   len = strlen(DELIMITERS);
   /* если символ с кодом i является символом-разделителем,   то полагаем flag[i] = 1: */
   for (i = 0; i < len; i++)
              flag[DELIMITERS[i]] = 1;
   fgets(sentence, N, stdin);       /* вводим строку с клавиатуры */
   i = 0;
   while (sentence[i])
   {
      /* пропускаем все разделители */
      while (sentence[i] && flag[sentence[i]])
         i++;
      j = i;                                               /* позиция начала нового слова */
      /* определяем позицию окончания очередного слова в строке */
      while (sentence[i] && !flag[sentence[i]])
         i++;
      /* выделяем память для очередного слова: */
      char *word = new char[i-j+1];
      //word = (char *)malloc((i - j + 1) * sizeof(char));
      /* копируем в переменную word символы очередного слова */
      strncpy(word, &sentence[j], i - j);
      word[i - j] = '\0';
      if(Symmetric(word))
         puts(word);
      delete [] word;
      //free(word);      /* освобождаем динамическую память */
      word = NULL;
   }
   getchar();
   return 0;
}
Ага оно и видно что не сама делала, а ищё на ковото гонит, функции старые как свет. У меня так роботает. И на том спасибо!!!
0
Olga_
841 / 183 / 16
Регистрация: 01.08.2011
Сообщений: 502
07.11.2011, 21:27 #22
Цитата Сообщение от (SkyNet) Посмотреть сообщение
Не работает, функции динамической памяти не правельно написаны.

Ага оно и видно что не сама делала, а ищё на ковото гонит, функции старые как свет. У меня так роботает. И на том спасибо!!!
<stdlib.h> надо еще подключить. Вообще-то сама прописывала алгоритм.
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
08.11.2011, 21:00 #23
Внесу свой вклад.

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
56
57
58
59
#include <stdio.h>
 
const char * delimiters = " ,.?!:;'\"()[]{}&_|\\/\n";
 
char is_one_of( const char ch, const char * rvals )
{
    while( *rvals && *rvals != ch )
       rvals++;
 
    return *rvals && *rvals == ch;
}
 
char * find_word_begin( const char * ptr )
{
    while( *ptr && is_one_of( *ptr, delimiters ) )
       ptr++;
 
    return ptr;
}
 
char * find_word_end( const char * ptr )
{
    while( *ptr && !is_one_of( *ptr, delimiters ) )
       ptr++;
 
    return ptr;
}
 
void fout_range( const char * begin, const char * end, FILE * file )
{
    while( begin != end )
        fputc( *begin++, file );
}
 
char is_symmetrical( const char * begin, const char * end )
{
    while( *begin++ == *--end );
    return begin != end;
}
 
int main()
{
    #define STRING_LNG 256
    char str[ STRING_LNG ];
 
    fputs( "> ", stdout );
    fgets( str, STRING_LNG, stdin );
 
    char * word_begin = str,
         * word_end = str;
 
    while( *(word_end = find_word_end( word_begin = find_word_begin( word_end ) )) )
    {
        fout_range( word_begin, word_end, stdout );
        printf( ": %ssymmetrical\n", is_symmetrical( word_begin, word_end ) ? "" : "not " );
    }
 
    return 0;
}
Хотя, похоже, проблема уже решена.

Добавлено через 3 минуты

Не по теме:

Ого, первый пост вообще старый.

1
Novyichok_v_del
1 / 1 / 0
Регистрация: 15.06.2011
Сообщений: 29
10.12.2011, 10:31 #24
-Вопрос можно?
-Можно...
-Так вопрос заключается в том, что он якобы на строки, но не конкретно к палиндромам, нужно так забабахать, чтобы можно было вводить через пробелы прилагательные, и выводить их количество по окончаниям (Н-р: вывод: окончаний на -ая-столько-то; окончаний на -ое- столько-то; окончаний на -ый- столько-то
-......../

Добавлено через 16 минут
Цитата Сообщение от Novyichok_v_del Посмотреть сообщение
-Вопрос можно?
-Можно...
-Так вопрос заключается в том, что он якобы на строки, но не конкретно к палиндромам, нужно так забабахать, чтобы можно было вводить через пробелы прилагательные, и выводить их количество по окончаниям (Н-р: вывод: окончаний на -ая-столько-то; окончаний на -ое- столько-то; окончаний на -ый- столько-то
-......../
...а так я нашёл здесь кое-что, но оно нихрена не пашета именно в нём не реализован ввод с клавиатуры и плюс ко всему какой-то нахрен namspace, который не запускается на стареньком турбо-с++)
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.h>
#include <string.h>
#include <vector.h>
#include <locale.h>
using namespace std;
 
int main(int argc, char * argv[])
{
        setlocale(LC_ALL, "ru_RU.UTF-8");
 
        const wchar_t* strs[] = {L"зеленые", L"варённые", L"отварное", L"угарное", L"старая"};
 
        vector<wstring> v(strs, strs + 5);
 
        int k=0;
        for(int i=0; i<v.size(); i++)
        {
                if(v[i].size()>2 &&
                    (      v[i].substr(v[i].size()-2, 2) == L"ый"
                        || v[i].substr(v[i].size()-2, 2) == L"ая"
                        || v[i].substr(v[i].size()-2, 2) == L"ое"
                    ))
                        k++;
 
        }
        wcout << k << endl;
        return 0;
}
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
10.12.2011, 13:02 #25
Novyichok_v_del, хтож вам виноват, что сейчас на дворе 2011 год со стандартом C++11, а вы пользуетесь Turbo C++ 3 91-го года?
0
TheAthlete
153 / 153 / 13
Регистрация: 31.08.2010
Сообщений: 535
10.12.2011, 16:43 #26
тем более в новом стандарте (в том числе C++03 и тем более C++11) заголовочные файлы пишутся без .h, т.е
C++
1
2
3
#include <iostream>
#include <string>
#include <vector>
и лучше использовать
C++
1
2
using std::vector;
using std::wcout;
и т.д.

вместо

using namespace std;
0
Novyichok_v_del
1 / 1 / 0
Регистрация: 15.06.2011
Сообщений: 29
11.12.2011, 18:55 #27
Цитата Сообщение от talis Посмотреть сообщение
Novyichok_v_del, хтож вам виноват, что сейчас на дворе 2011 год со стандартом C++11, а вы пользуетесь Turbo C++ 3 91-го года?
отвечу, дабы прояснить ситуацию: учусь, а учат нас пока на истоках, тоесть закладывают фундамент...и вопросов в этом не должно быть на мой взгляд.
0
Spirited
7 / 7 / 0
Регистрация: 18.01.2009
Сообщений: 55
11.12.2011, 20:15 #28
Цитата Сообщение от Novyichok_v_del Посмотреть сообщение
какой-то нахрен namspace, который не запускается на стареньком турбо-с++)
Вас никто не заставляет писать namspace, если не пашет - удалите его, если все равно не пашет - оставте его, но удалите всего два символа .h в названиях файлов которые прописываються в инклуда.
0
David Sylva
1286 / 948 / 51
Регистрация: 17.05.2012
Сообщений: 2,687
12.07.2012, 11:52 #29
Может кому пригодится простенький вариант
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
#include <iostream> 
using namespace std; 
int main() 
{   
    char str[100];
    cout << "Inter a string " << endl; 
    cin.getline(str, 100);
    int size = strlen(str); 
    int i, j;  
    int count = 0; 
 
    for ( i = 0, j = size - 1; i < size / 2; i++, j--) 
    {  
        if(str[i] == str[j]) 
            count++;
    }  
 
   if( count == size / 2) 
        cout << "Palindrom " << endl;   
        
    else  
        cout << "Ne palindrom " << endl;  
        
}
2
sergei60
47 / 28 / 4
Регистрация: 10.06.2012
Сообщений: 372
07.11.2014, 16:52 #30
David Sylva,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream> 
#include <string.h>
using namespace std; 
int main() 
{   
    char s[100];
    cout << "введите строку" << endl; 
    cin.getline(s, 100);
    int n = strlen(s); 
int k =0;
    for (int i = 0;  i < n / 2; i++ ){
 
if(s[i]!=s[n-1-i])
k=1;
}
if(k==1)
    cout << "непалиндром " << endl;
 
      else 
    cout<<"палиндром"<<endl;
}
вот получился еще немножко короче . я избавился от J и сложностями с ++,обьявил просто переменную k как аналог булевой переменной.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.11.2014, 16:52
Привет! Вот еще темы с ответами:

Написать программу, которая проверяет, является ли введенная с клавиатуры строка дробным числом - C++
Написать программу, которая проверяет, является ли введенная с клавиатуры строка дробным числом.

Написать программу, которая определяет, является ли введенная с клавиатуры строка целым числом - C++
1. Написать программу, которая определяет, является ли введенная с клавиатуры строка целым числом. 2. Дана строка символов среди...

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

Написать программу, которая проверяет, является ли введенная с клавиатуры строка дробным отрицательным числом - C++
Сделайте пожалуйста. Нужно написать программу, которая проверяет, является ли введенная с клавиатуры строка дробным отрицательным числом.


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
07.11.2014, 16:52
Ответ Создать тему
Опции темы

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