If12. Даны три числа. Найти наименьшее из них.
var
a, b, c, min3: real;
begin
writeln('Введите три числа:');
readln(a, b, c); { <-- Вводим три числа }
if a < b then
if b < c then min3 := a { a<b<c }
else
if a < c then min3 := a {a<b a<c}
else min3 := c { c≤a<b }
else
if b > c then min3 := c { c<b≤a }
else min3 := b; { b≤a b≤c }
writeln('Наименьшее число: ', min3);
readln
end.
**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 * * *
Второе решение задачи if12. Вышеприведенное решение задачи нахождения минимального из трех чисел − яркий пример того, как делать НЕЛЬЗЯ. Писать программу таким образом, конечно, можно, но тогда получаются лишние шаги. Сначала приведем пример ПРАВИЛЬНОГО кода (для этого способа решения):
var
a, b, c, min3: real;
begin
writeln('Введите три числа:');
readln(a, b, c); { <-- Вводим три числа }
if a < b then
if a < c then min3 := a { a<b a<c }
else min3 := c { c≤a<b }
else
if b < c then min3 := b { b≤a b<c }
else min3 := c; { c≤b≤a }
writeln('Наименьшее из чисел: ', min3);
readln
end.
**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 А теперь подсчитаем, сколько раз мы использовали здесь разветвление: 3 раза if и 3 раза else, в то время как в первом решении по 4 раза для каждой ветки (if и else). В чем здесь причина? А секрет в том, что во втором варианте после первого else имеем сразу результат: min3 := c, в то время как в первом решении в том же месте (после первого else) идет ещё одно разветвление. Таким образом, надо так организовывать сравнения, чтобы веток было наименьше.
* * *
Третье решение задачи if12 осуществляется с помощью вспомогательной переменной min3, которой сразу присваиваем первое число. Потом мы его сравниваем со вторым и третьим числом, и если min3 оказывается больше, присваиваем ему новое меньшее значение:
var
a, b, c, min3: real;
begin
writeln('Введите три числа:');
readln(a, b, c); { <-- Вводим три числа }
min3 := a; { <== Начальное значение минимального числа }
if b < min3 then min3 := b; { <== Находим минимум среди b и min3 }
if c < min3 then min3 := c; { <== Находим минимум среди c и min3 }
writeln('Наименьшее число: ', min3);
readln
end.
**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 * * *
Четвертое решение задачи if12 основано на использовании встроенной в PascalABC.Net функции min(a, b), возвращающей минимальное из чисел a и b. Сначала мы находим минимум первых двух чисел, а потом минимум предыдущего, возвращенного функцией, и третьего числа c.
var
a, b, c: real;
begin
writeln('Введите три числа: ');
readln(a, b, c);
writeln;
writeln('Наименьшее число: ', min(min(a, b), c));
readln
end.
**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308**function** Min(a,b: integer): integer;
: Возвращает минимальное из чисел a, b.**function** Min(a,b: integer): integer;
: Возвращает минимальное из чисел a, b. Как видим, здесь условный оператор не понадобился. Подобным образом можно найти минимум четырех, пяти и т. д. чисел, только с увеличением количества резко увеличивается громоздкость выражения. Например, для шести чисел функция вычисления минимального элемента выглядит так:
min(min(min(min(min(a, b), c), d), e), f)
If13. Даны три числа. Найти среднее из них (т. е. число, расположенное между наименьшим и наибольшим).
Некто решает эту задачу следующим образом:
var
a, b, c, s: real;
begin
writeln('Введите три числа: ');
readln(a, b, c);
if a < b then
if b < c then s := b { a<b<c }
else
if a < c then s := c { a<c≤b }
else s := a { c≤a<b }
else
if b > c then s := b { c<b≤a }
else
if a > c then s := c { b≤c<a }
else s := a; { b≤a≤c }
writeln('Среднее по значению: ', s);
readln
end.
**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 Но вот вопрос: если из трех чисел два равны между собой, то которое число находится между двумя другими? Все зависит от того, что понимать под словом "между". Если число b находится межу a и c и удовлетворяет нестрогому неравенству a ≤ b ≤ c, то тогда вышеприведенный код правильный. Действительно, если запустить данную программу и вместо a, b и c ввести соотвеиственно 5, 5 и 9, то программа нам выдаст ответ:
Введите три числа: 5 5 9Среднее по значению: 5
То есть равные числа воспринимаются программой нормально. Но если рассматривать строгое неравенство: a < b < c, то в этом случае равные числа недопустимы, и число 5 не может находится между 5 и 9, так как это абсурд. Поэтому следующие варианты решения задачи if13 будем относить только к строгому типу (a < b < c).
* * *
Второе решение задачи if13 предусматривает отдельный ответ в случае совпадения чисел:
var
a, b, c: real;
begin
writeln('Введите три числа: ');
readln(a, b, c);
write('Результат: ');
if a < b then
if b < c then writeln(b) { a<b<c }
else
if b > c then
if a < c then writeln(c) { a<c<b }
else
if a > c then writeln(a) { c<a<b }
else writeln('среднего числа не существует') { a=c }
else writeln('среднего числа не существует') { b=c }
else
if a > b then
if b > c then writeln(b) { a>b>c }
else
if b < c then
if a > c then writeln(c) { a>c>b }
else
if a < c then writeln(a) { b<a<c }
else writeln('среднего числа не существует') { a=c }
else writeln('среднего числа не существует') { b=c }
else writeln('среднего числа не существует'); { a=b }
readln
end.
**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 * * *
Третье решение задачи if13 аналогично предыдущему, только ветвление происходит немного по-другому:
var
a, b, c: integer;
begin
writeln('Введите три числа: ');
readln(a, b, c);
write('Результат: ');
if a < b then
if a < c then
if b < c then writeln(b) { a<b<c }
else
if b > c then writeln(c) { a<c<b }
else writeln('среднего числа не существует') { b=c }
else
if a > c then writeln(a) { b>a>c }
else writeln('среднего числа не существует') { a=c }
else
if a > b then
if a > c then
if b > c then writeln(b) { a>b>c }
else
if b < c then writeln(c) { a>c>b }
else writeln('среднего числа не существует') { b=c }
else
if a < c then writeln(a) { b<a<c }
else writeln('среднего числа не существует') { a=c }
else writeln('среднего числа не существует'); { a=b }
readln
end.
**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 * * *
Четвертое решение задачи if13. Предыдущие два кода довольно громоздки как для задачи такого типа, и поэму возвращаемся к первому решению, куда пропишем проверку равенства чисел − если какие либо два числа совпали, то сообщаем об отсутствии среднего числа, иначе продолжаем выполнять программу. Проверять равенство будем с помощью or − логического "или".
var
a, b, c: real;
begin
writeln('Введите три числа: ');
readln(a, b, c);
write('Результат: ');
if (a = b)or(b = c)or(c = a) then { a=b или b=c или c=a }
writeln('среднего числа не существует')
else
if a < b then
if b < c then writeln(b) { a<b<c }
else
if a < c then writeln(c) { a<c<b }
else writeln(a) { c<a<b }
else
if b > c then writeln(b) { a>b>c }
else
if a > c then writeln(c) { a>c>b }
else writeln(a); { b<a<c }
readln
end.
**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 * * *
Пятое решение задачи if13 нахождения среднего (в строгом смысле) кардинально отличается от предыдущих. Здесь используется тот факт, что если число b находится между a и c, то числа (a - b) и (b - c) − одного знака, а поэтому их произведение положительно.
var
A, B, C: real;
begin
writeln('Введите три числа: ');
readln(A, B, C);
if (B - A) * (A - C) > 0 then writeln(A)
else
if (A - B) * (B - C) > 0 then writeln(B)
else
if (A - C) * (C - B) > 0 then writeln(C)
else writeln('Среднего не существует');
readln
end.
**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 * * *
Наконец, шестое решение задачи if13:
var
a, b, c: real;
begin
writeln('Введите три числа:');
readln(a, b, c);
if (a=b) or (b=c) or (c=a) then { <-- хотя бы два числа совпадают }
writeln('Среднего числа не существует')
else begin { <-- все числа разные }
write('Среднее: ');
if (b<a)and(a<c) or (c<a)and(a<b) then writeln(a)
else
if (a<b)and(b<c) or (c<b)and(b<a) then writeln(b)
else
if (a<c)and(c<b) or (b<c)and(c<a) then writeln(c)
end;
readln
end.
**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 If14. Даны три числа. Вывести вначале наименьшее, а затем наибольшее из данных чисел.
Следующая программа нахождения наибольшего и наименьшего значений не очень эффективна, но четко показывает направление мысли:
var
a, b, c, min3, max3: real;
begin
writeln('Введите три числа: ');
readln(a, b, c);
write('Результат: ');
if a < b then
if b < c then begin min3 := a; max3 := c end { a<b<c }
else
if a < c then begin min3 := a; max3 := b end { a<c≤b }
else begin min3 := c; max3 := b end { c≤a<b }
else
if b > c then begin min3 := c; max3 := a end { a≥b>c }
else
if a < c then begin min3 := b; max3 := c end { c>a≥b }
else begin min3 := b; max3 := a end; { a≥c≥b }
writeln(min3, ' ', max3);
readln
end.
**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 * * *
Второе решение задачи if14 отличается простотой: сначала мы минимуму и максимуму присваиваем первое число A, а потом число B сравниваем с предыдущим минимумом и максимумом. Если B меньше минимума, то минимумом становится B; если B больше максимума, то максимумом становится B. Аналогично проверяем число C.
var
A, B, C, min3, max3: real;
begin
writeln('Введите три числа: ');
readln(A, B, C);
write('Результат: ');
min3 := A; { <== Начальное значение минимума }
max3 := A; { <== Начальное значение максимума }
{ Число B сравниваем с min3 и max3: }
if min3 > B then min3 := B { <-- наименьшее среди min и B }
else
if max3 < B then max3 := B; { <-- наибольшее среди max и B }
{ Число С сравниваем с min3 и max3: }
if min3 > C then min3 := C { <-- наименьшее среди min и C }
else
if max3 < C then max3 := C; { <-- наибольшее среди max и C }
writeln(min3, ' ', max3);
readln
end.
**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 * * *
Третье решение задачи if14 подходит для среды PascalABC.Net, так как использует готовые функции минимума и максимума (смотрите также решение выше).
var
a, b, c: real;
begin
writeln('Введите три числа: ');
readln(a, b, c);
writeln;
writeln('Наименьшее: ', min(min(a, b), c));
writeln('Наибольшее: ', max(max(a, b), c))
end.
**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308**function** Min(a,b: integer): integer;
: Возвращает минимальное из чисел a, b.**function** Min(a,b: integer): integer;
: Возвращает минимальное из чисел a, b.**function** Max(a,b: integer): integer;
: Возвращает максимальное из чисел a, b.**function** Max(a,b: integer): integer;
: Возвращает максимальное из чисел a, b. If15. Даны три числа. Найти сумму двух наибольших из них.
Здесь описан метод исключения: сначала находим минимальное из трех чисел, а потом находим сумму оставшихся, которая и будет суммой больших двух чисел:
var
a, b, c: real;
begin
writeln('Введите три числа: ');
readln(a, b, c);
write('Сумма больших двух чисел: ');
if a < b then
if a < c then writeln(b + c) { a<b a<c }
else writeln(a + b) { c≤a<b }
else
if b < c then writeln(a + c) { b≤a b<c }
else writeln(a + b); { c≤b≤a }
readln
end.
**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 * * *
Второе решение:
var
a, b, c: real;
begin
writeln('Введите три числа: ');
readln(a, b, c);
write('Сумма больших двух чисел: ');
if (a <= b)and(a <= c) then writeln(b + c)
else
if (b <= a)and(b <= c) then writeln(a + c)
else
if (c <= a)and(c <= b) then writeln(a + b);
readln
end.
**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 * * *
Третье решение задачи:
var
a, b, c, MaxSum: real;
begin
writeln('Введите три числа: ');
readln(a, b, c);
{ У наибольших двух чисел сумма наибольшая из возможных.
Поэтому находим максимальную среди сумм: }
MaxSum := a + b; { <== Начальное значение суммы }
if a + c > MaxSum then MaxSum := a + c;
if b + c > MaxSum then MaxSum := b + c;
writeln('Сумма больших двух чисел: ', MaxSum);
readln
end.
**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308 * * *
Четвертое решение задачи для среды PascalABC.Net, но оно не использует условный оператор, поэтому выходит за рамки группы заданий If задачника Абрамяна:
var
a, b, c: real;
begin
writeln('Введите три числа: ');
readln(a, b, c);
write('Сумма больших двух чисел: ');
writeln(max(max(a + b, a + c), b + c))
end.
**type** real;
: Представляет число двойной точности с плавающей запятой.Размер: 8 байт Количество значащих цифр: 15 - 16 Диапазон значений: -1.8∙10308 .. 1.8∙10308**function** Max(a,b: integer): integer;
: Возвращает максимальное из чисел a, b.**function** Max(a,b: integer): integer;
: Возвращает максимальное из чисел a, b.