一.题目(牛客:BC101)
描述:
输入一个班级5个学生各5科成绩,输出5个学生各5科成绩及总分。
输入描述:
五行,每行输入一个学生各5科成绩(浮点数表示,范围0.0~100.0),用空格分隔。
输出描述:
五行,按照输入顺序每行输出一个学生的5科成绩及总分(小数点保留1位),用空格分隔。
示例1:
输入:
98.5 96.0 100 99 88
60.5 77 88.5 99 60
80 80.5 89 91 92
93 94 95.5 96 97.5
100 98 88.5 88 78.5
输出:
98.5 96.0 100.0 99.0 88.0 481.5
60.5 77.0 88.5 99.0 60.0 385.0
80.0 80.5 89.0 91.0 92.0 432.5
93.0 94.0 95.5 96.0 97.5 476.0
100.0 98.0 88.5 88.0 78.5 453.0
二.分析
1.首先审题干:①5个学生②5科成绩③总分;
2.其次构思:①我们应先产生学生这一对象,然后再产生成绩,最后输出
3.最后构造框架:
方法一:使用循环语句来产生学生这一对象,在学生这个大循环中再加入一个循环来产生成绩,通过循环变量来实现5次的输入输出(产生5个学生,输入5次成绩,输出5个学生的5个成绩及总分)
方法二:通过构建结构体来产生5个学生,再用暴力枚举的方法输入成绩
三.例析
上面的分析看了之后可能会仍然大脑一片空白(怪我表达不好),但问题不大,下面通过具体的代码进行逐步讲解。
方法一:
#include<stdio.h>
int main()
{
int i = 0;
double score[5] = { 0.0 };
for (i = 0; i < 5; i++)//输出5个人
{
int j = 0;
double sum = 0.0;
for (j = 0; j < 5; j++)//输出每个人的5个成绩
{
scanf("%lf", &score[j]);//每个成绩都存放到j中,即0,1,2,3,4中,scanf后面不能使用保留小数位数的符号,即不能使用%.1lf
sum += score[j];//求总成绩
}
j = 0;
for (j = 0; j < 5; j++)
{
printf("%.1lf ", score[j]);//输出一个人的5个成绩
}
printf("%.1lf\n", sum);
}
return 0;
}
剖析:
1.int i = 0;
//这里首先定义一个循环变量i,目的是在下面构建一个大循环,用来产生五个学生;
2.double score[5] = { 0.0 };
//定义一个双精度数组,[5]代表数组内存放5个数,{0.0}是初始化数组,相当于告诉大家这个里面的数是保留一位小数;
3.for (i = 0; i < 5; i++)
{
……
}
return 0;
//这个循环是用来产生5个学生,i从0开始,执行到5时停止,即循环了5次,i=0时可以看成是第一个学生,在这个循环内部通过其他代码来产生5个成绩,这一个循环下来一个学生的5个成绩就产生了,只需要再循环几次就可以产生5个学生了;
4.for (j = 0; j < 5; j++)
{
scanf(“%lf”, &score[j]);
sum += score[j];
}
//这个循环就是用来产生5个成绩的,通过j循环5次来产生5次成绩,并且将5次成绩存放在score中(即一开始定义时的[5]就是用来存放5次成绩的),即当j=0时我们输入一个数,这个数就被存放到数组下标为0的位置,循环往复就可以将5次成绩放入score当中。其中sum+=score[j]; 是将每一次输入的成绩相加起来,等价于sum=sum+score[j]; 这是较为常见的循环累加法,例如第一次循环j=0,输入的成绩为98.5,输入之后再往下执行就会将98.5加到sum中,第二次循环中j=1,输入另一个成绩,再将这个成绩加上sum(此时的sum是上次加上98.5的sum),因此就可以实现求和的功能。
5.j = 0;
for (j = 0; j < 5; j++)
{
printf("%.1lf ", score[j]);
}
//上面的循环仅仅是输入了5个成绩,还需要输出这5个成绩。首先先将j初始化,因为5次的成绩分别存储在j=0,j=1,j=2,j=3,j=4中,需要从j=0开始来打印出5次成绩,这里的循环用法和第四点的循环用法大同小异,j=0时输出当时j=0时输入的数,j=1时也是如此,这里可以理解为数组是一个存放数据的载体,每个数据都有对应的编号,需要用到时根据编号再输出。
6.printf(“%.1lf\n”, sum);
//这串代码是用来输出总分数的。%.1lf 这个是为了输出时保留一位小数,想保留几位就在%后面加上.再加上想要保留的位数,例如保留两位小数,并且是单精度:%.2f。
方法二:
#include <stdio.h>
float add(float x, float y, float z, float m, float n) //自定义一个add函数,用来算总成绩
{
float h;
h = x + y + z + m + n;
return h;
}
struct student //创建结构体
{
//定义每一门科目
float a;
float b;
float c;
float d;
float e;
} student1, student2, student3, student4, student5;//包含的学生名
int main()
{
float a1;
float a2;
float a3;
float a4;
float a5;
scanf("%f %f %f %f %f", &student1.a, &student1.b, &student1.c, &student1.d,
&student1.e);
scanf("%f %f %f %f %f", &student2.a, &student2.b, &student2.c, &student2.d,
&student2.e);
scanf("%f %f %f %f %f", &student3.a, &student3.b, &student3.c, &student3.d,
&student3.e);
scanf("%f %f %f %f %f", &student4.a, &student4.b, &student4.c, &student4.d,
&student4.e);
scanf("%f %f %f %f %f", &student5.a, &student5.b, &student5.c, &student5.d,
&student5.e);
a1 = add(student1.a, student1.b, student1.c, student1.d, student1.e);
a2 = add(student2.a, student2.b, student2.c, student2.d, student2.e);
a3 = add(student3.a, student3.b, student3.c, student3.d, student3.e);
a4 = add(student4.a, student4.b, student4.c, student4.d, student4.e);
a5 = add(student5.a, student5.b, student5.c, student5.d, student5.e);
printf("%.1f %.1f %.1f %.1f %.1f %.1f\n", student1.a, student1.b, student1.c, student1.d, student1.e, a1);
printf("%.1f %.1f %.1f %.1f %.1f %.1f\n", student2.a, student2.b, student2.c, student2.d, student2.e, a2);
printf("%.1f %.1f %.1f %.1f %.1f %.1f\n", student3.a, student3.b, student3.c, student3.d, student3.e, a3);
printf("%.1f %.1f %.1f %.1f %.1f %.1f\n", student4.a, student4.b, student4.c, student4.d, student4.e, a4);
printf("%.1f %.1f %.1f %.1f %.1f %.1f\n", student5.a, student5.b, student5.c, student5.d, student5.e, a5);
return 0;
}
通过对比可以很清晰看出第一种方法代码上更加简便,但逻辑上更加复杂,而第二种则逻辑上较为简单,但是代码十分复杂繁琐。如果结构体这部分不理解的可以看我之前写的关于结构体的博客。http://t.csdn.cn/tLQd2
最后:
距离上一篇博客已经过去很久了,之后我会渐渐找回状态稳定更新,非常感谢你们的支持和陪伴!