[C] Problem mit einfachen Taschenrechner



  • test

    🕶



  • Sehe ich nicht doof aus? [img]magazin/bilder/autoren/artchi.jpg[/img]



  • cool schrieb:

    DAmico schrieb:

    Der Taschenrechner soll nur einstellige Zahlen(0-9) benutzen, nur Addition und Subtraktion beherrschen und Klammern unterstützen, die bei der Rechnung beachtet werden sollen, z.B.: (4+5)-(2) oder 3+6-4

    Klammern einfach ignorieren. Bei "nur" Addition und Subtraktion sind sie egal.
    🕶

    Was ist mit
    10-(5-2) == 10 - 5 - 2
    10-3 == 5 - 2
    7 == 3

    @DAmico: Ich weiß nicht, obs da gleich einen Parser rekursiven Abstiegs benötigt, aber du solltest dir das mal anschauen. (Ich weiß nur nicht, wie gut das im Inet erklärt ist)
    Das ist aber schon _relativ_ kompliziert, ich weiß nicht, ob du dir das zutraust.



  • DAmico schrieb:

    nur Addition und Subtraktion beherrschen und Klammern unterstützen, die bei der Rechnung beachtet werden sollen

    Wenn die Aufgabe von deinem Lehrer kommt, würde ich ihn wieder in die Grundschule schicken.

    Ansonsten:
    Wo genau scheitert's denn? Als Zeichenkette einlesen kann das Problem ja nicht sein.



  • um kurz dazwischen zu schreiben:

    wie kann man denn die zeichenkette einlesen und dann auch noch richtig berechnen?



  • leycos schrieb:

    um kurz dazwischen zu schreiben:

    wie kann man denn die zeichenkette einlesen und dann auch noch richtig berechnen?

    einlesen kannsu z.b. mit fgets. für die berechnung musst du die teile der zeichenkette in die richtigen bestandteile aufteilen, z.b. zahlenwerte mit strtod umwandeln, funktionsnamen erkennen usw. das ist nicht ganz so einfach, weil klammern berücksichtigt werden müssen, etc.



  • Funktionsnamen erkennen?

    DAmico schrieb:

    nur Addition und Subtraktion beherrschen und Klammern unterstützen, die bei der Rechnung beachtet werden sollen



  • #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <ctype.h>
    
    typedef struct
    {
    	char *str;
    	size_t pos;
    } ParseData;
    
    void initParser(ParseData *data, const char *str);
    void freeParser(ParseData *data);
    int parse(ParseData *data);
    int final(ParseData *data);
    void showError(const char *msg);
    
    int main()
    {
    	ParseData data;
    
    	initParser(&data, "5-5+1-9-(5+1+2-3)");
    
    	printf("Result: %i\n", parse(&data));
    
    	freeParser(&data);
    }
    
    void initParser(ParseData *data, const char *str)
    {
    	data->pos = 0;
    	data->str = strdup(str);
    }
    
    void freeParser(ParseData *data)
    {
    	free(data->str);
    }
    
    int parse(ParseData *data)
    {
    	int res = final(data);
    
    	while (data->str[data->pos] == '+' || data->str[data->pos] == '-')
    	{
    		switch (data->str[data->pos])
    		{
    			case '+':
    				++data->pos;
    				res += final(data);
    				break;
    
    			case '-':
    				++data->pos;
    				res -= final(data);
    				break;
    
    			default:
    				showError("unexpected character");
    				break;
    		}
    	}
    
    	return res;
    }
    
    int final(ParseData *data)
    {
    	int res;
    
    	if (isdigit(data->str[data->pos]))
    	{
    		res = data->str[data->pos] - '0';
    		++data->pos;
    	}
    	else if (data->str[data->pos] == '(')
    	{
    		++data->pos;
    
    		res = parse(data);
    
    		if (data->str[data->pos] != ')')
    		{
    			showError("missing ')'");
    		}
    
    		++data->pos;
    	}
    	else
    	{
    		showError("unexpected character");
    	}
    
    	return res;
    }
    
    void showError(const char *msg)
    {
    	fprintf(stderr, "Error: %s\n", msg);
    }
    

    Features:
    - Klammern
    - Addition
    - Subtraktion
    - Zahlen (bestehend aus nur einer Ziffer!)

    Keine Garantie auf Richtigkeit. Habs nur kurz getestet.



  • Hallo,

    vielen Dank für die Mühe - leider funktioniert dein Vorschlag bei mir aktuell gerade nicht.

    also ich möchte auf jeden Fall, dass das Programm Addition, Subtraktion, einstellige Zahlen und Klammern (mit höchster Priorität) beherrscht.
    Leerzeichen sollen/können ignoriert werden.

    ich bin leider mit "parser" nicht vertraut. kann man mein Problem auch mit strings/ funktionen lösen?

    danke!



  • leycos schrieb:

    Hallo,

    vielen Dank für die Mühe - leider funktioniert dein Vorschlag bei mir aktuell gerade nicht.

    Und was funktioniert daran nicht? Fehlermeldungen?


Anmelden zum Antworten