朕也来学学 发表于 2023-10-22 19:22:09

c语言的Switch语句问题

我这个输完了,可以运行,但是结果不对是咋回事各位大佬??
帮我看看,就是我输入90.5的话,它会打印出一个A,但是现在我输入什么它都不打印东西出来,也没有报错呀
#include <stdio.h>

int main()
{
        float a;
        char grade;
        printf("请输入你的成绩:");
        scanf("%f",&a);
        while (a>100||a<=0)
        {
                printf("\n请输入正确的成绩:");
                scanf("%f",&a);
        }
        switch((int)a/10)
        {        case 10:
                case 9:grade='A';break;
                case 8:grade='B';break;
                case 7:grade='C';break;
                case 6:grade='D';break;
                case 5:
                case 4:
                case 3:
                case 2:
                case 1:
                case 0:grade='E';
                printf("成绩是:%5.1f"",相对应的等级是%c\n。",a,grade);
        }
                return 0;
}

isdkz 发表于 2023-10-22 19:22:22

在这段代码中,问题出在了switch语句中的case部分。在C语言中,switch语句的case部分只能接受整型常量表达式作为条件,而不能接受浮点数类型的表达式。

解决这个问题的方法是将浮点数转换为整型,然后再进行switch语句的判断。可以使用强制类型转换将浮点数转换为整型,例如将 (int)a/10 改为 (int)(a/10) 。

以下是修改后的代码:

#include <stdio.h>

int main()
{
    float a;
    char grade;
    printf("请输入你的成绩:");
    scanf("%f",&a);
    while (a>100||a<=0)
    {
      printf("\n请输入正确的成绩:");
      scanf("%f",&a);
    }
    switch((int)(a/10))
    {
      case 10:
      case 9: grade='A'; break;
      case 8: grade='B'; break;
      case 7: grade='C'; break;
      case 6: grade='D'; break;
      case 5:
      case 4:
      case 3:
      case 2:
      case 1:
      case 0: grade='E'; break;
    }
    printf("成绩是:%5.1f, 相对应的等级是%c。\n", a, grade);
    return 0;
}


通过将 (int)a/10 改为 (int)(a/10) ,可以确保将浮点数a除以10后再进行整型转换,从而解决了问题。

陶远航 发表于 2023-10-22 19:22:48

你的代码中的问题在于printf语句的位置。在你的代码中,printf语句被放在了switch语句的最后一个case中,这意味着只有当a的值在0到10之间时,才会执行printf语句。因此,当你输入90.5时,它会计算出等级为'A',但是并不会打印出来。

你应该将printf语句移出switch语句,放在switch语句之后,这样无论a的值是多少,都会执行printf语句。以下是修改后的代码:

#include <stdio.h>
int main() {         
    float a;         
    char grade;         
    printf(\"请输入你的成绩:\");         
    scanf(\"%f\",&a);         
    while (a>100||a<=0)         
    {                  
      printf(\"\
请输入正确的成绩:\");                  
      scanf(\"%f\",&a);         
    }         
    switch((int)a/10)         
    {   
      case 10:         
      case 9:grade='A';break;                  
      case 8:grade='B';break;                  
      case 7:grade='C';break;                  
      case 6:grade='D';break;                  
      case 5:         
      case 4:         
      case 3:         
      case 2:         
      case 1:         
      case 0:grade='E';break;         
    }
    printf(\"成绩是:%5.1f,相对应的等级是%c\
\",a,grade);
    return 0;
}


这样,无论你输入什么分数,都会打印出相应的等级。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案

Mike_python小 发表于 2023-10-22 19:23:22

你的代码存在一个小问题。在 switch 语句中,当输入的成绩小于等于0时,由于 (int)a/10 的结果为0,会匹配到最后一个 case 0 分支,并输出等级为'E'的情况。

解决这个问题有两种方法:

1. 在 switch 语句之前添加一个条件判断,判断当成绩不在0-100的范围内时直接输出错误信息。例如:


if (a < 0 || a > 100) {
    printf("输入的成绩不在有效范围内!\n");
} else {
    switch ((int)a / 10) {
      // ...
    }
}


2. 将最后一个 case 分支改为默认分支 default,并在其中输出错误信息。例如:


switch ((int)a / 10) {
    // ...
    default:
      printf("输入的成绩不在有效范围内!\n");
      break;
}


你可以根据自己的需求选择其中一种方法来修复代码。希望能帮助到你!如果还有其他问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

朕也来学学 发表于 2023-10-22 19:36:42

Mike_python小 发表于 2023-10-22 19:23
你的代码存在一个小问题。在 switch 语句中,当输入的成绩小于等于0时,由于 (int)a/10 的结果为0,会匹配 ...

我用了while呀,不过改了还是一样,不知道问题出在哪里

朕也来学学 发表于 2023-10-22 19:57:52

陶远航 发表于 2023-10-22 19:22
你的代码中的问题在于printf语句的位置。在你的代码中,printf语句被放在了switch语句的最后一个case中,这 ...

第九第26为啥有\在那里的
页: [1]
查看完整版本: c语言的Switch语句问题