Taschenrechner programmieren?! Komme nicht weiter!!!

Grüßt euch leute,
ich sollte in der übung ein taschenrechner programmieren!
also die aufgabe war, das man die ganze rechen aufgabe schreibt, und das program rechnet es halt dann aus.
die aufgabe kann man so schreiben wie man möchte, also zwischen den zahlen können auch buchstaben sein, das program filtert nur die zahlen und das operanten aus!


Ich habe es mir so überlegt das ich die einzelnen zahlen und operanten mit ne scheife rauspicke!!
das rauspicken hat geklappt nur jetzt weiß ich nicht wie ich mit den zahlen rechnen könnte.

::::hier ist der code::::

Code:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
	
	char aufgabe[100];
	char zeichen[100];
	int i,z;
	int ziffer[100];
	i=0;
	z=0;

	//rechenaufgabe einscannen
	printf("\n\t\tTaschenrechner! \n\n");
	printf("\tbitte rechenaufgabe eingeben: ");  gets(aufgabe); 
	
	
	
	
	//zahlen werden entsprechenden zugewiesen
	while(aufgabe[i] != '\0')
	{
		if(aufgabe[i] < 48 || aufgabe[i] > 57)
		{
			printf("");
			i++;
		}
		else
		{
			ziffer[i] = aufgabe[i];
			i++;
		}
		
		if(aufgabe[i]==42 || aufgabe[i]==43 || aufgabe[i]==45 || aufgabe[i]==47)
		{
			zeichen[z]=aufgabe[i];
			i++;
		}
		
	}

	//... ab hier komm ich nicht weiter


	printf("\n");
	return EXIT_SUCCESS;		
}

würde mich freuen wenn ihr mir weiterhelfen würdet.

Gruß
 
Ich würde den eingelesenen String splitten mit z.B. strtok(). Also Tokens auslesen die operatorgetrennt sind. z.B 3+4. Operator ist hier +. Dann bleibt 3 und 4 über. Diese Tokens kannst du anschließend mit atof() zu double casten.
 
So wie du das gemacht hast bekommst du nur einstellige Zahlen, ich weiß nicht ob du das so möchtest. Außerdem musst du bedenken, dass du von den Werten der Zahlen jeweils 48 oder '0' abziehen musst, sonst sind die Zahlen um 48 größer als der Anwender eingegeben hat. ( Wobei '0' schöner ist, weil man im Quellcode leichter nachvollziehen kann was du damit bezweckst)
 
@mauralix
könntest du mir vieleicht ein kleines beispielcode zeigen

@vv4yn3
ja es muss auch drei stellen rechnen können.
Genau da ist mein problem, gibt es nicht irgendwie eine funktion z.b die 2 variablen zur einer varibale miteinander verbindet????
 
Ich helfe ja immer gern :-)
So kannst du die Tokens in Zahlen konvertieren.
Code:
   char str[100]={"12+4*3+1/5+100%2"};
    char *op={"+-/*%"};
    char *tok;
    double number;
    
    tok = strtok(str,op);
    
    while(tok){
        number = atof(tok);
        printf("token=%f\n",number);
        tok = strtok(NULL,op); /* Jetzt mit NULL aufrufen !!! */
    }
 
Du kannst es eigentlich ganz einfach selbst lösen.

Wenn wir zum beispiel den String

"343+465" hernehmen und jetzt die beiden Zahlen auslesen wollen, müssen wir einmal an der ersten Stelle beginnen. Wenn mehrere Ziffern hintereinander stehen, dann ist das eine Zahl, wenn wir eine Ziffer finden müssen wir also einfach prüfen, ob die nächste Stelle ebenfalls eine Ziffer ist.

Wir nehmen eine Integer Variable, der wir, wenn wir die erste Ziffer einer Zahl finden den Wert dieser Ziffer zuweisen.
Wenn das nächste Zeichen keine Ziffer ist, dann rechnen wir mit dieser Variable.
Andernfalls multiplizieren wir die Variable mit 10, dadurch rückt die Ziffer eine Stelle weiter, bei unserem Beispiel hätten wir also zuerst den Wert 3, das nächste Zeichen ist eine Ziffer also multiplizieren wir mit 10, dann haben wir 30, nun addieren wir die nächste Ziffer dazu, das ergibt 34, das nächste Zeichen ist wieder eine Ziffer, also machen wir das ganze nochmal und erhalten 343 danach kommt keine Ziffer also verwenden wir die Variable für die Berechnung.

Die nächste Zahl können wir auf die gleiche Weise lesen.

Und mit dieser Methode können die Zahlen beliebig lang sein.
 
Oder du merkst dir einfach die Anfangs- und End-Position im String, die eine Zahl eingrenzen (bei "343+465" die Positionen 0,2 und 4,6) und parst dann die Sub-Strings.
Um zu schauen, ob ein Character eine Zahl ist, kann man z.b. schauen, ob der ASCII-Wert im richtigen Bereich ist.
 
Ich hab doch schon gezeigt wie es geht. Das kostet normalerweise mindestens ein Bier, wenn ich das ausserhalb meiner Arbeitszeit mache ;)
 
ma son blöder tipp von einem blöden batcher: lern batch

dauert mit dem richtigen tut 1-2 tage bis des drauf hast un mit batch is das ganze voll einfach.
 
leutz danke für die tipps!!!!

@mauralix
thx für den code

@vv4yn3
8o 8o 8o 8o
bor, darauf wäre ich niemals gekommen!! das war ne große hilfe. danke danke!!

aber ich habe sie als char deklariert, weil ich sonst nicht an den operanten komme.
wenn ich sie als integer deklarieren würde, würde ich doch probleme bekommen. Wie könnte ich das eigentlich lösen???

aber ich versuchs mal zu proggen könnten jederzeit weiter fragen auftauchen
 
Ich frag mich nur, warum vv4yn3 das parsen selbst machen will, da bietet doch jede Standard-Lib was an (in Java z.b. Integer.parseInt(String s))?

Damit erfindet ihr gerade das Rad neu, und auch eher ungeschickt: was passiert, wenn deine Zahl zu groß und überläuft? Da muss man sich um die Grenzen kümmern usw.
Außerdem kann es evtl. mal erwünscht sein, die eingelesene Zahl als base2 oder base16 oder sowas zu interpretieren, somit multipliziert man nimmer mit 10, sondern eben mit 2 oder 16 usw. --> das muss parametrisiert werden.

All das nimmt einem jeder Standard-Parser ab.
 
Ich sagte nicht umsonst *Standard*-Lib. Ich habe jetzt keine Ahnung von dieser Sprache, aber Google spuckt mir auf die schneller sowas aus:

System::Int32::Parse(System::String);

Vielleicht wird damit klar, was ich meine.
 
@ fecub: kein Problem. Eine char Variable ist ja eigentlich auch nur eine Zahl, der Wert gibt halt an welches Zeichen dargestellt wird. Wenn du einer int Variable nun den Wert einer char Variable zuweißt, dann steht in der int Variable die Zahl die in der char Variable steht. Die Ziffern 0 bis 9 haben die Werte 48 bis 57.
Wenn wir einer char Variable c "0" zuweisen und dann die int Variable i nehmen und

"i = c;"
"cout << i;"

schreiben, dann bekämen wir die Ausgabe "48".
Deshalb musst du von der int Variable 48 oder '0' abziehen.

"i = c;"
"i = i - '0';"
"cout << i;"

würde in diesem Fall "0" ausgeben.

@terrorbyte: Bei einer Übung geht es ja darum was zu lernen, nicht sich die Arbeit abnehmen zu lassen, in diesem Fall hat fecub auf jedenfall etwas über char Variablen gelernt und dass kann dann bei einer anderen Aufgabe dazu führen, dass er schneller eine Lösung findet, wobei ich dir grundsätzlich rechtgeben muss, dass meine Lösung so sicher nicht mit denen aus der Lib mithalten kann.
 
Bei einer Übung geht es ja darum was zu lernen, nicht sich die Arbeit abnehmen zu lassen

Das widerspricht sich in meinen Augen nicht, man sollte auch lernen, nicht das Rad neu zu erfinden (außer, es ist wirklich nötig). Aber ja, sicher ist es nicht uninteressant, sich mal selbst die Arbeit zu machen & zu sehen, wie sowas dann wirklich funktioniert.
Da geh ich jetzt aber gleich noch nen Schritt weiter und sage: Schau dir doch mal an, wie System::Int32::Parse(System::String) implementiert ist!
 
XDDDDDDDDD

Code:
@echo off
:loop
echo Willkommen zu meinem Taschenrechner!
echo geben sie einen mathematischen Term ein
echo +=+, -=-, x=*, :=/
echo auch Klammern sind erlaubt, den Term bitte ohne "=" am Ende eingeben
set /a /p AE=
echo Ergebnis: %AE%
pause
goto loop

wer ne bessere Idee hat............................................
.........................................................................
..................................soll sie für sich behalten! :P :P :P
 
@LionC: Was sollen die Beiträge?
1. Funktioniert der Rechner nicht
2. Gehts hier nicht darum mit Batch herum zu pfuschen
3. Überdenke mal deine Schreibweise.

Ich will dich nicht persönlich angreifen, auch will ich hier nicht den Boarsheriff spielen. Aber Beiträge die z.B nur aus Smilies bestehen, findet man sonst nur in Kinderforen. Mir ist das Board schon zu sehr ans Herz gewachsen, deswegen kann ich es nicht mehr lange mitanschauen, wie es vollgespammt wird mit nutzlosen Beiträgen.
 
@Topic:
irgendwie ist es etwas widersprüchlich: einerseits soll das ja zum Lernen sein und daher eigene Ziffer_Einlese_verfahren implementieren (atoi/atof sind bei mir in der stdlibg ;) )
#include <stdlib.h>
int atoi(const char *nptr);
Ist auch ganzwitzig, das mal umzusetzen, allerdings hört der Spass auf,wenn man sich wirklich eine Fließkommazahl basteln möchte (ganz ohne Libs, FPU only ;) ).

Ein Taschenrecher, der Infixausdrücke akzeptiert, spielt allerdings irgendwie in einer anderen Lernklasse. Da sind solche Sachen wie Zahlenparsing oder Stringzerlegung eher nebensächlich.
Ansonsten sollte sowas für "Taschenrechnerprogrammierung" nicht uninteressant sein:
http://www.cz.j.th.schule.de/html_inc/schule/lehrer/privat/mirko_koenig/postfix/postfix.htm

@LionC: ließ Dir bitte nochmal das Thema durch und was für den Fragesteller wichtig ist - nämlich ein Lerneffekt und keine fertige Lösung, bei dem der CMD Interpreter das ganze unsichtbar im Hintergrund erledigt.

@mauralix: Ruhe bewahren.Wird schon wieder ;)
 
Zurück
Oben