Условие
К гласным буквам в латинском алфавите относятся буквы 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. Проверьте, пожалуйста.
Хорошо. Молодец. Зачтено.
Если Вы это сделано самостоятельно, я очень рад.