| 
| 
 | Вопрос # 1 338/ вопрос решён / | 
 |  Доброго времени суток, уважаемые эксперты!
 Подскажите, как решить следующую задачку: "Определите, какая из заданых букв встречается в тексте чаще остальных".
 
 Букв - неопределенное число, задается пользователем.
 Необходимо также использовать MEMO для вводимого текста.
 Программа должна считать все заданные буквы во введенном тексте а затем определять, какая буква встречается чаще остальных.
 По-возможности - внешний вид программы;
 Язык - Delphi 7 Object pascal.
 
|  |   Вопрос задал: Upgr3id (статус: Посетитель)Вопрос отправлен: 13 февраля 2008, 19:16
 Состояние вопроса: решён, ответов: 2.
 |  Ответ #1. Отвечает эксперт: min@y™ Вот, написал тебе пример. подсчёт статистики вхождения букв КИРИЛЛИЦЫ в тексте без учёта регистра символов. Примечание: буквы "ё" и "Ё" игнорируются.
 
 После подсчёта выдаётся сообщение о букве, которая встречается чаще всех.
 
 З.Ы. В прицепе - весь проект.
 К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)
 
 Приложение:Переключить в обычный режим procedure TMainForm.StartButtonClick(Sender: TObject);var   Index, Len, p, op: Integer;  cIndex, MaxIndex: Char;begin  Len:= Length(Memo.Text);  op:= 0;  FillChar(Letters, SizeOf(Letters), 0);   for Index:= 1 to Len do    begin           then Inc(Letters[Memo.Text[Index]]);           then Inc(Letters[Char(Integer(Memo.Text[Index]) + $20)]);        p:= Round(100 * Index / Len);      if (p <> op)        then begin               Gauge.Progress:= p;               op:= p;               Application.ProcessMessages;             end;    end;     ListBox.Clear;  MaxIndex:= #0;  Index:= 0;   for cIndex:= Low(Letters) to High(Letters) do    begin      p:= Round(100 * Letters[cIndex] / Len);       if (Index < Letters[cIndex])        then begin               Index:= Letters[cIndex];               MaxIndex:= cIndex;             end;    end;   if (MaxIndex <> #0)                                        IntToStr(Round(100 * Letters[MaxIndex] / Len)) + '%)'),                                 MB_OK + MB_ICONINFORMATION); end;
|  | Ответ отправил: min@y™ (статус: Доктор наук)Время отправки: 14 февраля 2008, 09:01
 Оценка за ответ: 5
 |  Ответ #2. Отвечает эксперт: Помфюк Владимир Степанович Здравствуйте, Upgr3id!В предыдущем ответе я бы заменил
 Letters: array['а'..'я'] of Integer;
 на
 Letters: array[char] of Integer;
 а то программа не посчитает латиницу и цифры (а кто сказал что их не начо считать?) , убрал проверки
 if (Memo.Text[Index] in
 (Если надо не учитывать регистр, то можно написать Inc(Letters[ANSIUpperCase(Memo.Text[Index])]); , но опять-таки в условии не сказано ничего о регистре)
 и, чтобы не получилось никаких гадостей то вконце
 for cIndex:= Low(Letters) to High(Letters) do
 заменить на
 for cIndex:='0' to High(Letters) do
 и таким образом урезать все непечатные символы, а также добавить
 if Letters[cIndex]<>0 then
 ListBox.Items.Add('"' + cIndex + '": ' + IntToStr(Letters[cIndex]) + ' раз (' + IntToStr(p) + '%)');
 чтобы не показывать отсутсутвующие в тексте буквы.
 
 Мини-форум вопросаВсего сообщений: 2; последнее сообщение — 25 февраля 2008, 21:27; участников в обсуждении: 2. 
|   | Dron (статус: Студент), 13 февраля 2008, 20:07 [#1]:И в чём проблема? Вы хотите, чтобы эксперты полностью написали программу за вас? Скажите, на каком именно этапе у вас возникают трудности.
 С уважением. |  
|   | Upgr3id (статус: Посетитель), 25 февраля 2008, 21:27 [#2]:Не подскажете, как будет выглядеть блок-схема к этой программе? |  31 января 2011, 19:30: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |