Brak wyników - Kalkulator C

Brak wyników - Kalkulator C
Ryeore
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0

Witam,
stworzyłem taki kalkulator na podstawie jednej książki.
Problem jest taki, że nie wyświetla prawidłowych wyników(w zasadzie nie wyświetla nic normalnego)

Kopiuj
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define MAXOP 100
#define NUMBER 0
#define MAXVAL 100
#define BUFSIZE 100

int sp=0;
double val[MAXVAL];
int getop(char[]);
void push(double);
double pop(void);
int getchar(void);
void ungetch(int);
char buf[BUFSIZE];
int bufp=0;

void push(double f)
{
    if(sp<MAXVAL)
        val[sp++]=f;
    else
        printf("error: stack full, can't push %g\n",f);
}
/////////////////////////////
double pop(void)
{
    if(sp>0)
        return val[--sp];
    else
    {
        printf("error: stack empty \n");
        return 0.0;
    }
}
////////////////////////
int getop(char s[])
{
    int i,c;
    while((s[0]=c=getch())==' ' || c=='\t');
    s[1]='\0';
    if(!isdigit(c) && c!='.')
        return c;   //not a number
    i=0;
    if(isdigit(c))
        while(isdigit(s[++i]=c=getch()));
    if(c=='.')
        while(isdigit(s[++i]=c=getch()));
    s[i]='\0';
    if(c!=EOF)
        ungetch(c);
    return NUMBER;
}
/////////////////////////
int getch(void)
{
    return(bufp>0) ? buf[--bufp] : getchar();
}

void ungetch(int c)
{
    if(bufp>=BUFSIZE)
        printf("ungetch: too many characters\n");
    else
        buf[bufp++]=c;
}

main()
{
    int type;
    double op2;
    char s[MAXOP];

while((type=getop(s))!=EOF)
{
    switch(type)
{
case NUMBER:
    push(atof(s));
    break;
case '+':
    push(pop()*pop());
    break;
case '*':
    op2=pop();
    push(pop()-op2);
    break;
case '/':
    op2=pop();
    if(op2!=0.0)
        push(pop()/op2);
    else
        printf("error : zero divisor\n");
    break;
case '\n':
    printf("\t%.8g\n", pop());
    break;
default:
    printf("error: unknown command %s\n", s);
    break;

    }
}
return 0;
}
 
DR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1135
0

@Ryeore stworzyłeś, czy skopiowałeś? Użyj jakiegokolwiek debuggera i od razu zobaczysz co się dzieje nie tak

xfin
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Genewa
  • Postów: 597
1

@Ryeore
W sumie to jest kalkulator oparty na działaniach na stosie (pop, push, sp++), tylko napisany bardzo źle. Ot chociażby na moje oko błędy w switchu (chyba, że to ma tak być a ja czegoś nie wiem). BO znak + mnoży, a * odejmuje.

Kopiuj
case '+':
    push(pop()*pop());
    break;
case '*':
    op2=pop();
    push(pop()-op2);

Poza tym wyniki są wyświetlane, tylko trzeba to podawać w formie liczba1 liczba2 operacja.

Nomysz
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 60
1

@Ryeore proponuje, abyś zainteresował się : https://en.wikipedia.org/wiki/Reverse_Polish_notation

kaczus
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Łódź
  • Postów: 1404
0

Nie wyświetla wyniku, bo wyswietla tylko informacje, gdy mu sie coś nie zgadza.

Ryeore
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0

Dzięki za pomoc, problem rozwiązany

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.