题目
原题:
计分系统
张三老师在计分时, 希望大家尽量不挂科, 于是想出了一套绝妙的计分方式
试卷一共有40道题目
正确数量在0~10时, 每题有6分
正确数量在11~20时, 第11~20题 每题2分
正确数量在21~40时, 第21~40题 每题1分
设计一个持续, 输入学生做对题目的数量, 输出分数
输入: 整数n(0<=n<=40), 表示张三回答正确的题目数量
输出: 一个整数, 表示张三获得的分数
样例输入:
40
样例输出
100
样例输入:
10
样例输出:
60
代码
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define _CRT_SECURE_NO_WARNINGS
int main()
{
system("title 【婳骨】の计分系统");
int student[5]; //接收学生成绩
int pw;//这个变量是用来接受输入的
int i; //控制循环
int scores = 0; //成绩
printf("小新老师您好~欢迎登陆【婳骨】の计分系统\n该系统可一次录入5名学生正确题数(0~40的整数)\n");
//这一步就是判断输入的数据是否合法,且输入的仅仅是一个整数
for (i = 0; i < 5; i++)
{
printf("请输入第%d位学生的正确题数:\n", i + 1);
while (!(scanf_s("%d", &pw)) || pw > 40 || pw < 0)
{
while (getchar() != '\n'); //清空缓存区
printf("你输入的数据有误,请再输一遍!\n"); //温馨提醒一下
}
if (pw <= 10 && pw >= 0) //0~10
{
scores = 6 * pw;
}else if (pw <= 20 && pw >= 11) //11~20
{
scores = 60 + 2 * (pw - 10);
}else if (pw <= 40 && pw >= 21) //21~40
{
scores = 80 + pw - 20;
}
printf("第%d位学生的成绩为为:%d\n", i + 1, scores);
student[i] = scores; //当前学生
}
printf("这五位同学的成绩分别为:\n%d\t%d\t%d\t%d\t%d\t\n", student[0], student[1], student[2], student[3], student[4]); //打印结果
system("pause");
return 0;
}
部分运行结果
知识点
1、 scanf() 函数的返回值有两种可能,要么返回接收到的数据个数,要么返回0。
清除缓存区是如何清除的
int c;
while((c = getchar()) != ‘\n’ && c != EOF);
该代码不停地使用 getchar() 获取缓冲区中的字符,直到获取的字符是换行符\n 或者
是文件结尾符 EOF 为止。这个方法可以完美清空输入缓冲区,并且具备可移植性。
2、 char ch;
while( ( ch=getchar() ) != ‘\n’ ) {
//your code here
………… //用A代表这条语句
}
翻译一下句子就是:当你从键盘输入的字符不是换行(回车)时,执行A代码。意思是,直到输入的字符是’\n’(换行符)的时候,才退出while循环。
3、 getchar() != EOF
EOF 定义在stdio.h文件中 #define EOF (-1)
当终端有字符输入时,Ctrl+D产生的EOF相当于结束本行输入,将引起geychar()的新一轮输入;
当终端没有字符输入或者说当getchar()读取新的一次输入时输入Ctrl+D,此时产生的EOF相当于文件结束符,程序将结束getchar()的执行
因getchar()函数虽是int类型,但返回值通常都介于0~127即ASCII码的范围,因此-1不会对应任意一个字符,所以可作为文件结束的标志
int ch;
while((ch = getchar()) != EOF) putchar(ch)
无论printf还是putchar其本质都是一样的,我们一般是getchar再putchar,而getchar时已经输入了Enter键,即刷新缓冲区,因此输出一个字符
另
感谢康康与顾北组长的大力协助