C++ Rechner - Hochrechnen?
lima-city → Forum → Programmiersprachen → C/C++ und D
befehl
beispiel
break
buchstabe
code
division
double
eingabe
entwicklung
ersten zahlen
funktion
funktionieren
hochrechnung
multiplikation
operator
positiven exponenten
string
switch
symbol
zahl
-
Hey.
Ich bin gerade an der Entwicklung eines Taschenrechners mit C++. In seiner Beta Version v0.0.1 kann er jetzt alle 4 Rechenarten (Addition, Subtraktion, Multiplikation, Division). In der nächsten Version möchte ich jetzt Hochrechnung und die Anzeige der ersten Zahlen von Pi machen. Pi ist nicht schwer, man kann die "cin" Befehle eifnach weglassen und Pi ausgeben, sobald man auf die 5 drückt ("case").
Aber wie realisiere ich Hochrehnungen. Ich möchte, das man erst den Wert eingibt, und dann die Zahl wie oft es hochgerechnet werden soll. Die Funktion ^ scheint ja in C++ nicht ohne weiteres zu funktionieren.
Als Beispiel: Das hie rist die Multiplikation:
case 3: cout<<"Bitte geben Sie Wert1 ein.\n"; cin >> b; cout<<"\nBitte geben Sie Wert2 ein.\n"; cin >> c; cout<<"Ergebnis:"<<b*c<<"\n\n"; cout<<"Moechten Sie noch etwas berechnen?(1=Ja, 2=Nein)\n\n\n"; cin >> d; break;
Nur Was ist der Code für Hochrechnungen?
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Irgendwo in der math.h soll es eine Funktion namens pow() geben -- die müsste auch mit c-- funktionieren:
http://www.cpp-entwicklung.de/cpplinux/cpp_main/node5.html
^ ist übrigens der XOR-Operator, hab ich mir sagen lassen.
Beitrag geändert: 11.12.2008 21:42:54 von alopex -
Wenn dus dir einfach machen willst, dann ists die Math.h pow() funktion.
Alternativ kannste es auch selbst machen...bloß ist das kein so einfaches unterfangen, insbeondere wenn der exponent nicht nur positiv und ganzzahlig sondern auch negativ und reel sein darf.
Das ^ funktioniert logischerweise nicht:
^ ist ein binärer Operator
Und zwar das explizite oder, oder auch als entweder...oder bekannt :D
Also:
10110101 ^
10010010
________
00100111
Beitrag geändert: 11.12.2008 21:50:05 von nikic -
Hey. Danke. Nebenbei habe ich jetzt eine Möglichkeit für Pi gefunden. Aber: In der Erklärung steht, das man sie halt selbst programmieren sollte. In etwa so:
double my_power(double x, int n) { if (n<0) { if (x) return 1.0/my_power(x, -n); else return 0.0; // Fehlerfall! } switch(n) { case 0: return 1.0; case 1: return x; case 2: return x*x; case 3: return x*x*x; default: return x*my_power(x, n-1); } }
Steht da. Nur das kleine Problem daran ist, das case 0, 1, 2 und 3 schon belegt sind, und da dann in diesem Befehl einiges fehlt. Oder versteh ich das was falsch? Sorry ich beginne gerade mit C++.
Mehr als #include <iostream>, cin, cout, case, break und return, default und noch einige hab ich nicht viel. ^^ -
Steht da. Nur das kleine Problem daran ist, das case 0, 1, 2 und 3 schon belegt sind, und da dann in diesem Befehl einiges fehlt. Oder versteh ich das was falsch? Sorry ich beginne gerade mit C++.
Also die Funktion ist für alle ganzen, positiven Exponenten ja schon definiert...
Es ist hier über Rekursion gelöst worden.
es gilt:
x^n = x*(x^(n-1))
d. h. wenn wir pow(x,n) = x^n setzen:
pow(x,n) = x*pow(x,n-1)
der Rechner ruft daher so lange die Funktion pow(x,n) auf, bis er irgendwann einen Rückgabewert bekommt, was bei n=3 der Fall ist. Danach hangelt er sich den ganzen Weg wieder zurück.
Beispiel:
In pow(2, 5) wird pow(2, 4) verwendet => berechne pow(2, 4)
In pow(2, 4) wird pow(2, 3) verwendet => berechne pow(2, 3)
pow(2, 3) kann berechnet werden: 2*2*2 = 8
Jetzt geht er den ganzen Weg zurück:
pow(2, 4) = 2*8 = 16
pow(2, 5) = 2*16 = 32
Negative Exponenten sind auch noch machbar, einfach ein "if(n < 0) return 1/pow(x, -n);" einfügen.
Damit wäre die Funktion vollständig definiert (denn n darf ja auch negativ sein).
Beitrag geändert: 12.12.2008 23:59:32 von calexus
Beitrag geändert: 15.12.2008 22:11:20 von calexus -
Naja, ganz vollständig ist sie dann nicht definiert...
...zwar reicht es so für deine Zwecke sicher aus. Aber iegentlich müsste man noch den deutlich komplizierteren Fall von reelen Zahlen betrachten. Wurzeln will man ja auch ziehen :D -
Naja, ganz vollständig ist sie dann nicht definiert...
schon klar, aber n ist ja als int deklariert....zwar reicht es so für deine Zwecke sicher aus. Aber iegentlich müsste man noch den deutlich komplizierteren Fall von reelen Zahlen betrachten. Wurzeln will man ja auch ziehen :D
ja, geht wahrscheinlich über die Taylor-Reihe. Aber genau weiß ich da auch nicht bescheid... -
Es müsste aber für meine Zwecke ausreichnen. Ist ja nur ein kleiner Rechner^^. Zum Üben,
Aber wie muss ich die Pi Funtkion in der math.h verstehen? Weil ich würd gern mal verstehen wie Pi in so einem Fall errechnet wird und nicht nur ausgegeben.
Edit:
@calexus:
Also der vollständige Funktionsname ist jetzt?
int pow(x,n) = x*pow(x,n-1)?
{
if(x < 0) return 1/pow(x)
else
return x,n;
}
oder hab ich was nicht gecheckt?
Beitrag geändert: 14.12.2008 14:41:00 von robbmaster -
Sorry. Aber kann ma jemand antworten :[ Please. ^^ Achja noch ne Frage.
Also der Befehl:
case 4
{
BEFEHL
}
Gibt ja den Befehl aus, sobald man 4 eingibt.
Aber
case "version" & version
funktioniert nicht.
Welcher Befehl ist das denn? -
Aber wie muss ich die Pi Funtkion in der math.h verstehen?
Gibt es eine Funktion Pi in der math.h? Das wäre mir neu, ich kenne Pi bloß als Konstante definiert. Hast du Quellcode?Weil ich würd gern mal verstehen wie Pi in so einem Fall errechnet wird und nicht nur ausgegeben.
Es gibt so viele Methoden Pi zu berechnen, z. B. durch 2*arcsin(1) (und arcsin(x) über die Reihenentwicklung) einfach mal googlen.
Also der vollständige Funktionsname ist jetzt?
Sorry, mit 1/pow(x) hab ich was falsch gebracht. x ist die Basis, n der Exponent.
Das wär mein Vorschlag:
double my_power(double x, int n) { if (n<0) { return(1/my_power(x, -n)); } switch(n) { case 0: return 1.0; case 1: return x; case 2: return x*x; case 3: return x*x*x; default: return x*my_power(x, n-1); } }
case 4
erläuter das nochmal genauer, ich verstehe nicht so ganz was du machen willst...
{
BEFEHL
}
Gibt ja den Befehl aus, sobald man 4 eingibt.
case "version" & version
funktioniert nicht.
Welcher Befehl ist das denn?
-
das case "version" funktioniert nicht, wenn die ge-switch-te Variable ein char[] ist.
Wenn du also char blablabla[] = "version" hast, dann ist blablabla eigentlich ein Poniter auf das erste Array-Element, was in diesem Fall ein Pointer auf das 'v' wäre. Das müsstest du also iwie anders realisieren. -
das case "version" funktioniert nicht, wenn die ge-switch-te Variable ein char[] ist.
Wenn du also char blablabla[] = "version" hast, dann ist blablabla eigentlich ein Poniter auf das erste Array-Element, was in diesem Fall ein Pointer auf das 'v' wäre. Das müsstest du also iwie anders realisieren.
mit strcmp() z.B. -
das case "version" funktioniert nicht, wenn die ge-switch-te Variable ein char[] ist.
Wenn du also char blablabla[] = "version" hast, dann ist blablabla eigentlich ein Poniter auf das erste Array-Element, was in diesem Fall ein Pointer auf das 'v' wäre. Das müsstest du also iwie anders realisieren.
mit strcmp() z.B.
Kannst du das mal genauer erklären mit strcmp?
EDIT:
@Calexus: Scheint zwar beim Einbinden zu funktionieren, nur hab ich Problem wenn ich dann als Ergebniss die Variable n anzeigen lassen will, meckert mein Decompiler das n keinen Wert hat...
Beitrag geändert: 16.12.2008 20:35:23 von robbmaster -
@Calexus: Scheint zwar beim Einbinden zu funktionieren, nur hab ich Problem wenn ich dann als Ergebniss die Variable n anzeigen lassen will, meckert mein Decompiler das n keinen Wert hat...
Du meinst wohl dein Compiler?
Die Variable n ist nur innerhalb der Funktion definiert, das Ergebnis ist der Rückgabewert der Funktion my_power.
sollte funktionieren.double ergebnis = my_power(x,n); cout << ergebnis;
-
Ahh. Danke. Ich denke es hat funktioniert. Jetzt mus sich nur noch gucken wie ich das mit dem anderen BEfehl hinkriege. Naja, du wollest ja mal wissen wie ich das meine.
Also.
Bei
case 4 { BEFEHL }
Wird der Befehl ja bei eintippen der Zahl 4 und der Bestätigung mit Enter ausgeführt.
Sowas möchte ich auch machen, allerdings nicht mit einer Zahl sondern einem Wort, da ich beim Eintippen von version sozusagen die Verionsinfos anzeigen möchte.
Nur.
case version // oder auch "version" { BEFEHL }
funktioert nicht ja nicht. -
Also, case funktioniert da gar nicht mehr, da man Strings verleichen muss.
Folgender Code würde funktionieren:
char eingabe[10]; cin >> eingabe; if(strcmp(eingabe, "version") == 0){ cout << "Die Version ist 0.1" ;}
Das Problem ist an dieser Lösung, dass es zu einem Pufferüberlauf kommen kann, wenn der Benutzer mehr als 10 Zeichen eingibt. -
Wie schon oben gesagt, kann man mit switch keine strings vergleichen, denn mit switch kann man nur char oder int übergeben.
also
string i = "hallo";
switch(i)
{
case "Hallo":
...
break;
case "hallo":
....
}
funktioniert nicht.
Du musst dir also eine andere Lösung einfallen lassen, wie zum beispiel nur ein Buchstabe übergeben (v anstatt version) oder du unterscheidest von nun an mithilfe von if -
So leider funktioniert keines der beiden richtig. Naja. Ich schicke dir mal eine PN calexus, da ich den Quellcode hie rnicht veröffentlich will und ich ihn dir einfach mal per PN schicke.
Nebenbei würde mich mal interessieren wie ich ein Symbol und einen Titel in ein C++ Programm kriege. -
ich würde das ganze simpel mit ner for-schleife lösen:
[code
]for (int i=1; i!=hoch; i++)
{
zahl=zahl*zahl;
}
cout<<zahl;
[/code] -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage