sqrt() und pow() könne nicht compiliert werden
-
Fahrstuhlmusik schrieb:
[cpp]
{
double a;
double b;
cout << "Bitte geben sie die zu quadrierende Zahl ein" <<endl;
cin >> a;
b = sqrt(a);
cout << "Quadratzahl von " << a << " = " << b <<endl;
}[/code]noch ne kleine Anmerkung, die jetzt eher fachlicher Natur ist (also nichts mit der Programmierung an sich zu tun hat):
"sqrt" ist die Abkürzung für square root, also Quadratwurzel. Du behandelst es aber so als würdest du damit quadrieren...
-
ok danke compilieren hat jetzt geklappt.
1.) ist die 2008er version nicht kostenpflichtig? Ausserdem habe ich die 2005 aus nem FAQ aus diesem forum...
2.) im buch auf den seiten 52-54 wird pow() und sqrt() recht ausfürhlich behndelt, und es wurde immer double genommen...
3.) Bis ich zu includeguard komme benutze ich using namespace noch in der source-datei, dein beispiel ist mir ein bisschen kompiliziert...
-
Fahrstuhlmusik schrieb:
1.) ist die 2008er version nicht kostenpflichtig? Ausserdem habe ich die 2005 aus nem FAQ aus diesem forum...
Die 2008er Express Version ist frei erhältlich. Allerdings ohne MFC, die waren meines Wissens in der 2005er noch dabei.
2.) im buch auf den seiten 52-54 wird pow() und sqrt() recht ausführlich behndelt, und es wurde immer double genommen...
viele Funktionen sind für float und double überladen. Es geht also beides.
3.) Bis ich zu includeguard komme benutze ich using namespace noch in der source-datei, dein beispiel ist mir ein bisschen kompiliziert...
in der Source-Datei ists auch nicht weiter schlimm, vorausgesetzt es steht erst NACH allen #includes. Und so kompliziert ist das Beispiel wirklich nicht, wenn man sich mal kurz mit beschäftigt

-
was ist ien MFC?

in der Source-Datei ists auch nicht weiter schlimm, vorausgesetzt es steht erst NACH allen #includes. Und so kompliziert ist das Beispiel wirklich nicht, wenn man sich mal kurz mit beschäftigt
ich guck mal
-
Fahrstuhlmusik schrieb:
was ist ien MFC?

Microsoft Foundation Classes, aber die wirst du wahrscheinlich nicht gerade brauchen...
-
wenn du deinen Rechner mal fertig hast kannst du ihn mir ja mal zeigen
würde mich interessieren da ich persönlich momentan genau so einen Rechner auch Programmieren tu 
bzw hoffentlich bis Weihnachten fertig bin

gruß
-
Naja die grundfunktion (+,-,*,/), wurzeln ziehen und potenzieren kann er, jedoch ist der code etwas unordentlich und es sind immer noch goto's vorhanden (im buch stand noch nicht wie ich auf andere teile des programms verweise ohne goto zu benutzen). Ich hoffe das ich bis weihnachten an dem kapitel angelangt bin, dann kann ich dir den code mal schicken.
-
Um gotos zu entfernen sind if und while sehr nützlich.

-
aber wie kann man mit if oder while vom programmende an den programmanfang verweisen? Gibts da anweisungen die ich noch nicht kenne?
-
Fahrstuhlmusik schrieb:
aber wie kann man mit if oder while vom programmende an den programmanfang verweisen? Gibts da anweisungen die ich noch nicht kenne?
In der Regel springt man ja nicht wild im Programm hin und her, sondern es sollte eine klare Struktur zu erkennen sein. Wenn der Code zwischen "Programmanfang" und "Programmende" in irgendeiner Form mehrmals ausgeführt werden soll, dann wäre eine Schleife das Mittel der Wahl. Das kann eine while-Schleife sein, do/while, oder auch eine for-Schleife, je nachdem, was sich in dem Fall anbietet.
Ohne goto geht es jedenfalls immer, und es gibt sogar Programmiersprachen, die einen goto-Befehl gar nicht erst anbieten.
-
Du kannst doch Teile deines Codes in eine while-Schleife packen. Dann wird der Code solange wiederholt bis die Bedingung nicht mehr zutrifft. Das ist doch sowas wie ein zurückspringen an den Anfang. Z.Bsp. sowas:
int c; do { cout << "Addition = 1, Subtraktion = 2, Multiplikation = 3, Division = 4, Quadrieren = 5, Potenzieren = 6"<<endl; cin >> c; //hier dann dein Code am besten in einem swich } while(c>0 && c<7); //Weitermachen wenn die Eingabe gültig war
-
hm, ich hab jetzt folgendes geschrieben(code ist ein bisschen lang, aber wenn ich was wegnehme könnt ihr mir villeicht nicht mehr helfen, oder soll ich in als eine Datei anhängen?):
//überarbeitete Version des myfirstprog Taschenrechner // #include <iostream> #include <cmath> using namespace std; int main() { int Aktion; cout<<"Willkommen zur ueberarbeiteten Version des Taschenrechners aus dem Programm"<<endl; cout<<"myfirstprog."<<endl; cout<<"Diese Version soll mehr funktionen beinhalten, besser zu bedienen sein,"<<endl; cout<<"und der code soll lesbar werden(versprechen kann ich aber nichts)."<<endl; cout<<endl; cout<<"<----Taschenrechner Version 1.0---->"<<endl; cout<<"Was wollen sie machen?"<<endl; cout<<endl; cout<<"1=Addieren"<<endl; cout<<"2=Multiplizieren"<<endl; cout<<"3=Subtrahieren"<<endl; cout<<"4=Dividieren"<<endl; cout<<"5=Wurzel ziehen"<<endl; cout<<"6=Potenzieren"<<endl; cout<<endl; cout<<"Bitte waehlen sie ihre Aktion"<<endl; cout<<endl; cin >> Aktion; cout<<endl; //----Addieren if (Aktion==1) { cout<<endl; cout<<"Bitte geben sie eine Zahl ein"<<endl; cout<<endl; double Zahl1; cin >> Zahl1; cout<<"Bitte geben sie eine zweite Zahl ein"<<endl; cout<<endl; double Zahl2; cin >> Zahl2; cout<<"Ergebniss: "<<Zahl1+Zahl2<<endl; cout<<endl; } //----Multiplizieren if (Aktion==2) { cout<<endl; cout<<"Bitte geben sie eine Zahl ein"<<endl; cout<<endl; double Zahl1; cin >> Zahl1; cout<<"Bitte geben sie eine zweite Zahl ein"<<endl; cout<<endl; double Zahl2; cin >> Zahl2; cout<<"Ergebniss: "<<Zahl1*Zahl2<<endl; cout<<endl; } //----Subtrahieren if (Aktion==3) { cout<<endl; cout<<"Bitte geben sie eine Zahl ein"<<endl; cout<<endl; double Zahl1; cin >> Zahl1; cout<<"Bitte geben sie eine zweite Zahl ein"<<endl; cout<<endl; double Zahl2; cin >> Zahl2; cout<<"Ergebniss: "<<Zahl1-Zahl2<<endl; cout<<endl; } //----Dividieren if (Aktion==4) { cout<<endl; cout<<"Bitte geben sie eine Zahl ein"<<endl; cout<<endl; int Zahl1; cin >> Zahl1; cout<<"Bitte geben sie eine zweite Zahl ein"<<endl; cout<<endl; int Zahl2; cin >> Zahl2; cout<<"Ergebniss: "<<Zahl1/Zahl2<<" Rest: "<<Zahl1%Zahl2<<endl; cout<<endl; } //----Wurzelziehen if(Aktion==5) { cout<<endl; cout<<"Bitte Geben sie die zahl ein, aus der sie die Wurzel ziehen möchten"<<endl; cout<<endl; double Quadratzahl; cin >> Quadratzahl; cout<<endl; double Wurzel = sqrt(Quadratzahl); cout<<"Wurzel aus "<<Quadratzahl<<" ist "<<Wurzel<<endl; cout<<endl; } //----Potenzieren if(Aktion==6) { cout<<endl; cout<<"Bitte geben die zu potenzierende Zahl ein"<<endl; cout<<endl; double Zahl; cin >> Zahl; cout<<endl; cout<<"Geben sie die Potenz ein"<<endl; cout<<endl; double Potenz; cin>>Potenz; cout<<endl; double PZahl =pow(Zahl, Potenz); cout<<"Ergebnis: "<<PZahl<<endl; cout<<endl; } return 0; }Und nach jeder rechnung möchte ich wieder zur auswahl der Rechenmöglichkeiten kommen...

-
Versuch doch einmal die do/while-Schleife, die Braunstein gepostet hat, zu verstehen. Sowas ist schon genau das, was du in dem Fall brauchst.
-
hui habs geschafft, hab einfach
do { cout<<"<----Taschenrechner Version 1.0---->"<<endl; cout<<"Was wollen sie machen?"<<endl; cout<<endl; ... ... ... ... }while (Aktion>0 && Aktion<7) return 0; }gemacht, also praktisch das ganze programm in eine do/while schleife gesetzt und jetzt funktioniert es perfekt^^ Danke an alle

-
Schön.

Jetzt solltest du dir mal was zu Funktionen durchlesen und anfangen deinen Code etwas zu strukturieren.
-
int multi(); char DrumRum (const char * term); double berechne (const char * term); double operation (double w1, double w2, const char * o); char * my_strcpy (char * dest, const char * source); char * my_klammernsetzer(char* dest, const char * source); char * my_sqrt(char* dest, const char * source); int main() { start: char term[1024]; printf("Funktion eingeben\noder Beenden mit << quit >>\n"); gets(term); while (term[0] != 'q' && term[1] != 'u' && term[2] != 'i' && term[3] != 't') { printf("Ergebnis:%lf\n", berechne(term) ); printf("Bitte Entertaste druecken!"); fflush(stdin); getchar(); goto start; } return 0; }; double operation (double w1, double w2, const char * o) { double erg; switch (o[0]) { case '+': erg = w1 + w2; break; case '-': erg = w1 - w2; break; case '^': erg = pow(w1, w2); break; case '?': erg = pow(w2, 1/w1); break; case '*': erg = w1 * w2; break; case '/': erg = w1 / w2; break; } return erg; } double berechne (const char * term) { int strich = -1; // Strichoperator gefunden wird strich zum Wert der Stelle wo gefunden int punkt = -1; // Strichoperator gefunden wird strich zum Wert der Stelle wo gefunden int klammern = 0; // Klammer erhöhrt sich wenn Klammerauf und senkt sich wenn Klammerzu int klammerauf = -1; int hoch = -1; int wurzel = -1; int trennpunkt = -1; char temp[1024]; char temp2[1024]; char temp3[1024]; char temp4[1024]; char temp5[1024]; char tempwurzel[1024]; char wterm[1024]; int i = 0; int j = 0; //Leerzeichen for(i=0; term[i] != '\0'; i++) { if (term[i] == ' ') { my_strcpy(temp2, term); //Aufruf von strcpy return berechne(temp2); } } //, zu . wandeln for(int k=0; term[k] != '\0'; k++) { if (term[k] == ',') { my_strcpy(temp4, term); return berechne(temp4); } } //Wurzeln for(int l=0; term[l] != '\0'; l++) { if(term[l] == '?' && (isalpha(term[l-1]) || isspace(term[l-1]) || ispunct(term[l-1]))) { my_sqrt(tempwurzel, term); return berechne(tempwurzel); } } //Wenn Außen Klammern werden diese zur weiteren Berechnung entfernt //(Klammern wenn: [0] != '(' und [letzte Position - 1] != ')' 2+2)+(2+2 if (term[0] == '(' && term[strlen(term)-1] == ')') { strncpy (wterm, term+1, term[strlen(term)-2]); //oder: std::memmove(wterm, term+1, term[strlen(term)-2]); wterm[strlen(wterm)-1] = 0; return berechne (wterm); } // Operatoren und Klammern Prüfung_____________________________________________________ for ( int i = 0; term[i] != '\0'; i++) { if ((term[i] == '+' || term[i] == '-') && klammern == 0) { strich = i; // Stelle an der das + oder - im string steht wird in var strich gespeichert trennpunkt = -1; break; } else if ((term[i] == '/' || term[i] == '*') && klammern == 0) { punkt = i; // Stelle an der das * oder / im string steht wird in var punkt gespeichert trennpunkt = -1; } else if ((term[i] == '^') && klammern == 0) { hoch = i; trennpunkt = -1; } else if ((term[i] == '?') && klammern == 0) { wurzel = i; trennpunkt = -1; } else if (term[i] == '(') { if (klammern == 0) klammerauf = i; klammern++; //Wenn Klammerauf gefunden klammern++ } else if (term[i] == ')') { klammern--; //Wenn Klammerzu gefunden klammern--; } else if (term[i] == '.') { trennpunkt++; //Wenn . gefunden trennpunkt++; } } // wenn Klammern ungleich 0 fehler ausgeben if (klammern != 0) { return printf("Sie haben unzulässige Klammern gesetzt!\nEnter um fortzufahren\n"); } //Wenn . ungleich 0 fehler ausgeben if (trennpunkt >= 1) { return printf("Sie haben eine unzulässige Punkteingabe gemacht!\nEnter um fortzufahren\n"); } // wenn kein Operator dann Zahlenwert else if (punkt == -1 && strich == -1 && klammerauf == -1 && hoch == -1 && wurzel == -1) { double a = 0; if ( sscanf( term, "%lf", &a) == 1 ) return a; if ( !strcmpi( term, "PI" ) ) return 3.145f; if ( !strcmpi( term, "EU" ) ) return 2.718f; if ( !strcmpi( term, "PH") ) return 1.61803f; return printf("Fehlerhafte Eingabe. Bitte keine Buchstaben eingeben!\n"); } /*//------------------------ int trenner = -1; if ( strich != -1 ) trenner = strich; else if ( punkt != -1 ) trenner = punkt; else if ( hoch != -1 ) trenner = hoch; else trenner = wurzel; //------------------------*/ int trenner = strich != -1 ? strich : (punkt != -1 ? trenner = punkt : (hoch != -1 ? trenner = hoch : trenner = wurzel)); // w1, w2 und o alle Elemente auf 0 char w1[512]; memset(w1, 0, sizeof(w1)*sizeof(char)); char w2[512]; memset(w2, 0, sizeof(w2)*sizeof(char)); char o[8]; memset(o , 0, sizeof(o )*sizeof(char)); if (trenner != -1) { // Alles was links vom Trenner steht in W1 was rechts steht W2 Operator in o strncpy (w1, term, trenner); // w2 = term + trenner+1; my_strcpy( w2, term + trenner+1); o[0] = term[trenner]; } else { strncpy (w1, term, klammerauf); my_strcpy (w2, term + klammerauf); o[0] = '*'; } printf ("w1: %s \n", w1); printf("w2: %s \n",w2); printf("o: %s \n",o); //Wenn Außen Klammern werden diese zur weiteren Berechnung entfernt //(Klammern wenn: [0] != '(' und [letzte Position - 1] != ')' if (w1[0] == '(' && w1[strlen(w1)-2] == ')') { strncpy (w1, w1+1, w1[strlen(w1)-2]); //oder: std::memmove(w1, w1+1, w1[strlen(w1)-2]); w1[strlen(w1)-1] = 0; } else if(w2[0] == '(' && w2[strlen(w2)-2] == ')') { strncpy (w2, w2+1, w2[strlen(w2)-2]); //oder: std::memmove(w2, w2+1, w2[strlen(w2)-2]); w2[strlen(w2)-1] = 0; } //übergabe in a und b und des Funktionsaufrufs operation double a = berechne (w1); double b = berechne (w2); double erg = operation (a, b, o); return erg; } // strcopy ( dest, source ) char * my_strcpy(char* dest, const char * source) { int j = 0; for (int i = 0; source[i] != '\0' ;i++) { if(source[i] != ' ') { dest[j] = source[i]; if(source[i] == ',') { dest[j] = '.' ; } j++; } } dest[j] = '\0'; return dest; } // Meine_Wurzel char * my_sqrt(char* dest, const char * source) { int j = -1; for(int i=0; source[i] != '\0'; i++) { if(source[i] != '?') { dest[++j] = source[i]; } else { dest[++j] = '2'; dest[++j] = '?'; } } dest[j+1] = '\0'; return dest; }hier mal mein FAST fertiges Programm ... ist "anders" gelöst... wie man sieht (sollte so gemacht werden tut mir leid).
nebenbei vielleicht hat ja jemand eine Antw. darauf wenn jemand lust und langeweile hat sich den Quellcode so durchzugucken.
Problem: Das mein rintf("Ergebnis:%lf\n", berechne(term) ); auch bei fehlermeldung wenn zB. Buchstaben eingegeben worden sind eine Zahl zurückgibt. zb: abc2+2 dann kommt ne Fehlermeldung (wie gewollt) und am schluss trotzdem Ergebnis: 56.0000 oder so ?! total komisch... liegt daran dass er die Buchstaben trotzdem in meine Methode (operation) packt und dann daraus irgend eine komische Zahl wird.ansonsten viel spaß mit dem Code

Gruß
EDIT: Dami es einfacher ist einmal die ausführbare Datei zum Download... dann seht ihr erstmal was das Programm macht.
http://kwilkowski.de/SCHULE/Zeilenrechner.exe
gebt mal abs2+2 ein dann seht ihr die kleine unschönheit die noch raus soll/muss;)
-
Virokams schrieb:
ist "anders" gelöst... wie man sieht (sollte so gemacht werden tut mir leid).
was sollte dabei gemacht werden? dass du keine C++-Streams sonder C-Ausgabefunktionen verwendest? und const char* an Stelle von strings?
Oder solltest du allgemein C schreiben und bist einfach im falschen Forum gelandet? (das ist nämlich reiner C-Code und hat nichts von C++, wenn ich nicht irgendwo eine Winzigkeit übersehen hab...)
-
ööööhhhhh ^^ jah ... gute Frage...
Ehrlichgesagt kann ich es nicht beantworten weil ich dachte das das auch als C++ zählt. Klar... ich hätte die std:: nutzen können, sollte ich aber im ersten anlauf nicht... noch nicht... .Ich werde das Ding bestimmt auch nochmal mit strings und C++ syntaxgerecht lösen. :xmas1:
-
@pumuckl,
Wir haben es ihm schon mehrfach probiert beizubringen. Er will nicht hören. Er will auf C++ in C++ verzichten
Übrigens ist der Code noch schlimmer als C in C++, es hat nämlich auch noch ein goto drin

Grüssli
-
Dravere schrieb:
@pumuckl,
Wir haben es ihm schon mehrfach probiert beizubringen. Er will nicht hören. Er will auf C++ in C++ verzichten
Übrigens ist der Code noch schlimmer als C in C++, es hat nämlich auch noch ein goto drin

Grüssli
Hehehhee es ist ja nicht so das ich nicht WILL mehr das ich nicht DARF... jedenfals bei der Aufgabe -.-... wie gesagt es kommen bessere Zeiten auf uns zu XD dann können wir über Strings reden

ja und das GOTO... das gefällt mir an der Stelle ehrlichgesagt auch nicht... muss ich noch gucken geht bestimmt auch schöner aber solange es nur so ein kleines goto ist und es funktioniert ... 1 kann man verkraften oder? XD
seid mir nicht böse XD :xmas1: