C语言程序求助!
编写一个基于命令行的四则运算计算器功能要求:
l 四则运算就是包含+、—、*、/、.(小数点)和数字的运算表达式,例如:3+2.9*(5-6/3)等
l 能够解释并执行四则运算表达式
l 能够对不符合语法的表达式给出相应的错误警告
l 能够实现科易做图算的功能,即当运算结果超过C语言本身的数据类型的表达范围时,要能够计算
l 能够做二进制、八进制、十进制、十六进制的互相转换
l 提供完善的帮助系统
l 要有良好的出错保护系统
编写一个基于命令行的四则运算计算器功能要求:
l 四则运算就是包含+、—、*、/、.(小数点)和数字的运算表达式,例如:3+2.9*(5-6/3)等
l 能够解释并执行四则运算表达式
l 能够对不符合语法的表达式给出相应的错误警告
l 能够实现科易做图算的功能,即当运算结果超过C语言本身的数据类型的表达范围时,要能够计算
l 能够做二进制、八进制、十进制、十六进制的互相转换
l 提供完善的帮助系统
l 要有良好的出错保护系统
答案:#include<stdio.h>
#include<math.h>
#include<bios.h>
#define ESC 0x11b
#define F1 0x3b00
#define MAX 256
struct fmla //MAX 字符串表达式数组下标最大值
{ //F1 ESC都是键码制
char op;
double data;
struct fmla *right;
};
typedef struct fmla mla; //装有表达式的链结构
typedef mla *fa;struct f_op
{
char op;
struct f_op *right;
};
typedef struct f_op fpr; // 栈 来存储表达式运算符
typedef fpr *fr;struct f_pr
{
double data;
struct f_pr *right; // 栈 来存储表达式数据
};
typedef struct f_pr pr;
typedef pr *fp;
char *fmla_data;
int fmla_len;
int opation(char op) //函数功能判定是不是运算符
{
switch(op)
{
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '=':return 1;
default:return 0;
}
}
int siztion(char op)
{
switch(op)
{
case '*': //比较运算符的大小
case '/':return 2;
case '+':
case '-':
case '=':return 1;
default:return 0;
}
}
double datation(char op,double pre1,double pre2)
{
switch(op)
{ //计算两位数其值
case '+':return (pre1+pre2);
case '-':return (pre1-pre2);
case '*':return (pre1*pre2);
case '/':
{
if(!pre2)
printf("\nDivisor is not 0\n");
else
return (pre1/pre2);
}
default:return 0;
}
}
fr crfop(fr cfra,char op)
{ //创建栈存储运算符
fr ctem;
ctem=(fr)malloc(sizeof(fpr));
ctem->op=op;
ctem->right=NULL;
if(cfra==NULL)
return ctem;
ctem->right=cfra;
cfra=ctem;
return cfra;
}fp crfpr(fp cfra,double data)
{
fp ctem; //创建栈存储数据
ctem=(fp)malloc(sizeof(pr));
ctem->data=data;
ctem->right=NULL;
if(cfra==NULL)
return ctem;
ctem->right=cfra;
cfra=ctem;
return cfra;
}fr fprpop(fr fra,char *op)
{
fr cfra;
if(fra!=NULL)
{ //取出运算符栈
cfra=fra;
fra=fra->right;
*op=cfra->op;
free(cfra);
return fra;
}
else
*op=-1;
}fp foppop(fp fpa,double *data)
{
fp cfra;
if(fpa!=NULL)
{ //取出数据栈
cfra=fpa;
fpa=fpa->right;
*data=cfra->data;
free(cfra);
return fpa;
}
else
*data=-1;
}int bolfp(fr frop)
{
if(frop!=NULL) //检查栈是不是为空
return 1;
else
return 0;
}int mlation(char aformla,char *op,double *data)
{
if(opation(aformla))
{
*op=aformla; //处理运算表达式返回 运算符 和数据
*(fmla_data+fmla_len)='\0';
*data=atof(fmla_data);
fmla_data=NULL;
fmla_len=0;
return 1;
}
*(fmla_data+fmla_len)=aformla;
fmla_len++;
return 0;}
fa crfmla(char *formla,int len)
{
fa mlatem;
fa a_mlatem;
fa b_mlatem; //把表达式字符串形式 转换 链表形式 把字符数据形式转换 链表double形式
int i;
char op;
double data;
a_mlatem=(fa)malloc(sizeof(mla));
a_mlatem->data=0;
a_mlatem->op=0;
a_mlatem->right=NULL;
for(i=0;i<len;i++)
{
if(mlation(formla[i],&op,&data))
{
mlatem=(fa)malloc(sizeof(mla));
mlatem->op=op;
&nbs