| Autor |
Beitrag |
Wegi
Hält's aus hier
Beiträge: 13
Win XP Pro
Delphi 7 Personal, Turbo Delphi 2006
|
Verfasst: Sa 18.08.07 19:05
Hallo,
Ich bin ein ziemlicher Anfänger mit Delphi und habe nun beim Schreiben eines fibonacci programms 2 probleme. erstmal der Quellcode:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) ed_anzahl: TEdit; Label1: TLabel; bt_Go: TButton; procedure bt_GoClick(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.bt_GoClick(Sender: TObject); var i, q, zahl1, zahl2, n: Int64; Speicher : TStringlist; begin zahl1 := 1; zahl2 := 1; n := StrToint (ed_anzahl.Text)-2; for i := 1 to n do begin speicher := zahl2; zahl2 := zahl1 + Zahl2; zahl1 := speicher; end; Speicher.Create; Speicher.Insert(1, IntToStr(zahl2)); Speicher.SaveToFile('fibonacci.txt'); Speicher.Free; end;
end. |
1. Kriege ich imemr folgenden fehler: [Pascal Fehler] Unit1.pas(35): E2032 FOR-Schleifenvariable muss von ordinalem Typ sein
2. Es gibt doch sicherlich eine Kompfrotablere Methode die zahl in eine Textdatei zus chreiben oder?
3. Wie kann ich mir selber einen Dateityp schreiben? Also wenn ich mir zum beispiel die 1.000.000 stelle berechnen lassen will.
MfG Wegi
_________________ | Zitat: | | Zitat von: Ernst Waltemathe (*1935), dt. Politiker (SPD)Es gibt Leute, die haben immer schon eine Lösung, bevor überhaupt ein Problem da ist. |
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 18.08.07 19:26
I und N dürfen nur Integer sein; Int64 besitzt einige Compiler-Magic, die ihn als Zählvariable disqualifiziert. Speicher wird sowohl als TStringList als auch als Int64 genutzt... Das kann nicht gehen Speicher wird nicht korrekt instantiiert. Korrekt wäre Speicher := TStringlist.Create;Eigenen Datentypen: Nicht ganz einfach. Nimm was vorgefertigtes in der Richtung: BIGNUM, BIGNUMBER, BIGINT
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Wegi 
Hält's aus hier
Beiträge: 13
Win XP Pro
Delphi 7 Personal, Turbo Delphi 2006
|
Verfasst: Sa 18.08.07 19:40
Hallo und Danke erstmal.
Wie dumm ich manchmal sein kann.. das mit Speicher als Int64 war ein fehler meinerseits ich hatte vergessen es durch q zu ersetzen.
So sieht nun der Funktionierende Quellcode aus. Aber gibt es wirklich keine einfachere methode den Wert zu speichern?
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) ed_anzahl: TEdit; Label1: TLabel; bt_Go: TButton; procedure bt_GoClick(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.bt_GoClick(Sender: TObject); var q, zahl1, zahl2: Int64; i, n : Integer; Speicher : TStringlist; begin zahl1 := 1; zahl2 := 1; n := StrToint (ed_anzahl.Text)-2; for i := 1 to n do begin q := zahl2; zahl2 := zahl1 + Zahl2; zahl1 := q; end; Speicher := TStringlist.Create; Speicher.Insert(0, IntToStr(zahl2)); Speicher.SaveToFile('fibonacci.txt'); Speicher.Free; end;
end. |
_________________ | Zitat: | | Zitat von: Ernst Waltemathe (*1935), dt. Politiker (SPD)Es gibt Leute, die haben immer schon eine Lösung, bevor überhaupt ein Problem da ist. |
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 18.08.07 19:50
Sagen wir's mal so: Es gibt haufenweise Möglichkeiten und welche zum Speichern die beste ist, hängt ganz von der Situation ab.
Für einzelne Werte lohnt es sich nur selten den Overhead für AssignFile, Rewrite, WriteLn und CloseFile zu betreiben: Vom Code her spart man nix; einzig die Ausführung ist etwas schneller. Alternativ geht auch WinAPI, aber das ist etwas länger, da man da von CreateFile das Handle abspeichern darf und den Inhalt erst nach String konvertieren muss.
Am Einfachsten zum Abspeichern als Text ist damit erstmal das mit der StringList.
P.S.: Du kannst 6 Zeichen Source sparen, wenn Du statt Insert Add nimmst.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Wegi 
Hält's aus hier
Beiträge: 13
Win XP Pro
Delphi 7 Personal, Turbo Delphi 2006
|
Verfasst: Sa 18.08.07 19:58
Ok, danke nochmal! Dann bleibe ich bei der jetzigen Methode zu Speichern.
Nun habe ich das Problem, dass Int64 schon bei ~ der 300sten Stelle zu klein Ist. Das mit Bignum, etc wäre ja ne externe .pas. Ein Schulkamerad von mir, der das auch mal gemacht hat meinte er hätte sich selber einen Datentyp aus Arrays dafür geschrieben, und so über Nacht sogar die 1.000.000e Stelle der Folge Berechnet und gespeichert. Weiß jemand wie man so was verwirklichen könnte? (meine Suche blieb leider erfolglos).
_________________ | Zitat: | | Zitat von: Ernst Waltemathe (*1935), dt. Politiker (SPD)Es gibt Leute, die haben immer schon eine Lösung, bevor überhaupt ein Problem da ist. |
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 18.08.07 21:26
Für die erwähnte Berechnung brauchst Du Dir nur von den erwähnten Units den Quelltext anschauen und diesen in deinem Programm entsprechend umprogrammieren ...
Das Problem bei solch großen Zahlen ist dann aber nicht mehr deren Berechnung, sondern deren Umwandlung in andere Zahlensysteme...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
|