CCF NOI1014 写评语

问题链接CCF NOI1014 写评语




时间限制: 1000 ms  空间限制: 262144 KB

题目描述

  输入某学生成绩score,根据成绩好坏输出相应评语。如果成绩在大于等于90,输出“Excellent”;如果成绩在大于等于80分且小于90分,输出“Good”;如果成绩大于等于60分且小于80分,输出“Pass”;成绩小于60分,输出“Fail”。

输入

  输入一个整数score,表示学生的成绩。

输出

  输出对应的评语。

样例输入

65

样例输出

Pass

数据范围限制

  0<=score<=100



问题分析

  这是一个把百分制成绩转换为等级成绩的问题。

  这个问题有三种解法:

  一是根据输入的成绩直接进行范围判定,输出结果。这是一种最差的做法。

  二是先将输入成绩除以10,再进行判定。这种方法大幅简化了判定逻辑。

  三是查表法,先计算后差表。这种做法逻辑简洁,程序通用性强。问题要求改变时不需要修改程序逻辑,只需要修改表(程序中可能用数组存储)。

程序说明

  这里给出了2种程序。后一种是用查表法实现的,是2次查表,表格从一定意义上来说实现了一种映射。

要点详解
  • 一个复杂的计算,不是直接处理,而是分步进行处理,每一步的逻辑都变得简单,整体的处理逻辑也简化了。
  • 查表法是一种值得推荐的方法,优点多多。
  • 程序中,出现了指针数组,需要理解和掌握。



100分通过的C语言程序之一:

#include <stdio.h>

int main(void)
{
    int score;

    scanf("%d", &score);

    switch(score / 10) {
    case 10:
    case 9:
        printf("Excellent\n");
        break;
    case 8:
        printf("Good\n");
        break;
    case 7:
    case 6:
        printf("Pass\n");
        break;
    default:
        printf("Fail\n");
    }

    return 0;
}


100分通过的C语言程序之二:

#include <stdio.h>

int main(void)
{
    char *ans[] = {
         "Excellent"
        , "Good"
        , "Pass"
        , "Fail"
    };
    int level[] = {3, 3, 3, 3, 3, 3, 2, 2, 1, 0, 0};
    
    int score;
                  
    scanf("%d", &score);
    
    printf("%s\n", ans[level[score / 10]]);
    
    return 0;
}



posted on 2017-04-20 09:33  海岛Blog  阅读(640)  评论(0编辑  收藏  举报

导航