1 Востаннє редагувалося Lata (21.12.2020 15:27:13)

Тема: Обробка текстів, символьні рядки

Дано текст, який містить букви і пропуски. Знайти і надрукувати слова і їх кількість, які закінчуються буквосполученням «ати». Словом вважати послідовність букв, розділених пропусками.

#include <stdio.h>
#include <string.h>
int main()
{
char text[]=" pryvitaty z novym rokom i pobazhaty zdaty vsi roboty i otrymaty vysiki baly ";
char *word=text;
char *result;
int n=0;
printf("pryvitaty z novym rokom i pobazhaty zdaty vsi roboty i otrymaty vysoki baly");
printf("\nСлова, які закінчуються буквосполученням 'aty':");
printf("\n");
result = strtok(word," ");
while(result!= NULL){
    int len=strlen(result);
    if (len>2 &&
           (result[len-1]=='y' &&
            result[len-2]=='t' &&
            result[len-3]=='a')
        ){
        n++;
        printf("%s\n",result);    
    }
    result = strtok(NULL," ");
}
printf("\n");
printf("\nЇх кількість: %i\n\n",n);
    
return 0;
}

Цей код працює правильно. Я відредагувала тему з метою полегшення пошуку для інших користувачів.

2

Re: Обробка текстів, символьні рядки

не бачу жодних коментарів і документування технічного завдання. Тут розділ про мову, а не про алгоритми. Якщо програма компілюється, то ти помилилася розділом.

3

Re: Обробка текстів, символьні рядки

Якщо не працює, то треба натиснути кнопку на системному блоці.
А якщо працює, але результат не відповідає очікуванням - то напишіть, який саме результат ви отримуєте.

Подякували: Lata1

4

Re: Обробка текстів, символьні рядки

Це результат виконання першого способу.

main.c:20:14: warning: format ‘%c’ expects argument of type ‘int’, but argument 2 has type ‘char *’ [-Wformat=]                 
main.c:21:16: warning: multi-character character constant [-Wmultichar]                                                         
main.c:21:35: warning: multi-character character constant [-Wmultichar]                                                         
main.c:21:54: warning: multi-character character constant [-Wmultichar]                                                         
Даний текст:                                                                                                                    
привітати з новим роком і побажати здати роботи та отримати бали                                                                
Слова, які закінчуються буквосполученням 'ати':                                                                                 
Їх кількість: 0      

Це другого:

main.c:17:15: warning: multi-character character constant [-Wmultichar]                                                         
main.c:19:18: warning: multi-character character constant [-Wmultichar]                                                         
main.c:21:22: warning: multi-character character constant [-Wmultichar]                                                         
Даний текст:                                                                                                                    
привітати з новим роком і побажати здати роботи та отримати бали                                                                
Слова, які закінчуються буквосполученням 'ати':                                                                                 
Їх кількість: 0  

5

Re: Обробка текстів, символьні рядки

Не зрозуміло? навіть тобі рядок показав, в якому помилка.  Чи ти не розумієш різницю між літерою і рядком?

6

Re: Обробка текстів, символьні рядки

Даю посилання на обидві програми:
https://onlinegdb.com/xhgbO_kIr
https://onlinegdb.com/rkHWs0i3D

7

Re: Обробка текстів, символьні рядки

скільки слів у рядку "натирати автомати"?

8

Re: Обробка текстів, символьні рядки

О! От і знайшли халепу. Ви працюєте з багатобайтовим кодуванням, але робите це так, ніби воно однобайтове. 'и' в UTF-8 займає 2 байти, звідси й проблема (принаймні одна).
Найпростіше рішення тут - використовувати виключно символи ASCII (тобто англійські літери, цифри та пунктуацію). Я б вам радив почати саме з цього, а коли зневадите алгоритм - переходити з char на wchar_t (багатобайтові символи). Доведеться всі функції і літерали замінити на відповідні (до стрічок і символьних літералів дописати L, на кшталт L"ати" та L'и'; замість функцій на str.. використовувати wcs... з <cwchar> - скажімо, wcsrchr, wprintf і т.д.).
Або ж можна використовувати застарілі однобайтові кодування на кшталт cp1251 чи cp866; але це буде, по-перше, не менше заплутано, а по-друге, значно менш корисно. За юнікодом нинішній час і майбутнє.
Ну і, наскільки я бачу, ви порівнюєте початок слова із "ати", а не кінець.

Подякували: Lata, Arete, leofun013

9

Re: Обробка текстів, символьні рядки

2 слова.

10

Re: Обробка текстів, символьні рядки

Ви впевнені що другий while де ви шукаєте 'ати' виконується? Насправді не виконується. Чому?

Подякували: Lata1

11 Востаннє редагувалося Lata (19.12.2020 22:33:54)

Re: Обробка текстів, символьні рядки

Дякую, Коало! Сьогодні вже пізно, завтра детальніше вивчу Вашу пораду.

12

Re: Обробка текстів, символьні рядки

Ох, Arete! Впевнена, що не виконується. Не знаю, чому. Я шукала приклади та теорію в інтернеті. Знайшла подібну задачу з розв'язком, але вона теж, на жаль, не працює, як треба.

13

Re: Обробка текстів, символьні рядки

Справа не в теорії, а в уважності - другий while не виконується, тому що змінна word була прочитана "до кінця" в першому while :)

14

Re: Обробка текстів, символьні рядки

наскільки я бачу, ви порівнюєте початок слова із "ати", а не кінець.

я ніби намагалася починати з початку. А як зробити, щоб було з кінця? Я ж по суті не знаю, що записано до ати.
і коли я замінила кирилицю латинницею, не допомогло.

15

Re: Обробка текстів, символьні рядки

якби навіть 2й цикл виконувався, він знайшов би "3 слова", що є багом. тому такий алгоритм є помилковим, хоч він перший спадає на думку. шукати треба не символи а т и, а символ ' '. Бо лише пробіли розділяють слова. знайшовши індекс пробілу не важко визначити останні три літери слова, потім рядок обрізають і повторюють пошук.
щодо помилки, то принтф чекає на літеру, а йому дають масив літер. Глупство це..

Подякували: Lata, plusxx2

16

Re: Обробка текстів, символьні рядки

Cправа не в теорії, а в уважності - другий while не виконується, тому що змінна word була прочитана "до кінця" в першому while

while(*word){
       printf("%c",*word);
       word++;
       if(*word=='а'){
       word++;
       if(*word=='т'){
           word++;
           if(*word=='и'){
               word++;
               n++;
           }
       }
    }

Ось тут я спробувала об'єднати преший вайл з другим.
Не працює взагалі.
main.c: In function ‘main’:
main.c:14:18: warning: multi-character character constant [-Wmultichar]
        if(*word=='а'){
                  ^~~~
main.c:16:18: warning: multi-character character constant [-Wmultichar]
        if(*word=='т'){
                  ^~~~
main.c:18:22: warning: multi-character character constant [-Wmultichar]
            if(*word=='и'){
                      ^~~~
main.c:41:1: error: expected declaration or statement at end of input
}
^

17

Re: Обробка текстів, символьні рядки

от що буває, коли вчаться на писарів, а не на письменників...
https://translate.google.com/?sl=en& … =translate

Подякували: Lata1

18

Re: Обробка текстів, символьні рядки

Виходить, буква а - це багатосимвольна константа %)

19 Востаннє редагувалося ur_naz (19.12.2020 23:05:20)

Re: Обробка текстів, символьні рядки

ні, *word  є вказівник на перший елемент символьного масиву. функція принтф буде читати масив доки не знайде нуль-термінатор. *RTFM*

Подякували: Lata, plusxx2

20

Re: Обробка текстів, символьні рядки

Тобто *word - вказівник на першу букву?