Форум » Алгоритмизация и программирование » вопрос 6 » Ответить

вопрос 6

Якутина Н.С.: Уважаемый, Константин Юрьевич, спасибо Вам за ответ на мой вопрос. У меня возник вопрос по заданию С4: На вход подаются строчные английские буквы. Ввод этих символов заканчивается точкой ( другие символы, отличные от "." и букв "a" ..."z", во входных данных отсутствую.) Требуется написать как можно более эффективную программу, например программирования Borland Pascal 7.0, которая будет печатать буквы,встречающиеся во входной последовательности, в порядке увеличения частоты их встречаемости. Каждая буква должна быть распечатана один раз. Точка при этом не учитывается. Если какие-то буквы встречаются одинаковое число раз, то они выводятся в алфавитном порядке. Например, пусть на вход подаются следующие символы: baobaba В данном случае программа должна вывести oab С уважением Якутина Надежда Семеновна.

Ответов - 1

Поляков: Здравствуйте! Эта задача полностью аналогична задаче 25 из файла C4.doc (решение с подробным объяснением приведено в файле answC4.doc на страницах 43-45). Отличие состоит в том, что здесь используются не цифры, а латинские буквы, но суть не меняется. Немного усложняется техника - нужно использовать функции Chr и Ord для перехода от кода к символу и обратно. Решение может быть, например, такое:[pre2] program qq; var c:char; num, ind:array[0..25] of integer; m, j, k: integer; с:char; begin { начальные значения } for m:=0 to 25 do begin num[m] := 0; ind[m] := m; end; { ввод данных, подсчет количества букв в массиве num } read(c); while c <> '.' do begin if ('a' <= c) and (c <= 'z') then begin k := Ord(c) - Ord('a'); num[k] := num[k] + 1; end; read(c); end; { сортировка "пузырьком" } for m:=0 to 24 do for j:=24 downto m 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 m:=0 to 25 do if num[ind[m]]<>0 then write(Chr(Ord('a')+ind[m])) end.[/pre2]



полная версия страницы