На вход программе (как вариант, из входного файла text.dat) подаётся текст на английском языке. Ввод этих символов заканчивается точкой (другие символы, отличные от «.» во входных данных отсутствуют; в программе на языке Бейсик символы можно вводить по одному в строке, пока не будет введена точка). Требуется написать как можно более эффективную программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет определять и выводить на экран, какая английская буква встречается во входной последовательности чаще всего и сколько именно раз. Строчные и прописные буквы при этом не различаются. Если таких букв несколько, то программа должна выводить на экран ту из них, которая стоит по алфавиту раньше.
Например, пусть файл содержит следующую информацию:
It is not a simple task. Yes!
Тогда чаще всего встречаются буквы I, S, T. (слово Yes в подсчете не участвует, так как расположено после точки). Следовательно, в данном случае, программа должна вывести
I 3.
Программа читает текст до точки один раз, подсчитывая в массиве, хранящем 26 целых чисел, количество вхождений каждой из букв. Сам текст при этом не запоминается. Затем в этом массиве шлется первое вхождение максимального элемента. Баллы начисляются только за программу, которая решает задачу хотя бы для частного случая (например, для строк, состоящих не более чем из 255 символов).
| Бейсик | Паскаль |
|---|---|
DIM i, imах, с, a(26) AS INTEGER OPEN "TEXT.DAT" FOR INPUT AS #1 S$ = INPUT$(1,#1) DO WHILE NOT (S$ = ".") c = ASC(S$) IF(c>=ASC("A")AND c<=ASC("Z")) THEN с = с - ASC("A") + 1 ENDIF IF(c>=ASC("a")AND c<=ASC("z")) THEN с = с - ASC("a") + 1 ENDIF IF(c >=1 AND c<=26) THEN a(c)=a(c)+1 S$ = INPUT$(1,#1) LOOP imax = 1 FOR i = 2 TO 26 IF a(i) > a(imax) THEN imax = i NEXT i PRINT CHR$(imax + 64), a(imax) END | var a:array['A'..'Z'] of integer; c, cmax: char; begin assign(input'text. dat'); reset(input); for c:='A'to'Z' do a[c]:=0; repeat read(input, c); c:=upcase(c); if c in['A'...'Z']then a[c]:=a[c]+1 until c='.'; cmax := 'A'; for c:='B'to'Z'do if a[c] > a[cmax] then cmax := c; writeln(cmax,' ',a[cmax]) end. |

