|
Вопрос # 1 466/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты! У меня имеется программа , которая считает все буквы в тексте и показывает какая встречается чаще остальных. Но проблема в том, что она не учитывает регистр. То есть буква т и Т, она считает как две разные буквы. Просьба исправить это недоразумение.
Приложение: Переключить в обычный режим- unit Main;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls, ExtCtrls, XPMan, Gauges;
-
- type
- TMainForm = class(TForm)
- Memo: TMemo;
- Splitter1: TSplitter;
- Panel1: TPanel;
- GroupBox1: TGroupBox;
- StartButton: TButton;
- XPManifest: TXPManifest;
- ListBox: TListBox;
- Gauge: TGauge;
- procedure StartButtonClick(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- var
- MainForm: TMainForm;
-
- implementation
-
- {$R *.dfm}
-
- procedure TMainForm.StartButtonClick(Sender: TObject);
- var
- Letters: array[#32..#255] of Integer;
- 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
-
- if (Memo.Text[Index] in [Low(Letters)..High(Letters)])
- then Inc(Letters[Memo.Text[Index]]);
-
-
- 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;
-
- end.
 |
Вопрос задал: 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. Отвечает эксперт: Вадим К
Здравствуйте, mamont!
Первое, от чего хочу застеречь - это использование в коде конструкций вида Memo.Text[Index] - лучше уж использовать строковую переменную - это не только добавит скорости, а и упростит разработку (код будет меньше) и кол-во ошибок.
Также никуда не годиться конструкция Application.ProcessMessage;
Посмотрите в приложение - там переписанный немного код, он должен работать
Приложение: Переключить в обычный режим- procedure TMainForm.StartButtonClick(Sender: TObject);
- var
- Letters: array[#32..#255] of Integer;
- Index, Len, p, op: Integer;
- cIndex, MaxIndex: Char;
- s:string;
- begin
- s := ANSIUpperCase(Memo.text);
- Len:= Length(s);
- op:= 0;
- FillChar(Letters, SizeOf(Letters), 0);
-
- for Index:= 1 to Len do
- begin
-
- if (s[Index] in [Low(Letters)..High(Letters)])
- then Inc(Letters[s[Index]]);
-
-
-
- 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;
-
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 2 апреля 2008, 21:24
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 8; последнее сообщение — 4 апреля 2008, 12:12; участников в обсуждении: 3.
|
mamont (статус: Посетитель), 2 апреля 2008, 20:15 [#1]:
Хм... Заменил как вы сказали, но появилась ошибка Incompatible types: 'Char' and 'String'. А где недоработка найти не могу.
|
|
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]:
А теперь внимательно читаем мой ответ и медетируем
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|