I tried the suggested code, and it did work for the (--) double negative, i.e. 9 4--. But I still got a similar error for the single: 4 9- . Then I realized the 'Main' was already at EOF after the '/n' was input, so passing a '-' back up from getop was triggering the correct case, but then the program stopped without output and just waited for the next input (i.e. 'main' needs that '\n' to printf the output).
So I tried the following code (& added another printf in the '-' case) and it works, but it seems overly long/wordy. This was a basic level problem and I think my answer was not the one intended... is there something basic I am missing?
Code:
#include <stdio.h>
#include <stdlib.h>
#define MAXOP 100
#define NUMBER '0'
int getop(char []);
void push(double);
double pop(void);
void swap(double);
void clear(double);
main () { /*reverse-Polish-notation calculator*/
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 '*':
push(pop()*pop());
break;
case '-': {
op2=pop();
push(pop()-op2);
printf("\t%.8g\n",pop());
break; }
case '%':
op2=pop();
if (op2 != 0.0)
push((int)pop()%(int)op2);
else
printf("error: zero divisor\n");
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;
}
#define MAXVAL 100 /*maximum depth of val stack*/
int sp=0; /*next free stack position*/
double val[MAXVAL]; /*value stack*/
/*push:push f onto value stack*/
void push(double f)
{
if (sp<MAXVAL)
val[sp++]=f;
else
printf("error: stack full, can't push %g\n", f);
}
/*pop: pop and return top value from stack*/
double pop(void)
{
if (sp>0)
return val[--sp];
else {
printf("error: stack empty\n");
return 0.0;
}
}
#include <ctype.h>
int getch(void);
void ungetch(int);
/*getop: get next character or numeric operand*/
int getop(char s[])
{
int i,c;
while ((s[0]=c=getch())==' ' || c == '\t')
;
s[1]='\0';
i=0;
if(!isdigit(c)&&c!='.')
{
if (c=='-' && (isdigit(s[++i]=c=getch()))) /*have to use '2 3--' (double -) to get subtraction...*/
;
else if (c=='\n' && s[i-1]=='-')
return '-';
else
return c; /*not a number*/
}
if (isdigit(c)) /*collect integer part*/
while (isdigit(s[++i]=c=getch()));
;
if (c=='.') /*collect fraction part*/
while (isdigit(s[++i]=c=getch()));
;
s[i]='\0';
if (c!=EOF)
ungetch(c);
return NUMBER;
}
#define BUFSIZE 100
char buf[BUFSIZE]; /*buffer for ungetch*/
int bufp=0; /*next free position in buf*/
int getch(void) /*get a (possibly pushed-back) character */
{
return (bufp>0) ? buf[--bufp] : getchar();
}
void ungetch(int c)
{
if (bufp>=BUFSIZE)
printf("ungetch:too many characters\n");
else
buf[bufp++]=c;
}