编程练习——计算器的改良
程序员文章站
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)
推荐阅读
-
测试代码的练习——python编程从入门到实践
-
1.java小作业-计算1到100的整合-指定输入多少行输出就打印多少行-打印24小时60分钟每一分钟-重载基础练习-面向java编程初学者
-
Python编程小练习 | 算法题:津巴布韦的鸡蛋价格
-
python实现计算器功能的小练习
-
类的练习2——python编程从入门到实践
-
c++编程的一些练习改错题
-
逆波兰计算器的Java编程实现
-
NOIP 2000 计算器的改良
-
《Python核心编程》练习题之2-8:更新上一个练习的解决方案,修改它以使你的聊天服务现在成为全双工模式,意味着通信两端都可以发送并接收消息,并且二者相互独立
-
《Java语言程序设计》编程练习6.31(财务应用程序:信用卡号的合法性)