【问题标题】:Why does my code work on some rows of the array and not others?为什么我的代码在数组的某些行上有效,而在其他行上无效?
【发布时间】:2020-09-09 00:16:59
【问题描述】:

因此,对于我的大学实践工作(这些天教授没有回答),我必须用 C 语言编写一个程序,该程序从用户那里接收一个二维数组,然后在其中搜索 3 个或更多零的序列。 例如:

1 1 1 1 0 
1 1 1 1 1 
1 0 0 0 0 
0 1 1 1 0 
0 0 0 1 1 

应该输出:

no sequence in: 1
no sequence in: 2
Sequence found in: 3 row
no sequence in: 4
Sequence found in: 5 row

我编写了这些简单的循环,但我得到了一些奇怪的输出,这些输出无法引导我进行修复,我的代码是:

int main() {
    int array[ROW][COLUMN];
    printf("please enter a 5x5 matrix: \n");
    for (int i = 0; i < ROW; ++i) {
        for (int j = 0; j < COLUMN; ++j) {
            scanf("%d", &array[i][j]);
        }

    }
    for (int i = 0; i < ROW; ++i) {
        for (int j = 0; j < COLUMN; ++j) {
            printf("%d ", array[i][j]);
        }
        printf("\n");
    }


    int zero_c = 0;
    for (int i = 0; i < ROW; ++i) {
        for (int j = 0; j < COLUMN; ++j) {

                if (array[i][j] == 0) {
                zero_c = 1;
                if (array[i][j+1] == 0) {
                    zero_c = 1;
                    if (array[i][j + 2] == 0) {
                        zero_c = 1;
                    }
                }
            }else {
                    zero_c = 0;
                }
        }


        if (zero_c==1) {
            printf("Sequence found at: %d row\n ", i + 1);
            zero_c = 0;
        } else {
            printf("no sequence in: %d\n", i + 1);
        }
    }


        return 0;

}

哪些输出:(对于上面显示的相同数组)


Sequence found at: 1 row //(it seems like it always finds a sequence on the first row)
 no sequence in: 2
Sequence found at: 3 row
 Sequence found at: 4 row
 no sequence in: 5

对为什么会发生这种情况有任何想法吗?

【问题讨论】:

    标签: arrays c for-loop


    【解决方案1】:

    代码有两个问题:

    1. 它将索引超出行尾,导致错误匹配(以及可能的未定义行为)。

    2. 一旦在一行中找到 3 个零的序列,它就不会停止在该行中查找,因此如果该行在零后包含 1,它会忘记它曾经看到过零,从而导致错过匹配。

    问题 (1) 很容易通过将内部循环的循环测试更改为:

    for (int j = 0; j < COLUMN - 2; ++j) {
    

    第二个问题通过在连续找到 3 个零后添加 break 语句来解决

    生成的循环如下所示:

        int zero_c = 0;
        for (int i = 0; i < ROW; ++i) {
            for (int j = 0; j < COLUMN - 2; ++j) {
                if (array[i][j] == 0) {
                    zero_c = 1;
                    if (array[i][j+1] == 0) {
                        zero_c = 1;
                        if (array[i][j + 2] == 0) {
                            zero_c = 1;
                            break;
                        }
                    }
                } else {
                    zero_c = 0;
                }
            }
            ...
    
    

    这应该可以修复错误(前提是它在外循环结束时继续重置zero_c,就像现在一样)。

    更简单的版本如下:

        for (int i = 0; i < ROW; ++i) {
            int zero_c = 0;
            for (int j = 0; j < COLUMN - 2; ++j) {
                if (array[i][j] == 0 && array[i][j+1] == 0 && array[i][j+2] == 0) {
                    zero_c = 1;
                    break;
                }
            }
            ...
    
    

    此版本在外循环顶部重置zero_c,并且在打印每一行的结果时不需要重置它。

    更高效的版本只是保留一个计数器,无需前瞻。请注意,对于这个版本,需要使用原始的内循环绑定:

        for (int i = 0; i < ROW; ++i) {
            int zero_c = 0;
            for (int j = 0; j < COLUMN; ++j) {
                if (array[i][j] == 0) {
                    zero_c++;
                    if (zero_c == 3)
                        break;
                }
                else {
                    zero_c = 0;
                }
            }
            ...
    
    

    对于这个版本,您可以在打印行状态时查看zero_c == 3(同样,无需在此处重置)。

    【讨论】:

    • 非常感谢,您的解释很清楚!
    • @JorgeÁvilaBalmaceda 没问题!如果这回答了您的问题,您应该将答案标记为已接受。
    • 哎呀!,没注意到
    猜你喜欢
    • 1970-01-01
    • 2015-12-21
    • 2020-02-23
    • 1970-01-01
    • 2022-10-07
    • 2021-09-17
    • 2019-12-27
    • 2018-08-11
    相关资源
    最近更新 更多