题目:
编写一个程序,提示用户输入3组数,每组数包含5个double类型的数(假设用户都正确地响应,不会输入非数值数据)。该程序应完成下列任务:
- 把用户输入从数据存储到3*5的数组中。
- 计算每组(5个)数据的平均值
- 计算所有数据的平均值
- 找出这15个数据中的最大值
- 打印结果
要求:
- 每个任务都要用单独的函数来完成(使用传统C处理数组的方式)。
- 完成任务2,编写一个计算并返回一维数组平均值的函数,利用循环调用函数3次。
- 对于处理其他任务的函数,应该把整个数组作为参数。
- 完成任务3和4的函数应该把结果返回主调函数。
分析:
经过分析,我们发现只需要写3个函数就可以解决问题:
- 录入函数,用来读取用户输入的数据,并将其放入数组中。
- 求均值函数,用来完成题目的2、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;
}