如何用c语言实现 5个5c语言加减乘除代码得到5?

用C语言实现超长整数的加减乘除四则运算_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
用C语言实现超长整数的加减乘除四则运算
&&C语言程序设计
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢c语言:表达式求值实现(包含加减乘除括号)
这道题不难,但是当你认真去编代码的时候,还是要考虑好多细节,所以不能只停留在看懂的层面上,不去实践你永远不知道你到底掌握了没有,加油!
之前的表达式求值不包括括号运算,现将改进后的代码和源代码粘在上面,便于以后的复习。
一.不包括括号运算
#define STACK_INIT_SIZE 100
typedef struct
char date[STACK_INIT_SIZE];
//操作符结构体
typedef struct
double date[STACK_INIT_SIZE];
//操作数结构体
//操作符相关操作
OptrStack *Init_OptrStack();
int Empty_OptrStack(OptrStack *s);//判空栈
int Push_OptrStack(OptrStack *s, char x);//入栈(注意:判断栈是否已满)
char Pop_OptrStack(OptrStack *s, char x);//出栈(注意:判断栈是否已空)
char GetTop_OptrStack(OptrStack *s, char x);//取栈顶元素,先判空
//操作数相关操作
OpndStack *Init_OpndStack();//置栈空
int Empty_OpndStack(OpndStack *t);//判空栈
Push_OpndStack(OpndStack *t, double y);//入栈(注意:判断栈是否已满)
double Pop_OpndStack(OpndStack *t, double y);//出栈(注意:判断栈是否已空)
double GetTop_OpndStack(OpndStack *t, double y);//取栈顶元素
//表达式求值函数
void Error(char *s);
//错误处理函数
int Judge_optr(char ch);
//用于判断字符ch是否是运算符
int Operate(int a, int b, char top);
//用于计算当前的值,并将该值返回
void Jsbds_operate(char str[]);
//读入一个简单算术表达式的值
//操作符函数实现部分
OptrStack *Init_OptrStack()
OptrStack *s;
s = (OptrStack *)malloc(sizeof(OptrStack));
s-&top = -1;
int Empty_OptrStack(OptrStack *s)//判空栈
if (s-&top != -1)
Push_OptrStack(OptrStack *s, char x)//入栈(注意:判断栈是否已满)
if (s-&top == (STACK_INIT_SIZE - 1))
s-&date[++s-&top] =
char Pop_OptrStack(OptrStack *s, char x)//出栈(注意:判断栈是否已空)
if (!Empty_OptrStack(s))
x = s-&date[s-&top];
char GetTop_OptrStack(OptrStack *s, char x)//取栈顶元素,先判空
if (!Empty_OptrStack(s))
x = s-&date[s-&top];
//操作数函数实现部分
OpndStack *Init_OpndStack()//置栈空
OpndStack *t;
t = (OpndStack*)malloc(sizeof(OpndStack));
t-&top = -1;
int Empty_OpndStack(OpndStack *t)//判空栈
if (t-&top != -1)
Push_OpndStack(OpndStack *t, double y)//入栈(注意:判断栈是否已满)
if (t-&top == (STACK_INIT_SIZE - 1))
t-&date[++t-&top] =
double Pop_OpndStack(OpndStack *t, double y)//出栈(注意:判断栈是否已空)
if (!Empty_OpndStack(t))
y = t-&date[t-&top];
double GetTop_OpndStack(OpndStack *t, double y)//取栈顶元素
if (!Empty_OpndStack(t))
y = t-&date[t-&top];
//表达式求值函数实现
void Error(char *s)
//错误处理函数
std::cout && s &&
int Judge_optr(char top)//用于判断字符ch是否是运算符
//cout && top && &test& &&
switch (top)
case '+':
case '-':
case '*':
case '/':
double Operate(double b, double a, char top)
//用于计算当前的值,并将该值返回
double c = 0;
switch (top)
case '+':
case '-':
case '*':
case '/':
if (a == 0)
printf(&分母为零!\n&);
printf(&输入的字符非法!\n&);
void Jsbds_operate(char str[])
//读入一个简单算术表达式,并将计算结果返回到主函数
OptrStack *optr = Init_OptrStack();
//初始化操作符栈
OpndStack *opnd = Init_OpndStack();
//初始化操作数栈
//i,j为循环变量,a,b接收从操作数栈中出栈的元素
//接收将字符数转换为浮点数的值
double a = 0;
double b = 0;
double c = 0;
char d[100];
//储存字符串中连续的&数&
char top = 0;
//接收从操作符栈中出栈的元素
for (i = 0; str[i]; i++)
//将字符串中的元素按顺序入到栈中
switch (str[i])
case '+':
case '-':
/*先判断当前运算符与操作符栈栈顶元素的优先级,如果高于栈顶元素,则入栈;
小于栈顶元素,则从操作数栈中依次出两个数,并将操作符栈中栈顶元素出栈,
再将从操作数栈中出的两个数,按从操作符栈栈中出的运算符运算,
并将结果压入操作数栈中,再将当前的操作符压入操作符栈中。*/
if (!Empty_OptrStack(optr))
//当操作符栈为空的时候压栈保存
Push_OptrStack(optr, str[i]);
a = Pop_OpndStack(opnd, a); //接收从操作数栈中出栈的元素
b = Pop_OpndStack(opnd, b); //接收从操作数栈中出栈的元素
top = Pop_OptrStack(optr, top);//接收从操作符栈中出栈的元素
c = Operate(b, a, top);
Push_OpndStack(opnd, c);
//将计算后的值压入操作数栈中
Push_OptrStack(optr, str[i]);
case '*':
case '/':
if ((!Empty_OptrStack(optr))||(Judge_optr(str[i]) & Judge_optr(GetTop_OptrStack(optr, top))))
{ //当操作符栈为空或者该操作符的优先级大于栈顶元素的优先级是入栈保存
Push_OptrStack(optr, str[i]);
a = Pop_OpndStack(opnd, a);//接收从操作数栈中出栈的元素
b = Pop_OpndStack(opnd, b);//接收从操作数栈中出栈的元素
top = Pop_OptrStack(optr, top);//接收从操作符栈中出栈的元素
c = Operate(b, a, top);
Push_OpndStack(opnd, c);
//将计算后的值压入操作数栈中
Push_OptrStack(optr, str[i]);
case '\0':
d[j++] = str[i];
} while (str[i] &= '0' && str[i] &= '9');
//可存入一个或多个数字字符
d[j] = '\0';
//将输入的连续多个数字字符拼成了字符串
f = atof(d);
//调用库函数atoi()将字符数转换为浮点数
Push_OpndStack(opnd, f);
//将转换后的数压入操作数栈中
while (Empty_OptrStack(optr))
//当操作符栈不为空的时候执行
a = Pop_OpndStack(opnd, a);//接收从操作数栈中出栈的元素
b = Pop_OpndStack(opnd, b);//接收从操作数栈中出栈的元素
top = Pop_OptrStack(optr, top);//接收从操作符栈中出栈的元素
c = Operate(b, a, top);
Push_OpndStack(opnd, c);
//将计算后的值压入操作数栈中
cout && &该表达式的计算结果为:&;
std::cout && GetTop_OpndStack(opnd, c) &&//将操作数栈中的元素(即表达式的最终结果)打印出来
int main()
char str[100];
std::cout && &请输入算术表达式(功能:+,-,*,/)& &&
Jsbds_operate(str);
二.包括括号运算(粘贴修改部分)&
int Judge_optr(char top)//用于判断字符ch是否是运算符
//cout && top && &test& &&
switch (top)
case '(':
case '+':
case '-':
case '*':
case '/':
case ')':
double Operate(double b, double a, char top)
//用于计算当前的值,并将该值返回
double c = 0;
switch (top)
case '+':
case '-':
case '*':
case '/':
if (a == 0)
printf(&分母为零!\n&);
printf(&输入的字符非法!\n&);
void Jsbds_operate(char str[])
//读入一个简单算术表达式,并将计算结果返回到主函数
OptrStack *optr = Init_OptrStack();
//初始化操作符栈
OpndStack *opnd = Init_OpndStack();
//初始化操作数栈
//i,j为循环变量,a,b接收从操作数栈中出栈的元素
//接收将字符数转换为浮点数的值
double a = 0;
double b = 0;
double c = 0;
char d[100];
//储存字符串中连续的&数&
char top = 0;
//接收从操作符栈中出栈的元素
for (i = 0; str[i]; i++)
//将字符串中的元素按顺序入到栈中
switch (str[i])
case '(':
case '+':
case '-':
/*先判断当前运算符与操作符栈栈顶元素的优先级,如果高于栈顶元素,则入栈;
小于栈顶元素,则从操作数栈中依次出两个数,并将操作符栈中栈顶元素出栈,
再将从操作数栈中出的两个数,按从操作符栈栈中出的运算符运算,
并将结果压入操作数栈中,再将当前的操作符压入操作符栈中。*/
if ((!Empty_OptrStack(optr)) || (Judge_optr(str[i]) & Judge_optr(GetTop_OptrStack(optr, top)))||(str[i]=='('))
//当操作符栈为空的时候压栈保存
Push_OptrStack(optr, str[i]);
a = Pop_OpndStack(opnd, a); //接收从操作数栈中出栈的元素
b = Pop_OpndStack(opnd, b); //接收从操作数栈中出栈的元素
top = Pop_OptrStack(optr, top);//接收从操作符栈中出栈的元素
c = Operate(b, a, top);
Push_OpndStack(opnd, c);
//将计算后的值压入操作数栈中
Push_OptrStack(optr, str[i]);
case '*':
case '/':
if ((!Empty_OptrStack(optr)) || (Judge_optr(str[i]) & Judge_optr(GetTop_OptrStack(optr, top))) || (str[i] == '('))
{ //当操作符栈为空或者该操作符的优先级大于栈顶元素的优先级是入栈保存
Push_OptrStack(optr, str[i]);
a = Pop_OpndStack(opnd, a);//接收从操作数栈中出栈的元素
b = Pop_OpndStack(opnd, b);//接收从操作数栈中出栈的元素
top = Pop_OptrStack(optr, top);//接收从操作符栈中出栈的元素
c = Operate(b, a, top);
Push_OpndStack(opnd, c);
//将计算后的值压入操作数栈中
Push_OptrStack(optr, str[i]);
case ')':
Push_OptrStack(optr, str[i]);
case '\0':
d[j++] = str[i];
} while (str[i] &= '0' && str[i] &= '9');
//可存入一个或多个数字字符
d[j] = '\0';
//将输入的连续多个数字字符拼成了字符串
f = atof(d);
//调用库函数atoi()将字符数转换为浮点数
Push_OpndStack(opnd, f);
//将转换后的数压入操作数栈中
while (Empty_OptrStack(optr))
//当操作符栈不为空的时候执行
if ((GetTop_OptrStack(optr, top) == ')') || (GetTop_OptrStack(optr, top) == '('))
top=Pop_OptrStack(optr, top);
a = Pop_OpndStack(opnd, a);//接收从操作数栈中出栈的元素
b = Pop_OpndStack(opnd, b);//接收从操作数栈中出栈的元素
top = Pop_OptrStack(optr, top);//接收从操作符栈中出栈的元素
c = Operate(b, a, top);
Push_OpndStack(opnd, c);
//将计算后的值压入操作数栈中
cout && &该表达式的计算结果为:&;
std::cout && GetTop_OpndStack(opnd, c) &&//将操作数栈中的元素(即表达式的最终结果)打印出来C语言实验(5)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
C语言实验(5)
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩3页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢用c语言编写的加减乘除计算器程序_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
用c语言编写的加减乘除计算器程序
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 c语言加减乘除代码 的文章

 

随机推荐