Вопрос № 47947: Пожалуйста, помогите решить такую задачу.
Во входном файле text.dat содержится текст на английском языке, заканчивающийся точкой (другие символы “.” в этом файле отсутствуют). Требуется написать программу на языке Паскаль или Бейсик, которая буде...
Вопрос № 47.947
Пожалуйста, помогите решить такую задачу.
Во входном файле text.dat содержится текст на английском языке, заканчивающийся точкой (другие символы “.” в этом файле отсутствуют). Требуется написать программу на языке Паскаль или Бейсик, которая будет определять и выводить на экран английскую букву, встречающуюся в этом тексте чаще всего, и количество там таких букв. Строчные и прописные буквы при этом считаются не различимыми. Если искомых букв несколько, то программа должна выводить на экран первую из них по алфавиту. Например, пусть файл содержит следующую
запись: It is not a simple task. Yes! Чаще всего здесь встречаются буквы I, S и T (слово Yes в подсчете не учитывается, так как расположено после точки). Следовательно, в данном случае программа должна вывести два символа, разделенных пробелом: I 3
Можно создать массивы на каждую букву, и в цикле плюсовать при обнаружении буквы. В рез-те выводить букву у которой больше получилось число. Но такое решение громоздко, можут предложите попроще?
Отправлен: 02.07.2006, 19:25
Вопрос задал: ChelSt0rM (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Евгения
Здравствуйте, ChelSt0rM!
по этой ссылке вроде представлен неплохой алгоритм решения подобной задачи:
http://ipg.h1.ru/lessons/pascal_sourse/les06.html
а быстрее вы вряд ли как-то посчитаете - все равно нужно в чем-то хранить данные о количестве каждой буквы в тексте, а где их еще хранить, кроме как в массиве?
Счастливо!
--------- Я не волшебник, я только учусь... А разве кто-то обещал, что будет легко?
Ответ отправила: Евгения (статус: 7-ой класс)
Ответ отправлен: 02.07.2006, 20:53
Отвечает: Ayl
Здравствуйте, ChelSt0rM!
Еще вариант - организовать цикл для каждой буквы и просматривать весь текст с подсчетом количества этих букв в тексте. Тогда нужны будут только 3 переменные (текущая анализируемая буква является счетчиком цикла): количество повторений текущей буквы, максимальное количество повторений и соответствующая буква.
Вот шаблон для решения:
Var
ch, m_ch : Char;
count, m_count : Word;
...
count := 0; m_ch := '.';
for ch := 'A' to 'Z' do
begin
count := GetCountCharInText (ch);
if count > m_count then begin
m_count := count;
m_ch := ch;
end;
end;
writeln (m_ch, ' ', m_count);
...
Но это решение медленнее решения с массивом в 26 раз. При достаточно большом тексте его желательно просмотреть только 1 раз, а не 26.
Так что я не могу рекомендовать данный алгоритм к использованию, ответил только чтобы показать альтернативу и объяснить, что она проигрывает решению с массивом.
Кстати, а почему решение с массивом громоздко? На мой взгляд, это самое оптимальное и красивое.
--------- Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Академик) Россия, Санкт-Петербург ICQ: 5163321 ---- Ответ отправлен: 03.07.2006, 12:27
Отвечает: Gh0stik
Здравствуйте, ChelSt0rM!
Вот посмотрите на мой вариант решениея Вашей задачи (с использованием массива):
uses crt;
label m1;
const buk=['A'..'Z'];
var i,mx:word;
masbuk:array ['A'..'Z'] of word;
c,ix:char;
st:string;
f:text;
begin clrscr;
for c:='A' to 'Z' do masbuk[c]:=0;
assign(f,'text.dat');
reset(f);
while not eof(f) do
begin
readln(f,st);
for i:=1 to length(st) do
begin
if (chr(ord(st[i])-32) in buk) then c:=chr(ord(st[i])-32) else c:=st[i];
if (c in buk) then inc(masbuk[c])
else if st[i]='.' then goto m1;
end;
end;
close(f);
m1:
mx:=masbuk['A']; ix:='A';
for c:='A' to 'Z' do
if mx writeln(' ',ix,'/',masbuk[ix]);
readln;
end.
Причем обращаю Ваше внимание чтобы найти самую часто встречающуюся букву просто нужно найти максимальный элемент массива...
Удачи!!!
--------- Господь Бог - это всего лишь сверхмощный генератор случайных чисел, в соответствии с которыми сочетаются события на Земле. Генератор случайных чисел - и только.
Ответ отправил: Gh0stik (статус: Студент)
Ответ отправлен: 06.07.2006, 12:45 Оценка за ответ: 5 Комментарий оценки: Спасибо! Попробую.