Вопрос: Как в программе выполнить выбор не из двух вариантов, а из трех и более?

Занятие № 6 «Вложенные ветвления. Составные условия и логические операции (and,or,not). Составной оператор»

Ключевые слова:  вложенные ветвления, составные условия, логические операции, составной оператор

Вопросы для повторения
Найдите ошибки в  программе var a,b:integer;         procedure summa(a,b:integer; sum:integer) begin readln(a,b); sum:=a+b; end;   begin summa(a,b,sum) writeln(sum); end.
Найдите ошибки в  программе var a,b,sum:integer; S: string;   procedure summa(a,b:integer; var sum:integer) begin readln(a,b); sum:=a+b; end;   begin summa(a,b,’сумма’) end.  

Давайте вспомним, что уже умеет делать наша программа? Она умеет здороваться по имени, вычислять возраст с учетом того, был день рождения или нет.

А что если собеседник на ваш вопрос «Был ли у Вас день рождения?» введет ни «Да» ни «Нет»? Что тогда? Как будет работать программа?  Как это предусмотреть?

Вопрос: Как в программе выполнить выбор не из двух вариантов, а из трех и более?

Нам бы хотелось, чтобы если день рождения был, программа вычисляла возраст по одной формуле; если дня рождения еще не было, возраст должен вычисляться по другой формуле, а во всех остальных случаях выводилось бы сообщение о том, что программа «не понимает» ответ. Обратите внимание, у нас тут будет два слова «если», значит, и ветвлений тоже два.

Цель:

· Научиться составлять алгоритмы, в которых проверяется несколько условий.

Давайте попробуем смоделировать ситуацию, предусматривающую все варианты ответа собеседника, с помощью условий.

 

 

 


if s=’Да’

then Age:=year-birth

else if s=’Нет’

     then Age:=year-birth-1

     else writeln (‘Не понимаю’);

 

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

 

Вложенные ветвления в общем виде:

     
 

 

 


При решении задач часто приходится рассматривать не два, а большее количество вариантов. Это можно реализовать, используя несколько условных операторов. В этом случае после служебных слов then и else записывается новый условный оператор.
    Итак, когда оператор if появляется внутри другого оператора if, они считаются вложенными. Такое вложение используется для уменьшения числа необходимых проверок. Этот метод часто обеспечивает большую эффективность, однако одновременно он уменьшает наглядность программы.

 

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

 Как проверить, что год введен корректно?

 

Надо наложить ограничения на вводимый год и в зависимости от этого выводить соответствующую фразу и вычислять возраст собеседника.

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

 

Сложное условие – это условие, состоящее из нескольких простых условий (отношений), связанных с помощью логических операций:

not – НЕ (отрицание, инверсия)

and – И (одновременное выполнение условий)

or – ИЛИ (выполнение хотя бы одного из условий)

Порядок выполнения (приоритет = старшинство)

1. выражения в скобках

2. not

3. and

4. or

5. <, <=, >, >=, =, <>

Особенность – каждое из простых условий обязательно заключать в скобки.

Примеры составных условий:

(a>5) and (b<8)

(x≥0) or (x<-3)

not(a=0) or (b=0)

 

Как проверить, что учащийся ввел правильно год своего рождения?

 

Подсказка. Год рождения должен быть больше одно числа и меньше другого числа, чтобы не был слишком большим или слишком маленьким.

Пример условия для корректного вычисления возраста:

if (birth>=2020) or (age<1870)

then s:=’возраст введен некорректно’;

 

Давайте попробуем написать программу c новыми условиями.

 

 

Для этого вспомним процедуру, которая вычисляет возраст человека по введенному году рождения и текущему году.

 

var year,age,birth:integer;

procedure age_calculation (s:string; year: integer; ss:string; var age:integer);
var answer:string;
begin
writeln(s);
readln(birth);
writeln('Был ли у Вас день Рождения?');
readln(answer);
if answer ='Да'
then age:=year-birth
else age:=year-birth-1;
writeln(ss,' ', age);
end;

begin
writeln('Здравствуйте! Введите текущий год');
readln(year);
age_calculation('В каком году ты родился?',year,'Твой возраст',age);
age_calculation('В каком году родился твой отец?',year, 'Возраст твоего отца',age);
age_calculation('В каком году родилась твоя мать?',year, 'Возраст твоей матери',age);
end.

 

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

В качестве результатов получаем, во-первых, строку с комментарием чей возраст вычисляется, во-вторых, число возраста, во-третьих, строку текстового комментария. Если данные некорректны, то число возраста сделать -1. А если данные корректны, то строка сообщения об ошибке пустая.

 

 

Давайте попробуем составить программу и исполнить ее с учетом новой информации.

 

procedure age_calculation (s:string; year: integer; ss:string; var age:integer; var s1:string);
var s1:string;
begin
writeln(s);
readln(birth);
writeln('Был ли у Вас день Рождения?');
readln(answer);
if answer='Да'
   then age:=year-birth; s1:=’’;

   else if answer =’Нет’; s1:=’’;

                then age:=year-birth-1;

                else age:=-1; s1:=’Вычислить возраст нельзя’;

writeln(ss,' ', age);
end;

 

 

Успешно исполнилась программа? Как устранить эту проблему?

 

В Паскале предусмотрен этот случай. Если в качестве оператора должна выполниться серия операторов, то они заключаются в операторные скобки begin-end. Конструкция Begin... End называется составным оператором.

Таким образом, после оператора then нужно вставить составной оператор begin-end.

if answer =’Да’

    then begin age:=year-birth; s1:=’’; end

   else if answer = ’Нет’;

                then begin age:=year-birth-1; s1:=’’; end

                else begin age:=-1; s1:=’Вычислить возраст нельзя’; end;

 

Добавим еще в программу проверку на корректность введенного возраста.

Подсказка, после readln(birth); добавить составное условие

if (birth>=2020) or (age<1870)

    

Ответы на вопросы
Найдите ошибки в  программе var a,b:integer;         procedure summa(a,b:integer; var sum:integer); begin readln(a,b); sum:=a+b; end;   begin summa(a,b,sum); writeln(sum); end.
Найдите ошибки в  программе var a,b,sum:integer; S: string;//переменная S нигде не используется   procedure summa(a,b:integer; var sum:integer); begin readln(a,b); sum:=a+b; end;   begin summa(a,b,’сумма’) //неправильное количество фактических параметров в процедуре end.  

 

 

Спасибо за внимание!
































Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: