hdu 2004 成绩转换
题目描述
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 185104 Accepted Submission(s): 80860
Problem Description
输入一个百分制的成绩t,将其转换成对应的等级,具体转换规则如下:
90~100为A;
80~89为B;
70~79为C;
60~69为D;
0~59为E;
Input
输入数据有多组,每组占一行,由一个整数组成。
Output
对于每组输入数据,输出一行。如果输入数据不在0~100范围内,请输出一行:“Score is error!”。
Sample Input
56
67
100
123
Sample Output
E
D
A
Score is error!
Author
lcy
问题解答
以下给出自己用的两种代码:
方法一:(switch语句判断)
#include <stdio.h>
int main()
{
int t;
while(scanf("%d",&t)!=EOF)
{
if(t>100||t<0) printf("Score is error!
");
else
{
switch(t/10)
{
case 0 ... 5: printf("E
");break;
case 6:printf("D
");break;
case 7:printf("C
");break;
case 8:printf("B
");break;
case 9 ... 10: printf("A
");break;
default:printf("Score is error!
");break;
}
}
}
return 0;
}
笔记1
- 第8行,必须加上这个判断语句if(t>100||t<0) printf(“Score is error! ”);如果单用switch(t/10),会导致-1~-9数据测试失败,结果失真。
- 第11行,switch语句常用于断点式判断,但不可能写case 0,case 1,case 2,……,case 100一百多个判断吧。所以用t/10来实现,此处t为整形,那么t/10意味着取整;若t是float型之类的,则t/10就是一般意义上的除法。
- switch语句的每个case后面通常来说要加break语句跳出循环(太基础了,书上一般都会有讲解,在这里就不解释了)。此外,case后面跟的多条语句可以不用{花括号}括起来。
方法二:(if…else if语句判断)
#include <stdio.h>
int main()
{
int t;
while(scanf("%d",&t)!=EOF)
{
if(t<=100&&t>=90) printf("A
");
else if(t<=89&&t>=80) printf("B
");
else if(t<=79&&t>=70) printf("C
");
else if(t<=69&&t>=60) printf("D
");
else if(t<=59&&t>=0) printf("E
");
else printf("Score is error!
");
}
return 0;
}
笔记2
- 此道题用这种做法明显更为简便以及可视化程度高。
PS:悄悄地在最后吐槽一下,这个毒瘤题目耗了我一天的时间QAQ。题目没有看清楚,一直想歪了,幻想着测试文件会给出一个字母或者其他非数字内字符进行测试。然后就想用scanf("%d",&t)==1来判断用户输入的是不是规定的数字,如果不是,就用getchar()吞掉。但问题是必须要同时保证该程序可以输入多组数据,直至测试文件结束,那就意味着我必须要用scanf("%d",&t)!=EOF来判断,即意味着我必须把一个字符输入两遍才能判断,否则会出现漏字符没有判断的情况!更毒瘤的是学长规定必须要用c语言来写,至今没有想到用c语言同时解决两者的办法。如果有大佬的代码调试成功,欢迎来讨论>- . -<