应度友邀请,用c写了个简易的命令行计算器,其功能大致如下:
设计简单的计算器,允许用户输入简单表达式(一元运算和二元运算表达式,以=结尾),输出计算结果,并等待用户继续输入,直到用户输入字符q。 输入输出举例 : 输入:10^2= // 求幂运算,指数必须整数 输出:100 输入:5!= //阶乘运算 输出:120 输入:9$= //判断是否平方数 输出:YES 输入:25+4+2= //累加,运算数个数不限 输出:31 输入:3&61&5&9= //求最大值,运算数个数不限 输出:61 输入:35% //奇数分解运算,将该数分解为3个素数 输出:35=3+3+29 输入:3+6%8= //不允许出现以上运算法则之外的表达式 输出:运算符非法,+只支持连用! 输入:10%= 输出:运算数非法,%只支持奇数! 输入:q 输出:谢谢使用!
#include <stdio.h>
#include<math.h>
int isprime(int n){ //是否素数
int i;
for(i=2;i<n/2+1;i++)
if(n%i==0)return 0;
return 1;
}
int prime(int n,int a[]){ //把n分解成3个素数
if(n%2==0)return 0;
for(a[0]=3;a[0]<n;a[0]++)
for(a[1]=a[0];a[1]<n;a[1]++)
for(a[2]=a[1];a[2]<n;a[2]++)
if(isprime(a[0])&&isprime(a[1])&&isprime(a[2])&&n==a[0]+a[1]+a[2])
return 1;
}
int jisuan(int a,char c,int b){ //返回加减乘除幂的结果
switch(c){
case '+':return a+b;
case '-':return a-b;
case '*':return a*b;
case '/':return a/b;
// case '^':return pow(a,b);
}
}
void ptferr(int c){ //输出错误信息
switch(c){
case '%':printf("运算数非法,%c只支持奇数!\n",c);break;
case '+':
case '-':
case '*':
case '/':printf("运算符非法,%c只支持连用!\n",c);break;
default: printf("error input:%c\n",c);
}
}
int ispfs(int res){ //判断是否平方数
int i;
for(i=1;i<=(res+1)/2;i++)
if(i*i==res)return 1;
return 0;
}
long leiji(int res){ //阶乘运算
int i;long s=1;
for(i=1;i<=res;i++)
s*=i;
return s;
}
void ptfres(int c,int res){ //输出计算结果
if(!c)printf("%d\n",res);
else{
int a[3];prime(res,a);
switch(c){
case '%':printf("%d=%d+%d+%d\n",res,a[0],a[1],a[2]);break;
case '$':printf("%s\n",ispfs(res)?"YES":"NO");break;
case '!':printf("%ld\n",leiji(res));break;
}
}
}
int main(){
int status=0,err=0,m=0,res=0,newline=1;
char c,first;
while((c=getchar())!='q'){ //当输入为'q'时退出
if(c>='0'&&c<='9'){
if(newline)res=res*10+c-'0';
else m=m*10+c-'0';
}else if('%'==c||'$'==c||'!'==c){/
if(newline){
if(0==res%2&&'%'==c)err=c;
else status=c;
newline=0;
first=c;
}else err=first;
} else if('+'==c||'-'==c||'*'==c||'/'==c||'^'==c){
if(newline){
newline=0;
first=c;
}else if(first!=c){
err=first;
}else{
res=jisuan(res,c,m);
m=0;
}
}else if('='==c){
if(!err&&!status)
res=jisuan(res,first,m);
}else if('\n'==c){
if(err) ptferr(err);
else ptfres(status,res);
newline=1;
status=res=m=0;
}else if('q'!=c){
err=c;
}
}
printf("谢谢使用!\n");
return 0;
}