На вход программе подаются 366 строк, которые содержат информацию о среднесуточной температуре всех дней 2004 года. Формат каждой из строк следующий: сначала записана дата в виде dd.mm (на запись номера дня и номера месяца в числовом формате отводится строго два символа, день от месяца отделен точкой), затем через пробел записано значение температуры — число со знаком плюс или минус, с точностью до 1 цифры после десятичной точки. Данная информация отсортирована по значению температуры, то есть хронологический порядок нарушен. Напишите эффективную, в том числе и по используемой памяти, программу (укажите используемую версию языка программирования, например Borland Pascal 7.0), которая будет выводить на экран информацию о месяце (месяцах) среднемесячная температура для которого (которых) наименее отклоняется от среднегодовой. В первой строке вывести среднегодовую температуру. Найденные значения для каждого из месяцев следует выводить в отдельной строке в следующем виде: номер месяца, значение среднемесячной температуры, отклонение от среднегодовой температуры.
Программа читает входные данные, сразу подсчитывая в массиве, хранящем 12 вещественных чисел, сумму температур в каждом из месяцев, одновременно суммируя все температуры в году. Затем с использованием этого массива ищется минимальное отклонение среднемесячной температуры от среднегодовой. За дополнительный просмотр этого массива распечатывается информация об искомых месяцах.
| Бейсик | Паскаль |
|---|---|
DATA 31,29,31,30,31,30,31,31,30,31,30,31 DIM i, m, d(12) AS INTEGER DIM tm(12) DIM dat AS STRING *5 FOR i = 1 TO 12 tm(i) = 0 READ d(i) NEXTi ty = 0 'ty – среднегодовая температура FOR i = 1 TO 366 INPUT dat, t 'Вычисляем номер месяца m=(ASC(MID$(dat,4,1))-ASC("0"))*10+ ASC(MID$(dat,5,1))-ASC("0") tm(m) = tm(m) + t ty = ty + t NEXT i FOR i = 1 TO 12 tm(i) = tm(i) / d(i) NEXT i ty = ty / 366 min = 100 FOR i = 1 TO 12 IF ABS(tm(i) - ty) < min THEN min = ABS(tm(i) - ty) NEXT i PRINT "Среднегодовая температура = "; PRINT USING "##.##"; ty FOR i = 1 TO 12 IF ABS(ABS(tm(i) - ty) - min) < .0001 THEN PRINT i; PRINT USING "##.## "; tm(i); ABS(tm(i) - ty) END IF NEXT i END | Const d:array[1..12] of integer = (31,29,31,30,31,30,31,31,30,31,30,31); var tm:array[1..12] of real; m:1..12; data:string[5]; min,ty,t:real; i:integer; begin for i:=1 to 12 do tm[i]:=0; ty:=0;{среднегодовая температура} for i:=1 to 366 do begin readln(data,t); {вычисляем номер месяца} m:=(ord(data[4])-ord('0'))*10 +ord(data[5])-ord('0'); tm[m]:=tm[m]+t; ty:=ty+t; end; for i:=1 to 12 do tm[i]:=tm[i]/d[i]; ty:=ty/366; min:=100; for i:=1 to 12 do if abs(tm[i]-ty) < min then min:=abs(tm[i]-ty); writeln('Среднегодовая температура = ',ty:0:2); for i:=1 to 12 do if abs(abs(tm[i]-ty)-min)<0.0001 then writeln(i,' ',tm[i]:0:2,' ',abs(tm[i]-ty):0:2); readln end. |

