问题链接: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 "); break; case 8: printf("Good "); break; case 7: case 6: printf("Pass "); break; default: printf("Fail "); } 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 ", ans[level[score / 10]]); return 0; }