![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Доброго времени суток, господа!
Такая проблемка нужно реализовать 2 метода сортировки чтоб результаты выводились в стрнггрид а в лейблы выводилсь количество перестановок для сровнения. Я зделал генерацию и открытие файла содержащего масив а с сортировкой проблемка, подскажите пожалуйста. Виснет после нажатия кнопки метода включением. ![]() Код:
unit Grishman1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Grids; type TForm1 = class(TForm) StringGrid1: TStringGrid; Label1: TLabel; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Label2: TLabel; Label3: TLabel; StringGrid2: TStringGrid; Bevel1: TBevel; Label4: TLabel; StringGrid3: TStringGrid; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; Button5: TButton; procedure Button5Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure vkluch(var a: array of integer;n:integer); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; const n=1000; var Form1: TForm1; f:textfile; a:array[1..n] of integer; i:integer; S:string; implementation {$R *.dfm} procedure tform1.vkluch(var a: array of integer;n:integer); var j,i,cv,mv:integer; f:textfile; B: array [0..10000] of integer; begin if OpenDialog1.Execute then begin assignfile(f,opendialog1.FileName); reset(f); i:=1; while not eof(f) do begin for i:=0 to n do begin j:=i; cv:=0; mv:=0; while (j>1) and (B[j-1]>A[i]) do begin B[j]:=B[j-1]; j:=j-1; end; B[j]:=A[i]; end; for i:=0 to N do begin A[i]:=b[i]; stringgrid2.cells[i,0]:=inttostr(a[i]); end; end; end; end; procedure TForm1.Button5Click(Sender: TObject); begin stringgrid1.colcount:=n+1; if savedialog1.execute then begin assignfile(f,savedialog1.filename); rewrite(f); randomize; for i:=1 to n do begin a[i]:=random(1000)-500; writeln(f,a[i]); end; end; closefile(f); end; procedure TForm1.Button1Click(Sender: TObject); begin stringgrid1.colcount:=n+1; stringgrid1.rowcount:=0; if opendialog1.Execute then begin assignfile(f,opendialog1.FileName); for i:=1 to n do begin stringgrid1.cells[i,0]:=inttostr(a[i]); reset(f); end; end; end; procedure TForm1.Button2Click(Sender: TObject); begin stringgrid2.colcount:=n+1; stringgrid2.rowcount:=0; vkluch(a,n); end; end. Изначально код был другим (процедура включ) но все равно не работало Обясните пожалуйста как реализовать ети методы в интернете куча примеров но я немогу понять как оно работает ![]() |
#2
|
|||
|
|||
![]() Код:
stringgrid1.rowcount:=0; stringgrid2.rowcount:=0; Хотя я посмотрел - один ряд остаётся, видимо, можно писать: ":= 1"; Последний раз редактировалось AlexSku, 09.05.2011 в 12:20. |
#3
|
|||
|
|||
![]() А в коде очень много странных вещей:
в процедуре vkluch 1). открывается файл f для чтения (reset(f)), затем идёт цикл (while not eof(f)), но в этом цикле я не увидел ни одного чтения. Это, кстати, наверняка и причина зацикленности (зависания). 2) внутри цикла сравниваются массивы "B" и "A" (while (j>1) and (B[j-1]>A[i])). Во-первых, массив B локальный, не инициализирован и, значит, содержит мусор. Почему вы пишите то "a", то "A" (и для "B" тоже)? Для Delphi это всё равно, но вы уверены, что это тот же массив. Почему у одного массива длина 1.000, а у другого 10.000? |
#4
|
|||
|
|||
![]() ![]() |
#5
|
|||
|
|||
![]() Вот алгоритм метода из Википедии:
Код:
Вход: массив A, состоящий из элементов A[1], A[2], ..., A[n] for i = 2, 3, ..., n: key := A[i] j := i - 1 while j > 0 and A[j] > key: A[j + 1] := A[j] j := j - 1 A[j + 1] := key Хотя не знаю, для чего вам дают этот метод, ведь он не самый быстрый. Наверное, для вас других заданий не могут придумать. |
#6
|
|||
|
|||
![]() Вот код процедуры сортировки вставками который нам дали на лекции
![]() Код:
procedure tform1.vkluch(n:integer); var j,b,i,cv,mv:integer; f:textfile; begin if OpenDialog1.Execute then begin assignfile(f,opendialog1.FileName); reset(f); i:=1; while not eof(f) do begin readln(f,a[i]); i:=2; cv:=0; mv:=0; if i<=n then begin for j:=1 to n do begin cv:=cv+1; if a[j]>a[i] then begin b:=a[i]; a[i]:=a[j]; a[j]:=b; mv:=mv+1; i:=i+1; stringgrid2.cells[i,0]:=inttostr(a[j]); теперь буду розбиратся с 2 методом |
#7
|
||||
|
||||
![]() Посмотрите что в примере:
Код:
while not eof(f) do begin readln(f,a[i]); Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#8
|
|||
|
|||
![]() вы меня озадачили. я не понял вопрос.
в каком примере? |
#9
|
|||
|
|||
![]() итак финальный код включения (работает)
Код:
procedure tform1.vkluch(n:integer); var j,b,i,cv,mv:integer; f:textfile; begin n:=strtoint(Edit1.Text); if OpenDialog1.Execute then begin assignfile(f,opendialog1.FileName); reset(f); i:=1; while not eof(f) do begin readln(f,a[i]); i:=i+1; end; n:=i-1; i:=2; cv:=0; mv:=0; j:=j-1; while i<=n do begin //for j:=i-1 downto 2 do begin cv:=cv+1; j:=i; while (a[j]<a[j-1])and(j>1) do begin b:=a[j-1]; a[j-1]:=a[j]; a[j]:=b; mv:=mv+1; j:=j-1; end; i:=i+1; end; stringgrid2.ColCount:=n+1; for i:=1 to n do stringgrid2.cells[i-1,0]:=inttostr(a[i]); end; end; |
#10
|
|||
|
|||
![]() Обьясните, ето метод прочесывание? и почему он не работает?)
Код:
procedure tform1.pr(n:integer); const t=6; var j,i,k,q:integer; m:1..t; h:array [1..t] of integer; f:textfile; begin if OpenDialog1.Execute then begin assignfile(f,opendialog1.FileName); reset(f); i:=1; while not eof(f) do begin readln(f,a[i]); i:=i+1; end; h[1]:=8; h[2]:=6; h[3]:=4; h[4]:=3; h[5]:=2; h[6]:=1; for m:=1 to t do begin k:=h[m]; q:=-k; if q=0 then q:=-k; q:=q+1; a[q]:=a[i]; while a[i]<a[j] do begin a[j+k]:=a[j]; j:=j-k; end; a[j+k]:=a[i]; end; stringgrid3.ColCount:=n+1; for i:=1 to n do stringgrid3.cells[i-1,0]:=inttostr(a[i]); end; end; |