Найти среднее число из трех

Задача: 

Среди трех чисел найти среднее. Если среди чисел есть равные, вывести сообщение "Ошибка".

Алгоритм решения задачи: 

Хотя задача кажется простой, ее решение не такое очевидное. Можно, например, проверить каждое число, лежит ли оно между двумя другими. Или найти минимальное из трех, после чего вывести минимальное из оставшихся двух. Ниже выбран первый способ.

  1. Исключаем равенство чисел. Если первое число равно второму или первое равно третьему или второе равно третьему или все три числа равны (первое равно второму и второе равно третьему), то вывести сообщение "Ошибка". Иначе переходим к п. 2.
  2. Проверяем лежит ли первое число между вторым и третьим. Если первое число больше второго, но меньше третьего (т.е. второе минимально), или первое число меньше второго, но больше третьего (т.е. третье минимально), то значит оно среднее. Иначе переходим к п. 3.
  3. Проверяем лежит ли второе число между первым и третьим. Если второе число больше первого, но меньше третьего, или меньше первого, но больше третьего, то оно среднее. Иначе переходим к п. 4.
  4. Среднее число третье, так как ни один другой вариант не подошел. Действительно, числа не равны друг другу, первое и второе числа средними не являются.
Программа на языке Паскаль: 

var
    a1, a2, a3: integer;
 
begin
    write ('Введите три числа: ');
    readln (a1, a2, a3);
 
    if (a1 = a2) or (a1 = a3) or (a2 = a3) or ((a1 = a2) and (a2 = a3)) then
        writeln('Ошибка')
    else
        if ((a1 > a2) and (a1 < a3)) or ((a1 < a2) and (a1 > a3)) then
            writeln(a1)
        else
            if ((a2 > a1) and (a2 < a3)) or ((a2 < a1) and (a2 > a3)) then
                writeln(a2)
            else
                writeln(a3);
 
end.

Пример работы программы:

Введите три числа: 7 4 6
6

Комментарии

Мне кажется так будет покороче

Var
 a,b,c,s: integer;
Function Max(x,y: integer): integer;
  Begin
  If x>y then Max:=x else Max:=y
  end;
Function Min(x,y: integer): integer;
  Begin
  If x<y then Min:=x else Min:=y
  end;
 
Begin
  Readln(a,b,c);
  S:=(a+b+c)-((Max(Max(a,b),c))+(Min(Min(a,b),c)));
  writeln(s);
end.

Или вот так у меня получилось

program SEREDINA;
uses crt;
var a,b,c,ser: integer;
vyvod: boolean;
begin
clrscr;
vyvod:=true;
write('Введите первое число: ');
readln(a);
write('Введите второе число: ');
readln(b);
write('Введите третье число: ');
readln(c);
if ((b>a)and(a>c)) or ((c>a)and(a>b)) then ser:=a
else
if ((a>b)and(b>c)) or ((c>b)and(b>a)) then ser:=b
else
if ((a>c)and(c>b)) or ((b>c)and(c>a)) then ser:=c;
if (a=b) or (b=c) or (a=c) then vyvod:=false;
if vyvod=true then writeln('Число посередине - ',(ser))
else writeln('Ошибка! Совпадение чисел!');
readln;
end.