欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-07 12:28:08
...

一、基本介绍

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

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

欢迎扫描左侧二维码关注我的微信公众号(或者搜索:zhengnian-2018)