Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2009, 14:21   #1
Алексей_xXx
Пользователь
 
Регистрация: 29.04.2009
Сообщений: 54
Печаль Сортирует цифры по строкам, а надо чтобы сортировала цифры , записанные через пробелы

Помогите пожалуйста, прогрммма сортирует цифры , записанные в файл по строкам. А надо чтобы сортировала цифры записанные через пробелы!
Как так сделать?

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    Button2: TButton;
    Button3: TButton;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FName: string;
  Form1: TForm1;

implementation


{$R *.dfm}
   type
  MyArr=array of string;

Procedure QuickSort(Left,Right:Integer;var X:myArr ); {Left - e"a*a^a`y" a~?a`i'e`o"a` i`a`n~n~e`a^a`}
var
  i,j:integer;
  y,w:string;
Begin
  i:=Left;
  j:=Right;
  y:=x[(Left+Right) div 2];
  Repeat
    While x[i]>y do Inc(I);
    While y>x[J] do Dec(J);
    If I<=J then begin
      w:=x[i];
      x[i]:=x[J];
      x[J]:=w;
      Inc(I);
      Dec(J);
    end;
  Until I>J;
  If Left<J then QuickSort(Left,J,X);
  If I<Right then QuickSort(I,Right,X);
End;


procedure TForm1.Button1Click(Sender: TObject);

   var
  f:MyArr;
  i:integer;
begin
  for i:=0 to memo1.Lines.Count-1 do begin
    SetLength(f,i+1);
    f[i]:=memo1.Lines.Strings[i];
  end;
  quicksort(0,Length(f)-1,f);
  memo1.lines.Clear;
  for i:=0 to Length(f)-1 do
    memo2.Lines.Add(f[i]);
end;



procedure TForm1.Button2Click(Sender: TObject);
begin
 if OpenDialog1.Execute then
begin
FName := OpenDialog1.FileName;
Memo1.Lines.LoadFromFile(FName);
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Memo2.Lines.SaveToFile(FName);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
Close();
end;

end.

Последний раз редактировалось Stilet; 06.05.2009 в 14:42.
Алексей_xXx вне форума Ответить с цитированием
Старый 06.05.2009, 14:48   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

По поводу сортировки рекомендую такое:
Код:
var  st:TStringList; s:string;i:integer;
begin
 s:='1 2 56 2 68 894 23 45 7'; // Получили строку
 st:=TStringList.Create;
 st.Delimiter:=' '; // Разделитель пробел
 st.DelimitedText:=s; // Разделили в массив
 st.Sorted:=true; // отсортировали
 caption:=st.DelimitedText // вывели отсортированное
end;
Смысл ясен?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.05.2009, 14:52   #3
Алексей_xXx
Пользователь
 
Регистрация: 29.04.2009
Сообщений: 54
По умолчанию

мне нужно именно алгоритмом быстрой сортировки !
Алексей_xXx вне форума Ответить с цитированием
Старый 06.05.2009, 14:58   #4
alex_fcsm
Участник клуба
 
Аватар для alex_fcsm
 
Регистрация: 10.11.2008
Сообщений: 1,502
По умолчанию

Зачем усложнять там где можно обойтись стандартными средствами?
Тогда парсите строку и числа заносите в массив и его уже сортируйте.
Нормальное состояние техники - нерабочее, все остальное частный случай.
alex_fcsm вне форума Ответить с цитированием
Старый 06.05.2009, 15:00   #5
Алексей_xXx
Пользователь
 
Регистрация: 29.04.2009
Сообщений: 54
По умолчанию

Задание дано , что именно этим алгоритмом! Что такое "парсить"?
Алексей_xXx вне форума Ответить с цитированием
Старый 06.05.2009, 15:07   #6
alex_fcsm
Участник клуба
 
Аватар для alex_fcsm
 
Регистрация: 10.11.2008
Сообщений: 1,502
По умолчанию

Цитата:
Сообщение от Алексей_xXx Посмотреть сообщение
Задание дано , что именно этим алгоритмом! Что такое "парсить"?
1. Прочитать исходную строку
2. пока не конец строки делать
2.1 считывать символы пока не встретим пробел или конец строки
2.2 перевести полученную подстроку в число и занести в массив
3. Отсортировать полученный массив(процедура вроде как у Вас есть)
то что имел ввиду(на Паскале)
Код:
uses crt;
var s,sub:string;
    a:array[1..100] of integer;
    i,j,code:integer;
begin
clrscr;
readln(s);
i:=0;j:=0;
while i<=length(s) do
 begin
  sub:='';
  while (s[i]<>' ') and (i<=length(s)) do
   begin
     if s[i] in ['0'..'9'] then sub:=sub+s[i];
     inc(i);
   end;
   inc(j);
   val(sub,a[j],code);
   inc(i);
 end;
for i:=1 to j do
 write(a[i],' ');
end.
Нормальное состояние техники - нерабочее, все остальное частный случай.

Последний раз редактировалось alex_fcsm; 06.05.2009 в 15:19.
alex_fcsm вне форума Ответить с цитированием
Старый 06.05.2009, 16:12   #7
Алексей_xXx
Пользователь
 
Регистрация: 29.04.2009
Сообщений: 54
По умолчанию

Спасибо конечно, но в Delphi я реализовать это не смогу.
Алексей_xXx вне форума Ответить с цитированием
Старый 06.05.2009, 16:17   #8
alex_fcsm
Участник клуба
 
Аватар для alex_fcsm
 
Регистрация: 10.11.2008
Сообщений: 1,502
По умолчанию

Цитата:
Сообщение от Алексей_xXx Посмотреть сообщение
Спасибо конечно, но в Delphi я реализовать это не смогу.
Код:
procedure TForm1.Button1Click(Sender: TObject);

Procedure QuickSort(Left,Right:Integer;var X:array of integer ); {Left - e"a*a^a`y" a~?a`i'e`o"a` i`a`n~n~e`a^a`}
var
  i,j,y,w:integer;
Begin
  i:=Left;
  j:=Right;
  y:=x[(Left+Right) div 2];
  Repeat
    While x[i]>y do Inc(I);
    While y>x[J] do Dec(J);
    If I<=J then begin
      w:=x[i];
      x[i]:=x[J];
      x[J]:=w;
      Inc(I);
      Dec(J);
    end;
  Until I>J;
  If Left<J then QuickSort(Left,J,X);
  If I<Right then QuickSort(I,Right,X);
End;

var s,sub:string;
    a:array[1..100] of integer;
    i,j:integer;

begin
s:=Edit1.text;
i:=0;j:=0;
while i<=length(s) do
 begin
  sub:='';
  while (s[i]<>' ') and (i<=length(s)) do
   begin
     if s[i] in ['0'..'9'] then sub:=sub+s[i];
     inc(i);
   end;
   inc(j);
   a[j]:=StrToInt(sub);
   inc(i);
 end;
 QuickSort(0,j-1,a);
 Edit1.Text:='';
for i:=1 to j do
 Edit1.Text:=edit1.Text+IntTostr(a[i])+' ';
end;
Нормальное состояние техники - нерабочее, все остальное частный случай.

Последний раз редактировалось alex_fcsm; 06.05.2009 в 16:23.
alex_fcsm вне форума Ответить с цитированием
Старый 06.05.2009, 16:46   #9
Алексей_xXx
Пользователь
 
Регистрация: 29.04.2009
Сообщений: 54
По умолчанию

Спасибо alex_fcsm!!!!!!
Можно ещё вопросик.
Поле Memo нельзя в данном случае использовать для ввода цифр и вывода цифр?

Последний раз редактировалось Алексей_xXx; 06.05.2009 в 16:50.
Алексей_xXx вне форума Ответить с цитированием
Старый 06.05.2009, 16:48   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Поле Memo нельзя в данном случае использовать для ввода цифр и вывода цифр?
Можно, если справишся с получением из него данных.
Будеш вводить одна цифра - одна строка, еще ничего, тогда как к массиву обращайся, а если через пробел, тогда парсить придется.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите пожалуйста, как сделать, чтобы в Edit можно было ввести цифры от 0 до 12. ciev Общие вопросы Delphi 6 14.05.2016 17:45
Римские цифры Sergeevich Помощь студентам 2 26.05.2008 18:21
Найти ненулевые цифры kommunist Помощь студентам 2 25.11.2007 11:16
Перевёрнутые цифры BETONOMESHALKA Общие вопросы Delphi 2 04.11.2007 15:22
Как сделать так, чтобы в компонент edit вводились цифры и аналогично с буквами? Askat Общие вопросы Delphi 6 22.08.2007 21:00