Паскаль: структуры построения программы. Ветвления, циклы.

Паскаль: структуры построения программы. Ветвления, циклы.

Итак, это третий урок по Pascal’ю и к этому моменту мы уже успели изучить основы построения программы и типы данных (их к этому уроку не помешало бы повторить), произведение расчетов, некоторые стандартные функции, управление звуком. Сегодня я познакомлю вас с различными структурами построения программы, а именно – с ветвлением и циклом.

В этом уроке для удобства в некоторых местах будет применяться блок-схема (представление программы с использованием специализированных символов). Основные элементы блок-схемы:

1. Овал – начало/конец программы.

2. Параллелограмм – ввод/вывод данных.

3. Прямоугольник – действие.

4. Ромб – условие.

Далее я расскажу подробнее еще о шестиугольнике – обозначает цикл со счетчиком.

Один мой знакомый пытался мне доказать, что программисту достаточно знать и уметь правильно составлять только блок-схемы. Это ошибочное суждение. Программист должен это уметь делать очень хорошо, но помимо этого он, естественно, должен уметь программировать (иначе он не программист).

[cut=Читать далее »]

Мы делали линейные программы, то есть программы, которые выполняли действия последовательно. Тема же этого раздела – ветвление. Ветвление предоставляет возможность программисту написать программу, дающую право выбора пользователю (грубо говоря, пойти направо или налево).

В Pascal’е (и на некоторых других языках) ветвление начинается со слова If. Обязательно нужно сказать, что существует два вида ветвлений: полное ветвление (полная форма) и неполная (сокращенная) форма.

Сразу обратите внимание, что перед Else ";" никогда не ставится. Это довольно распространенная ошибка и надо запомнить этот момент. Напомню, что ";" можно опустить перед "End."

Возникает вполне логичный вопрос: когда используется полная форма, а когда неполная? Полную форму необходимо использовать, когда есть только два варианта развития событий, например:

Неполную форму ветвления используют во всех остальных случаях. Можно также вместо полной формы использовать два неполных ветвления. Делается это подобным образом:

Внимательный читатель обязательно спросит: почему же в самой первой схеме этого урока есть Begin и End, а в примерах – нет. Тоже очень хороший вопрос. Дело в том, что когда выполняется в ветвлении (равно как и в цикле) одно действие, то Begin и End можно не прописывать. Особенно удобно в случае больших программ. Также если действие одно, можно его не писать с новой строки, а продолжать печатать после then. Данный прием позволит сэкономить строки, что особенно необходимо для программ, имеющих 1000 строк кода (в Pascal’e больше 1000 строк нельзя программы писать – приходится подобным образом мухлевать и создавать… а об этом в других уроках), но в небольших программах нет разницы какой формой записи использовать.

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

Ну да хватит разговаривать на отвлеченные темы, вернемся непосредственно к уроку. От ветвлений плавно и почти незаметно переходим к циклам. Википедия нам дает определение цикла – циклом называется разновидность управляющей конструкции в высокоуровневых языках программирования, предназначенная для организации многократного исполнения набора инструкций. Разъясняю на примере: если надо ввести 10 чисел одного типа, можно запрашивать их по отдельности, а можно использовать цикл – это будет намного удобнее и запись в программном коде будет короче. В Pascal’e существуют 3 вида циклов: с предусловием, с последующим условием и цикл со счетчиком.

Цикл с предусловием. While условие do… Особенность, как видно из названия – местоположение условия – перед телом цикла.

Лично я этот вид цикла почти не применял, потому что считаю его наименее удобным, хотя это на усмотрение каждого.

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

Несколько слов об этом примере. Думаю, все догадались, что в нем осуществляется приращение параметра а и вывод его на экран. Цикл выполняется, пока а не равно 10. Если накосячить с условием, например оставить начальное значение а=0, производить приращение на единицу, а в условие записать «While a=-1 do», цикл становится бесконечным. Этого стоит избегать кроме случаев, когда этот результат – ваша цель, но такого, по идее, быть не должно. Это касается всех видов циклов (и не только их).

Кратенький примерчик цикла, в котором используется обратный счет:

Цикл с последующим условием. Забегая вперед, скажу, что именно его мы будем активно использовать при конструировании меню (этому будет посвящен отдельный урок, но еще не скоро). Repeat действия Until условие… Отличие от предыдущего вида цикла очевидно – условие находится после тела цикла.

Поговорим немного об условиях в операторах ветвления и циклах. Итак, в условии цикла всегда указывается условие выхода. Всегда. Везде. Что может быть в условии? Может быть, скажем, конкретное значение счетчика или переменной, выступающей в роли счетчика, но нельзя ставить в условии математические примеры и операции. Формулировка непонятная, поэтому сразу пример.

Еще стоит сказать, что условием выхода может являться нажатие пользователем любой клавиши. В этом случае в условии надо прописать keypressed. После нажатия любой клавиши, цикл прервется. Сейчас просто скажу, а далее (в последующих уроках) рассмотрим подробнее случаи, когда необходимо, чтобы при нажатии конкретной клавиши, происходило конкретное действие, например, переход к первому пункту меню, или ко второму. Тогда можно использовать кодировку клавиш, оператор выбора case или банальный readln. На подробное рассмотрение данной темы будет выделен специальный урок.

Также можно использовать сложные условия. Для этого применяются and (и), or (или), not (не). Например

Листинг : Описание while (a>5) and (b=3) do или

Листинг : Описание repeat

...

Until (a=3) or (a=-3);

При использовании сложных условий, каждое необходимо брать в скобки, иначе ничего работать не будет.

Еще стоит рассказать о том, зачем вводится переменная а в предыдущих примерах. Ответ прост - чтобы наглядно показать работу цикла (меняется значение, следовательно, цикл работает). Правильно, но не до конца. В цикле с предусловием (ровно как и с постусловием) а выполняет роль счетчика (следует обратить внимание на условие). Как только переменная, которой мы "сказали" выполнять функции счетчика, примет определенное значение (опять же смотри на условие), выполнение цикла прекратится. Приращение счетчика осуществляется вот такой суммой: a:=a+1; где а - значение счетчика (должно быть и так понятно), а единица - шаг приращения счетчика. Можно было поставить любой шаг (даже -1 - это будет обратным счетом, получается), и это действие, естественно, скажется на ходе выполнения цикла.

Про оператор множественного выбора рассказать будет полезно. Этот оператор позволяет выполнить прописанное действие по нажатию заданной клавиши. Форма записи:

Листинг : Описание case x of значение 1: действие 1;

...

Значение n: действие n else действие; где n - количество значений, которые может принимать х, который, в свою очередь, является переменной типа integer либо char.

Если вместо переменной целочисленного типа использовать переменную символьного типа, запись изменится не сильно - значение переменной будет браться в кавычки:

В случае, когда необходимо при определенном значении переменной выполнить несколько действий, используются Begin и End. Не надо забывать про особенности при написании Else.

Цикл со счетчиком (о нем речь пойдет ниже) может "шагать" только на единицу вперед и назад, поэтому в ситуациях, когда необходимо использовать произвольный шаг приращения цикла, необходимо использовать уже рассмотренные виды циклов.

Теперь непосредственно о цикле со счетчиком, его еще называют «цикл с параметром». Попутно скажу, что этот вид цикла я применял очень часто. Параметром в нем служит переменная целого типа. Прекращение выполнения цикла – достижение определенного значения параметром.

For переменная := начальное значение to конечное значение do.

Пример.

Видим, что приращение параметра выполняется автоматически. Начальное и конечное значения указываются в условии.

При использовании обратного счета в цикле с параметром, в этом случае "to" меняется на "downto":

Конечно же, можно совмещать различные виды ветвлений, например «вкладывать» одно ветвление в другое.

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

Что программа делает. Помните заставку из кинофильма «Матрица»? Так вот, программа будет отображать бегущие цифры (один и ноль) в случайном порядке. То есть примерно такая картинка:

А вот и код программы.

Листинг : Описание

Program The_Matrix;

Uses crt;

Var q, i:integer;

Begin

Textcolor (Green);

Randomize;

HighVideo;

ClrScr;

Repeat

For i:=1 to 80 do

Begin

Delay (10); q:=random (1);

Write (q:2);

End;

Delay (15000);

Until keypressed;

End.

Небольшое примечание: HighVideo позволяет установить максимальную яркость экрана... LowVideo минимальную, а NormVideo, нормальную соответственно.


Карта сайта


Информационный сайт Webavtocat.ru