Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 466

Раздел: Delphi » Прочее
/ вопрос открыт /

Здравствуйте, уважаемые эксперты! У меня имеется программа , которая считает все буквы в тексте и показывает какая встречается чаще остальных. Но проблема в том, что она не учитывает регистр. То есть буква т и Т, она считает как две разные буквы. Просьба исправить это недоразумение.

Приложение:
  1. unit Main;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, StdCtrls, ExtCtrls, XPMan, Gauges;
  8.  
  9. type
  10. TMainForm = class(TForm)
  11. Memo: TMemo;
  12. Splitter1: TSplitter;
  13. Panel1: TPanel;
  14. GroupBox1: TGroupBox;
  15. StartButton: TButton;
  16. XPManifest: TXPManifest;
  17. ListBox: TListBox;
  18. Gauge: TGauge;
  19. procedure StartButtonClick(Sender: TObject);
  20. private
  21. { Private declarations }
  22. public
  23. { Public declarations }
  24. end;
  25.  
  26. var
  27. MainForm: TMainForm;
  28.  
  29. implementation
  30.  
  31. {$R *.dfm}
  32.  
  33. procedure TMainForm.StartButtonClick(Sender: TObject);
  34. var
  35. Letters: array[#32..#255] of Integer;
  36. Index, Len, p, op: Integer;
  37. cIndex, MaxIndex: Char;
  38. begin
  39. Len:= Length(Memo.Text);
  40. op:= 0;
  41. FillChar(Letters, SizeOf(Letters), 0);
  42.  
  43. for Index:= 1 to Len do
  44. begin
  45.  
  46. if (Memo.Text[Index] in [Low(Letters)..High(Letters)])
  47. then Inc(Letters[Memo.Text[Index]]);
  48.  
  49.  
  50. p:= Round(100 * Index / Len);
  51. if (p <> op)
  52. then begin
  53. Gauge.Progress:= p;
  54. op:= p;
  55. Application.ProcessMessages;
  56. end;
  57. end;
  58.  
  59.  
  60.  
  61. ListBox.Clear;
  62. MaxIndex:= #0;
  63. Index:= 0;
  64.  
  65. for cIndex:= Low(Letters) to High(Letters) do
  66. begin
  67. p:= Round(100 * Letters[cIndex] / Len);
  68.  
  69. if (Index < Letters[cIndex])
  70. then begin
  71. Index:= Letters[cIndex];
  72. MaxIndex:= cIndex;
  73. end;
  74. end;
  75.  
  76. if (MaxIndex <> #0)
  77.  
  78.  
  79. IntToStr(Round(100 * Letters[MaxIndex] / Len)) + '%)'),
  80.  
  81. MB_OK + MB_ICONINFORMATION);
  82.  
  83. end;
  84.  
  85. end.


mamont Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: mamont (статус: Посетитель)
Вопрос отправлен: 2 апреля 2008, 19:24
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Помфюк Владимир Степанович

Здравствуйте, mamont!
Исправте здесь
// Подсчёт статистики
if (Memo.Text[Index] in [Low(Letters)..High(Letters)])
then Inc(Letters[ ANSIUpperCase (Memo.Text[Index])]);
И все буквы будут считатся большими

Ответ отправил: Помфюк Владимир Степанович (статус: Абитуриент)
Время отправки: 2 апреля 2008, 19:35

Ответ #2. Отвечает эксперт: Вадим К

Здравствуйте, mamont!
Первое, от чего хочу застеречь - это использование в коде конструкций вида Memo.Text[Index] - лучше уж использовать строковую переменную - это не только добавит скорости, а и упростит разработку (код будет меньше) и кол-во ошибок.
Также никуда не годиться конструкция Application.ProcessMessage;
Посмотрите в приложение - там переписанный немного код, он должен работать

Приложение:
  1. procedure TMainForm.StartButtonClick(Sender: TObject);
  2. var
  3. Letters: array[#32..#255] of Integer;
  4. Index, Len, p, op: Integer;
  5. cIndex, MaxIndex: Char;
  6. s:string;
  7. begin
  8. s := ANSIUpperCase(Memo.text);
  9. Len:= Length(s);
  10. op:= 0;
  11. FillChar(Letters, SizeOf(Letters), 0);
  12.  
  13. for Index:= 1 to Len do
  14. begin
  15.  
  16. if (s[Index] in [Low(Letters)..High(Letters)])
  17. then Inc(Letters[s[Index]]);
  18.  
  19.  
  20.  
  21. p:= Round(100 * Index / Len);
  22. if (p <> op)
  23. then begin
  24. Gauge.Progress:= p;
  25. op:= p;
  26. Application.ProcessMessages;
  27. end;}
  28. end;
  29.  
  30.  
  31.  
  32.  
  33. ListBox.Clear;
  34. MaxIndex:= #0;
  35. Index:= 0;
  36.  
  37. for cIndex:= Low(Letters) to High(Letters) do
  38. begin
  39. p:= Round(100 * Letters[cIndex] / Len);
  40.  
  41. if (Index < Letters[cIndex])
  42. then begin
  43. Index:= Letters[cIndex];
  44. MaxIndex:= cIndex;
  45. end;
  46. end;
  47.  
  48. if (MaxIndex <> #0)
  49.  
  50.  
  51. IntToStr(Round(100 * Letters[MaxIndex] / Len)) + '%)'),
  52.  
  53. MB_OK + MB_ICONINFORMATION);
  54.  
  55. end;
  56.  


Ответ отправил: Вадим К (статус: Академик)
Время отправки: 2 апреля 2008, 21:24
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 8; последнее сообщение — 4 апреля 2008, 12:12; участников в обсуждении: 3.
mamont

mamont (статус: Посетитель), 2 апреля 2008, 20:15 [#1]:

Хм... Заменил как вы сказали, но появилась ошибка Incompatible types: 'Char' and 'String'. А где недоработка найти не могу.
mamont

mamont (статус: Посетитель), 2 апреля 2008, 22:01 [#2]:

Спасибо вам эксперты...Выручили
Вадим К

Вадим К (статус: Академик), 3 апреля 2008, 00:21 [#3]:

Здесь "спасибо" ещё балами меряется:)
Галочка "подтверждения прочтения" - вселенское зло.
Помфюк Владимир Степанович

Помфюк Владимир Степанович (статус: Абитуриент), 3 апреля 2008, 10:41 [#4]:

Да. Недоработка моя… точнее недопроверяние. "Считалку" оставте как была, а перед ней (перед циклом) добавте
Memo.Text:=ANSIUpperCase(Memo.Text).
Вадим К

Вадим К (статус: Академик), 3 апреля 2008, 23:07 [#5]:

to Помфюк Владимир Степанович:
так лучше не делать - работать то оно будет, но будет и текст модифицироваться - это уже не то, что было поставленно в задаче
Галочка "подтверждения прочтения" - вселенское зло.
Помфюк Владимир Степанович

Помфюк Владимир Степанович (статус: Абитуриент), 4 апреля 2008, 10:10 [#6]:

Если текст надо сохранить нетронутым вводится ещё одна String-переменная и всего-то…
Вадим К

Вадим К (статус: Академик), 4 апреля 2008, 12:06 [#7]:

А теперь внимательно читаем мой ответ и медетируем:)
Галочка "подтверждения прочтения" - вселенское зло.
Помфюк Владимир Степанович

Помфюк Владимир Степанович (статус: Абитуриент), 4 апреля 2008, 12:12 [#8]:

Со мной бывает… :-D

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:54
Выполнено за 0.02 сек.