注册 登录
编程论坛 C语言论坛

关于C语言二维数组的很简单的代码,为何计算结果全是0?

prisoner_an 发布于 2019-06-27 12:12, 3182 次点击
#include<stdio.h>

void total(float ar[][12],int n)
{
    float total=0;
    for(int i=0;i<n;i++)
        for(int j=0;j<12;j++)
            total+=ar[i][j];
            printf("the total rainfall of the %d years is %2.2f",n,total);
            printf("\n");
}
void aveyear(float ar[][12],int n)
{
    float subtotal;
    printf("average rainfall of year :");
    for(int i=0;i<n;i++){
        for(int j=0,subtotal=0;j<12;j++)
            subtotal+=ar[i][j];
           printf("%2.2f ",subtotal/12);
    }
    printf("\n");
}
void avemonth(float ar[][12],int n)
{
    float subtotal;
    printf("average rainfall of month :");
        for(int j=0;j<12;j++){
            for(int i=0,subtotal=0;i<n;i++)
            subtotal+=ar[i][j];
            printf("%2.2f ",subtotal/n);
        }
}
void main()
{

    float rain[5][12]={
    {4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6},
    {8.5,8.2,1.2,1.6,2.4,0.0,5.2,0.9,0.3,0.9,1.4,7.3},
    {9.1,8.5,6.7,4.3,2.1,0.8,0.2,0.2,1.1,2.3,6.1,8.4},
    {7.2,9.9,8.4,3.3,1.2,0.8,0.4,0.0,0.6,1.7,4.3,6.2},
    {7.6,5.6,3.8,2.8,3.8,0.2,0.0,0.0,0.0,1.3,2.6,5.2}};
    total(rain,5);
    aveyear(rain,5);
    avemonth(rain,5);
}

5 回复
#2
rjsp2019-06-27 12:33
#include <stdio.h>

void total( float ar[][12], size_t n )
{
    float total = 0;
    for( size_t y=0; y!=n; ++y )
        for( size_t m=0; m!=12; ++m )
            total += ar[y][m];
    printf( "the total rainfall of the %zu years is %2.2f\n", n, total );
}

void aveyear( float ar[][12], size_t n )
{
    printf( "average rainfall of year:" );
    for( size_t y=0; y!=n; ++y )
    {
        float subtotal = 0;
        for( size_t m=0; m!=12; ++m )
            subtotal += ar[y][m];
        printf( " %2.2f", subtotal/12 );
    }
    putchar( '\n' );
}

void avemonth( float ar[][12], size_t n )
{
    printf( "average rainfall of month:" );
    for( size_t m=0; m!=12; ++m )
    {
        float subtotal = 0;
        for( size_t y=0; y!=n; ++y )
            subtotal += ar[y][m];
        printf(" %2.2f",subtotal/n );
    }
    putchar( '\n' );
}

int main( void )
{
    float rain[5][12] = { { 4.3f, 4.3f, 4.3f, 3.0f, 2.0f, 1.2f, 0.2f, 0.2f, 0.4f, 2.4f, 3.5f, 6.6f }
                        , { 8.5f, 8.2f, 1.2f, 1.6f, 2.4f, 0.0f, 5.2f, 0.9f, 0.3f, 0.9f, 1.4f, 7.3f }
                        , { 9.1f, 8.5f, 6.7f, 4.3f, 2.1f, 0.8f, 0.2f, 0.2f, 1.1f, 2.3f, 6.1f, 8.4f }
                        , { 7.2f, 9.9f, 8.4f, 3.3f, 1.2f, 0.8f, 0.4f, 0.0f, 0.6f, 1.7f, 4.3f, 6.2f }
                        , { 7.6f, 5.6f, 3.8f, 2.8f, 3.8f, 0.2f, 0.0f, 0.0f, 0.0f, 1.3f, 2.6f, 5.2f } };

    total( rain, sizeof(rain)/sizeof(*rain) );
    aveyear( rain, sizeof(rain)/sizeof(*rain) );
    avemonth( rain, sizeof(rain)/sizeof(*rain) );

    return 0;
}
#3
幻紫灵心2019-06-27 12:44
void aveyear(float ar[][12],int n)
{
    float subtotal;
    printf("average rainfall of year :");
    for(int i=0;i<n;i++){
        for(int j=0,subtotal=0;j<12;j++)
            subtotal+=ar[i][j];
           printf("%2.2f ",subtotal/12);
    }
    printf("\n");
}
int j=0,subtotal=0; 这句,又声明了一次subtotal变量。
所以说你的subtotal声明了两次,for循环里面的subtotal作用范围只在那个for里面,后面输出的是最上边声明的那个。

#4
prisoner_an2019-06-27 16:58
回复 3楼 幻紫灵心
这么明显的错误居然没发现
#5
prisoner_an2019-06-27 17:01
回复 2楼 rjsp
还有这操作!学习了
#6
huhaile2019-07-03 16:46
这个可以哈,学习了学习了
1