BC11 学生基本信息输入

描述:

依次输入一个学生的学号,以及3科(C语言,数学,英语)成绩,在屏幕上输出该学生的学号,3科成绩(注:输出成绩时需进行四舍五入且保留2位小数)。

数据范围:

学号满足 1≤n≤20000000,各科成绩使用百分制,且不可能出现负数

输入描述:

学号以及3科成绩,学号和成绩之间用英文分号隔开,成绩之间用英文逗号隔开。

输出描述:

学号,3科成绩,输出格式详见输出样例。

解题:

在开始读入数据时,刚想用int存储学号,想到int能够存取整数的范围,它存的下吗?

#include <stdio.h>
int main()
{
printf("int size is %d byte.\n" , sizeof(int));
return 0;
}

image.png

实际上int的取值范围依赖于计算机系统,这里显示的4Byte,说明可以存取的数字范围是-2147483648~2147483647机2^32 ~ 2^32 - 1,所以用int类型就够了。

剩下的三个数用float即可,但题目又有要求要四舍五入,如果直接用%.2f的形式他会自动四舍五入吗,搜索资料后,答案有的说会,有的又说不会,我自己试了下是可以的,但有的人说不可以,虽然提交OJ是过了,但还是想写个四舍五入的方法,可以采用放大取余再看余数的范围。因为有三个数需要处理,所以我就写一个函数来解决问题

#include <stdio.h>
//三位小数,我就直接先让它放大1000倍
float test(float a)
{
int b = a * 1000;
int tmp = 10;
while (tmp >= 10)
{
tmp = b % 10;
}
if (tmp < 5)
{
a = (float)(b - tmp) / 1000;
return a;
}
else
{
a = (float)(b + 10 - tmp) / 1000;
return a;
}
}
int main()
{
float a = 80.635;
float b = 80.630;
printf("%.2f\n", test(a));
printf("%.2f\n", test(b));
return 0;
}

image.png

附上全代码:

#include <stdio.h>
float test(float a) {
int b = a * 1000;
int tmp = 10;
while (tmp >= 10) {
tmp = b % 10;
}
if (tmp < 5) {
a = (float)(b - tmp) / 1000;
return a;
} else {
a = (float)(b + 10 - tmp) / 1000;
return a;
}
}
int main() {
float a = 0;
float b = 0;
float c = 0;
int n = 0;
scanf("%d;%f,%f,%f", &n, &a, &b, &c);
printf("The each subject score of No. %d is %.2f, %.2f, %.2f.", n, test(a),
test(b), test(c));
return 0;
}

image.png