Avatar billede menthos Nybegynder
01. maj 2007 - 21:58 Der er 1 kommentar og
1 løsning

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
Avatar billede menthos Nybegynder
02. maj 2007 - 20:47 #1
ingen der kan hjælpe?
Avatar billede menthos Nybegynder
14. maj 2007 - 13:35 #2
tak for hjælpen? eller?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester