Помощь - Поиск - Пользователи - Календарь
Полная версия: Про множественный тип
Форум «Всё о Паскале» > 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.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.