Условный оператор if ... then ... else

Цель: дать понятие об условном операторе, блок-схемах, изображающих такие операторы; ввести понятие и формах записи вещественного типа real. Учить на частных примерах составлять блок-схемы и программы; вводить и выполнять программы, используя компиляторы BPW или Turbo Pascal.

Использовать программы: Barland Pascal for Windows (BPW) или Barland Pascal, или Turbo Pascal

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

 

Многие представляют ЭВМ как чисто вычислительную машину, что является заблуждением. ЭВМ способна, подобно человеку, принимать решения.
Вот некоторые простые решения, которые принимает человек в зависимости от условия.

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

Человек, принимая какое-то решение, может сомневаться, взвешивать, прикидывать, машина принимает решения категорически: либо - да, либо - нет и никаких сомнений.
Для реализации принимаемых решений на языке Паскаль могут быть использованы операторы if (если), then (тогда) и else (иначе).
После оператора if записывается условие, а после операторов then и else - команды, которые необходимо выполнить.

2. Блок-схемы, изображающие условные операторы

 

Вы уже знаете, что составление программы можно изображать геометрическими фигурами - блоками, в результате чего образуется схема программы. Такая конструкция называется блок-схемой.
Какой геометрической фигурой принято обозначать условие? Посмотрите на ниже приведенную конструкцию и вы увидите, что условие изображается ромбом (см. рис. 1).

Рис. 5


Для более ясного понимания использования этих операторов, рассмотрим следующий пример.
Пример 1. Составить программу, после выполнения которой меньшее из двух неравных чисел будет увеличено вдвое, а большее оставлено без изменения.

Блок-схема

Рис. 6
Программа

Program Problem2; { Увеличения меньшего из двух целых чисел вдвое }
uses WinCrt;
var
a, b, c : integer;
begin
write("Введите первое целое число "); readln(a);
write("Введите второе целое число "); readln(b);
if a < b then c := 2*a
else c := 2*b;
writeln("Меньшее число ", c div 2);
writeln("Оно же увеличенное вдвое ", c)
end.

После пуска программы вводятся два целых числа и их значения присваиваются переменным a и b. Далее, в операторе if проверяется условие (a<b), если оно выполняется, т.е. a меньше b, тогда выполняются команды в операторе then, переменной c присваивается значение удвоенного числа a, иначе выполняются команды в операторе else, переменной c присваивается значение удвоенного меньшего числа - b.
После этого выводится на экран меньшее число и это же число, но увеличенное вдвое.

Заметьте, в процедуре writeln, кроме вывода информации, выполняется еще и деление переменной c на 2.


В процедуре write (writeln) можно записывать выполнение арифметических операций.

Ещё одно существенное замечание. Вы уже заметили, что перед оператором else точка с запятой не ставится.
Программа имеет один недостаток. В ней не учитывается то, когда введенные числа будут равны. В этом случае на экран надо выдать сообщение: "Числа равны".


Блок-схема


Рис. 7

Программа

Program Problem2a; {Программа удвоения меньшего из двух чисел}
uses WinCrt;
var
a, b, c : integer;
begin
write("Введите первое число "); readln(a);
write("Введите второе число "); readln(b);
if a = b then writeln("Числа равны")
else
begin
if a < b then c := 2*a
                     else c := 2*b;
writeln("Меньшее число ", c div 2);
writeln("Удвоенное меньшее число ", c)
end
end.
В этой программе два условных оператора, первым проверяется условие равенства чисел и, в случае его выполнения, будет выдано сообщение о равенстве чисел, которое находится в операторе then.
В операторе else записано несколько команд, поэтому в нём установлены операторные скобки:
begin
........
end;

Такие же операторные скобки в необходимых случаях могут быть использованы и в операторе then.
ВЫВОДЫ


В операторах then и else могут быть использованы операторные скобки:
begin ... end;,
где записывается еще одна группа операторов.
Перед оператором else точка с запятой не ставится.

Задание 1

1. Введите первую программу примера 2 и выполните ее. Измените программу так, как это было сделано во втором случае, т. е. с учетом равенства вводимых чисел.
2. Составьте программу определения большего из двух чисел.


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

3. Вещественный тип real в операторах if ... then ... else ... .

 

Для дальнейшего составления программ на Паскале нам недостаточно целых чисел. Например, мы хотим составить программу решения квадратного уравнения вида:
ax2 + bx + c = 0.
Коэффициенты этого уравнения могут принимать не только целые значения, но любые действительные (a не равно нулю), также значения корней этого уравнения принимают значения из множества действительных чисел.
Действительные или вещественные числа объединяют в себе целые числа и дробные числа (рациональные и иррациональные).
Переменные, принимающие вещественные значения, имеют тип, который на языке Паскаль обозначается: real.
Например: var a, b, c : real;
Это означает, что переменные a, b и c принимают вещественные значения.

4. Формы записи вещественных чисел

В математике                                                                 На Паскале

1. Естественная форма записи

135; 89245; -2,356; 0,28;                                          135; 89245; -2.356; 0.28
Как видите, отличие заключается в том, что вместо запятой используется точка.
2. Экспоненциальная форма записи или форма записи с плавающей запятой
3,7 105; 1,67 10-12                                              3.7E05; 1.67E-12.
При такой записи, множитель, стоящий перед степенью с основанием 10 называется мантиссой, а показатель степени десятки - порядком числа.
В наших примерах: 3.7 и 1.67 - мантиссы, а 5 и -12 - порядки чисел.
Мантисса может иметь 11...12 значащих цифр, а порядок от -39 до 38. (Это в Турбо Паскале версии 7.0 и Barland Pascal.)

5. Арифметические операции с вещественными переменными

 

Операция

Запись на Паскале

Сложение

a + b

Вычитание

a - b

Умножение

a*b

Деление

a/b

Как видите, единственным отличием от операций с целыми числами - это операция деления, которая обозначается наклонной чертой.
Кроме арифметических операций, в Паскале существуют так называемые стандартные или встроенные функции, которые выполняются сразу после указания их имени, заведомо объявленных в Паскале, после которого в скобках записывается аргумент функции.

Функция

Математическое
обозначение

Ее объявление на Паскале

Квадратичная

sqr(x)

Абсолютная величина

|x|

abs(x)

Квадратный корень

sqrt(x)

Синус

sinx

sin(x)

Косинус

cosx

cos(x)

Арктангенс

arctgx

arctan(x)

Натуральный логарифм

lnx

ln(x)

Показательная функция (экспонента)

exp(x)

Некоторые из перечисленных встроенных функций могут быть использованы с целыми числами или переменными целого типа (аргумент имеет тип integer).
К таким функциям относятся:
Квадратичная: x2 - sqr(x). Абсолютная величина: |x| - abs(x).
На Паскале нет функций вычисления arcsinx, arccosx, arcctgx. Как с помощью уже известных встроенных функций вычислить значения функций arcsinx, arccosx, arcctgx?
Для этого надо совершить небольшую экскурсию в математику и выразить значение функций arcsinx, arccosx, arcctgx через функцию arctgx.

Arcsinx

Пусть  где |x| , тогда  отсюда  получаем,
окончательно имеем:


Функция

Математическая обозначение

Ее объявление на Паскале

 

Арксинус

 

arcsinx

Аналогичными рассуждениями можно получить выражения для arccosx и arcctgx.

Функция

Математическое обозначение

Ее объявление на Паскале

 

Арккосинус

 

arccosx

Арккотангенс

arcctgx

Пример 2. Составить программу решения квадратного уравнения
ax2 + bx + c = 0.
Наметим план составления программы или, иначе говоря, алгоритм.

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

Алгоритм
1. Начало.
Описание переменных и их типов.
2. Ввод значений коэффициентов.
3. Вычисление значения дискриминанта (d).
Если d < 0, тогда уравнение не имеет корней,
иначе,
если d = 0,
тогда уравнение имеет один корень,
вычислить значение этого корня и выдать его на экран,
иначе, уравнение имеет два корня,
вычислить их и выдать на экран.
4. Конец.

Составим программу, пользуясь алгоритмом.

Program Problem3; { Программа решения квадратного уравнения }
uses WinCrt;
var
a, b, c, d, x1, x2 : real;
begin
write("Введите коэффициенты уравнения "); readln(a, b, c);
d := b*b - 4*a*c;
if d < 0 then writeln("Уравнение не имеет корней")
else
if d=0
then writeln("Уравнение имеет один корень ",-b/(2*a))
else
begin
x1 := (-b - sqrt(d))/(2*a);
x2 := (-b + sqrt(d))/(2*a);
write("Уравнение имеет два различных корня ");
writeln("x1 = ", x1, " x2 = ", x2)
end
     end.

Разберем структуру программы и посмотрим как она будет работать.

ИМЯ ПРОГРАММЫ И КОММЕНТАРИЙ

Имя программы "Problem3;", после этого в комментарии записано содержание программы: "{Программа решения квадратного уравнения};".

РАЗДЕЛ ОПИСАНИЙ

В разделе описаний указаны имена переменных и их типы. Понятно, что переменные a, b, c нужны для значений коэффициентов уравнения, переменная d для значений дискриминанта, а x1 и x2 для корней уравнения. Понятно, что все они принимают вещественные значения, ограничиться целыми невозможно, и имеют тип: real.

РАЗДЕЛ ОПЕРАТОРОВ

Раздел операторов начинается вводом информации. С помощью оператора:
write("Введите коэффициенты уравнения "); readln(a, b, c);
на экран выводится информация, записанная в этом операторе write:
Введите коэффициенты уравнения
В ответ на этот запрос, пользователю надо ввести коэффициенты уравнения, разделяя их пробелами (проще говоря, ввести через пробелы).
Обратите внимание на такую мелочь, в операторе writeln, перед вторым, "заканчивающим" запись апострофом, оставлен пробел. Для чего? Только из эстетических соображений. Следующий оператор readln(a, b, c); будет вводить информацию, которую вы наберете с клавиатуры. Если этого пробела не будет, то вводимое число будет писаться вплотную к слову "уравнения", что, конечно, некрасиво.
Далее вычисляется значение дискриминанта и присваивается переменной d.
Первым условным оператором if проверяется условие d < 0, если оно выполняется, тогда на экран выдается сообщение, записанное после then в операторе writeln: "Уравнение не имеет корней", иначе после else, новое условие if d = 0, тогда выполняются операторы после then, т.е. выдается сообщение, что уравнение имеет один корень, вычисляется его значение и выдается на экран, так как всё это записано в скобках оператора writeln, иначе, остается одно, - когда дискриминант больше нуля, тогда надо выполнить несколько операторов, которые записаны после else. Но поскольку их несколько, то необходимо открыть операторные скобки begin, в которых и записать вычисление значений корней и вывод их на экран. После чего необходимо закрыть операторные скобки служебным словом end.
После этого программа заканчивается служебным словом end с обязательной точкой в конце.
Каждая операторная скобка, начинаемая словом begin должна обязательно "закрываться" словом end. Если это слово оказывается перед оператором else или является предпоследним, то точка с запятой после end не ставится. Во всех других случаях end заканчивается точкой с запятой, а заканчивающий программу - точкой.

6. Форматированный вывод информации

 

Если вы выполните программу, то столкнетесь с неприятным явлением - результат, т.е. числовые значения корней, будут выдаваться на экран в экспоненциальной форме.
Так, после ввода значений коэффициентов: 2 3 -10, на экран будет выдан результат:
Уравнение имеет два различных корня

x1 = -3.1084952830E+00  x2 = 1.6084952830E+00

Во-первых, такой результат неудобно читать и запоминать, во-вторых, нам не всегда нужна высокая точность вычисления и, в-третьих, даже целые значения корней будут выдаваться тоже в экспоненциальной форме, что уже совсем неудобно.
Чтобы избежать всех этих неприятностей, можно использовать форматированный вывод информации.
В Турбо-Паскале предусмотрен вывод данных с форматами. В общем случае формат имеет следующий вид:
r:f1:f2

Здесь r - имя переменной, значение которой выводится (в данном случае - x1 или x2), формат f1 указывает, сколько позиций нужно для всего числа, включая знак числа, целую часть, точку и дробную часть числа; f2 - число позиций дробной части числа (после точки).
Если формат указан, то значение переменной r выводится в виде константы с фиксированной запятой, например: 12.35, .123. Если параметры f1 и f2 опущены, то вещественная переменная выводится в виде константы с плавающей запятой, например: 2.534E03, 5.67E-12 и т.п. В этом случае значения f1 и f2 устанавливается по умолчанию.
Надо вообще заметить, что вещественное число в формате с фиксированной точкой печатается так:
несколько пробелов; знак минус (-) или пробел; последовательность цифр (целая часть); точка; последовательность цифр (дробная часть).

Рассмотрим несколько примеров форматированного вывода результатов для вещественных переменных.

Пример 3. Пусть переменная r получает значение частного от деления вещественных переменных a на b.

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

Program Problem;
uses WinCrt;
var
a, b, r : real;
begin
write("Введите значение переменной a "); readln(a);
write("Введите значение переменной b "); readln(b);
r := a/b;
writeln("Результат равен ", r)
end.

При первом выполнении программы не устанавливайте параметров для форматированного вывода. Вы получите результат в форме с плавающей запятой. При следующем выполнении для a введите значение 1, для b 3, а для вывода результата установите следующий формат: r:6:2; затем, r:1:5; r:0:4 и т.п.

Форматированный вывод возможен и для переменных целого типа, но в этом случае нужен только один параметр:  

r:f1

Если значение формата f1 больше, чем необходимое число позиций для записи числа, то перед числом добавляется соответствующее число пробелов. Если значение f1 меньше, оно автоматически увеличивается до числа позиций, необходимого для вывода числа.

Изменим в программе две строки вывода информации:
writeln("Уравнение имеет один корень ", -b/(2*a):6:3) и
writeln("x1 = ", x1:6:3, " x2 = ", x2:6:3)
Теперь понятно, что для выводимых результатов отведено 6 позиций, а для дробной части - 3 позиции, т.е. до тысячных долей (думается этого достаточно для школьных задач).

Задание 2

1. Наберите программу в первоначальном ее варианте и выполните, а затем измените ее, применив форматированный вывод результата, и выполните еще раз. Сравните результаты.


2. Составьте программу решения линейного уравнения ax = b и выполните ее.

Пример 4. Два прямоугольника заданы длинами сторон. Написать программу, после выполнения которой выясняется, можно ли первый прямоугольник целиком разместить во втором. (Рассмотреть только случай, когда соответствующие стороны прямоугольников параллельны.)

 

Составим программу

Program Problem4;
uses WinCrt;
var
a1, b1, a2, b2 : real;
begin
write("Введите длину и ширину первого прямоугольника "); readln(a1, b1);
write("Введите длину и ширину второго прямоугольника "); readln(a2, b2);
if ((a1 < a2) and (b1 < b2)) or ((b1 < a2) and (a1 < b2))
then writeln("Первый прямоугольник размещается во втором")
else  writeln("Первый прямоугольник не размещается во втором")
end.


Задание 3

1. Введите эту программу и выполните.


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

 

7. Некоторые встроенные функции и процедуры, применимые к целым типам. Логический тип boolen

Наименование Тип результата Действие
abs(x) Целый Возвращает модуль числа x
dec(x [, i]) Процедура Уменьшает значение x на i, при отсутствии i - на 1
inc(x [, i]) Процедура Увеличивает значение x на i, при отсутствии i - на 1
odd(x) Логический
(Boolean) Возвращает true, если аргумент - нечетное число, false - если четное
random(x) Как у параметра x Возвращает псевдослучайное число, равномерно распределенное на интервале 0<= t < x
sqr(x) Целый Выдает квадрат аргумента x

Логический тип (boolean). Значение логического типа может быть одна из предварительно объявленных констант false (ложь) или true (истина)

К целому и логическому типам применимы следующие функции.
Функция ord(x) выдает порядковый номер значения выражения x, т. е. ord(x)=x для x, принадлежащих любому целому типу.

Применение это функции к логическому типу дает следующие результаты:
ord(false) = 0;
ord(true) = 1;
false < true
К целому и логическому типам можно применять функции:
pred(x) - выдает предыдущее значение порядкового типа (в т. ч. целого или логического типов, pred(x) = ord(x) - 1, ord(pred(x)) = ord(x) - 1 для целого типа x, pred(true)=false - для логического типа);
succ(x) - выдает следующее значение порядкового типа, которое соответствует порядковому номеру ord(x) + 1, т. е. ord(succ(x)) = ord(x) + 1 - для целого типа и succ(false) = =true - для логического типа.

Чтобы четко понимать действие этих функций, рассмотрим их работу на примерах.

Пример 5. Использование логического типа. Составить программу, которая подтверждает правильность ввода чисел, если первое число меньше - истина, наоборот - ложь.

Program Problem5;
uses WinCrt;
var
a : boolean;
b, c : integer;
begin
writeln("b < c");
write("Введите b = "); readln(b);
write("Введите c = "); readln(c);
a := b < c;
write(b, " < ", c, " "); writeln(a)
end.

Пример 6. Использование функции определения четности. Программа должна определять четность и нечетность чисел. Если число четное - выдается на экран "четное", в случае нечетного числа - выдается "нечетное".

Блок-схема


Рис. 10


Программа

Program Func_odd;
uses WinCrt;
var
i : integer;
l : boolean;
begin
write("Введите целое число "); readln(i);
l := odd(i);
if l then writeln(i, " - число нечетное")
else writeln(i, " - число четное")
end.

Пример 7. Составить программу, выводящую на экран слово "Да", если точка с координатами (x, y) принадлежит заштрихованной области, и "Нет" - в противном случае.



Рис. 11. Заданная область

Решение

Заштрихованная область представляет собой часть круга радиуса R, расположенной в первой четверти. Точки (x, y), лежащие внутри круга с центром в начале координат и радиусом R, удовлетворяют неравенству . Кроме того, точки, лежащие в первой четверти координатной плоскости, должны удовлетворять условиям: . Учитывая то, что точки, лежащие внутри заштрихованной области, должны одновременно удовлетворять всем трем условиям, соответствующее логическое выражение может быть записано так: (x*x + y*y <= R*R) and (x >= 0) and (y >= 0).


Блок-схема

Рис. 12

Программа

Program Problem7;
uses WinCrt;
var
x, y, R : real;
begin
write("Введите координаты точки "); readln(x, y);
write("Введите радиус окружности "); readln(R);
if (x*x + y*y <= R*R) and (x >= 0) and (y >= 0)
then writeln("Да")
else writeln("Нет")
end.

Пример 8. Составьте программы определения большего из трех действительных чисел a, b и c.

Блок-схема


Рис. 13
Задание 4

1. Используя блок-схему составить и выполнить программу. Изменить программу так, чтобы в случае равных чисел, она выдавала "Числа равны".
2. Даны три числа a, b, c. Написать программу, в результате которой числа удвоятся, если и числа будут заменены на их абсолютные величины в прочих случаях.

8. Вычисление значений функции

Пример 9. Вычислить значение функции по формуле: .

Программа

Program Problem9;
uses WinCrt;
var
a, b, c, y : real;
begin
write("Введите значения a, b, c "); readln(a, b, c);
y := a*b + c*sin(a*b);
writeln("Значение функции равно y = ", y:6:6)
end.

Пример 10. Составить программу вычисления значения функции:

Замечание. Надо вспомнить из математики, что если обозначить , тогда логарифмируя по основанию e обе части равенства, получим: , , т. е.

Программа

Program Problem10;
uses WinCrt;
var
x, y : real;
begin
write("Введите значение аргумента x = "); readln(x);
if x < -1 then y := exp(x*ln(0.5))+3
else
if x < 0 then y := sin(x - 3)
else y := 3*x - 3;
writeln("Значение функции равно y = ", y:6:6)
end.

Пример 11. Составить программу вычисления функции:

Изменим запись функции:

Замечание. , т. е. .

Программа

Program Problem11;
uses WinCrt;
var
x, y : real;
begin
write("Введите значение аргумента x = "); readln(x);
if (x > 0) and (x < 1)
then y := 1/(3*exp(ln(x)/3))
else if x >= 1 then y := 1/(2*sqrt(x))
else y := 1/(4*exp(ln(abs(x))/4));
writeln("Значение функции равно y = ", y:6:6)
end.

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

Программа

Program Problem12;
uses WinCrt;
var
x, y : real;
begin
write("Введите значение аргумента x = "); readln(x);
if abs(x)>= 3 then y := 3
else y := abs(x);
writeln("Значение функции равно y = ", y:6:6)
end.

Задание 5

1. Вычислить значение функции по формуле:
2. Точка плоскости задана своими координатами x, y. Написать программу, при выполнении которой определяется, принадлежит ли данная точка плоской фигуре, являющейся кольцом с центром в точке (0, 0), с внутренним радиусом 3 и с наружным радиусом 4.

Упражнения

3. Написать программу, при выполнении которой выводится 1, если данное число x принадлежит отрезку [a, b], где a и b заданные числа, и выводится 0 в противоположной ситуации.
4. Даны положительные числа x, y, z. Выяснить, существует ли треугольник с длинами сторон x, y, z?
5. Определить, верно ли, что при делении целого неотрицательного числа a на целое положительное число b получается заданный остаток r или s.
6. Составить программу решения биквадратного уравнения

Автор: Тишин Владимир Иванович

Зощенко М. М

Родился в семье художника в Петербурге (по другим сведениям, в Полтаве). В 1913 г. после окончания гимназии поступил в Петербургский университет на юридический факультет. Не закончив курса, он отправился на фронт начавшейся первой мировой войны добровольцем; участвовал в боях, отличаясь храбростью и отвагой, за что удостоен пяти орденов; командовал батальоном; был трижды ранен, отравлен ...

Тип Кишечнополостные

Кишечнополостных насчитывается свыше 9 тыс. видов. Это низшие, преимущественно морские, многоклеточные животные, прикрепленные к субстрату либо плавающие в толще воды. Несмотря на большое различие во внешнем строении и размерах тела кишечнополостные имеют общие черты организации, главнейшие из которых следующие: Тело мешковидное, образованное двумя слоями ...

Единицы измерения времени

Единицы измерения времени Современные единицы измерения времени основаны на периодах обращения Земли вокруг своей оси и вокруг Солнца, а также обращения Луны вокруг Земли. Такой выбор единиц обусловлен как историческими, так и практическими соображениями: необходимостью согласовывать деятельность людей со сменой дня и ночи или сезонов; смена фаз Луны влияет на высоту ...

Формирование скоплений галактик

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