gpt4 book ai didi

c - 下面的C代码实现了什么

转载 作者:行者123 更新时间:2023-11-30 20:49:13 25 4
gpt4 key购买 nike

我正在做一道过去的考试题,要求我描述以下 C 代码实现的内容,并使用有意义的变量名称和良好的编程实践重新编写它。

代码如下:

void h(int ** a, int b){
for(int x=1; x<=b; x++)
for(y=1; y<=b; y++)
a[x-1][y-1]= (i/j)*(j/i);
}

我不明白这段代码是如何工作的:

1) y 从未在 for 循环中声明。

2)如果没有声明 i 和 j,i 和 j 的算术对我来说也没有意义。

我原本以为这是一个摄入量,i 和 j 只是 x 和 y。但如果是这样的话,与我已经完成的任何其他问题相比,这个问题就会非常简单。

最佳答案

该代码可能旨在创建一个单位矩阵,其前导对角线上为 1,其他位置为 0。

该代码的 Fortran 等效项被用作经典 Elements of Programming Style 中不良代码的第一个示例。作者:Kernighan 和 Plauger。

根据内存,Fortran 代码大致为:

       DO 10 I = 1, N
DO 10 J = 1, N
10 A(I,J) = (I/J)*(J/I)

(可能有两个标签,10和20,以及一两个继续语句,但我认为是这样的。当时,第1-5列是为数字标签保留的,第6列是延续指示器,程序占用第7-72列,第73-80列是可选的语句序列号。)

<小时/>

由于 y 被使用但未声明,如果编译,y 必须是外部变量(全局变量或文件范围的变量: extern int y;int y;static int y; 在函数外部)。

由于使用了ij但未声明,如果编译通过,它们也必须是外部变量。鉴于 ij 均未更改,因此相同的值(0 或 1,取决于 i != j 是否)分配给 a 的每个元素的事实。

实现相同(坏)算法的更接近“正确”的代码应该是:

void h(int **a, int b)
{
for (int x = 1; x <= b; x++)
for (int y = 1; y <= b; y++)
a[x-1][y-1] = (x/y)*(y/x);
}

当然,这不太像 C,但它确实避免了被零除的问题。但是,可以编写更清晰、更简单的代码:

void h(int **a, int b)
{
for (int x = 0; x < b; x++)
{
for (int y = 0; y < b; y++)
a[x][y] = 0;
a[x][x] = 1;
}
}

该函数应该重命名为更有意义的名称。

关于c - 下面的C代码实现了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23203853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com