Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.01.2013, 10:17   #1
danil123
Пользователь
 
Регистрация: 06.07.2012
Сообщений: 80
По умолчанию Оптимизация программы

Задача
На вход программы подается текст на английском языке, заканчивающийся точкой (другие символы “.” в тексте отсутствуют). Требуется написать программу, которая будет определять и выводить на экран английскую букву, встречающуюся в этом тексте чаще всего, и количество там таких букв. Строчные и прописные буквы при этом считаются не различимыми. Если искомых букв несколько, то программа должна выводить на экран первую из них по алфавиту. Например, пусть файл содержит следующую запись:
It is not a simple task. Yes!
Чаще всего здесь встречаются буквы I, S и T (слово Yes в подсчете не учитывается, так как расположено после точки). Следовательно, в данном случае программа должна вывести два символа, разделенных пробелом: I 3

Мое решение:
Код:
var m:array['a'..'z'] of integer;
max:integer;
c,ch:char;
begin
read(c);
while c<>'.' do 
begin
read(c);
if c in ['a'..'z'] then 
m[c]:=m[c]+1;
end;
max:=0;
for ch:= 'a' to 'z' do
if m[ch]>max then max:=m[ch];
for ch:= 'a' to 'z' do
if m[ch]=max then
begin
writeln(ch,' ',max);
halt(0);
end;
end.
Программа почему-то выводит s 3 вместо i 3.
Как это исправить и есть ли возможность улучшить и оптимизировать программу?
danil123 вне форума Ответить с цитированием
Старый 20.01.2013, 10:32   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Это потому что у вас I и i только на бумаге в задании неразличимы, а в программе этого нигде не прописано. Поэтому букв s (3) больше чем букв i (2).

Попробуйте это:

Код:
read(c);
c:=lowercase(s);
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 20.01.2013, 10:37   #3
danil123
Пользователь
 
Регистрация: 06.07.2012
Сообщений: 80
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
Это потому что у вас I и i только на бумаге в задании неразличимы, а в программе этого нигде не прописано. Поэтому букв s (3) больше чем букв i (2).

Попробуйте это:

Код:
read(c);
c:=lowercase(s);
поменял код таким образом, все равно так же
danil123 вне форума Ответить с цитированием
Старый 20.01.2013, 11:03   #4
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Во-первых, read(c) не будет считывать последовательно набор символов с клавиатуры - это можно трассировкой с брекпойнтом на этом месте проверить. тут нужно что-то навроде readkey. Но это только в оригинальном паскале доступно, насколько я понимаю, а аналогов в консоли Дельфи, например, я не знаю

Во-вторых, lowercase - строковая функция, о чем я как-то забыл упомянуть. То есть само преобразование в нижний регистр будет идти через строку:

Код:
s:=lowercase(c);
c:=s[1];
В-третьих, не проще ли вместо посимвольного ввода ввести всю строку, а потом разбирать ее до символа точки?
Типа вот такого (плюс небольшая оптимизация - зачем сохранять максимальное значение, если оно уже есть в массиве?):

Код:
var m:array['a'..'z'] of integer;

max:char;
c,ch:char;
s:string;
i: integer;

begin
readln(s);
if pos('.',s)=0 then begin
  WriteLn('Строка должна содержать точку!');
  readln(s);
end;
s:=lowercase(s);
i:=1;
c:=s[1];
while c<>'.' do begin
  if c in ['a'..'z'] then
  m[c]:=m[c]+1;
  inc(i);
  c:=s[i];
end;
max:='a';
for ch:= 'b' to 'z' do
  if m[ch]>m[max] then max:=ch;
writeln(max,' ',m[max]);
ReadLn;
end.
И кстати, обратите внимание, что Ваш halt(0) нужно бы заменить на более подходящий к случаю break - так как halt завершает программу, а бряк - цикл, и дает насладиться выводом результата
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 20.01.2013 в 11:07.
Sciv вне форума Ответить с цитированием
Старый 20.01.2013, 11:10   #5
danil123
Пользователь
 
Регистрация: 06.07.2012
Сообщений: 80
По умолчанию

спс, разобрался
danil123 вне форума Ответить с цитированием
Старый 20.01.2013, 17:59   #6
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
Во-первых, read(c) не будет считывать последовательно набор символов с клавиатуры - это можно трассировкой с брекпойнтом на этом месте проверить.
С чего это вдруг не будет-то?
Somebody вне форума Ответить с цитированием
Старый 20.01.2013, 18:19   #7
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
С чего это вдруг не будет-то?
Извиняюсь, это я поспешил и очень некорректно сформулировал. Читать-то символы он будет, вот только после ввода каждого символа он будет ждать нажатия Enter. Либо после ввода строки будет ждать энтера, а потом уже расковыривать строчку по символам. А если в ней не будет точки - получаем бесконечный цикл и рантайм-еррор.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 20.01.2013, 19:05   #8
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
А если в ней не будет точки - получаем бесконечный цикл и рантайм-еррор.
А это почему? Перевод строки нормально прочитается в этот char и пропустится, а цикл в любом случае до точки дойдёт, где бы она ни была.
Somebody вне форума Ответить с цитированием
Старый 20.01.2013, 19:34   #9
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
А это почему?
А хз. Но у меня в дельфи 7 с этой программой так и случалось, ежли строку без точки вводил

Вот посимвольно вводить не пробовал (типа "символ" - "энтер" - "снова символ" и тд).
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация программы Семоха Валерий Помощь студентам 1 26.05.2012 14:04
Оптимизация программы 0479 Помощь студентам 7 09.03.2011 17:15
Оптимизация программы Lenya Помощь студентам 2 05.01.2011 18:56
Оптимизация программы!!! $T@LKER Общие вопросы Delphi 10 08.08.2010 21:23