王维维老公:谁能给一个计算机器的源码啊?(用C的)

来源:百度文库 编辑:中科新闻网 时间:2024/05/02 01:48:50

/* 计算器应用程序 */
#include <stdio.h>
#include <string.h>
#include <conio.h>
int grace(char *str) /*用于判断表达式中的括号是否匹配*/
{
char a[20],c,*p=str; /*a[20]为一个接收括号的栈*/
int i=-1,j;
while(*p)
{
if((*p=='(')||(*p==')'))
{
if(i<0) a[++i]=*p; /*如果栈为空则入栈*/
else if(a[i]=='('&&*p==')')
i--;
else
a[++i]=*p;
}
p++;
}
if(i<0) return 1;
else return 0;
}
double count(double a,char b,double c) /* 求运算结果,即a和B在符号C下的结果 */
{
double result;
if(b=='+') result=a*1.0+c;
if(b=='-') result=a*1.0-c;
if(b=='*') result=a*c*1.0;
if(b=='/')
if(c==0) {printf("错误!除数不能为零!请重新输入!");exit(0);}
else result=a*1.0/c;
return(result);
}
double change(char *str) /*带小数点的字符转换为数字,亦可转换正负数*/
{
double result=0.0,sum=0.0,sign;
unsigned long temp=10;
char *p=str;
if(*p=='-') sign=-1.0; else sign=1.0;
if(*p=='-'||*p=='+') p++;
while((*p!='.')&&(*p!='\0'))
{
result=result*10+(*p-48);
p++;
}
if(*p=='\0') return(sign*result);
else
{
p++;
while(*p!='\0')
{
sum=sum+(1.0/temp)*(*p-48);
temp=temp*10;
p++;
}
}
return(sign*(result+sum));
}
int judge(char word) /* 判断数字和符号,简单起见,数字返回1,符号+-* /返回2其它返回零 ()返回3 */
{
if((word>=48)&&(word<=57)||word=='.')
return(1);
else if(word==47 || word==45 || word==42 || word==43 ||word==61)
return(2);
else if(word=='('|| word==')') return(3);
else return(0);
}

int decide(char a,char b) /*判断两个符号的优先次序,返回1表示a>b,返回零表示相等,返回负一表示小于 */
{
int sign;
if(a=='*')
{
if(b=='/'||b=='*')
sign=0;
else sign=1;
}
if(a=='/')
{
if(b=='*'||b=='/') sign=0;
else sign=1;
}
if(a=='+')
{
if(b=='-'||b=='+') sign=0;else sign=-1;
}
if(a=='-')
{if(b=='+'||b=='-') sign=0;else sign=-1;}
return(sign);
}
void main()
{
char string[20],jud1[10],jud2[10],temp,*p=NULL,*flag=NULL,c;
int a,sign=1,i=0,j=-1,k=-1,m=0,n; /* i for jud1[],j for jud2[],k for sum[] ,n用于和j比较*/
double sumon,s,sum[10]; /*sum用来存放数字及运算结果*/
printf("请输入一个数学表达式如1+2= 以回车键结束!\n");
c=getchar();
while(c!='\n')
{
string[m++]=c;
c=getchar();
}
/*用于接收回车符*/
string[m]='\0';

a=grace(string); /*判断括号是否配对*/
if(!a)
{
printf("括号不配对,返回\n");exit(1);
}
p=string;
n=strlen(string);
if(string[n-1]=='=')
string[n-1]='\0';
string[n]='\0';
while(*p)
{
a=judge(*p);
switch(a)
{
case 1: /*如果是数字*/
{
jud1[i++]=*p;
sign=0;
break;
}
case 2: /*是运算符号*/
{
if(sign)
{
/*sign用于判断能否输入运算符号*/
if(!flag||*flag=='(') /*表明这是第一个字符或者上一个字符是左括号则当正负号*/
if(*p=='+'||*p=='-') {sign=1;jud1[i++]=*p;break;}
else {printf("格式不正确w");exit(1);}
else {printf("格式不正确q");exit(1);}
/*sign等于零则允许输入运算符号*/
}
sign=1; /*标记下次输入运算符号则错误*/
if(*flag>=48&&*flag<=57) /*如果运算符号前面是数字*/
{
jud1[i]=0;
i=0;
sumon=change(jud1);
sum[++k]=sumon;
if(j>=0&&jud2[j]!='(')
{
n=decide(jud2[j],*p); /*和栈顶符号相比较优先级*/
if(n==1||n==0) /*栈顶符号优先级比较高*/
{
sumon=count(sum[k-1],jud2[j],sum[k]);
sum[--k]=sumon;
j--;
}
while(j>=0&&jud2[j]!='(')
{
n=decide(jud2[j],*p);
if(n==1||n==0)
{
sumon=count(sum[k-1],jud2[j],sum[k]);
sum[--k]=sumon;
j--;
}
else break;
}
jud2[++j]=*p;
}
else if(j<0||jud2[j]=='(')
jud2[++j]=*p; /*栈为空则进栈*/

}
else /*前面刚处理完一对括号*/
{
if(j>=0&&jud2[j]!='(')
{
n=decide(jud2[j],*p);
if(n>=0)
{
sumon=count(sum[k-1],jud2[j],sum[k]);
sum[--k]=sumon;
jud2[j]=*p;
}
else jud2[++j]=*p;
}
else jud2[++j]=*p;

}

break;
}
case 3:
{
if(*p=='(') /*处理左括号的情况*/
{
sign=1;
if(flag) /*考虑左括号前面是数字的情况,应为括号与数字之间加入个乘号*/
{
n=judge(*flag) ;
if(n==1) /*表示左括号前的字符是数字*/
{
jud1[i]='\0';
i=0;
sumon=change(jud1);
temp='*'; /*数字和左括号之彰加入乘号*/
if(j>=0&&jud2[j]!='(') /*符号栈不空且栈顶不是左括号*/
{
n=decide(temp,jud2[j]);
if(n==0)
{
sumon=count(sum[k],jud2[j],sumon);
sum[k]=sumon;
jud2[j]=temp;
}
else
{
jud2[++j]=temp;
sum[++k]=sumon;
}
}
else {sum[++k]=sumon;jud2[++j]=temp;}
}
}
jud2[++j]=*p; /*左括号号则入栈*/
}
else /*处理右括号的情况*/
{
sign=0;
if(!flag)
{printf("格式不正确a");exit(1);}
n=judge(*flag);
if(n==2)
{printf("格式不正确b");exit(1);}
/*处理一对括号内的结果*/
if(n==1) /*右括号前面的是数字*/
{
jud1[i]='\0';
sumon=change(jud1);
sum[++k]=sumon;
i=0;
while(jud2[j]!='(')
{
s=count(sum[k-1],jud2[j],sum[k]);
k--;
sum[k]=s;
j--;
}
j--;
}
else if(*flag==')') /*考虑右括号前面的仍是右括号*/
{
while(jud2[j]!='(')
{
s=count(sum[k-1],jud2[j],sum[k]);
k--;
sum[k]=s;
j--;
}
j--;
}
}
break;
}
default:
{
printf("有不合法的字符存在,退出!");exit(1);
}
}
flag=p;
p++;
}
/*表达式结束后的处理*/
n=judge(*flag);
if(n==2)
{
/*若最后一个字符是运算符号则出错*/
printf("error,fuck!");exit(1);
}
else if(n==1)
{
jud1[i]='\0';
sumon=change(jud1);
sum[++k]=sumon;
while(j>=0)
{
sumon=count(sum[k-1],jud2[j],sum[k]);
k--;
sum[k]=sumon;
j--;
}
printf("now the result is:%5.2f\n",sum[k]);
}
else if(n==3)
{
while(j>=0&&k>=0)
{
sumon=count(sum[k-1],jud2[j],sum[k]);
k--;
sum[k]=sumon;
j--;
}
printf("now the result is:%5.2f\n",sum[k]);
}
getchar();
}