2021-01-09

求平均成绩

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

上一篇:蓝桥杯算法训练 矩阵乘法


下一篇:C语言中的malloc、new、memset函数解析