2013-02-19 97 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; 
} 

尽管如此,非常感谢那些回应!