sqrt() und pow() könne nicht compiliert werden
-
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:
-
Virokams schrieb:
...aber solange es nur so ein kleines goto ist und es funktioniert ... 1 kann man verkraften oder? XD
Dies ist aber ein schöner roter Knopf, den zu drücken wird ja nicht so schlimm sein, hauptsache er funktioniert...
-
Virokams schrieb:
Hehehhee es ist ja nicht so das ich nicht WILL mehr das ich nicht DARF...
wechsel den Prof/das Buch/das Tutorial. Der Weg über C nach C++ war in den 90ern vielleicht in, ist aber absoluter Blödsinn, auch wenn es immernoch Bücher und Tutorials gibt, die diesen Ansatz verfolgen. Das ist die Methode ausm letzten Jahrhundert...
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
Nein. Ein kleines Goto ist eine große Hässlichkeit (Fehlerquelle, unübersichtlich, schwer zu warten, Spaghetticode,...) Und sobald man eine Unschönheit toleriert (noch dazu eine so große), lässt die zweite nicht lang auf sich warten. Solche kleinen Schandflecke sollte man beheben sobald man drüber stolpert...
-
asc schrieb:
Virokams schrieb:
...aber solange es nur so ein kleines goto ist und es funktioniert ... 1 kann man verkraften oder? XD
Dies ist aber ein schöner roter Knopf, den zu drücken wird ja nicht so schlimm sein, hauptsache er funktioniert...
So siehts aus

und ihr habt alle recht.
Ich weiß das doch
-
@Virokams,
Wieso darfst du nun aber nicht? Das würde mich echt mal wundernehmen. Du hast schon immer gesagt, wegen der Aufgabe. Welcher Aufgabe?Grüssli
-
ich hab ein neues problem, wollte aber keinen neuen thread aufmachen:
Ich bin mit meinem buch jetzt bei der stelle sting class, da dachte ich versuch doch einfach mal ein passwort in den taschenrechner zu programmieren^^. Dachte das wäre ein leichtes Unterfangen, aber hab mich wohl geirrt:#include <iostream> #include <cmath> #include <string> using namespace std; int main() { do { string pw; cout<<"Bitte Passwort eingeben: "<<endl; cout<<endl; cin >> pw; }while (pw != '123');Wieso zum Henker funktioniert das nicht? Ich hab ein string pw, das das Passwort abfragt, gemacht und die schleife fragt solange nach dem passwort bis man 123 schreibt. Aber aus der Fehlermeldung des compiler werde ich nicht schlau:
1>c:\...\visual studio 2008\projects\taschenrechner 2\taschenrechner 2\taschenrechner 2.cpp(19) : error C2065: 'pw': nichtdeklarierter Bezeichner 1>c:\...\visual studio 2008\projects\taschenrechner 2\taschenrechner 2\taschenrechner 2.cpp(19) : error C2015: Zu viele Zeichen in der Konstante
-
- Wenn du innerhalb eines Blocks (zwischen { und }) eine Variable deklarierst, dann ist sie auch nur dort gültig.
- Für Strings benutzt man die "-Zeichen. ' wird für "einzelne Buchstaben" verwendet.
Grüße,
Michael
-
vielen dank jetzt klappt es:
#include <iostream> #include <cmath> #include <string> using namespace std; int main() { string pw; do { cout<<"Bitte Passwort eingeben: "<<endl; cout<<endl; cin >> pw; cout << endl; }while (pw != "123");