已知南水北调水源地丹江口水库流域上游武侯镇水文站近10年的逐月径流量大小范国沙【1,300】亿m3。请设计算法并编写程序,定义、输入随机数数组(二维数组,10行×12列,行表示第1年~第10年,列表示1月份~12月份)分别计算以下统计指标:
(1)这10年中最大和最小的径流量数值,及其所在年、月位置;
(2)这10年中1月份~12月份多年平均径流量值;
(3)每年总径流量(12个月份之和)。
#include <stdio.h>
#include <stdlib.h>
#define ROWS 10
#define COLS 12
// 计算最大值和最小值
void calculateMinMax(float data[ROWS][COLS], float *minValue, int *minYear, int *minMonth, float *maxValue, int *maxYear, int *maxMonth)
{
*minValue = data[0][0];
*maxValue = data[0][0];
*minYear = 1;
*minMonth = 1;
*maxYear = 1;
*maxMonth = 1;
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
if (data[i][j] < *minValue)
{
*minValue = data[i][j];
*minYear = i + 1;
*minMonth = j + 1;
}
if (data[i][j] > *maxValue)
{
*maxValue = data[i][j];
*maxYear = i + 1;
*maxMonth = j + 1;
}
}
}
}
// 计算平均值
void calculateAverage(float data[ROWS][COLS], float *average)
{
*average = 0;
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
*average += data[i][j];
}
}
*average /= (ROWS * COLS);
}
// 计算每年总径流量
void calculateYearlyTotal(float data[ROWS][COLS], float yearlyTotal[ROWS])
{
for (int i = 0; i < ROWS; i++)
{
yearlyTotal[i] = 0;
for (int j = 0; j < COLS; j++)
{
yearlyTotal[i] += data[i][j];
}
}
}
int main()
{
float data[ROWS][COLS];
// 输入随机数数组
printf("请输入随机数数组(10行×12列):\n");
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
scanf("%f", &data[i][j]);
}
}
float minValue, maxValue, average;
int minYear, minMonth, maxYear, maxMonth;
float yearlyTotal[ROWS];
// 计算最大值和最小值
calculateMinMax(data, &minValue, &minYear, &minMonth, &maxValue, &maxYear, &maxMonth);
// 计算平均值
calculateAverage(data, &average);
// 计算每年总径流量
calculateYearlyTotal(data, yearlyTotal);
// 输出结果
printf("最小的径流量数值为: %.2f,所在年月为: 第%d年第%d月\n", minValue, minYear, minMonth);
printf("最大的径流量数值为: %.2f,所在年月为: 第%d年第%d月\n", maxValue, maxYear, maxMonth);
printf("1月份~12月份多年平均径流量值为: %.2f\n", average);
printf("每年总径流量:\n");
for (int i = 0; i < ROWS; i++)
{
printf("第%d年: %.2f\n", i + 1, yearlyTotal[i]);
}
return 0;
}
这个程序使用了三个函数来计算统计指标:
calculateMinMax
函数用于计算最小值和最大值,并记录其所在的年份和月份。calculateAverage
函数用于计算给定数组的平均值。calculateYearlyTotal
函数用于计算每年的总径流量。在 main
函数中,首先输入随机数数组,然后调用这些函数来计算并输出统计指标的结果。
供参考:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define Y 10 // 年
#define M 12 // 月
int main()
{
int i, j, ymax, mmax, ymin, mmin;
int arr[Y][M]={0}, ytotal[Y] = {0}, mtotal[M] = {0};
srand((unsigned int)time(NULL));
for (i = 0,ymax = 0,mmax = 0,ymin = 0,mmin = 0; i < Y; i++){
for (j = 0; j < M; j++){
arr[i][j] = rand() % 300 + 1;
ytotal[i] += arr[i][j]; //总径流量/年,12个月之和
mtotal[j] += arr[i][j]; //每月/10年之和
if (arr[ymax][mmax] < arr[i][j]) ymax = i, mmax = j; //找到最大径流量的年月坐标
if (arr[ymin][mmin] > arr[i][j]) ymin = i, mmin = j; //找到最小径流量的年月坐标
}
}
// 以下输出
printf("\t\t");
for(i = 0; i < M; i++)
printf("%d月份\t",i + 1);
printf("总径流量/年\n");
for (i = 0; i < Y; i++){
for (j = 0; j < M; j++){
if(!j) printf("第%d年\t\t", i+1);
printf("%d\t", arr[i][j]);
}
printf("%d\n\n", ytotal[i]);
}
printf("月均/10年\t");
for (i = 0; i < M; i++)
printf("%.2f\t", mtotal[i] / 10.0);
printf("\n");
printf("\n10年里最大径流量为:%-2d,在:第%-2d年%-2d月份。\n", arr[ymax][mmax], ymax + 1, mmax + 1);
printf("\n10年里最小径流量为:%-2d,在:第%-2d年%-2d月份。\n", arr[ymin][mmin], ymin + 1, mmin + 1);
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:这里的内容也不太复杂,但是用到了较多的库函数,可能不太容易理解:
1.当我们执行完初始化界面之后我们进入这个函数体若用户输入1,则直接利用goto语句跳到begin,执行break,跳出循环,执行其余操作。
2.若用户输入2,我们则利用MessgaeBox输出一个文本框提示用户我们暂未开发这项功能,MessageBox这个关键字包含在<windows.h>这个头文件当中,它的具体使用格式便是【MessgaeBox(句柄,显示内容,标题,MB_OK)】。
3.当用户输入3的时候我们则利用exit(0),关闭所有正在运行中的文件,终止正在进行中的程序,它包含在<stdlib.h>这个头文件中。
4.最后一个选项,即游戏规则等提示内容,我这里直接用MessageBox输出了一个文本框,比较简易的实现了这个功能,如果要添加更多的内容,使用输出函数即可实现。
void Interface()
{
int n;
while (1)
{
cin >> n;
switch (n)
{
case 1:goto begin;
case 2:MessageBox(NULL, "此功能目前还未开发,请耐心等待", "提示",MB_OK); system("cls"); Interfaceprint(); goto begin;
case 3:exit(0); break;
case 4:MessageBox(NULL, "五子连珠即可胜利,不需要过多解释吧!", "提示", MB_OK); system("cls"); Interfaceprint(); goto begin;
}
begin:
break;
}
}
同样来测试一下:(输入1,和输入3后面会测试到)
输入2: 输入4:
很抱歉,因为缺乏具体的问题背景和需求目标,无法提供有效的解决方案。如果您能提供更具体的问题描述和要求,我将会尽力为您提供解决方案。