Тип Д19 C4 № 3648 
Обработка символьных строк. Поиск лучших учеников или игроков
i
На вход программе подаются сведения об учениках некоторой средней школы. В первой строке сообщается количество учеников N, каждая из следующих N строк имеет следующий формат:
<Фамилия> <Имя> <класс>,
где <Фамилия> — строка, состоящая не более чем из 20 символов,
<Имя> — строка, состоящая не более чем из 15 символов,
<класс> — год обучения (от 1 до 12) и заглавная буква (от «А» до «Я») без пробела. <Фамилия> и <Имя>, а также <Имя> <класс> разделены одним пробелом.
Пример входной строки:
Иванов Петр 10Б
Требуется написать программу на языке Паскаль или Бейсик, которая будет выводить на экран информацию о параллелях (годе обучения) с наибольшим числом учеников. Программа должна выводить на экран в первой строке количество учеников в искомых параллелях, а во второй строке — в порядке возрастания номера этих параллелей через пробел.
Например:
100
1 7 11
Решение. Программа должна верно читать входные данные, не запоминая их все, а сразу подсчитывая в массиве, хранящем 12 целых чисел, количество учащихся в каждой из параллелей. Затем с использованием этого массива ищется параллель с максимальным числом учеников. За дополнительный просмотр этого массива распечатывается информация об искомых параллелях. Баллы начисляются только за программу, которая решает задачу хотя бы для частного случая (например, параллель с максимальным количеством учеников единственна).
Пример правильной и эффективной программы на языке Паскаль:
var рс:array[1..12] of integer;
р : 1. .12;
class:string[3];
с:char;
max, i, N:integer;
begin readln(N) ;
for i:=1 to 12 do
pc[i]:=0;
for i:=l to N do
begin
repeat
read(c)
until c=' '; {считана фамилия}
repeat
read(c)
until c=' '; {считано имя}
readln(class);
{определяем номер параллели}
if length(class)=2 then
p:=ord(class[1])-ord(10') else
p:=(ord(class[1])-ord('0'))*10+
ord(class[2])-ord('0');
pc[p]:=pc[p]+1;{учитываем ученика этой параллели}
end;
max:=0;
for i:=1 to 12 do
if pc[i]>max then max:=pc[i];
writeln('Максимум учеников в параллели:',max);
for i:=1 to 12 do
if pc[i]=max then
write(i,' ');
readln
end.
Пример правильной программы на языке Бейсик:
DIM i, j, р, n, max, pc(12) AS INTEGER
DIM m(12)
DIM s AS STRING
FOR i = 1 TO 12
pc(i) = 0
NEXT i
INPUT n
FOR j = 1 TO n
LINE INPUT s
c$ = MI D$ (s, 1, 1)
i = 1
WHILE NOT (с $ = " ")
i = i - 1
c$ = MID$ (s, i, 1)
WEND i = i + 1
с$ = MID$(s, i, 1)
WHILE NOT (с $ = " ")
i = i + 1
c$ = MID$(s, i, 1)
WEND
s = MID$ (s, i + 1, 3)
IF MID$(s, 2, 1) >= "0" AND MID$(s, 2, 1) < =
"2" THEN
p = (ASC(MID$(s, 1, 1)) - ASC("0")) * 10 +
ASC(MID$(s, 2, 1)) - ASC("0")
ELSE
p = ASC(MID$(s, 1, 1)) - ASC("0")
ENDIF
pc(p) = pc(p) + 1
NEXT j
max = 0
FOR i = 1 TO 12
IF pc (i) > max THEN max = pc(i)
NEXT i
PRINT "Max = "; max
FOR i = 1 TO 12
IF pc(i) = max THEN PRINT i; " ";
NEXT i
END
Критерии проверки:| Критерии оценивания выполнения задания | Баллы |
|---|
| Программа работает для любых входных данных произвольного размера и находит ответ, не сохраняя входные данные в массиве, размер которого соответствует числу N (количеству запросов). Программа просматривает входные данные один раз. Допускается наличие в тексте программы одной синтаксической ошибки: пропущен или неверно указан знак пунктуации, неверно написано или пропущено зарезервированное слово языка программирования, не описана или неверно описана переменная, применяется операция, недопустимая для соответствующего типа данных (если одна и та же ошибка встречается несколько раз, то это считается за одну ошибку). | 4 |
| Программа работает верно, но входные данные запоминаются в массиве, размер которого соответствует числу N. Этот массив, возможно, потом сортируется. Допускается наличие от одной до трех синтаксических ошибок. Возможно, в принципиально верно организованном вводе данных есть одна ошибка (например, использование read вместо readln в Паскале или неверное считывание строки в C++). Три балла также выставляется, если в эффективной программе, удовлетворяющей критериям выставления 4 баллов, есть одна ошибка, в результате которой программа работает неверно на некоторых наборах нетипичных входных данных. | 3 |
| Программа работает в целом верно, эффективно или нет, но в реализации алгоритма содержится до двух ошибок (неверная инициализация счётчиков, допущена ошибка в принципиально верно организованной сортировке или алгоритме поиска минимальных элементов, используется знак “<” вместо “<=”, “or” вместо “and” и тому подобное). Возможно, некорректно организовано считывание входных данных. Допускается наличие от одной до пяти синтаксических ошибок, описанных выше | 2 |
| Программа, возможно, неверно работает при некоторых входных данных, но по приведённому тексту решения ясно, что экзаменуемый понимает, из каких этапов должно состоять решение задачи. При использовании сортировки она может быть реализована принципиально неверно (например, вместо двух циклов используется один), или допущена принципиальная ошибка в поиске нужных элементов. Всего допускается до 4 различных ошибок в реализации алгоритма, в том числе описанных в критериях присвоения двух баллов. Допускается наличие от одной до семи синтаксических ошибок, описанных выше. | 1 |
| Задание не выполнено или выполнено неверно. | 0 |
| Максимальный балл | 4 |