Помощь - Поиск - Пользователи - Календарь
Полная версия: Про множественный тип
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Анютка
Вроде девушка я не тупая, но не могу понять sad.gif
Условие:
Цитата
Определить какие символы встречаются в строке и посчитать сколько раз встречается каждый из них. В алфавитном порядке вывести обнаруженные символы и кол-во их вхождений в строку.
volvo
GoTo "Поиск":
Задача на обработку текста
Анютка
Получилось:

program volvo;


var a : array[0..255] of byte;
procedure count(s : string);
var i : integer;

begin
for i:=1 to length(s) do inc(a[ord(s[i])]);

end;

procedure WriteAr;


var i : integer;
begin

for i:=0 to 255 do
if (a[i]<>0) then
Writeln(chr (i),' - ',a[i], ' раз ');readln;
end;

var b:string;


begin

writeln ('Введите строку: ');readln(B);
count (B); WriteAr; readln; end.




Поправьте, если что не так ...
volvo
Анютка, а почему нельзя было оставить:
var a : array[#0..#255] of byte;
, как было изначально? Зачем лишние преобразования нужны?

Ну, конечно, программа работает, но она бы выглядела гораздо красивее... rolleyes.gif
Анютка
А как решить задачу с помощью множественного типа, что-то я не могу понять ...
volvo
Анютка, с помощью только множественного - не получится. Множество не в состоянии хранить информацию о том, сколько раз каждый символ встречался в тексте. Вот если бы просто отсортировать все встречающиеся символы в порядке возрастания - тогда это задача на множества, а так получится просто "притягивание за уши"...
Анютка
А в моей задаче вообще не используется множ. тип.

И скажите пожалуйста, как изменить программу с помощью
var a : array[#0..#255] of byte;


Ведь я такая неопытная ещё sad.gif
klem4
uses crt;
var
c : array[char] of byte;
ch: char;
s : string;
i : integer;

begin

clrscr;

write('s='); readln(s);

for i := 1 to length(s) do
for ch := #32 to #255 do
if s[i]=ch then
inc(c[ch]);

for ch := #32 to #255 do
if c[ch]<>0 then
writeln(ch,' ',c[ch]);

readln;

End.


Volvo же давал тебе ссылку ... там поправить то оставалось чуть-чуть
volvo
program volvo;
var
a : array[#0..#255] of byte;
chars: set of char;

procedure count(s : string);
var i : integer;
begin
for i := 1 to length(s) do begin
inc(a[ s[i] ]); chars := chars + [s[i]];
end;
end;

procedure WriteAr;
var i: char;
begin
for i:=#0 to #255 do
if i in chars then
Writeln(i,' - ', a[i], ' раз ');
readln;
end;

var b: string;
begin
writeln('Введите строку: '); readln(B);
chars := []; count (B);
WriteAr;
readln;
end.
Анютка
To: klem4
А можно как-нибудь прокомментировать программу? И что значит "#" ?
Почему именно от 32 ??

И всё-таки, как решить программу с помощью множеств, я не говорю, что только с помощью множест. типа, просто с его использованием.
var b: Set of 0..7; и т.п.
volvo
Анютка, ты мой предыдущий пост читала?
  chars: set of char;
в нем видела? Это что, не множество по-твоему?
Анютка
Я говорила про задачу klem4. Как её можно изменить? чтобы там присутсвовал множественный тип.

М
Зачем ? blink.gif Volvo привел тебе программу (последний его пост) в ней используется так сильно тебе нужный множественный тип !
chars: set of char; { <--- это именно он ! }

читай внимательней что тебе пишут ...
klem4

Анютка
Потому что твоя программа проще, у меня конкретный вопрос: можно ди изменить твою программу?

To: volvo
Можно как-нибудь прокомментировать твою программу?
volvo
Анютка, ссылку на программу которую чуть-чуть подправил klem4, я дал во втором (!!!) посте. Ты ее зачем-то всю поменяла, а когда тебе снова вернули почти то, что было, тебе нужны комментарии? Комментариев не будет.
Altair
По просьбе...
открываю тему. и еще один вариант ...
(придумывал велосипед опять же по просьбе).
ЧТо бы только с множествами.

var
s:string; {входная строка}
m:set of char;{множество встетивщихся символов}
I,j,count:byte;{счетчики}
begin
m:=[];{обнуляем множество}
readln(s);{вводим строку}
{проходим по длинне строки и включаем в множетсво встетивщиеся сиволы}
for i:=1 to length (s) do include(m,(s[i]));
{проходим коды символов с 32 до 255 (от пробела по всем алфавитам.. до конца)}
for i:=32 to 255 do
{если символ входит в множество}
if chr(i) in m then begin
{исключаем из множетсва, что бы исключить повторы}
exclude(m,chr(i));
{обнуляем количество вхождений}
count:=0;
{просматриваем всю строку и если находим этот символ, увеличиваем КОУНТ }
for j:=1 to length(s) do if s[j]=chr(i) then inc(count);
{вывод результата для текущего символа.}
writeln(chr(i),' ',count);

end;
readln;
end.


p.s. рекомендую алгоритм и программу volvo.

без процедур (по просьбе).
program volvo_modify;
var
a : array[#0..#255] of byte;
chars: set of char;
i : integer;
b: string;
c:char;
begin
writeln('Enter string: '); readln(B);
chars := [];
for i := 1 to length(b) do begin
inc(a[ b[i] ]); chars := chars + [b[i]];
end;
for c:=#0 to #255 do
if c in chars then
Writeln(c,' - ', a[c], ' raz ');
readln;
readln;
end.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.