Übung zu Array < Pascal < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Aufgabe | Die Fibonacci-Folge ist wie folgt definiert:
1.Zahl:1
2.Zahl:1
Alle weiteren Zahlen berechnen sich aus der Summe des Vorgängers und Vorvorgängers. Also 3.Zahl ist 1.Zahl+2.Zahl.
Schreiben Sie ein Programm, dass die Fibonacci-Zahlen bis zur 25.Zahl berechnet, in einem Array "Fibonacci" abgespeichert und anschließend auf dem Bildschirm ausgibt. |
Ein liebes Hallo :O)
Wir haben gestern diese Aufgabe bekommen und beschäftigen uns die nächste Zeit mit Arrays in Verbindung der for-Schleife.
Ich bin mir aber nicht sicher, ob ich den Syntax richtig verstanden habe, denn mein Programm gibt nur die letzte Zahl (75025) aus, anstatt alle von 1,1,2,3,5 usw.
Wo liegt mein Fehler, ich finde ihn beim besten Willen nicht. Über Anregungen bedanke ich mich schonmal im Vorraus.
Mein Programm
Program Fibo_test;
uses wincrt;
Var i,ausgabe:longint;
Fibo:array [1..25] of longint;
antwort:char;
BEGIN{Programm}
WriteLn(' Berechnungsprogramm für Fibo-Folge ');
WriteLn;
antwort:='j';
while(antwort='j')do
Begin{While do}
Fibo[1]:=1;
Fibo[2]:=1;
for i:=3 to 25 do
fibo[i]:=fibo[i-1]+fibo[i-2];
Write(fibo[i],',');
WriteLn;
WriteLn('Nochmal? Wählen "j" für ja und "n" für nein.');
ReadLn(Antwort);
ClrScr;
end;{of while}
End.
Gruß Tobias
|
|
|
|
Hallo Tobias!
> Die Fibonacci-Folge ist wie folgt definiert:
> 1.Zahl:1
> 2.Zahl:1
> Alle weiteren Zahlen berechnen sich aus der Summe des
> Vorgängers und Vorvorgängers. Also 3.Zahl ist
> 1.Zahl+2.Zahl.
> Schreiben Sie ein Programm, dass die Fibonacci-Zahlen bis
> zur 25.Zahl berechnet, in einem Array "Fibonacci"
> abgespeichert und anschließend auf dem Bildschirm ausgibt.
> Ein liebes Hallo :O)
>
> Wir haben gestern diese Aufgabe bekommen und beschäftigen
> uns die nächste Zeit mit Arrays in Verbindung der
> for-Schleife.
>
> Ich bin mir aber nicht sicher, ob ich den Syntax richtig
> verstanden habe, denn mein Programm gibt nur die letzte
> Zahl (75025) aus, anstatt alle von 1,1,2,3,5 usw.
>
> Wo liegt mein Fehler, ich finde ihn beim besten Willen
> nicht. Über Anregungen bedanke ich mich schonmal im
> Vorraus.
>
> Mein Programm
>
> Program Fibo_test;
> uses wincrt;
>
> Var i,ausgabe:longint;
> Fibo:array [1..25] of longint;
> antwort:char;
>
>
> BEGIN{Programm}
> WriteLn(' Berechnungsprogramm für Fibo-Folge ');
> WriteLn;
>
>
> antwort:='j';
> while(antwort='j')do
> Begin{While do}
> Fibo[1]:=1;
> Fibo[2]:=1;
=================
> for i:=3 to 25 do
[mm] \blue{Begin}
[/mm]
> fibo:=fibo[i-1]+fibo[i-2];
>
for i:=1 to 25 do
> Write(fibo,',');
[mm] \blue{End;}
[/mm]
=================
Ich denke der Fehler ist in diesem Bereich zu finden. So wie die Syntax hier lautet, werden alle Zahlen mittels der for-Schleife berechnet und im array gespeichert. Wenn die for-Schleife dann aber für das letzte i=25 durchlaufen ist, dann wird mit dem write-Befehl nur die Zahlfür das aktuelle i (also, die Zahl an 25.Stelle) ausgegeben und das müsste die letzte Berechnete Zahl sein.
Meines Erachtens hast du nun 2 Möglichkeiten:
1.
Du lässt dir die aktuelle, berechnete Zahl jeweils ausgeben, sobald sie berechnet wurde, indem du den write-Befehl in die for-Schleife miteinbeziehst. (blaue Syntax; das dick geschriebene dabei nicht berücksichtigen!)
2.
Du baust noch eine zweite for-Schleife für die Ausgabe der Zahlen ein. (dick geschriebene Syntax; die blaue Syntax hierbei nicht berücksichtigen)
Das hätte zur folge, daß mit der von dir erstellten, ersten for-Schleife die zahlen berechnet werden und mit der zweiten for-Schleife die Zahlen ausgegeben werden.
Kleiner Hinweis am Rande:
In Pascal ist es so, daß ein Befehl, der direkt nach einer for-Schleife folgt in der for-Schleife berücksichtigt wird. Willst du mehr als einen Befehl in der for-Schleife abarbeiten, dann musst du diese mit Begin und End; eingrenzen (siehe erste Möglichkeit)
>
>
> WriteLn;
> WriteLn('Nochmal? Wählen "j" für ja und "n" für nein.');
> ReadLn(Antwort);
>
> ClrScr;
> end;{of while}
>
> End.
>
> Gruß Tobias
Gruß,
Tommy
|
|
|
|
|
Hi Tommy :O)
Vielen Dank für deine schnelle und vorallem so super gelungene Beschreibung des Lösungsansatzes.
Ich habe es gleich mal ausprobiert und siehe da, es funktioniert :O)
Ich war nämlich schon kurz davor zu verzweifeln..... weil ich einfach nicht wuste, wo der Fehler sein könnte.
Ich danke dir vielmals
gruß tobias
|
|
|
|
|
Hallo :O)
Das Programm läuft, worüber ich sehr froh bin. Aber nun meine Frage zu der Formatierung in TPW:
Ist der "WriteLn" -Befehl insoweit begrenzt, dass er nur eine bestimmte Anzal von Zeilen auf den Bildschirm gibt? Denn bei mir müste stehen:
Berechnungsprogramm der ........
2
3
5
8
usw.
aber der Begrüßungstext und die Zahl 2 fehlen ganz, als hätte er im Fenster dafür keinen Platz und "Hochscrollen" geht aus nicht. Wenn ich die Zahlen mit "Write" schreibe, sieht das irgendwie doof aus, denn ich trenne die Zahlen ja mit Komma und er fängt dann die zweite Zeile mit einem Komma an.
Beispiel:
1,1,2,3,5,8
,13,21
und das sieht doof aus.
Vielleicht weiß ja jemand eine Lösung, sofern TPW da Möglichkeiten bietet
Gruß Tobias
|
|
|
|
|
Hallo nochmals!
> Hallo :O)
>
> Das Programm läuft, worüber ich sehr froh bin. Aber nun
> meine Frage zu der Formatierung in TPW:
>
> Ist der "WriteLn" -Befehl insoweit begrenzt, dass er nur
> eine bestimmte Anzal von Zeilen auf den Bildschirm gibt?
Leider ja. Soweit ich mich erinnere sind es ein bisschen was über 20 (ich glaub 22 oder 24) Zeilen die auf dem Bildschirm bei TP existieren. Der writeln-Befehl schreibt bekanntlich die Ausgabe auf den Bildschirm und springt dann eine Zeile weiter nach unten. Wenn der Cursor in der letzten Zeile angekommen ist, wird ab Benutzung des writeln-Befehls die Ausgabe ausgegeben, während die vorherigen Ausgaben alle eine Zeile nach oben rutschen. Die ausgabe wird quasi nach oben 'geschoben'
Auch hier gibt es wieder mehrer Möglichkeiten:
Entweder lässt du ab einer bestimmten Anzahl an ausgegebenen Zahlen die Ausgabe anhalten nach dem Motto:"Zum Fortfahren bitte Enter drücken!". Das erfordert noch eine Zeilein deiner for-Schleife, die mod-divison anwendest.
z.B.
If (i mod 20)=0 Then
Begin
Write('Zum Fortfahren bitte Enter drücken!');
Readln;
End;
Andere Möglichkeit:
Sofern ich mich erinnere gab es einen Befehl mit dem man den Cursor an eine gewünschte Stelle auf dem Bildschirm steuern konnte (ich glaub er hieß goto(x,y) oder so ähnlich). Damit könntest du quasi Spalten auf dem Bildschirm aufbauen, die dann die Zahlen ausgeben. Die Methode ist allerdings ein wenig kompliziert, zumal die Breite der Zahlen ja auch zunimmt, wonach ich die erste Möglichkeit hier vorziehen würde.
Gruß,
Tommy
|
|
|
|
|
Hi :O)
Mh, das habe ich mir schon fast gedacht, schade eigentlich. Ich denke ich werde deinen ersten Ratschlag befolgen und mit mod arbeiten.
Die andere Variante klingt sehr gut, aber dein Angesprochenes Problem besteht ja und dieser Aufwand wäre es nicht wert, für dieses Programm.
Nochmals vielen Dank für deine Mühe
Gruß Tobias
|
|
|
|