Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на языке Pascal


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Pascal

Выпуск № 191
от 08.07.2006, 09:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 194, Экспертов: 46
В номере:Вопросов: 1, Ответов: 3


Вопрос № 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
Комментарий оценки:
Спасибо! Попробую.


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.34 от 01.06.2006
Яндекс Rambler's Top100

В избранное