C语言,求解,南水北调水源地的年月径流量

已知南水北调水源地丹江口水库流域上游武侯镇水文站近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;
}

这个程序使用了三个函数来计算统计指标:

  1. calculateMinMax 函数用于计算最小值和最大值,并记录其所在的年份和月份。
  2. calculateAverage 函数用于计算给定数组的平均值。
  3. 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;
}

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7623780
  • 你也可以参考下这篇文章:【C语言】喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水。编程实现。
  • 除此之外, 这篇博客: 11月7日学习总结中的 2.对用户输入的选项进行相应的输出:我们为用户提供了四个选项,但目前我的水平无法实现联网模式,所以这里对选项2进行简单处理即可。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    这里的内容也不太复杂,但是用到了较多的库函数,可能不太容易理解:

    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:

  • 以下回答来自chatgpt:

    很抱歉,因为缺乏具体的问题背景和需求目标,无法提供有效的解决方案。如果您能提供更具体的问题描述和要求,我将会尽力为您提供解决方案。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^