练习 4-3
在有了基本框架后,对计算器程序进行扩充就比较简单了。在该程序中加入
取模(%)运算符,并注意考虑负数的情况。
然而书上那个代码并不能用,
可能是因为我是windows系统的原因
windows的控制台敲回车才能输入,但回车自带换行
所以我改了一下代码
主要改的是 main 函数 和 getop函数
我在处理取模运算时,要判断两个数是否都为整形,所以加了一个变量
main()
{
int type;
double op2, op3;
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);
break;
case '/':
op2 = pop();
if (op2 != 0.0)
push(pop() / op2);
else
printf("error: zero divisor\n");
break;
case '%':
op2 = pop();
op3 = pop();
if (op2 != (int)op2 || op3 != (int)op3) //要保证取模的两个数都是整数
printf("error: Only integers can get the modulus\n");
else if (op2 == 0)
printf("error: zero divisor\n");
else if (op2 < 0)
push(0);
else
push((int)op3 % (int)op2);
break;
case '=': //等于号用来取出栈中最上面的值
printf("\t%.8g\n", pop());
break;
case '.':
printf("error: There's no number in front of the decimal point");
break;
case ' ' : //空白字符不处理
case '\n':
case '\t':
break;
default:
printf(