Тип Д19 C4 № 3639 
Обработка символьных строк. Буквенно-числовые строки
i
На вход программе подаются 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
Критерии проверки:| Критерии оценивания выполнения задания | Баллы |
|---|
| Программа работает для любых входных данных произвольного размера. Программа просматривает входные данные один раз. Допускается наличие в тексте программы одной синтаксической ошибки: пропущен или неверно указан знак пунктуации, неверно написано или пропущено зарезервированное слово языка программирования, не описана или неверно описана переменная, применяется операция, недопустимая для соответствующего типа данных (если одна и та же ошибка встречается несколько раз, то это считается за одну ошибку). | 4 |
| Программа работает верно. Допускается наличие от одной до трех синтаксических ошибок. Возможно, в принципиально верно организованном вводе данных есть одна ошибка (например, использование read вместо readln в Паскале или неверное считывание строки в C++). Три балла также выставляется, если в эффективной программе, удовлетворяющей критериям выставления 4 баллов, есть одна ошибка, в результате которой программа работает неверно на некоторых наборах нетипичных входных данных. | 3 |
| Программа работает в целом верно, эффективно или нет, но в реализации алгоритма содержится до двух ошибок (неверная инициализация счётчиков, допущена ошибка в принципиально верно организованной сортировке или алгоритме поиска минимальных элементов, используется знак “<” вместо “<=”, “or” вместо “and” и тому подобное). Возможно, некорректно организовано считывание входных данных. Допускается наличие от одной до пяти синтаксических ошибок, описанных выше | 2 |
| Программа, возможно, неверно работает при некоторых входных данных, но по приведённому тексту решения ясно, что экзаменуемый понимает, из каких этапов должно состоять решение задачи. При использовании сортировки она может быть реализована принципиально неверно (например, вместо двух циклов используется один), или допущена принципиальная ошибка в поиске нужных элементов. Всего допускается до 4 различных ошибок в реализации алгоритма, в том числе описанных в критериях присвоения двух баллов. Допускается наличие от одной до семи синтаксических ошибок, описанных выше. | 1 |
| Задание не выполнено или выполнено неверно. | 0 |
| Максимальный балл | 4 |