Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Große Zahlen verknoten...


tah_rul0r - Mi 09.04.08 00:13
Titel: Große Zahlen verknoten...
Hallihallo...

hab über einen freund vom diesem forum erfahren... bin leider ziemlich schlecht im programmieren mit delphi...
jetzt hab ich in der schule ein projekt bekommen... große zahlen...

also:

in einem editfeld soll eine große zahl, bsp. 2947603 eingelesen werden... dann sollen die einzelnen zahlen verknoten werden.. also 2->9->4->7->6->0->3... das ganze soll mit einem constructor objektorientiert gemacht werden...

im endeffekt soll man eine 2. zahl einketten, und die mit der ersten addieren... also die knoten jeweils, und natürlich immer den rest mitgeben, 2. möglichkeit: die lange zahl bzw. kette mit einer zahl von 0-10 multiplizieren...

ich hab halt leider null ahnung davon, mir gehts dabei in der schule nicht so gut^^... würd mich freuen wenn mir jemand helfen könnte... wenns zu wenig info ist, kann ich natürlich noch mehr geben...

danke euch, michael


GericasS - Mi 09.04.08 07:08

Morgen,

du sagt du seiest ziehmlich schlecht, hast du vll. trotzdem einen Lösungsansatz ?
Oder dir vll. schonmal ein paar gedanken gemacht wie man es "vll." umsetzten könnte ?
Unser Lehrer meint immer man kann so ein Projekt auch schon mal vorraus planen bevor man sich überhaupt an den PC setzt.

LG

GericasS


Tilo - Mi 09.04.08 09:25
Titel: Re: Große Zahlen verknoten...
user profile icontah_rul0r hat folgendes geschrieben:

also:

in einem editfeld soll eine große zahl, bsp. 2947603 eingelesen werden... dann sollen die einzelnen zahlen verknoten werden.. also 2->9->4->7->6->0->3... das ganze soll mit einem constructor objektorientiert gemacht werden...

im endeffekt soll man eine 2. zahl einketten, und die mit der ersten addieren... also die knoten jeweils, und natürlich immer den rest mitgeben, 2. möglichkeit: die lange zahl bzw. kette mit einer zahl von 0-10 multiplizieren...



besser wäre es die Zahlen andersherum zu "verknoten".
aus 2947603 wird 3>0>6>7>4>9>2.
Das Hat den Vorteil bei Opertionen das der Anfang immer die EinerStelle ist.

Das Schlüsselwort constructor bedeutet Du brauchst eine Klasse. Stichwort: Klassendefinition.

Zum verknoten nihmst Du Pointer bzw ObjektReferenzen.


tah_rul0r - Mi 09.04.08 22:53
Titel: lösungsansatz wenn mans so nennen kann^^
Mein Anfang...
wenn das ein und auslesen mal funktionieren würde, wärs ja mal ein anfang...
aber das schaff ich leider auch noch nicht...



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:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
unit number_unit;

interface
uses stdctrls,Dialogs,extctrls,Sysutils;

type TKnoten=class(TObject)
        nummer:integer;
        next:TKnoten;
        constructor Create(s:integer);
     end;

type TListe=class(TObject)
      anf:TKnoten;
      Constructor Create;
     procedure lifopush;
     procedure ausgabe;
     procedure add;
     procedure multi;
     end;

implementation

Constructor TKnoten.Create(s:integer);
begin
  nummer:=0;next:=nil;
end;

Constructor Tliste.Create;
begin
  anf:=nil;
end;


procedure lifopush(zahl:string);
var neu: TKnoten;
    i: integer;
begin
 for i:= 1 to length(zahl) do
  begin
   new(neu);
   neu.nummer:=copy(zahl,i,length(zahl));
   neu.next:=anf;
   anf:=neu;
  end;
end;

procedure ausgabe;
begin
counter:= 0;
 while anfang <> nil do
  zahl:= zahl + inttostr(neu.nummer);
end;

procedure add;
begin

end;

procedure multi;
begin

end;

end.


Moderiert von user profile iconChristian S.: Quote- durch Delphi-Tags ersetzt


Marc. - Do 10.04.08 00:37

Hi!
Verkette Listen, herrlisch. Schreib ich morgen ne Klausur drüber. Wenn Du willst, schreib ich Dir ein halbwegs vernünftiges Tutorial oder erklär es Dir morgen hier nocheinmal genauer. ;)
Oder haben wir bereits eins in der Library?

Cheers,
Marc.


Tilo - Do 10.04.08 06:53
Titel: Re: lösungsansatz wenn mans so nennen kann^^
satt

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure lifopush(zahl:string);
var neu: TKnoten;
    i: integer;
begin
 for i:= 1 to length(zahl) do
  begin
   new(neu);
   neu.nummer:=copy(zahl,i,length(zahl));
   neu.next:=anf;
   anf:=neu;
  end;
end;


lieber so schreiben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure lifopush(zahl:string);
var neu: TKnoten;
    i: integer;
begin
 for i:= 1 to length(zahl) do
  begin
   new(neu);
   neu.nummer:=copy(zahl,i,1);
   neu.next:=anf;
   anf:=neu;
  end;
end;

nächster Fehler:
Die Methode Ausgabe besser als Function mit Integer als Rückgabetyp deklarieren, die Variable "Zahl" lokal in der MEthode als String definieren und am Anfang der Methode auf '' setzen(Zahl:='').

weiterer Fehler:
Der Methode lifopush bitte auch in der Klassendefinition die Parameterliste hinzufügen.

noch ein Fehler:
in der Implementation der MEthode immer den Klassennamen vorran schreiben:

Delphi-Quelltext
1:
procedure TMyClass.MyProd                    


letzter fehler Komplex: unvollständige Constructor Methode und Fehlende Destructor MEthode.
Constructoren bitte so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
Constructor TmyClass.Create;
begin
 inherited Create;//eventuell mit Parameterliste
 //eigener Code
end;

destructor TmyClass.destroy;
begin
 //hier selbst erzeugte Strukturen freigeben.
 inhreited destroy;
end;


Das waren erstmal die Sachen die ich so gefunden habe.

kleines Edit:
highlight durch delphi ersetzt.


tah_rul0r - Do 10.04.08 07:25

user profile iconMarc. hat folgendes geschrieben:
Hi!
Verkette Listen, herrlisch. Schreib ich morgen ne Klausur drüber. Wenn Du willst, schreib ich Dir ein halbwegs vernünftiges Tutorial oder erklär es Dir morgen hier nocheinmal genauer. ;)
Oder haben wir bereits eins in der Library?

Cheers,
Marc.


perfekt!
versteh das leider eher weniger^^

@tilo

puh^^... teilweise versteh ich deine aussagen leider nicht ^^
bzw. das meiste check ich garnicht ;-)

lg, mike


Tilo - Do 10.04.08 08:07
Titel: Re: lösungsansatz wenn mans so nennen kann^^
Ich zeige Dir dann einfach mal was ich meinte:



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:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
unit number_unit;

interface
uses stdctrls,Dialogs,extctrls,Sysutils;

type TKnoten=class(TObject)
        nummer:integer;
        next:TKnoten;
        constructor Create(s:integer);
     end;

 type TListe=class(TObject)
      anf:TKnoten;
      Constructor Create;
      destructor destroy;
     procedure lifopush(zahl:string);
     function ausgabe:string;
     procedure add;
     procedure multi;
     end;

implementation

Constructor TKnoten.Create(s:integer);
begin
  nummer:=s;next:=nil;
  //war wohl so gemeint, oder?
end;

Constructor Tliste.Create;
begin
  inherited Create;
  anf:=nil;
end;





procedure Tliste.lifopush(zahl:string);
var neu: TKnoten;
    i: integer;
begin
 for i:= 1 to length(zahl) do
  begin
   new(neu);
   // ist mir gereade aufgefallen,
   // hier müsste noch
   //neu:=TKnoten.Create stehen
   //neu.nummer:=copy(zahl,i,length(zahl));
   neu:=TKnoten.create(strtoint(zahl[i]));
   neu.next:=anf;
   anf:=neu;
  end;
end;

function Tliste.ausgabe:string;
var
zahl:string;
//einbischen verwirrend besser zahlstr nennen
begin
 //counter:= 0; //was der soll weis ich nicht ist zur Zeit ohne Funktion
 zahl:='';
 while anfang <> nil do
  zahl:= zahl + inttostr(neu.nummer);
 result:=zahl; // durch die Deklaration von ausgabe als function darf du hier result verwenden.
end;

destructor Tliste.destroy;
var
alt1,alt2:TKnoten;
begin
 alt1:=neu;
 while alt1<>nil do
 begin
  alt2:=alt1;
  alt1:=alt1.next;
  alt2.free;//Speicher des Objectes freigeben;
  dispose(alt2); //Speicher der ObjectReferenz freigeben;
 end;
 inherited destroy;
end;


Der Wert den die Variable Result am Ende einer Function hat wird übergeben.

Welchen Compiler verwendest Du? Die Fehlermeldungen die Du beim Compilierungsversuch erhälst sind manchmal recht hilfreich;

Zusätzlich habe ich die Function lifopush umgeändert. da deine TKnoten Klasse im Constructor den Parameter s:integer hat kann man den gleich mitverwenden.

Ich hoffe das hilft.
gruß Tilo


tah_rul0r - Do 10.04.08 16:47
Titel: Re: lösungsansatz wenn mans so nennen kann^^
Habs jetzt auf deine version umgeändert... aber ^^ :

ein paar fehlermeldungen ;-)


[Warning] number_unit.pas(18): Method 'Destroy' hides virtual method of base type 'TObject'
[Error] number_unit.pas(53): Incompatible types
[Error] number_unit.pas(54): Not enough actual parameters
[Error] number_unit.pas(55): Missing operator or semicolon
[Error] number_unit.pas(55): Incompatible types: 'Integer' and 'String'
[Error] number_unit.pas(70): Undeclared identifier: 'neu'
[Error] number_unit.pas(79): Undeclared identifier: 'neu'`
[Error] number_unit.pas(85): Incompatible types
[Error] number_unit.pas(91): Declaration expected but end of file found
[Error] number_unit.pas(21): Unsatisfied forward or external declaration: 'TListe.add'
[Error] number_unit.pas(22): Unsatisfied forward or external declaration: 'TListe.multi'
[Fatal Error] form.pas(7): Could not compile used unit 'number_unit.pas'


Tilo - Do 10.04.08 21:47
Titel: Re: lösungsansatz wenn mans so nennen kann^^
Hab ja nicht behauptet das es fehlerfrei ist.

Dazu meine Bemerkungen:
[Warning] number_unit.pas(18): Method 'Destroy' hides virtual method of base type 'TObject'
Vergess ich ständig. In der Deklaration hinter "destructor destroy;" das Schlüsselwort "override;" anfügen.

[Error] number_unit.pas(53): Incompatible types
[Error] number_unit.pas(85): Incompatible types
Kann passieren. In der Entsprechenden Zeile korreckte Typenumwandlung vornehmen oder die Variablen in kompatiple Typen umdeklarieren.

[Error] number_unit.pas(54): Not enough actual parameters
Da fehlt was

[Error] number_unit.pas(55): Missing operator or semicolon
wahrscheinlich das letztere

[Error] number_unit.pas(55): Incompatible types: 'Integer' and 'String'
entweder strtoint oder inttostr verwenden

[Error] number_unit.pas(70): Undeclared identifier: 'neu'
[Error] number_unit.pas(79): Undeclared identifier: 'neu'
"neu" als den Variablentyp definieren der er sein soll.


[Error] number_unit.pas(91): Declaration expected but end of file found
irgend wo entweder ein "begin" zu viel oder ein "end;" Eventuell hinterdem letzten "end" einen Punkt setzen

[Error] number_unit.pas(21): Unsatisfied forward or external declaration: 'TListe.add'
[Error] number_unit.pas(22): Unsatisfied forward or external declaration: 'TListe.multi'
Entweder schreibst Du die Methode oder löscht sie aus der Deklaration. Da sie ohne Code waren habe ich dort auch nichts gemacht.

[Fatal Error] form.pas(7): Could not compile used unit 'number_unit.pas'[/quote]
Wenn Du die anderen Fehler beseitig hast verschwindet diese Meldung von alleine.

So ich muss jetzt mal Schluss machen ->Kino.
einen schönen Abend noch.


tah_rul0r - Fr 11.04.08 10:08
Titel: Re: lösungsansatz wenn mans so nennen kann^^
so, hab jetzt alles im griff...

ausser:

user profile iconTilo hat folgendes geschrieben:

[Error] number_unit.pas(53): Incompatible types
[Error] number_unit.pas(85): Incompatible types
Kann passieren. In der Entsprechenden Zeile korreckte Typenumwandlung vornehmen oder die Variablen in kompatiple Typen umdeklarieren.


da gehts um die "neu"-variable... was da incompatible is, hab ich keine ahnung^^

die procedure selber ist jetzt so: (hoffe es stimmt)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure Tliste.lifopush(zahl:string);
var neu: TKnoten;
    i: integer;
begin
 for i:= 1 to length(zahl) do
  begin
   new(neu);
   neu:=TKnoten.create(strtoint(zahl[i]));
   neu.nummer:=strtoint(copy(zahl,i,1));
   neu.next:=anf;
   anf:=neu;
  end;
end;


dankeschön für hilfe,

lg, mike


Tilo - Fr 11.04.08 10:59
Titel: Re: lösungsansatz wenn mans so nennen kann^^
Wenn es die Stelle ist dann probier mal diese Alternative:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure Tliste.lifopush(zahl:string);
var neu: TKnoten;
    i: integer;
    buffstr:string;
    buffint:integer;
begin
 for i:= 1 to length(zahl) do
  begin
   new(neu);
   buffstr:=zahl[i];
   buffint:=strtoint(buffstr);
   neu:=TKnoten.create(buffint);
   neu.nummer:=strtoint(copy(zahl,i,1));
   neu.next:=anf;
   anf:=neu;
  end;
end;


tah_rul0r - Fr 11.04.08 13:00
Titel: Re: lösungsansatz wenn mans so nennen kann^^
genau das selbe...

bei der zeile...

new(neu); // ...kommt die Fehlermeldung [Error] number_unit.pas(50): Incompatible types
Danach sagt er immer wenn "neu.*" vorkommt "Undeclared Identifier"

check ich leider überhaupt nicht, was kann bei new(neu) denn falsch sein...


Tilo - Fr 11.04.08 19:41

Dann wirst Du um die Verwendung von Pointern nicht durmher kommen.
Definiere eine Pointerklasse für TKnoten.
z.B. so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
type PKnoten=^TKnoten
     TKnoten=class(TObject)
        nummer:integer;
        next:PKnoten;
        constructor Create(s:integer);
     end;



Überall wo Du TKnoten stehen hast schreibst Du nun PKnoten hin.
zur veranschaulichung:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure someProc;
var
aknoten:PKnoten;
begin
 new(aknoten);// Speicher für ObjectReferenz wird reserviert;
 aknoten^:=TKnoten.Create(4); //ObjectInstanz wird erzeugt;
 aknoten^.next:=nil//Zugrift auf das Object.
 aknoten^.free; //objectinstanz wird gelöscht ->Speicherfreigabe
 dispose(aknoten); //Speicher für ObjectReferenz wird freigegeben
end;


Ich hoffe das löst das Problem.


Hidden - Fr 11.04.08 20:37
Titel: Re: lösungsansatz wenn mans so nennen kann^^
user profile icontah_rul0r hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure Tliste.lifopush(const zahl:string);
var neu: TKnoten;
    i: integer;
begin
 for i:= 1 to length(zahl) do
  begin
   new(neu);
   neu:=TKnoten.create(strtoint(zahl[i]));
   neu.nummer:=strtoint(copy(zahl,i,1));
   neu.next:=anf;
   anf:=neu;
  end;
end;


Hi,

Bitte den String-Parameter als const deklarieren. Ein String wird bei der Übergabe kopiert, damit mit dieser Kopie ohne Beeinträchtigung des Originals gearbeitet werden kann. Im Normalfall willst du das aber garnicht: Du arbeitest entweder mit einer Kopie, untersuchst das Original nur, etc.

Wenn du das Original verändern willst, deklariere den Parameter als var.

mfG,


tah_rul0r - Do 17.04.08 21:38
Titel: Momentaner Stand...
ich brings einfach nicht auf die Reihe^^

Form


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:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
unit form;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Spin, StdCtrls, ExtCtrls, number_unit;

type
  TForm1 = class(TForm)
    NumEd: TEdit;
    Einbtn: TButton;
    Ausbtn: TButton;
    addbtn: TButton;
    multibtn: TButton;
    SpinEdit1: TSpinEdit;
    Label1: TLabel;
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    Label2: TLabel;
    procedure EinbtnClick(Sender: TObject);
    procedure AusbtnClick(Sender: TObject);
    procedure addbtnClick(Sender: TObject);
    procedure multibtnClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  bignum : Tliste;
implementation

{$R *.dfm}

procedure TForm1.EinbtnClick(Sender: TObject);
begin
 bignum.lifopush(numed.text);
end;

procedure TForm1.AusbtnClick(Sender: TObject);
begin
 bignum.ausgabe;
end;

procedure TForm1.addbtnClick(Sender: TObject);
begin
// bignum.add;
end;

procedure TForm1.multibtnClick(Sender: TObject);
begin
// bignum.multi;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
bignum:= Tliste.create;
end;

end.



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:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
unit number_unit;

 
interface  
uses stdctrls,Dialogs,extctrls,Sysutils;  


type TKnoten=class(TObject)  
        nummer:integer;  
        next:TKnoten;
        constructor Create(s:integer);  
     end;  


type TListe=class(TObject)
       anf:TKnoten;
       Constructor Create;
       destructor destroy;override;
        procedure lifopush(zahl:string);
        function ausgabe:string;
//      procedure add;
//      procedure multi;
     end;  
 var neu: TKnoten;
 
implementation  

 
Constructor TKnoten.Create(s:integer);  
begin  
  nummer:=s;next:=nil;

end;  

Constructor Tliste.Create;
begin
  inherited Create;
  anf:=nil;
end;


procedure Tliste.lifopush(zahl:string);
var i: integer;
begin
 for i:= 1 to length(zahl) do
  begin
   neu:=TKnoten.create(strtoint(zahl[i]));
   neu.nummer:=strtoint(copy(zahl,i,1));
   neu.next:=anf;
   anf:=neu;
  end;
end;

function Tliste.ausgabe:string;
var zahlstr:string;
begin
 //counter:= 0;
 zahlstr:='';
 while anf <> nil do
  zahlstr:= zahlstr + inttostr(neu.nummer);
 result:=zahlstr;
 panel1.caption:=zahlstr;     // [Error] number_unit.pas(62): Undeclared identifier: 'panel1';-)
end;

destructor Tliste.destroy;
var alt1,alt2:TKnoten;
begin
 alt1:=neu;
 while alt1<>nil do
 begin
  alt2:=alt1;
  alt1:=alt1.next;
  alt2.free;
 end;
 inherited destroy;
end;

end.


Tilo - Do 17.04.08 22:48

Zitat:
[Error] number_unit.pas(62): Undeclared identifier: 'panel1';


Kann es sein das Du das Panel umbenannt hast?
Ansonsten:
Wo hakt es?


jaenicke - Do 17.04.08 23:28

Er hat es nicht umbenannt, sondern er versucht es aus einer anderen Klasse (TListe) zu erreichen als der in der es deklariert ist (der Formular-Klasse TForm1).

Lösung: Binde unterhalb von implementation die Formular-Unit form per uses ein und greife dann via Form1.Panel1 auf das Panel zu ;-):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
implementation

uses
  form;

// ...

  Form1.Panel1. ...


tah_rul0r - Fr 18.04.08 09:49

user profile iconjaenicke hat folgendes geschrieben:
Er hat es nicht umbenannt, sondern er versucht es aus einer anderen Klasse (TListe) zu erreichen als der in der es deklariert ist (der Formular-Klasse TForm1).

Lösung: Binde unterhalb von implementation die Formular-Unit form per uses ein und greife dann via Form1.Panel1 auf das Panel zu ;-):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
implementation

uses
  form;

// ...

  Form1.Panel1. ...


Nein, das Funzt leider nicht ;-)... steht immer noch dasselbe da...

nach implementation hab ich jetzt uses form;
unten form.panel1.caption:= blabla ...

gleiche Fehlermeldung ;-)


aja, kann mir jemand sagen wie ich die addition / multiplikation aufstellen muss??


lg


Tilo - Fr 18.04.08 10:40
Titel: Re: Momentaner Stand...
Ändere mal die markierten Stellen ab:

Form


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:
unit form;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Spin, StdCtrls, ExtCtrls, number_unit;

type
  TForm1 = class(TForm)
    ...
  end;

var
  Form1: TForm1;
  bignum : Tliste;
implementation

{$R *.dfm}

...

procedure TForm1.AusbtnClick(Sender: TObject); //Ich vermute dieser Button soll die Ausgabe starten.
begin
 form1.panel1.caption:=bignum.ausgabe;
end;
...



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:
unit number_unit;

 
interface  
uses stdctrls,Dialogs,extctrls,Sysutils;  


type TKnoten=class(TObject)  
        ... 
     end;  


type TListe=class(TObject)
       ...
     end;  
 var neu: TKnoten;
 
implementation  

...

function Tliste.ausgabe:string;
var zahlstr:string;
begin
 //counter:= 0;
 zahlstr:='';
 while anf <> nil do
  zahlstr:= zahlstr + inttostr(neu.nummer);
 result:=zahlstr;
 //panel1.caption:=zahlstr;     // [Error] number_unit.pas(62): Undeclared identifier: 'panel1';-)
end;

...


... bedeutet nur das ich die Stellen ausgelassen habe -> nicht löschen!


tah_rul0r - Di 22.04.08 09:46

ok, funzen tuts jetzt mal...

nur hängt er sich komischerweise bei der ausgabe auf, kann mir jmnd. sagen warùm??

lg


Tilo - Di 22.04.08 13:50

Guck Dir mal die Ausgabefunktion an. Das ist eine Endlosschleife.
Du mußt Dich vom Anfang der Kette bis zum Ende "durchhangeln"
Das geht so:
1) Ein Pointer ist der Anfang.
2) Diesen Pointer in einer zwischenvariablen(z.B. aPointer) speichern
3) Solange aPointer nicht ungültig ist(z.B. nil) tue
3.1) Verarbeite Info aus dem Ziel des Pointers,
3.2) PointerZiel enthält einen weiteren Pointer. Dies ist der Verweis auf den nächsten Knoten ->aPointer mit neuer Zieladresse überschreiben.


tah_rul0r - Mo 28.04.08 21:31

edit...

so, ich müssts leider morgen abgeben... :(
jetzt stören mich noch folgende Punkte:

- Ausgabe erfolgt seitenverkehrt (da es auch rückwärts eingelesen wird... wie mach ichs da bei der ausgabe anders???)
- Endlosschleife bei der Addierprozedur
- Endlosschleife bei der Multiplizierprozedur


ich bitte euch noch um verbesserung, wenn alles passt geh ich euch morgen nichtmehr auf die nerven ;-)



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:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
unit form;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Spin, StdCtrls, ExtCtrls, number_unit;

type
  TForm1 = class(TForm)
    NumEd: TEdit;
    Einbtn: TButton;
    Ausbtn: TButton;
    addbtn: TButton;
    multibtn: TButton;
    spanz: TSpinEdit;
    Label1: TLabel;
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    Label2: TLabel;
    procedure EinbtnClick(Sender: TObject);
    procedure AusbtnClick(Sender: TObject);
    procedure addbtnClick(Sender: TObject);
    procedure multibtnClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  bignum : TListe;
  bignum1 : Tliste;
implementation

{$R *.dfm}

procedure TForm1.EinbtnClick(Sender: TObject);
begin
 bignum.lifopush(numed.text);
end;

procedure TForm1.AusbtnClick(Sender: TObject);
begin
 bignum.ausgabe;
end;

procedure TForm1.addbtnClick(Sender: TObject);
var hilf: string;
begin
 hilf:= numed.Text;
 bignum1.add(hilf);
end;

procedure TForm1.multibtnClick(Sender: TObject);
begin
 bignum.multi(spanz.value);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
bignum:= TListe.create;
bignum1:= TListe.create;
end;

end.



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:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
unit number_unit;

 
interface
uses stdctrls,Dialogs,extctrls,Sysutils;

type TKnoten=class(TObject)  
        nummer:integer;
        next:TKnoten;
        constructor Create(s:integer);  
     end;

      TListe=class(TObject)
       anf:TKnoten;
       Constructor Create;
       destructor destroy;override;
        procedure lifopush(zahl:string);
    //    procedure lifopush2(zahl:string);
        function ausgabe:string;
        function ausgabe2:string;
        procedure add(zahl:string);
        procedure multi(koeff:integer);
     end;
 var neu: TKnoten;

implementation

uses
  form;
 
Constructor TKnoten.Create(s:integer);
begin
  nummer:=s;next:=nil;

end;

Constructor Tliste.Create;
begin
  inherited Create;
  anf:=nil;
end;


procedure Tliste.lifopush(zahl:string);
var i: integer;
begin
 anf:=nil;
 for i:= 1 to length(zahl) do
  begin
   neu:=TKnoten.create(strtoint(zahl[i]));
   neu.nummer:=strtoint(copy(zahl,i,1));
   neu.next:=anf;
   anf:=neu;
  end;
end;

procedure Tliste.add(zahl:string);
var zahlstr:string;
    lauf,lauf2: Tknoten;
    i,h: integer;
begin
lauf:= bignum.anf;
lauf2:= bignum1.anf;
anf:=nil;
h:= 0;
anf:= lauf;
zahlstr:= '';
 for i:= 1 to length(zahl) do
  begin
   neu:=TKnoten.create(strtoint(zahl[i]));
   neu.nummer:=strtoint(copy(zahl,i,1));
   neu.next:=anf;
   anf:=neu;
  end;
 ausgabe2;
 while lauf <> nil do
  begin
   zahlstr:= zahlstr+ inttostr((lauf.nummer+lauf2.nummer) mod 10 + h);
   h:= (lauf.nummer + lauf2.nummer) div 10;
   lauf:= lauf.next;
  end;
  form1.panel3.Caption:=zahlstr;
end;

function Tliste.ausgabe:string;
var zahlstr:string;
    lauf:Tknoten;
begin
 zahlstr:='';
 lauf:=anf;
 while lauf <> nil do
  begin
   zahlstr:= zahlstr + inttostr(lauf.nummer);
    lauf:=lauf.next;
  end;
 result:=zahlstr;
 form1.panel1.caption:=zahlstr;
end;

function Tliste.ausgabe2:string;
var zahlstr:string;
    lauf:Tknoten;
begin
 zahlstr:='';
 lauf:=anf;
 while lauf <> nil do
  begin
   zahlstr:= zahlstr + inttostr(lauf.nummer);
   lauf:=lauf.next;
  end;
 result:=zahlstr;
 form1.panel2.caption:=zahlstr;
end;

procedure Tliste.multi(koeff:integer);
var lauf: Tknoten;
  h: integer;
  zahlstr: string;
begin
 h:= 0;
 lauf:=anf;
 zahlstr:= '';
 form1.panel2.caption:= ' x   '+inttostr(koeff)+'   ';
  if koeff= 0 then
  begin
   anf:= nil;
   form1.panel3.caption:= '0';
  end
  else
    while lauf <> nil do
     begin
      zahlstr:=zahlstr + inttostr((lauf.nummer mod 10 * koeff)+h);
      h:= lauf.nummer div 10;
      lauf:= lauf.next;
     end;
   form1.panel3.caption:= zahlstr;
end;

destructor Tliste.destroy;
var alt1,alt2:TKnoten;
begin
 alt1:=neu;
 while alt1<>nil do
 begin
  alt2:=alt1;
  alt1:=alt1.next;
  alt2.free;
 end;
 inherited destroy;
end;

end.



Liebe Grüße, und bitte helft mir noch einmal...