您的位置:首页 > 编程语言

编程练习——计算器的改良

2018-02-02 18:03 267 查看
一、基本介绍

        在计算器上键入的一个一元一次方程中,只包含整数、小写字母及+、-、=这三个数学符号(当然,符号“─”既可作减号,也可作负号)。方程中并没有括号,也没有除号,方程中的字母表示未知数。

输入描述 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>

/
9f6c
/一元一次方程结构体定义
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: