0

我必须为大学做一个练习,要求我检查(k 次)矩阵是否有正行(我的意思是一行包含所有正元素),我认为 for 循环的索引有问题但我找不到错误。

我尝试使用适用于计数器的 cout 语句进行调试,它给了我“101”,所以编译器似乎将“1”分配给正行,将“0”分配给负行

这是我写的代码:

#include <iostream>

using namespace std;

const int N = 3;

bool positive(int a[N][N], int row[N], int x) {
    bool condition = false;

    for(int i = 0; i < N; i++) {
        row[i] = a[x][i];
    }

    int j = 0;

    while(j < N) {
        if(row[j] >= 0) {
            condition = true;
        } else {
            condition = false;
        }

        j++;

    }

    return condition;
}


bool function (int a[N][N], int z, int j, int k) {
    int b[N];
    int c[N];
    int count = 0;

    if(positive(a, b, z) && positive(a, c, j)) {
        count++;
    }

    if(count == k) {
        return true;
    } else {
        return false;
    }
}


int main() {
    int a[N][N] = {
        {
            2, 8, 6
        }, {
            -1, - 3, - 5
        }, {
            6, 10, 9
        }
    };

    int k = 2;

    for(int i = 0; i < N; i++) {
        for(int j = 0; j < N; j++) {
            if(function (a, i, j, k)) {
                cout << "OK";
            } else {
                cout << "NO";
            }

        }
    }

    return 0;
}
4

1 回答 1

2

您可能应该再看一下这个问题并使用不同的解决方案重新启动。目标很简单,但是您的代码非常复杂,其中一些并没有真正的意义。

例如,如果您有这样的矩阵:

    1   2   4    --> matrix A
   -1   8  -6
    3   9   2

您有 N=3 行和列。根据您所说的,您唯一需要做的就是获取矩阵,循环遍历 N 行,并且对于每一行,检查它的 N 列以查看是否有任何内容 < 0。

正如您所说,这样做K次是没有意义的。每次比较时矩阵都是相同的,因为您没有更改它,为什么要多次进行比较?我认为你应该重读那里的作业简介。

至于查找哪些行是正数或负数的逻辑,只需像这样简单地做一些事情。

//Create array so we have one marker for each row to hold results.
bool rowPositiveFlags[N] = { true, true, true };

//Cycle through each row.
for (int row = 0; row < N; ++row)
    //Cycle through every column in the current row.
    for (int col = 0; col < N; ++col)
        //If the column is negative, set the result for this row to false and break
        //the column for loop as we don't need to check any more columns for this row.
        if (A[row][col] < 0) {
            rowPositiveFlags[row] = false;
            break;
        }

您应该始终命名事物,以便您可以像阅读书一样阅读代码。你的 i's、j's 和 k's 只会让一些简单的事情变得混乱。至于问题,只需计划您的解决方案。

在纸上手工解决问题,在代码中的注释中写下步骤,然后在注释下方编写代码,这样你所做的绝对是有意义的,而且不会矫枉过正。


这是一个很棒的网站,但是下一次,请发布一小段代码来显示您的问题。人们不应该在这里给你一个完整的家庭作业解决方案,所以不要寻找一个。只需找到索引损坏的位置并粘贴该组 5 行或任何其他错误。人们很欣赏这一点,你会得到更快、更好的答案来展示你的努力:)

于 2012-07-15T18:31:50.820 回答