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

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

В самом начале в поле next каждой записи вносим 0 (на всякий случай, хотя это будет сделано автоматически во всех известных автору трансляторах Паскаля):

for i:=1 to max do begin

stud[i].name:='';

stud[i].next:=0;

end;

Если при чтении данных очередного студента его стипендия равна найденной ранее максимальной, записываем в его поле next номер первого студента в списке, а в массив first заносим номер текущего студента (он становится головой списка):

if stip = maxStip[kurs] then begin

stud[i].next:= first[kurs];

first[kurs]:= i;

end;

Если стипендия больше найденной ранее максимальной, запоминаем новый максимум и записываем в массив first номер этого студента:

if stip > maxStip[kurs] then begin

maxStip[kurs]:= stip;

first[kurs]:= i;

end;

Заметим, что этот студент будет последним в списке, и его поле next будет равно нулю.

Тогда при выводе результата достаточно пройти по списку, начав с того студента, на который указывает элемент массива first[kurs] и перескакивая к следующему по полю next соответствующей записи. Цикл заканчивается, когда поле next очередной записи будет равно нулю:

for kurs:=1 to 5 do

if maxStip[kurs] > 0 then begin

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

i := first[kurs];

repeat

writeln(stud[i].name);

i := stud[i].next;

until i = 0;

end;

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

type TStud = record

name: string;

next: integer;

end;

Var I, n, kurs, stip: integer;

c: char;

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

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

begin

for i:=1 to 5 do begin

maxStip[i] := 0; first[i] := 0;

end;

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(kurs, stip);

if stip = maxStip[kurs] then begin

stud[i].next:= first[kurs];

first[kurs]:= i;

end;

if stip > maxStip[kurs] then begin

maxStip[kurs]:= stip;

first[kurs]:= i;

end;

end;

for kurs:=1 to 5 do

if maxStip[kurs] > 0 then begin

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

i := first[kurs];

repeat

writeln(stud[i].name);

i := stud[i].next;

until i = 0;

end;

end.

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

const MAX = 10;

Var people: array[1..Max-1] of integer;

В самом начале все элементы массива должны быть равны нулю.

Не очень ясно, как проще считать пассажиров на каждом перегоне. Пусть очередной пассажир вошел на станции с номером s1 и вышел на станции s2. Тогда на всех перегонах от s1 до s2-1 нужно увеличить соответствующие значения массива people, что не очень эффективно – появляется дополнительный внутренний цикл.

Значительно лучше при вводе данных считать, на сколько изменилось количество пассажиров на каждой станции. Введем соответствующий массив Delta:

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