Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
24
Добавлен:
19.05.2015
Размер:
719.36 Кб
Скачать

Val(Copy(s,1,p-1), c.No, k); { номер слева от пробела }

Delete(s, 1, p); { в "s" остается дата }

c.day := dayFromStart(s);

if curDay - c.day > 3 then begin

count := count + 1;

cells[count] := c;

end;

end;

{ сортировка по возрастанию поля day }

for i:=1 to count-1 do

for j:=count-1 downto 1 do

if cells[j].day > cells[j+1].day then begin

c:=cells[j]; cells[j]:=cells[j+1];

cells[j+1]:=c;

end;

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

for i:=1 to count do

writeln(cells[i].no);

end.

Отметим, что большинство сред для программирования на языке Паскаль допускает более красивое объявление массива dm как массива целых констант:

const dm: array[1..12] of integer =

(31,28,31,30,31,30,31,31,30,31,30,31);

  1. Сложность этой задачи состоит в том, что студентов с максимальной стипендией на каждом курсе может быть несколько (хоть все!). Поэтому придется хранить все входные данные в массиве. Сведения о студенте будем записывать в структуру (запись)

type TStud = record

name: string;

kurs, stip: integer;

end;

В поле name хранятся фамилия и имя, в поле kurs – номер курса, в поле stip – размер стипендии.

Для поиска максимальной стипендии по каждому курсу введем массив счетчиков и обнулим его:

Var maxStip: array[1..5] of integer;

...

for i:=1 to 5 do maxStip[i] := 0;

Из первой строки исходных данных читаем число студентов в переменную N, затем в цикле от 1 до N читаем строки с данными о студентах. Информацию записываем прямо в поля структуры. В поле name записываем все символы до второго пробела:

stud[i].name := '';

repeat

read(c);

stud[i].name := stud[i].name + c;

until c = ' ';

repeat

read(c);

stud[i].name := stud[i].name + c;

until c = ' ';

Затем читаем номер курса и размер стипендии (до конца строки, поэтому readln):

readln(stud[i].kurs, stud[i].stip);

После этого проверяем, не превышает ли эта стипендия максимальную на этом курсе; если превышает, обновляем максимальное значение:

if stud[i].stip > maxStip[stud[i].kurs] then

maxStip[stud[i].kurs] := stud[i].stip;

Когда все данные прочтены, нужно вывести фамилии и имена всех студентов, стипендия которых равна максимальной на курсе. Для этого требуется вложенный цикл: во внешнем цикле меняется номер курса k (от 1 до 5), а во внутреннем просматривается весь массив сведений о студентах:

for k:=1 to 5 do begin

writeln('Курс ', k);

for i:=1 to N do

if (stud[i].kurs = k) and

(stud[i].stip = maxStip[k]) then

writeln(stud[i].name);

end;

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

const MAX = 100;

type TStud = record

name: string;

kurs, stip: integer;

end;

Var I, k, n: integer;

c: char;

maxStip: array[1..5] of integer;

stud: array[1..MAX] of TStud;

begin

for i:=1 to 5 do maxStip[i] := 0;

readln(N);

for i:=1 to N do begin

stud[i].name := '';

repeat read(c); stud[i].name := stud[i].name + c;

until c = ' ';

repeat read(c); stud[i].name := stud[i].name + c;

until c = ' ';

readln(stud[i].kurs, stud[i].stip);

if stud[i].stip > maxStip[stud[i].kurs] then

maxStip[stud[i].kurs] := stud[i].stip;

end;

for k:=1 to 5 do begin

writeln('Курс ', k);

for i:=1 to N do

if (stud[i].kurs = k) and

(stud[i].stip = maxStip[k]) then

writeln(stud[i].name);

end;

end.

Альтернативное решение задачи предложил А. Тарасов (с. Красноусольский, Республика Башкортостан). Идея состоит в том, чтобы фактически составить из студентов, имеющих максимальную стипендию на курсе, линейный список. В структуру включаем фамилию, имя и поле next, в котором будем хранить номер следующего в списке студента:

type TStud = record

name: string;

next: integer;

end;

Номер первого студента в списке (для каждого курса) будем хранить в массиве

Соседние файлы в папке ЕГЗ_2012_Поляков_май