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

Var count:array[0..100] of integer;

c: char;

I, n, sch, ball, m, s: integer;

begin

{ обнуляем массив }

for i:=0 to 100 do count[i]:=0;

{ читаем количество строк}

readln(N);

for i:=1 to N do begin

{ пропускаем фамилию и имя}

repeat read(c) until c=' ';

repeat read(c) until c=' ';

readln(sch,ball); { читаем номер школы и балл ученика}

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

end;

M := N div 5; {вычисляем 20% от количества учеников}

{ ищем минимальный балл этих 20% }

s := 0;

i:=101;

while s < M do begin

i:=i-1;

s:=s+count[i];

end;

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

if (s = M) or (s = count[i]) then

{ i баллов – «отлично» }

writeln (i)

else begin

{ i баллов не «отлично» }

repeat

i:=i+1;

until count[i]<>0;

writeln(i);

end;

end.

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

num: array[0..9] of integer;

Кроме того, нам нужно узнать, есть ли в строке хотя бы одна цифра (чтобы вывести ответ «Да» или «Нет»). Для этого во время чтения будем считать найденные цифры в переменной count. В начале программы счетчики нужно обнулить:

for i:=0 to 9 do num[i] := 0;

count := 0;

При чтении проверяем очередной символ так: если его код находится между кодом цифры ‘0’ (код 48) и цифры ‘9’ (код 57), то это цифра. Так можно делать, потому что цифры во всех кодовых страницах стоят последовательно, одна за другой. Вот полный цикл чтения до точки:

repeat

read(c);

if ('0' <= c) and (c <= '9') then begin

k := Ord(c) - Ord('0');

num[k] := num[k] + 1;

count := count + 1;

end;

until c = '.';

Здесь используется цикл repeat, потому что хотя бы один символ необходимо прочитать. Чтобы найти номер нужного счетчика k, вычисляем разность между кодами прочитанного символа и цифры '0'.

Чтобы при выводе получилось максимальное число, нужно сначала выводить все девятки (их количество записано в num[9]), затем все восьмерки и т.д. до нуля:

for i:=9 downto 0 do

for k:=1 to num[i] do write(i);

Здесь используется оператор write, который не переходит на новую строку и выводит все цифры в одной строке.

Осталась одна проблема: если в строке есть только нули, нужно вывести только один ноль. Состояние «цифры есть, но все они – нули» записывается в виде условия

if (count = num[0]) and (num[0] > 0) then

num[0] := 1;

в этом случае в счетчик нулей записываем единицу. После этого будет выведен только один нуль.

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

program qq;

Var c: char;

num: array[0..9] of integer;

I, k, count: integer;

begin

{ обнулить счетчики }

for i:=0 to 9 do num[i] := 0;

count := 0;

{ читаем последовательность }

repeat

read(c);

{ если цифра, увеличили счетчик }

if ('0' <= c) and (c <= '9') then begin

k := Ord(c) - Ord('0');

num[k] := num[k] + 1;

count := count + 1;

end;

until c = '.';

{ если только нули }

if (count = num[0]) and (num[0] > 0) then

num[0] := 1;

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

if count = 0 then

writeln('Нет')

else writeln('Да');

for i:=9 downto 0 do

for k:=1 to num[i] do write(i);

end.

Возможно еще одно аналогичное решение, где индексы у массива – символьные:

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