Autor Beitrag
Bblackhawk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Mi 11.03.09 15:11 
Hi @ all erstmal,

ich möchte ein programm basteln, dass große zahlen miteinander addiert und multipliziert...
die zahlen werden sehr groß, daher wollte ich listen verwenden um diese zu speichern...
Ich weiß, es gibt diverse andere methoden, aber ich würde gerne mit listen arbeiten...
Also nun meine frage(n)...

1. Wie erstelle ich am einfachsten eine einfach verkettete Liste ?
2. Wie kann ich die Multiplikation mit der Liste umsetzen? komme nicht so recht auf eine procedure...

Wäre nett, wenn ihr mir helfen könntet...

Vielen Dank im vorraus
Bblackhawk

P.S. wusste nich genau wo ich's reinschreiben sollte, daher hab ich das einfach mal hierrein gesetzt, passte meiner meinung nach am besten...
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 11.03.09 15:22 
Hallo und :welcome:

Es fragt sich ja erstmal wie die Listen aussehen sollen. :nixweiss:

Grundsätzlich wäre eine Bibliothek wie BigInt sicherlich sehr viel sinnvoller:
sourceforge.net/projects/bigint-dl

Wenn die Geschwindigkeit nicht so wichtig ist, kannst du es auch selbst implementieren. Wie du schriftlich multiplizierst, solltest du doch eigentlich aus der Schule wissen.
de.wikipedia.org/wiki/Multiplikation
en.wikipedia.org/wik...iplication_algorithm
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Mi 11.03.09 15:26 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Grundsätzlich wäre eine Bibliothek wie BigInt sicherlich sehr viel sinnvoller:
sourceforge.net/projects/bigint-dl

Alternativ bietet sich auch user profile iconBens Großzahlarithmetik-Bibliothek BigNum2 an. ;)
Bblackhawk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Mi 11.03.09 15:32 
ich weiß, dass ich das mit BigInt einfacher haben könnte, möchte es aber gerne mit listen umsetzten... is komplizierter, aber ich würd das halt gerne so machen :(

zu dem multiplizieren... wie man das macht so schriftlich weiß ich, aber ich weiß nicht, wie ich das in delphi umsetzen kann :(
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 11.03.09 15:37 
Ja, wie stellst du dir deine Listen denn überhaupt vor? Vor der Umsetzung in Delphi musst du dir das ja erstmal überlegen. Ich meine was soll in den einzelnen Listenelementen denn drin stehen?

Und erst wenn du das hast, dann kannst du dir überlegen wie du das multiplizierst. Denn erst dann weißt du wie du an die einzelnen Stellen herankommst.
Und dann sollte die Multiplikation auch kein Problem mehr sein, wenn dir die Vorgehensweise soweit klar ist.

Was hat es eigentlich für einen Sinn dir das Leben so schwer zu machen und das Rad neu zu erfinden? :gruebel:

Dabei fällt mir auf:
Crossposts sollten angegeben werden.
forum.delphi-treff.d...owthread.php?t=26064
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 11.03.09 15:38 
Hm. Weil es im DelphiTreff nicht mehr geht, probierst du es jetzt hier, oder wie? Aber ok.

Wie sieht denn dein Ansatz aus? Man kann das mit Listeneinträgen machen, ja. Ein Eintrag pro Ziffer, und dann so loslegen, wie man in der Schule schriftlich multipliziert. Zwei Ziffern multiplizieren geht ja im Typ Integer, wenn das größer als 9 ist, muss man mit Div 10 und Mod 10 die Einerstelle rausfinden und die Zehnerstelle im Übertrag speichern usw.

Ist nicht mal eben runtergeschrieben, aber prinzipiell sollte das doch kein Problem sein. :nixweiss:

_________________
We are, we were and will not be.
Bblackhawk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Mi 11.03.09 15:43 
sry hab das mit crosspost vergessen... sry...

also in die lsite sollen große zahlen...

jedes listenelement eine stelle der zahl...
Bsp: Zahl: 546546 jede Zahl ein listenelement...
nun will ich 2 x beliebig lange zahlen miteinander multiplizieren... habe nun das problem, dass ich das nich so gebacken krieg...
und das hab ich leider nicht so wirklich verstanden... wie soll das gehen.. wenn ich 2 ziffern miteinander multipliziere, dann kommt das doch nich hin !?
user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:

Zwei Ziffern multiplizieren geht ja im Typ Integer, wenn das größer als 9 ist, muss man mit Div 10 und Mod 10 die Einerstelle rausfinden und die Zehnerstelle im Übertrag speichern usw.

kannste das mal bitte für dumme leute wie mich erklärn plz ?? :)

danke schonmal :)

MfG
Bblackhawk
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Mi 11.03.09 15:46 
Nur mal doof gefragt: Kannst Du "trocken", also mit Papier und Stift 2 Zahlen schriftlich multiplizieren? Wenn nein, dann muss Du erst mal anfangen und Dir das aneignen. Erst dann kannst Du das Verfahren in Quellcode umsetzen.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Bblackhawk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Mi 11.03.09 15:48 
user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
Nur mal doof gefragt: Kannst Du "trocken", also mit Papier und Stift 2 Zahlen schriftlich multiplizieren? Wenn nein, dann muss Du erst mal anfangen und Dir das aneignen. Erst dann kannst Du das Verfahren in Quellcode umsetzen.


das krieg ich noch so gerade hin ^^
aber wie gesagt, ich weiß nicht, wie ich das in delphi machen soll^^
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Mi 11.03.09 15:59 
Dann fang doch einfach mal an, den Algorhytmus umzusetzen.
Speichere Deine beiden Faktoren in Arrays und mache mit den Array das selbe, was Du sonst auf dem Papier machen würdest.
Fang einfach an und probier mal. Wenn Du dann nicht weiterkommst, dann poste hier Deine Versuche und wir werden Dir weiterhelfen.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Bblackhawk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Mi 11.03.09 16:07 
mein erstes problem ist leider, dass meine listen noch nich ganz funktionieren... habt ihr eine fertige einfach verkettete liste für zahlen parat ?
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Mi 11.03.09 16:11 
user profile iconBblackhawk hat folgendes geschrieben Zum zitierten Posting springen:
mein erstes problem ist leider, dass meine listen noch nich ganz funktionieren... habt ihr eine fertige einfach verkettete liste für zahlen parat ?

Was genau funktioniert nicht? Am besten eröffnest du einen neuen Thread, mit einer konkreten Frage zu deinem aktuellen Problem. ;)
Ansonsten haben wir hier eine klasse SuFu (Suchfunktion) oder Google im Angebot...
Vielleicht sollte ich doch einmal ein Tutorial zu verketteten Listen schreiben, was ich bereits vor 2 Jahren vorhatte...

Grüße,
Marc
theChaoS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 38



BeitragVerfasst: Mo 20.04.09 18:16 
user profile iconBblackhawk hat folgendes geschrieben Zum zitierten Posting springen:
mein erstes problem ist leider, dass meine listen noch nich ganz funktionieren... habt ihr eine fertige einfach verkettete liste für zahlen parat ?

Dass kommt mir SEHR bekant vor :D
Lass mich raten du bist im Gmy und in der 11 oder 12 ten ???
Ja das Problem hatte ich auch mal 8) .
Okay du machst folgendes du nimmst ENTWEDER (und das ist das besere) eine Verkette LIste für Strings. Denn dan kanst du ALLES abspeicheren und den string beim auslessen einfach konfertiren ODER du postest mal den quelltext und wir kucken wo es in der Liste hapert.
Wen gar nix meher geht sag bescheid weil ich hab noch so net liste irgenwo aber müst mal in den alten schulsachen kramen.
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Mo 20.04.09 19:06 
Hi :)

Ich hoffe doch wir werden es hinbekommen, eben den Aufbau zu erklären :D blinde Arbeit mit fremdem Code kann doch ein wenig zu.. Verwirrungserscheinungen führen ;)

Was ist denn so eine Liste? Gut, wir haben einen Datentyp. Um den wollen wir eine Struktur bauen, die es uns erlaubt, Nachfolger und Vorgänger des Listenelements zu ermitteln.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
type
  TListenElement = class (TObject)
  private
    FContent: Integer;  //oder anderer Datentyp
    FNext: TListenElement;
    FPrev: TListenElement;
  public
    //Methoden
  end;


Eventuell ohne das "private"(das regelt nur die Zugriffsrechte und macht unter Andwerem die Auswahl im Ergänzungsfeld etwas übersichtlicher), aber das sollte es in etwa sein. Jetzt benötigt ihr noch Methoden, also Prozeduren und Funktionsaufrufe der Klasse TListenElement, mit denen ihr denZugriff auf die Feldvariablen der Klasse steuert und, mit denen ihr euch die Arbeit erleichtert.

Das sind im Wesentlichen:
  • Content setzen und lesen
  • Prüfen, ob Element erstes oder letztes Element der Liste(ob Nachfolger existiert)
  • Element an dieses anhängen


Eventuell wollt ihr auch eine Listen-Klasse schreiben, die den Umgang mit den Elementen erleichtert:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
type
  TListe = class(TObject)
  private
    FAktives: TListenElement;
  public
    function Weiter: Boolean;  //holt nächstes Listenelement und gibt zurück, ob erfolgreich(sonst -> Ende der Liste)
    function Zurück: Boolean;
    function Lese: Integer;
    procedure Schreibe(aWert: Integer);
  end;


So, das wäre das Grundprogramm für eine Liste. Wenn ihr nun z.B. noch wissen müsst, ob ihr am Listenende seid, ohne gleichzeitig zu versuchen, das nächste Element auszuwählen, kommen noch ein Paar Funktionen hinzu.

Ob zum Beispiel ein Nachfolger existiert, könnt ihr ganz einfach mit einem Vergleich auf nil sehen. nil bedeutet so viel wie "nichts", "nicht existent". Wortwörtlich "not in list". if Exists(FNext) wäre also gleichbedeutend mit if FNext <> nil bzw. if Assigned(FNext) then ...

Damit das auch klappt, müsst ihr die Feldvariable, die auf den Nachfolger zeigt, auf nil setzen, wenn ihr diesen noch nicht hinzugefügt oder schon freigegeben habt.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
constructor TListenElement.Create;
begin
  inherited Create;
  FNext := nil;  //sich merken, dass noch kein Nachfolger existiert
  FPrev := nil;  //wenn ihr den Speicher vom System bekommt, kann da auch irgendetwas stehen
end;

procedure TListenElement.HaengeAn(ANext: TListenElement);
begin
  FNext := ANext;
  if ANext <> nil then
    ANext.FPrev := self;  //self ist wie nächstes odervorheriges ein Zeiger, und zwar auf sich selbst ;)
end;

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)


Zuletzt bearbeitet von Hidden am Di 21.04.09 17:32, insgesamt 1-mal bearbeitet
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 20.04.09 19:43 
Moin!

user profile iconHidden hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
constructor TListenElement.Create;
begin
  inherited Create; // geerbten Konstruktor aufrufen
  // FNext := nil; // es existiert noch kein Nachfolger - wird automatisch auf NIL gesetzt
  // FPrev := nil; // Vorgänger gibt´s auch nicht - unnötig, s.o.
end;
Auch wenn bei TObject theoretisch unnötig, bitte immer an den geerbten Konstruktor denken. :idea: ;)

cu
Narses

PS: Das Initialisieren der Feldvariablen im Konstruktor ist übrigens nicht nötig, der Speicher einer Klasse wird immer mit 0 initialisiert geliefert (garantierte Eigenschaft von Klassen). :)

_________________
There are 10 types of people - those who understand binary and those who don´t.