На вход программе подаются 365 строк, которые содержат информацию о среднесуточной температуре всех дней 2007 года. Формат каждой из строк следующий: сначала записана дата в виде dd.mm (на запись номера дня и номера месяца в числовом формате отводится строго два символа, день от месяца отделен точкой), затем через пробел (для Бейсика — через запятую) записано значение температуры — число со знаком плюс или минус, с точностью до 1 цифры после десятичной точки. Данная информация отсортирована по значению температуры, т. е. хронологический порядок нарушен. Требуется написать эффективную программу на языке Паскаль или Бейсик, которая будет выводить на экран информацию о месяцах с максимальной среднемесячной температурой. Найденные максимальные значения следует выводить в отдельной строке для каждого месяца в виде: номер месяца, значение среднемесячной температуры, округленное до одной цифры после десятичной точки.
Программа считывает входные данные, сразу подсчитывая в массиве, хранящем 12 вещественных чисел, сумму температур в каждом из месяцев. Затем с использованием этого массива ищется максимальная среднемесячная температура. За дополнительный просмотр среднемесячных температур (их можно как запомнить в массиве, так и вычислить заново) распечатывается информация об искомых месяцах. Баллы начисляются только за программу, которая решает задачу хотя бы для частного случая (например, месяц с максимальной температурой единственен).
Пример правильной и эффективной программы на языке Паскаль:
const d:array[1..12] of integer =
(31,28,31,30,31,30,31,31,30,31,30,31);
var m:array[1..12] of real;
max, t:real;
i,j:integer;
cl,c2:char;
begin
for j:=1 to 12 do
m[j ] : =0;
for i:=l to 365 do
begin
readln(cl,cl,cl,cl,c2,t);
j:= (ord(cl)-ord('0') ) *10 +
ord(c2)-ord('01);
m [ j] :=m[j]+t
end;
max:=m[1]/d[1];
for j:=2 to 12 do
if m[j]/d[j] > max then
max:=m[j]/d[j];
for j:=1 to 12 do
if abs(m[j]/d[j]-max) < 0.0001
then writeln(j,1 ',m[j]/d[jj:0:1)
end.
Пример правильной программы на языке Бейсик:
DATA 31,28,31,30,31,30,31,31,30,31,30,31
DIM i, j, d (12) AS INTEGER
DIM m(12)
DIM dat AS STRING * 5
FOR i = 1 TO 12
m (i) = 0
READ d(i)
NEXT i
FOR i = 1 TO 3 65
INPUT dat, t
j = (ASC(MID$(dat, 4, 1)) - ASC("0")> * 10 +
ASC (MID5 (dat, 5, 1)) -ASCCO")
m(j) = m (j ) + t
NEXT i
max = m(l) / d(1)
FOR j = 2 TO 12
IF m(j ) / d(j) > max THEN max = m(j) / d(j)
NEXT j
FOR j = 1 TO 12 IF ABS(m(j) / d(j) - max) < .0001 THEN
PRINT j; " " ;
PRINT USING "##.#"; m(j) / d(j)
ENDIF
NEXT j
END

