Программирование ветвлений

advertisement
Тема: Логические выражения и величины. Программирование ветвлений.
Лекция
Логические выражения представляют собой мощный математический аппарат,
позволяющий проверять несколько элементарных условий в одном операторе. В их
отсутствие для использования условного оператора пришлось бы осуществлять проверку
сложного условия, как проверку нескольких элементарных условий, для каждого из
которых потребовался бы собственный оператор условия. Приведем пример: If (y<7) and
(h>5) then h:=y;. Этот же оператор, без применения логических операций, можно записать
так: if (y<7) then if (h>5) then h:=y;. Видно, что вторая запись длиннее и более сложна.
Точно так же более просто организуются (с применением логических операций) и циклы
по условию.
Еще одна очень серьёзная выгода связана с наличием в языке Паскаль
специального типа данных (логического типа). Этот тип данных позволяет создавать и
вычислять логические выражения в операторе присваивания аналогично тому, как это
делается с арифметическими выражениями. Например, выражение if t=6 then y:=true else
y:=false; вполне можно заменить следующей более простой конструкцией: y:=t=6;.
Логические операции
Знак
Операция
AND
Логическое умножение (конъюнкция)
OR
Логическое сложение (дизъюнкция)
NOT
Логическое отрицание
XOR
Логическое деление
Определения логических операций:
1. Отрицание. Если логическое выражение С является отрицанием логического
выражения А, то С истинно, если А ложно, и ложно, если А истинно.
2. Логическое умножение. Это логическая операция, устанавливающая
соответствие между логическими выражениями А и В и логическим выражением С
следующим образом: Если А и В истинны, то С также истинно. Если же хотя бы одно из
них ложно, то С также ложно.
3. Логическое сложение. Это логическая операция, устанавливающая
соответствие между логическими выражениями А и В и логическим выражением С
следующим образом: Если А и В ложны, то С также ложно. Если же хотя бы одно из
логических выражений А и В истинно, то С также истинно.
4. Логическое деление. Иногда эту операцию еще называют исключающим или.
Это логическая операция, устанавливающая соответствие между логическими
выражениями А и В и логическим выражением С следующим образом: С ложно, если А и
В либо одновременно истинны, либо одновременно ложны.
Вышеупомянутые определения логических операций можно также описать в виде
таблиц истинности. Приведем сводную таблицу истинности для всех логических
операций:
А
В
Not A
A AND B
A OR B
A XOR B
True True
False
True
True
False
True False
False
False
True
True
False True
True
False
True
True
False False
True
False
False
False
Несколько примеров логических выражений:
1. (a and b)or(b and not c)
2. (a xor b) and (a or c) xor (nor h)
Логическое выражение это такое выражение, которое может принимать только два
значения: истина и ложь. В языке Паскаль логическими выражениями могут быть:
1. Специальные логические переменные (тип boolean).
2. Выражения, содержащие сравнения. Например, s<>h.
3. Сложные выражения, содержащие выражения двух описанных выше типов,
соединяемых знаками логических операций и скобками.
Вот еще несколько примеров сложных логических выражений:
1. (a<>b)and(f or (h<5))
2. f xor (5=6*i)
3. (s<>6) or (g>8)
Пример. Ввести множество чисел и определить, сколько среди них положительных.
Идея решения следующая: мы заведем переменную, которая будет играть роль
счетчика положительных чисел, и каждый раз, когда вводимое число окажется
положительным, мы будем значение этого счетчика увеличивать на единицу. А для того,
чтобы иметь возможность так делать, нам нужна конструкция, которая позволяла бы
выполнять определённую команду только в том случае, если некоторое условие окажется
истинным.
Наш алгоритм будет выглядеть следующим образом:
Введем N
s=0
Для всех i от 1 до N делать
Начало
Ввести Число
Если Число > 0 То s=s+1
Конец
Вывести s
При записи программы по данному алгоритму возникнет серьезная проблема. Нам
необходимо циклически выполнять две команды: ввод числа и проверка на
положительность. Но мы уже знаем, что после слова DO можно записывать только одну
команду. Выход заключается во введении сложного оператора.
Сложный оператор — это группа операторов, записанных между словами Begin и
End. Такой оператор воспринимается компьютером как один оператор, и его можно
ставить, например, в цикл. С учетом этого наша программа будет записана следующим
образом:
read(n);
s:=0;
for i:=1 to n do
begin
read(a);
if a>0 then s:=s+1;
end;
write(s);
Английское слово if переводится как «если», а оператор: if a>0 then s:=s+1;
называется условным оператором. Устройство этого нового оператора таково: после слова
if записывается условие, а после слова then записывается один оператор (можно
сложный), который исполняется, если условие оказывается истинным. Условный оператор
имеет ещё одну форму:
if условие then оператор else оператор;
В этой форме, если условие истинно, то исполняется оператор, записанный после
слова then, а если условие ложно, то выполняется оператор, записанный после слова else.
Примечание
Те, кто только начал практиковаться в программировании на Паскале, часто
допускают грубую ошибку в условном операторе. Рассмотрим пример: If t=5 then t:=6;
else t:=8;
В записанном операторе после t:=6 стоит точка с запятой. Ставят её из тех
соображений, что любой оператор в языке Паскаль завершается точкой с запятой. Но
завершается так не оператор, а логически законченная конструкция. Здесь на t:=6
конструкция условного оператора ещё не завершена, и точка с запятой здесь не к месту.
Ставить её нужно только после оператора, следующего за словом else. Следовательно,
правильная конструкция будет записываться следующим образом: If t=5 then t:=6 else
t:=8;
условие then оператор 1 else оператор 2;
условие 1 and условие 2 then оператор 1 else оператор 2;
условие 1 or условие 2 then оператор 1 else оператор 2;
условие then
begin
оператор 1;
оператор 2;
…
end
else
begin
оператор 1;
оператор 2;
…
end ;
5) Краткая форма записи условного оператора: if условие then оператор;
1)
2)
3)
4)
if
if
if
if
Программа, которая позволяет определить по номеру месяца время года.
Program seasons;
var a : Integer;
Begin
write('Введите номер месяца ');
readLn(a);
if (a > 2) and (a < 6) then write('весна');
if (a > 5) and (a < 9) then write('лето');
if (a > 8) and (a < 12) then write('осень');
if (a < 3) or (a = 12) then write('зима');
readln;
End.
Определение большего числа из двух не равных чисел введённых с клавиатуры.
Program Max;
Uses Crt;
var a, b: real;
Begin
Clrscr;
writeln(‘Введите первое число ’);
readln(а);
writeln(‘Введите второе число ’);
readln(b);
if a>b then writeln(‘число’, a, ‘ больше числа’, b)
else writeln(‘число ‘,b, ‘ больше числа’, a);
readln;
End.
Программа, определяющая наименьшее из двух любых чисел введённых с клавиатуры.
Program Min;
Uses Crt;
var a, b: real;
Begin
Clrscr;
writeln(‘Введите первое число ’);
readln(а);
writeln(‘Введите второе число ’);
readln(b);
if a < b then writeln('Наименьшим является первое число')
else
if a = b then writeln('Введенные значения равны')
else writeln('Наименьшим является второе число');
readln;
End.
Программа, определяющая наибольшее число из трёх введённых с клавиатуры чисел.
Program change;
Uses Crt;
var a, b, c: real;
Begin
Clrscr;
writeln(‘Введите первое число ’);
readln(а);
writeln(‘Введите второе число ’);
readln(b);
writeln(‘Введите третье число ’);
readln(с);
if a>b and a>c then writeln(‘число’, a, ‘ больше чисел’, b, ‘ и ’, c);
if b>a and b>c then writeln(‘число’, b, ‘ больше чисел’, a, ‘ и ’, c)
else writeln(‘число ‘, c, ‘ больше чисел’, a, ‘ и ’, b);
readln;
End.
Условие задачи: развивая предельно возможную скорость, жираф пробегает за t1с S1м
(например, за 23 с 335,8 м). Заяц пробегает за t2c S2м (например, за 55 с 918,5 м). Кто из
них достоин звания чемпиона?
Program champion;
Uses Crt;
var sl, s2, tl, t2, vl, v2: real;
Begin
Clrscr;
writeln ('Введите показатели жирафа ');
readln (sl, tl);
writeln ('Введите показатели зайца ');
readln (s2, t2);
vl:= sl/tl;
v2:= s2/t2;
if vl = v2.then
begin
textcolor (10) ;
writeln ('Победила дружба');
end
else if vl > v2 then
begin
textcolor (14);
writeln ('Жираф — чемпион');
end
else
begin
textcolor (9) ;
writeln ('Заяц — чемпион');
end;
readln;
End.
Требуется определить, является ли заданное трехзначное число палиндромом (палиндром
читается одинаково слева направо и справа налево, например, палиндромами являются
числа 121, 282, слова «шалаш», «наган»).
Program palindrom;
Uses Crt;
var х : Integer;
Begin
Clrscr;
write('Введите целое число: ');
readln(x);
If х mod 10 = х div 160 then Write('Введенное число является палиндромом')
else Write('Введенное число не является палиндромом');
readln;
End.
Решение квадратного уравнения ax2+bx+c=0
Program uravnenie;
Uses Crt;
var a, b, c, x1, x2, D: Integer;
Begin
CIrScr;
write( ' Введите коэффициенты а, b, с : ');
readln(a, b, с);
If (a=0) and (b=0) and (c=0) then
begin
write('Bce коэффициенты равны нулю.');
writeln('x — любое число ');
end
else
If (a=0) and (b<>0) then writeln(' Линeйнoe уравнение. Один корень: х =', (—с/
b):6:2)
else
If (a=0) and (b=0) and (c<>0) then writeln('Heпpaвильнoe уравнение.')
else
begin
D:= b*b - 4*a*c;
If D>0 then
begin
xl:=(-b + Sqrt(D)) / (2*a);
x2:=(-b - Sqrt(D)) / (2*a);
writeln('xl=' , xl:6:2 , '; x2=' , x2:6:2);
end
else
If D=0 then
begin
xl := -b/(2*a);
witeln(Корни равны: xl = ', xl:6:2, '; x2 = ', xl:6:2)
еnd
else writeln('Действительных корней нет.');
end;
readln;
End.
Программа нахождения координат точки пересечения двух заданных прямых
(ax1+bx1+c1=0, ax2+bx2+c2=0).
Program Intersection;
Uses Crt;
var а1, bl, с1,
a2, b2, с2,
x, y: real;
Begin
CIrScr;
write('Введите а1, b1, с1:’);
readln( а1, bl, с1);
write('Введите a2, b2, с2 : ')
'
readln( a2, b2, с2);
)
writeln; Write('0 т в е т : ');
;
If ((al=0) and (bl=0) ) or ( (a2=0) and
(b2=0) then writeln( 'это не прямая
(прямые).’)
else
if (al*b2=a2*bl) and (a 1*c2=a2*c1) then writeln( 'прямые совпадают.' )
else
if al*b2 = a2*bl then writeln('пpямыe параллельны.')
else
begin
x:=(cl*b2-c2*bl)/(bl*a2-b2*al);
y:=(c2*al-cl*a2)/(bl*a2-b2*al);
writeln(‘Координаты точки пересечения: х= ’,x:5:2, ‘, y= ‘, y:5:2);
end;
readln;
End.
Программа, определяющая какая точка (A или B) ближе к началу координат.
Program tochka;
Uses Crt;
var x1,y1,x2,y2,d1,d2:real;
Вegin
CIrScr;
writeln('введите A(X1,Y1) и B(X2,Y2)');
readln( x1,y1,x2,y2 );
d1:=sqrt(sqr(y1)+sqr(x1));
d2:=sqrt(sqr(y2)+sqr(x2));
if d1<d2 then writeln('Точка A ближе')
else if d1>d2 then writeln('Точка B ближе')
else writeln('Одинаково');
readln;
Еnd.
Определение попадания точки M(x,y) в круг с центром O (xc, yc) и радиусом R.
Program Inter;
Uses Crt;
var xc,yc,mx,my,d,r:real;
Вegin
CIrScr;
writeln('введите M(X,Y), O(Xc,Yc) и R');
readln( mx,my,xc,yc,r );
d:=sqrt(sqr(xc-mx)+sqr(yc-my));
if d<=r then writeln ('точка M лежит в круге')
else writeln ('точка M лежит вне круга');
readln;
Еnd.
Решение системы 2-х уравнений с двумя неизвестными
-----------------------------------------------------------------------Вид уравнения:
a1*x + b1*y = c1
a2*x + b2*y = c2
метод решения:
|c1 b1|
|a1 c1|
|c2 b2|
|a2 c2|
x=--------- y=--------|a1 b1|
|a1 b1|
|a2 b2|
|a2 b2|
выражаем определители второго порядка:
x = (c1*b2-c2*b1)/(a1*b2-a2*b1)
y = (a1*c2-a2*c1)/(a1*b2-a2*b1)
-----------------------------------------------------------------------Program sistema2;
Uses Crt;
var a1,a2,b1,b2,c1,c2,x,y,d,dx,dy:real;
Вegin
CIrScr;
writeln('введите коэффициенты уравнения: a1,b1,c1,a2,b2,c2');
readln(a1,b1,c1,a2,b2,c2);
d := (a1*b2-a2*b1);
dx := (c1*b2-c2*b1);
dy := (a1*c2-a2*c1);
if ( d=0 ) and ( (dx=0) or (dy=0) ) then
writeln('бесконечное множество решений')
else if ( d<>0 ) and ( (dx=0) or (dy=0) ) then
writeln('нет решений')
else begin
x:=dx/d; y:=dy/d;
writeln('x = ', x); writeln('y = ', y);
end;
readln;
Еnd.
Решение системы 3-х уравнений с тремя неизвестными
-----------------------------------------------------------------------решение уравнений вида:
|a1*x + b1*y + c1*z = d1|
|a2*x + b2*y + c2*z = d2|
|a3*x + b3*y + c3*z = d3|
метод решения:
|d1 b1 c1|
|a1 d1 c1|
|a1 b1 d1|
|d2 b2 c2|
|a2 d2 c2|
|a2 b2 d2|
|d3 b3 c3|
|a3 d3 c3|
|a3 b3 d3|
x = ---------- y = ---------- z = ---------|a1 b1 c1|
|a1 b1 c1|
|a1 b1 c1|
|a2 b2 c2|
|a2 b2 c2|
|a2 b2 c2|
|a3 b3 c3|
|a3 b3 c3|
|a3 b3 c3|
выражаем определители третьего порядка:
e := (a1*b2*c3+b1*c2*a3+c1*a2*b3-a3*b2*c1-b3*c2*a1-c3*a2*b1);
ex := (d1*b2*c3+b1*c2*d3+c1*d2*b3-d3*b2*c1-b3*c2*d1-c3*d2*b1);
ey := (a1*d2*c3+d1*c2*a3+c1*a2*d3-a3*d2*c1-d3*c2*a1-c3*a2*d1);
ez := (a1*b2*d3+b1*d2*a3+d1*a2*b3-a3*b2*d1-b3*d2*a1-d3*a2*b1);
x = ex/e
y = ey/e
z = ez/e
-----------------------------------------------------------------------Program sistema3;
Uses Crt;
var a1,a2,a3,b1,b2,b3,c1,c2,c3,d1,d2,d3,x,y,z,e,ex,ey,ez:real;
Вegin
CIrScr;
writeln('введите коэффициенты уравнения:a1,b1,c1,d1,a2,b2,c2,d2,a3,b3,c3,d3');
readln(a1,b1,c1,d1,a2,b2,c2,d2,a3,b3,c3,d3);
e := (a1*b2*c3+b1*c2*a3+c1*a2*b3-a3*b2*c1-b3*c2*a1-c3*a2*b1);
ex := (d1*b2*c3+b1*c2*d3+c1*d2*b3-d3*b2*c1-b3*c2*d1-c3*d2*b1);
ey := (a1*d2*c3+d1*c2*a3+c1*a2*d3-a3*d2*c1-d3*c2*a1-c3*a2*d1);
ez := (a1*b2*d3+b1*d2*a3+d1*a2*b3-a3*b2*d1-b3*d2*a1-d3*a2*b1);
if ( e=0 ) and ( (ex=0) or (ey=0) or (ez=0) ) then
writeln('бесконечное множество решений')
else if ( e<>0 ) and ( (ex=0) or (ey=0) or (ez=0) ) then
writeln('нет решений')
else begin
x:=ex/e; y:=ey/e; z:=ez/e;
writeln('x = ', x); writeln('y = ', y); writeln('z = ', z);
end;
readln;
Еnd.
Задания:
Для каждой задачи составить программу с ветвящейся структурой, используя условный
оператор IF.
1 уровень
1. Даны два угла треугольника (в градусах). Определить, существует ли такой
треугольник. Если да, то будет ли он прямоугольным.
2. На плоскости XOY задана своими координатами точка A. Указать, где она
расположена: на какой оси или в каком координатном угле.
3. Грузовой автомобиль выехал из одного города в другой со скоростью v1 км/ч.
Через t ч в этом же направлении выехал легковой автомобиль со скоростью v2 км/ч.
Составить программу, определяющую, догонит ли легковой автомобиль грузовой через t1
ч после своего выезда
4. Написать программу нахождения суммы большего и меньшего из 3 чисел.
5. Написать программу, распознающую по длинам сторон среди всех треугольников
прямоугольные. Если таковых нет, то вычислить величину угла C.
6. Найти max{min(a, b), min(c, d)}.
7. Составить программу, осуществляющую перевод величин из радианной меры в
градусную или наоборот. Программа должна запрашивать, какой перевод нужно
осуществить, и выполнять указанное действие.
2 уровень
8. Заданы размеры A, B прямоугольного отверстия и размеры x, y, z кирпича.
Определить, пройдет ли кирпич через отверстие.
9. Составить программу, осуществляющую перевод величин из радианной меры в
градусную или наоборот. Программа должна запрашивать, какой перевод нужно
осуществить, и выполнять указанное действие.
10. Два прямоугольника, расположенные в первом квадранте, со сторонами,
параллельными осям координат, заданы координатами своих левого верхнего и правого
нижнего углов. Для первого прямоугольника это точки (x1, y1) и (x2, 0), для второго —
(x3, y3), (x4, 0). Составить программу, определяющую, пересекаются ли данные
прямоугольники, и вычисляющую площадь общей части, если они пересекаются.
11. В небоскребе N этажей и всего один подъезд; на каждом этаже по 3 квартиры;
лифт может останавливаться только на нечетных этажах. Человек садится в лифт и
набирает номер нужной ему квартиры M. На какой этаж должен доставить лифт
пассажира?
12. Написать программу, которая по заданным трем числам определяет, является ли
сумма каких-либо двух из них положительной.
13. Известно, что из четырех чисел a1, a2, a3 и a4 одно отлично от трех других, равных
между собой; присвоить номер этого числа переменной n.
14. Составить программу, которая проверяла бы, не приводит ли суммирование двух
целых чисел A и B к переполнению (т.е. к результату большему, чем 32767). Если будет
переполнение, то сообщить об этом, иначе вывести сумму этих чисел.
3 уровень
15. Заданы координаты (на плоскости) вершин четырехугольника. Определить,
является ли он: а) ромбом; б) параллелограммом; в) прямоугольником; г) квадратом.
16. Для двух треугольных пирамид, заданных рёбрами, определить, площадь полной
поверхности которой из них больше и на сколько.
17. Дана точка A(x, y). Определить, принадлежит ли она треугольнику с вершинами в
точках (x1, y1), (x2, y2), (x3, y3).
18. Написать программу, определяющую, будут ли прямые A1x + B1y + C1 = 0 и
A2x + B2y + C2 = 0 перпендикулярны. Если нет, то найти угол между ними.
19. Заданы координаты вершин прямоугольника: (x1, y1), (x2, y2), (x3, y3), (x4, y4).
Определить площадь части прямоугольника, расположенной в I-й координатной четверти.
20. Найти координаты точек пересечения прямой y = kx + b и окружности радиуса R с
центром в начале координат. В каких координатных четвертях находятся точки
пересечения? Если точек пересечения нет, или прямая касается окружности, выдать
соответствующее сообщение.
21. Дана точка A(x, y). Определить, принадлежит ли она прямоугольнику с
вершинами в точках (x1, y1), (x2, y2), (x3, y3) , (x4, y4).
Задачи на определение принадлежности точки области
Составить программу, определяющую для точки с координатами (X,Y),
принадлежит ли она заштрихованной области.
Download