Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
delphi / песни о паскале.pdf
Скачиваний:
66
Добавлен:
26.03.2016
Размер:
5.16 Mб
Скачать

Глава 20 Процедуры: первый опыт

Некоторые считают программирование искусством. Если так, то в чем оно? Искусный программист умеет (кроме прочего) превращать сложную программу в простую, — он равномерно распределяет сложность между процедурами и функциями. Как научиться этому? Усвойте несколько ключевых истин, но главное здесь — практика. Без «шишек» и «синяков» не обойтись. Однако сколько за одного битого небитых дают?

Следующая задача слегка надумана — это всего лишь полигон для испытания наших собственных процедур. Условие задачи таково: пусть пользователь введет одну за другой несколько строк, например, три (потребуется цикл со счетчиком, улавливаете?). В каждой введенной строке надо заменить латинские буквы «A» — если они там есть — на латинские буквы «B». Например, приняв строку «ABBA», программа должна превратить её в строку «BBBB».

Мухи – налево, котлеты – направо!

Рис. 43 избавляет вас от необходимости малевать алгоритм будущей программы. Ясно, что программа не так проста, — она включает условный оператор и два цикла, причем один из них вложен в другой. Внешний цикл отвечает за ввод строк, а внутренний — за их обработку. Можно ли упростить это сооружение? Бывалый программист сразу смекнет, как отделить здесь мух от котлет, — внутренний цикл, отмеченный серым цветом, лучше выделить в отдельную процедуру, и тогда программа распадётся на два несложных алгоритма (рис. 44). Слева на этом рисунке показан алгоритм главной программы, а справа — алгоритм процедуры, которой я дал имя Scan. Пунктирные линии со стрелками показывают места входа в процедуру и выхода из нее.

127

Глава 20 Процедуры: первый опыт

Счетчик строк = 1

Ввести строку

Очередной символ «A»?

Счетчик символов = 1

Да

Изменить символ на «B»

 

Нет

Увеличить счетчик символов

Все символы?

Напечатать результат

 

Увеличить счетчик строк

 

Нет

 

Да

Счетчик строк = 3?

 

Рис. 43 – Блок-схема программы с двумя циклами

128

Глава 20 Процедуры: первый опыт

 

 

 

procedure Scan(arg)

 

 

 

 

 

 

 

Счетчик строк = 1

 

 

 

 

 

 

 

 

 

 

Очередной

 

 

 

 

 

 

 

 

 

 

символ «A»?

 

 

 

Счетчик символов = 1

 

Ввести строку

 

 

 

 

 

 

 

 

 

 

 

 

 

Да

 

 

 

 

 

 

 

 

 

 

Изменить символ

 

 

 

 

 

на «B»

Обработать строку

 

 

 

 

 

 

 

 

 

Scan(S)

 

 

Нет

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Увеличить счетчик

 

 

Напечатать

 

 

 

символов

 

 

результат

 

 

 

 

 

 

 

 

 

 

 

Увеличить счетчик строк

Все символы?

Нет

Да

Счетчик строк = 3 ?

Рис. 44 – Блок-схемы главной программы (слева) и процедуры (справа)

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

Сверху вниз

Легко сказать «приступить», но с чего начать? Настрочить программу целиком и сразу? — вот прекрасный способ запутаться! Нет, профессионалы делают иначе, следуя одному из двух направлений. Первое из них именуется разработкой «сверху вниз», — проект лепят, начиная с главной программы, переходя затем к процедурам. Другое направление противоположно первому и называется разработкой «снизу вверх». Оба направления имеют свои достоинства, поэтому в крупных проектах их иногда используют одновременно. Но сейчас нам лучше подходит первый способ.

Итак, последуем выбранному нами порядку разработки «сверху вниз». Этот подход хорош тем, что на промежуточных этапах получаются почти работающие программы. Почему «почти»? — сейчас поймете. Итак, забудем на время о недостающей процедуре Scan и напишем лишь главную программу, вот она.

129

Глава 20 Процедуры: первый опыт

{ P_20_1 – первый этап разработки } var S: string; k: integer;

begin

{--- главная программа ---}

 

for k:=1 to 3 do begin

 

Write(’Введите строку: ’); Readln(S);

 

{ Scan(S); }

 

Writeln(S);

end.

end;

 

Обратите внимание на закомментированный вызов процедуры Scan(S), — он напоминает о незавершенной части работы. Скелет нашей будущей программы готов, его можно не только скомпилировать, но и запустить, — сделайте это обязательно! Разумеется, программа не выполняет всего задуманного, но уже делает кое-что.

Убедившись в работоспособности скелета, перенесём внимание на процедуру. На этом этапе тоже есть свои хитрости: сначала дадим частичное описание процедуры, создав лишь заголовок и оставив тело пустым. Такую процедуру называют заглушкой или пустышкой. Написав заглушку, уберите комментарий с вызова Scan(S), и тогда на скелете нарастет немного «мяса».

{ P_20_1 – второй этап разработки }

var S: string; k: integer;

 

{--- Заглушка процедуры ---}

procedure Scan(arg : string);

begin

 

end;

 

begin

{--- главная программа ---}

for k:=1 to 3 do begin

Write(’Введите строку: ’); Readln(S);

Scan(S);

Writeln(S);

end;

end.

Процедура Scan принимает строковый параметр arg (это сокращение от слова argument). Аргумент — так ещё называют параметр процедуры или функции. Теперь снова запустите программу. Если всё в порядке, значит вызов процедуры Scan(S), как говорят программисты, видит описание этой процедуры, и его фактический параметр S отвечает формальному параметру процедуры arg.

130

Соседние файлы в папке delphi