思路:
-
.首先每个字符该如何进行读取,个人选择的读取方式是读一个处理一个,并没有创造字符串数组,也就是简单一个char c利用循环读取即可
-
每个字符读取后该如何处理。
-
创建一个int k0,kx来记录数字的总数和未知数的总数,然后最后相除即可出结果
-
如果读入的是数字,那么就定义一个s记录下每次读取的数字,由于读入的数字很可能大于10,那么用秦九韶方法记录,
s = s*10 + c - ‘0’;但不需要加到k0中,等下次遇到加减号再进行加减 -
当遇到的字母的时候,这时候代表字母前面的数字已经记录在s里面了,这个时候只需要
kx += s * deng * jiaj;
在这里解释下,deng和jiaj是什么东西,deng用来记录当前是在等号前还是等号后,字符串在等号前,那么初始化deng =1,如果是在等号后面那么deng = -1,这样式子前后的符号就可以统一了。而jiaj是用来记录这个数字的符号是什么,如果前面是负号,那么jiaj会被置为-1,如果为正好,那么jiaj会被置为1,由于式子刚开始一般都是正的,那么jiaj初始化1. -
当遇到符号为‘-’也就是负号时,这个时候重置jiaj,也就是jiaj = -1;然后将负号前面的数字进行相加,也就是
k0 += s * deng *jiaj; -
当遇到符号为‘+’也就是正号时,这个时候重置jiaj,也就是jiaj = 1;然后将正号前面的数字进行相加,也就是 k0 += s * deng *jiaj;
-
当遇到符号为等号的时候,c == ‘=’,这个时候到了式子的右边,那么就需要将deng = -1;并且将jiaj = 1然后将等号前面的数字进行相加,也就是 k0 += s * deng *jiaj;
-
注意一下,每次相加后都要将s重置为0,这样方便下一次的相加
-
还要注意一种情况,例如当x + x = 2的时候,x前面是没有数字的,那么就需要附加一个条件
if(s == 0) s= 1;
建议代码和思路结合着看
代码:
#include<iostream>
using namespace std;
#include<cstring>
#include<iomanip>
int main()
{
int s = 0, deng = 1, jiaj = 1;
char c, x;//x用于记录未知数
int kx = 0, k0 = 0;
//6a-5+a = 2-2a;
while (cin >> c)
{
if (c >= 'a' && c <= 'z')
{
x = c;//用x记录下未知数
if (s == 0)s = 1;
kx += s * deng * jiaj;
s = 0;
}
if (c >= '0' && c <= '9')
{
s = s * 10 + c - '0';//c - '0'可以将其转为数字
//此语句用于记录数字
}
if (c == '=')// 当遇到等号的时候
{
//首先先把记录的数字先加上
k0 += s * deng * jiaj;
s = 0;
deng = -1;
jiaj = 1;
}
if (c == '-')
{
k0 += s * deng * jiaj;
s = 0;
jiaj = -1;
}
if (c == '+')
{
k0 += s * deng * jiaj;
s = 0;
jiaj = 1;
}
}
k0 += s * deng * jiaj;
cout << fixed << setprecision(3) << x << "=" << -1.0 * k0 / kx << endl;
return 0;
}