| 
| 
 | Вопрос # 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]:А теперь внимательно читаем мой ответ и медетируем   Галочка "подтверждения прочтения" - вселенское зло. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |