题目:

编写一个程序,提示用户输入3组数,每组数包含5个double类型的数(假设用户都正确地响应,不会输入非数值数据)。该程序应完成下列任务:

  1. 把用户输入从数据存储到3*5的数组中。
  2. 计算每组(5个)数据的平均值
  3. 计算所有数据的平均值
  4. 找出这15个数据中的最大值
  5. 打印结果

要求:

  1. 每个任务都要用单独的函数来完成(使用传统C处理数组的方式)。
  2. 完成任务2,编写一个计算并返回一维数组平均值的函数,利用循环调用函数3次。
  3. 对于处理其他任务的函数,应该把整个数组作为参数。
  4. 完成任务3和4的函数应该把结果返回主调函数。

分析:

经过分析,我们发现只需要写3个函数就可以解决问题:

  1. 录入函数,用来读取用户输入的数据,并将其放入数组中。
  2. 求均值函数,用来完成题目的2、3任务——求每行与整个数组的均值。
  3. 求最大值函数,用来完成题目的第4任务。

代码实现:

#define _CRT_SECURE_NO_WARNINGS 1
#define ROWS 3
#define COLS 5

#include <stdio.h>
#include <assert.h>

void Input_arr(double arr[][COLS], int rows)
{
	assert(arr);
	int i = 0;
	int j = 0;

	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < COLS; j++)
		{
			scanf("%lf", &arr[i][j]);
		}
	}
}

double Average(const double arr[][COLS], int rows)
{
	assert(arr);

	double ave = 0;
	int i = 0;
	int j = 0;

	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < COLS; j++)
		{
			ave += arr[i][j];
		}
	}

	return ave / (COLS * rows);
}

double Max(const double arr[][COLS], int rows)
{
	int i = 0;
	int j = 0;
	double max = 0;

	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < COLS; j++)
		{
			max = max > arr[i][j] ? max : arr[i][j];
		}
	}
	return max;
}

double Calc(const double arr[][COLS], int rows, double (*p)(const double arr[][COLS], int rows))
{
	return p(arr, rows);
}

int main()
{
	double input[ROWS][COLS] = { 0 };
	double ave = 0;
	double max_arr = 0;
	int i = 0;

	//输入
	Input_arr(input, ROWS);

	printf("\n");

	//计算每组的平均值
	for (i = 0; i < ROWS; i++)
	{
		ave = Calc(input[i], ROWS / ROWS, Average);
		printf("第%d行的平均值为:%.2lf\n", i + 1, ave);
	}

	//计算整个数组的平均值
	ave = Calc(input, ROWS, Average);
	printf("整个数组的平均值为:%.2lf\n", ave);

	//找出数组中的最大值
	max_arr = Calc(input, ROWS, Max);
	printf("整个数组的最大值为:%.2lf\n", max_arr);

	return 0;
}

运行结果:

C Primer Plus 中文第6版 10.13 第13题_#define