用C语言编写能进行四则运算的程序

我想用C语言编一个能进行简单的四则运算的程序,应该怎么写,请详细解释一下输入和计算部分

c

2个回答

实现四则运算是比较简单的,你可以使用两个栈,一个栈用来存贮操作的数字(0~n),一个栈用来存储操作符(+-等).
你先把四则运算表达式存为一个字符串,然后遍历各个字符,如果是数字,那就存起来,如果是操作符,那就与前一个操作符比较,看看优先级是不是比前一个大,如果是,那就存起来,如果不是,那就把数字栈里的前两个数按照前一个操作符进行运算。结果用一个变量保存起来。
下面是以前学栈时的一个代码,是关于四则运算的,虽然是用C++写的,但是希望对你能有帮助。
#include"stdafx.h"
#include"targetver.h"
#include
#include
#include
#include
using namespace std;
class list{
public:
int weight;
string str;
};
class node{
public:
string s;
node* next;
public:
node(){
next=nullptr;
}
};
class Stack{
public:
node* top;
int length;
public:
Stack(){
top=new node();
}
node getTop(){
return top->next;
}
void push(string str){//cout<<str<<endl;
node
n=new node();
n->s=str;
n->next=top->next;
top->next=n;
}
void pop(){
node* n=top->next;
if(n!=nullptr){
top->next=n->next;
delete n;
}else{
cout<<"UnderFlow!"< }
}
bool isEmpty(){
if(top->next==nullptr){
return true;
}else{
return false;
}
}
};
string remove(string s);
float calc(string o,string s1,string s2);
string FloatToString(float f);
int main(){
string str,str_c;
cin>>str;str_c=str;
Stack* n_stack=new Stack();
Stack* o_stack=new Stack();
list* lis=new list[4];
lis[0].str="+";lis[0].weight=1;
lis[1].str="-";lis[1].weight=1;
lis[2].str="*";lis[2].weight=2;
lis[3].str="/";lis[3].weight=2;
float sum=0;
for(int i=0;i if(str.at(i)=='('){
string s="";
for(;str.at(i)!=')';){
s=s+str.at(0);
}
}else if(str.at(i)>='0'&&str.at(i)<='9'){
string s="";
for(;i='0'&&str.at(i)<='9';i++){
s=s+str.at(i);
}i--;
n_stack->push(s);
}else{
string s="";
s=str.at(i)+s;
if(!o_stack->isEmpty()){
list curOperate;
list lastOperate;
for(int i=0;i if(o_stack->top->next->s==lis[i].str){
lastOperate=lis[i];
}
if(s==lis[i].str){
curOperate=lis[i];
}
}
if(curOperate.weight>lastOperate.weight){
o_stack->push(s);
}else{
float f=calc(lastOperate.str,n_stack->top->next->next->s,n_stack->top->next->s);
s=FloatToString(f);
n_stack->pop();
n_stack->pop();
o_stack->pop();
n_stack->push(s);
o_stack->push(curOperate.str);
}
}else{
o_stack->push(s);
}

    }
}cout<<o_stack->top->next->s<<"--"<<n_stack->top->next->next->s<<"--"<<n_stack->top->next->s<<endl;
sum=sum+calc(o_stack->top->next->s,n_stack->top->next->next->s,n_stack->top->next->s);
cout<<endl<<"the o_stack is followed:"<<endl;
for(node* p=o_stack->top->next;p!=nullptr;p=p->next){
    cout<<p->s;
}cout<<endl<<"the n_stack is followed:"<<endl;
for(node* p=n_stack->top->next;p!=nullptr;p=p->next){
    cout<<p->s;
}
cout<<endl<<sum<<endl;
int a;cin>>a;
return 0;

}
string FloatToString(float f){
string s="";int a=f;
for(;a!=0;){
int c=a%10;
a=a/10;
s=(char)(c+'0')+s;
}
return s;
}
float calc(string o,string s1,string s2){
int m=0,n=0;
for(int i=0;i m=m+(s1.at(i)-'0')*pow(10,s1.length()-i-1);
}
for(int i=0;i n=n+(s2.at(i)-'0')*pow(10,s2.length()-i-1);
}
if(o=="+"){
return m+n;
}else if(o=="-"){
return m-n;
}else if(o=="*"){
return m*n;
}else if(o=="/"){
return (m*1.0)/n;
}
return -1;
}
string remove(string s){
string s1="";
if(s.length()>2){
return s.substr(1,s.length()-1);
}else if(s.length()==2){
return s.at(1)+s1;
}else{
return "";
}
}

qq_31271805
琉璃晴久 谢谢
接近 5 年之前 回复

试试用字符串替换,逻辑简单,只要一层层的把优先级高的计算成答案替换原字符串中的算式。涉及到一些正则匹配问题,代码也就几十行而已图片说明

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问