C语言程序设计:实现带有括号的四则运算

实现带有括号的四则运算。输入是一个带有括号的四则运算表达式,输出是计算得出的正确计算结果。例如:输入:123+213-67*34+345/23*45*(34+34-345+245+567)回车,然后程序计算得出结果为:359183
呃,明天就要交了,找了很多,有些有错误的,而且有用了C++的!谁能帮帮我,糟了,这么晚了找谁!谁能来帮帮我...呜呜呜呜
分数不是问题的,我在线等的应该!

呵呵。不知道你是否过关了。我是才看到。我写了个c++版本的。

stack_h文件
#ifndef STACK_H
#define STACK_H
#define STACK_INIT_SIZE 100

#include<iostream>
using namespace std;

template <class type>
class stack
{
public:
stack(int = STACK_INIT_SIZE);
~stack()
{
delete []stackptr;
}
bool push(const type &);
bool pop(type &);
bool isempty()const;
bool isfull()const;
type getTopValue();
private:
int size;
int top;
type* stackptr;
};

template <class type>
stack<type>::stack(int length)
{
size=length; //防止输入不合理的数字
top=-1;
stackptr=new type[size];

}

////////////////////////////////////////////
template<class type>
bool stack<type>::isempty()const
{
return top==-1;
}

///////////////////////////////////////////
template<class type>
bool stack<type>::isfull()const
{
return top==size-1;
}

//////////////////////////////////////////
template<class type>
bool stack<type>::push(const type &data)
{
if(!isfull())
{
stackptr[++top]=data;
return true;
}
return false;
}

/////////////////////////////////////////
template<class type>
bool stack<type>::pop(type &popvalue)
{
if(!isempty())
{
popvalue=stackptr[top--];
return true;
}
return false;
}

template<class type>
type stack<type>::getTopValue()
{
type temp;
if(!isempty())
{
temp=stackptr[top];
}
return temp;
}

#endif

main.cpp
//copyright www
#include<iostream>
#include "stack.h"
using namespace std;

bool issign(char );//判断c中的值是否为运算符,如果是则返回1
char Precede(char c1,char c2);//比较运算符之间的优先级
double Operate(double a,char theta, double b);//计算a theta b 的值
double EvaluateExpression(char m[]);//表达式求值

int main()
{
char c[60];
cout<<"please input the expression and end with '=': "<<endl;
cin>>c;
double result=0;
result=EvaluateExpression(c);
cout<<"the result is :"<<result;
system("pause");
return 0;
}

//
bool issign(char c)
{
if(c!='+'&&c!='-'&&c!='*'&&c!='/'&&c!='='&&c!='('&&c!=')')
return 0;
else
return 1;
}

char Precede(char c1,char c2)
{
switch(c1)
{
case '+':if(c2=='+'||c2=='-'||c2==')'||c2=='=') return '>';
else return '<';break;
case '-':if(c2=='+'||c2=='-'||c2==')'||c2=='=') return '>';
else return '<';break;
case '*':if(c2=='(') return '<';
else return '>';break;
case '/':if(c2=='(') return '<';
else return '>';break;
case '(':if(c2==')') return '=';
else return '<';break;
case ')': return '>';break;
case '=':if(c2=='=') return '=';
else return '<';break;
default:return 0;
}
}

double Operate(double a,char theta, double b)
{
switch(theta)
{
case '+': return a+b;break;
case '-': return a-b;break;
case '*': return a*b;break;
case '/': if(b!=0) {return a/b;break;}
else cout<<"分母不能为零!,输入错误"<<endl;
default: return 0;
}
}

double EvaluateExpression(char m[])
{
stack<double>number; //存放表达式的数值
stack<char>sign;//存放表达式的符号
sign.push('=');//把等号存入符号栈中,用来判断表达式已经计算完毕
double stored_a,stored_b;//已经存入stack<int>number的值
int i=0;//m的下标
char signal;//保存符号

while( m[i]!='='||sign.getTopValue()!='=')
{
if(!issign(m[i]))
{
char*p=&m[i];
while(!issign(m[i])||m[i]=='.')
{
i++;
}
number.push(atof(p)); //如果不是运算符,则转换为浮点型并且压入存放数字的栈中
}
else
{
switch( Precede(sign.getTopValue() , m[i]))
{

case '<':
sign.push(m[i]);i++;break;

case '=':sign.pop(signal);i++;break;

case '>':
sign.pop(signal);
number.pop(stored_a);
number.pop(stored_b);
number.push(Operate(stored_b , signal , stored_a));
break;
}
}

}
double result;
number.pop(result);
return result;
}

绝对原创。
温馨提示:内容为网友见解,仅供参考
第1个回答  2019-06-16
呵呵。不知道你是否过关了。我是才看到。我写了个c++版本的。
stack_h文件
#ifndef
STACK_H
#define
STACK_H
#define
STACK_INIT_SIZE
100
#include<iostream>
using
namespace
std;
template
<class
type>
class
stack
{
public:
stack(int
=
STACK_INIT_SIZE);
~stack()
{
delete
[]stackptr;
}
bool
push(const
type
&);
bool
pop(type
&);
bool
isempty()const;
bool
isfull()const;
type
getTopValue();
private:
int
size;
int
top;
type*
stackptr;
};
template
<class
type>
stack<type>::stack(int
length)
{
size=length;
//防止输入不合理的数字
top=-1;
stackptr=new
type[size];
}
////////////////////////////////////////////
template<class
type>
bool
stack<type>::isempty()const
{
return
top==-1;
}
///////////////////////////////////////////
template<class
type>
bool
stack<type>::isfull()const
{
return
top==size-1;
}
//////////////////////////////////////////
template<class
type>
bool
stack<type>::push(const
type
&data)
{
if(!isfull())
{
stackptr[++top]=data;
return
true;
}
return
false;
}
/////////////////////////////////////////
template<class
type>
bool
stack<type>::pop(type
&popvalue)
{
if(!isempty())
{
popvalue=stackptr[top--];
return
true;
}
return
false;
}
template<class
type>
type
stack<type>::getTopValue()
{
type
temp;
if(!isempty())
{
temp=stackptr[top];
}
return
temp;
}
#endif
main.cpp
//copyright
www
#include<iostream>
#include
"stack.h"
using
namespace
std;
bool
issign(char
);//判断c中的值是否为运算符,如果是则返回1
char
Precede(char
c1,char
c2);//比较运算符之间的优先级
double
Operate(double
a,char
theta,
double
b);//计算a
theta
b
的值
double
EvaluateExpression(char
m[]);//表达式求值
int
main()
{
char
c[60];
cout<<"please
input
the
expression
and
end
with
'=':
"<<endl;
cin>>c;
double
result=0;
result=EvaluateExpression(c);
cout<<"the
result
is
:"<<result;
system("pause");
return
0;
}
//
bool
issign(char
c)
{
if(c!='+'&&c!='-'&&c!='*'&&c!='/'&&c!='='&&c!='('&&c!=')')
return
0;
else
return
1;
}
char
Precede(char
c1,char
c2)
{
switch(c1)
{
case
'+':if(c2=='+'||c2=='-'||c2==')'||c2=='=')
return
'>';
else
return
'<';break;
case
'-':if(c2=='+'||c2=='-'||c2==')'||c2=='=')
return
'>';
else
return
'<';break;
case
'*':if(c2=='(')
return
'<';
else
return
'>';break;
case
'/':if(c2=='(')
return
'<';
else
return
'>';break;
case
'(':if(c2==')')
return
'=';
else
return
'<';break;
case
')':
return
'>';break;
case
'=':if(c2=='=')
return
'=';
else
return
'<';break;
default:return
0;
}
}
double
Operate(double
a,char
theta,
double
b)
{
switch(theta)
{
case
'+':
return
a+b;break;
case
'-':
return
a-b;break;
case
'*':
return
a*b;break;
case
'/':
if(b!=0)
{return
a/b;break;}
else
cout<<"分母不能为零!,输入错误"<<endl;
default:
return
0;
}
}
double
EvaluateExpression(char
m[])
{
stack<double>number;
//存放表达式的数值
stack<char>sign;//存放表达式的符号
sign.push('=');//把等号存入符号栈中,用来判断表达式已经计算完毕
double
stored_a,stored_b;//已经存入stack<int>number的值
int
i=0;//m的下标
char
signal;//保存符号
while(
m[i]!='='||sign.getTopValue()!='=')
{
if(!issign(m[i]))
{
char*p=&m[i];
while(!issign(m[i])||m[i]=='.')
{
i++;
}
number.push(atof(p));
//如果不是运算符,则转换为浮点型并且压入存放数字的栈中
}
else
{
switch(
Precede(sign.getTopValue()
,
m[i]))
{
case
'<':
sign.push(m[i]);i++;break;
case
'=':sign.pop(signal);i++;break;
case
'>':
sign.pop(signal);
number.pop(stored_a);
number.pop(stored_b);
number.push(Operate(stored_b
,
signal
,
stored_a));
break;
}
}
}
double
result;
number.pop(result);
return
result;
}
绝对原创。

C语言实现带有括号的四则运算
void error(void) \/*报告错误函数*\/ { printf("ERROR!\\n");exit(1);} void match(char expected) \/*检查字符匹配的函数*\/ { if(token[n]==expected)token[++n]=getchar();else error();} double term(void); \/*计算乘除的函数*\/ double factor(void); \/*处理括号和数字的函数*\/ do...

用简单的C语言实现带括号的四则运算
int check(char *c)输入参数:char *c: 输入的字符串 返回参数:0:字符串中有不符合规定的字符 1: 字符串字符符合规定,没有不符合规定的字符.功能:检查字符串中有否除了 0-9, +,-,*,\/,(,),之外的其他字符,如果有,则返回0, 表示出现错误。若没有,则返回1,表式字符串符合规定。\/ i...

c语言四则运算带括号且不使用指针
case '=': e[i]=0,i=I;break;default: printf("Oper %d is Error! --->- %c -ChangeTo:one of + - * \/ h =\\n",i+1,e[i]);}} printf("\\n");sss(d,e,I);}

如何运用大一C语言基础编写简单带括号的四则运算?
1.从中缀表达式中逐字符读入操作数 2.若操作数为数字,直接输出到后缀表达式队列 3.若操作数为左括号(,将其压栈 4.若操作数为加减乘除运算符,将其与栈顶元素比较:①操作数优先级高于栈顶元素,则将操作数压栈;②操作数优先级等于或低于栈顶元素,先将栈顶元素出栈,然后将操作数压栈。5.若...

如何用C语言实现四则运算?
2.写出主函数void main(){},在函数内添加如下代码:\/\/定义变量 int minusNumber=-10; int plusNumber=0; \/\/转换成正数 plusNumber=abs(minusNumber); \/\/输出结果 printf("转换前:%d\\n",minusNumber); printf("转换后:%d\\n",plusNumber);3.点击红叹号调试。程序清单:include "stdafx.h"#...

求c语言编写四则运算程序
else error();\/*extraneous cahrs on line*\/ } main(){ do { calculate();}while(1);} float exp(void){ float temp = term();while((token=='+')||(token=='-'))switch(token){ case '+':match('+');temp+=term();break;case '-':match('-');temp-=term();break;} r...

c语言则么怎么实现四则运算
char d;printf("输入简单的四则运算表达式:\\n");scanf("%f%c%f",&a,&d,&b);switch(d){ case'+': c=a+b;break;case'-': c=a-b;break;case'x':case'*': c=a*b;break;case'\/': if(b>0) c=a\/b;break;default:break;} printf("%g%c%g=%g\\n",a,d,b,c);getchar()...

C语言怎么实现四则运算
我曾用c编了个计算器,支持四则运算,支持括号改变优先级,你看看吧:include <stdio.h> include <string.h> include <stdlib.h> include <conio.h> define Esc 27 define Tab 9 void needle(char* s,char* carriage,int start)\/\/needle意为“用针缝”{ int size_carriage=(int)strlen(carriage)...

请问怎么用c语言写一个可以实现加减乘除四则运算的计算器!
}算法流程:1,如果读入数字就把它存入数组中,2,如果读入加,减号就存如另一个数组用,如果读入乘 除号,就再读入一个数字,从存数字的数组拿出两个数字进行乘 除运算。把结果存入数组中,这么重复直到读入回车键的符号。3,读到回车符号后,就从存符号的数组中拿出一个符号,再从存数字的数组中...

如何用C语言编程实现四则运算图灵机,求详细指点
include <stdio.h> main(){ int i=1,flag=0;double a=0,b=0,result=0;char sym;printf("(%d)\\n",i);scanf("%lf%c%lf",&a,&sym,&b);while(sym!='#'){ switch(sym){ case '+':result=a+b;break;case '-':result=a-b;break;case '*':result=a*b;break;case '\/':r...

相似回答