Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Классы


Автор: aleksandrfnsv1 27.4.2008, 08:37
 У меня есть класс
 Trup = class
private
 kol:integer;
size:integer;
prioritet:integer;
public
 constructor Create (kol:integer; size:integer; prioritet:integer);
 почему делфа ругается и как сделать правильно smile   smile  smile  smile  smile  smile 

Автор: volvo877 27.4.2008, 08:41
Цитата(aleksandrfnsv1 @  27.4.2008,  07:37 Найти цитируемый пост)
почему делфа ругается

Потому что у тебя уже есть поля класса с именами kol, size и prioritet, а ты определяешь еще и параметры конструктора с теми же именами...

Цитата(aleksandrfnsv1 @  27.4.2008,  07:37 Найти цитируемый пост)
как сделать правильно
Ну, например, вот так:
Код

Trup = class
private
  kol:integer;
  size:integer;
  prioritet:integer;
public
  constructor Create(Akol:integer; Asize:integer; Aprioritet:integer);

Автор: aleksandrfnsv1 27.4.2008, 11:47
Спасибо это сработало, а как сделать сортировку массива по свойству класса приоритет
Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  type
  TPismo = class
         private
         kolp,size,prioritet:integer;
         public
        constructor Create (akolp,asize,aprioritet:integer);
         function GetPrioritet(aprioritet:integer):integer;
        // procedure SetPrioritet(aprioritet:integer);
  end;
  const L=18;
var
  Form1: TForm1;
  mas:array [1..L] of TPismo;
  i:integer;
  masel:Tpismo;

implementation

{$R *.dfm}
        constructor TPismo.Create (akolp,asize,aprioritet:integer);
        begin
        randomize;
        kolp:=random(100);
        size:=random(67);
        prioritet:=random(3);
        //if prioritet<=3 then
          //begin

          //end;


        end;
   // procedure TPismo.SetPrioritet(aprioritet:integer);
   // begin
   // randomize;
     //   prioritet:=random(3);
   // end;
     
                     function TPismo.GetPrioritet(aprioritet:integer):integer;
                     begin
                         result:=prioritet;
                     end;


procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Clear;
for i:=1 to L do
begin
mas[i]:=TPismo.Create(random(34),random(40),random(3));

 // ShowMessage('ghbjhbntn'+mas[i]);  //'Имя: ' + inttostr(kolp) + '  приоритет: ' + inttostr(prioritet));

 end;
//if mas[i].prioritet<=3 then
//begin
  //  masel:=mas[i];
   // mas[i]:=mas[i+1];
    //mas[i+1]:=masel;
//end;

end;





end.



Автор: THandle 27.4.2008, 12:07
Ох... Кто ж учит то код так оформлять? smile 

Код

constructor TPismo.Create(akolp,asize,aprioritet:integer);
begin
  randomize;
  kolp:=random(100);
  size:=random(67);
  prioritet:=random(3);
  //if prioritet<=3 then
  //begin
  //end;
end;




А на кой конструктору параметры коль они не используется?

Может быть так?


Код

constructor TPismo.Create(akolp,asize,aprioritet:integer);
begin
  randomize;
  kolp:=akolp;
  size:=asize;
  prioritet:=aprioritet;
  //if prioritet<=3 then
  //begin
  //end;
end;




Как мне кажется так правильно, так как дальше идет такой вызов:

Код

mas[i]:=TPismo.Create(random(34),random(40),random(3));





Вот тебе пузырьковая сортировка:
Код


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Memo2: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TPismo = class
    private
      kolp, size, prioritet:integer;
    public
      constructor Create (akolp,asize,aprioritet:integer);
      function GetPrioritet(aprioritet:integer):integer;
      // procedure SetPrioritet(aprioritet:integer);
  end;

const
  L = 18;

var
  Form1 : TForm1;
  mas : array [1..L] of TPismo;
  i : integer;

implementation

{$R *.dfm}
constructor TPismo.Create(akolp,asize,aprioritet:integer);
begin
  randomize;
  kolp:=akolp;
  size:=asize;
  prioritet:=aprioritet;
  //if prioritet<=3 then
  //begin
  //end;
end;

function TPismo.GetPrioritet(aprioritet:integer):integer;
begin
  result := prioritet;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Clear;
  for i:=1 to L do
    begin
      mas[i]:=TPismo.Create(random(34),random(40),random(3));
      memo1.Lines.Add(IntToStr(mas[i].prioritet));
    end;
end;

procedure Swap(iPos1, iPos2 : integer);
var
  tmp : TPismo;
begin
  tmp := mas[iPos1];
  mas[iPos1] := mas[iPos2];
  mas[iPos2] := tmp;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i, j : integer;
begin
  for i := 1 to L - 1 do
    for j := 1 to L - i do
      if mas[j].prioritet > mas[j+1].prioritet then
         swap(j, j + 1);

  for i := 1 to L do
    memo2.Lines.Add(IntToStr(mas[i].prioritet));
end;

end.


В аттаче проект.

Автор: aleksandrfnsv1 27.4.2008, 14:09
но она не сортирует почему то так как надо

Автор: THandle 27.4.2008, 14:11
aleksandrfnsv1, как понять не сортирует как надо?

Сортирует по возрастанию приоритеты.

А как надо?

Зачем копия?

http://forum.vingrad.ru/topic-208540/view-getnewpost.html

Автор: aleksandrfnsv1 27.4.2008, 19:53
Да неправильно понял, все нормально там.
а не знаетли кто как сделать, так чтобы массив заполнялся допустим не весь а число элементов в него добавлялось по random

Автор: Beltar 28.4.2008, 11:24
2 aleksandrfnsv1

Есть соглашение о наименовании полей и методов.
Код

TMyClass=class
  private
    FField:Integer;
    procedure SetField(const Value:Integer);
    function GetField:Integer;
  public
     property Field read GetField write SetField;


Имя любого поля начинается с F, методы для записи\взятия значения с Set\Get.
Тогда и проблем с именами не будет.

Цитата

а не знаетли кто как сделать, так чтобы массив заполнялся допустим не весь а число элементов в него добавлялось по random


Так задай границы цикла случайными в чем проблема-то??

Автор: aleksandrfnsv1 28.4.2008, 16:11
Так задай границы цикла случайными в чем проблема-то??


А как не пойму можно пример smile 

Автор: THandle 28.4.2008, 18:12
Код

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Clear;
  for i:=1 to random(L) + 1 do
    begin
      mas[i]:=TPismo.Create(random(34),random(40),random(3));
      memo1.Lines.Add(IntToStr(mas[i].prioritet));
    end;
end;


Как то так?

Автор: aleksandrfnsv1 28.4.2008, 19:42
нет  я хочу чтобы каждый промежуток времени масиив заполнялся каким то числом элементов, которые поступают не по равномерному закону распределения ( random) , а по нормальному закону распределения

Автор: Beltar 29.4.2008, 07:39
Если хочешь нормальный закон распределения попробуй сымитировать плотность, например, генерь Random(101) если попало в 30-70 делай 3 числа из диапазона максимальной плотности, если 10-29 и 71-90 делай 2 отклонения, если совсем крайние значения, то делай одно крайнее. Ну и хоть 10 диапазонов задай. Практически ты же, наверное, прикидываешь вероятности попадания в диапазон.

Цитата

А как не пойму можно пример


Ну заведи переменную FillCount например и сделай ей FillCount:=Randon(High(Massive)+1); и 
for i:=0 to FillCount do
  begin
  end;

В чем проблема-то?

Автор: aleksandrfnsv1 29.4.2008, 20:15
я вообще в вероятностях не понимаю smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)