Программирование разветвляющихся алгоритмов.

Для организации разветвления в программе, в Паскале используются следующие операторы:

1. Условный оператор.

2. Оператор варианта.

3. Оператор перехода

 

Условный оператор

Условный оператор имеет вид:

 

If Q Then B1 [Else B2];

Блок-схема:

 
 


(Else) - +(Then)

B2
B1

 

 
 

 


Q - выражение, принимающее логическое значение;

B1, B2 – любые операторы, в единственном числе;

Выполняются:

1. Вычисляется выражение Q, которое имеет логическое значение.

2. Если это значение True, то выполняется оператор B1. Если же Q имеет значение False, то в случае полной формы условного оператора выполняется оператор B1 , а в случае неполной формы управление передается следующему оператору программы.

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

1

If Q Then If Q1 Then B1 Else B2;

2

Для устранения двусмысленности введено правило, что часть Else относится к ближайшему слева свободному условию. И структура записи следующая:

If Q Then

If Q1 Then

B1

Else

B2;

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

If Q Then

Begin

If Q1 Then

B1;

End

Else

B2;

Задача1:

Даны 2 различных числа. Найти максимальное из этих чисел.

Пример:

Исходные данные: A=10, C=15

Результат: Максимальное число =15

Решение:

Program Vet1;

Var A,C,Max:Integer;

Begin

Writeln(’Введите 2 различных числа’);

Readln(A,C);

If A>C Then

Max:=A

Else Max:=C;

Write(’Максимальное число = ’,Max);

End.

Задачи:

1. Даны 2 числа. Вывести первое число, если оно больше второго и оба числа, если это не так.

2. Даны 2 различных числа. Найти C=Max/Min.

3. Составить программу вычисления значения Y по введенному значению X.

Y= (X+2)2 , X>=0

X-2 ,X<0

4. Даны числа А, B, Х. Составить программу вычисления значения Y.

(X+2)2 , X<A

Y= X-2 ,A<=X<=B

2*X ,X>B

 

5. Даны 3 различных числа. Найти максимальное из этих чисел.

6. Даны 3 числа. Определить сколько среди них нулей.

7. Даны 3 числа. Определить сколько среди них отрицательных и сколько

положительных чисел.

 

 

Использование составного оператора

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

Begin

операторы;

End;

If Q Then

Begin

A1;

A2;

:

An;

End

Else

Begin

B1;

B2;

:

Bn;

End;

Задача 2:

Даны 2 различных числа. Вычислить x=(y+z)2; - где y=max*2; z=max/min;

Решение:

Program Vet2;

Var A,C,Max,Y:Integer;

Z,X:Real;

Begin

Writeln(’Введите 2 различных числа’);

Readln(A,C);

If A>C Then

Begin

Y:=A*2;

Z:=A/C;

End

Else

Begin

Y:=C*2;

Z:=C/A;

End;

X:=SQR(Y+Z);

Write(’X = ’,X);

End.

Задача 3.

Даны числа A, C. Решить линейное уравнение A*X=C с полным анализом.

Решение:

Program Vet3;

Var A,C,X:Real;

Begin

Writeln(’Введите 2 числа’);

Readln(A,C);

If A=0 Then

If B=0 Then

Writeln(’X -любое’)

Else

Writeln(’Решений нет’)

Else

Begin

X:=C/A;

Writeln(’X=’,X);

End;

End.

Задачи:

1. Даны X,Y (Х<>Y). Меньшее из этих двух чисел заменить полусуммой, а большее их удвоенным произведением

2. Даны числа A, B, C. Решить уравнение AX2+BX+C=0 с полным анализом.

3. Даны 3 числа. Найти разность большего и меньшего из этих чисел

4. Если сумма трех различных чисел X,Y,Z меньше единицы, то меньшее из X,Y заменить полусуммой Y и Z, иначе большее из X и Y заменить произведением Х*Y.

 

6.3.Использование составных логических условий (связки “и”; “или”).

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

Задача 3.

Даны числа X,Y,Z. Проверить, можно ли построить треугольник с данными сторонами.

Решение:

Program Vet3;

Var X,Y,Z:Integer;

Begin

Writeln(’Введите 3 числа’);

Readln(X,Y,Z);

If (X+Y>Z) and (X+Z>Y) and (Y+Z>X) Then

Writeln(’Треугольник существует.’)

Else

Writeln(’Треугольник не существует.’);

End.

Задачи

1. Даны числа А, В, С. Определить есть ли среди них отрицательные числа.

2. По введенной температуре определить здоров человек или болен.

3. Даны числа А, В, С. Определить какое из чисел лежит между двумя другими

4. Даны числа А, В, С. Вывести их на экран упорядоченными по возрастанию.

5. Дана точка M(X,Y). Определить, лежит ли данная точка внутри области D:

a) у б) у в) у г) у y=x

2

       
   
 


D 2 х -2 2 х -3 2 х х

D D -2 D

 

 

д) у у=х2 е) у ж) у з) у

2

               
 
   
     
 
 
 


D х 2 х -2 2 х х

D D -2 D

 

Оператор варианта

Case B of

<список меток 1>:S1;

<список меток 2>:S2;

:

<список меток n>:Sn;

[Else S;]

End;

S1, S2,…, Sn – любые операторы в единственном числе;

B – выражение, дающее значение порядкового типа, оно называется переключателем;

<список меток n> - это перечень констант того же типа, что и значение переключателя B. Разделяются запятой или (..).

Примеры:

1..50; 1,2,4; ’a’,’d’;

Выполняется:

1. Вычисляется значение переключателя B;

2. Отыскивается список меток, включающий это значение и выполняется соответствующий оператор;

3. Если значение переключателя не входит ни в один из списков меток, то в случае полной формы операторa Case, выполняется оператор S, а в случае неполной формы управление передается следующему оператору программы.

Здесь перед Else (;) ставится.

Задача 4:

По номеру дня недели вывести соответствующее ему название.

Решение:

Program Vet4;

Var Z:Integer;

Begin

Writeln(’Введите номер дня недели’);

Readln(Z);

Case Z of

1:Writeln(’Понедельник’);

2:Writeln(’Вторник’);

3:Writeln(’Среда’);

4:Writeln(’Четверг’);

5:Writeln(’Пятница’);

6:Writeln(’Суббота’);

7:Writeln(’Воскресенье’);

Else

Writeln(’Дня с таким номером не существует.’);

End;

End.

Задача 5:

По заданному символу определить, является ли он цифрой, латинской буквой или другим знаком.

Решение:

Program Vet5;

Var Z:Char;

Begin

Writeln(’Введите символ’);

Readln(Z);

Case Z of

’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’0’:Writeln(’Символ - цифра’);

’a’..’z’:Writeln(’Символ – латинская буква’);

Else

Writeln(’Другой знак.’);

End;

End.

Задачи:

1. Определить по введенному номеру месяца, количество дней в нем.

2. Определить, принадлежит ли введенное целое число к десяткам, сотням или тысячам.

3. По номеру квартала определить принадлежащие ему названия месяцев.

4. По номеру четверти координатной плоскости вывести знаки Х и У.

 

Оператор перехода

Оператор перехода имеет вид:

Goto M;

M- метка. Все метки должны быть описаны в разделе описания меток;

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

Оператор Goto Met; передает управление на оператор с меткой Met.

Пусть программа содержит последовательность операторов:

X:=2; A:=X; Goto Met;

1:A:=A*2; B:=A; Met:Writeln(B);

В этом случае сначала выполняются операторы X:=2; A:=X; затем следует переход к оператору, помеченному меткой Met т.е. к оператору Writeln(B);

Задача 6.

Даны 3 отрицательных числа. Найти предыдущее и следующее значение максимального из этих чисел.

Решение:

Program Vet6;

Label 1;

Var A,B,C:Integer;

Begin

1:Writeln(’Введите отрицательные числа’);

Readln(A,B,C);

If (A>0) or (B>0) or (C>0) Then Goto 1;

{далее задачу решаем самостоятельно}

End;