C中的程序无效

时间:2014-03-31 02:53:25

标签: c arrays

好的,所以我正在编写一个程序,用10 x 10阵列填充0到0之间的随机数。 9,和(每个步骤组织成一个函数):

(a)将第一行相加并打印出来 (b)打印出主对角线的平均值(从上到下,从左到右) (c)打印出第一列中有多少0 (d)制作更多10×10阵列,随机数介于0和10之间。 9,如果主要的所有值     对角线(从上到下,从左到右)为7或更大,打印出阵列,然后是     尝试的次数。如果它无法在1,000,000次尝试中进行,则打印出它无法打印的情况     完成。 (e)制作1D动态分配的数组,其中包含介于-10和10之间的10个数字。 +10,乘以     制作第一个数组并显示结果向量

无法弄清楚什么不能使它工作,在打印出来时获取所有步骤的错误值:'(以及一些错误

void simple_array(int ten_by_ten[10][10])
{
    int i, j;
    printf("\n");
    for (i=0; i<10; ++i)    
    {
        for (j=0; j<10; ++j)
        {
            ten_by_ten[i][j] =  rand() % 10;
            printf("%d ", ten_by_ten[i][j]);
        }
        printf("\n");
    }
}
void sum_first_row(int y[10][10])
{
    int i = 0, j, sum_row = 0;
    for (j=0; j<10; ++j)
    { 
        sum_row += y[i][j];
    }
    printf("\nThe sum of the first row is: %d\n", sum_row);
}

void average_main_diagonal(int z[10][10])
{
    int i, j = 0, average_diagonal = 0;
    for (i=0; i<10; ++i)
    { 
        ++j;
        average_diagonal += z[i][j]; 
    }
    printf("\nThe average of the diagonal is: %lf\n", (average_diagonal / 10.0));
}

void zeros(int a[10][10])
{
    int i, j = 0, zeroz = 0;
    for (i=0; i<10; ++i)
    { 
        if (a[i][j] == 0)
            ++zeroz;
    }
    printf("\nThere are %d zero's in the first column\n", zeroz);
}

void multiple_arrays()
{
    int sum_diagonal = 0,array[10][10], i, j, k, l, c;
    while ((sum_diagonal < 70) && (c <= 1000000))
    {
        j = 0;
        k = 0;
        l = 0;
        i = 0;
        for (i=0; i<10; ++i)
        {
            for (j=0; j<10; ++j)
            {
                array[i][j] =  rand() % 10;
            }
        }
        for (k=0; k<10; ++k)
        { 
            ++l;
            sum_diagonal += array[k][l]; 
        }
        ++c;
    }
    if (c = 1000000)
        printf("\nCould not get a diagonal with numbers >= 7\n");
    else
    {
        j = 0;
        i = 0;
        for (i=0; i<10; ++i);   
        {
            printf("\n");
            for (j=0; j<10; ++j)
                printf("%d ", array[i][j]);
        }
        printf("It took %d many tries to get a diagonal with all numbers >= 7", c);
    }

}

void array_multiplication(int b)
{   
    int **arrays, i, j, k, l, m, prod[10];
    arrays = (int **) calloc (10, sizeof(int *));
    for (i=0; i<10; ++i)
        arrays[i] = (int *) calloc (1, sizeof(int));
    for (i=0; i<10; i=i+1)
    {   
        arrays[i] =  (rand() % 21) -10;     
    }

    for (k=0; k<10; ++k)
    {
        prod[k] = 0;
        for (l=0; l<10; ++l)
            prod[k] = prod[k] + b[k][l] * arrays[l];
    }
    printf ("The product is: <");
    for (m=0; m<10; ++m)
        printf ("%d, ", prod[m]);
    printf (">\n");
}

int main()
{
    int x[10][10];

    simple_array(x);
    sum_first_row(x)
    average_main_diagonal(x);
    zeros(x);
    multiple_arrays();
    array_multiplication(x);


    return (0);
}

获得以下错误:

当我注释掉“数组乘法”函数时(因为它得到以下错误:(a)赋值使得整数指针没有强制转换“arrays [i] =(rand()%21)-10;”(b )value既不是数组也不是指针“prod [k] = prod [k] + b [k] [l] * arrays [l];”(c)传递arg1的“array_multiplication”从指针生成整数而不强制转换“array_multiplication( X);“

并打印出对角线的不正确平均值

非常感谢帮助! 谢谢, --Rob

2 个答案:

答案 0 :(得分:0)

arrays[i] = (rand() % 21) -10;arrays[i]是一个指针。您不能为指针分配整数。实际上你只是为前一行的arrays[i]分配了一些已分配的内存,所以即使这样做也会泄漏那个内存。

如果你想在每一行和每一列都加一个值,你是否意味着有两个嵌套循环? 此外,你永远不会释放你calloc的记忆。并且不要施放calloc返回的值。

其他错误,您打算将您的函数声明为

void array_multiplication(int b[10][10])

而不是(int b)。抱怨您正在int进行数组操作。

答案 1 :(得分:0)

查看对角线的代码不正确(您知道)。你在使用它之前递增“j”...所以“i”是0而“j”是1 ......这不是对角线。您需要使用它来查找值后使用“++ j”....但更适合使用z [i] [i](对于BOTH索引使用“i”)。

这个问题同时发生在average_main_diagonal和multiple_arrays中。