UPN Übung
-
Hallo Community
Ich wollte um meine Kenntnisse ein bisschen zu teste/erweitern einen einfachen UPN Rechner programmieren.
Das Prinzip hab ich verstanden und ist auch nicht wirklich schwer, nur treffe ich bei der Eingabe auf ein Hinderniss.Ich schreibe die eingelesenen Zahlen in ein Array und "stapel" sie übereinander.
Das alles will ich mit einem double stack umsetzen damit ich Zahlen mit bis zu 2 Stellen hinterm Komma verrechnen kann.
Ich habe aber das Problem die Rechenoperationen einzulesen.
Ich hab mich da irgendwie dran aufgehangen...
Wie lese ich mit scanf() z.B. ein + - * oder / ein, ohne zu wissen ob wirklich dieses Zeichen kommt oder doch wieder eine Zahl?Vielleicht könnt ihr mich ja vorran bringen
Tobi
-
Du liest einen String ein.
Diesen kannst du dann auswerten (die Zahlen z.B. mit strtod oder sscanf)
-
Oder liest Zeichenweise die Eingabe über einen FILE-Stream und hast ungetc, kannst also eine Ziffer zurückstecken und dann bequem scanfen.
-
Danke, so weit so gut
Hier bahnt sich das nächste an..int main(void) { int Stacktiefe,i=0,j,Konvertieren; char Einlesen[1]; double *Stack; printf("Stacktiefe eingeben(3-8):\n"); do //Speichertiefe Eingabekontrolle { scanf("%d", &Stacktiefe); }while(Stacktiefe<3 || Stacktiefe>8); Stack=(double*) calloc(Stacktiefe+1,sizeof(double)); //Dynamischen Speicher schaffen while(1) { printf("Beginnen Sie zu rechnen.\n"); scanf("%s",Einlesen); //String einlesen Konvertieren=(int)Einlesen[0]; if(Konvertieren==42||Konvertieren==43||Konvertieren==45||Konvertieren==46) //Bei Rechenoperationen { switch(Konvertieren) { case 42:Stack[i-1]=Stack[i-1]*Stack[i]; i--; break; case 43:Stack[i-1]=Stack[i-1]+Stack[i]; i--; break; case 45:Stack[i-1]=Stack[i-1]-Stack[i]; i--; break; case 47:Stack[i-1]=Stack[i-1]/Stack[i]; i--; break; } } else //Bei Zahlen { Stack[i]=atof(Einlesen[0]); i++; } for(j=0;j<=i;j++) printf("%.2f\n",Stack[j]); } return 0; }
Hier habe ich einen kleinen Testcode geschrieben, aber ich verstehe nicht wieso hierbei..
Stack[i]=atof(Einlesen[0]);
..folgender Fehler auftauch: Übergabe des Arguments 1 von »atof« erzeugt Zeiger von Ganzzahl ohne Typkonvertierung [standardmäßig aktiviert]
Wobei atof doch einen double-Wert ausgibt?
-
double atof(const char *nptr);
Du solltest besser '+', '-' ... anstattder zahlen verwenden
scanf("%s",Einlesen);
führt zu eine überlauf wenn der eingelesene string länger als 1 ist
lass den cast vor calloc weg und den int cast (char->int)
-
ahh hab den fehler danke
-
Oki tut mir leid wenn ich ein wenig nerve ich bin an einen weiteren Fehler gelangt. Ich verstehe ihn aber nicht.
Es werden Zahlen in mein Stack geschrieben und sobald 2 Zahlen drin sind kann ich eine Rechenoperation eingeben.
+ - * funktioniert einwandfrei.
Nur / nicht.
Hier mal der Code des Switch-Case Zweigs:case 47: //Ascii / Stack[i-2]/=Stack[i-1]; i--; break;
Anstatt die beiden Zahlen zu verrechnen und an die Stelle der ersten Zahl das Ergebnis zu setzen, legt er eine 0.00 oben auf den Stack. Für mich unverständlich!
-
Das kann ja schon gar nicht stimmen mit deinem Mischmasch aus magischen Zahlen. Mal hast du 46, mal 47. Das heißt, die 47 kann gar nicht stattfinden. Schreib doch einfach
'/'
. Das ist sicher gegenüber dieser Art von Fehlern (und noch gegen ein paar andere, die du noch gar nicht entdeckt hast), ohne Nachteile. Ebenso bei all den anderen ASCII-Werten. Außerdem könnte dein Programm etwas Rückmeldung geben, wenn eine Aktion ungültig ist, dann hättest du schon eine Spur gehabt. Mit einem Debugger hättest du den Fehler auch sofort gefunden. Falls du nicht mit einem Debugger umgehen kannst: Jetzt ist ein guter Zeitpunkt es zu lernen. Der Debugger zählt als eines der wichtigsten Werkzeuge des Programmierers.P.S.: atoi hat dir hier im Thread niemand empfohlen. Daher kommt die Null. Nimm doch strtod oder sscanf und prüf die Rückgabewerte! Dann hattest du ebenfalls den Fehler sofort entdeckt.