≡ информатика
сайты - меню - вход - новости




Задания
Версия для печати и копирования в MS Word
Задание 27 № 3648

На вход программе подаются сведения об учениках некоторой средней школы. В первой строке сообщается количество учеников 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