多功能计算软件c语言,求一个模拟计算器程序

这是我的看法,请采纳。

# include

# include

# include

# include

# define MAX_OPERATOR_NUM 100//运算符栈数组长度

# define MAX_DATA_NUM 100//运算数栈数组长度

typedef struct OPStack//定义运算符栈

{

char opStack[MAX_OPERATOR_NUM];

int top;

}OPStack, *pOPStack;

typedef struct DATAStack//定义操作数栈

{

double stack[MAX_DATA_NUM];

int top;

}DATAStack, *pDATAStack;

void InitpOPStack(pOPStack &pOStack)//初始化运算符栈

{

if( !(pOStack = (pOPStack)malloc(sizeof(OPStack))))//为运算符栈分配空间

{

printf("分配内存空间失败!\n");

exit(-1);

}

pOStack->top = -1;

}

void InitpDATAStack(pDATAStack &pDStack)//初始化运算数栈

{

if( !(pDStack = (pDATAStack)malloc(sizeof(DATAStack))))//为运算数栈分配空间

{

printf("分配内存空间失败!\n");

exit(-1);

}

pDStack->top = -1;

}

void PushOPStack(pOPStack &pOStack, char ch)//运算符进栈

{

pOStack->opStack[++(pOStack->top)] = ch;

}

void PopOPStack(pOPStack &pOStack, char &ch)//运算符出栈

{

ch = pOStack->opStack[pOStack->top];

pOStack->top--;

}

void PushDATAStack(pDATAStack &pDStack, double d)//运算数进栈

{

++(pDStack->top);

pDStack->stack[pDStack->top] = d;

}

void PopDATAStack(pDATAStack &pDStack, double &d)//运算数出栈

{

d = pDStack->stack[pDStack->top];

pDStack->top--;

}

void ClearpOPStack(pOPStack &pOStack)//清空运算符栈

{

pOStack->top = -1;

}

void ClearpDATAStack(pDATAStack &pDStack)//清空运算数栈

{

pDStack->top = -1;

}

char GetToppOPStack(pOPStack &pOStack)//获取运算符栈顶元素

{

return pOStack->opStack[pOStack->top];

}

double GetToppDATAStack(pDATAStack &pDStack)//获取运算数栈顶元素

{

return pDStack->stack[pDStack->top];

}

bool IsOP(char &ch)//区分 运算符 和 运算数 的函数,是运算符时返回true,否则返回false

{//判断是否为符号

if ( (ch == '+') || (ch == '-') || (ch == '*') || (ch == '/') || (ch == '=') || (ch == 'A') || (ch == 'S') || (ch == 'a') || (ch == 's') || (ch == '(') || (ch == ')') )

return true;

else

return false;

}

char Precede(char op1, char op2) //参考《数据结构》(C语言版)第53页 3。

2。5表达式求值 表 3。1

{

char tab[9][10];//定义字符串的二维数组来存放运算符优先级的关系

strcpy( tab[0], ">>" );

strcpy( tab[1], ">>" );

strcpy( tab[2], ">>>><>" );

strcpy( tab[3], ">>>><>" );

strcpy( tab[4], ">>>E>>>>" );

strcpy( tab[6], ">>>><>>>>" );

strcpy( tab[7], ">>>><>>>>" );

strcpy( tab[8], "= 0)//判断被开方数是否为0,若为0,退出程序

{

s = sqrt(b);//调用SQRT()函数

break;

}

else

{

printf("\n#### 求负数的平方根是非法运算。

程序终止! ####\n");

exit_E();//打印结束菜单

exit(-1);

}

}

return s;

}

char ChangeChar(char &c)//通过ChangeChar函数来把a、s的小写字母改为大写的

{

if( c == 'a' )

c = 'A';

else if( c == 's' )

c = 'S';

return c;

}

//参考《数据结构》(C语言版)第53页 3。

2。5表达式求值 算法3。4EvaluateExpression()函数

void EvaluateExpression()//计算函数:读入表达式,并计算结果

{

pOPStack pOStack;//声明运算符栈

pDATAStack pDStack;//声明运算数栈

double result;//存运算的结果

char x, theta, c;//c存放读取的字符,x、theta存放运算符栈的栈顶元素

int flag, data;//标识符,用来读入连续的数字

double s;

double getd;//存放GetTop***的结果

double a, b, cc;//a,b存放数据栈出栈的栈顶元素, c存放运算结果

flag = 0;//初始化标识符,用来判断字符串中的连续数字

data = 0;//

InitpOPStack(pOStack);//初始化运算符栈

InitpDATAStack(pDStack);//初始化运算数栈

PushOPStack(pOStack, '=');//在运算符栈底放入'='

printf("&请输入表达式以'='结束:");

c = getchar();//读入字符

ChangeChar(c);//通过调用函数来实现把小写的a、s改为大写的A、S

while( c != '=' || GetToppOPStack(pOStack) != '=')

{

if( !IsOP(c) )//不是运算符进栈

{

s = c - '0';//把字符转化为数字

if ( flag == 1 )

{

PopDATAStack(pDStack, getd);

s = getd*10 + s;

}

PushDATAStack(pDStack, s);

flag = 1;

c = getchar();

ChangeChar(c);

}

else

{

flag = 0;

switch( Precede(GetToppOPStack(pOStack), c) )//输入元素和运算符栈顶元素比较

{

case ''://退栈并将运算结果进栈

PopOPStack(pOStack, theta);

PopDATAStack(pDStack, b);

PopDATAStack(pDStack, a);

cc = Operate(a, theta, b);

PushDATAStack(pDStack, cc);

break;

}//switch

}//else

}//while

result = GetToppDATAStack(pDStack);//运算结束时,运算数栈的栈底元素就是计算结果

ClearpOPStack(pOStack);//清空运算符栈

ClearpDATAStack(pDStack);//清空运算数栈

printf("->计算结果为:%。

2f\n\n", result);//输出运算结果

return ;

}

void print_user()//欢迎界面

{

printf("\n欢迎使用C语言版模拟计算器\n\n");

printf("************************************************************************\n");

printf("|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n");

printf("|模拟计算器使用说明|\n\n");

printf("| 作者:谢先斌|\n\n");

printf("|本程序包括对'+'、'-'、'*'、'/'、'()'的运算|\n");

printf("|本程序中ABS()算用A()替代、SQRT()运算用S()代替|\n");

printf("|本程序中的一切字母均不区分大小写|\n");

printf("正确的表达式如:1+A(7-8)+S(9*8)=\n");

printf("|输入'='表示表达式输入结束!!|\n\n");

printf("| 欢迎使用!!!-->--> |\n");

printf("|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n");

printf("************************************************************************\n\n");

}

int main()//主函数

{

char in;

bool b;//标识符,用来标识是否结束程序

b = true;//初始化,不结束

print_user();//打印欢迎界面

printf("*请确认使用计算器Y/N:");

while(1)

{

scanf("%c", &in);//确认是否继续操作

getchar();//吃掉会车,避免干扰

switch(in)

{

case 'Y':

case 'y':

{

EvaluateExpression();//进入计算函数:读入表达式,并计算结果

break;

}

case 'N':

case 'n':

{

exit_E();

b = false;

break;

}

//default:

//printf("**输入错误,请重新输入Y/N:");

//break;

}

if(b==false)//如果 b==false ,退出整个程序

break;

printf("*您确定要继续使用计算机Y/N:");

getchar();//用getchar吃掉回车,避免对后续输入中in的干扰

}

return 0;

}

全部

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值