postfix lommeregner
jeg er ved at lave en lomme regner som kan regne et helt regne stykke på en gang ved at lave det om fra infix til postfix og bagefter evaluere det.jeg er ved at lave evalueringsdelen men er løbet ind i en fejl som jeg ikke kan få løst, så her kommer scriptet:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAX 100
/* variabler */
char input[MAX];
char typestack[MAX];
char *i, *o;
int valuestack[MAX];
int *v;
char output[MAX];
int top;
int vtop;
int number;
int left;
int right;
int count;
int calc;
/* funktioner */
void postfix(void);
int priority(char);
char popfromstack(void);
void pushonstack(char);
void calculate(void);
int main () {
printf("skriv et regnestykke\n");
fgets(input, sizeof(input), stdin);
strcpy(typestack, "");
i = input;
o = output;
top = -1;
vtop = -1;
number = 0;
postfix();
return 0;
}
void postfix(void)
{
char opr;
while(*i)
{
if(isdigit(*i)) {
vtop++;
valuestack[vtop] = *i - '0';
number +=1;
}
else if (*i == '+' || *i == '-' || *i == '/' || *i == '*' || *i == '%' || *i == '^' || *i == '(' || *i == ')') {
if(number != 0) {
*o = number;
o++;
number = 0;
}
if (top != -1) {
opr = popfromstack();
while (priority(opr) >= priority(*i)) {
*o = opr;
o++;
opr = popfromstack();
}
pushonstack(opr);
pushonstack(*i);
}
else {
pushonstack(*i);
}
}
i++;
}
if(number != 0) {
*o = number;
o++;
number = 0;
}
while ( top != -1 )
{
opr = typestack[top];
top--;
*o = opr;
o++ ;
}
printf("OUTPUT: %s ", output);
calculate();
}
int priority(char c) {
if (c == '^') return 3;
if (c == '*' || c == '/' || c =='%') return 2;
if (c == '+' || c == '-') return 1;
else return 0;
}
char popfromstack(void) {
if(top == -1)
return -1 ;
else {
char item = typestack[top] ;
top-- ;
return item ;
}
}
void pushonstack(char c) {
top++ ;
typestack[top] = c ;
}
void calculate(void) {
int number;
o = output;
v = valuestack;
left = 0;
right = 0;
strcpy(typestack, "");
while (*o) {
if (*o < 10 && *o > 0) {
number = *o;
printf("number: %d", number);
count = 0;
if (right != 0) {
while(count < number) {
left *= 10;
left += *v;
v++;
count+=1;
}
}
else {
while(count < number) {
right *= 10;
right += *v;
v++;
count+=1;
}
}
printf("left: %d right: %d", left, right);
}
if (*o == '+' || *o == '-' || *o == '/' || *o == '*' || *o == '%' || *o == '^') {
switch (*o) {
case '+':
calc = left + right;
vtop++;
valuestack[vtop] = calc;
printf("calc: %d", calc);
left = 0;
right = 0;
break;
case '-':
calc = left - right;
vtop++;
valuestack[vtop] = calc;
printf("calc: %d", calc);
left = 0;
right = 0;
break;
case '*':
calc = left * right;
vtop++;
valuestack[vtop] = calc;
printf("calc: %d", calc);
printf("valuestack: %d %d %d %d %d", valuestack[0], valuestack[1], valuestack[2], valuestack[3], valuestack[4]);
left = 0;
right = 0;
break;
case '/':
calc = left / right;
vtop++;
valuestack[vtop] = calc;
printf("calc: %d", calc);
left = 0;
right = 0;
break;
}
}
o++;
}
}
jeg har testet den med regnestykket 3*4-2 som giver 34*2- i postfix form... det skulle jo gerne give 10 men den laver en fejl til sidst når den minus'er