berechnung einer string-aufgabe (typumwandlung: string --> double)



  • hallo,

    also ich habe folgendes problem (und bin noch anfänger): der benutzer gibt eine rechnug in folgender form als string ein: 3+5/2-6*4 auf punkt vor strichrechnung muss dabei nicht geachtet werden. so, ja das soll nun halt ausgerechnet werden... 😕

    habe also folgende for-schleife mir überlegt:
    ausdruck ist dabei die eingegebene rechnung.

    double rechnen(string ausdruck){
    
    	string strZahl;
    	string zeichen;
    	int i;
    	char op;
    	double erg=0;
    
    	for(i=0; i<ausdruck.length(); i++){
    
    		if(ausdruck[i]==' ')
    			continue;
    		if(ausdruck[i]=='.' || isdigit(ausdruck[i])){
    			strZahl=ausdruck[i]; }
    
    		zeichen=ausdruck[i];
    		op=ausdruck[i];
    
    		switch(op){
    
    			case '+': erg+=atof(strZahl.c_str());break;
    			case '-': erg+=atof(strZahl.c_str());break;
    			case '*': erg+=atof(strZahl.c_str());break;
    			case '/': erg+=atof(strZahl.c_str());break; }
    
    		erg+=atof(strZahl.c_str());
    
    		for(int m=0; m<strZahl.length(); m++){
    			strZahl[m] = '\0'; } }
    
    	return erg;
    
    }
    

    mein problem ist nun wie ich die rechen operatoren behandeln muss dass er auch minus oder plus usw. rechnet? also + funktioniert ja logischer weise aber der rest... 😮

    schon einmal vielen dank,
    raphael



  • Versuch' mal, dort statt des "erg+=..." die richtigen Operatoren (-=, *= bzw. /=) einzusetzen.

    PS: Ansonsten solltest du auch überlegen, ob dein Programm richtig mit mehrstelligen Zahlen umgeht.



  • ne geht leider nicht... das problem das ich habe ist die umwandlung von char in int, ohne dabei den ascii code zu erhalten sondern quasi den operator an sich. gibt es da irgendeine lösung?

    scarvy



  • Du mußt deinen Ausdruck richtig parsen - wenn in "ausdruck[i]" der Operator steht, beginnt der nächste Operand bei "ausdruck[i+1]" und geht soweit, wie die Zeichen als Zahl interpretiert werden können.

    In deiner switch()-Anweisung steht in strZahl die letzte Ziffer, die du vor dem Operator eingelesen hast.



  • wie würdest du denn z.b. case '-' schreiben oder ist der gesamte ansatz vieleicht nicht richtig? mein problem ist halt dass ich genau weiss wie ich mit den rechen-operatoren umgehen muss... 🙄

    scarvy



  • Ich würde mal sagen, dein Ansatz ist total falsch:

    float erg=0;
    for(i=-1;i<ausdruck.length)
    {
      char op=(i>=0)?ausdruck[i]:'+';     //Operand
      string strVal=ausdruck.sustr(i+1);  //Operator
      float val=atof(strVal.c_str());
      switch(op)
      {
      case '+':erg+=val;break;
      case '-':erg-=val;break;
      ...
      }
    }
    


  • ok danke... werde es mal ausprobieren (erst nochmal angucken und verstehen 😉

    schon eimnal vielen dank
    scarvy


Anmelden zum Antworten