Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.06.2015, 10:41
пролдж пролдж вне форума
Прохожий
 
Регистрация: 21.06.2015
Сообщения: 1
Версия Delphi: delphi7
Репутация: 10
По умолчанию Сортировка... Помогите

Нужна ваша помощь. У меня есть кусочек программы, которая при вводе нашего текста считает количество каждой буквы и выводит. Мне нужно сортировать это по убыванию. и еще при подсчете не учитывать строчную и заглавную букву.
Код:
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  
Старый 21.06.2015, 19:10
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Тебе английские нужны, русские или вообще все?

Для приведения всех букв к одному регистру можно воспользоваться функцией AnsiLowerCase.
Ответить с цитированием
  #3  
Старый 21.06.2015, 19:32
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

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])]);
2) Построить массив индексов. Заполнить массив числами от 0 до 255 и отсортировать, в качестве значения для сортировки используя counts[indexes[i]].
Код:
indexes: array [0..255] of byte;
...
for i := 0 to 255 do
  indexes[i] := i;

Sort(indexes, counts); // <- пузырьковую сортировку нагуглить и подправить
3) Распечатать массив индексов и соответствующих им количеств из массива counts.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 21.06.2015 в 21:28.
Ответить с цитированием
  #4  
Старый 21.06.2015, 20:32
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Доработка процедуры из первого поста, правда извнс, вероятно получился 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  
Старый 22.06.2015, 13:49
Аватар для Verevkin
Verevkin Verevkin вне форума
Прохожий
 
Регистрация: 22.06.2015
Сообщения: 45
Версия Delphi: 3...XE12
Репутация: -50
По умолчанию

Я тебе вчера в другом месте пример оставил. А в ответ - тишина. Неужели подошло as is?
__________________
Хей-хей-хей! Только не ходите в мой сарай, лады?..
Ответить с цитированием
  #6  
Старый 22.06.2015, 13:54
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Verevkin
Я тебе вчера в другом месте пример оставил. А в ответ - тишина. Неужели подошло as is?
Какого хрена ты сюда зашёл, а?
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:37.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025