e-olymp 494. Гласные

Условие

К гласным буквам в латинском алфавите относятся буквы A, E, I, O, U и Y. Остальные буквы считаются согласными. Напишите программу, считающую количество гласных букв в тексте.

Входные данные

Во входном файле содержатся одна строка текста, состоящая только из заглавных латинских букв и пробелов. Длина строки не превышает 100 символов.

Выходные данные

В выходной файл вывести одно целое число – количество гласных во входном тексте.

Код

Код с функцией strpbrk()

Решение

Объявляется инициализированная строка, в которой может поместиться шесть символов, а последнее, седьмое место отводится под нуль-терминатор. Далее считываются все веденные символы, включая пробелы. Сравнивается  первый элемент строки с каждым элементом считываемых символов. Если считываемый символ соответствует символу строки, то увеличиваем количество гласных на единицу и так далее для всех гласных букв. Когда первый элемент строки сравнили со всеми считываемыми символами, начинаем так же сравнивать каждый последующий элемент.

Реализация с использованием string

Алгоритм решения (string)

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

Тестирование

Входные данные Выходные данные
1 COBBRA 2
2 REE BA 3
3 U GFD 1

Ссылки

 

9 thoughts on “e-olymp 494. Гласные

  1. — Отступы на ideone.com тоже нужно поправить. Хорошо?
    char vowel [7]="AEIOUY"; Здесь лучше не указывать размер массива — пусть лучше компилятор сосчитает сам. Человек может и ошибиться.
    for (j=0; j<=5; j++){ Нужно воспользоваться функцией strlen(), а не писать число на 1 меньше количества гласных букв. Зачем привлекать волшебство без крайней необходимости? Это приводит к ужасным последствиям — перечитайте «Волшебник Земноморья».

    А вообще молодец. Решение сработало и вполне разумно построено. Есть недочёты в описании. Например, стоило бы написать «и так далее для всех гласных букв».

    — Решение почти не использует никаких функций работы со строками. И это полезный опыт. Но напишите, пожалуйста ещё одно короткое решение с использованием скажем функции strpbrk(). Это не должно быть сложно тем более, что мы рассматривали на практике очень похожую задачу. Там в конце есть необходимый код, только без счётчика букв.

  2. Что за чудеса? Было хорошее решение, которое нужно было в паре мест чуть подправить…
    while(s!='\n'){ // пока не встретится пробел Какой это пробел ‘\n’? Вот пробел — ‘ ‘. Вы переход на новую строку ищите. А почему он там должен быть? Сказано, что всего одна строка входных данных. Могут нажать в конце перевод строки, а могут и не сделать. Я бы не сделал.
    — Зачем Вам stdio.h если Вы на С++ пишите? И вообще, зачем читать по одному символу если мы же много раз читали всю строку при помощи getline() из iostream? Вы 10 строк с циклом написали вместо одной команды.

  3. — Я ведь просто сказал использовать getline(). Я ссылку дал. Нужно только мышкой нажать и получите код с описанием и примером. Что я ещё могу сделать? Как Вы умудрились совсем другую getline() использовать просто не понимаю.
    — Извините, но я не могу принять второй код. Слишком там все сумбурно. И строки С++, и строки С, и какие-то ненужные инициализации вроде char text[100]="\0";.

  4. Игорь Евгеньевич, постаралась исправить код по Вашим замечаниям. Использовала getline(), который был указан в примере. Удалила инициализацию.