С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/55: Рейтинг темы: голосов - 55, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 30.11.2008
Сообщений: 13
1

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

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

Author24 — интернет-сервис помощи студентам
Сроки жутко горят поэтому надеюсь на вашу помощь:
Задача:
Найти в заданном тексте, состоящем из n строк, все слова палиндромы и числа палиндромы.(в словах допускается перенос на другую строку)
Палиндром-слово которое можно читать как слева направо так и наоборот : ШАЛАШ,ПОП или например фраза А РОЗА УПАЛА НА ЛАПУ АЗОРА. Или числа 1441, 121 и т.д.
Очень прошу помощи!!!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.12.2008, 21:54
Ответы с готовыми решениями:

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

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

Найти во введенном тексте все слова-палиндромы
Нужна прога, я на первом курсе колледжа. Нужно все просто и понятно. Разработать программу,...

В данном тексте найти все слова-палиндромы и вывести их на экран
Проблема в том, что при вводе двух и более знаков препинания подряд (включая пробелы) программа...

13
0 / 0 / 0
Регистрация: 30.11.2008
Сообщений: 13
15.12.2008, 00:23  [ТС] 2
Что никто незнает?
Думаю что нужно брать слово до пробела, переворачивать его, сравнивать с оригиналом, потом брать второе слово и ту же операцию и т.д.
Потом первые два слова->переворот->сравнение, потом 2е и 3е с теми же операциями.
Потом первые 3 слова и т.д. хотябы до 10и слов.
Может кто нить знает как это реализовать или подкинет свою идею?А то вообще потерялся с этой задачей.
Очень надо...помогите чем можете.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
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;
}
тебе надо проверять каждое слово, если оно палиндром записывать его куда-то
фразы полиндромы не делай, не потянешь (просто время потеряешь), по сложности смахивает на калькулятор вроде всё просто а подводных камней куча

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

УПАЛАНАЛАПУПАЛАНАЛАПУПАЛАНАЛАПУ
проскань попробуй
1
0 / 0 / 0
Регистрация: 30.11.2008
Сообщений: 13
15.12.2008, 19:19  [ТС] 4
Спасибо за разъяснение.
Только текст проги написан на С++(если не ошибаюсь) а нельзя ли написать на Си?Буду весьма признателен.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
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;
}
2
0 / 0 / 0
Регистрация: 30.11.2008
Сообщений: 13
17.12.2008, 21:25  [ТС] 6
нифига не пашет.
зодолбалсо уже дописывать, приписывать, переписывать - не хочет и все
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
17.12.2008, 22:01 7
скомилируй и в командной строке выполни

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

под линем русские символы двубайтовые получаются и длина слова в два раза больше
1
0 / 0 / 0
Регистрация: 30.11.2008
Сообщений: 13
17.12.2008, 23:39  [ТС] 8
Заработала Спасибо.
Только почемуто работает она бесконечно.Ограничить бы её надо как нить.
Типа "введите количество строк".Как тока последнюю строку написал-выводит полиндромы и вырубается.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
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;
}
пустая строка выход с учётом винды (если будешь файлы подключать потом)
1
0 / 0 / 0
Регистрация: 30.11.2008
Сообщений: 13
24.12.2008, 17:00  [ТС] 10
Спасибо все работает.
Кстати а можно как нибыдь удалять знаки препинания из введеной строки(чтоб уж препод к этому не придрался )?
Например:
Шалаш в лесу! Слово шалаш разпознается как полиндром.
В лесу шалаш! Слово шалаш не распознается. тк ! лишний символ
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
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 / 0
Регистрация: 11.02.2011
Сообщений: 38
15.08.2011, 11:30 12
извинити за идиотский вопрос, просто я только недавно начал Си изучать и не все еще разобрал. как нужно изминить ваш код, что бы слова полиндромы не выводило на экран, а удаляло из строки и выводило измененную строку. подскажите пожалуйста.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
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]$
палиндромы она видит
1
935 / 760 / 299
Регистрация: 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.
1
17.08.2011, 10:02
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.08.2011, 10:02
Помогаю со студенческими работами здесь

Дан текст.Найти все палиндромы(слова-перевёртыши)в етом тексте
Доброго времени суток ув.форумчане!Нужна ваша помощь в решении задачи по программированию.Язык...

Найти все палиндромы, не превышающие 100, которые при возведении в квадрат также дают палиндромы
Натуральное число называется палиндромом, если его запись читается одинаково с начала и с конца...

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

Найти целые числа палиндромы, которые при возведении в квадрат также дают палиндромы (22^2=484)
Найти целые числа-палиндромы, которые при возведении в квадрат также дают палиндромы (22^2=484)...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
Как написать микросервис на Go/Golang с Kafka, REST и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS, Swagger и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента! 4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве). Первое вводное занятие. . .
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru