Ein fröhliches Hallo!
Ich interessiere mich für den Taschenrechner im Quellcodebereich, ich möchte nämlich schon lange ähnliches Programmieren, krieg es aber nicht hin. Als ich mir ihn runtergeladen habe, stieß ich auf ein Problem: Wenn ich calc.cpp compilierte und linkte (?) erhielt ich Linkerfehler, wahrscheinlich, weil die Implentationen von vielen (allen?) "Klassenfunktionen" nicht gefunden wurden (Ich hab keine Ahnung was ein Linker macht).
Könnte es sein, dass calc.cpp "calculator.cpp" einbinden sollte und nicht "calculator.h", und ebenso calculator.cpp "bigint.cpp" einbinden sollte und nicht "bigint.h"?
Nach diesen 2 Änderungen lief das Programm jedenfalls einwandfrei.
Und wie das Programm läuft. Boah, Coooool.

Genauso wollte ich das auch programmieren.
Danke für das geile Programm.
Ist es in Ordnung wenn ich den Quellcode modifiziere, verwende, kopiere, ohne ihn in irgendeiner Weise kommerziell zu gebrauchen, und wenn ich jederzeit auf N43 vermerke?
Ach ja, und wie genau lassen sich nun mit dem Taschenrechner Dateien wie calc.txt während der Laufzeit einbinden?
Ich hoffe, ich hab nichts vergessen.
Ganz ganz ganz viel doll liebe Grüße, euer Wurfmaul.
PS :
Ich hätte das auch unter Calculator einen Kommentar erstellen können, aber ich dachte, ich bekomme hier mehr Aufmerksamkeit...
Hallo,
danke für das Lob und willkommen im Forum
Es müssen schon die Header Dateien eingebunden werden. Allerdings muss dem Compiler mitgeteilt werden, welche Dateien zusammen gehören. Für den
gcc würde das wie folgt aussehen:
gcc calc.cpp calculator.cpp bigint.cpp -o calc
Welchen Compiler bzw. welche Projektumgebung verwendest du denn? Normalerweise kann man im Projekt angeben, welche Dateien dazu gehören und welche die Hauptdatei ist, der Rest wird dann automatisch erledigt.
Ist es in Ordnung wenn ich den Quellcode modifiziere, verwende, kopiere, ohne ihn in irgendeiner Weise kommerziell zu gebrauchen, und wenn ich jederzeit auf N43 vermerke?
Du darfst den Code gerne verändern und weiter benutzen. Über einen Verweis auf programmers-corner.de würde ich mich freuen.
N43
Ich benutze Code::Blocks / GNU GCC Compiler.
Wenn ich die fünf Dateien in ein Projekt einfüge,
funktioniert das auch mit dem Einbinden.
Wieder was gelernt.
Die Hauptdatei "calc" wird glaube ich automatisch erkannt, vielleicht wegen
"int main".
Mit welchem Zahlensystem arbeitet der Rechner / die "bigints"?
Was bedeutet "1000000000UL"?
Danke für die Hilfe, danke für die Geduld.
Ich hab eben meinen Nickname vergessen?!
Hallo,
1000000000UL ist 10^9 (^ bedeutet hoch), der Zusatz UL bedeutet lediglich, dass die Zahl als
unsigned long gespeichert werden soll. Ohne diesen Zusatz würde der Compiler die Zahl falsch abspeichern, da er dann versucht die Zahl als
int abzuspeichern und somit zu wenig Bits (Speicher) für sie reservieren würde.
Die Klasse
cbigint speichert die Zahlen als Liste und addiert sie dann blockweise.
+ aaaa bbbb
+ cccc dddd
---------------------
= eeee ffff
Es wird zuerst bbbb+dddd berechnet. Gab es einen Übertrag wird er übernommen und bei der Berechnung von aaaa+cccc+Ü berücksichtigt. Das ganze funktioniert wie die Schulmethode, nur dass man nicht mehr einstellige Ziffern addiert, sondern ganze Blöcke.
die Multiplikation läuft auch ähnlich wie die Schulmethode
abcd * efgh
-----------------------
h*abcd
g*abcd
f*abcd
e*abcd
-----------------------
= aufsummieren = h*abcd + 10*g*abcd + 100*f*abcd + 1000*e*abcd
e,f,g und h bilden hierbei in der Implementierung wieder ganze Blöcke statt einzelne Ziffern. In der Implementierung muss man zusätzlich noch darauf achten, dass es keinen Überlauf gibt, bzw. einen solchen entsprechend behandeln.
Für die Division wird einfach solange die Zahl abgezogen, bis es nicht mehr geht und dabei mitgezählt, wie oft dies möglich war. Entsprechend langsam ist dann die Division beim ausführen.
Auch die Algorithmen für Addition und Multiplikation sind nicht die schnellsten, aber sie reichen für einfache Funktionen 
N43
Danke nochmal für die Erklärungen.
Ich habe inzwischen meine eigene "Natürliche Zahlen"-Klasse geschrieben, jedoch im Zweiersystem.
Sie ist aber (noch) langsamer als "bigint" und damit recht nutzlos...
Eigentlich hätte ich am liebsten eine "komplette" Implementierung der Mathematik in eine Programmiersprache, doch so etwas selbst zu programmieren halte ich für sehr sehr Anspruchsvoll.
Gibt es so etwas bereits?
Muss ich mir dafür kommerzielle software kaufen?
Gruß, Wurfmaul
Danke nochmal für die Erklärungen.
Ich habe inzwischen meine eigene "Natürliche Zahlen"-Klasse geschrieben, jedoch im Zweiersystem.
Sie ist aber (noch) langsamer als "bigint" und damit recht nutzlos...

Das ist doch Klasse, letztendlich zählt ja nur der persönliche Erfolg.
bigint selber ist für die Praxis auch zu langsam.
Eigentlich hätte ich am liebsten eine "komplette" Implementierung der Mathematik in eine Programmiersprache, doch so etwas selbst zu programmieren halte ich für sehr sehr Anspruchsvoll.
Gibt es so etwas bereits?
Muss ich mir dafür kommerzielle software kaufen?
Schau dir mal die Gnu multi precision library (GMP) an. Die beherrscht beliebig genaue Fließkommazahlen und dürfte um einiges schneller sein als bigint (schneller ist sie mit Sicherheit).
Interessant für die Zukunft sind parallele Algorithmen, die besonders mit Grafikkarten gut umgesetzt werden können, da diese wohl 800 oder mehr Prozessoren besitzen. In wieweit diese schon durch GMP umgesetzt werden weiß ich allerdings nicht.
N43
P.S.: Für einen Theoretiker wären unsere beiden Klassen gleich schnell
Der Wechsel des Zahlensystems bewirkt nur einen konstanten Faktor in der Laufzeit.
Danke für den Tipp.
GMP hört sich wirklich sehr interessant an, doch ich finde in Version 5.0.1 die Datei "gmp.h" nicht.

Was läuft hier falsch bzw. was mache ich falsch?
Hallo,
hab mal kurz die INSTALL überflogen, laut dieser muss man das Paket wie folgt übersetzen:
./configure
make
make check <= VERY IMPORTANT!!
Dabei sollte die gmp.h generiert werden. Es gibt bereits die gmp-h.in - ich nehme an, dass diese das Grundgerüst für gmp.h stellt.
Danach kann man noch "make install" ausführen, damit die Library und die Header Dateien in die Systempfade installiert werden, empfiehlt sich aber nicht für jedes System. Wahrscheinlich gibt es für deine Distribution bereits ein fertiges Paket, das nur installiert werden muss.
N43
Hallo noch einmal, ich bin es wieder.
Es gibt dennoch ein paar Probleme die ich bei der Installation von 'GMP' habe:
- Ich nutze keine Linux-Distribution, sondern ein mehr oder weniger bekanntes Betriebsystem mit "W", dessen Namen ich hier nicht aussprechen möchte.
- Ich habe keine Ahnung von der Linux-shell.
- Wozu eine makefile benötigt wird usw. weiß ich auch nicht...

Dies alles hat meiner Meinung nach aber nur recht wenig mit C/C++ zu tun, ich versuche mich dann an anderer Stelle zu informieren, und früher oder später werde ich auf GNU/Linux umsteigen.
Mit anderen Worten erwarte ich keine Diskussion meiner Probleme.
Trotzdem, danke für die Hilfe.
Gruß, Wurfmaul.
Hallo,
GMP wird unter Windows wohl leider nicht offiziell unterstützt. Code::Blocks kann aber mit Makefiles umgehen, vl. klappt ja alles auf Anhieb, wenn man es als Projekt importiert. Selber kann ich es hier leider mangels Windows nicht testen.
N43