求一个c语言里编程的计算器的程序 可运算加减乘除,认小数点和括号的,最好用栈和队列编,辛苦,跪谢~

如题所述

你这不会是数据结构的课程设计吧,我做过完全符合要求的程序,我的文库地址为http://wenku.baidu.com/view/ea931715b7360b4c2e3f6474?fr=prin

下载即是源代码。

这里既然给了20分,就不好意思让您再掏两财富值下载了,不过原下载地址我给出了阳历输入和输出,您要是不满意和以对源程序稍作修改。

#include<iostream>
#include<string.h>
using namespace std;
#define STACK_INIT_SIZE 100
#define INCRESEMENT 10
#define OVERFLOW 0
#define ERROR 0
typedef struct//栈的结构体的定义
{
char *base;
char *top;
int stacksize;
}stack;

void initstack(stack &s)//栈的初始化
{
s.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
if(!s.base)
exit(OVERFLOW);
s.top=s.base;
}

char gettop(stack s)//获取栈顶元素并用e返回
{
char e;
if(s.top==s.base)
exit(ERROR);
e=*(s.top-1);
return e;

}

void push(stack &s,char e)//把数据元素e压到栈s中
{
if(s.top-s.base==s.stacksize)
{
s.base=(char *)realloc(s.base,(s.stacksize+INCRESEMENT)*sizeof(char));
if(!s.base)
exit(OVERFLOW);
s.top=s.base+s.stacksize;
s.stacksize=s.stacksize+INCRESEMENT;
}
*(s.top++)=e;
}

void pop(stack &s,char&e)//栈顶元素出栈,并用e返回
{
if(s.top==s.base)
exit(ERROR);
e=*(--s.top);
}

bool in(char c)//判断字符c是否为表达式运算符,若是返回true,否返回false
{
if((c=='+')||(c=='-')||(c=='*')||(c=='/')||(c=='#')||(c=='(')||(c==')'))
return true;
else
return false;

}

char Precede(char a,char b)//对运算符a和b优先级进行比较并返回比较结果
{
if(a=='+'||a=='-')
{
if(b=='*'||b=='/'||b=='(')
return '<';
else
return '>';
}
if(a=='*'||a=='/')
{
if(b=='(')
return '<';
else
return '>';
}
if(a=='(')
{
if(b==')')
return '=';
else if(b!='#')
return '<';
}
if(a==')')
{
if(b!='(')
return '>';
}
if(a=='#')
{
if(b=='#')
return '=';
else if(b!=')')
return '<';
}
}

int operate(char a,chartheta,char b)//对字符a和b按其字面值进行运算
{
if(theta=='+')
return (a-48)+(b-48);
if(theta=='-')
return a-b;
if(theta=='*')
return (a-48)*(b-48);
if(theta=='/')
return (a-48)/(b-48);
}

void main()//主函数
{
cout<<"copyright to:大连海洋大学-计算机09-1-张世恒!感谢您的下载和使用!"<<endl;
stack optr,opnd;
initstack(optr);
initstack(opnd);
push(optr,'#');
cout<<"Input:#";
char c;
char x,theta;
char a,b;
c=getchar();
while(c!='#'||gettop(optr)!='#')
{
if (!in(c)) //不是运算符则进opnd栈
{
push(opnd,c);
c=getchar();
if(!in(c)) //若连续输入两个数字字符,实现两个数字字符的连接
{
char c1=c;
pop(opnd,c);
c=(char)((c-48)*10+(int)(c1));
}
}
else
{
switch(Precede(gettop(optr),c))
{
case'<': //栈顶元素有限权低
{
push(optr,c);
c=getchar();
break;
}
case'=': //脱括号并接收下一个字符
{
pop(optr,x);
c=getchar();
break;
}
case'>': //退栈并将运算结果入栈
{
pop(optr,theta);
pop(opnd,b);
pop(opnd,a);
char c1;
c1=(char)(operate(a,theta,b)+48);
push(opnd,c1);
break;
}
}//switch
}//else
}//while
cout<<"output:"<<(int)gettop(opnd)-48<<endl;
}//main
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-07-17
大概是什么样的一个模式? 带不带windows窗口界面,还是只要是C或C++编写的cmd程序即可。
还是要像windows自带的计算器一样吗(即输入一个运算符就立即计算),还是直接输入一个表达式(如 3+10-9*(8-6/2)),然后直接计算出来。追问

只要程序就行,放在c语言程序里可以运行的那种,就是一点运行可以输入一行运算式敲enter计算出来的那种(应该就是你说的第二种╮(╯▽╰)╭)

追答

我使用的是C++语言,栈是一个自定小类库,主程序是像C语言一样,使用函数完成的,里面有一个缺点就是不支持负数。

运行结果为:

以下是源文件:

 

追问

如果只是用c语言编的话哪部分需要修改呢?只学了指针栈队列这些(还没学好)好多地方虽然注解很详细还是看不懂啊…如果只用这些来编的话是不是要大动捏…能告诉我改哪里吗(当然要是你帮忙改就更好了╮(╯▽╰)╭)
“public:”和”private:"这么写在c语言里可以吗
~stack()什么意思
bool代表的是什么啊,在c语言里是不是需要定义
要问的微多我放一部分在评论里啦……

追答

我里面是用的C++代码,public和brivate这是C++中类的访问权限,在C语言中不能使用。
如果只用C语言来写,栈需要改,因为我栈是用C++写的,另外在程序中,输入输出库要改,然后就是些小的细节要改动。
bool是布然类型,在C语言的最新标准中是带有这一个类型的,只是目前很少有编译器支持C的这标准,在C++中这是一个基本类型,即只返回真或假(在C语言中可以像windows的API函数那样,使用宏定义或别名关键字来模拟这个类型)
如果你需要,我可以帮你重新用C语言写一个,其实我正想优化一下这个代码,只是需要点时间。

追问

真的么真的么,那你下午四点前能给我吗?最好能用c语言的指针和栈里面最通俗易懂的部分编,多加点注释什么的,否则我很有可能看不懂啊……狂汗……完成以后会多给你加分的拜托啦~~
改完能直接发到我qq上吗,这样知道的比较及时,谢啦~2807953800~

追答

下午4点前可能不行,因为我很久没写C程序了。

追问

啊啊啊,我要崩溃了……那个exe我打不开……你确定没有问题吗?那就直接帮我把代码发过来吧,事关身家性命的事情啊……实在麻烦了……
突然发现不知道为什么我已经把最佳答案点出去了……可能是手抖……万分抱歉啊,要不一会儿我再问一遍相同的问题把分给你?
我又把问题发了一遍不过这里@好像没用,你把问题开头复制下来上百度搜一下好了,因为发现好像你不能直接点帮助诶……