鱼C论坛

 找回密码
 立即注册
查看: 1608|回复: 5

[已解决]C语言12课课后作业问题

[复制链接]
发表于 2020-2-6 14:46:34 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>
#include <stdbool.h>

int main()
{
        int op1, op2;
        char ch;
        float result;
        bool invalid = false;                //这个布尔型的变量定义了有什么用,下面的invalid用法都没看明白

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

        switch (ch)
        {
                case '-': op2 = -op2; // no break                //这里定义了减法把被减数变为负值,但没有说减法的result是多少啊,怎么求得减法?
                case '+': result = (float)op1 + op2; break;
                case '*': result = (float)op1 * op2; break;
                case '/':
                        if (op2 != 0)
                        {
                                result = (float)op1 / op2;
                                break;
                        }
                        else
                        {
                                invalid = true;
                                break;
                        }
        }

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

        return 0;
}

问题都在上面问题注释里了。谢谢
最佳答案
2020-2-6 19:07:56
2020-02-06_190006.png

假设 输入是 5 / 0
判断运算符的时候进入 case '/': 分支(红色箭头处)
然后进行 if 判断 ,此时 op2 != 0 表达式的值为 假(因为 ch2 = 0)
进入else 分支(第一个绿色方块)将 invalid 设为 true
然后进行 if 判断,此时invalid 为真,执行第二个绿色方块
输出 除数不能为零!

假设 输入是 4 / 2
判断运算符的时候进入 case '/': 分支(红色箭头处)
然后进行 if 判断 ,此时 op2 != 0 表达式的值为 真(因为 ch2 = 2)
进入第一个黄色方块,不改变invalid值(保持默认的false 假),直接计算结果
然后进行 if 判断,此时invalid 为假,执行第二个黄色方块
输出 结果是:2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-6 15:39:04 | 显示全部楼层
第一个问题:invalid 的作用
>这是一个用于标记被除数是不是0的标志,是0则为true 非0 则为false。
定义时默认设置为false 即被除数不是0
在case '/': 中 如果op2(实际输入的被除数)是0 将invalid 赋值为true
在输出时判断invalid 如果为true 说明实际输入的被除数是0 输出:除数不能为零!


第二个问题:case '-': 中的result 是多少
>这里涉及到C语言中switch case 语句的一个知识点:
Switch语句重点:从匹配处开始顺序执行,直到遇到break或结束。

意思就是只要进入了某一条case语句,如果没有遇到break,程序就会把后面的所有case代码都运行一遍,一直到遇到break或者switch代码段结束
对于这个程序 case '-': 后面是没有break的 所以程序会继续执行 case '+':  后面的内容,执行结束后遇到break,结束整个switch
也就是说这个程序做减法的逻辑是这样的:先进入 case '-':把 被减数变为相反数重新存储在op2中,再进入 case '+': 计算 result = (float)op1 + op2
相当于完成一次减法。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-6 18:31:31 | 显示全部楼层
SHRS23 发表于 2020-2-6 15:39
第一个问题:invalid 的作用
>这是一个用于标记被除数是不是0的标志,是0则为true 非0 则为false。
定义 ...

第二个问题懂了,谢谢。
第一个问题,所以我定义的那个布尔变量是只有true和false两个值是吗?那个if(invalid)是什么意思,怎么判断的
程序走到没有走到invalid = true,
从第一个break出去的就走到if(invalid)
这时候invalid = false就是值为0,所以执行else
是这个意思吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-6 18:56:31 | 显示全部楼层
老牛来学习 发表于 2020-2-6 18:31
第二个问题懂了,谢谢。
第一个问题,所以我定义的那个布尔变量是只有true和false两个值是吗?那个if(i ...

if(表达式) 语句
其语义是:如果表达式的值为真,则执行其后的语句,否则不执行该语句。

C语言对 表达式为真 定义的比较宽泛,对于布尔类型 true 就是真,对于其他的值类型,比如int整数型,非0值就是真

if (invalid) 相当于 if(invalid == true)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-6 19:07:56 | 显示全部楼层    本楼为最佳答案   
2020-02-06_190006.png

假设 输入是 5 / 0
判断运算符的时候进入 case '/': 分支(红色箭头处)
然后进行 if 判断 ,此时 op2 != 0 表达式的值为 假(因为 ch2 = 0)
进入else 分支(第一个绿色方块)将 invalid 设为 true
然后进行 if 判断,此时invalid 为真,执行第二个绿色方块
输出 除数不能为零!

假设 输入是 4 / 2
判断运算符的时候进入 case '/': 分支(红色箭头处)
然后进行 if 判断 ,此时 op2 != 0 表达式的值为 真(因为 ch2 = 2)
进入第一个黄色方块,不改变invalid值(保持默认的false 假),直接计算结果
然后进行 if 判断,此时invalid 为假,执行第二个黄色方块
输出 结果是:2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-6 19:30:46 | 显示全部楼层
SHRS23 发表于 2020-2-6 19:07
假设 输入是 5 / 0
判断运算符的时候进入 case '/': 分支(红色箭头处)
然后进行 if 判断 ,此时 op ...

感谢感谢!!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 04:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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