Einzelnen Beitrag anzeigen

Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

Re: Pascal'sche Dreieck wie würdet ihr da ran gehen?

  Alt 21. Jul 2008, 23:16
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 ). 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;
  Mit Zitat antworten Zitat