NO.9【婳骨】の计分系统

题目

原题:
计分系统
张三老师在计分时, 希望大家尽量不挂科, 于是想出了一套绝妙的计分方式
试卷一共有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键,即刷新缓冲区,因此输出一个字符

感谢康康与顾北组长的大力协助

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值