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

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 46, средняя оценка - 4.76
Blade
0 / 0 / 0
Регистрация: 30.11.2008
Сообщений: 13
#1

Найти в заданном тексте, состоящем из n строк, все слова палиндромы и числа палиндромы - C++

13.12.2008, 21:54. Просмотров 5847. Ответов 13
Метки нет (Все метки)

Сроки жутко горят поэтому надеюсь на вашу помощь:
Задача:
Найти в заданном тексте, состоящем из n строк, все слова палиндромы и числа палиндромы.(в словах допускается перенос на другую строку)
Палиндром-слово которое можно читать как слева направо так и наоборот : ШАЛАШ,ПОП или например фраза А РОЗА УПАЛА НА ЛАПУ АЗОРА. Или числа 1441, 121 и т.д.
Очень прошу помощи!!!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.12.2008, 21:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Найти в заданном тексте, состоящем из n строк, все слова палиндромы и числа палиндромы (C++):

Найти в тексте, состоящем из 1 строки, все слова и числа-палиндромы - C++
Найдите в заданном тексте, состоящем из 1 строки, все слова и числа-палиндромы. Необходимо ввести текст, в котором присутствуют и...

Найти все числа-палиндромы, которые не больше 100, и их квадраты тоже палиндромы - C++
Натуральное число называется палиндромом, если его запись читается однинакого с начала и с конца (4884, 393, 1). Найти все числа-паиндромы,...

Найти числа от 1 до 99 - палиндромы, которые при возведении в квадрат также дают палиндромы (используя циклы) - C++
Задание: Натуральное число является палиндромом, если его запись читается одинаково с начала и с конца (как, например , 393, 1). Найти...

Дана строка Найти и вывести все слова палиндромы - C++
Дана строка слова в который разделены пробелами необходимо найти и вывести все слова палиндромы. Вот кое какой код я накидал но он...

Слова-палиндромы в тексте - C++
#include <iostream> #include <cstring> #include <conio.h> using namespace std; int main() { int i; i=0; char str; ...

В строке, состоящей из слов и знаков препинания найти все слова-палиндромы - C++
В строке, состоящей из слов и знаков препинания(пробел . : , ! ? - ;) найти все слова-палиндромы. Программа должна обрабатывать любое...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Blade
0 / 0 / 0
Регистрация: 30.11.2008
Сообщений: 13
15.12.2008, 00:23  [ТС] #2
Что никто незнает?
Думаю что нужно брать слово до пробела, переворачивать его, сравнивать с оригиналом, потом брать второе слово и ту же операцию и т.д.
Потом первые два слова->переворот->сравнение, потом 2е и 3е с теми же операциями.
Потом первые 3 слова и т.д. хотябы до 10и слов.
Может кто нить знает как это реализовать или подкинет свою идею?А то вообще потерялся с этой задачей.
Очень надо...помогите чем можете.
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
15.12.2008, 03:12 #3
функция обращения строки
Код
 
#include <stdio.h>

#define MAXLINE  1000    /* максимальная длина строки */

/* обращает строку */
main()
{
    char *reverse(char []);
    char line[MAXLINE] = "разные слова палиндромы";
    
    printf("%s\n", reverse(line));
    return 0;
}

/* reverse: обращает строку s */
char *reverse(char s[])
{
    char *p, *q;
    int c;
    
    p = q = s;
    while (*q)
        q++;
    q--;
    for ( ; p < q; p++, q--)
        c = *p, *p = *q, *q = c;
    return s;
}
тебе надо проверять каждое слово, если оно палиндром записывать его куда-то
фразы полиндромы не делай, не потянешь (просто время потеряешь), по сложности смахивает на калькулятор вроде всё просто а подводных камней куча

АРОЗАУПАЛАНАЛАПУАЗОРА
проверяешь всё нормально вроде

УПАЛАНАЛАПУПАЛАНАЛАПУПАЛАНАЛАПУ
проскань попробуй
Blade
0 / 0 / 0
Регистрация: 30.11.2008
Сообщений: 13
15.12.2008, 19:19  [ТС] #4
Спасибо за разъяснение.
Только текст проги написан на С++(если не ошибаюсь) а нельзя ли написать на Си?Буду весьма признателен.
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
16.12.2008, 05:48 #5
Код
 
#include <stdio.h>
#include <string.h>

#define MAXLINE  1000    /* максимальная длина строки */
#define MAXWORD  100     /* максимальная длина слова  */

/* ищет в тексте слова палиндромы и числа палиндромы;
   без переносов; на винде оба языка на лине только инглиш */
main()
{
    char *reverse(char []);
    char line[MAXLINE], word[MAXWORD], tmp[MAXWORD], *p;
    int nc;
    
    while ((p = fgets(line, MAXLINE, stdin)) != NULL) {
        while (sscanf(p, "%s%n", word, &nc) == 1) {
            p += nc;
            strcpy(tmp, word);
            if (strcmp(word, reverse(tmp)) == 0 && strlen(word) > 1)
                printf("%s\n", word);
        }
    }        
    return 0;
}

/* reverse: обращает строку s */
char *reverse(char s[])
{
    char *p, *q;
    int c;
    
    p = q = s;
    while (*q)
        q++;
    for (q-- ; p < q; p++, q--)
        c = *p, *p = *q, *q = c;
    return s;
}
Blade
0 / 0 / 0
Регистрация: 30.11.2008
Сообщений: 13
17.12.2008, 21:25  [ТС] #6
нифига не пашет.
зодолбалсо уже дописывать, приписывать, переписывать - не хочет и все
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
17.12.2008, 22:01 #7
скомилируй и в командной строке выполни

echo "aba no 101 02 шалаш" | program.exe
должна найти под виндовс
aba
101
шалаш

под линем русские символы двубайтовые получаются и длина слова в два раза больше
Blade
0 / 0 / 0
Регистрация: 30.11.2008
Сообщений: 13
17.12.2008, 23:39  [ТС] #8
Заработала Спасибо.
Только почемуто работает она бесконечно.Ограничить бы её надо как нить.
Типа "введите количество строк".Как тока последнюю строку написал-выводит полиндромы и вырубается.
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
18.12.2008, 00:20 #9
Код
main()
{
    char *reverse(char []);
    char line[MAXLINE], word[MAXWORD], tmp[MAXWORD], *p;
    int nc;
    
    while ((p = fgets(line, MAXLINE, stdin)) != NULL) {
        if (p[0] == '\n' || (p[0] == '\r' && p[1] == '\n'))
            break;
        while (sscanf(p, "%s%n", word, &nc) == 1) {
            p += nc;
            strcpy(tmp, word);
            if (strcmp(word, reverse(tmp)) == 0 && strlen(word) > 1)
                printf("%s\n", word);
        }
    }        
    return 0;
}
пустая строка выход с учётом винды (если будешь файлы подключать потом)
Blade
0 / 0 / 0
Регистрация: 30.11.2008
Сообщений: 13
24.12.2008, 17:00  [ТС] #10
Спасибо все работает.
Кстати а можно как нибыдь удалять знаки препинания из введеной строки(чтоб уж препод к этому не придрался )?
Например:
Шалаш в лесу! Слово шалаш разпознается как полиндром.
В лесу шалаш! Слово шалаш не распознается. тк ! лишний символ
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
25.12.2008, 02:43 #11
Код
 
#include <stdio.h>
#include <ctype.h>
#include <string.h>

#define MAXLINE  1000    /* максимальная длина строки */
#define MAXWORD  100     /* максимальная длина слова  */

/* ищет в тексте слова палиндромы и числа палиндромы;
   без переносов; на винде оба языка на лине только инглиш */
main()
{
    char *reverse(char []);
    char line[MAXLINE], word[MAXWORD], tmp[MAXWORD], *p, *q;
    int nc;
    
    while ((p = fgets(line, MAXLINE, stdin)) != NULL) {
        if (p[0] == '\n' || (p[0] == '\r' && p[1] == '\n'))
            break;
        for (q = p; *q != '\0'; q++)
            if(ispunct(*q))
                *q = ' ';
        while (sscanf(p, "%s%n", word, &nc) == 1) {
            p += nc;
            strcpy(tmp, word);
            if (strcmp(word, reverse(tmp)) == 0 && strlen(word) > 1)
                printf("%s\n", word);
        }
    }        
    return 0;
}

/* reverse: обращает строку s */
char *reverse(char s[])
{
    char *p, *q;
    int c;
    
    p = q = s;
    while (*q)
        q++;
    for (q-- ; p < q; p++, q--)
        c = *p, *p = *q, *q = c;
    return s;
}
короче не рискнул if (!isalpha(*q) && !isdigit(*q)), т.к. может не распознать русские буквы как буквы
_д_м_и_т_р_и_й_
0 / 0 / 0
Регистрация: 11.02.2011
Сообщений: 35
15.08.2011, 11:30 #12
извинити за идиотский вопрос, просто я только недавно начал Си изучать и не все еще разобрал. как нужно изминить ваш код, что бы слова полиндромы не выводило на экран, а удаляло из строки и выводило измененную строку. подскажите пожалуйста.
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
17.08.2011, 01:40 #13
Цитата Сообщение от _д_м_и_т_р_и_й_
как нужно изминить ваш код, что бы слова полиндромы не выводило на экран, а удаляло из строки и выводило измененную строку
эту не поменяешь, так как она не сохраняет первоначальную строку (удаляет знаки пунктуации)

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
#include <stdio.h>
#include <string.h>
 
#define MAXLINE  1000   /* максимальная длина строки */
 
void del_char(char *s, int ch);
int is_palind(const char *s);
void replace(char *s, const char *from, const char *to);
 
/* чтобы слова полиндромы не выводило на экран,
 * а удаляло из строки и выводило измененную строку
 */
int main(void)
{
    char line[MAXLINE], tmp[MAXLINE], *p;
    
    while (fgets(line, sizeof line, stdin) != NULL) {
        strcpy(tmp, line);
        del_char(tmp, '\n');
        for (p = strtok(tmp, " ");
             p != NULL;
             p = strtok(NULL, " "))
            if (is_palind(p)) {
                printf("word: %s\n", p);
                replace(line, p, "");
            }
        printf("%s", line);
    }
    return 0;
}
 
/* должна удалять все символы ch из s */
void del_char(char *s, int ch)
{
    *strrchr(s, ch) = '\0';
}
 
int is_palind(const char *s)
{
    const char *p, *q;
    
    p = s;
    q = s + strlen(s) - 1;
    for ( ; *p == *q && p < q; p++, q--)
        ;
    return p >= q;
}
 
/* должна заменять все вхождения from на to в s */
void replace(char *s, const char *from, const char *to)
{
    printf("repl\n");
}
функция замены осталась

Код
[guest@localhost tests]$ ./t
aasdflkj 111 lkasjdflkj 333
word: 111
repl
word: 333
repl
aasdflkj 111 lkasjdflkj 333
[guest@localhost tests]$
палиндромы она видит
xAtom
914 / 739 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
17.08.2011, 10:02 #14
Blade , ещё вариант по вашей задачи
_д_м_и_т_р_и_й_ , и ваш вариант по вашей задачи.
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <stdio.h>
#include <ctype.h>
#include <string.h>
 
char* p_strrev(char* str);
int   p_ispoli(const char* str);
int   p_findpoli(const char* str, char* s);
void  str_erase(char* str, char* s);
void  print_poli(char* str, int ignore);
 
int  main(void) {
 
    char buf[128] = "The Super ATTA PPP, 5555, 55, 4 [repuS], adam-mada, optionals.";
//  gets(buf);
 
    print_poli(buf, 0);  // выводим список найденных палиндромов
 
    printf("src: %s\n", buf);  // исходная строка
    print_poli(buf, 1); // удалить все палиндромы из строки
    printf("dst: %s\n", buf);     // показать её
 
    getchar();
    return 0;
}
 
 
// реверсия строки
char* p_strrev(char* str) {
   char* s = str + (strlen(str)-1), ch, *tmp = str;
   while(str < s) {
       ch   = *str;
       *str = *s;
       *s   = ch;  
       ++str;
       --s;
   } 
   return tmp;
}
 
// сравнение на палиндром слова ABBA = true, ALKA = false
int   p_ispoli(const char* str) {
    const char* ls = str + (strlen(str)-1);
    for(; str < ls && *str == *ls; ++str, --ls);
    if(str == ls || ! ~(ls - str))
         return 1;
    return 0;
}
 
// поиск в строке палиндрома ABC = CBA
int  p_findpoli(const char* str, char* s) {
    if((str = strstr(str, s))) {
        if(! isalnum( *(str + strlen(s)) ))
                      return 1;
    }
    return 0;
}
 
 
// удаление из строки слова, str = "The ocean, ocean..." -> str_erase(str, "ocean") -> "The, ..." 
void  str_erase(char* str, char* s) {
    char* a, *b;
    int   len;
    do {
       for(a = str, b = s; *a == *b; *a++, *b++);
           if(! *b) {
                for(len = strlen(s); len; len--)
                      for(a = str, b = str + 1; *a; *a++ = *b++);
           }
    } while( *str++ );
}
 
 
// вот самая функция по выводу палиндромов ignore = 0, или удаление  палиндромов из строки ignore = 1
void  print_poli(char* str, int ignore) {
      char buf[48], *i, *src = str;
      while( *src ) {
           for(i = buf; isalnum(*src) && *src; *i++ = *src++);
           *i    = '\0';
           if(strlen(buf) > 1) {
                    if(p_ispoli(buf)) {
                           if(! ignore) 
                                 puts(buf);
                           else {
                                 str_erase(str, buf);
                                 src = str;
                           }
                    } else {
                        if(p_findpoli(src, p_strrev(buf))) {
                             if(! ignore) {
                                 puts(p_strrev(buf));
                                 puts(p_strrev(buf));
                             } else { 
                                 str_erase(str, buf);
                                 str_erase(str, p_strrev(buf));
                                 src = str;
                             }
                         }
                   }
             }
             for(; ! isalnum(*src) && *src; *src++);
    }
}
"The Super ATTA PPP, 5555, 55, 4 [repuS], adam-mada, optionals."
Результат:
Super
repuS
ATTA
PPP
5555
55
adam
mada

src: The Super ATTA PPP, 5555, 55, 4 [repuS], adam-mada, optionals.
dst: The , , , 4 [], -, optionals.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2011, 10:02
Привет! Вот еще темы с ответами:

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

Написать программу, которая выделяет любим способом в тексте слова палиндромы (слова, которые читаются одинаково справа налево и слева направо) - C++
Вот примеры - &quot;level, radar, dewed, civic, solos...&quot; и строка - &quot;When I get on a high level in programming?&quot;

Дана строка, содержащая разделенные пробелами слова, вывести все слова-палиндромы - C++
Дана строка, содержащая разделенные пробелами слова.Вивесты все имеющиеся слова-палиндлромы и их общее количество,срочно надо,у меня не...

Вывести на экран все слова палиндромы - C++
Помогите разобраться с задачей. по моей логике вроде верно но всё равно не работает( Вывести на экран все слова палиндромы...


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

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

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