Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 04.05.2021
Сообщений: 15
1

Подсчитать количество слов в тексте, которые заканчиваются на гласную букву

04.05.2021, 11:53. Показов 513. Ответов 10
Метки нет (Все метки)

Добрый день!

Помогите создать программу.

c клавиатуры вводится строка(на кириллице);
подсчитывает количество слов в тексте, которые заканчиваются на гласную букву;
выводит на экран все слова, длина которых меньше пяти символов.

пожалуйста укажите еще комментарии, чтоб легче было ориентироваться)


Спасибо за внимание !
Буду ждать =)
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.05.2021, 11:53
Ответы с готовыми решениями:

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

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

Строка: Подсчитать количество слов в тексте, которые заканчиваются на гласную букву...
Оформить каждый пункт задачи выбранного варианта в виде функции. Все необходимые данные для функций...

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

10
1480 / 886 / 573
Регистрация: 25.04.2016
Сообщений: 2,459
04.05.2021, 14:55 2
И все это счастье еще и на винде, да?
0
952 / 689 / 228
Регистрация: 30.06.2015
Сообщений: 3,696
Записей в блоге: 37
04.05.2021, 15:09 3
Цитата Сообщение от stake-k26 Посмотреть сообщение
И все это счастье еще и на винде, да?
Какая разница, stake-k26?
0
1480 / 886 / 573
Регистрация: 25.04.2016
Сообщений: 2,459
04.05.2021, 16:58 4
CoderHuligan, разница в кодировке. Особенно на 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
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAXLINE 256
 
int checkSymbol(char *word, int len)
{
    int i;
    static const char abc[] = "аеёиоуыэюя";
    for (i = len-1; i > 0; --i)
        if (islower(word[i]) || isupper(word[i]))
            break;
    return strchr(abc, tolower(word[i])) != NULL;
}
 
char * finalWord (int n)
{
    if (n > 99) return finalWord(n % 100);
    if (n > 9) return finalWord(n % 10);
    if (n == 1) return "о";
    if (n > 1 && n < 5) return "а";
    return "";
}
 
int main (void)
{
    char str[MAXLINE];
    const char sep[] = " \t\n";
 
    printf("Введие строку: ");
    if (fgets(str, MAXLINE-2, stdin) == NULL)
        return fputs("Ошибка ввода-вывода!\n", stderr) && 1;
 
    int len, cnt = 0;
    for (char *p = strtok(str, sep); p != NULL; p = strtok(NULL, sep))
    {
        if ((len = strlen(p)) < 5)
            puts(p);
        if (checkSymbol(p, len))
            cnt++;
    }
 
    printf("Встречено %d слов%s, заканчивающихся "
           "на гласную.\n", cnt, finalWord(cnt));
    return 0;
}


Под линуксом он даже почти работает, только не все слова выводит, поскольку strlen считает русский символ за 2, и условие len < 5 оказывается неправильным. Примеры запуска под Gnu\Linux:
Введите строку: ... .. .....
...
..
Встречено 0 слов, заканчивающихся на гласную.

Введите строку: Каша ела Машу
Встречено 3 слова, заканчивающихся на гласную.

Во втором случае у нас есть три слова, длина которых меньше 5, однако в выводе эти слова отсутствуют по причине ошибки strlen.

Мы можем перевести все это дело на рельсы wchar_t:
Кликните здесь для просмотра всего текста
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
#include <stdio.h>
#include <wchar.h>
#include <wctype.h>
#include <locale.h>
#define MAXLINE 256
 
int checkSymbol(wchar_t *word, int len)
{
    int i;
    static const wchar_t abc[] = L"аеёиоуыэюя";
    for (i = len-1; i > 0; --i)
        if (iswlower(word[i]) || iswupper(word[i]))
            break;
    return wcschr(abc, towlower(word[i])) != NULL;
}
 
wchar_t * finalWord (int n)
{
    if (n > 99) return finalWord(n % 100);
    if (n > 9) return finalWord(n % 10);
    if (n == 1) return L"о";
    if (n > 1 && n < 5) return L"а";
    return L"";
}
 
int main (void)
{
    wchar_t str[MAXLINE];
    const wchar_t sp[] = L" \t\n";
    setlocale(LC_ALL, "ru_RU.UTF-8");
 
    wprintf(L"Введите строку: ");
    if (fgetws(str, MAXLINE-2, stdin) == NULL)
        return wprintf(L"Ошибка ввода-вывода!\n") && 1;
 
    wchar_t *tr;
    int len, cnt = 0;
    for (wchar_t *p = wcstok(str, sp, &tr); p != NULL; p = wcstok(NULL, sp, &tr))
    {
        if ((len = wcslen(p)) < 5)
            wprintf(L"%ls\n", p);
        if (checkSymbol(p, len))
            cnt++;
    }
 
    wprintf(L"Встречено %d слов%ls, заканчивающихся "
           "на гласную.\n", cnt, finalWord(cnt));
    return 0;
}

Пример запуска под GNU\Linux:
Введите строку: ... .. .....
...
..
Встречено 0 слов, заканчивающихся на гласную.

Введите строку: Каша ела Машу
Каша
ела
Машу
Встречено 3 слова, заканчивающихся на гласную.

И в этом случае у нас все работает как положено. Однако, как думаете, сколько кодировок ru_RU.UTF-8 найдется на среднестатистической машине с windows, установленной из коробки? Ну.. на самом деле чуть меньше одной. И мы приплываем в прекрасный новый мир шиндовс.

Давайте попробуем собрать и запустить эти программы под управлением windows 7 x64 sp1, в консоли которой поток ввода кодируется в cp1251, а поток вывода - в cp866:
Введите строку: ... .. .....
...
..
Встречено 0 слов, заканчивающихся на гласную.

Введите строку: Каша ела Машу
Каша
ела
Машу
Встречено 1 слово, заканчивающихся на гласную.

Эм.. а почему только 1 слово? (вопрос как бы риторический)

Второй код даже пробовать не будем в виду отсутствия нужной кодировки.

Нет, конечно мы можем изменить настройки среды программирования, удостовериться. что кодировка исходных файлов соответствует cp1251, а кодировку исполняемого файла заменить на 866, после чего сделать setlocale(LC_ALL, ".866"), и первый код даже заработает, но это такие костыли, что весь прекрасный мир шиндовс идет лесом.

Я например, совершенно не представляю как можно изменить кодировку исполняемого файла скажем в msvs.

И нам остаются ущербный cp65001 или все тот же setlocale(LC_ALL, ".866") и надежда на широкие символы. Можно еще, конечно, заморочиться с SetConsole и приведением к OEM, но это тоже лишь еще одна пара костылей, которые опять же работают не везде.

А самое главное, что все эти костыли будут меняться на всем протяжении от Win '9x до Win '10, так что этот прекрасный мир шиндовс идет не только лесом, но еще и очень далеко и надолго.

Под Windows не существует однозначного, унифицированного, хоть как-то стандартизованного варианта кода, который будет работать на всех компьютерах и на всех версиях Windows. Его просто нет.

640 килобайт хватит всем и этим все сказано.
0
952 / 689 / 228
Регистрация: 30.06.2015
Сообщений: 3,696
Записей в блоге: 37
04.05.2021, 17:10 5
Цитата Сообщение от stake-k26 Посмотреть сообщение
А самое главное, что все эти костыли будут меняться на всем протяжении от Win '9x до Win '10, так что этот прекрасный мир шиндовс идет не только лесом, но еще и очень далеко и надолго.
Так шиндовз, как вы выразились, тут вовсе не виновата. 640 килобайт тоже. Причина в том, что сейчас под консоль никто серьезно не пишет, потому что консоль не для этого предназначена. Она для для работы с командной строкой как бы заточена. В линух с этим хорошо, в виндовс было плохо, но стало получше. Программы пишут либо на win api, либо на обертках над ними, используя мастера. А в win api, как бы с кодировками вопрос не стоит от слова вообще.
0
1480 / 886 / 573
Регистрация: 25.04.2016
Сообщений: 2,459
04.05.2021, 17:22 6
CoderHuligan, я бы поспорил на счет того, что винда тут не при чем. Как ни крути, а когда-то гарантировалась обратная совместимость с MS-DOS приложениями, из-за чего мы и имеем просто бомбический выверт с кодировками консоли в 7ке. В остальном вы все верно сказали, но как-то не похоже что у ТС задание рассчитано на WinAPI. Вот совсем не похоже.
1
952 / 689 / 228
Регистрация: 30.06.2015
Сообщений: 3,696
Записей в блоге: 37
04.05.2021, 17:53 7
Цитата Сообщение от stake-k26 Посмотреть сообщение
Как ни крути, а когда-то гарантировалась обратная совместимость с MS-DOS приложениями, из-за чего мы и имеем просто бомбический выверт с кодировками консоли в 7ке.
И не только в 7, но и в xp и в 10. Но эта консоль - наследница dos. Майкры её делали только из обратной совместимости с dos. Например на xp еще можно с консоли запускать досовские программы, хотя не всегда они работают корректно. Это как кто сделает привязку к системной консоли. Например в Pelles C все сделали правильно - локаль там работает как положено. В mingw уже нет, потому что там об этом не позаботились. Это непрофессионально и говорит об уровне разрабов увы не винды, а mingw..
0
1480 / 886 / 573
Регистрация: 25.04.2016
Сообщений: 2,459
04.05.2021, 18:31 8
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Например на xp еще можно с консоли запускать досовские программы
CoderHuligan, на сколько помню, в windows xp это была отдельная виртуальная машина с ms-dos, т.е.в папке system32 было два файла: стандартный cmd и нестандартный command, и как раз последний и запускал эту самую виртуальную машину с ms-dos.

Однако факт наличия этой машины на столько не афишировался, да и сама машина работала на столько плохо, что в результате это привело к появлению проекта dosBox.

А перед выходом 7ки майкрософт вообще официально заявила, что приложения ms-dos более не поддерживаются. И разница кодировок в консоли на мой взгляд как раз и показывает, что в майкрософт пытались сделать обратную совместимость, но потом поняли, что более держать этого голема на плаву уже не выйдет, и просто оставили все как есть.

В 10ке я особо не ковырялся, так что тут мне сказать особо не чего.
0
0 / 0 / 0
Регистрация: 04.05.2021
Сообщений: 15
04.05.2021, 22:37  [ТС] 9
stake-k26,
Спасибо большое!
мне как раз под linux надо было)
0
0 / 0 / 0
Регистрация: 04.05.2021
Сообщений: 15
05.05.2021, 12:22  [ТС] 10
stake-k26,
День добрый. могли бы вы добавить немного комментариев,
Я не совсем понимаю что за что отвечает.
Спасибо!
0
1480 / 886 / 573
Регистрация: 25.04.2016
Сообщений: 2,459
07.05.2021, 22:59 11
SpaceTraveler,

Получаем строку.
Если по каким-то причинам строка не была прочитана,
сообщаем об ошибке и завершаем программу с кодом ошибки.

Разбиваем строку на отдельные слова:
Если длина слова меньше 5,
выводим слово на экран.
Если слово заканчивается гласной буквой,
увеличиваем счетчик таких слов на 1.

Выводим результат на экран, выходим из программы.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.05.2021, 22:59

Помощь в написании контрольных, курсовых и дипломных работ здесь.

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

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

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

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

Найти количество слов в строке, которые заканчиваются на гласную букву
Выводит кол-во слов 0, не знаю почему. #include &lt;iostream&gt; #include &lt;vector&gt; #include...

Подсчитать в тексте количество слов, заканчивающихся на гласную букву
Дан текст, хранящийся в текстовом файле. Подсчитать в тексте количество слов, заканчивающихся на...


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

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

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