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、j、k は単純な混乱を招くだけです。問題については、解決策を計画してください。

紙に手書きで問題を解決し、コードのコメントに手順を記述し、コメントの下にコードを記述して、実行することが確実に理にかなっていてやり過ぎにならないようにします。


これは素晴らしいサイトですが、次回は、問題を示す小さなコードを投稿してください。ここで宿題の完全な解決策を提供してはならないので、探してはいけません。インデックスが壊れている場所を見つけて、その 5 行のセットまたはその他の問題を貼り付けるだけです。人々はそれを高く評価し、努力を示すことでより速く、より良い答えを得るでしょう:)

于 2012-07-15T18:31:50.820 に答える