Rechner will nicht so richtig
-
int main(void) { char in; setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); while( 1 ) { printf("Bitte geben Sie ein: "); fflush(stdin); in = fgetc(stdin); if( in >= 48 && in <= 57 ) push(in); else calc(in); } return 0; } void calc(char c) { int sum = 0; switch( c ) { case 42: // '*' push(sum = pop() * pop()); break; case 43: // '+' push(sum = pop() + pop()); break; case 45: // '-' push(sum = pop() - pop()); break; case 47: // '/' push(sum = pop() / pop()); } printf("Ergebnis = %d\n", sum); } char stack[200]; int pos = -1; char pop() { char ret_val = stack[pos]; stack[pos--] = 0; return ret_val; } void push(char s){ stack[++pos] = s; } int size(){ if(pos == -1){ return 0; }else{ return (pos+1); } } int getPos(){ return pos; }
-
FrEEzE2046 schrieb:
printf("Bitte geben Sie ein: "); fflush(stdin); in = fgetc(stdin);
Hmmm. Schon wieder eine Wolfroutine.
-
#include <stdio.h> #define STACK_LIMIT (1000) typedef struct { char data[STACK_LIMIT]; int stackPtr; } Stack; void stackInit(Stack *stack) { stack->stackPtr = 0; } void stackPush(Stack *stack, int val) { ++(stack->stackPtr); stack->data[stack->stackPtr] = val; } int stackPop(Stack *stack) { int val = stack->data[stack->stackPtr]; --(stack->stackPtr); return val; } void stackPushOp(Stack *stack, char op) { int right = stackPop(stack); int left = stackPop(stack); int res; switch (op) { case '+': res = left + right; break; case '-': res = left - right; break; case '*': res = left * right; break; case '/': res = left / right; break; } stackPush(stack, res); } void stackPrint(Stack *stack) { int i; printf("--- Stack ---\n"); for (i = 0; i < stack->stackPtr; ++i) { printf("%i\t%i\n", i, stack->data[i]); } printf("\n"); } #define STACK_ADD(x) stackPushOp(x, '+') #define STACK_SUB(x) stackPushOp(x, '-') #define STACK_MUL(x) stackPushOp(x, '*') #define STACK_DIV(x) stackPushOp(x, '/') int main() { Stack stack; stackInit(&stack); stackPush(&stack, 3); stackPush(&stack, 4); stackPush(&stack, 5); stackPrint(&stack); STACK_ADD(&stack); stackPrint(&stack); }
Komme allerdings aus dem C++ Bereich und programmiere normalerweise nicht in C. War mal ein Test, ob ich das auch kann
-
anstatt
case 42: // '*'
kann man auch gleich schreiben
case '*':
Und von wegen Funktionsdeklarationen
du glänzt auch nicht durch Profiwissen also musst du nicht andere runtermachen.
-
Hab ein Fehler drinne. So ists richtig:
void stackInit(Stack *stack) { stack->stackPtr = -1; }
und
void stackPrint(Stack *stack) { int i; printf("--- Stack ---\n"); for (i = 0; i <= stack->stackPtr + 1; ++i) { printf("%i\t%i\n", i, stack->data[i]); } printf("\n"); }
-
xcvsdfsdf schrieb:
Hab ein Fehler drinne. So ists richtig:
void stackInit(Stack *stack) { stack->stackPtr = -1; }
und
void stackPrint(Stack *stack) { int i; printf("--- Stack ---\n"); for (i = 0; i <= stack->stackPtr + 1; ++i) // Das + 1 weg. { printf("%i\t%i\n", i, stack->data[i]); } printf("\n"); }
Argh. Das +1 muss noch weg. Ich hasse meine Tastatur. Die klemmt immer und hab noch altes Zeugs in der Zwischenablage, sorry.
-
player4245 schrieb:
anstatt
case 42: // '*'
kann man auch gleich schreiben
case '*':
Und von wegen Funktionsdeklarationen
du glänzt auch nicht durch Profiwissen also musst du nicht andere runtermachen.
1. Wenn dann kann man gleich 42 schreiben, weil das '*' ist.
2. Sind das nicht meine Funktionen, ist schon klar oder? Ich hab einfach die vorhandenen Routinen etwas zurecht gestutzt, mehr nicht.
-
FrEEzE2046 schrieb:
player4245 schrieb:
anstatt
case 42: // '*'
kann man auch gleich schreiben
case '*':
Und von wegen Funktionsdeklarationen
du glänzt auch nicht durch Profiwissen also musst du nicht andere runtermachen.
1. Wenn dann kann man gleich 42 schreiben, weil das '*' ist.
2. Sind das nicht meine Funktionen, ist schon klar oder? Ich hab einfach die vorhandenen Routinen etwas zurecht gestutzt, mehr nicht.1. Das macht aber niemand, der produktiven und gut wartbaren Code schreiben will, da Code für sich selber sprechen soll.
Das heißt auch, dass man "Magic Numbers" vermeiden soll. Und ob mit 42 jetzt die Antwort "nach dem Leben, dem Universum und dem ganzen Rest" gemeint ist oder ein ASCII-Zeichen, weiß nach einigen Monaten auch niemand mehr.
Und wenn man dann jedes Mal in einer ASCII-Tabelle nachgucken muss, dann dauert das Verstehen des Codes unnötig länger. Alles nur, weil man "cool" sein wollte und nicht das verständlichere '*' schreiben wollte.
-
Ich danke euch erstmal allen, eine eigene Lösung schreibe ich mir jetzt.
-
DFu hast den Aspekt der Protierbarkeit vergessen. Auf Maschinen mit anderem Zeichensatz könnte die 42 was ganz anderes als ein Stern sein. Von daher: nein es ist nicht egal was man schreibt.