0%

利用C语言解二元一次方程组

本文图片为Base64,请确保你的浏览器支持!!

项目源地址:https://gitee.com/hank9999/jie_eryuans_first_equation_group__c
这里只是略略思路

构思

做一个程序,我们首先要知道,我们想用程序做什么,我们改怎么写

解二元一次方程组,基本上就是数学计算,主要就是看算法

基本环境准备

下载并安装vs2017(十几个GB,请确保C盘空间充足)

构思

构思算法,写出算法
课本图
1pic
构思程序,将算法添加入程序

正式开写!

写出大体程序框架

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <stdlib.h>

int main()
{


system("pause");
return 0;
}

定义变量

1
double a = 0.0, b = 0.0, c = 0.0, d = 0.0, e = 0.0, f = 0.0, x = 0.0, y = 0.0;

根据数学课本上的方法求出a’22 和b’2
定义变量e2 f2 代替a’22 和b’2

1
double e2 = 0.0, f2 = 0.0;

用scanf输入,因为vs2017对scanf有警告,所以用scanf_s

1
scanf_s("%lf,%lf,%lf,%lf,%lf,%lf", &a,&b,&c,&d,&e,&f);

然后到了,我写的算法出场的时候了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if (a != 0)
{
e2 = e - (d / a)*b;
f2 = f - (d / a)*c;
}
else {
y = c / b;
x = (f - e * y) / d;
printf("算法一\n原方程组的解\nx=%lf\ny=%lf\n分数形式\nx=%lf/%lf\ny=%lf/%lf\n", x, y, (f - e * y), d, c, b);
}
if (a != 0 && e2 != 0)
{
y = f2 / e2;
x = (c - b * y) / a;
printf("算法一\n原方程组的解\nx=%lf\ny=%lf\n分数形式\nx=%lf/%lf\ny=%lf/%lf\n", x, y, (c - b * y), a, f2, e2);
}
else
{
printf("算法一暂时不支持");
}

如果a=0,那我们可以直接通过c/b求出y
那么带入第二个方程式,就可以求出x了
那么a=0的话,解已经出来了

我们继续写a不等于0的时候
如果a不等于0且e2不等于0我们才能继续

在从网上找来个算法二

1
2
3
x2 = (c*e - b * f) / (a*e - b * d); //x
y2 = (c*d - a * f) / (b*d - a * e); //y
printf("算法二\n原方程组的解\nx=%lf\ny=%lf\n分数形式\nx=%lf/%lf\ny=%lf/%lf\n", x2, y2, (c*e - b * f), (a*e - b * d), (c*d - a * f), (b*d - a * e));

emmmm算法一和二差别真大。。。
输出也带在算法里了

在 scanf前加几个提示

1
2
3
4
5
printf("二元一次方程计算程序\n");
printf("一般方程组形式\n");
printf("{ax+by=c\n{dx+ey=f\n");
printf("版本2.7 更新判断程序 \n暂不支持无限小数,过长小数,无理数,错误方程!\nby hank9999\n");
printf("例子:1,1,2,1,-1,0\n现在请输入a,b,c,d,e,f:\n");

后续版本,加了判断,只有方程符合才继续执行
判断条件来自百度百科

1
2
3
4
5
6
7
8
9
10
11
12
13
if ((a / d) != (b / e))
{
printf("\n该程组有一组解\n");

}
else if ((a / d) == (b / e) == (c / f))
{
printf("\n该方程组有无数组解\n");
}
else if ((a / d) == (b / e) != (c / f))
{
printf("\n该方程组无解\n");
}

程序代码,具体请去gitee看https://gitee.com/hank9999/jie_eryuans_first_equation_group__c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main() {

double a = 0.0, b = 0.0, c = 0.0, d = 0.0, e = 0.0, f = 0.0, x = 0.0, y = 0.0;
double e2 = 0.0, f2 = 0.0;
double x2 = 0.0, y2 = 0.0;

printf("二元一次方程计算程序\n");
printf("一般方程组形式\n");
printf("{ax+by=c\n{dx+ey=f\n");
printf("版本2.7 更新判断程序 \n暂不支持无限小数,过长小数,无理数,错误方程!\nby hank9999\n");
printf("例子:1,1,2,1,-1,0\n现在请输入a,b,c,d,e,f:\n");

scanf_s("%lf,%lf,%lf,%lf,%lf,%lf", &a,&b,&c,&d,&e,&f);
if ((a / d) != (b / e))
{
printf("\n该程组有一组解\n");
//算法一
if (a != 0)
{
e2 = e - (d / a)*b;
f2 = f - (d / a)*c;
}
else {
y = c / b;
x = (f - e * y) / d;
printf("算法一\n原方程组的解\nx=%lf\ny=%lf\n分数形式\nx=%lf/%lf\ny=%lf/%lf\n", x, y, (f - e * y), d, c, b);
}
if (a != 0 && e2 != 0)
{
y = f2 / e2;
x = (c - b * y) / a;
printf("算法一\n原方程组的解\nx=%lf\ny=%lf\n分数形式\nx=%lf/%lf\ny=%lf/%lf\n", x, y, (c - b * y), a, f2, e2);
}
else
{
printf("算法一暂时不支持");
}

//算法二

x2 = (c*e - b * f) / (a*e - b * d); //x
y2 = (c*d - a * f) / (b*d - a * e); //y

printf("算法二\n原方程组的解\nx=%lf\ny=%lf\n分数形式\nx=%lf/%lf\ny=%lf/%lf\n", x2, y2, (c*e - b * f), (a*e - b * d), (c*d - a * f), (b*d - a * e));

}
else if ((a / d) == (b / e) == (c / f))
{
printf("\n该方程组有无数组解\n");
}
else if ((a / d) == (b / e) != (c / f))
{
printf("\n该方程组无解\n");
}



system("pause");
return 0;
}