Minmax21. Дано целое число $$N (> 2)$$ и набор из $$N$$ чисел — значений некоторой величины, полученных в $$N$$ опытах. Найти среднее значение этой величины. При вычислении среднего значения не учитывать минимальное и максимальное из имеющихся в наборе значений.
Комментарий к заданию, какое среднее значение ?! по середине набора ? или среднее арифметическое или среднее геометрическое? В общем средних значений можно придумать много, которые могут изменить полностью алгоритм решения.
Я найду среднее арифметическое, я считаю что по смыслу задачи оно подходит больше.
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
program MinMax21; var Min,Max,R,Sum:Real; N,i,RezMaxNum,RezMinNum:Integer; begin Sum:=0; Write('N:'); Readln(N); for i:=1 to N do begin Write(i,' элемент:'); Readln(R); if i=1 then begin Min:=R; Max:=R; RezMaxNum:=0; RezMinNum:=0; end; if R>Max then begin if Max<>Min then Sum:=Sum+Max*RezMaxNum; Max:=R; RezMaxNum:=0; end; if R<Min then begin if Min<>Max then Sum:=Sum+Min*RezMinNum; Min:=R; RezMinNum:=0; end; if (R<>Max) and (R<>Min) then Sum:=Sum+R else begin if R=Min then inc(RezMinNum); if R=Max then inc(RezMaxNum); end; end; i:=N-RezMinNum-RezMaxNum; if i<>0 then writeln(Sum/i) else writeln(0); end. |
Решение от olegst1975 (данное решение подразумевает, что минимальное или максимальное значение может быть только по одному):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
var n,i:integer; k,min,max, mean:real; begin read(n); read(k); min:=k; max:=k; mean:=k; //среднее арифм. for i:=2 to n do begin read(k); if k<min then min:=k; if k>max then max:=k; mean:=mean+k; end; mean:=(mean-min-max)/(n-2); write(mean); end. |
Другие задачи из раздела Minmax можно посмотреть здесь.
Ваше решение ниасилил). Ниже приведу свое, но, что характерно, результаты у нас не совпадают. Без учета, что максимумы и минимумы могут повторяться. Отбрасываю лишь 2 числа из условия "…минимальное и максимальное из имеющихся..".
[/crayon]
А можно привести пример, где не совпадают?
На тех примерах, которые придумал я, с вашей коррекцией задания :). У нас ответы получаются одинаковые..
У меня как раз программа написана, что бы учитывать повторяющиеся min и max. Поэтому она такая и большая, RezMaxNum и RezMinNum считают сколько максимумов и минимумов было, чтоб потом столько же вернуть если это оказался не экстремум…
А не учитывать это … наверно всё таки не соответствует заданию…
Исходные данные
N = 5
6.53 2.15 2.30 9.20 6.56
Полученные результаты
7.69
ээ… при таких параметрах моя программа выдаёт так : 5,13
И у вас вроде тоже %)
Компилирую всё, на Delphi 7.
В строку 45 к виду i:=i-RezMinNum-RezMaxNum; — ?? Про повторяющиеся экстремумы..Скорее Вы правы, но «…минимальное и максимальное ..», а не -льные, плюс вещественные числа увели на путь упрощения
Точно строка 45:
i:=i-RezMinNum-RezMaxNum-1;
это i после счётчика! то есть у меня в Delphi там i+1 элементов, а в другом компиляторе может быть i элементов.
В общем надо запомнить, что этим пользоваться нельзя.
Было:
Исправил на
чуть подумал.. решил, что всё таки это может быть тем, что подразумевал автор задачи:)
Да, почему ноль в строке 48 ?
надо читать вместе с 47 🙂
Если кол-во элементов, кроме экстремумов 0, то выводится 0. Иначе бы было деление на 0, а это в паскале очень плохо. 🙂