You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数值成绩转换为字母等级问题求助

问题分析与修复

你的代码存在多个关键问题,导致无法正确转换并打印字母等级,逐一说明如下:

  • scanf参数错误:scanf("%i", score); 中缺少取地址符&,scanf需要传入变量的地址才能正确读取输入,应该改为scanf("%i", &score);。
  • 变量混淆与未初始化:main函数中grade变量未初始化就传给letter函数,而且你实际需要传入的是用户输入的score,而非未赋值的grade。
  • 未接收函数返回值:调用letter(grade);后没有将返回的char类型值保存,也没有用正确的格式符打印。printf里用%i会把char当成整数打印,应该用%c,同时要把函数返回值赋值给一个变量或者直接在printf里使用。
  • switch分支不完整:letter函数中没有处理分数低于50的情况(即grade/10小于5的情况),而且return grade;是错误的,应该返回对应的字母等级(比如'F')。
  • 冗余break:switch的case里return语句之后的break是多余的,因为return已经会直接退出函数,不会执行到break。

修正后的代码

#include<stdio.h>

char letter(int grade);

int main()
{
    int score;

    printf("\tEnter your numerical grade: ");
    scanf("%i", &score); // 修正:添加取地址符&

    char result = letter(score); // 接收函数返回的字母等级
    printf("Your grade is a %c", result); // 用%c打印char类型

    return 0;
}

char letter(int grade)
{
    switch(grade / 10) 
    {
        case 10:
        case 9: // 合并相同逻辑的case
            return 'A';
        case 8:
            return 'B';
        case 7:
            return 'C';
        case 6:
        case 5: // 合并相同逻辑的case
            return 'D';
        default: // 处理低于50分的情况
            return 'F';
    }
}

额外优化说明

  • 合并了逻辑相同的case(比如10和9都返回A),让代码更简洁。
  • 增加了default分支处理所有未覆盖的分数情况,避免返回错误值。
  • 移除了冗余的break语句,因为return已经退出函数。
  • 去掉了不必要的stdlib.h头文件,当前代码不需要用到它。

内容的提问来源于stack exchange,提问作者Holli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 03:20:30