Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Pascal'sche Dreieck wie würdet ihr da ran gehen? (https://www.delphipraxis.net/117595-pascalsche-dreieck-wie-wuerdet-ihr-da-ran-gehen.html)

Spiderpig_GER_15 21. Jul 2008 21:27


Pascal'sche Dreieck wie würdet ihr da ran gehen?
 
Hi,

Ich will ein Paskal'sche Dreieck berechen, an sich ja eigentlich recht einfach, die ersten beiden Zahlen addiert ergibt die untere und so weiter.

In welcher form würdet ihr das Anzeigen? in einem Memo etc?
Und mit welchen Variablen wäre das am geschicktesten zu lösen?

MfG

Spiderpig

Namenloser 21. Jul 2008 22:16

Re: Pascal'sche Dreieck wie würdet ihr da ran gehen?
 
Ich hab sowas mal gemacht. Hab einfach pro Zeile ein Array of integer genommen. Die Positionen der Zahlen obendrüber und untendrunter waren recht einfach auszurechnen (bei sowas hilft immer ein Blatt Papier).

Ich hab grad mal mein [!Test]-verzeichnis durchforstet und das Projekt tatsächlich gefunden (scheint ja besser sortiert zu sein als ich dachte :mrgreen:). Dass ich den Code geschrieben habe ist schon etwas her, weshalb es sein kann, dass ich es heute eleganter lösen könnte/würde, aber funktionieren tut es jedenfalls (bis darauf dass die oberste 1 nicht gezeichnet wird).

Delphi-Quellcode:

type
  tintegerarray = array of integer;

var
  numbers: tintegerarray;

const
  breite = 24;

procedure TForm1.Button1Click(Sender: TObject);
var
  level,i,tmpx,tmpx2: integer;
  lastnumbers: tintegerarray;

  function getv1(pos: integer): integer;
  begin
    if pos-1 < 0 then
    begin
      result := 1;
      exit;
    end;
    result := lastnumbers[pos-1];
  end;
  function getv2(pos: integer): integer;
  begin
    if pos > high(lastnumbers) then
    begin
      result := 1;
      exit;
    end;
    result := lastnumbers[pos];
  end;
begin
  for level := 0 to 5 do
  begin
    lastnumbers := numbers;
    setlength(numbers,level+1);
    for i := 0 to level do
    begin
      numbers[i] := getv1(i)+getv2(i);
    end;
    tmpx := clientwidth div 2-((level+1) div 2)*breite;
    if odd(level+1) then //ungerade
      tmpx := tmpx-breite div 2;

    // 1 nr 1
    tmpx2 := tmpx-1*breite;
    tmpx2 := tmpx2-canvas.TextWidth('1') div 2;
    canvas.TextOut(tmpx2,10+level*breite,'1');

    // 1 nr 2
    tmpx2 := tmpx+(level+1)*breite;
    tmpx2 := tmpx2-canvas.TextWidth('1') div 2;
    canvas.TextOut(tmpx2,10+level*breite,'1');

    for i := 0 to level do
    begin
      tmpx2 := tmpx+i*breite;
      tmpx2 := tmpx2-canvas.TextWidth(inttostr(numbers[i]))*3 div 4;
      canvas.TextOut(tmpx2,10+level*breite,inttostr(numbers[i]));
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  setlength(numbers,1);
  numbers[0] := 1;
end;

Coder1990 22. Jul 2008 10:21

Re: Pascal'sche Dreieck wie würdet ihr da ran gehen?
 
ich hab früher auch mal ein pascalsches dreieck geproggt vll ist das besser verständlich:

Delphi-Quellcode:
function fakult(x:real):real;
var
i:integer;
begin
  i:=1;
  result:=1;
  for i:=1 to round(x) do
    result:=result*i;
end;

function n_uber_k(n,k:real):real;
begin
  if n = 0 then
    result:= 1 
  else
    result:=fakult(n)/(fakult(k)*fakult(n-k));
end;


procedure TForm1.Button1Click(Sender: TObject);
var
n,k,x,y:integer;
begin
  y:=10; // x,y sind nur die koordinaten für das textout
  n:=0;
  k:=0;
  repeat
    k:=0;
    x:=(form1.Width div 2)-(n*25); // dreieck simulieren, wert > 25 = breiteres dreieck ...
    repeat
      form1.canvas.TextOut(x,y,floattostr(n_uber_k(n,k)));
      x:=x+50; // 50 = abstand zwischen den "spalten"
      k:=k+1;
    until k=n+1;
    y:=y+35; // 35 = abstand zwischen den zeilen
    n:=n+1;
  until n = 26; // 26 = endwert
end;
Die Formel n_uber_k wurde uns vom Lehrer mitgeteilt, so berechnet man das Pascalsche Dreieck


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz