在c++中使用嵌套循环求解一阶联立方程

Solving 1st degree simultaneous equations using nested loops in c++

本文关键字:联立方程 嵌套循环 c++      更新时间:2023-10-16

我有一个问题,需要我编写一个程序来找到一对一阶联立方程的解。我必须详尽地测试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=%dn", x, y);
            }
    return 0;
}

当我编译并运行程序时,我会得到

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

很明显,这个程序有一些错误。它们是什么?

此外,如果我想打印一条消息,说只能在[-100, 100]范围内找到一次解决方案,我应该如何将这个printf函数插入程序中?

我已经有一段时间没有进行c风格的文件I/O了,但我很快就注意到了几个明显的错误:

  • 您应该验证文件是否已打开
  • 您应该验证fscanf每次读取预期的项目数
  • 您可能需要%d个格式说明符之间的空格(对此不确定)
  • 您不应该将第二组参数读取到与第一组参数相同的变量中
  • 您应该只读取第二组参数一次(而不是在循环中有条件地读取)

此外,为什么需要使用嵌套循环?有更好的方法来解决这个问题。

编辑:提供的输出甚至来自示例代码吗?Y是如何得到-50的值的?

有一些问题。首先,它确实得到了正确的答案: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;

如果行列式为零,那么方程是平行的。

当然,你的大多数答案都不是整数,所以你可能喜欢使用浮点运算。

我非常喜欢在文件完成后关闭它们。

我不确定你想要什么,但在任何情况下,用int代替double都不会有用

#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=%dn", x, y);
    }
    return 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开始,第一个if函数中的A、B和C被分配给第二组系数,而不是第一组。fscanf函数将进行第二次扫描,其中没有第三组系数,因此它仍将扫描第二组系数。这导致生成满足y=-99的x和y的列表时出错,这不是程序应该做的!

因此,我尝试将第二个fscanf函数放在循环函数之外,它运行得很好。此外,为了打印一条消息,即在没有解决方案的情况下,只能在[-100100]范围内找到一次解决方案,我应用了布尔代数的概念。这是更正后的代码:

#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=%dn", x, y);
         }
    }
    if(NOSOLUTION == 1)
        printf("Integer solution not found in range [-100, 100] n");
    return 0;
}

尽管如此,还是非常感谢那些做出回应的人!