Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

массив


Страницы:   1 2 3

дямак ©   (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]

спасибо Вам Мастера куда бы я без вас!!


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо