![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Нужна ваша помощь. У меня есть кусочек программы, которая при вводе нашего текста считает количество каждой буквы и выводит. Мне нужно сортировать это по убыванию. и еще при подсчете не учитывать строчную и заглавную букву.
Код:
var
Form1: TForm1;
k:string;
a:char; //символ
b:integer;//кол-во символа "a" в строке
c:integer;//количество различных символов
implementation
{$R *.dfm}
procedure clear;
begin
Form1.StringGrid1.Cols[1].Clear;
Form1.StringGrid1.Cols[2].Clear;
Form1.StringGrid1.RowCount:=1;
b:=0;
c:=0;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
clear;
Form1.StringGrid1.Cells[0,c]:='Символ';
Form1.StringGrid1.Cells[1,c]:='Количество';
k:=Edit1.Text;
while Length(k)<>0 do
begin
inc(c);
a:=k[1];;
b:=1;
for i := 2 to Length(k) do
if k[i]=a then inc(b);
k:=StringReplace(k,a,'',
[rfReplaceAll]);
Form1.StringGrid1.Cells[0,c]:='"'+a+'"';
Form1.StringGrid1.Cells[1,c]:=IntToStr(b);
end;
Form1.StringGrid1.RowCount:=c+1;
end;
end.Последний раз редактировалось lmikle, 21.06.2015 в 19:05. |
|
#2
|
|||
|
|||
|
Тебе английские нужны, русские или вообще все?
Для приведения всех букв к одному регистру можно воспользоваться функцией AnsiLowerCase. |
|
#3
|
||||
|
||||
|
1) Построить массив количеств по первым байтам символов. Явно школьная задачка, потому пропускаю случай с не-ASCII символами, иероглифами и прочим UTF:
Код:
counts: array[0..255] of integer; ... s := AnsiLowerCase(Edit.Text); for i := 1 to length(s) do inc(counts[byte(s[i])]); Код:
indexes: array [0..255] of byte; ... for i := 0 to 255 do indexes[i] := i; Sort(indexes, counts); // <- пузырьковую сортировку нагуглить и подправить Последний раз редактировалось Bargest, 21.06.2015 в 21:28. |
|
#4
|
||||
|
||||
|
Доработка процедуры из первого поста, правда извнс, вероятно получился G-код
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
i, m, r: integer;
buf: array[0..1] of string;
begin
StringGrid1.RowCount:= 1;
StringGrid1.Cells[0, 0]:= 'Символ';
StringGrid1.Cells[1, 0]:= 'Количество';
k:= AnsiLowerCase(Edit1.Text);
c:= 1;
while Length(k) <> 0 do
begin
a:= k[1];;
b:= 1;
for i := 2 to Length(k) do
if k[i] = a then inc(b);
k:= StringReplace(k, a, '', [rfReplaceAll]);
StringGrid1.Cells[0, c]:= '"' + a + '"';
StringGrid1.Cells[1, c]:= IntToStr(b);
inc(c);
StringGrid1.RowCount:= c;
end;
for r := 1 to StringGrid1.RowCount - 1 do
begin
m:= r;
for i := r to StringGrid1.RowCount - 1 do
if StrToInt(StringGrid1.Cells[1,i]) > StrToInt(StringGrid1.Cells[1,m]) then
m := i;
if r <> m then
begin
for c := 0 to 1 do
begin
buf[c]:= StringGrid1.Cells[c, r];
StringGrid1.Cells[c, r]:= StringGrid1.Cells[c, m];
StringGrid1.Cells[c, m]:= buf[c];
end;
end;
end;
end; |
|
#5
|
||||
|
||||
|
Я тебе вчера в другом месте пример оставил. А в ответ - тишина. Неужели подошло as is?
|
|
#6
|
||||
|
||||
|
Цитата:
![]() |