练习#5 C语言编程的第6章

时间:2016-01-12 07:05:27

标签: c

  

编写一个程序,作为一个简单的"打印"计算器。该程序应允许用户键入以下形式的表达式:数字运算符。程序应识别以下运算符:+, - ,*,/,S。E

     
      
  • S运算符告诉程序设置"累加器"输入数字。
  •   
  • E运算符告诉程序执行将结束。对累加器的内容执行算术运算,其中键入的数字用作第二个操作数。
  •   
     

以下是"样本运行"显示该计划应如何运作:

Begin Calculations
    10 S            Set Accumulator to 10 
    = 10.000000     Contents of Accumulator
    2 /             Divide by 2 
    = 5.000000      Contents of Accumulator
    55 -            Subtract 55 
    -50.000000
    100.25 S        Set Accumulator to 100.25 
    = 100.250000
    4 *             Multiply by 4 
    = 401.000000
    0 E             End of program 
    = 401.000000
End of Calculations.

这是我的代码

#include <stdio.h>

int main(void)
{
char op;
float acc = 0, num;

printf("Begin Calculations\n");
while (op != 'E') {
    scanf("%f %c", &num, &op);
    switch (op) {
        case '+':
            acc += num;
            printf("= %f\n", acc);
            break;
        case '-':
            acc -= num;
            printf("= %f\n", acc);
            break;
        case '*':
            acc *= num;
            printf("= %f\n", acc);
            break;
        case '/':
            if (num == 0) {
                printf("Division by zero\n");
            }
            else {
                acc /= num;
                printf("= %f\n", acc);
            }
            break;
        case 'S':
            acc = num;
            printf("= %f\n", acc);
            break;
        case 'E':
            printf("= %f\n", acc);
            break;
        default:
            printf("Unknown operator\n");
            break;
    }
}
printf("End of Calculations");
}

我的代码与问题输入完美配合。但是,当我输入以下内容(和输出)时(输入与问题相同但在&#34之间没有空格;数字&#34;和&#34;运算符&#34;):

Begin Calculations
    10S            
    = 10.000000    
    2/            
    = 5.000000      
    55-            
    -50.000000
    100.25S        
    = 100.250000
    4*            
    = 401.000000
    0E   

输入0E时程序停滞不前。我试图将scanf("%f %c", &num, &op);更改为scanf("%f%c", &num, &op);,但它似乎无法解决我的问题。你能在我的代码中指出问题吗?请给我一个详细的解释,因为我是C的相对新人。提前感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:2)

您正在读取浮点值。因此,如果scanf看到0E,它会等待更多的数字,因为它认为你正在输入指数,例如0E5(= 0 * 10 ^ 5)。这就是为什么你的程序在这一点上陷入困​​境的原因。我建议使用不同的字符来避免这种歧义。

另一方面,如果scanf看到0S,它将输出0.0作为浮点值,输出'S'作为字符,因为'S'永远不是浮点值的有效部分。