Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Инфорамтика C4 ответы.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
912.38 Кб
Скачать

Var name: array[1..Max] of string;

ball:array[1..MAX] of byte;

s: string;

mark, k, j, i, N: integer;

c: char;

begin

readln(n);

for i:=1 to n do begin

name[i]:=''; ball[i]:=0;

for k:=1 to 2 do

repeat

read(c);

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

until c = ' ';

for k:=1 to 4 do begin

read(mark);

ball[i]:= ball[i] + mark;

end;

readln;

end;

{ "метод камня" – за один проход самый тяжелый

элемент упадет "на дно" массива }

for i:=1 to 3 do { делаем только три прохода по массиву }

for j:=1 to n-i do

if ball[j] > ball[j+1] then begin

mark:=ball[j]; ball[j]:=ball[j+1]; ball[j+1]:=mark;

s:=name[j]; name[j]:=name[j+1]; name[j+1]:=s;

end;

{ выводим всех, у которых баллы не ниже третьего }

for i:=1 to n do

if ball[i] >= ball[n-2] then

writeln(name[i]);

end.

  1. Особенность этой задачи в том, что фамилии на выходе нужно отсортировать. «Школьные» сортировки имеют сложность ; это вообще говоря, не лучший вариант, но без сортировки здесь не обойтись. Применять «быстрые» сортировки (например, QuickSort) не следует, даже если вы их знаете – эксперты могут не понять. Читаем очередную строку посимвольно до второго пробела, накапливаем строку в переменной s – там окажется фамилия вместе с именем:

s := '';

for k:=1 to 2 do

repeat

read(c);

s := s + c;

until c = ' ';

Теперь читаем два числа,

readln(mark1, mark2);

Учитывая, что до конца строки больше нет данных, используем оператор readln, а не read. Если хотя бы одна из оценок меньше 30, увеличиваем счетчик «неудачников» (переменная count) и записываем фамилию и имя (из переменной s) в элемент массива name с номером count:

if (mark1 < 30) or (mark2 < 30) then begin

count := count + 1;

name[count] := s;

end;

После чтения всех данных массив фамилий «неудачников» нужно отсортировать, здесь мы используем простейший метод – классический «пузырек». Не забываем, что нужно сортировать не все N строк в массиве name, а только count (столько, сколько нашли «неудачников»):

for i:=1 to count-1 do

for k:=count-1 downto i do

if name[k] > name[k+1] then begin

s := name[k]; name[k] := name[k+1];

name[k+1] := s;

end;

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

const LIM = 500;

Var name: array[1..Lim] of string;

I, k, count, mark1, mark2, n: integer;

c: char;

s: string;

begin

readln(N);

{ ввод исходных данных }

count := 0;

for i:=1 to N do begin

s := '';

for k:=1 to 2 do

repeat

read(c);

s := s + c;

until c = ' ';

readln(mark1, mark2);

if (mark1 < 30) or (mark2 < 30) then begin

count := count + 1;

name[count] := s;

end;

end;

{ сортировка }

for i:=1 to count-1 do

for k:=count-1 downto i do

if name[k] > name[k+1] then begin

s := name[k]; name[k] := name[k+1];

name[k+1] := s;

end;

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

for i:=1 to count do

writeln(name[i]);

end.

  1. Так как номера телефонов подразделений отличаются только двумя последними цифрами, задача сводится к тому, чтобы подсчитать, сколько различных чисел (номеров подразделений) встречается в этой последней части. Их может быть не более 100 (от 0 до 99), поэтому вводим массив из 100 элементов: