问题描述
- 用C语言编写能进行四则运算的程序
- 我想用C语言编一个能进行简单的四则运算的程序,应该怎么写,请详细解释一下输入和计算部分
解决方案
实现四则运算是比较简单的,你可以使用两个栈,一个栈用来存贮操作的数字(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 ostring s1string s2);
string FloatToString(float f);
int main(){
string strstr_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.strn_stack->top->next->next->sn_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->sn_stack->top->next->next->sn_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 ostring s1string s2){
int m=0n=0;
for(int i=0;i m=m+(s1.at(i)-'0')*pow(10s1.length()-i-1);
}
for(int i=0;i n=n+(s2.at(i)-'0')*pow(10s2.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(1s.length()-1);
}else if(s.length()==2){
return s.at(1)+s1;
}else{
return """";
}
}
解决方案二:
编写C语言进行读目录程序
使用C语言编写通用shellcode的程序
使用vim在Linux下编写C语言程序
解决方案三:
试试用字符串替换,逻辑简单,只要一层层的把优先级高的计算成答案替换原字符串中的算式。涉及到一些正则匹配问题,代码也就几十行而已