C语言 | 计算器的改良

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

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式大杂烩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值