Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
kpolyakov.narod.ru answC4.doc
Скачиваний:
0
Добавлен:
09.12.2018
Размер:
566.78 Кб
Скачать

Var count: array[1..Max] of integer;

I, j, nMin, n, zNo: integer;

begin

{ начальные установки }

for i:=1 to MAX do count[i] := 0;

{ ввод данных и увеличение счетчиков }

readln(N);

for i:=1 to N do begin

readln(zNo);

count[zNo] := count[zNo] + 1;

end;

{ вывод результатов }

for i:=1 to MAX do begin

{ поиск первого ненулевого счетчика }

nMin := 1;

while (count[nMin]=0) and (nMin < MAX) do

nMin := nMin+1;

if count[nMin] = 0 then break;

{ поиск минимального ненулевого счетчика }

for j:=nMin to max do

if (count[j]<>0) and (count[j]<count[nMin])

then nMin:=j;

{ вывод результата }

writeln (nMin, ' ', count[nMin]);

count[nMin] := 0;

end;

end.

  1. В сравнении с предыдущей задачей, здесь есть одно усложнение. При вводе нужно определять, встречался ли этот фильм в списке раньше. Если встречался, то нужно просто увеличить соответствующий счетчик, если нет – запомнить название фильма и записать в его счетчик единицу. Так же, как и в предыдущей задаче, будем использовать записи (структуры), каждый элемент хранит название фильма и число поданных за него голосов:

type TInfo = record

film: string;

count: integer;

end;

Введем целую переменную K – счетчик уже найденных фильмов, который в начале равен нулю. Когда прочитано очередное название фильма (в символьную строку s, нужно проверить если ли уже в списке этот фильм. Если есть, мы просто увеличиваем его счетчик. Для поиска удобно использовать цикл с условием, который просматривает первые K элементов массива:

j := 1;

while j <= K do

if s = Info[j].film then begin

Info[j].count := Info[j].count + 1;

j := MaxInt;

end

else j := j + 1;

Если фильм нашли в списке, кроме увеличения счетчика в переменную j записывается значение MaxInt, это сделано для того, чтобы цикл завершился. Таким образом, после окончания цикла переменная j может быть равна MaxInt (если фильм уже был в списке) или K+1 (если фильм не найден и цикл закончился при нарушении условия j<=K). В последнем случае добавляем его в список и записываем в счетчик 1:

if j = K+1 then begin

K := K + 1;

Info[K].film := s;

Info[K].count := 1;

end;

При сортировке нужно использовать не весь массив, а только первые K записей (столько, сколько было фактически найдено разных фильмов):

for i:=1 to K do

for j:=1 to K-i do

if Info[j].count < Info[j+1].count then begin

temp := Info[j];

Info[j] := Info[j+1];

Info[j+1] := temp;

end;

При выводе, в отличие от предыдущей задачи, не нужно делать проверку на неравенство нулю – если фильм был найден, его счетчик заведомо не меньше 1:

for i:=1 to K do

writeln(Info[i].film, ' ', Info[i].count);

Вот полная программа:

const MAX = 10;

type TInfo = record

film: string;

count: integer;

end;

Var Info: array[1..Max] of tInfo;

I, j, n, k: integer;

s: string;

temp: TInfo;

begin

K := 0;

readln(N);

for i:=1 to N do begin

readln(s);

j := 1;

while j <= K do

if s = Info[j].film then begin

Info[j].count := Info[j].count + 1;

j := MaxInt;

end

else j := j + 1;

if j = K+1 then begin

K := K + 1;

Info[K].film := s;

Info[K].count := 1;

end;

end;

for i:=1 to K do

for j:=1 to K-i do

if Info[j].count < Info[j+1].count then begin

temp := Info[j];

Info[j] := Info[j+1];

Info[j+1] := temp;

end;

for i:=1 to K do

writeln(Info[i].film, ' ', Info[i].count);

end.

1 Вообще говоря, без массива Total можно обойтись, потому что Total[i] – это сумма i-ой строки матрицы Count. Но его использование сильно упрощает дело при обработке данных. На досуге вы можете написать программу без него.

2 На практике это не обязательно, потому что глобальные переменные и массивы обнуляются автоматически во всех известных автору версиях Паскаля. Тем не менее, на экзамене вы должны показать эксперту, что вы понимаете суть дела.

3 Решение, предложенное в проекте демо-варианта ФИПИ 2010 года, содержит массивы, описанные как array[92..98], что само по себе очень неграмотно.

4 Это ограничение снято в Delphi.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]