Сегодняшний урок мы начнем с разбора 6-го задания
предыдущего урока, так как её решение содержит
некоторые подводные камни, на которые, как
правило, натыкаются начинающие программисты.
Урок 8
6.*Даны
два числа. Меньшее из них замените полусуммой
этих чисел, а большее - их произведением.
На первый взгляд задача решается просто:
If a>b then begin
b:=(a+b)/2; a:=a*b end
else begin a:=(a+b)/2; b:=a*b end;
но если выполнить эту команду, то ответ
получится неверным, почему?
Предположим a=10, B=20. Что же получится в
результате выполнения оператора. Так как /a<b,
то условие, указанное в операторе не выполнено,
следовательно, выполнится
else begin a:=(a+b)/2;
b:=a*b end;
подставим значения и получим:
a:=(a+b)/2=(10+20)/2=15
b:=a*b =15*20=300 вместо 10*20=200 потому, что к этому моменту
первоначальное значение а=10
изменилось и стало равно 15.
Следовательно надо как то сохранить
первоначальные значения. Можно запомнить их в
дополнительных переменных:
х:=а;
у:=b;
If a>b then begin b:=(x+y)/2; a:=x*y end
else begin a:=(x+y)/2; b:=x*y end;
а можно запомнить в дополнительных
переменных полусумму и произведение:
Program prim_6;
Var a,b,x,y:real;
Begin
Write('введите два числа');
Readln(a,b);
X:=a*b; {запомним
значение произведения}
Y:=(x+y)/2; {запомним значение
полусуммы}
If a>b then begin b:=y; a:=x end
else begin a:=y; b:=x end;
Writeln (' a= ',a:0:2,' b=',b:0:2);
Readln
End
Логические
операции и выражения.
Если условие выполняется, то говорят, что
соответствующее выражение истинно, если не
выполняется - выражение ложно. Для построения
сложных условий в Паскале имеются четыре
логических операции:
NOT - отрицание (НЕТ),
AND - логическое умножение (И),
OR - логическое сложение (ИЛИ),
XOR - исключающее "или".
Результаты логических операций для
различных значений операндов приведены в
таблице, где использованы обозначения: Т- true
(истина), F - false (ложь).
Примеры логических выражений:
a) (0<x) AND (x<=1)
b) (a=0) OR (abs(x)<5)
c) NOT (x=y)
Операции отношений имеют более низкий
приоритет, чем логические операции, поэтому их
следует заключать в скобки при использовании с
логическими операциями.
Из переменных, констант, сравнений,
логических операций и скобок можно строить
логические выражения.
Рассмотрим следующую задачу:
Имеется прямоугольное отверстие со
сторонами а и b и кирпич с ребрами х, у, z. Требуется
определить пройдет ли кирпич в отверстие.
Решение.
Кирпич имеет три грани, каждую из которых мы
можем повернуть на 90 градусов, т.е. для каждой
грани надо проверит два случая. Итого шесть.
Получаем условие:
(a>x)and(b>y) or (b>x) and
(a>y) or
(a>x) and(z>y) or (z>x) and(a>y) or
(b>x) and(z>y) or (z>x) and(b>y)
Код программы:
Program prim_8;
Var a,b,x,y,z:integer;
F:boolean;
Begin
Write('введите размеры отверстия');
Readln(a,b);
Write('введите размеры кирпича');
Readln(x,y,z);
If (a>x)and(b>y) or (b>x)and(a>y) or (a>x)and(z>y) or
(z>x)and(a>y) or (b>x)and(z>y) or
(z>x)and(b>y)
then Writeln ('Кирпич пролезет в отверстие')
Else Writeln ('Кирпич не пролезет в
отверстие');
Readln
End
Тренировочные
задания к 8 уроку.
1. Установить, истинны или ложны следующие
условия:
(A=0) and not (B=0) or not (a=0) and (B=0) при
a) А=0, В=0
b) А=0, В=1
2. Ввести три числа. Выбрать и напечатать
наибольшее из них.
3. Написать программу, которая требует ввода
времени дня и, в зависимости от введенного
значения, желает доброго утра, доброго дня,
доброго вечера или спокойной ночи.
4. Даны три числа. Найдите наибольшее значение
их суммы и произведения.
5. Даны три числа а, b, с. удвойте эти числа, если
они являются упорядоченными по возрастанию.
6. Проверьте, есть ли среди трех заданных
чисел равные.
7. Дано двузначное число. Определить:
a) какая из его цифр больше, первая или
вторая;
b) одинаковы ли его цифры.
8. Известны площади круга и квадрата.
Определить:
a) Уместится ли круг в квадрате;
b) Уместится ли квадрат в круге.
9. Дано трехзначное число. Выяснить, является
ли оно палиндромом ("перевертышем"), т.е.
таким числом, десятичная запись которого
читается одинаково слева направо и справа
налево.
Разбор
тренировочного задания урока 7.
8. *Дано целое число. Определить:
a) Является ли оно четным;
b) Оканчивается ли оно цифрой 7;
c) Делится ли оно на 13.
Program prim_6;
Var a:integer;
Begin
Write('введите целое число');
Readln(a);
If a mod 2 = 0 then Writeln (а,' - четное ')
Else Writeln (а,' -нечетное ');
If а mod 10 = 7 then Writeln (а,'- оканчивается на 7 ')
Else Writeln (а,' -не оканчивается на 7 ');
If а mod 13 = 0 then Writeln (а,'- делится на 13 ')
Else Writeln (а,' -не делится на 13');
Readln
End
Желаю успехов!
Ганилова Татьяна Евгеньевна school6@rikt.ru.