模拟简单运算器的工作。实现加减乘除计算表达式输出正确结果(保留 2 位小数)。
输入格式:
输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。
输出格式:
在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。
输入样例:
1+2*10-10/2=
输出样例:
10
代码部分:先乘除后加减(实数计算,结果保留2位小数)
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
/*声明函数**定义全局变量*/
void shuru(char *pb); //获取表达式
void fenzu(double *pa,char *pb,char *pc); //拆分表达式
void youxian(double *pa,char *pb,int n); //处理优先级计算
void zhcjs(double *pa,char *pb,char *pc,int n); //最终计算及输出
int count=0; //定义全局变量 count 用来记录 计算次数
menu_0() //提示信息
{
printf("\n***********简单计算器***************\n\n");
printf("\t【】任意键开始计算\n\t【】退出 e \n\n");
printf("********计算表达式以'='结束**********\n\n");
}
int main()
{
if(count==0) //提示信息只显示 1 次
menu_0();
double a[100]={0},n;
char b[100]={0},c[100]={0},y;
y=getchar();
if(y=='e') exit(0); //获取字符,'e' 则退出
fflush(stdin); //清除缓存,准备接收表达式
shuru(b);
fenzu(a,b,c);
n=strlen(c);
youxian(a,c,n);
zhcjs(a,b,c,n);
}
/***************** 获取表达式,存入b[] **********/
void shuru(char *pb)
{
char y;
printf("表达式:");
while((y=getchar())!='=')
*pb++=y;
printf("\n\n");
}
/*****************将数字和计算符号分开存储到 a[]数组 和 c[] 字符串 **********/
void fenzu(double *pa,char *pb,char *pc)
{
double x,m=0;
int j=0;
while(*pb!='\0')
{
x=*pb-'0'; //将输入的字符逐一转换为 ascii码 与 '0'比较,
if(x>=0&&x<=9) //连续的数字字符转化为 int 数据
{
m=m*10+x; //每获取一个 int数据 加到 m*10
pb++; //指针移到下一个字符
}
else//不是数字字符 则将已经得到的数字存储在 a[] 数组中,非数字字符存储在 c[] 字符串中
{
*(pa+j)=m; //得到的数字存储在 a[] 数组中
*(pc+j)=*pb; //得到的非数字字符存储在 c[] 字符串中
m=0; //回初始值,为下一个数据做准备
j++; //下标 +1
pb++; //指针移到下一个字符
}
}
*(pa+j)=m; //得到的最后一个数字存储到 a[] 数组中
}
/*****************处理优先计算 '*' '/' *******************/
//将乘除运算的结果存储到运算符号之后的数值所在空间,前面的数值清零 ,符号位赋值 '+、-'
void youxian(double *pa,char *pc,int n)
{
int i;
for(i=0;i<=n;i++)
{
if(*(pc+i)=='*') //乘法计算
{
*(pa+i+1)=*(pa+i) * *(pa+i+1);//所得数值给后面的单元,可以继续参与后续乘除计算
*(pa+i)=0;
if(*(pc+i-1)=='-')
*(pc+i)='-';
else
*(pc+i)='+';
}
if(*(pc+i)=='/'&&*(pa+i+1)!=0) //除数不为 ‘0’ ,除法计算
{
*(pa+i+1)=*(pa+i) / *(pa+i+1);//所得数值给后面的单元,可以继续参与后续乘除计算
*(pa+i)=0;
if(*(pc+i-1)=='-')
*(pc+i)='-';
else
*(pc+i)='+';
}
}
}
void zhcjs(double *pa, char *pb, char *pc, int n)
{
/********************以下按顺序开始计算*******************************/
int i;
double m;
m=*(pa+0); //将计算结果存储在 m 中,第一个数值 a[0] 赋给 m
for(i=0;i<=n;i++)
{
if(*(pc+i)=='\0') //没有符号,输出计算结果
{
printf("计算结果: %.2lf\n\n",m); //精度保留 2 位小数,可修改
}
else if(*(pc+i)=='+') m+=*(pa+i+1); //加法计算
else if(*(pc+i)=='-') m-=*(pa+i+1); //没减法计算
else if(*(pc+i)=='*') m*=*(pa+i+1); //乘法计算
else if(*(pc+i)=='/'&&*(pa+i+1)!=0) m/=*(pa+i+1); //除数不为 ‘0’ ,除法计算
else //除数为 ‘0’ ,或者非法运算符 输出 "ERROR"
{
printf("\nERROR\n\n");break;
}
}
count++;
fflush(stdin);
main();
}