![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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; |