sqrt() und pow() könne nicht compiliert werden



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


  • Administrator

    @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


  • Administrator

    @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
    


    1. Wenn du innerhalb eines Blocks (zwischen { und }) eine Variable deklarierst, dann ist sie auch nur dort gültig.
    2. 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");
    

Anmelden zum Antworten