用C语言设计一个简单的计算器

用C语言设计一个简单的计算器,要求能够对输入的数
1.进行+,-,*,/,运算;
2.可以带括号;
3.不限定运算式的输入长度.
4.要支持简单的括号运算
5.刚学c语言不久,不要编的太难

#include
#include
#include
#include
#define MaxQSize 80

float qlist[MaxQSize],qlist1[MaxQSize],qlist2[MaxQSize]; //定义三个全局队列
int front=0,rear=0,front1=0,front2=0,rear1=0,rear2=0,count=0,count1=0,count2=0;//定义三个队列头结点、尾结点、数据个数
main()
{
char c[80];
void Enter(float),pop(),ClearStack();
printf("input string:(n:sin,o:cos,s:sqrt)\n");
while(gets(c),*c!='q' ||*c!='Q')
{
switch(*c)
{
case '+':
case '*':
case 's':
case 'n': //求SIN
case 'o': //求COS
case '/': //将符号入第一个队列
{
if(count==MaxQSize)
{
printf("Quere overflow!");
exit(1);
}
count++;
qlist[rear]=*c;
rear=(rear+1)%MaxQSize;
break;}
case '-':
{
if(strlen(c)>1) //如果是负号,则将负号和数一起入第二个队列
Enter(atof(c));
else //否则,说明是减号,入第一队列
if(count==MaxQSize)
{
printf("Quere overflow!");
exit(1);
}
count++;
qlist[rear]=*c;
rear=(rear+1)%MaxQSize;
break;}
case '=':
pop(); //显示结果
break;
case 'c':
ClearStack();
break;
case 'q':
ClearStack();
exit(1);
default:
Enter(atof(c));
break;
}
}
return 0;
}

void Enter(float num) //将数据入第二个队列
{
if(count1==MaxQSize)
{
printf("Queue overflow!\n");
exit(1);
}
count1++;
qlist1[rear1]=num;
rear1=(rear1+1)%MaxQSize;

}

void ClearStack() //将三个队列清空
{
count=0;
count1=0;
count2=0;
front=0;
rear=0;
front1=0;
rear1=0;
front2=0;
rear2=0;
}

void pop() //显示结果
{
float QFront(float num1,float num2,char *temp);
float num1,num2;
float sum;
char temp;
temp=qlist[front]; //将第一个队列中的头结点读出来
while(count1!=0) //判断第二个队列是否有数
{
temp=qlist[front]; //将队列中头结点读出来
sum=QFront(num1,num2,&temp);
count--;
front=(front+1)%MaxQSize;//将第一个队列头指针加1
}
if(count!=0 && temp=='s')
sum=sqrt(qlist2[front2]);
if(count!=0 && temp=='n')
sum=sin(qlist2[front2]);
if(count!=0 && temp=='o')
sum=cos(qlist2[front2]);
printf("%f",sum);
}

float QFront(float num1,float num2,char *temp)
{
float number,numb1;
float QFront1();
void QInsert(float);
num1=QFront1(); //先读出一个数
switch(*temp)
{
case '+':
if(count2==0)
{
num2=QFront1();//读出第二个数
number=num1+num2;
QInsert(number);//将结果存入第三个队列
}
else
{
number=num1+qlist2[front2];
front2=(front2+1)%MaxQSize;
QInsert(number);
}
break;

case '-':
if(count2==0)
{
num2=QFront1();
number=num1-num2;
printf("number=%f\n",number);
QInsert(number);
}
else
{
number=qlist2[front2]-num1;
printf("number=%f\n",number);
front2=(front2+1)%MaxQSize;
QInsert(number);
}
break;

case '*':
if(count2==0) //如果第三个队列中没有数据,则从第二个队列中读出一个数据
{
num2=QFront1();
number=num1*num2;
QInsert(number);
}
else //否则,从第三个队列中读出数据
{
number=qlist2[front2]*num1;
front2=(front2+1)%MaxQSize;
QInsert(number);
}
break;
case '/':
if(count2==0)
{
num2=QFront1();
if(num2==0)
{
printf("divied by 0");
ClearStack();
exit(1);
}
else
{
number=num1/num2;
QInsert(number);
}
}
else
{
if(num1==0)
{
printf("divide by 0");
ClearStack();
exit(1);
}
else
{
number=qlist2[front2]/num1;
front2=(front2+1)%MaxQSize;
QInsert(number);
}
}
break;

case 's':
if(count2==0)
{
number=sqrt(num1);
QInsert(number);
}
else
{
number=sqrt(qlist2[front2]);
printf("number=%d\n",number);
front2=(front2+1)%MaxQSize;
QInsert(number);
}
break;
case 'n':
if(count2==0)
{
number=sin(num1);
QInsert(number);
}
else
{
number=sin(qlist2[front2]);
front2=(front2+1)%MaxQSize;
QInsert(number);
}
break;

case 'o':
if(count2==0)
{
number=cos(num1);
printf("number=%d\n",number);
QInsert(number);
}
else
{
number=cos(qlist2[front2]);
printf("number=%d\n",number);
front2=(front2+1)%MaxQSize;
QInsert(number);
}
break;
}
return number;
}

float QFront1() //从第一个数据读数据
{
float temp;
if(count1==0)
{
printf("Deleting from an empty queue!\n");
exit(1);
}
temp=qlist1[front1];
count1--;
front1=(front1+1)%MaxQSize;
return temp;
}

void QInsert(float number) //将结果存入第三个队列
{
if(count2==MaxQSize)
{
printf("Queue overflow!\n");
exit(1);
}
count2++;
qlist2[rear2]=number;
rear2=(rear2+1)%MaxQSize;
}

其实这个程序用链表实现更好,但是由于时间关系,所以用了数组。当然,这个程序还不是很完善,还有很多地方需要改进,比如可以用图形界面来进行操作、可以将三个队列放入一个结构体中等。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-09-18
#include<stdio.h>
void add(int a,int b,int c)
{
c=a+b;
printf("%d\t",c);
printf("\n");
}
void minus(int a,int b,int c)
{
c=a-b;
printf("%d\t",c);
printf("\n");
}
void multiplication(int a,int b,int c)
{
c=a*b;
printf("%d\t",c);
printf("\n");
}
void div(int a,int b,int c)
{
(float)c=(float)a/(float)b;
printf("%f\t",c);
printf("\n");
}
main()
{
int a,b,c;
char p;
puts("input A:\n");
scanf("%d",&a);
puts("input B:\n");
scanf("%d",&b);
puts("input operation:\n");
getchar();
p=getchar();
if(p=='+') add(a,b,c);else
if(p=='-') minus(a,b,c);else
if(p=='*') multiplication(a,b,c);else
if(p=='/') div(a,b,c);else
puts("没有注册这个运算符号\n");
}本回答被提问者采纳
第2个回答  2008-05-31
我没有用栈
全是关于字符串的处理
也实现了
注:不支持中括号,大括号
#include<iostream>
#include<string>

#include<cmath>
using namespace std;
int f0(double d)
{
for(int i=1;;i++)
if(int(d)/(int)pow(10.0,i)==0)
return i;
}
string f(string s)
{
s='('+s+')';
while(s.find("/")!=-1)
{

int m=s.find("/");
int pm=s.find_last_of("+-*()/[]{}",m-1);
int nm=s.find_first_of("+-*()/[]{}",m+1);
double d=atof(s.substr(pm+1,m-pm-1).c_str())/atof(s.substr(m+1,nm-m-1).c_str());
char ch[20];
_gcvt(d,f0(d)+2,ch);
s.replace(pm+1,nm-pm-1,string(ch));
}
while(s.find("*")!=-1)
{

int m=s.find("*");
int pm=s.find_last_of("+-*()/[]{}",m-1);
int nm=s.find_first_of("+-*()/[]{}",m+1);
double d=atof(s.substr(pm+1,m-pm-1).c_str())*atof(s.substr(m+1,nm-m-1).c_str());
char ch[20];
_gcvt(d,f0(d)+2,ch);
s.replace(pm+1,nm-pm-1,string(ch));
}
while(s.find('+')!=-1)
{

int m=s.find('+');
int pm=s.find_last_of("+-*()/[]{}",m-1);
int nm=s.find_first_of("+-*()/[]{}",m+1);

double d=atof(s.substr(pm+1,m-pm-1).c_str())+atof(s.substr(m+1,nm-m-1).c_str());

char ch[20];
_gcvt(d,f0(d)+2,ch);
s.replace(pm+1,nm-pm-1,string(ch));
}
while(s.find("-")!=-1)
{

int m=s.find("-");
int pm=s.find_last_of("+-*()/[]{}",m-1);
int nm=s.find_first_of("+-*()/[]{}",m+1);
double d=atof(s.substr(pm+1,m-pm-1).c_str())-atof(s.substr(m+1,nm-m-1).c_str());

char ch[20];
_gcvt(d,f0(d)+2,ch);
s.replace(pm+1,nm-pm-1,string(ch));
}

return s.substr(1,s.length()-1-1);
}
int main()
{
string str="1+2";
A:
cout<<"请输入算式:";
cin>>str;
string str1=str;

if(str.find_first_not_of("1234567890+-*/().")!=-1){cout<<"你输入的有不合法的字符!"<<endl;goto A;}
while(str.find(")")!=-1)
{
int i=str.find(")");
int j=str.rfind("(",i);
str.replace(j,i-j+1,f(str.substr(j+1,i-j-1)));
}
cout<<str1<<'='<<f(str)<<endl;
goto A;
system("pause");
}
第3个回答  2008-05-31
楼上的朋友怎么写那么多的代码?
用栈
先求运算式的后缀表达式
在通过栈操作求值
相似回答