![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
массив
дямак © (2006-05-08 11:46:00)здравствуйте, Уважаемые мастера! На днях вот начал юзать delphi, прочитал какую-то книгу по совету одного из мастеров, вроде чё-то понял, но на подробное изучение не хватает времени, так как мне лабу в четверг сдавать надо , а она у меня ещё не сделана, точнее одну про график функции я сделал, а вот про массив никак! Может я тупой такой, вот я тут начал делать заполнение массива случайно
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function Unic(var flag: array of boolean; range: integer): integer;
begin
{ возвращение одного случайного числа}
result := random(range);
while flag[result] do
result := random(range); //какого числа еще нет
flag[result] := true; //чтобы не было повторений
end;
procedure MassRand(range: integer; var inputMass: array of integer);
var
i: integer;
bm: array of boolean;
begin
SetLength(bm, length(inputMass));
for i := 0 to length(inputMass) - 1 do
begin
inputMass[i]:=Unic(bm,range);//заполнение от 0,1, ... ,до N
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
mass: array of integer; //собственно сам массив
begin
Memo1.Lines.Clear; //Ввод результата
SetLength(mass, strtoint(Edit1.Text)); //скока линий
MassRand(strtoint(Edit1.Text), mass); //использование процедуры
for i := 0 to length(mass) - 1 do
begin
Memo1.Lines.Add(inttostr(mass[i])); //результат
end;
end;
end.
но он по ходу одномерный (или как он там называется), а мне нужно чтобы он был многомерный (может я неправильно выражаюсь, ну чтобы например 10 строк и 10 столбцов) объясните чё я неправильно делаю?
Algol (2006-05-08 19:23:00) [1]
> function Unic(var flag: array of boolean; range: integer):
> integer;
> begin
> { возвращение одного случайного числа}
> result := random(range);
> while flag[result] do
> result := random(range);//какого числа еще нет
> flag[result] := true; //чтобы не было повторений
> end;
Здесь зацикливание может быть.
дямак (2006-05-08 18:36:00) [2]слушай, я тебе обязан просто по гроб жизни!!! Клёвый ты чел Шпиён!!!
А ты давно программируешь? и откуда ты вообще такой прошаренный?
Шпиён (2006-05-08 18:28:00) [3]А обработчики на нажатия кнопок кто цеплять будет, Пушкин?
дямак (2006-05-08 18:26:00) [4]>Шпиён (08.05.06 17:50) [37]
на форме рамещаю компоненты Panel1,Button1,Button2, Edit1,Memo1 согластно твоему коду, компилятор не ругается, но прога не реагирует на нажатие кнопок!
дямак (2006-05-08 18:14:00) [5]пасиб, буду учиться!
Шпиён (2006-05-08 17:50:00) [6]Попробуй для начала разобраться с этим кодом:
Ограничения: матрица квадратная (N на N)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
Memo1: TMemo;
Button2: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
type
TMatrix=array of array of integer;
var
Arr : TMatrix;
rowcol : integer=10;
procedure RandomMatrix(var M:TMatrix; r:integer);
var
i,j :integer;
g: Integer;
begin
Randomize;
SetLength(M,r,r);
g := r*r;
for i:=0 to r-1 do
for j:=0 to r-1 do
M[i,j]:=random(g);
end;
procedure ArrayToMemo(A : TMatrix; Mem:TMemo);
var
i, j :integer;
s:string;
begin
for i:=Low(A) to High(A) do
begin
s:='';
for j:=Low(A) to High(A) do
s := s + Format('%4.2d',[A[i,j]]);
Mem.Lines.Add(s);
end;
end;
procedure ArraySort(var A : TMatrix);
var
i, j, Temp, Min, Max :integer;
begin
for i := Low(A) to High(A) do
begin
Min := Low(A);
Max := Min;
for j := Succ(Low(A)) to High(A) do
if A[i, Min] > A[i, j] then
Min := j
else
if A[i, Max] < A[i, j] then
Max := j;
if Min <> Max then
begin
Temp := A[i, Min];
A[i, Min] := A[i, Max];
A[i, Max] := Temp
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Clear;
TryStrToInt(Edit1.Text,RowCol);
// Здесь если RowCol=0 можно вывести предупреждение
// и выйти
RandomMatrix(Arr,rowcol);
ArrayToMemo(Arr,Memo1);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Memo1.Lines.Add('==Result==');
ArraySort(Arr);
ArrayToMemo(Arr, Memo1);
end;
end.
А потом можно и процедуру RandomMatrix переписать так, чтобы генерировала уникальные числа
Шпиён (2006-05-08 17:35:00) [7]Достаточно, чтобы числа в строке были уникальными (хотя это и не обязательно)...
> Кто - нибудь пожалуйста напишите код!
Чем это отличается от списывания?
дямак (2006-05-08 17:10:00) [8]Кто - нибудь пожалуйста напишите код!
KilkennyCat (2006-05-08 16:58:00) [9]> Алгоритм по строке:
> 1 MinEl = первый элемент, MaxEl = первый элемент, MaxInd=0,MinInd=0это лишнее, или, по крайней мере, Low
дямак (2006-05-08 16:58:00) [10]>Пусик © (08.05.06 16:40)
если б я шарил в этих алгоритмах! то написал бы, а мне надо уже готовый!
дямак (2006-05-08 16:42:00) [11]кстати да! фишка! может нужно чтобы матрица заполнялась случайными целыми неповторяющимися числами! Помогите плиз! Обещаю впреть больше сюда не соваться за советами и самостоятельно изучать Delphi! Пожалста
Пусик (2006-05-08 16:40:00) [12]
> дямак © (08.05.06 16:25) [29]
Алгоритм простой:
Определяем переменные - MaxEl, MinEl,MaxInd,MinInd
1. Цикл по строкам
2. Цикл по строке элементов
Алгоритм по строке:
1 MinEl = первый элемент, MaxEl = первый элемент, MaxInd=0,MinInd=0
2 Индекс = Индекс+1
3 Если текущий элемент<MinEl -> MinEl=текущий элемент, MinInd=текущий индекс
4. Если текущий элемент>MaxEl -> MaxEl=текущий элемент, MaxInd=текущий индекс
5. Если обработали последний элемент -> выход из цикла, если нет --> п.2
Шпиён (2006-05-08 16:36:00) [13]
> Дана матрица A(N,N). В каждой строке поменять местами наибольший
> и наименьший элементы.
А если в строке, например два одинаковых наименьших элемента? Ваши действия? -)
дямак (2006-05-08 16:25:00) [14]значит никто не поможет? Ну пожалуйста, я бы и сам разобрался, но времени уже почти нет! вчера скачал кучу книг, купил учебник Архангельского, но сами понимаете за 2 дня Делфи не изучишь!
дямак (2006-05-08 15:58:00) [15]проще то оно проще, только мне нужно чтобы я понимал что делаю!
пока вы мне тут втирали, я уже более или менее стал въезжать что к чему, а задание такое: Дана матрица A(N,N). В каждой строке поменять местами наибольший и наименьший элементы.
KilkennyCat (2006-05-08 15:51:00) [16]Вообщем, дямак, пиши задание полностью сразу... так проще будет.
дямак (2006-05-08 15:49:00) [17]опять я! может вы меня сейчас пошлёте куда подальше, но дочитав своё задание до конца я поня что мне ещё нужно В каждой строке поменять местами наибольший и наименьший элементы. скажите вот этот алгоритм правильный? если да , то как мне сделать так чтоб при нажатии на Button2 он мне обрабатывал мою первую матрицу?
var
A: array [1..N, 1..N] of Integer;
I, J, Min, Max, Temp: Integer;
begin
for I := Low(A) to High(A) do
begin
Min := Low(A[I]);
Max := Min;
for J := Succ(Low(A[I])) to High(A[I]) do
if A[I, Min] > A[I, J] then
Min := J
else if A[I, Max] < A[I, J] then
Max := J;
if Min <> Max then
begin
Temp := A[I, Min];
A[I, Min] := A[I, Max];
A[I, Max] := Temp
end;
end;
Шпиён (2006-05-08 15:36:00) [18]
> KilkennyCat © (08.05.06 15:20) [21]
>
> > как расссояние между столбцами уменьшить?
>
>
> заменить #9 на ' '
И будет криво -)
Лучше, например, так:
s:=s + Format('%4.2d',[Arr[i,j]]);
KilkennyCat (2006-05-08 15:28:00) [19]известно, куда... в армию.
дямак (2006-05-08 15:27:00) [20]спасибо Вам Мастера куда бы я без вас!!