Консультация № 137936
27.05.2008, 01:53
0.00 руб.
0 2 2
програмирование на паскаль. Для каждого символа заданого текста указать сколько раз он встречается в тексте.Сообщение об одном символе должно печататься не более одного раза.

Пожалуйста помогите решить эту трудную задачу.

Обсуждение

давно
Профессор
401888
1232
27.05.2008, 12:12
общий
это ответ
Здравствуйте, Клаткевич Денис Консантинович!
Решение Вашей "трудной" задачи в два действия (перебор строки и вывод на экран) с необходимыми пояснениями в приложении.

Приложение:
uses crt;var s:string; i,j,k:integer;beginclrscr;write(‘Text: ‘);readln(s);{символы, которые можно вывести на экран начинаются с номера кода 32 (пробел)}i:=32; while i<=255 do {перебираем все символы} begin k:=0; for j:=1 to length(s) do if chr(i)=s[j] then {если они встречаются в строке} begin k:=k+1; {считаем их} end; if k>0 then {если символ встречен хоть раз, выодим его и количество на экран} writeln(‘Simvol ‘,chr(i),‘ vstrechaetsa ‘,k,‘ raz(a)‘); i:=i+1; end;readlnend.
Неизвестный
27.05.2008, 12:35
общий
это ответ
Здравствуйте, Клаткевич Денис Консантинович!В вашем случае можно воспользоваться либо статическим массивом диапазона от 0 до 255, чтобы можно было отслеживать количество вхождения в файл всех символов, в том числе и служебных (коды которых от 0 до 31 кодовой страницы), либо воспользоваться динамическими структурами данных, такими как списки. В приложении приведу основной момент реализации первого метода (проверять написанное мной некогда но суть должна быть понятна). Если нужно будет пояснение по спискам то напишите на минифоруме (тут будет пример немного больше)


Приложение:
...VarSymbol: array[0..255] of word; {Предполагается что один символ может в тексте встречаться не более 65535 раз}f:file of byte; {предполагаю что вы текст будете читать с файла}buf:byte;Flag:boolean;c:char;Beginassign(f,‘test.txt‘);reset(f);{Далее цикл чтения данных из файла}while not(Eof(f)) do {пока не конец файла}beginread(f,buf);{Читаем байт, он же символ из файла в переменную}inc(Symbol[buf]); {Данной операцией мы сделали увеличение на единицу число повторений символа с кодом в переменной buf, используя данных код в качестве индекса массива}end;Close(f); {Закрываем файл}{Далее вы осуществляете вывод интересующей вас информации о количестве повторений символа, например следующим образом}WriteLn(‘Для получения информации о повторении любого символа в файле наберите его код и нажмите Enter. Для выхода нажмите два раза ESC‘);Flag:=false;Repeat {$i-} {Отключаем проверку ввода/вывода что бы при вводе не получилась у нас исключительная ситуация} readln(buf); {$I+} If IOResult<>0 then Begin WriteLn(‘Введен неверный код символа!!!‘); Continue; End; WriteLn(‘Символ с кодом ‘,buf,‘ был встречен ‘,Symbol[Buf],‘ раз‘); If buf = 27 then {Данное условие нужно чтобы отследить двойное "нажатие" ESC, то есть точнее ввода числа 27} Begin If flag then break Else Flag:=True; End Else Flag:=false {If buf = 27 then}Until false;End. если же вам не надо вводить коды символов а хотите чтобы программа реагировала на нажатие букв то вместо ReadLn в цикле вывода используете функцию ReadKey, которая возвращает символ CHAR... и тогда немного модифицируем наш цикл ввода ....Repeat c:=ReadKey; If c = #27 then {Данное условие нужно чтобы отследить двойное нажатие ESC} Begin If flag then break Else Flag:=True; End Else Flag:=false {If c = #27 then} Case c of #13: WriteLn(‘Символ с кодом ‘‘ENTER‘‘ был встречен‘ ,Symbol[ord(c)],‘ раз‘); #27: WriteLn(‘Символ с кодом ‘‘ESC‘‘ был встречен‘ ,Symbol[ord(c)],‘ раз‘); Else WriteLn(‘Символ с кодом ‘,c,‘ был встречен ‘,Symbol[ord(c)],‘ раз‘); Until false;End.{Ну вот примерно так должно быть}
Форма ответа