![]() |
Pascalsches Dreieck o0
Hallo, könnt ihr mir helfen ein Pascalsches Dreieck zu schreiben? ;/
So weit bin ich bis jetzt gekommen aber mehr schaffe ich einfach nicht und eine Rekursive Lösung habe ich bis jetzt noch nicht gefunden ...
Code:
Soo, das Dreieck soll dann in einer Memo oder ähnlichem ausgegeben werden :)
function pas(reihe,wert:byte):longint;
begin if (wert=0) or (wert=reihe) then pas:=1 else pas:=pas(reihe-1,wert-1) + pas(reihe-1,wert) end; procedure TPascal.b_berechne_zeileClick(Sender: TObject); var i: integer; exponent: byte; zeile: string; begin zeile:=''; exponent:=spe_exponent.value; for i:=0 to exponent do zeile:=zeile+inttostr(pas(exponent,i))+' '; e_ausgabe.Text:=zeile; end; procedure TPascal.b_endeClick(Sender: TObject); begin close; end; procedure TPascal.b_koeffizientClick(Sender: TObject); var exponent, koeffizient: integer; begin exponent:=spe_exponent.Value; koeffizient:=spe_koeffizient.value; e_koeffizient.Text:=inttostr(pas(exponent,koeffizient-1)) end; Ich hoffe ihr könnt mir helfen :( Mfg Arne |
AW: Pascalsches Dreieck o0
Hallo - Du hast schon verstanden was 'rekursiv' ist, oder? Was du angibst ist rekursiv.
Meinst du zufällig eine 'iterative' Lösung? |
AW: Pascalsches Dreieck o0
Sorry Günther :) Aah :D
Also es ging mir eigentlich darum, wie ich das Ergebnis nun in einer Art Memo ausgeben kann, sodass es aussieht wie ein Pascalsches Dreieck - Das was ich bisher geschrieben hab zeigt leider imme rnur eine Zeile an :/ |
AW: Pascalsches Dreieck o0
Ich kann nur raten, wer oder was bsp.
Delphi-Quellcode:
oder
e_koeffizient
Delphi-Quellcode:
ist - Ein Edit-Feld, irgendetwas anderes?
e_ausgabe
Wie auch immer, schaue nochmal auf deine drei Zeilen
Delphi-Quellcode:
Wenn wir die "richtig" einrücken, sieht man es vielleicht etwas deutlicher:
for i:=0 to exponent do
zeile:=zeile+inttostr(pas(exponent,i))+' '; e_ausgabe.Text:=zeile;
Delphi-Quellcode:
Jetzt? Du schreibst 'exponent mal' in deine Variable
for i:=0 to exponent do
zeile:=zeile+inttostr(pas(exponent,i))+' '; e_ausgabe.Text:=zeile;
Delphi-Quellcode:
einen neuen Wert, erst danach stellst du in
zeile
Delphi-Quellcode:
dar, was am Schluss drinsteht.
e_ausgabe
Wenn du mehrere Zeilen in z.B. einer TMemo haben möchtest: Eine Zeile fügst du mit
Delphi-Quellcode:
hinzu.
meineMemo.Lines.Add('Dies ist eine Zeile');
Kommst du jetzt weiter? |
AW: Pascalsches Dreieck o0
Ich habe dir eine PM geschrieben :) Vielen Dank :)
|
AW: Pascalsches Dreieck o0
Wenn wir hier weitermachen:
Wir haben zwei Baustellen:
Zu 1) Das
Delphi-Quellcode:
ist eine Prozedur die zum Zeilen-Objekt deiner Memo1-Objekt gehört. Das Zeilen-Objekt ("Lines") wiederum gehört zu deinem Memo1-Objekt. Du sagst also richtigerweise
Add()
Delphi-Quellcode:
. Die Zuweisung dahinter brauchst du nicht, du sagst einfach nur "Ihr Zeilen, fügt das hier (der Parameter in den Klammern) hinzu!". In den Klammern gibt man (leider) nicht an, in welche Zeile man es packen will. Das Add() fügt immer eine neue Zeile ganz unten hinzu. Das muss uns erst einmal reichen.
Memo1.Lines.Add(...)
Für die ...-Angabe brauchen wir jetzt allerdings eine Zeichenkette ("String"). Genau wie beim Edit-Feld auch schon: Dazu hast du ja die Variable
Delphi-Quellcode:
gemacht.
zeile
Alles klar soweit? Statt
Delphi-Quellcode:
fügen wir jetzt ganz billig eine Zeile in die Memo hinzu:
e_ausgabe.Text:=zeile;
Delphi-Quellcode:
. Tolle Wurst.
Memo1.Lines.Add(zeile);
Jetzt kommt noch Punkt 2, das ist eigentlich sogar einfacher. Die Frage vorher: Hast du verstanden, was eine for-Schleife so macht? |
AW: Pascalsches Dreieck o0
In meinem Fall erzeugt die for - to Schleife ja die Zahlen, die zwischen 0 und dem Exponent sind - Also wenn der Exponent 5 ist werden die Zahlen 1,2,3,4 und 5 erzeugt :)
|
AW: Pascalsches Dreieck o0
Wäre ich ein Lehrer, wäre ich über die Antwort wohl nicht ganz glücklich :wink:
Eine for-Schleife erzeugt nicht einfach Zahlen und geht dann nach Hause. Ich würde es so darstellen, dass man in einer for-Schleife einmal
Deine Zahlenreihe geht von 0 bis einschließlich "exponent". Das hast du mit deinem
Delphi-Quellcode:
abgedeckt.
for i:=0 to exponent
Nur wo steckt der zweite Teil? Das ist das, was hinter deinem do kommt. Und zwar nicht alles was du heute noch schreibst, sondern nur die nächste Anweisung hinter dem do. Deshalb hatte ich das vorhin auch so eingerückt:
Delphi-Quellcode:
Die Zuweisung
for i:=0 to exponent do
zeile:=zeile+inttostr(pas(exponent,i))+' '; e_ausgabe.Text:=zeile;
Delphi-Quellcode:
wird (exponent+1) mal ausgeführt. In jedem Aufruf ändert sich deine Variable i: Im ersten Aufruf ist sie 0, dann 1, ... und am Schluss ist sie gleich "exponent".
zeile:=zeile+inttostr(pas(exponent,i))+' '
Jetzt wollen wir ja nicht nur in die Variable "zeile" das richtige reinschreiben, wir wollen auch jedes mal eine Zeile an die Memo anhängen - Wir müssen die For-Schleife nun irgendwie so hinbekommen, dass wir den Teil, der für jeden Eintrag unserer Zahlenreihe ausgeführt wird, auf unser
Delphi-Quellcode:
ausweiten.
Memo1.Lines.Add(...)
Das geschieht mit etwas, das du schonmal gesehen hast:
Delphi-Quellcode:
und
begin
Delphi-Quellcode:
. Wahrscheinlich werde ich später über den Haufen geknüppelt, aber drücken wir es vereinfacht einmal so aus: Alles was du zwischen ein
end
Delphi-Quellcode:
und
begin
Delphi-Quellcode:
packst, kommt Delphi wie eine einzelne Anweisung vor.
end
Baue dir einmal eine Prozedur (z.B. einem Button-Klick) eine for-Schleife die in etwa folgendermaßen aussieht:
Delphi-Quellcode:
Kommst du damit weiter?
for i:=0 to 10 do begin
Memo1.Lines.Add('Mein Wert ist gerade '+IntToStr(i)); Memo1.Lines.Add('Diese Zeile fühlt sich hier wohl'); end; Memo1.Lines.Add('Diese Zeile kommt ganz zum Schluss... Und das nur ein mal.'); |
AW: Pascalsches Dreieck o0
for i:=0 to 10 do begin // Warum denn 10? Es müsste doch Exponent sein oder?
Memo1.Lines.Add('Mein Wert ist gerade '+IntToStr(i)); // Der aktuelle Wert ? Der ist doch immer i + 1 also hier 1,2,3 - 11 Memo1.Lines.Add(' '); Die Zeile belibt dann ja leer end; Memo1.Lines.Add(' '); Die doch dann auch, aber dann passt das mit dem begin und end nicht... :( |
AW: Pascalsches Dreieck o0
Zitat:
Dann: Ich hätte auch Smileys oder Gedichte in die Add()-Anweisungen schreiben können. Du kannst den Text natürlich auch gerne entfernen, dann hast du natürlich leere Zeilen. Wie man sieht, ist es wohl eine gute Sache, dass ich meine Brötchen nicht damit verdiene, Dinge zu erklären. Hast du es nicht einmal ausprobiert? Ich wollte mit diesem wundervollen Beispiel nur zeigen, wie eben das, was zwischen
Delphi-Quellcode:
und
begin
Delphi-Quellcode:
steht für jede Zahl in deiner Zahlenreihe wiederholt wird, die letzte Zeile allerdings nicht!
end
In deinem Memo-Feld würde somit nach dem Klick folgendes stehen:
Code:
Mein Wert ist gerade 1
Diese Zeile fühlt sich hier wohl Mein Wert ist gerade 2 Diese Zeile fühlt sich hier wohl Mein Wert ist gerade 3 Diese Zeile fühlt sich hier wohl Mein Wert ist gerade 4 Diese Zeile fühlt sich hier wohl Mein Wert ist gerade 5 Diese Zeile fühlt sich hier wohl Mein Wert ist gerade 6 Diese Zeile fühlt sich hier wohl Mein Wert ist gerade 7 Diese Zeile fühlt sich hier wohl Mein Wert ist gerade 8 Diese Zeile fühlt sich hier wohl Mein Wert ist gerade 9 Diese Zeile fühlt sich hier wohl Mein Wert ist gerade 10 Diese Zeile fühlt sich hier wohl Diese Zeile kommt ganz zum Schluss... Und das nur ein mal. |
AW: Pascalsches Dreieck o0
Es tut mir Leid, du erklärst wirklich sehr professionell und ausfühlich, allerdings bin ich das absolute Gegenteil eines Schnelllerners ;)
for i := 0 to exponent do Memo1.Lines.Add('Mein Wert ist gerade '+IntToStr(i)); // Das habe ich Versatnden, der aktuelle Wert ist also immer der Exponent aber was ist dann mit #Mein Wert ist gerade ' gemeint? Klar, der aktuelle Wert - aber was soll ich hier einsetzen? Memo1.Lines.Add('Diese Zeile fühlt sich hier wohl'); // Das ist doch nur ein 'Lückenfüller' oder? :) end; Memo1.Lines.Add // gibt dann ja einfach die letzte Zeile an :) |
AW: Pascalsches Dreieck o0
Ja, das "Mein Wert ist gerade" war unglücklich formuliert. Es hätte besser "Die schleifenvariable i entspricht gerade:" oder ähnlich heißen sollen.
Wie gesagt, im Endeffekt hattest du eigentlich schon alles. Die einzige Herausforderung, vor der wir momentan stehen, ist in der for-Schleife nicht eine Sache (die Variable "zeile" setzen), sondern zwei Sachen zu tun: Die Variable "zeile" setzen und die Variable "zeile" dann ins Memo schreiben. In Delphi ist es (glaube ich) nicht sonderlich populär, aber in anderen Sprachen nennt zusammen gruppierte, aufeinanderfolgende (sehr salopp umschrieben :?) "einen Block". Wie weiter oben: Die For-Schleife hat zwei Bestandteile:
In unserem Fall ist der ganze Codeblock unsere Zwei Anweisungen: Variable "zeile" setzen und die Variable "zeile" in unserer Memo ausgeben. Du hast anscheinend privat keine Delphi-Installation und kannst nicht mal etwas ausprobieren? Gerade das ist eigentlich, was an der Informatik Spaß macht: (Zumindest meistens) kann man herumprobieren wie man lustig ist, ohne etwas kaputt zu machen... PS: Bitte packe Delphi-Quellcode hier im Forum immer in (delphi)(/delphi)-Tags (mit eckigen Klammern), somit kann man das besser lesen. |
AW: Pascalsches Dreieck o0
Delphi-Quellcode:
begin
for i:=0 to exponent do Memo1.Lines.Add('Mein Wert ist gerade '+IntToStr(i)); Memo1.Lines.Add (zeile(i)) So etwa? Ich besitze Delphi 6 - leider kann ich keine Anwendungen starten, da dich mein liebes Programm dann immer aufhängt :) |
AW: Pascalsches Dreieck o0
Nein, nicht ganz. Bislang hatten wir für jeden Zahlenwert zwischen 0 bis "exponent" die Zuweisung der Variable Zahl. Das war schon ganz gut so. Jetzt wollen wir nach jeder Zuweisung das in die Memo schreiben. Weiterhin für jeden Zahlenwert. Und das beides muss direkt zwischen das begin und end:
Delphi-Quellcode:
Dinge wie Einrückungen sind im Endeffekt nur Geschmackssache für das menschliche Auge, dem Computer ist das (in Delphi) relativ egal, für ihn zählt nur das begin und end. Aber so sieht man als Mensch auf einen Blick, dass sich diese zwei Anweisungen immer wiederholen und zusammengehören.
for i:=0 to exponent do BEGIN
zeile:=zeile+inttostr(pas(exponent,i))+' '; Memo1.Lines.Add(zeile); END; Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:02 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