Здесь левый столбец составляют буквы, а правый – количество этих букв в некотором файле. Упростим себе задачу, ограничившись подсчетом лишь маленьких латинских букв от «a» до «z».
Для подсчета общего количества символов в файле хватило бы одного счетчика. Но здесь 26 букв, а значит и счетчиков надо столько же. Массив счетчиков напрашивается сам собой, его тип можно объявить так:
type TCounts = array [1..26] of integer;
Однако не спешите этого делать. Вспомните о том, что индексом массива может быть любой порядковый тип данных. А к ним, наряду с числами, относятся символьный и даже булев тип. Стало быть, допустимы такие массивы.
type TA = array ['A'..'F'] of integer;
TB = array [false..true] of integer;
Первый из них содержит 6 элементов, а индексируется символьным выражением. Второй содержит всего два элемента, индексы которого имеют булев тип. В решаемой задаче напрашивается символьная индексация, а потому объявим тип для массива счетчиков так:
type TCounts = array ['a'..'z'] of integer;
Теперь символ, прочитанный из файла, можно использовать как индекс в массиве счетчиков, надо лишь предварительно проверить его на попадание в нужный диапазон.
Входным файлом программы будет текст её самой же. Вот она, простая и красивая.
{ P_40_3 – Подсчет количества различных букв в файле }
{ Тип массива из целых чисел, индекс – символьный }
type TCounts = array ['a'..'z'] of integer;
var Counts : TCounts; { массив из счетчиков букв }
c: char; { текущий символ файла, он же – индекс счетчика }
F : text; { файл с текстом программы }
begin {--- главная программа ---}
{ Перед началом подсчета все счетчики обнуляем }
for c:='a' to 'z' do Counts[c]:=0;
{ Открываем входной файл для чтения }
Assign(F, 'P_40_3.pas'); Reset(F);
while not Eof(F) do begin { Цикл чтения и подсчета букв }
Read(F, c); { чтение одного символа из файла }
if c in ['a'..'z'] { если символ в нужном диапазоне }
then Counts[c]:= Counts[c]+1; { наращиваем его счетчик }
end;
Close(F);
{ После подсчета распечатаем все счетчики }
for c:='a' to 'z' do Writeln (c, Counts[c]:6);
Write('Нажмите Enter'); Readln;
end.
Здесь осталась лишь одна шероховатость – при печати результатов часть строк не поместится на экране. Так направьте вывод в текстовый файл. Или слабо?