【问题标题】:Changing an integer grade into a character grade using a switch statement使用 switch 语句将整数成绩更改为字符成绩
【发布时间】:2021-09-09 11:10:35
【问题描述】:

使用 switch 语句,编写一个将数字等级转换为字母的程序
等级:

输入数字等级:84
字母等级:B

使用以下评分标准:

A = 90-100,B = 80-89,C = 70-79,D = 60-69,F = 0-59。

如果成绩大于100 或小于0,则打印错误消息。

提示:将成绩分成两位数,然后使用 switch 语句测试十位数。

如何更改代码以让100 变为A?我输入100,输出为F

#include <stdio.h>

int main(void)
{
    int front_number, back_number;

    printf("Enter numerical grade: ");
    scanf("%1d%1d", &front_number, &back_number);

    printf("Letter grade: ");

    switch (front_number){
    case 0: case 1: case 2: case 3: case 4: case 5:
        printf("F");
        break;
    case 6:
        printf("D");
        break;
    case 7:
        printf("C");
        break;
    case 8:
        printf("B");
        break;
    case 9:
        printf("A");
        break;
    }
    return 0;
}

【问题讨论】:

  • @kaylum 作业(我认为这是家庭作业)说应该使用switch
  • 我知道怎么做 in (if else statement) ,但问题要我使用 switch
  • 00 是有效输入吗?如果不是,那么如果第一个数字是 0,您可以将其解释为 100。
  • 当有效输入为“100”(即三位数)时,将数字分成两位数是错误的。只需将带有%d 的输入扫描成一个数字,例如grade,然后使用switch (grade/10) 并包含case 10:。区分 100 和 101 以报告错误将需要 if 语句或一些恶作剧(可能只是第二个 switch)。我建议找一位新老师。
  • 我很惊讶没有人提到default

标签: c switch-statement


【解决方案1】:

在现实世界的程序中,您可能会为每个年级创建一个结构,然后搜索只读元素表。示例:

#include <stdio.h>

typedef struct
{
  int  low_limit;
  int  high_limit;
  char grade;
} grade_t;

int main (void)
{
  const grade_t grade[] =
  {
    {  0,  59, 'F' },
    { 60,  69, 'D' },
    { 70,  79, 'C' },
    { 80,  89, 'B' },
    { 90, 100, 'A' },
  };
  
  int input = 82;
  for(size_t i=0; i<sizeof grade/sizeof *grade; i++)
  {
    if(input <= grade[i].high_limit)
    {
      printf("%d gives %c", input, grade[i].grade);
      break;
    }
  }
}

这是一种简单的线性搜索方法,但由于项目的数量非常有限,它可能非常有效。或者,您可以使用标准 C bsearch,以防您有大量已排序的数据。

值得注意的是,我们甚至不需要知道下限,因为这是数组中的前一项所隐含的。

【讨论】:

  • 这不符合问题规范,即“使用 switch 语句”和“如果等级大于 100 或小于 0,则打印错误消息。”
【解决方案2】:

最好不要读两位数,因为:

  • 这会尝试读取输入并在一个步骤中处理此输入,而这些是单独的过程。
  • 如果输入为100,它将在输入流中留下最后一个0 字符。
  • 10100 的情况无法区分。

出于类似原因,“将成绩分成两位数”的提示具有误导性。

(可能)预期的解决方案

这就是我所假设的,或多或少是预期的解决方案。它读取整个(无符号)整数,并对其值除以 10 使用开关。一个不太优雅的部分是默认情况(这里更多的是“其他”),它必须区分有效的 3 位数字输入(即100 和无效输入。
从技术上讲,部分输入现在由 if 语句而不是 switch 处理,但考虑到问题陈述,这是最明智的解决方案。更好的办法是在函数顶部捕获边缘情况 grade == 100 并保留默认情况以仅返回错误值。

#include <stdio.h>
#include <stdlib.h>

char gradeUintToChar(unsigned int grade);

int main(void)
{
    printf("Enter numerical grade: ");
    fflush(stdout);

    unsigned int gradeUint;
    if (scanf("%u", &gradeUint) != 1)
    {
        fprintf(stderr, "Invalid input\n");
        exit(EXIT_FAILURE);
    }

    char gradeChar = gradeUintToChar(gradeUint);
    if (gradeChar == 0)
    {
        fprintf(stderr, "gradeUintToChar: Invalid parameter\n");
        exit(EXIT_FAILURE);
    }
    printf("Letter grade: %c\n", gradeChar);
}

char gradeUintToChar(unsigned int grade)
{
    switch (grade / 10U)
    {
    case 0: case 1: case 2: case 3: case 4: case 5:
        return 'F';

    case 6:
        return 'D';

    case 7:
        return 'C';

    case 8:
        return 'B';

    case 9:
        return 'A';

    default:
        if (grade == 100U)
            return 'A';
        else
            return (char) 0; // Indicates failure
    }
}

GNU 案例范围解决方案

有一个名为 case ranges 的 GNU 扩展,它允许直接使用开关来实现这一点。由于这是非标准 C,因此通常推荐使用这种方法。

代码示例:

#include <stdio.h>
#include <stdlib.h>

char gradeUintToChar(unsigned int grade);

int main(void)
{
    printf("Enter numerical grade: ");
    fflush(stdout);

    unsigned int gradeUint;
    if (scanf("%u", &gradeUint) != 1)
    {
        fprintf(stderr, "Invalid input\n");
        exit(EXIT_FAILURE);
    }

    char gradeChar = gradeUintToChar(gradeUint);
    if (gradeChar == 0)
    {
        fprintf(stderr, "gradeUintToChar: Invalid parameter\n");
        exit(EXIT_FAILURE);
    }
    printf("Letter grade: %c\n", gradeChar);
}

char gradeUintToChar(unsigned int grade)
{
    switch (grade)
    {
    case 0 ... 59:
        return 'F';

    case 60 ... 69:
        return 'D';

    case 70 ... 79:
        return 'C';

    case 80 ... 89:
        return 'B';

    case 90 ... 100:
        return 'A';

    default:
        return (char) 0; // Indicates failure
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-19
    • 2015-12-28
    • 2017-09-04
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    相关资源
    最近更新 更多