СДАМ ГИА: РЕШУ ЕГЭ
Образовательный портал для подготовки к экзаменам
Информатика
≡ информатика
сайты - меню - вход - новости




Задания
Версия для печати и копирования в MS Word
Задание 27 № 3793

На вход программе (как вариант, из входного файла 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.