Сокращенная команда ветвления

В жизни мы часто принимаем разные решения, беря во внимание некоторые факты и факторы.
Например, при покупке товара мы делаем примерно следующее:
Если товар дорогой — то не покупаем.
Если товар качественный — то покупаем.
Вспомним детскую сказку о богатыре, который приехал к камню с надписью: Налево пойдешь — коня потеряешь… и далее по тексту. Суть сводится к фразе
Если налево пойдешь, то коня потеряешь.
Как видим, в зависимости от истинности выражения в условии, мы выполняем некое действие.
Компьютер также умеет выполнять выбор вариантов действий в зависимости от истинности условия. В паскале (и не только) такая команда называется командой ветвления. Есть две формы команды ветвления: полная и сокращенная. В данном материале мы рассмотрим сокращенный вариант.
Итак приступим. Общий вид команды ветвления следующий:
ЕСЛИ условие выполняется ТО делаем действие;
другими словами:
ЕСЛИ условие истинно ТО делаем действие;
Переведем на английский

IF (условие истинно) THEN делаем действие; 

Знаки отношений между переменными:


  1. Математика

    А больше В
    А меньше В
    А больше равно В
    А меньше равно В
    А не равно В 
    
  2. Паскаль

     
    (A>B) 
    (A<B)
    (A>=B) 
    (A<=B) 
    (A<>B) 
    

Рассмотрим простой пример. Пусть дано 2 числа А и В, которые не равны между собой. Найти максимальное.
Обычно мы думаем так.
Если А>В ТО максимум А;
Если В>А ТО максимум В;
На паскале это будет выглядеть следующим образом (перевод на английский язык)
If (a>b) then max:=a;
If (b>a) then max:=b;
Обращаю внимание на то, что условие берётся в скобки.
Теперь полное решение задачи:

var a, b:real;
 max:real;
BEGIN
 write('Nomber A=');readln(a);
 write('Nomber B=');readln(b);
 If (a>b) then max:=a;
 If (b>a) then max:=b;
 Writeln('Max nomber is', max);
 write('Press Enter to Exit');
 readln;
END.

Расширим ситуацию покупки товара.
ЕСЛИ товар хороший ТО купить и упаковать. Фактически при выполнении одного условия нам необходимо выполнить несколько действий. В таком случае нам помогут так называемые командные скобки BEGIN END;
Задача примерно та же: дано 2 числа А, В неравных между собой. Найти разницу между большим и меньшим.

 

var a, b:real;
 resalt:real;
BEGIN
 write('Nomber A=');readln(a);
 write('Nomber B=');readln(b);
 If (a>b) then begin
 resalt:=a-b;
 writeln('Resalt=',resalt);
 end;
 If (b>a) then begin
 resalt:=b-a;
 writeln('Resalt=',resalt);
 end;;
 Write('Press Enter to Exit');
 readln;
END.

Задача: Дано 2 числа, найти частное от деления А на В.
Вспомним, как мы решили бы это задание, обладая багажом знаний с предыдущих тем:

 

var a, b:real;
 div_ab:real;
BEGIN
 write('Nomber A=');readln(a);
 write('Nomber B=');readln(b);
 div_ab:=a/b;
 Writeln('Resalt nomber is', div_ab:2:2);
 write('Press Enter to Exit');
 readln;
END.

Есть решение. Программа работает и выдает правильный результат. Возникает вопрос: во все ли случаях мы получим результат?
Для А=5, В=2 результат будет 2,50. А вот какой результат будет для А=5, В=0? Вот тут то результата не будет. Наша программа завершится аварийно. (Вопрос — почему?). Внесем изменения в программный код и предусмотрим данную ошибку. Сделаем красиво. Когда результат будет — пишем все зелеными буквами. Если результат аварийный — выводим сообщение красными буквами.

 

Uses Crt;
var a, b:real;
 div_ab:real;
BEGIN
 ClrScr;
 write('Nomber A=');readln(a);
 write('Nomber B=');readln(b);
 if (b<>0) then begin
 textcolor(green);
 div_ab:=a/b;
 Writeln('Resalt nomber is', div_ab:2:2);
 end; 
 if (b=0) then begin
 textcolor(red);
 Writeln('Error. Divizio by Zero');
 end;
 write('Press Enter to Exit');
 readln;
END.

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


var a:integer;
resalt:real;
BEGIN
ClrScr;
write('Nomber A=');readln(a);
if (a>=0) then begin
 textcolor(green);
 resalt:=sqrt(a);
 Writeln('Resalt is', resalt:2:2);
 end;
 
 if (a<0) then begin
 textcolor(red);
 Writeln('Error. Аргумент меньше нуля');
 end;
write('Press Enter to Exit');
readln;
END.

Наша программа будет работать в любом случае для всех числовых данных. Аварийное завершение мы предусмотрели.
Важно заметить, что подобные нюансы программист должен предусматривать самостоятельно. Бывают случаи, когда в программе не описаны аварийные варианты и она работает долго-долго. Но тут появится пользователь, который дает такие входящие данные, что ПК сразу попадает в аварийную ситуацию.

Дано квадратное уравнение Ax<sup>2</sup>+Bx+C.

В единственной строке вывести в случае отсутствия корней сообщение «No roots» (без кавычек), в случае, если решение содержит один корень вывести сначала сообщение «One root:» (без кавычек), а далее через пробел сам корень, в случае наличия двух корней вывести сначала сообщение «Two roots:» (без кавычек), а далее через пробел корни уравнения.


var
a,b,c,d:integer;
x1,x2:Real;
s1,s2,s3:string;
begin
s1:='No roots';
s2:='One root:';
s3:='Two roots:';
Write('A=');readln(A);
Write('B=');readln(B);
Write('C=');readln(C);
d:=b*b-4*a*c;
if (d>=0) then begin
 x1:=(-b-sqrt(d))/(2*a);
 x2:=(-b+sqrt(d))/(2*a);
 if (d=0) then Writeln(s2,' ',x1:2:2);
 if (d<>0) then Writeln(s3,' ',x1:2:2,' ',x2:2:2);
 end;
if (d=0) then Writeln(s1);
Writeln('Press Enter to Exit');
readln;
end.

Что нужно запомнить:
1. Общую структуру команды для 1 действия

If 'условие истинно' Then 'действие';

и для многих действий

If (условие истинно) then begin
 действие 1;
 ...;
 действие n;
 end;

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Подписаться
Уведомить о
guest
0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии