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

Var c, I: char;

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

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

num[c] := num[c] + 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.

  1. В этой задаче, как и в предыдущей, нас тоже интересует только количество разных цифр, поэтому при вводе будем считать их с помощью массива.

Затем нужно отсортировать массив по возрастанию. Но при этом возникает проблема – мы потеряем информацию о том, какой цифре соответствует, например, счетчик num[0]. Поэтому заведем другой массив ind, в котором будем хранить цифры, соответствующие счетчикам. Например, если в ind[2] находится число 5, то num[2]– это количество цифр '5'. В начале программы в i-й элемент массива ind записываем число i (цифры стоят по порядку):

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

После чтения данных нужно отсортировать цифры по возрастанию частоты встречаемости, причем при одинаковой частоте встречаемости порядок должен сохраниться. Этим свойством обладает, например, метод сортировки «пузырьком»:

for i:=0 to 8 do

for j:=8 downto i do

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

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

k:=ind[j]; ind[j]:=ind[j+1]; ind[j+1]:=k;

end;

Обратите внимание, что при перестановке элементов массива num также переставляются и соответствующие элементы массива ind, чтобы сохранить информацию о том, каким цифрам соответствуют счетчики массива num.

Выводить нужно только те цифры, для которых счетчик больше нуля, причем саму цифру берем из массива ind:

for i:=0 to 9 do

if num[i] > 0 then write(ind[i]);

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

Var c: char;

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

I, j, k: integer;

begin

{ начальные значения }

for i:=0 to 9 do begin

num[i] := 0;

ind[i] := i;

end;

{ ввод данных, подсчет цифр в массиве num }

repeat

read(c);

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

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

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

end;

until c = '.';

{ сортировка «пузырьком» }

for i:=0 to 8 do

for j:=8 downto i do

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

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

k:=ind[j]; ind[j]:=ind[j+1]; ind[j+1]:=k;

end;

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

for i:=0 to 9 do

if num[i] > 0 then write(ind[i]);

end.

Еще одно решение этой задачи предложил А. Тарасов (с. Красноусольский, Республика Башкортостан):

Var c:char;

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

I, j, k:integer;

begin

{ начальные значения }

for i:=0 to 9 do begin

num[i] := 0;

ind[i] := i;

end;

{ ввод данных, подсчет цифр в массиве num }

read(c);

while c <> '.' do begin

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

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

read(c);

end;

{ сортировка «пузырьком» }

for i:=0 to 8 do

for j:=8 downto i do

if num[ind[j]] > num[ind[j+1]] then begin

k:=ind[j]; ind[j]:=ind[j+1]; ind[j+1]:=k

end;

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

for i:=0 to 9 do

if num[ind[i]]<>0 then write(ind[i])

end.

В чем отличие? Во-первых, цикл ввода изменен так, чтобы избавиться от условного оператора. Мы знаем, что по условию кроме цифр и точки никаких других символов быть не может, поэтому отдельно нужно обработать только точку. Для этого цикл с постусловием repeat заменен на цикл с предусловием while, оператор read перенесен в конец цикла, но перед циклом пришлось поставить еще один оператор read (иначе на первом проходе в переменной c будет неопределенное значение).

Во-вторых, здесь применяется сортировка по индексам. Элементы массива ind представляют собой уже не цифры, а индексы элементов массива num в отсортированном порядке. Поэтому при сортировке можно переставлять только индексы, а элементы массива num не трогать. За такую оптимизацию приходится расплачиваться менее понятной записью: к элементу отсортированного массива num приходится обращаться с помощью двойной адресации типа num[ind[i]], что означает «значение элемента массива num, номер которого находится в элементе массива ind с номером i». Это стандартный профессиональный прием, но для его использования нужно хорошо понимать, что вы делаете.

Ещё одно интересное решение задачи предложил Е.И. Тищенко (ОГОУ Полянская школа-интернат Рязанской обл.):

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