c语言 简易计算器

应度友邀请,用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;
}


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值