![]() КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Пример нисходящей разработки ⇐ ПредыдущаяСтр 5 из 5 Пример 1.Написать программу, которая переписывает содержимое одного файла в другой, дублируя все английские гласные буквы. Разработаем алгоритм решения данной задачи. Начнем с высокоуровневых шагов:
Поскольку переписывать нужно все символы, то файлы следует открывать в бинарном режиме. Все шаги кроме третьего в данном алгоритме очевидны. Третий же шаг логично оформить в виде отдельной функции, куда в качестве аргументов передать файловые переменные, соответствующие открытым файлам. Программа примет следующий вид:
int main() { FILE* inFile = fopen("main.cpp", "rb"); FILE* outFile = fopen("result.cpp", "wb"); dublicatVowels(inFile, outFile); fclose(inFile); fclose(outFile); return 0; }
Функция dublicatVowels() пока не определена, поэтому для тестовых целей, чтобы данная программа запустилась, можно поставить так называемую заглушку для этой функции. Заглушка ничего относящегося к задаче делать не будет, а просто выведет сообщение о том, что там должно быть:
void dublicateVowels(FILE* in, FILE* out) { printf("Здесь будет дублирование гласных"); }
После запуска программы мы убеждаемся в том, что в нашей программе готово все кроме функции dublicatVowels(). Займемся этой функцией, в которой необходимо пробежаться по всему файлу и выполнить следующие шаги:
В данном алгоритме тривиальными являются все действия кроме проверки буквы на третьем шаге. Эта проверка должна ответить «Да» или «Нет» в зависимости от значения символа. Таким образом, эту проверку разумно вынести в отдельную функцию, которая будет принимать в качестве аргумента проверяемый символ, а возвращать значение логического типа true или false в зависимости от результата проверки. В итоге функция dublicateVowels() примет следующий вид:
void dublicateVowels(FILE* in, FILE* out) { while (!feof(in)) { char symbol = fgetc(in); fputc(symbol, out); if (isEngVowel(symbol)) { fputc(symbol, out); } } }
В этой функции теперь неопределенна функция isEngVowel(), поэтому для нее можно поставить заглушку, возвращающую true всегда.
bool isEngVowel(char symbol) { return true; }
Очевидно, что теперь программа запустится, но будет дублировать все символы. Тем не менее, круг нашей разработки уже существенно сузился, поскольку осталось реализовать только функцию isEngVowel(). Разработаем ее алгоритм:
В этом алгоритме уже все понятно, поэтому можно ее реализовать полностью.
bool isEngVowel(char symbol) { char engVows[] = "aeiouyAEIOUY"; for (int i=0; i<strlen(engVows); i++) { if (symbol==engVows[i]) { return true; } } return false; }
|