鱼C论坛

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

[已解决]c语言的Switch语句问题

[复制链接]
发表于 2023-10-22 19:22:09 | 显示全部楼层 |阅读模式

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

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

x
我这个输完了,可以运行,但是结果不对是咋回事各位大佬??
帮我看看,就是我输入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;
}
最佳答案
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后再进行整型转换,从而解决了问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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后再进行整型转换,从而解决了问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;}
你可以根据自己的需求选择其中一种方法来修复代码。希望能帮助到你!如果还有其他问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我用了while呀,不过改了还是一样,不知道问题出在哪里
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-22 19:57:52 | 显示全部楼层
陶远航 发表于 2023-10-22 19:22
你的代码中的问题在于printf语句的位置。在你的代码中,printf语句被放在了switch语句的最后一个case中,这 ...

第九第26为啥有\在那里的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-5 19:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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