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

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;

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

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;

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