求平均成绩
Problem Description
假设一个班有n(n<=50)个学生,每人考m(m<=5)门课,求每个学生的平均成绩和每门课的平均成绩,并输出各科成绩均大于等于平均成绩的学生数量。
Input
输入数据有多个测试实例,每个测试实例的第一行包括两个整数n和m,分别表示学生数和课程数。然后是n行数据,每行包括m个整数(即:考试分数)。
Output
对于每个测试实例,输出3行数据,第一行包含n个数据,表示n个学生的平均成绩,结果保留两位小数;第二行包含m个数据,表示m门课的平均成绩,结果保留两位小数;第三行是一个整数,表示该班级中各科成绩均大于等于平均成绩的学生数量。
每个测试实例后面跟一个空行。
Sample Input
2 2
5 10
10 20
Sample Output
7.50 15.00
7.50 15.00
1
代码如下:
#include <stdio.h>
#include <stdlib.h>//顺手写上的
#include <string.h>//顺手写上的
int main()
{
int i,n,m,j;
int f[55][10];
while (scanf("%d %d",&n,&m) != EOF)
{
int count = 0,flag = 0;
double sum1[55] = {0},sum2[15] = {0};
for (i = 0;i < n;i ++)
{
for (j = 0;j < m;j ++)
{
scanf("%d",&f[i][j]);
}
}
for (i = 0;i < n;i ++)
{
for (j = 0;j < m;j ++)
{
sum1[i] += f[i][j];
}
sum1[i] *= 1.0 / m;
if (i == 0)
printf("%.2f",sum1[i]);
else
printf(" %.2f",sum1[i]);
}
printf("\n");
for (j = 0;j < m;j ++)
{
for (i = 0;i < n;i ++)
{
sum2[j] += f[i][j];
}
sum2[j] *= 1.0 / n;
if (j == 0)
printf("%.2f",sum2[j]);
else
printf(" %.2f",sum2[j]);
}
printf("\n");
for (i = 0;i < n;i ++)
{
count = 0;
for (j = 0;j < m;j ++)
{
if (f[i][j] < sum2[j])//原先的代码:if(f[i][j] > sum2[j])
break;//这样可缩短时间
else
count ++;
}
if (count == m)
flag ++;
}
printf("%d\n\n",flag);//每个测试实例后面跟一个空行。所以有俩'\n'。
}
return 0;
}
总结:
1.C语言中,数组初始化的方式主要有三种:
(1)声明时,使用 {0} 初始化。
(2)使用memset。
(3)用for循环赋值。
效率:
分别执行上面三种方法,统计下平均时间可以得出: for循环浪费的时间最多,{0} 与memset 耗时差不多。
原理:
1、for循环,就是循环赋值,不解释了
2、memset,很容易找到memset内部实现代码,这里也不解释了
3、{0} 内部是怎么实现的呢?
{0}初始化方式,调用了memset函数!
对三种方法的选取:
1、for 最浪费时间,不建议(其实memset内部也是用循环实现的,只不过memset经过了严格优化,所以性能更高);
2、{0} 可能有移植性问题,虽然绝大多数编译器看到{0} 都是将数组全部初始化为0, 但是不保证所有编译器都是这样实现的;
3、综合1、2, 推荐使用memset方法。
转载于:C语言 数组初始化的三种常用方法({0}, memset, for循环赋值)以及原理。
2、memset