Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Быстрая сортировка массивов. Помогите пожалуйста исправить код проги 
V
    Опции темы
NaG1
Дата 24.6.2011, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 21.4.2011

Репутация: нет
Всего: нет



Всем здраствуйте smile 
у меня возникла серьезная проблема с кодом:

вот часть кода, где сейчас у меня выбиваются ошибки:

Код

unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, jpeg, ExtCtrls, Grids, StdCtrls, Buttons;

type
  TForm3 = class(TForm)
    strngrd2: TStringGrid;
    BitBtn1: TBitBtn;
    btn1: TBitBtn;
    edt1: TEdit;
    edt2: TEdit;
    procedure BitBtn1Click(Sender: TObject);
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form3: TForm3;
   min,z,c:integer;
   e, d, i, Nmin, j, k: byte;
implementation

uses
  Unit1, Unit2;

{$R *.dfm}

procedure TForm3.BitBtn1Click(Sender: TObject);
begin
close;
end;


procedure TForm3.btn1Click(Sender: TObject);
const b = strtoint(edt1.Text);{пока проблема в этой строке}
var
A:array[1..b] of integer;
begin
c:=strtoint(edt2.Text);
z:=1;
with Form1 do
begin
for i:=1 to Strngrd1.ColCount do
    for j:=1 to Strngrd1.RowCount do
      if TryStrToInt(Strngrd1.Cells[i, j], z) then
        a[i]:=StrToInt(Strngrd1.Cells[i,1]);
for i:=1 to b do
        a[i]:=StrToInt(Strngrd1.Cells[i,1]);
for i:=1 to b do
        Strngrd2.Cells[i,0]:=IntToStr(i);
for i:=1 to b-1 do
        Strngrd2.Cells[0,i]:=IntToStr(i);
        {Çäåñü ñîðòèðîâêà}
for i:=1 to b-1 do
        begin
                min:=a[i];     
                Nmin:=i;
                for j:=i+1 to b do
                        begin
                                if a[j]<min then
                                        begin
                                                min:=a[j]; 
                                                Nmin:=j;     
                                                a[Nmin]:=a[i];
                                                a[i]:=min;
                                        end;
                        for k:=1 to b do
                                Strngrd2.Cells[k,i]:=IntToStr(a[k]);
                        end;
        end;
end;
for i:=1 to b do
Strngrd2.Cells[i,1]:=IntToStr(a[i]);
end;

end.


Суть программы в том, что она создает массивы(одномерные и двумерные) - это у меня получилось без проблем,
но вот то, что массив нужно отсортировать методом Хоара - это уже проблема, над которой бьюсь уже неделю.....

Помогите с кодом пожалуйста! А то на допиливание программы осталось 2 дня.
исходник прграммы:

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  _______.zip 20,43 Kb
PM MAIL   Вверх
NaG1
Дата 24.6.2011, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 21.4.2011

Репутация: нет
Всего: нет



Может все-таки поможет кто?, а то до защиты 2 дня осталось.
PM MAIL   Вверх
Keeper89
Дата 24.6.2011, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



Это как ты так в константу решил значение из Эдита загнать?

Добавлено через 1 минуту и 4 секунды
Если хочется сделать массив определенной размерности - либо используй динамические, либо ставь b=10, а итерации делай уже по какой-нибудь n<10.


--------------------
PM MAIL WWW   Вверх
NaG1
Дата 24.6.2011, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 21.4.2011

Репутация: нет
Всего: нет



я знаю что не правильно, но все дело в том что плз сам вводит размерность массива, а если указывать
Код

A:array of integer;


вместо
Код

A:array[1..b] of integer;


все время ошибку выдает при сортировке.

А с динамическими я не очень дружу, т.к. раньше необходимости в них у меня никогда не было, и в их записи не очень разбираюсь.

Это сообщение отредактировал(а) NaG1 - 24.6.2011, 22:32
PM MAIL   Вверх
Keeper89
Дата 24.6.2011, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



Для динамических вариант такой:
1)
Код

A:array of integer;

2)
Код

b := strtoint(edt1.Text);
SetLength(A, b);




--------------------
PM MAIL WWW   Вверх
NaG1
  Дата 25.6.2011, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 21.4.2011

Репутация: нет
Всего: нет



при таком изменении в коде 
Код

procedure TForm3.btn1Click(Sender: TObject);
var
A:array of integer;
begin
c:=strtoint(edt2.Text);
b:=strtoint(edt1.Text);
z:=1;
SetLength(A, b);
with Form1 do
begin
for i:=1 to Strngrd1.ColCount do
    for j:=1 to Strngrd1.RowCount do
      if TryStrToInt(Strngrd1.Cells[i, j], z) then
        a[i]:=StrToInt(Strngrd1.Cells[i,1]);
for i:=1 to b do
        a[i]:=StrToInt(Strngrd1.Cells[i,1]);
for i:=1 to b do
        Strngrd2.Cells[i,0]:=IntToStr(i);
for i:=1 to b-1 do
        Strngrd2.Cells[0,i]:=IntToStr(i);
        {Çäåñü ñîðòèðîâêà}
for i:=1 to b-1 do
        begin
                min:=a[i];     
                Nmin:=i;
                for j:=i+1 to b do
                        begin
                                if a[j]<min then
                                        begin
                                                min:=a[j]; 
                                                Nmin:=j;     
                                                a[Nmin]:=a[i];
                                                a[i]:=min;
                                        end;
                        for k:=1 to b do
                                Strngrd2.Cells[k,i]:=IntToStr(a[k]);
                        end;
        end;
end;
for i:=1 to b do
Strngrd2.Cells[i,1]:=IntToStr(a[i]);
end;

все равно старая ошибка:
user posted image

и почему-то указывает на этот код:
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ExtCtrls, Grids, jpeg;

type
  TForm1 = class(TForm)
    strngrd1: TStringGrid;
    btn1: TBitBtn;
    btn3: TBitBtn;
    btn4: TBitBtn;
    btn5: TBitBtn;
    btn6: TBitBtn;
    btn7: TBitBtn;
    dlgOpen1: TOpenDialog;
    dlgSave1: TSaveDialog;
    edt1: TEdit;
    edt2: TEdit;
    procedure btn1Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
    procedure btn6Click(Sender: TObject);
    procedure btn7Click(Sender: TObject);
    procedure strngrd1KeyPress(Sender: TObject; var Key: Char);
    procedure btn5Click(Sender: TObject);
    procedure btn4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
   I,o,p,j: Integer;
   st,sv:string;
   b,c:byte;
   n:char;
   A: array of integer;
   F: TextFile;
implementation

uses Unit2, Unit3;

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
begin
DeleteFile('C:\windows\temp\MatrixDoSort.txt');
Application.Terminate;
end;

procedure TForm1.btn3Click(Sender: TObject);
begin
Form2.showmodal;
end;

procedure TForm1.btn6Click(Sender: TObject);
begin
with Form1.strngrd1 do
begin
o:=rowCount;
p:=colCount;
visible:=false;
Enabled:=False;
end;
for i:=0 to p do
for j:=0 to o do
Strngrd1.Cells[i,j]:='';
with form1.btn5 do
Visible:=false;
with form1.btn7 do
Visible:=false;
with form1.btn6 do
Visible:=false;
end;

procedure TForm1.btn7Click(Sender: TObject);
begin
with Form3.edt1 do
text:= edt1.Text;
with Form3.edt2 do
text:= edt2.Text;
st:=' ';
sv:='|';
o:=strtoint(edt1.Text)-1;
AssignFile(F,'C:\windows\temp\MatrixDoSort.txt');
Rewrite(F);
for i:=0 to strtoint(edt1.Text)-1  do
for j:=0 to strtoint(edt2.Text)-1 do
begin
write(F,Strngrd1.Cells[i,j]);
write(F,Sv);
end;
CloseFile(F);
with form3 do
for i:=0 to strtoint(edt1.Text)-1 do
for j:=0 to strtoint(edt2.Text)-1 do
strngrd2.cells[i,j]:=strngrd1.cells[i,j];

form3.showmodal; {выделяет эту строку почему-то}

end;

procedure TForm1.strngrd1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in['0'..'9']) then Key:=#0;
end;

procedure TForm1.btn5Click(Sender: TObject);
begin
st:=' ';
sv:='|';
if dlgSave1.execute then
begin
assignfile(f,dlgSave1.filename);
Rewrite(F);
for i:=0 to strtoint(edt1.Text)-1  do
for j:=0 to strtoint(edt2.Text)-1 do
begin
write(F,Strngrd1.Cells[i,j]);
write(F,Sv);
end;
CloseFile(F);
end;
end;

procedure TForm1.btn4Click(Sender: TObject);

begin
if dlgOpen1.execute then
begin
assignfile(f,dlgopen1.filename);
reset(F);
while not eof(f) do
begin
while not eoln(f) do
read(f,n);

end;
readln(f);
end;
closefile(f);
with Form1.strngrd1 do
visible:= True;
end;


end.


Это сообщение отредактировал(а) NaG1 - 25.6.2011, 00:56
PM MAIL   Вверх
Чучмек
Дата 25.6.2011, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 7
Всего: 41



Цитата(NaG1 @  25.6.2011,  00:41 Найти цитируемый пост)
for i:=1 to

В динамических массивах индексация с нуля.


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
NaG1
Дата 25.6.2011, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 21.4.2011

Репутация: нет
Всего: нет



даже при таком изменении
Код

procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form3: TForm3;
   min,z,c:integer;
   e, d, i, Nmin, j, k: byte;
   b:Integer;
implementation

uses
  Unit1, Unit2;

{$R *.dfm}

procedure TForm3.BitBtn1Click(Sender: TObject);
begin
close;
end;


procedure TForm3.btn1Click(Sender: TObject);
var
A:array of integer;
begin
c:=strtoint(edt2.Text);
b:=strtoint(edt1.Text);
z:=1;
SetLength(A, b);
with Form1 do
begin
for i:=0 to Strngrd1.ColCount do
    for j:=0 to Strngrd1.RowCount do
      if TryStrToInt(Strngrd1.Cells[i, j], z) then
        a[i]:=StrToInt(Strngrd1.Cells[i,1]);
for i:=0 to b do
        a[i]:=StrToInt(Strngrd1.Cells[i,1]);
for i:=0 to b do
        Strngrd2.Cells[i,0]:=IntToStr(i);
for i:=0 to b-1 do
        Strngrd2.Cells[0,i]:=IntToStr(i);
        {Çäåñü ñîðòèðîâêà}
for i:=0 to b-1 do
        begin
                min:=a[i];     
                Nmin:=i;
                for j:=i+1 to b do
                        begin
                                if a[j]<min then
                                        begin
                                                min:=a[j]; 
                                                Nmin:=j;     
                                                a[Nmin]:=a[i];
                                                a[i]:=min;
                                        end;
                        for k:=0 to b do
                                Strngrd2.Cells[k,i]:=IntToStr(a[k]);
                        end;
        end;
end;
with Form1 do
for i:=0 to b do
Strngrd1.Cells[i,1]:=IntToStr(a[i]);
end;

end.


теже ошибки
user posted image
user posted image

PM MAIL   Вверх
Keeper89
Дата 25.6.2011, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



Ну, Господи, там же написано что нет значения  в какой-то ячейке.
ColCount и RowCount будут с -1 т.к. ты единичку на 1 уменьшил, надо и их уменьшить.
+
Проверь либо правильность итерации, либо заполненность ячеек.

Это сообщение отредактировал(а) Keeper89 - 25.6.2011, 12:35


--------------------
PM MAIL WWW   Вверх
NaG1
Дата 25.6.2011, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 21.4.2011

Репутация: нет
Всего: нет



ну вот,
Код

procedure TForm3.btn1Click(Sender: TObject);
var
A:array of integer;
begin
c:=strtoint(edt2.Text);
b:=strtoint(edt1.Text);
z:=1;
SetLength(A, b);
with Form1 do
begin
for i:=0 to Strngrd1.ColCount-1 do
    for j:=0 to Strngrd1.RowCount-1 do
      if TryStrToInt(Strngrd1.Cells[i, j], z) then
        a[i]:=StrToInt(Strngrd1.Cells[i,1]);
for i:=0 to b-1 do
        a[i]:=StrToInt(Strngrd1.Cells[i,1]);
for i:=0 to b-1 do
        Strngrd2.Cells[i,0]:=IntToStr(i);
for i:=0 to b-1 do
        Strngrd2.Cells[0,i]:=IntToStr(i);
        {Çäåñü ñîðòèðîâêà}
for i:=0 to b-1 do
        begin
                min:=a[i];     
                Nmin:=i;
                for j:=i+1 to b do
                        begin
                                if a[j]<min then
                                        begin
                                                min:=a[j]; 
                                                Nmin:=j;     
                                                a[Nmin]:=a[i];
                                                a[i]:=min;
                                        end;
                        for k:=0 to b-1 do
                                Strngrd2.Cells[k,i]:=IntToStr(a[k]);
                        end;
        end;
end;
with Form1 do
for i:=0 to b-1 do
Strngrd1.Cells[i,1]:=IntToStr(a[i]);
end;


пироги все те-же

как может не быть какого-то значения, если ячейки все  заполнены?
(вот исходники, не судите строго, т.к. пока я полный ламер(: в работе со  стрнггридами и массивами в дельфи(но по заданию приходится делать))

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  _______1.zip 295,92 Kb
PM MAIL   Вверх
Чучмек
Дата 25.6.2011, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 7
Всего: 41



Цитата(NaG1 @  25.6.2011,  13:56 Найти цитируемый пост)
a[i]:=StrToInt(Strngrd1.Cells[i,1]);


Для одномерного надо обрабатывать первую строку, а это вторая.

В StringGrid индексация тоже с нуля.

Начинать надо с простого, разберись с сортировкой и StringGrid, а потом лепи проект. 
Сделай с одной формой и одним StringGrid с ручным заполнением. Сделай сортировку. 

В твой код вникать нет ни времени, ни желания.

Кстати, бока с выбором файла. Если в диалоге нажимаешь отмена - вылет. 

Это сообщение отредактировал(а) Чучмек - 25.6.2011, 16:23


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
NaG1
Дата 25.6.2011, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 21.4.2011

Репутация: нет
Всего: нет



Цитата(Чучмек @  25.6.2011,  16:21 Найти цитируемый пост)
Для одномерного надо обрабатывать первую строку, а это вторая.В StringGrid индексация тоже с нуля.


Большое Спасибо! 

теперь получилось  отсортировать одномерный массив!)
буду пытаться справится с двухмерным, а потом и с открытием массивов из тхт файлов как-нибудь буду разбираться....

PM MAIL   Вверх
NaG1
  Дата 26.6.2011, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 21.4.2011

Репутация: нет
Всего: нет



С двумерным оказалось все не так уж и просто

Код

A:array of array of integer;
SetLength(A, b,c);


и изменение всего кода под двумерный массив привело к огромной путанице и постоянным ошибкам в программе.

а попытка использовать одномерный, заключенный в цикл, для сортировки построчно
Код

procedure TForm3.btn1Click(Sender: TObject);
var
A:array of integer;
begin
c:=strtoint(edt2.Text);
b:=strtoint(edt1.Text);
z:=1;
SetLength(A, b);
with Form1 do
begin
for e:=0 to c-1 do
begin
for i:=0 to b-1 do
    for j:=0 to e do
      if TryStrToInt(Strngrd1.Cells[i, j], z) then
        a[i]:=StrToInt(Strngrd1.Cells[i,e]);
for i:=0 to b-1 do
        a[i]:=StrToInt(Strngrd1.Cells[i,e]);
for i:=0 to b-1 do
        Strngrd2.Cells[i,e]:=IntToStr(i);
for i:=0 to b-1 do
        Strngrd2.Cells[e,i]:=IntToStr(i);
        {Çäåñü ñîðòèðîâêà}
for i:=0 to b-1 do
        begin
                min:=a[i];
                Nmin:=i;
                for j:=i+1 to b do
                        begin
                                if a[j]<min then
                                        begin
                                                min:=a[j];
                                                Nmin:=j;     
                                                a[Nmin]:=a[i];
                                                a[i]:=min;
                                        end;
                        for k:=0 to b-1 do
                                Strngrd2.Cells[k,i]:=IntToStr(a[k]);
                        end;
        end;
for i:=0 to b-1 do
Strngrd2.Cells[i,e]:=IntToStr(a[i]);
end;
end;
with img2 do
Visible:=false;
with img4 do
Visible:=true;
with btn2 do
visible:=True;
end;


привела к дублированию строк(непонятно почему) и иногда к вылетам и ошибкам(

имеется проблема и с ручным редактированием массива:
Код

with Form1 do

strngrd1.Options := strngrd1.Options  + [goEditing]; {не запускается программа с этой строчкой}

end;


Подскажите пожалуйста, как подстроить код к двумерному массиву, или хотябы как исправить код для сортировки построчно....

ну вот и все........... осталась 1 ночь, и защита smile 

Это сообщение отредактировал(а) NaG1 - 26.6.2011, 23:45
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0974 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.