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 格式说明符之间的空格(不确定这个)
  • 您不应将第二组参数读入与第一组相同的变量中
  • 您应该只读取第二组参数一次(不是有条件地在循环中)

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

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

于 2013-02-19T04:17:09.623 回答
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;

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

当然,您的大多数答案都不是整数,因此您可能喜欢使用浮点数。

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

于 2013-02-19T05:19:40.020 回答
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 函数将进行第二次扫描,其中没有第三组系数,因此它仍然会扫描第二组系数。这会导致生成 x's 和 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;
}

不过,非常感谢那些回复的人!

于 2013-02-22T12:41:38.647 回答
0

我不确定您要的是什么,但是在任何情况下发送一个 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=%d\n", x, y);
    }
    return 0;
}
于 2013-02-19T03:37:35.347 回答