СДАМ ГИА: РЕШУ ЕГЭ
Образовательный портал для подготовки к экзаменам
Информатика
Информатика
Cайты, меню, вход, новости


Задания
Версия для печати и копирования в MS Word
Задания Д19 C4 № 3794

На вход программе подаются 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.