Программирование алгоритмов разветвляющейся структуры

Программирование алгоритмов линейной структуры

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

Составной оператор

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

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

Язык Турбо Паскаль не накладывает никаких ограни­чений на характер операторов, входящих в составной опе­ратор. Среди них могут быть другие составные операторы.— Турбо Паскаль допускает произвольную глубину их вложенности:

Begin

Begin

Begin

end;

end;

End;

Зарезервированное слово endявляется закрывающей операторной скобкой, оно одновременно указывает конец предыдущего оператора, поэтому ставить перед ним сим­вол « ; » необязательно.

Пустой оператор

Символ « ; » называется пустым оператором и означа­ет окончание предшествующего ему оператора.

Программирование линейных алгоритмов

Итак, мы уже знакомы с некоторыми основными (ба­зовыми) понятиями языка Паскаль. Теперь можно при­ступать к непосредственному изучению программирова­ния на этом языке тех типов алгоритмов, о которых гово­рилось ранее.

Вспомним, что программа — это упорядоченный спи­сок команд на некотором конкретном языке программи­рования. Запрограммировать некоторый алгоритм озна­чает написать программу, реализующую этот алгоритм. Попробуем для начала программировать алгоритмы ли­нейной структуры.

Напомню, что линейным называется алгоритм, в ко­тором все этапы решения задачи выполняются строго по­следовательно, т.е. линейный алгоритм выполняется в ес­тественном порядке его написания и не содержит развет­влений и повторений.

Для реализации алгоритмов линейной структуры ис­пользуются операторы:

- Оператор (процедура) вывода — Write ( );или WriteLn( )

- Оператор (процедура) ввода — Read ( );или ReadLn( )

- Оператор присваивания — :=

Рассмотрим эти операторы подробнее.

Оператор присваивания.В результате присваивания переменная получает конкретное значение.

<Имя Переменной>:=Выражение;

«:=» — символ присваивания;

Например:

Counter: =0;

Pi: =3.1415926;

Процедуры вывода.Процедура WRITEпредназначе­на для вывода на экран монитора сообщений и значения выражений или переменных.

Для того, чтобы вывести сообщение, нужно заключить его в апострофы (буква Э) в этом случае то, что заключено в апострофы, при работе вашей программы появится на экране монитора без изменений.

Например:

write (,Привет,)

После выполнения этой строки программы на экране появится надпись:

Привет

Если вы хотите вывести на экран результат некоторых ваших вычислений, т.е. не сообщение, а значение, храни­мое в некоторой переменной, то апострофы не ставятся.

Например: пусть в некоторой переменной Dokв ре­зультате вычислений хранится целое значение = 55, ко­торое вы хотите вывести на экран. Тогда достаточно запи­сать в программе следующую строку:

write (Dok);

После выполнения этой процедуры на экране появится:

Если же, например, надо вывести некоторое веществен­ное значение, то можно использовать форматы вывода.

Например: пусть в некоторой переменной D в резуль­тате вычислений хранится значение = 12,4567, которое вы хотите вывести на экран. Тогда запишем оператор:

write (D:5:2);

Здесь использован формат вывода, где первая цифра означает общее количество знаков в выводимом числовом значении, а вторая цифра — количество знаков после за­пятой. В результате выполнения этой процедуры на экра­не появится:

12,45

Т.е. последние две цифры не пропечатаются, так как в формате мы указали только две цифры после запятой. Чтобы пропечатать число полностью надо видоизменить оператор:

write(D:7:4);

Тогда после выполнения этой процедуры на экране появится:

12,4567

Значение переменных перечисляемого типа нельзя вывести с помощью процедуры write.

Рассмотрим еще один пример. Пусть в переменной kolхранится количество книг в некоторой библиотеке, на­пример = 10675. Выведем это значение на экран, но с по­яснением для пользователя вашей программы, т.е. на эк­ране должно появиться:

Всего книг — 10675

Этого можно добиться следующей последовательностью операторов:

Write('Bcero книг — ');

Write(kol);

А можно записать все в одном, разделив параметры в скобках запятой:

Write('Bcero книг— ', kol);

Результат будет один и тот же.

Процедура Writeln {write line}выводит информацию строкой. После того как была выведена информация, за­писанная в скобках после имени процедуры, курсор пере­местится на другую строку.

Процедуры ввода.Для ввода данных используют про­цедуры read, readln.

Процедура readсчитывает данные, вводимые с клави­атуры, а процедура readlnсчитывает данные и символ конца строки. Т.е. как и в случае с процедурой вывода, частица In (line)в конце означает, что после выполнений процедуры ввода курсор будет переведен на следующую строку.

Пример.

Составить программу, которая находит площадь пря­моугольника произвольных размеров.

Решение:

Program Wip;

Var Dlina,Shirina,S:real;

Begin

Writeln ('Введите длину прямоугольника');

Readln(Dlina);

Writeln ('Введите ширину прямоугольника');

Readln(Shirina);

S:=Dlina*Shirina;

Writeln ('Площадь прямоугольника с шириной ',Shirina:8:2,' и длиной', Dlina:8:2,'paвнa',S:8:2);

Readln

End.

Кстати, приведенная выше программа реализует алго­ритм линейной структуры (алгоритм вычисления площа­ди прямоугольника).

Рассмотрим еще примеры реализации алгоритмов ли­нейной структуры.

Пример.

Алгоритм Квадрат_числа; {заголовок алгоритма}

Переменные X,Y: вещественные числа; {описательный блок}

Начало

Ввод(Х);

Y:=X*X;

Вывод(Y);

Конец.

Запишем программу на языке Паскаль, реализующую данный алгоритм; для вычисления квадрата числа здесь используется стандартная арифметическая функция языка Паскаль — sqr():

Текст программы Пояснения
1. Program Scr; Заголовок программы
2. Var x,y:real; Описание переменных
3. Begin Начало тела программы
4. Write ('Введите х -> '); Оператор вывода на экран сообщения: Введите х ->
5. Readln (x); Оператор считывания введенного пользователем значения и записи его в переменную х
6. Y:=sqr(x); Оператор присваивания, в котором происходит вычисление квадрата введенного пользователем числа и записи полученного значения в переменную у.
7. Writeln('y = ',y); Вывод на экран результата работы программы, а именно значения, хранящегося в переменной у.
8. End. Конец тела программы.

Обратите внимание на использование здесь операторов ввода\вывода.

Во-первых, в начале программы (строки № 4,5) опера­тору ввода значения в переменную х (Readln (x);) пред­шествует оператор вывода на экран приглашающего сооб­щения (Write ('Введите х -> ');). В результате работы этого оператора вывода во время исполнения программы церед пользователем на экране появится сообщение:

Введите х ->_

Программирование алгоритмов разветвляющейся структуры - student2.ru

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

Например:

Введите х-> 1

После того как число набрано и будет нажата клавиша Enter, управление перейдет к следующему оператору (Readln (x);),который прочитает введенное пользовате­лем сообщение и запишет его в переменную х.

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

А операторы ввода\вывода используются в том числе для организации такого режима диалога.

Во-вторых, при выводе результата расчета в операторе вывода (Writeln) через запятую перечислено два парамет­ра: (у = ',у), первый из которых стоит в апострофах ('у ='), а второй — без них (у). В чем разница? То, что в параметрах оператора вывода стоит в апострофах, выво­дится на экран без каких-либо изменений. По сути, это просто строка некоторого сообщения. А второй параметр оператора вывода (без апострофов) выдаст на экран не саму букву у, а значение (в данном случае численное), храня­щееся в переменной под именем у. Т.е. на экране появит­ся строка вида:

y=1

Кроме того, напомню, что частичка In в конце операто­ра ввода\вывода означает, что после выполнения задан­ного оператором действия курсор будет переведен на сле­дующую (пока пустую) строку экрана.

С учетом всего вышесказанного во время работы про­граммы перед пользователем на экране сформируется сле­дующая последовательность записей (например):

Введите х -> 2

y=4

Эта последовательность строк называется протоколом работы программы.

Рассмотрим еще один пример.

Пример.

Даны переменные А и В. Требуется обменять их значе­ния, т.е. переменная А должна получить значение В, а В — значение А.

Решение:

1. Исходные данные: А, В. Вспомогательная переменная DOP. Результат: А, В.

2. Метод решения задачи. В ЭВМ каждая величина
хранится в отдельном участке памяти (переменной). Поэтому задача заключается в том, чтобы поменять местами содержимое двух ячеек. Решение задачи распадается
на три этапа. Запись этого алгоритма с помощью псевдо­кода:

Алгоритм Перемещение; {заголовок алгоритма}

Переменные А,В,Dор:целые числа; {описательный блок}

Начало

Ввод (А,В);

Dop:=A;

А:=В;

B:=Dop;

Вывод(А,В);

Конец.

Программная реализация будет иметь вид:

Program OBMEN;

Var a, b, dop: integer;

Begin

{Ввод исходных данных}

Write ('Введите а -> '); Readln (a);

Write ('Введите b -> '); Readln (b);

{Обмен значениями}

Dop:=A;

A:=B;

B:=Dop;

{Вывод результата работы}

Writeln ('a =',a);

Writeln ('b = ',b);

End.

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

Комментарии удобно применять при разработке боль­ших программ или программных продуктов, а так же при работе в группе программистов.

Программирование алгоритмов разветвляющейся структуры

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

Каждый подобный путь называется ветвью алгоритма.

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

Для программной реализации этого типа алгоритмов в языке программирования Pascal можно использовать три оператора:

1. Условный оператор (оператор условного перехода).

2. Оператор выбора (оператор варианта).

3. Оператор безусловного перехода.

Рассмотрим вначале оператор безусловного перехода и условный оператор подробнее.

Оператор безусловного переходаимеет вид: GOTO <метка>

GOTO— зарезервированное слово (перейти на метку) <метка>— метка

Метка в Турбо Паскале — это произвольный идентифи­катор, позволяющий именовать некоторый оператор программы и таким образом ссылаться на него. В качестве меток допускается использовать целые числа без знака.

Метка располагается непосредственно перед помечае­мым оператором и отделяется от него двоеточием.

Перед тем как использовать метку в программе, она должна быть описана. Описание меток состоит из заре­зервированного слова LABEL (метка), за которым следует список меток:

Label loop,lb1;

Begin

goto lb1;

loop: …

lb1: …

goto loop;

End.

Действие оператора GOTOсостоит в передаче управле­ния соответствующему меченному оператору.

Правила использования меток:

- метка, на которую ссылается оператор GOTO,должна быть описана в разделе описаний;

- метки, описанные в процедуре (функции) локализуют­ся в ней.

Условный оператор.Условный оператор позволяет проверить некоторое условие и в зависимости от резуль­татов проверки выполнить то или иное действие.

Структура условного оператора:

IF <условие> THEN<оператор 1> ELSE<оператор 2>;

IF, THEN, ELSE— зарезервированные слова (если, то, иначе)

<условие> — выражение логического типа

<оператор 1>,<оператор 2> — операторы языка Турбо Паскаль.

Часть ELSE<оператор 2> условного оператора может быть опущена.

Программирование алгоритмов разветвляющейся структуры - student2.ru

Рис. 1. Алгоритм разветвляющейся структуры

Тогда при значении true (истина) выражения, стоящего в усло­вии, выполняется <оператор 1>, в противном случае этот оператор пропускается.

Пример.

Написать программу расчета функции:

Программирование алгоритмов разветвляющейся структуры - student2.ru

Решение:

Program wetw;

Var yfx:real;

Begin

writeln('x= ');

readln(x); {ввод х}

if (x>0)and(x<2) then y:=Sqr(cos(x)) else y:=1-sin(sqr(x));

{вычисление значения у}

writeln(‘y(’,x:8:2,’)=’,y:8:2); {вывод значения у на экран}

readln; {пауза}

End.

Пример.

Написать программу, которая в переменную max запи­сывает наибольшее из двух чисел х и у.

Программирование алгоритмов разветвляющейся структуры - student2.ru

Решение:

Program wetw2;

Var max,x,y:real;

Begin

write(‘x= ’);

readln(x); {ввод х}

write(‘y= ‘);

readln(y); {ввод у}

max:=y;

jf x>y then max:=x;

{если х>у max:=x, иначе значение max не меняется}

writeln(‘max=’,max:8:2); {вывод значения переменной max на экран}

readln; {пауза}

End.

Оператор выбора (оператор варианта). Условный оператор при выполнении программы позволяет выбрать одно из двух возможных действий. Если же необходимо выполнить много взаимоисключающих проверок, то удоб­нее воспользоваться оператором выбора (варианта).

Общий вид оператора:

CASE <селектор> OF

<список меток варианта>: <оператор 1>;

<список меток варианта>: <оператор 2>;

<список меток варианта>: <оператор З>;

ELSE

<оператор N>

END;

Селектор представляет собой выражение скалярного типа (но не вещественного). Выполнение оператора вари­анта начинается с вычисления значения селектора. Затем для исполнения выбирается оператор, одна из меток ко­торого совпадает с полученным значением. После выпол­нения этого оператора (он может быть простым или со­ставным) управление передается на оператор, следующий за оператором варианта. Если же значение селектора не совпало ни с одной из меток, то выполняется оператор, стоящий после служебного слова ELSE.

Вообще говоря, ветвь ELSE может и отсутствовать.

Рассмотрим пример использования оператора варианта. Заметим сразу, что оператор варианта удобно использовать для ввода и вывода значений перечисляемых скалярных типов данных. Например, в следующем фрагменте програм­мы с внешнего носителя вводится порядковый номер объек­та из списка значений перечисляемого типа COLOR (цвет). Оператор CPSE присваивает соответствующее значение пе­ременной CLR. Аналогично осуществляется вывод значе­ний CLR при помощи оператора варианта.

Program cas;

Type color = (red, blue, black);

Var x: integer;

Clr: color;

Begin

Write ('Введите порядковый номер /0-1-2/ => ');

Readln (x);

Case x of

0: clr:=red;

1: clr:=blue;

2: clr:=black;

Else

Наши рекомендации