Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Santex1
0 / 0 / 0
Регистрация: 22.02.2019
Сообщений: 8
1

Дана фраза. Проверить, является ли она палиндромом. Фраза может содержать знаки препинания и символы пробела

22.02.2019, 15:29. Просмотров 350. Ответов 10
Метки нет (Все метки)

Помогите пожалуйста.
Дана фраза. Проверить, является ли она палиндромом. Фраза может содержать знаки препинания и символы пробела на языке Си.
Есть небольшая наработка, но палиндромом является слово, а нужна фраза. Но как сделать именно палиндром, чтобы ещё содержал пробелы и знаки препинания.
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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
int main()
{
setlocale(LC_ALL,"RUS");
int i,j;
char str[20],str1[20];
puts("введите слово:\n");
gets(str);
j=0;
for(i=strlen(str)-1; i>=0; i--)
{
str1[j]=str[i];
j++;
}
str1[j]=0;
if(strcmp(str,str1)==0)
puts("да\n");
else
puts("нет\n");
return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.02.2019, 15:29
Ответы с готовыми решениями:

Как проверить, является ли введенная фраза/слово палиндромом?
Как проверить, является ли введенная фраза/слово палиндромом?

Дана фраза, в которой слова разделены одним пробелом, а сама фраза заканчивается точкой
Дана фраза, в которой слова разделены одним пробелом, а сама фраза заканчивается...

Является ли фраза палиндромом
Строки. Дана фраза. Выяснить является ли она палиндромом (одинаково читается с лева направо и...

Является ли фраза палиндромом. Указатели.
Здравствуйте! Решая задачу с палиндромами столкнулся с проблемой,что при изменении данных в одном...

Выяснить, является ли фраза палиндромом
Дана фраза. Выяснить, является ли она палиндромом (одинаково читается слева направо и справа –...

10
valen10
Параллельный Кот
1259 / 529 / 209
Регистрация: 25.03.2016
Сообщений: 1,186
Завершенные тесты: 1
22.02.2019, 15:45 2
Как вариант, выделить из строки буквы с помощью функции isalpha(), скопировать их в новую строку (можно и в исходной оставить, используя два указателя или индекса), привести к одному регистру функцией tolower() или toupper(), а дальше проверить палиндром.
0
FFPowerMan
212 / 131 / 58
Регистрация: 11.10.2018
Сообщений: 985
22.02.2019, 15:53 3
Тэги кода забыли поставить.
Господи, когда уже новички тэги кода научатся ставить?
Модераторы, может быть объявление повесить?
0
Байт
Эксперт C
20450 / 12980 / 2728
Регистрация: 24.12.2010
Сообщений: 27,161
22.02.2019, 16:59 4
Цитата Сообщение от FFPowerMan Посмотреть сообщение
Господи, когда уже новички тэги кода научатся ставить?
Имхо, на то они и новички. Вее мы когда-то под стол пешком ходили. И никакие банеры тут не помогут. Как и 1/2 = 0, например. И что в личку нельзя свои проблемы слать. И что коды надо показывать. И много другое. Тут единственный выход - учить каждого.
Вы видите всех эти необученных единым комом. А в этом коме - самые разные люди.
0
22.02.2019, 16:59
analogov net
179 / 129 / 66
Регистрация: 17.11.2018
Сообщений: 360
22.02.2019, 17:46 5
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
int main()
{
    char str[81] = "A roza, uPala na! lapu azoRa?", *p, *word;
    char buf[81] = "";
    const char * delim = " .,?!-:;";
 
    puts( str );
 
    word = strtok( str, delim );
    for( p = word; *p; p++ )
        *p = tolower( *p );
 
    strcpy( buf, word );
    while( word = strtok( NULL, delim ) )
    {
        for( p = word; *p; p++ )
            *p = tolower( *p );
 
        strcat( buf, word );
    }
 
    p = _strdup( buf );
    printf( strcmp( buf, _strrev( p ) ) ? "net\n" : "da\n" );
 
    free( p );
    return 0;
}
1
Santex1
0 / 0 / 0
Регистрация: 22.02.2019
Сообщений: 8
22.02.2019, 18:02  [ТС] 6
Огромное спасибо, но не могли бы вы объяснить пожалуйста каждую команду в данной программе. Я на ум туговат, да и новенький в данной среде программирования.
0
Байт
Эксперт C
20450 / 12980 / 2728
Регистрация: 24.12.2010
Сообщений: 27,161
22.02.2019, 19:45 7
Цитата Сообщение от Santex1 Посмотреть сообщение
объяснить пожалуйста каждую команду
Вы бы лучше сказали, какие именно моменты, строчки непонятны. А еще лучше - что в них непонятно. В противном случае ваш ум нисколько не заострится...
0
Santex1
0 / 0 / 0
Регистрация: 22.02.2019
Сообщений: 8
24.02.2019, 16:40  [ТС] 8
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
int main()
{
    char str[81] = "A roza, uPala na! lapu azoRa?", *p, *word;
    char buf[81] = "";
    const char * delim = " .,?!-:;";
 
    puts( str );
 
    word = strtok( str, delim ); //Что происходит в данной строке кода??
    for( p = word; *p; p++ ) //Что происходит в этом цикле?
        *p = tolower( *p );
 
    strcpy( buf, word );
    while( word = strtok( NULL, delim ) ) //Что происходит в этом цикле?
    {
        for( p = word; *p; p++ )
            *p = tolower( *p );
 
        strcat( buf, word ); 
    }
 
    p = _strdup( buf );
    printf( strcmp( buf, _strrev( p ) ) ? "net\n" : "da\n" ); //Как она сравнивает строки? Не понимаю как это работает. Зачем там символы "?" и ":" и можно ли их заменить? 
 
    free( p ); 
    return 0;
}
0
Байт
Эксперт C
20450 / 12980 / 2728
Регистрация: 24.12.2010
Сообщений: 27,161
24.02.2019, 21:29 9
Цитата Сообщение от Santex1 Посмотреть сообщение
word = strtok( str, delim ); //Что происходит в данной строке кода??
Функция strtok, эта та еще штучка! В ней ростки искусственного интеллекта. Попробуйте разобраться в ее работе. В Гугле, или в любой документации. Кода разберетесь, или даже просто попробуете разобраться, попробуем поговорить.
Цитата Сообщение от Santex1 Посмотреть сообщение
for( p = word; *p; p++ ) //Что происходит в этом цикле?
**p = tolower( *p );
p = word - это мы начинаем с первого символа слова. Пока (*p) очередной символ не станет терминальным нулем (концом слова) А это уже обеспечил "умный" strtok. *p = tolower( *p ); кажную

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

Не по теме:

Простите, какой-то странный сбой произошел


кажную буковку заменяет ее строчным эквивалентом.
Цитата Сообщение от Santex1 Посмотреть сообщение
printf( strcmp( buf, _strrev( p ) ) ? "net\n" : "da\n" ); //Как она сравнивает строки? Не понимаю как это работает. Зачем там символы "?" и ":" и можно ли их заменить?
free( p );
* * return 0;
}
Эта хитрая конструкция. Там есть и тернарный оператор, и просто должен же автор этой конструкции похвастаться своей эквибристикой. Будем у него спрашивать, что же, собственно, он хотел сказать, по простому. Не ответит - попробуем сами разобраться. Чай, не Бином Ньютона.

Добавлено через 4 минуты
Цитата Сообщение от Santex1 Посмотреть сообщение
ачем там символы "?" и ":" и можно ли их заменить?
Это простая штука. И удобная иногда
C
1
2
3
4
a = chavo ? b : c;
// Совершенно тоже самое, что
if (chavo) a = b;
else         a = c;
Только в одну строчку

Добавлено через 30 минут
Цитата Сообщение от Santex1 Посмотреть сообщение
printf( strcmp( buf, _strrev( p ) ) ? "net\n" : "da\n" );
Эту фиговину можно написать так
C
1
2
if (strcmp( buf, _strrev( p )) printf ("net\n");
else     printf ("da\n");
0
Santex1
0 / 0 / 0
Регистрация: 22.02.2019
Сообщений: 8
24.02.2019, 21:48  [ТС] 10
Спасибо, я уже разобрался с printf.
Можно ли мне подсказать про циклы пожалуйста.
Лишь нашёл, что первый аргумент - указатель на строку, которую нужно разбить на части (str),
второй аргумент - указатель на строку, содержащую набор символов-разделителей(delim). А как работают циклы, я так и не понял.
0
easybudda
Модератор
Эксперт JavaЭксперт CЭксперт С++
10297 / 6179 / 1555
Регистрация: 25.07.2009
Сообщений: 11,762
24.02.2019, 23:03 11
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
#include <stdio.h>
#include <ctype.h>
#include <string.h>
 
int is_palindrome(const char * s) {
    const char * t = s + strlen(s) - 1;
 
    while ( s < t ) {
        if ( ! isalpha(*s) )
            ++s;
        else if ( ! isalpha(*t) )
            --t;
        else if ( toupper(*s++) != toupper(*t--) )
            return 0;
    }
 
    return 1;
}
 
int main(void) {
    char buf[BUFSIZ];
 
    while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' )
        printf("It is %sa palindrome.\n", ( is_palindrome(buf) ) ? "" : "not ");
    
    return 0;
}
Код
[andrew@easybook string]$ gcc -Wall is_palindrome.c 
[andrew@easybook string]$ ./a.out 
String: A roza, uPala na! lapu azoRa?
It is a palindrome.
String: Jingle all the way
It is not a palindrome.
String: 
[andrew@easybook string]$
0
24.02.2019, 23:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2019, 23:03

Проверить является ли строка палиндромом, учитывая пробелы и знаки препинания
Задана строка, состоящая из символов. Символы объединяются в слова. Слова друг от друга отделяются...

Определить, является ли заданная строка (фраза) палиндромом
(7)Напишите программу определения, является ли заданная строка (фраза) палиндромом. (Палиндромом...

Определить, является ли заданная строка (фраза) палиндромом.
Определить, является ли заданная строка (фраза) палиндромом. Program kh; var s: string; ...


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

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

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