ОСНОВНЫЕ АЛГОРИТМИЧЕСКИЕ СТРУКТУРЫ
Условный оператор
Если в процессе вычислительной работы появляется более одного направления хода дальнейших вычислений, такой процесс уже не является линейным: в зависимости от выполнения некоторого условия производятся различные варианты расчета. Ветвление в Паскале реализуется с помощью условного оператора IF, который позволяет выбрать для выполнения один из предлагаемых вариантов вычислений или не выбрать ни одного.
При решении задач в системе ИнтАл Вы использовали две формы записи команды ветвления: сокращенную и полную. Аналогично обстоит дело в Паскале:
Неполная команда ветвления | Полная команда ветвления |
IF P THEN S ; | IF P THEN S1 ELSE S2 ; |
Рис.3.4. |
Здесь P – условие разветвления (логическое выражение или выражение отношения), S, S1, S2 – выполняемые операторы.
* Условие Р бывает простым (если оно содержит единственное выражение сравнения) и составным (если оно составлено из нескольких выражений сравнения, соединенных логическими операциями). В составных условиях выражения сравнения заключаются в круглые скобки. Примеры простых выражений: a>b, 5+x=3, sqrt (x)<=25. Примеры сложных выражений:
(x+y=5) and (2*x*sin(x)<5.5) à
(x<y) or not (y<z) à
Порядок выполнения операторов приводится на рис. 3.4. Так, в неполной конструкции, если условие Р истинно, выполняется оператор S, а затем – оператор, следующий за оператором if.
Если по одной из ветвей после служебных слов THEN и(ли) ELSE требуется выполнение более одного оператора, их ограничивают операторными скобками BEGIN … END и рассматривают как составной оператор.
Примеры:
Запись на ИнтАле | Запись на Паскале |
Если a>b То x:=a Иначе x:=b Конец_Если | IF a>b THEN x:=a ELSE x:=b ; |
Если a>b То x:=a k:=1 Иначе x:=b k:=2 Конец_Если | IF a>b THEN BEGIN x:=a ; k:=1 END ELSE BEGIN x:=b ; k:=2 END ; |
Если a>b То Если a>c То x:=a Конец_Если Конец_Если | IF a>b THEN IF a>c THEN x:=a ; |
* IF (a>b) and (a>c) THEN x:=a ; |
Примеры решения задач:
Пример 1. Моделирование работы пожарного датчика в помещении: программа должна выводить сообщение «Пожароопасная ситуация», если температура в комнате превысит 60° C; если температура не более 60° C, датчик «молчит». | Program OGON; Var T: Real; Begin Write ('T='); Readln (T); If T>60 then Writeln ('Пожароопасная ситуация') End. | ||
Пример 2. Реализуем на Паскале полностью алгоритм решения задачи 1 (§ 9): «Определить, на какой высоте и на каком расстоянии от места броска окажется через время t (с) мяч, брошенный под углом α к горизонту с начальной скоростью υ0 (м/с)» (с учетом проверки корректности исходных данных). Напомним, что математическая постановка задачи и описание алгоритма ее решения приводятся в § 9, линейная часть алгоритма реализована на Паскале в § 15. Будем использовать неполную команду ветвления: если требуемые условия не выполняются, программа не совершает никаких действий. Можно предусмотреть вывод сообщения о некорректных данных: If (alfa>0) and (…) … then Begin … End Else Writeln ('Некорректные данные'); | Program BROSOK ; Const g = 9.8 ; Var V0, t, alfa, x, y : Real ; Begin Write ('введите скорость ') ; Readln (V0) ; Write ('введите время ') ; Readln (t) ; Write ('введите угол ') ; Readln (alfa) ; alfa:=alfa*pi/180; If (alfa>0) and (alfa<=pi/2) and (V0>0) and (V0<=20) and (t>0) Then Begin x:=V0*cos(alfa)*t ; y:=V0*sin(alfa)*t-g*t*t/2 ; Writeln ('x=',x) ; Writeln (' y=',y) End ; End . | ||
Пример 3. Требуется определить, является ли человек, возраст которого x задан, школьником. Задача сводится к проверке условия: 6 ≤ х ≤19 (сравните с решением примера 4 п. 19.1) | Program School_1; Var X : Byte ; Begin Write ('Возраст='); Readln (X) ; If X>=6 then if X<=19 then Writeln ('школьник') End . | Program School_2; Var X : Byte ; Begin Write ('Возраст='); Readln (X) ; If (X>=6) and (X<=19) then Writeln ('школьник') End . | |
* Пример 4. Требуется написать программу для решения неравенства ax > b (a, b – действительные числа).
Возможны следующие варианты ответа: 1) x>b/a (при a > 0); 2) x<b/a (при a < 0); 3) нет решений (при a = 0, b ≥ 0); 4) x – любое число (при a=0, b<0). Program Neravenstvo ; Var a, b : Real ; Begin Write ('a=') ; Readln (a) ; Write ('b=') ; Readln (b) ; If a>0 Then Writeln ('x>',b/a) Else If a<0 Then Writeln ('x<',b/a) Else If b>=0 Then Writeln ('нет решений') Else Writeln ('x-любое число') End . If a >0 Then Writeln ('x>',b/a) ; If a <0 Then Writeln ('x<',b/a) ; If a=0 then If b>=0 Then Writeln ('нет решений') Else Writeln ('x-любое число') |
* В случае вложенных ветвлений каждое новое ключевое слово Else следует считать относящимся к ближайшему неиспользованному If. Например,
If x>-5 Then If x<=6 Then y:=x*x Else y:=x*x*x Else y:=x ; | Этот фрагмент позволяет вычислить значение y по формуле: |
1. Какие значения могут принимать переменные типа Boolean?
2. Какие операции сравнения и логические операции допустимы в языке Паскаль?
3. Что может быть операндом выражений сравнения? логических выражений?
4. Что такое «условный оператор» и когда он применяется?
5. Что может использоваться в качестве условия в условном операторе?
1. Определите, какие значения будут принимать переменные Х и Y после выполнения следующих операторов при:
1) A=5, B=3; 2) A=7, B=7; 3) A=-3, B=-10; 4) A=3, B=0; 5) A=5, B=2:
а) if A=B then X := A+1; Y:=B+1 ; | б) if A>B then X:=B+1 else Y:=A+1; X:=0; |
в) if A=B then Begin X := A+1 ; Y := B+1 End ; | г) if A>B then Y:=A-1 else Begin X:=B-2; Y:=0 End ; |
* д) if (A>B) and (A*B>0) then Begin X:=SQRT (A*B); Y:=100 End Else Begin X:=B-A; Y:=A*B End ; |
2. Определите, какие значения будут иметь переменные a и b после выполнения условного оператора if a>=b then a:=b else b:=a;
если: 1) a=0.9; b=0.7; 2) a=-7.3; b=7.3; 3) b=17; a=17; 4) a=5; b=5;
* 3. Определите, какие из следующих операторов задают вычисления по формуле:
4. Напишите программы решения задач:
1) Найти лучший результат в забеге на 100 м трех спортсменов.
2) Участники забега на 100 м имеют номера 1, 2, 3. Найти номер победителя, если результаты забега известны.
3) Определить длительность звучания музыкальной композиции, если известно время начала и окончания звучания. На экран компьютера требуется вывести только значения времени (часов, минут, секунд), отличные от нуля (например, если время начала – 16 ч 57 м 30 с, а время окончания – 17 ч 14 м 30 с, то длительность звучания составит 17 м ).
4) Определить по номеру года, является ли он високосным (год високосный, если его номер делится на 4, кроме тех, которые делятся на 100 и не делятся на 400). Например, 1900 год – не високосный, 2000 год – високосный.
5) Для старшеклассника определены нормальные значения границ кровяного давления: верхняя – не более 100, нижняя – не менее 60 и разница верхней и нижней границ – не менее 30. Определить, является ли давление старшеклассника нормальным, если заданы значения нижней и верхней границ кровяного давления.
* 6) Используя метод Ленуара, определить название дня недели для некоторой даты, которая задается номерами года (g), месяца (m), дня (d):
вначале следует вычислить значение С = [365,25g] + [30,56m] + d +N, где N=1, если месяц – январь или февраль високосного года, N=2, если месяц – январь или февраль невисокосного года, N=0 для остальных месяцев;
затем нужно найти остаток от деления С на 7; если он равен 0, то в качестве ответа выведите «среда», 1 – «четверг», …, 6 – «вторник».
* 7) В финале конкурса «Лучший по профессии» приняли участие два конкурсанта: Петров и Сидоров. Финал предусматривает проведение трех конкурсов, по каждому из которых выставляется число баллов каждому участнику. Победитель должен быть определен по сумме баллов. С клавиатуры вводятся количество баллов, которое набрал каждый участник в каждом конкурсе. Требуется вывести наибольшую сумму баллов и фамилию победителя.
8) Найти решение уравнения ax=b.
9) Решить квадратное уравнение ax2 +bx + c =0 (а ≠ 0).
* 10) Решить уравнение ax2 +bx + c =0.
11) Заданы три действительных числа. Выяснить, могут ли они оказаться длинами сторон некоторого треугольника.
* 12) Получить решение системы уравнений:
* 13) На экскурсию в крепость-герой Брест отправляется N человек. Для их перевозки выделены автобусы вместимостью K и M человек. Определить, сколько необходимо автобусов для перевозки всех экскурсантов (не забудьте, что одно место в каждом автобусе занято гидом). Попытайтесь определить вариант с минимальным количеством автобусов.
* 14) При исследовании поверхности планеты Зета обнаружена популяция, развитие которой с момента ее возникновения подчиняется закону, описываемому следующим образом:
где k = 1, 2, 3, … (аi – численность популяции в i-м году). По заданному номеру nгода найти численное значение популяции.
Оператор выбора CASE
Оператор CASE представляет собой частный случай структуры ВЕТВЛЕНИЕ, когда возникает необходимость выбора одного из нескольких возможных вариантов вычислений в зависимости от значений некоторого выражения (ключа, селектора).
Порядок выполнения оператора Case следующий: вычисляется значение выражения K; полученное значение сравнивается с K1, K2, …, KN; если оно совпадает с одним из этих значений, то управление передается соответствующему оператору и выполнение оператора CASE завершается. Если значение выражения K не совпадает ни с одним из возможных значений, далее все зависит от типа оператора CASE: если он полный (в нем присутствует служебное слово ELSE), то управление передается команде S; в противном случае выполнение оператора завершается.
Конструкция | ИнтАл | Паскаль |
Выбрать_По K K1: S1 K2: S2 . . . KN: SN Иначе S Конец_Выбора K – переменная целого типа; K1, K2, …, KN – возможные значения переменной К; S1, S2, …, SN, S – выполняемые команды | CASE K OF K1 : S1 ; K2 : S2 ; . . . KN : SN ELSE S END ; K – выражение, определяющее значение ключа; K1, K2, …, KN – возможные значения ключа; S1, S2, …, SN, S – выполняемые операторы (простые или составные) |
Вариант записи, полученный после зачеркивания блока и строк в приведенных выше схемах, соответствует оператору выбора (или, как его еще называют, оператору варианта) в неполной (сокращенной) форме.
Селектор K представляет собой выражение порядкового типа. К порядковому типу относятся целочисленные типы, логический тип и символьный, с которым Вы познакомитесь в разделе 4.
В Паскале допускается использование нескольких возможных значений ключей, разделенных запятой (перечисление значений) или двумя точками “..” (диапазон значений).
Пример 1. По номеру дня недели требуется определить его название.
Program Day ;
Var Num : Byte ;
Begin
Writeln ('Введите номер дня недели') ;
|
Case Num of
1: Writeln ('Понедельник') ;
2: Writeln ('Вторник') ;
3: Writeln ('Среда') ;
4: Writeln ('Четверг') ;
5: Writeln ('Пятница') ;
6: Writeln ('Суббота') ;
7: Writeln ('Воскресенье')
Else
Writeln ('Это не номер дня недели')
End;
End.
Пример 2. Составить программу, которая для заданных номеров месяца и года позволит определить количество дней в этом месяце.
Дано: month, year – номера месяца и года.
Найти: kol_days – количество дней в этом месяце.
Связь:
year – високосный, если year делится без остатка на 4, кроме тех, которые делятся на 100 и не делятся на 400. Например, 1900 год – не високосный, 2000 год – високосный.
Будем считать, что данные корректны.
Program Days ;
Var Year : Integer ;
month, kol_days : Byte ;
Sto : Boolean;
Begin
Write ('Введите номер месяца ') ;
Readln (month) ;
Case month of
1, 3, 5, 7, 8, 10, 12 : kol_days := 31 ;
4, 6, 9, 11 : kol_days := 30 ;
2 : Begin {февраль}
Write ('Введите номер года ') ;
Readln (Year) ;
Sto:=(Year mod 100)=0;
if ((Sto=True) and (Year mod 400 =0)) or
((Sto=False) and (Year mod 4=0)) Then
kol_days := 29
Else kol_days := 28
End;
End ;
Writeln (kol_days);
End .
Пример 3. Составить программу проверки, делится ли заданное натуральное число на 7.
Пусть х – заданное натуральное число. Составим выражение сравнения: x mod 7 =0. Используем это выражение в качестве селектора; его возможные значения: True, False. Ниже приводятся два варианта использования оператора выбора (в полной и неполной формах):
Program PRIM_3 ; Var x : LongInt ; Begin Write ('Введите натуральное число ') ; Readln (x) ; | |
Case x mod 7 = 0 of True : Writeln ('делится на 7') ; False : Writeln ('не делится на 7') | Case x mod 7 = 0 of True : Writeln ('делится на 7') Else Writeln ('не делится на 7') |
End ; End . |
1. Какова структура условного оператора? * оператора выбора?
2. Каков порядок выполнения условного оператора? * оператора выбора?
1. Напишите программы решения следующих задач:
1) На экран компьютера выводится текст:
После того как пользователь сделает выбор, необходимо вывести знак препинания, каким должно заканчиваться предложение данного типа.
2) По номеру класса, в котором учится школьник, требуется определить, в школе какого типа он обучается (подготовительная, начальная, базовая, средняя).
3) На экран компьютера выводится текст:
После того как пользователь сделает выбор, необходимо ввести значения требуемых элементов, вычислить площадь и вывести полученный результат.
4) Таблица К. Купера позволяет определить степень физической подготовленности человека в зависимости от суммы очков, набранных им на занятиях по физической культуре за неделю:
Сумма очков, набранных за неделю | Степень физической подготовленности | |
Юноша | Девушка | |
Не менее 75 | Не менее 65 | Превосходно |
51-74 | 41-64 | Отлично |
32-50 | 27-40 | Хорошо |
21-31 | 16-26 | Удовлетворительно |
10-20 | 8-15 | Плохо |
Меньшее 10 | Меньше 8 | Очень плохо |
Программа должна предложить ввести сумму набранных очков, уточнить, кто их набрал (юноша или девушка) и вывести на экран компьютера оценку физической подготовленности.
5) Программа предлагает ввести возраст человека (если необходимо, также его пол) и выводит, к какой группе он относится: дошкольник, ученик, работник, пенсионер.
6) В пятиэтажном доме на каждом этаже по 4 квартиры. Программа должна предложить ввести номер этажа и вывести номера квартир на этом этаже.
7) Программа предлагает ввести число k полных лет человека (от 1 до 120) и вывести фразу: «Вам k лет». Например, при k=3 – «Вам три года», k=18 – «Вам 18 лет», k=101 – «Вам 101 год».
8) Определить наиболее подходящий возраст партнера для вступления в брак. Программа должна запросить данные пользователя: возраст, признак пола (из выведенного на экран меню: 1 – юноша, 2 – девушка) и вывести подходящий возраст партнера, который вычисляется так: возраст девушки равен увеличенной на 7 половине возраста юноши, возраст юноши определяется как удвоенный возраст девушки минус 14.
9) Вывести в римской системе нумерации век, к которому относится заданный год (номер года вводится с клавиатуры).
10) Программа должна предложить выбрать способ вычисления площади круга (по заданному радиусу, или диаметру, или длине окружности), запросить требуемые данные, произвести вычисления и вывести результат на экран.
11) Программа должна предложить ввести текущее время и вывести период суток (день, ночь, утро, вечер, обед).
Алгоритмические структуры и графические построения