Вопросы:
· Определение разветвляющегося алгоритма.
· Операторы, используемые для записи разветвляющихся алгоритмов в языке Pascal.
· Простой и составной условные операторы.
Далеко не все алгоритмы можно свести к простой последовательности действий. Иногда действия изменяются в зависимости от некоторых условий. Например, если будет солнечная погода – Миша пойдёт играть в футбол, в противном случае – он останется дома и будет придумывать полезные программы, которые он мог бы написать.
Для описания подобных ситуаций используются разветвляющиеся алгоритмы. Они несколько сложнее линейных. В разветвляющихся алгоритмах помимо следования используется конструкция ветвления. Ветвлением называется конструкция, в которой в зависимости от некоторого условия происходит исполнение одной из двух последовательностей команд, которые называются ветвями.
Так как разветвляющиеся алгоритмы сложнее линейных, для того чтобы облегчить их составление при решении задач, прежде чем приступить к программированию алгоритмов будем составлять их блок-схемы. При записи блок-схемы такого алгоритма видно, что после условия – блок которого изображается в виде ромба – следует две ветви операторов. Одна из них будет выполняться в том случае, если будет выполняться условие, в противном случае будет выполняться другая ветвь.
Блок-схема разветвляющегося алгоритма
Для записи конструкции ветвления в языке Pascal используется условный оператор. У условного оператора в языке программирования Паскаль есть две формы записи: полная и сокращённая. В сокращённой форме для записи условного оператора используется служебное слово if. После него через пробел следует условие. В роли условия выступает логическое выражение, простое или сложное. После условия на следующей строке записывается служебное слово then. После него следует оператор, который будет выполнен, если будет выполняться указанное условие. После оператора следует точка с запятой. В полной форме записи условного оператора следует всё тоже самое, однако после оператора, следующего после слова then, точка с запятой не ставится. Вместо этого знака на следующей строке записывается служебное слово else. После него следует оператор, который будет выполнен, если указанное условие выполнятся не будет. После него следует точка с запятой.
Задача: Написать программу для определения наибольшего из двух чисел, введённых пользователем. Если числа равны между собой – вывести любое из них.
Обозначим введённые пользователем числа a и b. Составим блок-схему алгоритма решения задачи. Как мы помним, любая блок-схема начинается с блока «Начало». Сначала программа будет принимать на ввод два числа: a и b. Далее будет следовать ветвление. Его условием будет, что a больше b. В случае, если условие выполняется программа должна вывести a, если же условие выполняться не будет, то есть b будет больше a или же они будут равны между собой, то программа должна вывести b. Любая блок-схема заканчивается блоком «Конец».
Блок-схема алгоритма
Напишем программу по составленной блок-схеме. Назовём нашу программу max. В разделе описания переменных укажем две переменные: a и b. Так как в тексте задачи не указано, что они целые – объявим их вещественного типа real. Запишем логические скобки. Сначала запишем оператор writeln, который будет выводить на экран поясняющее сообщение о том, что это программа определения наибольшего из двух чисел, и запрос на ввод двух чисел. Дальше будет следовать оператор readln, который будет считывать значения переменных a и b.
Теперь запишем условный оператор. Как мы узнали, он начинается со служебного слова if. Через пробел поле него запишем условие a>b. Cтрокой ниже запишем служебное слово then, после которого будет следовать оператор write, который будет выводить на экран значение переменной a и поясняющее сообщение, о том, что это наибольшее из двух введённых чисел. После этого оператора точка с запятой ставиться не будет. На следующей строке запишем служебное слово else, после которого будет следовать оператор write. Он будет выводить на экран значение переменной b и поясняющее сообщение о том, что это наибольшее число. После этого оператора поставим точку с запятой.
program max;
var
a, b: real;
begin
writeln ('Программа нахождения большего из 2 чисел. Введите 2 числа.');
readln (a, b);
if a>b
then write (a, ' - наиболешее из 2 чисел.')
else write (b, ' - наибольшее из 2 чисел.');
end.
Исходный код программы
Запустим программу на выполнение. Введём сначала числа 35 и 74. Число 74 действительно наибольшее.
Снова запустим программу и введём числа 100 и 99. Наибольшим действительно является число 100.
Снова запустим программу и дважды введём 5. Так, как числа равны между собой программа вывела что наибольшее число – 5.
Программа работает правильно, задача решена.
Есть ситуации, когда от выполнения условия в программе зависит исполнение ни одного действия, а целой их серии. В этом случае используется составной условный оператор. В этом операторе после служебных слов then и else следуют целые последовательности операторов, заключённые между логическими скобками. Важно при этом помнить, что перед служебным словом else точка с запятой не ставится.
if <условие>
then begin
<оператор 1>;
<оператор 2>;
…
end;
Составной условный оператор
Так же внутри оператора ветвления может встречаться и другой оператор ветвления. Такой оператор ветвления называется вложенным. В этом случае важно не перепутать какая ветвь кода к какому оператору относится. Поэтому рекомендуется соблюдать отступы в исходном коде программы, чтобы не запутаться.
if <условие>
then if <условие>
then <оператор 1>;
Вложенный условный оператор
Задача: 3 отрезка заданы своими длинами. Определить, образуют ли эти отрезки треугольник, и если образуют, то какой: остроугольный, прямоугольный или тупоугольный.
Обозначим через a, b и с длины отрезков. Давайте вспомним, как определить, могут ли отрезки быть сторонами треугольника. Для этого необходимо, чтобы длина наибольшего из отрезков была меньше суммы двух остальных.
Похожим образом можно определить является треугольник остроугольным, прямоугольным или тупоугольным. Является ли треугольник прямоугольным можно определить по теореме Пифагора. Для этого достаточно чтобы квадрат большей стороны был равен сумме квадратов двух остальных сторон. Если длина большей стороны будет больше суммы квадратов двух оставшихся сторон, то треугольник будет тупоугольным, а если меньше – то остроугольным.
Составим блок-схему алгоритма решения задачи. Блок-схема начинается с блока «Начало». Затем программа должна считать введённые пользователем длины отрезков: a, b и с. Чтобы облегчить решение задачи в дальнейшем, сделаем так чтобы отрезок с наибольшей длиной соответствовал известной нам переменной, условимся что это будет переменная с. Для этого нам понадобится ветвление, которое будет определять наибольшую из переменных a и b. Его условием будет, что a > b. Потом оно должно сравнить наибольшую из переменных с c. Если условие первого ветвление выполняется, то дальше будет следовать новое ветвление с условием: a > c. Если это условие будет выполняться через промежуточную переменную p поменяем местами значения переменных a и c. Для этого присвоим p значение c, c – значение a, а a – значение p. Если же это условие выполняться не будет – то ничего делать не нужно. В случае, если условие a > b не будет выполняться должно следовать ветвление с условием b больше c. Если это условие будет выполняться – то нам нужно через промежуточную переменную p поменять местами значения переменных b и c. Если же условие не выполняется, то делать также ничего не нужно.
Теперь приступим к проверке того, могут ли отрезки составить треугольник. Так как мы знаем, что отрезку с наибольшей длиной соответствует переменная c. Нам достаточно проверить условие: c < a + b. Если это условие выполняется, то нужно проверить каким является данный треугольник. Сначала проверим, является ли он прямоугольным. Для этого нам нужно ветвление с условием: с2 = а2 + b2. Если это условие выполняется, то нужно вывести сообщение о том, что заданные отрезки образуют прямоугольный треугольник. Если же это условие не выполняется, то треугольник либо остроугольный, либо тупоугольный. Определим это записав ветвление с условием: с2 > а2 + b2. Если это условие выполняется, то программа должна вывести сообщение о том, что заданные отрезки образуют тупоугольный треугольник. Если же это условие не выполняется нужно вывести на экран поясняющее сообщение о том, что заданные отрезки образуют остроугольный треугольник. Осталось рассмотреть случай, когда условие с < а + b не выполняется. В этом случае нужно вывести на экран сообщение о том, что заданные отрезки не образуют треугольник. Блок-схема заканчивается блоком «Конец».
Блок-схема алгоритма
Теперь напишем программу по заданной блок-схеме. Назовём программу treugolnik. Запишем раздел описания переменных. Нам понадобится три переменных, которые будут хранить длины отрезков: a, b и c, а также промежуточная переменная p. По условию не указано что они целые, поэтому зададим их вещественного типа real.
Запишем логические скобки. В начале будет следовать оператор writeln, который выводит на экран поясняющее сообщение о том, что это программа проверки того, образуют ли три заданных отрезка треугольник. И запроса на ввод длин трёх отрезков. Далее будет следовать условный оператор if с условием: a > b. После слова then будет следовать краткая форма записи условного оператора с условием: а > c. В нём после слова then запишем логические скобки, то есть слова begin и end. После слова end точка с запятой не ставиться. В логических скобках будет следовать три оператора присваивания: p:=c, c:=a и a:=p. Далее будет следовать служебное слово else. После него в краткой форме будет записан условный оператор с условием: b > c. После слова then будут следовать логически скобки. После слова end будет следовать точка с запятой. Между логическими скобками будет три оператора присваивания: p:=c, c:=b и b:=p.
Теперь запишем ещё один условный оператор, который будет проверять образуют ли отрезки треугольник. Его условием будет: c < a + b. После слова then будет следовать проверка того, каким является треугольник. Это будет условный оператор, с условием: sqr (c) = sqr (a) + sqr (b). После слова then будет следовать оператор write, который выводит сообщение о том, что заданные отрезки образуют прямоугольный треугольник. После слова else будет следовать ещё один условный оператор, который будет проверять является треугольник остроугольным или тупоугольным. Его условием будет sqr (c) > sqr (a) + sqr (b). После слова then в нём будет следовать оператор Райт, выводящий сообщение о том, что заданные отрезки образуют тупоугольный прямоугольник. После слова Элс в нём будет следовать ещё один оператор write, выводящий сообщение о том, что заданные отрезки образуют остроугольный треугольник. Далее будет следовать служебное слово else для условного оператора с условием: c < a + b. После него будет следовать оператор write, выводящий сообщение о том, что заданные отрезки не образуют треугольник.
program treugolnik;
var
a, b, c, p: real;
begin
writeln ('Программа проверки того, образуют ли 3 заданных отрезка треугольник. Введите длины отрезков.');
readln (a, b, c);
if a>b
then
begin
if a>c
then begin
p:=c;
c:=a;
a:=p;
end
end
else if b>c
then begin
p:=c;
c:=b;
b:=p;
end;
if c<a+b
then if sqr(c)=sqr(a)+sqr(b)
then write ('Заданные отрезки образуют прямоугольный треугольник.')
else if sqr(c)>sqr(a)+sqr(b)
then write ('Заданные отрезки образуют тупоугольный треугольник.')
else write ('Заданные отрезки образуют остроугольный треугольник.')
else write ('Заданные отрезки не образуют треугольник.');
end.
Исходный код программы
Запустим программу на выполнение. Введём сперва длины отрезков, которые не образуют треугольник: 1, 1 и 5. Программа вывела соответствующее сообщение.
Снова запустим программу и введём отрезки, образующие прямоугольный треугольник: 5, 4 и 3. Программа вывела соответствующее сообщение.
Снова запустим программу и введём длины отрезков, образующих остроугольный треугольник: 1, 1 и 1. Программа вывела соответствующее сообщение.
И в последний раз запустим программу и введём длины отрезков, образующих тупоугольный треугольник: 6, 3 и 4. Программа вывела соответствующее сообщение.
Программа работает правильно. Задача решена.
Важно запомнить:
· В разветвляющемся алгоритме используются ветвления.
· Ветвление – это алгоритмическая конструкция, в которой при определённом условии выполняется одна из двух последовательностей действий или ветвей.
· Для записи ветвления в языке Pascal используется условный оператор.
Здравствуйте.
Благодарим за внимание к нашему проекту. Урок исправлен.
Здравствуйте. Благодарим за Ваш комментарий. Обязательно проверим.
В уроке 26, в программе проверки того, образуют ли 3 заданных отрезка треугольник, не проставлены логические скобки после первого оператора if, из-за этого else относится к второму if, и данные 4,8,6 выдают наибольшее значение 6. Блок-схема не соответствует программе.