Fibonacci-Folge - Programmieren...
Hallöchen!
Erstmal von mir ein großes Lob für dieses klasse Forum :mrgreen:! Ich habe nun seit einem halben Jahr Informatik und wir programmieren mit Delphi 5. Über die Ferien haben wir folgende Aufgabe aufbekommen: Eine Fibonacci-Folge beginnt mit zwei vorgebbaren natürlichen Zahlen,alle weiteren Zahlen der Folge sind jeweils die Summe der beiden vorangehenden. Programmieren Sie dieses Programm. Nun mir kommt es so vor, dass ich mit meinen aktuellen Möglichkeiten nicht weit komme. Bis jetzt hatten wir an procedures oder dergleichigen, folgendes: If-Then-Else, Repeat-Until, Tabellen und While-Do.. Nun mein Ansatz ist dass wir irgendwie eine Funktion erstellen müssen, z.B eine rekursive: f(x)=f(x-1)+f(x-2) Frage1: Wie kann ich das in Delphi einbinden? Frage2:Wie regele ich das mit den frei eingebbaren Zahlen? Ich danke euch für die Antworten! Gruß Umbras PS:Bitte keine kompletten Codes posten, nur Ansätze! :mrgreen: |
Re: Fibonacci-Folge - Programmieren...
|
Re: Fibonacci-Folge - Programmieren...
Ich hab die Suchfunktion benutzt, aber ich versteh das meist enicht , da ich erst ein halbes Jahr Informatik habe... Und die Folge soll als Tabelle ausgegeben werden...
Auf Deutsch.. ich hab keine Ahnung =D Gruß Umbras |
Re: Fibonacci-Folge - Programmieren...
Erstmal herzlich willkommen in der DP :dp:
Tipp: Ich würde erstmal Papier und Bleistift nehmen, eventuell noch einen Taschenrechner und mir aufschreiben, wie ich weiter gekommen bin. Der Rest wird dann wesentlich unkomplizierter :) Gruß Wolfgang PS: Ich glaube, das war Beitrag 600 :) |
Re: Fibonacci-Folge - Programmieren...
Hey!
Also eine Idee habe ich ja.. aber wie setze ich diese um.. also z.B die rekursive Funktion?? Gruß |
Re: Fibonacci-Folge - Programmieren...
Hallo,
du kannst dieses Programm nicht nur rekursiv sondern auch iterativ lösen. Rekursive Programmierung ist oft schwerer als die iterative. Ich schätze, das du mit "Tabellen" Arrays meinst. Wenn du also ein Array "zahlen" hast, dann speicherst du , beispielsweise, die beiden vorgegebenen Zahlen in zahlen[0] und zahlen[1]. In einer for Schleife kannst du dann in zahlen[i] die Summe aus zahlen[i-1] und zahlen[i-2] speichern. Ich denke, dieser Denkanstoß sollte soweit helfen, dass du auf den Rest von selbst kommst. |
Re: Fibonacci-Folge - Programmieren...
... mit Tabellen meine ich nicht Arrays^^ sondern StringGrids =D
Also wie mache ich das damit.. und mit den frei vorgebbaren Zahlen?! Gruß |
Re: Fibonacci-Folge - Programmieren...
Naja, du kansnt das ganze wie oben beschrieben machen und dass Array am Ende in das Stringgrid ausgeben.
|
Re: Fibonacci-Folge - Programmieren...
Delphi-Quellcode:
Wo liegt mein Denkfehler? Es passiert nichts, wenn ich auf Start drücke!
unit FibonacciU;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, ExtCtrls; type TForm1 = class(TForm) Panel1: TPanel; StringGrid1: TStringGrid; Panel2: TPanel; Panel3: TPanel; Panel4: TPanel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin StringGrid1.Cells[0,0]:='Anzahl'; StringGrid1.Cells[0,1]:='Ergebnis'; end; procedure TForm1.Button1Click(Sender: TObject); var zahl: array of integer; anz,i :integer; begin Try zahl[0]:=StrToInt(Edit1.Text) Except exit end; Try zahl[1]:=StrToInt(Edit2.Text) Except exit end; Try anz:=StrToInt(Edit3.Text) Except exit end; SetLength(zahl,anz); StringGrid1.ColCount:=succ(anz); If anz<=0 Then exit; For i:=0 to anz do StringGrid1.Cells[i,0]:=IntToStr(i); StringGrid1.Cells[i,1]:=IntToStr(zahl[i]); zahl[i]:=zahl[i-1]+zahl[i-2]; end; end. Gruß! |
Re: Fibonacci-Folge - Programmieren...
Sind denn die eingegebenen Zahlen gültig? Sonst wird ja exit aufgerufen.
|
Re: Fibonacci-Folge - Programmieren...
PS: Falls das mit deiner Delphiversion schon geht, solltest du einfach mal einen Haltepunkt setzen, und dann Zeilenweise dein Programm durchlaufen lassen - dann solltest du den Fehler eigentlich selber finden.
|
Re: Fibonacci-Folge - Programmieren...
?? Also wenn die Zahlen kein Kovertierungsfehler enthalten oder nicht kleiner als 0 sind, werden sie in den SPeicher reingepackt. So interpretier ich das...
Wie mach ich das denn mit den Haltepunkt? Gruß |
Re: Fibonacci-Folge - Programmieren...
Ich weiß nicht genau, ob das mit den Haltepunkten in Delphi 5 schon geht. Wernn ja, dann kannst du einen Haltepunkt setzen, indem du links neben die entsprechende Codezeile klickst. Und dann kannst du (mit F7?) das Programm Zeilenweise weiterlaufen lassen.
Ansonsten kannst du das exit ja mal durch eine Nachricht ersetzen. Was für Zahlen gibst du denn ein? |
Re: Fibonacci-Folge - Programmieren...
Hallo,
ein paar kleine Tipps : 1) statt
Delphi-Quellcode:
benutze
then exit
Delphi-Quellcode:
so has Du eine Kontrolle, was schiefgegangen ist.
then
begin ShowMessage('... dein hier möglicherweise auftretender Fehler'); Exit; end; 2) Dein Block mit
Delphi-Quellcode:
sollte so aussehen
For i := 0 to anz do .....
Delphi-Quellcode:
und überprüfe mal Deine Berechnung im o.a. Block ... wenn Du mit i = 0 anfängst ... :gruebel:
for i := 0 to anz do
begin StringGrid1.Cells ... zahl[i.... StrigGrid1.Cells[i, 1] := ... end; |
Re: Fibonacci-Folge - Programmieren...
Keine Besserung...
Delphi-Quellcode:
Gruß
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids, ExtCtrls; type TForm1 = class(TForm) Panel1: TPanel; StringGrid1: TStringGrid; Panel2: TPanel; Panel3: TPanel; Panel4: TPanel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin StringGrid1.Cells[0,0]:='Anzahl'; StringGrid1.Cells[0,1]:='Ergebnis'; end; procedure TForm1.Button1Click(Sender: TObject); var zahl: array of integer; anz,i :integer; begin Try zahl[1]:=StrToInt(Edit1.Text) Except exit end; Try zahl[2]:=StrToInt(Edit2.Text) Except exit end; Try anz:=StrToInt(Edit3.Text)Except exit end; SetLength(zahl,anz); StringGrid1.ColCount:=succ(anz); If anz<=0 Then Begin ShowMessage('FEHLER...'); exit; end; For i:=1 to anz do StringGrid1.Cells[i,0]:=IntToStr(i); zahl[i]:=zahl[i-1]+zahl[i-2]; StringGrid1.Cells[i,1]:=IntToStr(zahl[i]); end; end. |
Re: Fibonacci-Folge - Programmieren...
Hallo,
... und eigentlich müsstest Du hier noch eine Fehlermeldung bekommen :
Delphi-Quellcode:
in den Zeilen mit Try zahl[0] und Try zahl[1] greifst Du erst auf das dyn. array zu
begin
Try zahl[0]:=StrToInt(Edit1.Text) Except exit end; Try zahl[1]:=StrToInt(Edit2.Text) Except exit end; Try anz:=StrToInt(Edit3.Text) Except exit end; SetLength(zahl,anz); ... und setzt aber erst nach Abfrage des Wertes in Edit3 die Länge !? |
Re: Fibonacci-Folge - Programmieren...
Delphi-Quellcode:
verbessert! i wird angezeigt, mehr aber nicht..
unit FibonacciU;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, ExtCtrls; type TForm1 = class(TForm) Panel1: TPanel; StringGrid1: TStringGrid; Panel2: TPanel; Panel3: TPanel; Panel4: TPanel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin StringGrid1.Cells[0,0]:='Anzahl'; StringGrid1.Cells[0,1]:='Ergebnis'; end; procedure TForm1.Button1Click(Sender: TObject); var zahl: array of integer; anz,i :integer; begin Try anz:=StrToInt(Edit3.Text)Except exit end; SetLength(zahl,anz); Try zahl[1]:=StrToInt(Edit1.Text) Except exit end; Try zahl[2]:=StrToInt(Edit2.Text) Except exit end; StringGrid1.ColCount:=succ(anz); If anz<=0 Then Begin ShowMessage('FEHLER...'); exit; end; For i:=1 to anz do StringGrid1.Cells[i,0]:=IntToStr(i); zahl[i]:=zahl[i-1]+zahl[i-2]; StringGrid1.Cells[i,1]:=IntToStr(zahl[i]); end; end. Gruß |
Re: Fibonacci-Folge - Programmieren...
Delphi-Quellcode:
Wenn du mit i:=1 beginnst, und deine erste Zahl in Zahl[1] speicherst, dann kann das so nicht funktionieren...
zahl[i]:=zahl[i-1]+zahl[i-2];
|
Re: Fibonacci-Folge - Programmieren...
... Berechnungsfehler
>>>>>>>>>>>> i := 1 : zahl[i-2] >>> gibt's im array doch gar nicht, wäre zahl := array[-1...max] of Integer !!! :idea: |
Re: Fibonacci-Folge - Programmieren...
Zitat:
|
Re: Fibonacci-Folge - Programmieren...
Auch wenn ich i:=2 setze.. kriege ich kein Ergebnis:
Delphi-Quellcode:
unit FibonacciU;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, ExtCtrls; type TForm1 = class(TForm) Panel1: TPanel; StringGrid1: TStringGrid; Panel2: TPanel; Panel3: TPanel; Panel4: TPanel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin StringGrid1.Cells[0,0]:='Anzahl'; StringGrid1.Cells[0,1]:='Ergebnis'; end; procedure TForm1.Button1Click(Sender: TObject); var zahl: array of integer; anz,i :integer; begin Try anz:=StrToInt(Edit3.Text)Except exit end; SetLength(zahl,anz); Try zahl[1]:=StrToInt(Edit1.Text) Except exit end; Try zahl[2]:=StrToInt(Edit2.Text) Except exit end; StringGrid1.ColCount:=succ(anz); If anz<=0 Then Begin ShowMessage('FEHLER...'); exit; end; For i:=2 to anz do StringGrid1.Cells[i,0]:=IntToStr(i); zahl[i]:=zahl[i-1]+zahl[i-2]; StringGrid1.Cells[i,1]:=IntToStr(zahl[i]); end; end. |
Re: Fibonacci-Folge - Programmieren...
Klar, weil du die ersten Zwei Zahlen ja auch nicht in Zahl[0] und Zahl[1] speicherst ...
|
Re: Fibonacci-Folge - Programmieren...
Tut mir Leid, ich steh grad total aufm Schlauch :wall: :wall:
Gruß |
Re: Fibonacci-Folge - Programmieren...
Delphi-Quellcode:
Deine erste Zahl ist also im array bei zahl[1]. Wenn du nun mit i=2 rechnest, dann ist Zahl[2]=Zahl[1]+Zahl[0] -> Zahl[0] hast du aber nirgends zugewiesen.
Try zahl[1]:=StrToInt(Edit1.Text) Except exit end;
Try zahl[2]:=StrToInt(Edit2.Text) Except exit end; |
Re: Fibonacci-Folge - Programmieren...
Geändert, trotzdem kein Ergebnis :(
Delphi-Quellcode:
Gruß
procedure TForm1.Button1Click(Sender: TObject); var zahl: array of integer; anz,i :integer;
begin Try anz:=StrToInt(Edit3.Text)Except exit end; SetLength(zahl,anz); Try zahl[0]:=StrToInt(Edit1.Text) Except exit end; Try zahl[1]:=StrToInt(Edit2.Text) Except exit end; StringGrid1.ColCount:=succ(anz); If anz<=0 Then Begin ShowMessage('FEHLER...'); exit; end; For i:=2 to anz do StringGrid1.Cells[i,0]:=IntToStr(i); zahl[i]:=zahl[i-1]+zahl[i-2]; StringGrid1.Cells[i,1]:=IntToStr(zahl[i]); end; end. |
Re: Fibonacci-Folge - Programmieren...
Delphi-Quellcode:
Schleife wird nur für StringGrid1.Cells[i,0]:=IntToStr(i); durchlaufen. Danach hat i den Wert anz+1 (Abbruchbedingung). Zahl[anz+1] erzeugt dann einen Fehler. Probiers mal mit
For i:=2 to anz do
StringGrid1.Cells[i,0]:=IntToStr(i); zahl[i]:=zahl[i-1]+zahl[i-2]; StringGrid1.Cells[i,1]:=IntToStr(zahl[i]);
Delphi-Quellcode:
For i:=2 to anz do
begin StringGrid1.Cells[i,0]:=IntToStr(i); zahl[i]:=zahl[i-1]+zahl[i-2]; StringGrid1.Cells[i,1]:=IntToStr(zahl[i]); end; |
Re: Fibonacci-Folge - Programmieren...
Hi,
Er rechnet zwar und ich krieg auch Ergebnisse, aber ich krieg teilweise verschiedene Fehlermeldungen z.B ungültige Zeigeroperation! Gruß |
Re: Fibonacci-Folge - Programmieren...
Hast du es mal mit Haltepunkten versucht? Und wie sieht es mit F7 zum Compilieren (Einzelschritt) aus?
|
Re: Fibonacci-Folge - Programmieren...
So habe mein Fehler gefunden! Programm läuft einwandfrei!
Delphi-Quellcode:
Danke hierfür and closed!
unit FibonacciU;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, ExtCtrls; type TForm1 = class(TForm) Panel1: TPanel; StringGrid1: TStringGrid; Panel2: TPanel; Panel3: TPanel; Panel4: TPanel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin StringGrid1.Cells[0,0]:='Anzahl'; StringGrid1.Cells[0,1]:='Ergebnis'; end; procedure TForm1.Button1Click(Sender: TObject); var zahl: array of integer; anz,i :integer; begin Try anz:=StrToInt(Edit3.Text)Except exit end; SetLength(zahl,anz+1); Try zahl[0]:=StrToInt(Edit1.Text) Except exit end; Try zahl[1]:=StrToInt(Edit2.Text) Except exit end; StringGrid1.ColCount:=succ(anz); If anz<=0 Then Begin ShowMessage('FEHLER...'); exit; end; StringGrid1.Cells[1,0]:='1'; StringGrid1.Cells[1,1]:='Z1:'+IntToStr(zahl[0])+' Z2:'+IntToStr(zahl[1]); For i:=2 to anz do begin StringGrid1.Cells[i,0]:=IntToStr(i); zahl[i]:=zahl[i-1]+zahl[i-2]; StringGrid1.Cells[i,1]:=IntToStr(zahl[i]); end; end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz