Условие
К гласным буквам в латинском алфавите относятся буквы A, E, I, O, U и Y. Остальные буквы считаются согласными. Напишите программу, считающую количество гласных букв в тексте.
Входные данные
Во входном файле содержатся одна строка текста, состоящая только из заглавных латинских букв и пробелов. Длина строки не превышает 100 символов.
Выходные данные
В выходной файл вывести одно целое число – количество гласных во входном тексте.
Код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <iostream> #include <stdio.h> #include <cstring> using namespace std; int main (){ int length,i,j,kol=0; char vowel []="AEIOUY"; char text [100]; gets (text); //функция считывает все введённые символы с пробелами до тех пор, пока не будет нажата клавиша Enter length=strlen (text); for (j=0; j<=5; j++){ for (i=0; i<=length; i++) if (text[i]==vowel[j])//сравниваем введённые элементы с заданными значениями строки kol=kol+1; } cout << kol << endl; return 0; } |
Код с функцией strpbrk()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <iostream> #include <cstring> using namespace std; int main () { int counter=0; char text[100]; char vowel[] = "AEOUIY"; char * pch; cin.getline(text,100); pch = strpbrk (text, vowel); while (pch != NULL) // пока есть гласные буквы { pch = strpbrk (pch+1,vowel); // поиск гласных букв counter++; } cout << counter; return 0; } |
Решение
Объявляется инициализированная строка, в которой может поместиться шесть символов, а последнее, седьмое место отводится под нуль-терминатор. Далее считываются все веденные символы, включая пробелы. Сравнивается первый элемент строки с каждым элементом считываемых символов. Если считываемый символ соответствует символу строки, то увеличиваем количество гласных на единицу и так далее для всех гласных букв. Когда первый элемент строки сравнили со всеми считываемыми символами, начинаем так же сравнивать каждый последующий элемент.
Реализация с использованием string
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <iostream> #include <string> using namespace std; int main() { int counter=0; string text; //инициализируем строку getline (cin,text); //извлекает строки из входного потока string vowel="AEOUIY"; size_t found=text.find_first_of(vowel); //Поиск по строке text для первого символа, который соответствует любому элементу строки vowel while (found!=-1) { counter++; found=text.find_first_of(vowel,found+1); } cout << counter << endl; return 0; } |
Алгоритм решения (string)
Строка вводится из входного потока. Разыскивается первое вхождение любой гласной буквы. Если такое вхождение имеет место,то счетчик наращивается на единицу, после чего с позиции, следующей за гласной, поиск гласной начинается снова пока не будет найдена последняя гласная. Если гласных в слове нет, то, счетчик, соответственно, не наращивается и выводится ноль.
Тестирование
№ | Входные данные | Выходные данные |
1 | COBBRA | 2 |
2 | REE BA | 3 |
3 | U GFD | 1 |
Ссылки
- Условие задачи можно найти на сайте e-olymp;
- Засчитанное решение;
- Решение задачи cфункцией strpbrk() на ideone.com;
- Решение задачи с использованием string;
— Отступы на ideone.com тоже нужно поправить. Хорошо?
— char vowel [7]="AEIOUY"; Здесь лучше не указывать размер массива — пусть лучше компилятор сосчитает сам. Человек может и ошибиться.
— for (j=0; j<=5; j++){ Нужно воспользоваться функцией strlen(), а не писать число на 1 меньше количества гласных букв. Зачем привлекать волшебство без крайней необходимости? Это приводит к ужасным последствиям — перечитайте «Волшебник Земноморья».
А вообще молодец. Решение сработало и вполне разумно построено. Есть недочёты в описании. Например, стоило бы написать «и так далее для всех гласных букв».
— Решение почти не использует никаких функций работы со строками. И это полезный опыт. Но напишите, пожалуйста ещё одно короткое решение с использованием скажем функции strpbrk(). Это не должно быть сложно тем более, что мы рассматривали на практике очень похожую задачу. Там в конце есть необходимый код, только без счётчика букв.
Игорь Евгеньевич, исправила. Проверьте,пожалуйста.
Что за чудеса? Было хорошее решение, которое нужно было в паре мест чуть подправить…
— while(s!='\n'){ // пока не встретится пробел Какой это пробел ‘\n’? Вот пробел — ‘ ‘. Вы переход на новую строку ищите. А почему он там должен быть? Сказано, что всего одна строка входных данных. Могут нажать в конце перевод строки, а могут и не сделать. Я бы не сделал.
— Зачем Вам stdio.h если Вы на С++ пишите? И вообще, зачем читать по одному символу если мы же много раз читали всю строку при помощи getline() из iostream? Вы 10 строк с циклом написали вместо одной команды.
Игорь Евгеньевич, исправила код, проверьте, пожалуйста.
— Я ведь просто сказал использовать getline(). Я ссылку дал. Нужно только мышкой нажать и получите код с описанием и примером. Что я ещё могу сделать? Как Вы умудрились совсем другую getline() использовать просто не понимаю.
— Извините, но я не могу принять второй код. Слишком там все сумбурно. И строки С++, и строки С, и какие-то ненужные инициализации вроде char text[100]="\0";.
Игорь Евгеньевич, постаралась исправить код по Вашим замечаниям. Использовала getline(), который был указан в примере. Удалила инициализацию.
Хорошо. Молодец! Зачтено для char *.
Теперь нужно решить эту же задачу с использованием string.
Игорь Евгеньевич, решила эту задачу с использованием string. Проверьте, пожалуйста.
Хорошо. Молодец. Зачтено.
Если Вы это сделано самостоятельно, я очень рад.