В жизни мы часто принимаем разные решения, беря во внимание некоторые факты и факторы.
Например, при покупке товара мы делаем примерно следующее:
Если товар дорогой — то не покупаем.
Если товар качественный — то покупаем.
Вспомним детскую сказку о богатыре, который приехал к камню с надписью: Налево пойдешь — коня потеряешь… и далее по тексту. Суть сводится к фразе
Если налево пойдешь, то коня потеряешь.
Как видим, в зависимости от истинности выражения в условии, мы выполняем некое действие.
Компьютер также умеет выполнять выбор вариантов действий в зависимости от истинности условия. В паскале (и не только) такая команда называется командой ветвления. Есть две формы команды ветвления: полная и сокращенная. В данном материале мы рассмотрим сокращенный вариант.
Итак приступим. Общий вид команды ветвления следующий:
ЕСЛИ условие выполняется ТО делаем действие;
другими словами:
ЕСЛИ условие истинно ТО делаем действие;
Переведем на английский
IF (условие истинно) THEN делаем действие;
Знаки отношений между переменными:
Математика
А больше В А меньше В А больше равно В А меньше равно В А не равно В
Паскаль
(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;