我想用C语言编一个能进行简单的四则运算的程序,应该怎么写,请详细解释一下输入和计算部分
2条回答 默认 最新
- DukeSeraph 2015-10-01 07:48关注
实现四则运算是比较简单的,你可以使用两个栈,一个栈用来存贮操作的数字(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 "";
}
}本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥50 微信聊天记录备份到电脑提示成功了,但还是没同步到电脑微信
- ¥15 python怎么在已有视频文件后添加新帧
- ¥20 虚幻UE引擎如何让多个同一个蓝图的NPC执行一样的动画,
- ¥15 fluent里模拟降膜反应的UDF编写
- ¥15 MYSQL 多表拼接link
- ¥15 关于某款2.13寸墨水屏的问题
- ¥15 obsidian的中文层级自动编号
- ¥15 同一个网口一个电脑连接有网,另一个电脑连接没网
- ¥15 神经网络模型一直不能上GPU
- ¥20 wpf datagrid单元闪烁效果失灵