developers-forum.de

Normale Version: Calculator
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.

Wurfmaul

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. Sehr glücklich
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 Smilie

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:

Code:
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.

Zitat:
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

Gast

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.

Wurfmaul

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.

Code:
+  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

Code:
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 Smilie


N43

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...Traurig

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

wurfmaul schrieb:
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...Traurig

Das ist doch Klasse, letztendlich zählt ja nur der persönliche Erfolg. Smilie bigint selber ist für die Praxis auch zu langsam.

Zitat:
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 Smilie Der Wechsel des Zahlensystems bewirkt nur einen konstanten Faktor in der Laufzeit.

wurfmaul

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.
Geschockt
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:

Code:
    ./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

wurfmaul

Hallo noch einmal, ich bin es wieder.

Es gibt dennoch ein paar Probleme die ich bei der Installation von 'GMP' habe:
  1. Ich nutze keine Linux-Distribution, sondern ein mehr oder weniger bekanntes Betriebsystem mit "W", dessen Namen ich hier nicht aussprechen möchte.
  2. Ich habe keine Ahnung von der Linux-shell.
  3. Wozu eine makefile benötigt wird usw. weiß ich auch nicht...
Geschockt
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
Referenz-URLs