AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

mehrdimensionale Arrays

Ein Thema von JackTheRippa · begonnen am 27. Apr 2008 · letzter Beitrag vom 27. Apr 2008
Antwort Antwort
JackTheRippa

Registriert seit: 11. Aug 2007
4 Beiträge
 
#1

mehrdimensionale Arrays

  Alt 27. Apr 2008, 18:04
Hi Leute,

für eine Monte-Carlo-Simulation (= Berechnung von Pi; Monte-Carlo-Algorithmus) will ich Punkte in einem Koordinatensystem zufällig generieren. Die Koordinaten sollen dann in einem Array (dynamisch) gespeichert werden, das ein "Unter-"array mit zwei Indizes hat, um dort jede x und y-Koordinate zu speichern.
Also Array of Array[0..1] of Real oder so.
Wo kann ich das deklarieren und wie greife ich sowohl auf das übergeordnete als auch auf das untergeordnete Array nacheinander zu?

Gruß JTR
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: mehrdimensionale Arrays

  Alt 27. Apr 2008, 18:15
Ich würde mir einen Typ delarieren:

Delphi-Quellcode:
type
    TKord = Record
        x, y, Extended;
    end;

...
   Koordinaten: Array of TKord;
oder
   Koordinaten: Array of Array of Extended;
Markus Kinzler
  Mit Zitat antworten Zitat
JackTheRippa

Registriert seit: 11. Aug 2007
4 Beiträge
 
#3

Re: mehrdimensionale Arrays

  Alt 27. Apr 2008, 18:28
Also das Prog ohne arrays sieht im moment so aus:

Delphi-Quellcode:
unit mUnit;

interface

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

type
  TForm1 = class(TForm)
    BtStart: TButton;
    EdWdh: TEdit;
    EdTreffer: TEdit;
    EdPi: TEdit;
    ImBild: TImage;
    LaTropfenzahl: TLabel;
    LaTreffer: TLabel;
    LaPi: TLabel;
    Lapii: TLabel;
    Label1: TLabel;
    TiLabel: TTimer;
    BtClear: TButton;
    BtClose: TButton;
    procedure BtStartClick(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure TiLabelTimer(Sender: TObject);
    procedure BtClearClick(Sender: TObject);
    procedure BtCloseClick(Sender: TObject);
  private
    { Private-Deklarationen }
    IMLINKS: Boolean;
    IMRECHTS: Boolean;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BtStartClick(Sender: TObject);
VAR z, x, y: REAL; i, Treffer, Tropfenzahl, x1, y1: Integer;
begin
 Tropfenzahl:= StrToInt(Edwdh.Text);
 Treffer:=0;
 For i:=1 to Tropfenzahl do
  Begin
   x:=random;
   y:=random;
   x1:=round (x*200);
   y1:=round (y*200);

  IF x*x + y*y <= 1 Then
   Begin
    Treffer:= Treffer + 1;
    ImBild.Canvas.Pixels[x1,y1]:=clred;
   End
    Else
     Begin
     ImBild.Canvas.Pixels[x1,y1]:=clblue;
     End;
   End;

   z:= (Treffer / Tropfenzahl) * 4;
   EdTreffer.Text:=IntToStr(Treffer);
   EdPi.Text:=FloatToStr(z);
   
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
 randomize;
 ImBild.Canvas.Ellipse(-200,200,200,-200);

 IMLINKS:= false;

 IMRECHTS:= true;
  IF IMRECHTS THEN TiLabel.Enabled:=true;

end;

procedure TForm1.TiLabelTimer(Sender: TObject);
begin
    IF IMRECHTS THEN
    Begin
     Label1.Left:= Label1.Left + 1;
    End;
   IF Label1.Left >= 208 THEN
    Begin
     IMRECHTS:=false;
     IMLINKS:=true;
    End;
   IF IMLINKS THEN
    Begin
     Label1.Left:= Label1.Left - 1;
    End;
   IF Label1.Left <= 8 THEN
    Begin
     IMLINKS:=false;
     IMRECHTS:=true;
    End;
end;

procedure TForm1.BtClearClick(Sender: TObject);
begin
 ImBild.Canvas.Rectangle(0,0,200,200);
 ImBild.Canvas.Ellipse(-200,200,200,-200);
 EdWdh.Text:='';
 EdTreffer.Text:='';
 EdPi.Text:='';
end;

procedure TForm1.BtCloseClick(Sender: TObject);
begin
 close
end;

end.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: mehrdimensionale Arrays

  Alt 27. Apr 2008, 20:03
Delphi-Quellcode:
setLength( Koordinaten, Tropfenanzahl -1);
...

Koordinaten[i].x := x1;
Koordinaten[i].y := y1;
Markus Kinzler
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: mehrdimensionale Arrays

  Alt 27. Apr 2008, 20:48
Hallo,

ein paar kleine Anmerkungen:

Randomize() beim Ereignis Form.OnActivate() wird mitunter mehrmals aufgerufen - besser man koppelt es an Form.OnCreate().

Statt TKord kann man auch TPoint nehmen.

Warum sollen denn die Koordinaten überhaupt zwischengespeichert werden?

Hier noch ein Muster ohne Wert:

Delphi-Quellcode:
const
  R = 200;

procedure TDemoForm.StartButtonClick(Sender: TObject);
const
  TwoColors: array [Boolean] of TColor = (clBlue, clRed);
var
  z, x, y: Double;
  i, Treffer, Tropfenzahl: Integer;
  isHit: Boolean;
begin
  Tropfenzahl:= StrToInt(Edwdh.Text);
  Treffer:=0;
  for i := 1 to Tropfenzahl do
  begin
    x := Random;
    y := Random;
    isHit := x*x + y*y <= 1;
    Inc(Treffer, Ord(isHit));
    ImBild.Canvas.Pixels[Round(x * R), Round(y * R)] := TwoColors[isHit];
  end;
  z := (Treffer / Tropfenzahl) * 4;
  EdTreffer.Text := IntToStr(Treffer);
  EdPi.Text := FloatToStr(z);
end;
Freundliche Grüße
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: mehrdimensionale Arrays

  Alt 27. Apr 2008, 20:57
Stimmt, an TPoint habe ich nicht gedacht.
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz