老牛来学习 发表于 2020-2-6 14:46:34

C语言12课课后作业问题

#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;
}

问题都在上面问题注释里了。谢谢{:5_92:}

SHRS23 发表于 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
相当于完成一次减法。

老牛来学习 发表于 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
是这个意思吗

SHRS23 发表于 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)

SHRS23 发表于 2020-2-6 19:07:56



假设 输入是 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

老牛来学习 发表于 2020-2-6 19:30:46

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

感谢感谢!!!!!!
页: [1]
查看完整版本: C语言12课课后作业问题