Подсчет количества разных символов в строке.

Часто встречается задача, в которой нужно найти количество вхождения определенного символа в строку. Например — сколько раз встречается ! в строке пользователя. На умении решить данную задачу можно решить более сложную задачу — подсчитать частоту символов в строке, результат вывести в формате — символ — количество.

Если решать задачу напрямую — то нужно вводить переменные под каждый символ и их будет очень много. Затем нужно писать команду условия и считать каждый символ по отдельности. Как вариант
if s[i]=’a’ then Count_a:=Count_a+1;
if s[i]=’b’ then Count_b:=Count_b+1;
и так далее и для заглавных букв, и для знаков препинания ….Много букаф — не асилил…

Но задачу можно оптимизировать, используя функции ord и chr
ord(аргумент) — возвращает код символа
chr(аргумент) — возвращает символ по коду

Например
ord(‘Z’) -> 90 //90 — код символа Z
chr(90) -> ‘Z’ // по коду 90 получаем Z
Функции взаимно обратны.

Каким образом это нам поможет? Кодовая таблица символов — занимает значения 1..255. Используем массив на 255 элементов. Извлекаем символ из строки, берем его код и по нему обращаемся к элементу массива с таким же индексом и увеличиваем его на 1.
Для вывода результата — по индексу массива возвращаем символ и печатаем само значение массива.
Но мы усложним нашу задачу алгоритмами работы с одномерным массивом, а именно:
— поиск минимального элемента
— поиск максимального элемента
— нахождение суммы элементов массива
— вывод элементов массива, что соответствуют критерию
И теперь на практике это выглядит так:

 

uses crt;
var
symbol: array [1..255] of integer;//количество символов
s:string;// базовая строка
i:integer; // счетчик цикла
cod:integer;//код символа
count_dif, min, max, sum:integer;
begin
//обнуляем массив
for i:=1 to 255 do
symbol[i]:=0;

write(' Enter string: ');
readln(s); //ввод строки

writeln('/-------------------------------------------/');
for i:=1 to length(s) do  //смотрим поочередно символы
begin
cod:=ord(s[i]);  //берем код символа
inc(symbol[cod]);   // увеличиваем элемент массива с индексом cod на 1
end;
writeln('/-------------------------------------------/');

//Output result
writeln('Print symbol and count');
for i:=1 to 255 do  //смотрим массив
if symbol[i]<>0 then writeln(chr(i),' ',symbol[i]); // символ и его количество
writeln('Press Enter to continue...') ;
readln;
writeln('/-------------------------------------------/');

//Search count different symbols
count_dif:=0;
 for i:=1 to 255 do 
if symbol[i]<>0 then inc(count_dif); //подсчет разных символов
 writeln ('Count different symbol=',count_dif);
writeln('Press Enter to continue...');
readln;
writeln('/-------------------------------------------/');

//Search min count symbols
min:=32000;//для поиска  минимума - начальное значение максимальное
for i:=1 to 255 do 
if (symbol[i]<>0) and (symbol[i]<min) then min:=symbol[i];//поиск минимального количества
writeln ('Min count=',min);
writeln('Press Enter to continue...');
readln;
writeln('/-------------------------------------------/');

//Search and output min count symbols
writeln('output symbols with min count ');
  for i:=1 to 255 do  
if symbol[i]=min then writeln(chr(i),' ',symbol[i]);
writeln('Press Enter to continue...');
readln;
writeln('/-------------------------------------------/');

//Search max count symbols
max:=0;//для поиска  максимума - начальное значение минимальное
 for i:=1 to 255 do 
if (symbol[i]<>0) and (symbol[i]>max) then max:=symbol[i];
writeln ('Max count=',max);
writeln('Press Enter to continue...');
readln;
writeln('/-------------------------------------------/');

//Search and output max count symbols
writeln('Output symbols with max count');
   for i:=1 to 255 do 
if symbol[i]=max then writeln(chr(i),' ',symbol[i]);
writeln('Press Enter to continue...');
 readln;
writeln('/-------------------------------------------/');

 //Analytics data symbol in percent
 writeln('Analytics data symbol in percent...');
 sum:=0;
 for i:=1 to 255 do 
sum:=sum+symbol[i];// find sum count symbols for percent
 
 for i:=1 to 255 do  
if symbol[i]<>0 then writeln(chr(i),' ',symbol[i]:3,' ', (symbol[i]/sum)*100:2:2,'%');
writeln('Press Enter to Exit');
readln;
writeln('/-------------------------------------------/');


end.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Подписаться
Уведомить о
guest
0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии