CCCS 发表于 2021-1-9 21:34:00

C语言习题100 第二题 算法问题

#include<stdio.h>
main()
{
        long int n,i;
        double j;
        printf("请输入总利润:");
        scanf("%ld",&n);
        i = n/100000;
        printf("%d\n",i);
        switch(i)
        {
        case 0: j = n*0.1;
        case 1: j = 100000*0.1+(n-100000)*0.075;
        case 2: j = 10000+7500+(n-200000)*0.05;
        case 3: j = 10000+7500+(n-200000)*0.05;
        case 4: j = 10000+7500+10000+(n-400000)*0.03;
        case 5: j = 10000+7500+10000+(n-400000)*0.03;
        case 6: j = 10000+7500+10000+6000+(n-600000)*0.015;
        case 7: j = 10000+7500+10000+6000+(n-600000)*0.015;
        case 8: j = 10000+7500+10000+6000+(n-600000)*0.015;
        case 9: j = 10000+7500+10000+6000+(n-600000)*0.015;
        case 10: j = 10000+7500+10000+6000+6000+(n-1000000)*0.01;
        default : j = 10000+7500+10000+6000+6000+(n-1000000)*0.01;
        }
        printf("奖金总数为%lf\n",j);
}

请输入总利润:600000
6
奖金总数为35500.000000
Press any key to continue


为什么不是 10000+7500+10000+6000=33500
而是35500

jackz007 发表于 2021-1-9 21:36:11

本帖最后由 jackz007 于 2021-1-9 21:47 编辑

      每一个 case 的语句块必须以一个 break 结束,否则,从 case 语句的进入点开始,将会顺序执行遇到的每一条语句,而无视这些语句是否属于本 case 语句块。
      例如,当 i 为 6 的时候,将会从 6 的人口进入,执行完属于自己的语句块后,还会继续向后执行 i = 7、8、9、10、default 的语句块,全部执行完才会罢休。
      所以,引起你疑问的答案就是这个值其实根本就不属于 i = 6 ,而是属于 default 的计算结果。
      switch(i)
      {
      case 0: j = n*0.1;braek;
      case 1: j = 100000*0.1+(n-100000)*0.075;braek;
      case 2: j = 10000+7500+(n-200000)*0.05;braek;
      case 3: j = 10000+7500+(n-200000)*0.05;braek;
      case 4: j = 10000+7500+10000+(n-400000)*0.03;braek;
      case 5: j = 10000+7500+10000+(n-400000)*0.03;braek;
      case 6: j = 10000+7500+10000+6000+(n-600000)*0.015;braek;
      case 7: j = 10000+7500+10000+6000+(n-600000)*0.015;braek;
      case 8: j = 10000+7500+10000+6000+(n-600000)*0.015;braek;
      case 9: j = 10000+7500+10000+6000+(n-600000)*0.015;braek;
      case 10: j = 10000+7500+10000+6000+6000+(n-1000000)*0.01;braek;
      default : j = 10000+7500+10000+6000+6000+(n-1000000)*0.01;braek;
      }

CCCS 发表于 2021-1-14 16:48:39

jackz007 发表于 2021-1-9 21:36
每一个 case 的语句块必须以一个 break 结束,否则,从 case 语句的进入点开始,将会顺序执行遇到 ...

感谢
页: [1]
查看完整版本: C语言习题100 第二题 算法问题