1

1 次連立方程式のペアの解を見つけるプログラムを作成する必要がある問題があります。整数解を見つけるには、x と y のすべての値を徹底的にテストする必要があります。両方の式の係数 A、B、および C は、"input.txt" というデータ テキスト ファイルにあります。

テキスト ファイルには、次のデータが含まれています。

1 0 99
0 2 -100

以下は私のプログラムです:

#include <stdio.h>;

#define FILENAME "input.txt"

int main() {
    int A, B, C, x, y;
    FILE *input;
    input = fopen(FILENAME,"r");
    fscanf(input,"%d%d%d", &A,&B,&C);

    for(x = -100; x <= 100; x++)
        for(y = -100; y <= 100; y++)
            if(A*x+B*y==C){
                fscanf(input,"%d%d%d", &A,&B,&C);
                if(A*x+B*y==C)
                    printf("X=%d, Y=%d\n", x, y);
            }

    return 0;
}

プログラムをコンパイルして実行すると、

X=99, Y=-50
X=100, Y=-50

明らかに、プログラムにはいくつかのエラーがあります。彼らは何ですか?

また、範囲内で解が見つからないというメッセージを[-100, 100]一度だけ出力したい場合、この printf 関数をどのようにプログラムに挿入すればよいでしょうか?

4

4 に答える 4

2

C スタイルのファイル I/O を行ってからしばらく経ちましたが、すぐに気づいた明らかなエラーがいくつかあります。

  • ファイルが開かれていることを確認する必要があります
  • 毎回 fscanf が予想されるアイテム数を読み取ることを確認する必要があります
  • %d フォーマット指定子の間にスペースが必要な場合があります (これについてはわかりません)。
  • パラメータの 2 番目のセットを最初のセットと同じ変数に読み込まないでください。
  • 2 番目のパラメーター セットは 1 回だけ読み取る必要があります (ループ内で条件付きではありません)。

また、ネストされたループを使用する必要があるのはなぜですか? 問題を解決するためのより良い方法があります。

編集:提供された出力はサンプルコードからでもありますか? Y はどのようにして値 -50 を取得しますか?

于 2013-02-19T04:17:09.623 に答える
1

いくつかの問題があります。まず、99 x 1 + -50 x 0 == 99 という正しい答えが得られます。

しかし、1 つの答えが見つかったので、元の A、B、C の値が上書きされ、x の任意の値が一致します。その後、ファイルの終わりを過ぎて読み取るため、その後の A、B、および C の内容はわかりません。

答えが 1 つ見つかったら、検索を停止する必要があります。

それを見つけるためのより良い方法はこれです:

Determinant = A1 * B2 - A2 * B1;
x = (C1 * B2 - C2 * B1) / Determinant;
y = (C2 * A1 - C1 * A2) / Determinant;

行列式がゼロの場合、方程式は並列です。

もちろん、答えのほとんどは整数ではないため、浮動小数点数を使用することをお勧めします。

私は、ファイルが完成したら閉じるのが大好きです。

于 2013-02-19T05:19:40.020 に答える
0

コードについて何日も熟考した後、私はついに何が悪いのかを理解しました。

間違いは、2番目のfscanf関数をループに入れることです。2番目のfscanf関数がループ内にある場合、2回目以降にスキャンする傾向があります。

私のコードを参考にして説明します。プログラムが最初の係数のセットを満たすxとyの最初のセット、または方程式x = 99、つまりx=99とy=-100を正常に検出すると、2番目のfscanf関数は2番目の係数のセットをスキャンします。または方程式2y=-100。if関数は、xとyのセットが2y=-100を満たすかどうかをチェックします。明らかに、x=99およびy=-100は2y=-100を満たさないため、forループ関数はx=99およびy=-99で手順を繰り返します。ただし、y = -99以降では、関数が最初の係数のセットではなく2番目の係数のセットに割り当てられている場合、1番目のA、B、およびCになります。また、fscanf関数は2回目のスキャンを行います。この場合、3番目の係数のセットはないため、2番目の係数のセットは引き続きスキャンされます。これにより、xとyのリストを生成するときにエラーが発生します。

したがって、2番目のfscanf関数をループ関数から外してみましたが、完全に機能しました。また、解がない場合に[-100、100]の範囲で解が1回しか見つからないというメッセージを印刷するために、ブール代数の概念を適用しました。修正されたコードは次のとおりです。

#include <stdio.h>
#define FILENAME "input.txt"

int main()
{
    int A_1, B_1, C_1, A_2, B_2, C_2, x, y, NOSOLUTION;
    FILE *input;
    input = fopen(FILENAME,"r");
    fscanf(input,"%d%d%d", &A_1,&B_1,&C_1);
    fscanf(input,"%d%d%d", &A_2,&B_2,&C_2);
    NOSOLUTION = 1;
    for(x = -100; x <= 100 ; x++){
       for(y = -100; y <=100; y++)
         if(A_1*x+B_1*y==C_1 && A_2*x+B_2*y==C_2)
         {
            NOSOLUTION = 0;
            printf("X=%d, Y=%d\n", x, y);
         }
    }
    if(NOSOLUTION == 1)
        printf("Integer solution not found in range [-100, 100] \n");
    return 0;
}

それにもかかわらず、応答してくれた人々に感謝します!

于 2013-02-22T12:41:38.647 に答える
0

何を求めているのかわかりませんが、doubleの代わりにintを送信しても、どのような場合でも役に立ちません。

#include <stdio.h>
#define FILENAME "input.txt"
int main()
{
double A, B, C; <----------------
int x, y; <-------------------
FILE *input;
input = fopen(FILENAME,"r");
fscanf(input,"%d%d%d", &A,&B,&C);

for(x = 0; x <= 100; x++)
    for(y = 0; y <= 100; y++)
    if(A*x+B*y==C){
    fscanf(input,"%d%d%d", &A,&B,&C);
          if(A*x+B*y==C)
          printf("X=%d, Y=%d\n", x, y);
    }
    return 0;
}
于 2013-02-19T03:37:35.347 に答える