2013-02-19 70 views
1

我有一個問題,需要我編寫一個程序來找到一對一階聯立方程的解。我必須詳盡地測試x和y的所有值以找到整數解。兩個方程的係數A,B和C都在一個名爲「input.txt」的數據文本文件中。在C++中使用嵌套循環求解1度聯立方程

文本文件具有以下數據:

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函數插入到程序中?

回答

0

我不知道你問,但在雙重的地方發送一個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; 
} 
+0

我正在創建一個diophantine線性方程求解器,其中的解是整數。在這種情況下使用double是沒有意義的。我想問的是我的代碼的問題,你可以看到輸出有2組x和y,線性聯立方程只能有一組x和y解。 – electroniclearner 2013-02-19 05:10:39

2

這已經有一段時間,因爲我已經做ç無論如何也不會有用風格的文件I/O,但也有幾個明顯的錯誤,我很快發現:每次

  • 您應該確認該文件被打開
  • 您應該確認的fscanf讀取項目的預期數量
  • 您可能需要在%d格式說明符之間有空格
  • 您不應將第二組參數讀入與第一組相同的變量
  • 您應該只讀取第二組參數一次(沒有條件地在循環中)

此外,爲什麼你需要使用嵌套循環?有更好的方法來解決問題。

編輯:提供的輸出是否來自示例代碼? Y如何得到值-50?

+0

我輸入錯誤:x和y應該從-100開始。但即使糾正它,我仍然得到我顯示的輸出。順便說一句,這是一個家庭作業問題,它確定了這樣的要求。 我想要做的是首先掃描第一組係數,1 0 99,並使用循環找到滿足第一個方程的x和y的集合。接下來,我掃描第二組係數,將A,B和C分配給第二組。然後,我打印滿足第二個等式的x和y。 但是,我仍然不成功,你可以看到輸出有2組x和y。 – electroniclearner 2013-02-19 05:09:21

+0

+1積分4和5是至關重要的。 1,2也很有用。 – 2013-02-19 07:30:03

+0

我想我應該猜到這是一個家庭作業問題。您是否嘗試過使用調試器運行程序並將您的期望與實際發生的情況進行比較?如果你發現第一個方程的解決方案不是第二個方案的解決方案,你認爲會發生什麼? – jerry 2013-02-19 13:46:12

1

有幾個問題。首先,它沒有得到正確的答案是: 99 X 1 + -50 X 0 == 99

不過,在找到一個答案,它比寫你原來的A,B,C值和相匹配的任何x的值。然後它讀取文件的結尾,因此我不確定A,B和C的內容。

您應該在找到一個答案後停止搜索。

一個更好的辦法來發現它是這樣的:

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

如果行列式爲零,則方程是平行的。

當然你的答案大部分不會是整數,所以你可能喜歡使用浮動。

我很喜歡在完成文件時關閉文件。

+0

如果您只是在整數結果之後,則可以使用模運算符來測試結果是否爲整數。 – 2013-02-19 05:50:16

+0

同意儘快關閉文件是很好的習慣。至於A,B和C在讀過文件結尾時會發生什麼,如果我正確記憶fscanf的工作方式,它們應該保持不變。 – jerry 2013-02-20 03:47:31

0

經過幾天的琢磨,我終於明白了什麼是錯的。

錯誤是將第二個fscanf函數放入循環中。當第二個fscanf函數在循環中時,它有第二次掃描的趨勢等等。

我會參考我的代碼來解釋它。當程序成功找到滿足第一組係數的第一組x和y或方程x = 99,即x = 99和y = -100時,第二fscanf函數將掃描第二組係數,或等式2y = -100。 if函數將檢查x和y的集合是否滿足2y = -100。顯然,x = 99和y = -100不滿足2y = -100,所以for循環函數將重複x = 99和y = -99的過程。但是,從y = -99開始,第1個if函數中的A,B和C被分配給第二組係數而不是第一個。並且fscanf函數將第二次掃描,其中沒有第三組係數,因此它仍將掃描第二組係數。這導致產生一個滿足y = -99的x和y列表的錯誤,這不是程序應該做的!

因此,我試着把第二個fscanf函數放在循環函數之外,它的工作很完美。此外,要打印該消息說,解決方案不能在[-100,100]範圍內找到,只有一次沒有解決方案時,我應用了布爾代數的概念。這裏是正確的代碼:

#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; 
} 

儘管如此,非常感謝那些迴應!