Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Problem bei Pascalsche Dreieck (https://www.delphipraxis.net/124112-problem-bei-pascalsche-dreieck.html)

Borgschüler 14. Nov 2008 16:48


Problem bei Pascalsche Dreieck
 
Hallo forengemeinde!

Das folgende Programm soll in einem stringgrid das Pascalsche dreieck erzeugen.
Dabei wird erst in die oberste zeile ein 1er gelegt. alle anderen Kästchen sollen die summe der beiden Kästchen rechts oben und links oben des jeweiligen kästchens sein.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i,j,x : integer;
begin

x:=(0);
stringgrid1.cells[17,1]:= inttostr(1);

for i:= 1 to 34 do
 begin
    for j:= 1 to 10 do
    begin
        x:= x + strtoint(stringgrid1.cells[i-1,j-1])
         + strtoint(stringgrid1.cells[i+1,j-1]);
        stringgrid1.cells[i,j]:= inttostr(x);
    end;
 end;

end;
end.
Fehlermeldung:

''' ist kein gültiger Integerwert'


sitze schon den ganzen tag an dem programm, und kann den Fehler nicht finden!

Danke im vorraus,

DeddyH 14. Nov 2008 16:52

Re: Problem bei Pascalsche Dreieck
 
Stepp doch mal durch und schau, was in der entsprechenden Zelle steht, wenn der Fehler auftritt.

3_of_8 14. Nov 2008 16:56

Re: Problem bei Pascalsche Dreieck
 
Ich bin mir jetzt nicht ganz sicher, wie die Indizierung beim StringGrid ist. Kommt da zuerst x- oder zu erst y-Koordinate? Wenn es y zuerst ist, musst du nur bei der Stelle, wo du deine Koordinaten vertauschen. Das Problem ist nämlich, dass du irgendwo versuchst, eine Zahl aus einer Zelle zu lesen, die leer ist.

Sir Rufo 14. Nov 2008 16:58

Re: Problem bei Pascalsche Dreieck
 
oder mal so:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  ACol, ARow ,x : integer;
begin
  x := ( 0 ); // wofür denn die klammern? 
  StringGrid1.Cells[ 17, 1 ] := IntToStr( 1 ); // würde ja auch := '1'; gehen ;-)

  for ACol := 1 to 34
  do
    begin
      for ARow := 1 to 10 
      do
        begin
          x :=
            x + 
            StrToIntDef( StringGrid1.Cells[ ACol - 1, ARow - 1 ], 0 ) +
            StrToIntDef( StringGrid1.Cells[ ACol + 1, ARow - 1 ], 0 );
          StringGrid1.Cells[ ACol, ARow ] := IntToStr( x );
        end;
    end;
end;

end.
... btw ... so kann man es auch noch lesen ... ;-)

cu

Oliver

[edit]ich hab dann mal die Variablen angepasst, wegen der besseren Unterscheidung, was Col und was Row[/edit]

[edit2]aber das passt ja eigentlich gar nicht ...
Code:
....X....
...X.X...
..X.X.X..
.X.X.X.X.
X.X.X.X.X
denn du darfst ja nur die 'X'-Felder berechnen und die '.'-Felder bleiben leer![/edit2]
[edit3]oh graus ... du schreibst in zuerst in Zeile 1 (Cells[ 17, 1 ]), und dann berechnest du für jedes Feld der Zeile 1 einen Wert.
Warum dann erst die Mühe und dort etwas eintragen? Muss das vielleicht in Zeile 0?[/edit3]

Borgschüler 14. Nov 2008 17:13

Re: Problem bei Pascalsche Dreieck
 
Ja man will ja nur die X-felder haben.

Im endeffekt siehts so aus:

.....1
....1.1
...1.2.1
..1.3.3.1
.1.4.6.4.1

usw...


hmm irgenwie kommtn totaler blödsinn raus!
in der ersten(nichtgrauen) zeile steht neben dem ersten 1er ein 9er dann 46...


Wenn man sich bei dem dreieck die 3te zeile anschaut: Da besteht der 1er aus 0 und 1, der 3er aus 1 und 2 usw.

und was heisst strtointDEF??

Sir Rufo 14. Nov 2008 17:16

Re: Problem bei Pascalsche Dreieck
 
Also für die Lösung der Aufgabe musst du:

1 Zeile löschen
1 Zeile ändern
1 Zeile hinzufügen

dann ist fertig, du bist also nah dran.

Kleiner Tip - überleg doch mal unter welchen Umständen du ein Ergebnis schreiben sollst ... ;-)

cu

Oliver

Borgschüler 14. Nov 2008 17:23

Re: Problem bei Pascalsche Dreieck
 
meine güte ich zerbrech mir seit mittag den kopf drüber, bitte sag mir doch was nicht stimmt!

Fridolin Walther 14. Nov 2008 17:26

Re: Problem bei Pascalsche Dreieck
 
Das Problem ist, das es Dir nichts bringt, wenn Sir Rufo es Dir sagt. Weil letztlich musst Du es können und nicht Sir Rufo. Entsprechend klar das er Dir nur Tipps gibt und keine komplette Lösung präsentiert.

Borgschüler 14. Nov 2008 17:29

Re: Problem bei Pascalsche Dreieck
 
ja ber ich kann den fehler dann nachvollziehen und beim nächsten mal selber draufkommen.
Außerdem könnten es ja fehler sein, die ich aufgrund meines wissenstandes gar nicht erkennen kann, da hilft es niemandem wenn ich einen taqg meinse lebens vergeblich aufopfere.

Sir Rufo 14. Nov 2008 17:30

Re: Problem bei Pascalsche Dreieck
 
Zitat:

Zitat von 0xF30FC7
Das Problem ist, das es Dir nichts bringt, wenn Sir Rufo es Dir sagt. Weil letztlich musst Du es können und nicht Sir Rufo. Entsprechend klar das er Dir nur Tipps gibt und keine komplette Lösung präsentiert.

wieso muss ich das nicht können ... :gruebel:

aber das sind die fakten, und aufs pferd haben wir dir schon geholfen, jetzt nur noch die füsse in die steigbügel.

darum nochmal:
stell dir die frage, wie der wert an einer beliebigen stelle berechnet wird und vergleich das ergebnis mit deinem code, ob der das auch so macht ...

cu

Oliver

Sir Rufo 14. Nov 2008 17:31

Re: Problem bei Pascalsche Dreieck
 
Zitat:

Zitat von Borgschüler
ja ber ich kann den fehler dann nachvollziehen und beim nächsten mal selber draufkommen.
Außerdem könnten es ja fehler sein, die ich aufgrund meines wissenstandes gar nicht erkennen kann, da hilft es niemandem wenn ich einen taqg meinse lebens vergeblich aufopfere.

ich versichere dir, mit deinem wissensstand kannst du das lösen ;-)

Borgschüler 14. Nov 2008 17:45

Re: Problem bei Pascalsche Dreieck
 
kann es ein, dass ich acol und arow verwechsle?

und um die 0er wegzubekommen, muss ich eine if abfrage vor der ausgabe machen.

aber ich versteh zb. überhaupt nicht
Delphi-Quellcode:
x:= x + strtointdef(stringgrid1.cells[Acol - 1,Arow - 1 ] , 0)
         + strtointdef(stringgrid1.cells[Acol - 1 ,Arow + 1 ] , 0);
was die 0er nach der ] sollen

Fridolin Walther 14. Nov 2008 17:49

Re: Problem bei Pascalsche Dreieck
 
Delphi-Quellcode:
function StrToIntDef(const S: string; Default: Integer): Integer;
StrToIntDef konvertiert den String S in eine Zahl. Falls S keine gültige Zahl ist, wird stattdessen der Integer Wert Default zurückgegeben. Die ", 0" bedeutet also soviel wie: "Gib mir den String in der Zelle als Zahl zurück, und wenn da nichts drin steht, bitte 0.".

Sir Rufo 14. Nov 2008 17:53

Re: Problem bei Pascalsche Dreieck
 
Zitat:

Zitat von 0xF30FC7
"Gib mir den String in der Zelle als Zahl zurück, und wenn da nichts drin steht, bitte 0.".

"..., und wenn das nicht als Zahl zu interpretieren ist, bitte 0."

StrToIntDef( 'Guten Tag aber auch mal', 0 ) ergibt 0
StrToIntDef( '10 kleine ...', 0 ) ergibt 0

cu

Oliver

Fridolin Walther 14. Nov 2008 18:01

Re: Problem bei Pascalsche Dreieck
 
Zitat:

Zitat von Borgschüler
und um die 0er wegzubekommen, muss ich eine if abfrage vor der ausgabe machen.

Das ist schon mal richtig :).

Die anderen Sachen sind minimal. Nochmal kurz wie man das Dreieck berechnet:

Man geht jede Spalte durch. In jeder Spalte schaut man sich nun jede Zelle an. Für jede Zelle berechnet man jetzt die Summe der Zellen links oberhalb und rechts oberhalb der aktuellen Zelle. Die Summe trägt man dann in die aktuelle Zelle ein.

Und jetzt schau mal was Du dort machst ;).

Sir Rufo 14. Nov 2008 18:02

Re: Problem bei Pascalsche Dreieck
 
Zitat:

Zitat von Borgschüler
kann es ein, dass ich acol und arow verwechsle?

und um die 0er wegzubekommen, muss ich eine if abfrage vor der ausgabe machen.

aber ich versteh zb. überhaupt nicht
Delphi-Quellcode:
x:= x + strtointdef(stringgrid1.cells[Acol - 1,Arow - 1 ] , 0)
         + strtointdef(stringgrid1.cells[Acol - 1 ,Arow + 1 ] , 0);
was die 0er nach der ] sollen

ok, wir machen das jetzt noch einfacher:
Code:
..: 0 1 2 3 4 5 6
--+---------------
0 :      1
1 :    1   1
2 :  1   2   1
3 : 1   ?   ?   1
- Was für ein Wert kommt bei den Fragezeichen ( Feld[ 2, 3 ] und Feld[ 4, 3 ] ) hin?
- Wie wird der errechnet?
- Macht dein Programm das genauso?

cu

Oliver

Sir Rufo 14. Nov 2008 19:40

Re: Problem bei Pascalsche Dreieck
 
Entweder er hat es jetzt oder uns nicht mehr lieb ...

cu

Oliver

Fridolin Walther 14. Nov 2008 19:43

Re: Problem bei Pascalsche Dreieck
 
Ob wir mal in die anderen Delphi Foren schauen ob ers jetzt da versucht? Aber das wär schon böse :P. Dabei sind das - wenn er das IF einbaut - wirklich nur 2 winzige Kleinigkeiten.

Sir Rufo 14. Nov 2008 19:46

Re: Problem bei Pascalsche Dreieck
 
Zitat:

Zitat von 0xF30FC7
Ob wir mal in die anderen Delphi Foren schauen ob ers jetzt da versucht? Aber das wär schon böse :P.

Hab ich schon geschaut, aber bis jetzt nichts gefunden ;-)
Zitat:

Zitat von 0xF30FC7
Dabei sind das - wenn er das IF einbaut - wirklich nur 2 winzige Kleinigkeiten.

yes, sir

lbccaleb 14. Nov 2008 19:55

Re: Problem bei Pascalsche Dreieck
 
ich weiß nicht ob es dir weiter hilft, aber sonnst kannst du hier nochmal schauen:

Pascalsche Dreieck

Fridolin Walther 15. Nov 2008 15:06

Re: Problem bei Pascalsche Dreieck
 
Hier die gefixte Routine für alle Interessierten:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  ACol, ARow, x : Integer;
begin
  StringGrid1.Cells[ 17, 1 ] := '1';
  for ARow := 1 to 10 do
    for ACol := 1 to 34 do
      begin
        x :=
          StrToIntDef(StringGrid1.Cells[ACol - 1, ARow - 1], 0) +
          StrToIntDef(StringGrid1.Cells[ACol + 1, ARow - 1], 0);
        if x <> 0 then StringGrid1.Cells[ACol, ARow] := IntToStr(x);
      end;
end;
Die Fehler in der Routine des Threaderstellers sind folgende:

Er geht zuerst Spalte für Spalte durch und nicht Zeile für Zeile. Da sich die Berechnung darauf verlässt, das die Zeile davor komplett berechnet ist, müssen wir Zeile für Zeile arbeiten.

Ausserdem berechnet sich x nicht durch "x + <Wert Links Oben> + <Wert Rechts Oben>" sondern nur durch "<Wert Rechts Oben> + <Wert Links Oben>".

Sir Rufo 15. Nov 2008 15:09

Re: Problem bei Pascalsche Dreieck
 
Hast Du Deinen Code auch überprüft?

Ich sehe da auf jeden Fall noch einen groben Fehler ...

cu

Oliver

Fridolin Walther 15. Nov 2008 15:23

Re: Problem bei Pascalsche Dreieck
 
Jo. Welchen Fehler denn?

Borgschüler 15. Nov 2008 16:50

Re: Problem bei Pascalsche Dreieck
 
der fehler ist, dass man in der 2ten reihe anfangt und nicht in der ersten.

Fridolin Walther 15. Nov 2008 16:52

Re: Problem bei Pascalsche Dreieck
 
Ist in dem Fall unnötig, weil in Zeile 0 keine Werte vorhanden sind und somit niemals irgendwelche Werte in die Zeile 1 geschrieben werden (die 1 die dort platziert wird, wird also niemals geändert).

Borgschüler 15. Nov 2008 17:06

Re: Problem bei Pascalsche Dreieck
 
hinterher find ichs schad dass ich da gestern nicht draufgekommen bin.

naja ich hab auch schlecht wissen können was es mit dem Def auf sich hatte, danke jedenfalls!

Sir Rufo 15. Nov 2008 17:29

Re: Problem bei Pascalsche Dreieck
 
Zitat:

Zitat von Borgschüler
naja ich hab auch schlecht wissen können was es mit dem Def auf sich hatte, danke jedenfalls!

Öh, das hatte mit der Lösung eigentlich nichts zu tun, war in dem Fall nur eleganter zu lösen.
Und ausserdem ist dir der Unterschied zwischen StrToInt und StrToIntDef erklärt worden.
Der eigentliche Fehler lag doch wohl darin, dass du

a) den vorherigen wert mit dazuaddiert hattest ( x := x + ... )
b) du keine überprüfung gemacht hast, ob für das feld überhaupt eine berechnung erfolgen darf

Das Argument "konnte ich doch gar nicht wissen" kann hier wohl nicht gelten.

cu

Oliver


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:04 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 by Thomas Breitkreuz