鱼C论坛

 找回密码
 立即注册
查看: 3275|回复: 4

S1E12求助:计算器的问题

[复制链接]
发表于 2020-5-29 15:17:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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(好像是这个,记不太清楚了),  小甲鱼的代码的结果是:除数不能为零!
                                  另一台电脑打印结果是 1590736225(1).jpg 1590736301(1).jpg
                                  这两个结果是怎么来的?
谢谢!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-29 17:20:41 | 显示全部楼层
到家了,家里电脑运行 2 // 4 结果为:1.#J  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-31 15:11:51 | 显示全部楼层
没有人理我
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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.哈哈哈哈。我这就回复上去,看看会不会出现我的时间早于你的时间。或者你不在国内,也有可能。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 14:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表