Часто встречается задача, в которой нужно найти количество вхождения определенного символа в строку. Например — сколько раз встречается ! в строке пользователя. На умении решить данную задачу можно решить более сложную задачу — подсчитать частоту символов в строке, результат вывести в формате — символ — количество.
Если решать задачу напрямую — то нужно вводить переменные под каждый символ и их будет очень много. Затем нужно писать команду условия и считать каждый символ по отдельности. Как вариант
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.