1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。关注微信公众号【嵌入式大杂烩】,回复1024,即可免费获取!
一、基本介绍
在计算器上键入的一个一元一次方程中,只包含整数、小写字母及+、-、=这三个数学符号(当然,符号“─”既可作减号,也可作负号)。方程中并没有括号,也没有除号,方程中的字母表示未知数。
输入描述 Input Description:键盘输入一个一元一次方程。
输出描述 Output Description:方程的解。
样例输入 Sample Input:6a-5+1=2-2a。
样例输出 Sample Output:a=0.750。
二、完整代码
/*----------------------------------------------------------------------------------------
Program Explain:解输入的一元一次方程(只包含整数、小写字母及+、-、=这三个数学符号), 将解方程的结果(精确至小数点后三位)输出至屏幕。
Input Description:键盘输入一个一元一次方程(如6a-5+1=2-2a)
Output Description:方程的解(如上式的解为a=0.750)
Create Date:2018.2.2 by lzn
----------------------------------------------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//一元一次方程结构体定义
typedef struct Equation
{
int k; //未知数系数
char chr; //未知数的代替字符
double x; //方程最终的解
int constant; //方程的常数项的和
}Equation;
//函数声明
Equation CalcEquation(char *str,int str_len);
/*********************************************************************************
* Function Name : main主函数
* Parameter : NULL
* Return Value : 0
* Function Explain :
* Create Date : 2018.2.2 by lzn
**********************************************************************************/
int main(void)
{
char str[100];
Equation e;
scanf("%s",str);
e = CalcEquation(str,strlen(str));
e.x = -(double)e.constant/e.k;
printf("%c=%.3lf(constant=%d,k=%d)\n",e.chr,e.x,e.constant,e.k);
return 0;
}
/*********************************************************************************
* Function Name : CalcEquation,计算一元一次方程
* Parameter : str:一元一次方程 str_len:字符串长度
* Return Value : 返回解析及处理后的结果
* Function Explain :
* Create Date : 2018.2.2 by lzn
**********************************************************************************/
Equation CalcEquation(char *str,int str_len)
{
Equation e;
e.k = 0; //k为未知数系数
e.chr; //chr为自变量的代替字符
e.constant = 0; //常数项
e.x; //最终需要求的自变量
int sign = 1; //sign用于保存正负号,1代表正号,-1代表负号
int num = 0; //num为当前数值,可以是变量的系数,也可以是常数项
int flag = 1; //flag为"="号左右两边标志,1为等号左边
/*当匹配得到字母时说明这是未知数,此时未知数的前一个字符如果是数字,则说明这就是未知数的系数。
若第一个字符为字母时,通过遍历的方法就没办法判断其系数。所以第一个字符需要单独讨论。
*/
if(str[0]=='-')
{
sign = -1;
}
else if(str[0]>='a'&&str[0]<='z')
{
e.k += 1;
e.chr = str[0];
}
else
{
num = num*10 + str[0] - '0';
}
/* 从第二个字符开始遍历至最后一个字符。"if(num)"这个分支是根据上一次循环得到的num的值来判断的,
所以有一种特殊情况是当最后一个是字符是整数时,没办法再加入到constant里,因为已经没有下一次循环了。
所以需要再循环结束后再单独讨论这种情况。*/
for(int i=1;i<str_len;i++)
{
if(str[i]>='a'&&str[i]<='z')
{
e.chr = str[i]; //未知数的代替字符
e.k += sign*num*flag; //未知数的系数之和
num = 0; //当前数值清零
sign = 1; //清除正负号标志
}
else if(str[i]>='0'&&str[i]<='9')
{
num = num*10 + str[i] - '0';
}
else
{
if(num)
{
e.constant += sign*num*flag; //常数项之和
num = 0;
sign = 1;
}
if(str[i]=='-') {sign = -1;}
else if(str[i]=='+') {sign = 1;}
else {flag = -1;}
}
}
if(str[str_len-1]>='0'&&str[str_len-1]<='9')
{
e.constant += sign*num*flag; //最后一个字符是数字的情况
}
return e; //返回解析及处理后的结果
}
程序执行结果:
另外,参考博客:http://blog.csdn.net/u012773338/article/details/41749421