Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.28;
Скачать: CL | DM;

Вниз

массив   Найти похожие ветки 

 
дямак ©   (2006-05-08 11:46) [0]

здравствуйте, Уважаемые мастера! На днях вот начал юзать 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 столбцов) объясните чё я неправильно делаю?


 
alex-drob ©   (2006-05-08 11:55) [1]

Тебе нужен масив вида mas: array [0..9,0..9] of integer.
Ну а если динамический то
_mas: array of integer;
mas: array of _mas;
Кажеться так.


 
дямак ©   (2006-05-08 12:06) [2]

сенкс


 
alex-drob ©   (2006-05-08 12:06) [3]


> _mas: array of integer;

Ошибся
type TMas=array of integer;
var mas:array of tmas;


 
Плохиш ©   (2006-05-08 12:08) [4]

mas: array of array of integer;


 
дямак ©   (2006-05-08 14:02) [5]

ещё такой вопросик! объясните или лучше напишите плиз как мне эту процедуру инициализации матрицы случайными целыми числами  адресовать procedure TForm1.Button1Click(Sender: TObject); (ну т.е. чтоб при нажатии на кнопку появлялась матрица 10*10)

type
 TMatrix=array [1..10,1..10] of integer;

var
 Arr:TMatrix;

procedure RandomMatrix(var M:TMatrix;r,c:integer);
var i,j:integer;
begin
for i:=1 to r do
 for j:=1 to c do
  M[i,j]:=random(10);
end;


 
Пусик ©   (2006-05-08 14:14) [6]

Инициализировать нужно неповторяющимися значениями или такого жесткого условия нет?


 
дямак ©   (2006-05-08 14:19) [7]

нет, любыми, плиз напиши если можешь


 
Пусик ©   (2006-05-08 14:22) [8]


> дямак ©   (08.05.06 14:19) [7]
>
> нет, любыми, плиз напиши если можешь

Так ты уже написал.

type
TMatrix=array [1..10,1..10] of integer;

var
Arr:TMatrix;

procedure RandomMatrix(var M:TMatrix;r,c:integer);
var
 i,j:integer;
 g: Integer;
begin
 g := r*c;
 for i:=1 to r do
  for j:=1 to c do M[i,j]:=random(g);
end;


 
дямак ©   (2006-05-08 14:28) [9]

ТЫ НАВЕРНОЕ МЕНЯ НЕ ПОНЯЛ. Я НАПИСАЛ ПРОЦЕДУРУ ДЛЯ ИНИЦИАЛИЗАЦИИ, А МНЕ НУЖНО ЕЩЁ НАПИСАТЬ ПРОЦЕДУРУ ДЛЯ ОБРАБОТЧИКА СОБЫТИЯ OnClick чтоб при нажатии на кнопку Button1 появлялась матрица 10*10, и где она ваще должна появляться в Memo или StringGrid?


 
Пусик ©   (2006-05-08 14:32) [10]


> и где она ваще должна появляться в Memo или StringGrid?


Так это тебе выбирать, где матрица должна отобразиться.


 
дямак ©   (2006-05-08 14:35) [11]

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


 
Шпиён   (2006-05-08 14:35) [12]


> дямак ©   (08.05.06 14:28) [9]

И вовсе незачем так орать (с)


 
Шпиён   (2006-05-08 14:47) [13]


type
TMatrix=array [1..10,1..10] of integer;

procedure TForm1.Button1Click(Sender: TObject);
var
Arr:TMatrix;
i,j:integer;
s:string;
row,col:integer;
   procedure RandomMatrix(var M:TMatrix;r,c:integer);
   var
    i,j:integer;
    g: Integer;
   begin
        g := r*c;
        for i:=1 to r do
            for j:=1 to c do M[i,j]:=random(g);
   end;

begin
   row:=10;col:=10;
   RandomMatrix(Arr,row,col);
   for i:=1 to row do
   begin
       s:="";
       for j:=1 to col do s:=s+IntToStr(Arr[i,j])+#9;
       Memo1.Lines.Add(s);
end;
end;



 
дямак ©   (2006-05-08 14:59) [14]

спасибо за помощь!
простите за назойливость, но как сделать так чтобы кол-во символов можно было самому вводить например в TEdit? а то уж больно она большая получается в этом примере!


 
Пусик ©   (2006-05-08 15:04) [15]


> дямак ©   (08.05.06 14:59) [14]
>
> спасибо за помощь!
> простите за назойливость, но как сделать так чтобы кол-во
> символов


Символов в чем?


 
дямак ©   (2006-05-08 15:07) [16]

символов в матрице, просто в приведённом коде Шпиёна матрица появляется,но в неё 4 столбца и где-то 30 строк


 
KilkennyCat ©   (2006-05-08 15:13) [17]


> 4 столбца и где-то 30 строк


а должно быть 10 на 10...


 
Шпиён   (2006-05-08 15:15) [18]


> просто в приведённом коде Шпиёна матрица появляется,но в
> неё 4 столбца и где-то 30 строк

Это каким-же образом ты так код испортить умудрился, чтобы он вместо матрицы 10x10 выдал матрицу 30х4? -(
ПлакалЪ


row:=StrToInt(Edit1.Text);
col:=StrToInt(Edit2.Text);


 
дямак ©   (2006-05-08 15:16) [19]

я понимаю что из стороки  TMatrix=array [1..10,1..10] of integer; следует что должно быть 10 на 10 ,но не получается, не верите попробуйте сами


 
дямак ©   (2006-05-08 15:20) [20]

сорри, она 10 на 10, просто между столбцами расстояние большое, вот я и подумал что больше, кстати как расссояние между столбцами уменьшить?


 
KilkennyCat ©   (2006-05-08 15:20) [21]


> как расссояние между столбцами уменьшить?


заменить #9 на "    "


 
Шпиён   (2006-05-08 15:21) [22]


> я понимаю что из стороки  TMatrix=array [1..10,1..10] of
> integer; следует что должно быть 10 на 10

Ничего подобного. 10 на 10 следует из строки
row:=10;col:=10;


 
дямак ©   (2006-05-08 15:27) [23]

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


 
KilkennyCat ©   (2006-05-08 15:28) [24]

известно, куда... в армию.


 
Шпиён   (2006-05-08 15:36) [25]


> KilkennyCat ©   (08.05.06 15:20) [21]
>
> > как расссояние между столбцами уменьшить?
>
>
> заменить #9 на "    "

И будет криво -)
Лучше, например, так:

      s:=s + Format("%4.2d",[Arr[i,j]]);


 
дямак ©   (2006-05-08 15:49) [26]

опять я! может вы меня сейчас пошлёте куда подальше, но дочитав своё задание до конца я поня что мне ещё нужно В  каждой строке поменять местами наибольший и наименьший элементы. скажите вот этот алгоритм правильный? если да , то как мне сделать так чтоб при нажатии на 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;


 
KilkennyCat ©   (2006-05-08 15:51) [27]

Вообщем, дямак, пиши задание полностью сразу... так проще будет.


 
дямак ©   (2006-05-08 15:58) [28]

проще то оно проще, только мне нужно чтобы я понимал что делаю!
пока вы мне тут втирали, я уже более или менее стал въезжать что к чему, а задание такое: Дана матрица A(N,N). В  каждой строке поменять местами наибольший и наименьший элементы.


 
дямак ©   (2006-05-08 16:25) [29]

значит никто не поможет?  Ну пожалуйста, я бы и сам разобрался, но времени уже почти нет! вчера скачал кучу книг, купил учебник Архангельского, но сами понимаете за 2 дня Делфи не изучишь!


 
Шпиён   (2006-05-08 16:36) [30]


> Дана матрица A(N,N). В  каждой строке поменять местами наибольший
> и наименьший элементы.

А если в строке, например два одинаковых наименьших элемента? Ваши действия? -)


 
Пусик ©   (2006-05-08 16:40) [31]


> дямак ©   (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:42) [32]

кстати да! фишка! может нужно чтобы матрица заполнялась случайными целыми неповторяющимися числами! Помогите плиз! Обещаю впреть больше сюда не соваться за советами и самостоятельно изучать Delphi! Пожалста


 
дямак ©   (2006-05-08 16:58) [33]

>Пусик ©   (08.05.06 16:40)

если б я шарил в этих алгоритмах! то написал бы, а мне надо уже готовый!


 
KilkennyCat ©   (2006-05-08 16:58) [34]

>    Алгоритм по строке:
>      1 MinEl = первый элемент, MaxEl = первый элемент, MaxInd=0,MinInd=0 это лишнее, или, по крайней мере, Low


 
дямак ©   (2006-05-08 17:10) [35]

Кто - нибудь пожалуйста напишите код!


 
Шпиён   (2006-05-08 17:35) [36]

Достаточно, чтобы числа в строке были уникальными (хотя это и не обязательно)...

> Кто - нибудь пожалуйста напишите код!

Чем это отличается от списывания?


 
Шпиён   (2006-05-08 17:50) [37]

Попробуй для начала разобраться с этим кодом:
Ограничения: матрица квадратная (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 18:14) [38]

пасиб, буду учиться!


 
дямак ©   (2006-05-08 18:26) [39]

>Шпиён   (08.05.06 17:50) [37]

на форме рамещаю компоненты  Panel1,Button1,Button2, Edit1,Memo1 согластно твоему коду, компилятор не ругается, но прога не реагирует на нажатие кнопок!


 
Шпиён   (2006-05-08 18:28) [40]

А обработчики на нажатия кнопок кто цеплять будет, Пушкин?



Страницы: 1 2 вся ветка

Текущий архив: 2006.05.28;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.03 c
2-1147267890
49 Cent
2006-05-10 17:31
2006.05.28
Не удается найти строку для обновления.


15-1146588095
Yegorchic
2006-05-02 20:41
2006.05.28
Объяснительная


2-1147240632
D@Nger
2006-05-10 09:57
2006.05.28
RxLib


2-1147412757
ruslan_as
2006-05-12 09:45
2006.05.28
Как убрать Enter-ы в DBMemo


2-1147249941
Валенок
2006-05-10 12:32
2006.05.28
Данные и DBComboBox