Root /ArchiveAbout
()

Наименьшее, среднее, наибольшее из трех чисел

Наименьшее, среднее, наибольшее из трех чисел

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.