Autor Beitrag
Wegi
Hält's aus hier
Beiträge: 13

Win XP Pro
Delphi 7 Personal, Turbo Delphi 2006
BeitragVerfasst: 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:

ausblenden volle Höhe Delphi-Quelltext
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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: Suche in der Entwickler-Ecke BIGNUM, Suche in der Entwickler-Ecke BIGNUMBER, Suche in der Entwickler-Ecke 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 Threadstarter
Hält's aus hier
Beiträge: 13

Win XP Pro
Delphi 7 Personal, Turbo Delphi 2006
BeitragVerfasst: 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?

ausblenden volle Höhe Delphi-Quelltext
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 13

Win XP Pro
Delphi 7 Personal, Turbo Delphi 2006
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.