2020.5.11 发表于 2020-5-29 15:17:06

S1E12求助:计算器的问题

#include <stdio.h>

int main()
{
      float a, b;
      char ch;
      
      printf("请输入式子:");
      scanf("%f%c%f", &a, &ch, &b);
      
      if (b == 0 && ch == '/')
      {
                printf("很遗憾,除数不能为零!");
      }
      else
      
      switch (ch)
      {
                case '+':printf("结果是:%.2f",a + b);break;
                case '-':printf("结果是:%.2f",a - b);break;
                case '*':printf("结果是:%.2f",a * b);break;
                case '/':printf("结果是:%.2f",a / b);break;
      }
      
      return 0;
}上面是自己写的计算器
下面是小甲鱼的计算器
#include <stdio.h>
#include <stdbool.h>

int main()
{
      float op1, op2;
      char ch;
      float result;
      bool invalid = false;

      printf("请输入式子:");
      scanf("%f %c %f", &op1, &ch, &op2);

      switch (ch)
      {
                case '-': op2 = -op2; // no break
                case '+': result = op1 + op2; break;
                case '*': result = op1 * op2; break;
                case '/':
                        if (op2 != 0)
                        {
                              result = op1 / op2;
                              break;
                        }
                        else
                        {
                              invalid = true;
                              break;
                        }
      }

      if (invalid)
      {
                printf("除数不能为零!\n");
      }
      else
      {
                printf("结果是:%.2f\n", result);
      }

      return 0;
}问题1 : 请问我这种写法有什么弊端(小甲鱼写的,有没学过的,看不太明白)
问题2:1 / 8 = 0.13除法运算输出结果为什么会四舍五入。不是应该直接丢弃两位以后的小数吗,是不是设置问题?(用小甲鱼的代码也是0.13,而课后作业的结果是0.12)
问题3:试着输入错误的式子,看看会出现什么样的结果,打印出的结果不理解。
         加法:2 ++ 4 =6.00   三个加号以后,结果是2.00,即输入的a?;
         减法:2- - 4 =6.00   这里的两个减号进行了加法运算?另外三个减号以后,结果是2.00,也是输入的a?;
         乘法:2 ** 4 = 0.00
         除法:2 // 4 : 家里电脑打印的结果是 #1.J(好像是这个,记不太清楚了),小甲鱼的代码的结果是:除数不能为零!
                                  另一台电脑打印结果是
                                  这两个结果是怎么来的?
谢谢!!

2020.5.11 发表于 2020-5-29 17:20:41

到家了,家里电脑运行 2 // 4 结果为:1.#J{:10_291:}

2020.5.11 发表于 2020-5-31 15:11:51

没有人理我{:10_266:}

顶级太阳 发表于 2022-5-31 14:08:47

问题1、你这个switch应该用{}括起来,至少我这样的初学者怀疑会出现程序搞错的可能,我考虑是第16-24行用大括号括起来,避免出现运行错误。
问题2、我的电脑运行这个,结果也是0.12,同为初学者,我感觉应该是系统不同造成的吧。太难了,暂时不纠结这么细致,计算机这东西计算小数的时候出一点错误是经常的,要不然不会每年都有飞机掉下来。
问题3、按照我这些日子学习的结论,在屏幕输入的时候,是首先把所有输入结果都读入缓存区,然后根据后面的列表一个个取数据。比如第一个%f会从头开始取一个浮点数,当出现不是数字的值之后停止(不论是括号还是运算符号、回车符都会停)这时候内存里剩下的是++4。然后再读取第二个要取的值,你和小甲鱼要求的都是%c,那么这时候会取一个符号就结束(c是要求取一个字符),那么这时候内存里剩下的是+4.这时候程序运行到取第三个值,也就是后面一个%f。程序首先发现的是一个‘+’,而不是数值,那么会认为遇到了非法字符,而停止。
我觉得我这个理解能够解释你遇到的问题3.
另外,哥们,麻烦你把自己电脑的系统时间改一下吧。我电脑现在不到14:00,而你最后一个“没有人理我”发表于15:11“:51.哈哈哈哈。我这就回复上去,看看会不会出现我的时间早于你的时间。或者你不在国内,也有可能。

顶级太阳 发表于 2022-5-31 14:35:23

问题1:作为同样一个初学者,不知道你有没有尝试,除数为0的情况。我怀疑你的程序会运行第22行。建议你把第16-22行用大括号括起来,表示这是if下面else的子程序。
问题2、计算机这破东西,对于小数存储什么的不同系统都很多不一样,对于小数很不友好,小数位数有所误差我碰到很多次了,不同系统都会有点偏差,要不然也不会每年都有飞机掉下来。
问题3、你这是脑洞大开呀。根据我这初学者记忆里,网上很多帖子提到过,计算机对录入数据,是首先把屏幕上的所有数据存入缓存区,然后再根据读取的要求进行顺序读取。那么你这样录入就成了下面的过程:
    第一步:用%f读取一个浮点数。            计算机从缓冲区里读取到第一个‘+’的时候认为第一个浮点数读取完毕,存入‘a'的位置,这时候缓冲区里剩下了’++4‘;
    第二步:用%c读取一个字符。               计算机从缓冲区里读取到一个+存入了’ch‘,这是缓冲区里剩下了’+4‘;
    第三步:用%f读取一个浮点数。             计算机从缓冲区里读取时发现第一个字符是‘+’,那么认为直接不是数字,对于浮点数来说这是一个非法字符,返回了一个空值。
所以你的错误输入造成对外表现为只是读取了一个a值。
页: [1]
查看完整版本: S1E12求助:计算器的问题