四则运算计算器

四则运算计算器

C语言 dev

算法说明:

通过字符型转化为整型实现多位数输入,通过优先级数组实现对优先级的判断。定义一个变量确定运算符和运算数的输入,防止输入错误产生。再通过定义一个变量检查括号是否输入正确。

使用说明:

运算数据可以为多位数,运算符号为·:+、-、*、/、(、),最后以#结束。然后输出运算结果。输入时中间出现空格或其他符号会导致程序运行失败,或者不符合规则的式子也会出现运行失败。

代码:

数据准备
#include<stdio.h>
#include<stdlib.h>
#define  optrsize 7
typedef struct OPTR{
 int c;
 struct OPTR*prior;
}OPTR;
typedef struct OPTD{
 int n;
 struct OPTD*prior;
}OPTD;
#define OPTR_SIZE sizeof(OPTR)
#define OPTD_SIZE sizeof(OPTD)
int optr[optrsize][optrsize]={1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,2,0,1,
1,1,1,0,1,1,-1,-1,-1,-1,-1,0,3};
//运算符的优先级
char optr0[optrsize]={'+','-','*','/','(',')','#'}; //运算符数组

构建栈底
int main(){
 char c1;
 int c2,sign=1,symbol=0,bracket=0;//数字  单次运算结束标记   符号标记(0为数字,1为运算符)   括号运算
    OPTR*headr=(OPTR*)malloc(OPTR_SIZE),*pr=headr,*topr;//符号栈底 
 if(!headr)    return 0;
    headr->c=6;     headr->prior=NULL;  
    topr=(OPTR*)malloc(OPTR_SIZE);//符号 
 if(!headr)    return 0;
 topr->prior=pr;
    OPTD*headd=(OPTD*)malloc(OPTD_SIZE),*pd=headd,*topd=headd;//数字栈底 
 if(!headd)     return 0;
    headd->prior=NULL;
 printf("请输入算数表达式:");
 scanf("%c",&c1); //读入信息 
 
处理输入运算数数据
while(pr!=NULL){
  if('0'<c1&&c1<'9'){ //输入数字 
      if(symbol!=0){//判断是否该输数字 
       printf("字符输入错误!\n");
       return 0;
   } 
      int num=0;     
   while('0'<c1&&c1<'9'){//确定数字 
    num=num*10+(int)c1-48;   
    scanf("%c",&c1);  
   }
   topd->n=num;   pd=topd;    symbol=1;//该输入运算符 
   if(!(topd=(OPTD*)malloc(OPTD_SIZE)))    return 0;
   topd->prior=pd;
  } 
处理运算符数据
else{
   int i,k,n6,n7,sig,c2;    
   for(k=1,i=-1;k==1&&i<7;i++){    //i标记输入 
    if(optr0[i]==c1){ k=0;}
   }   i--;
   if(i==4)    bracket++;//判断括号是否正确  
   if(i==5)    bracket--;
   if(i<0||(i==6&&bracket>0)||(i!=4&&symbol!=1)){
    printf("符号输入错误!");
    return 0; 
   }
   for(sig=1;sig==1;){//优先级比较 
   int j=pr->c,a;  
   if(optr[j][i]==1){ //栈中符号优先级高 
    c2=pr->c;   n7=pd->n;  topd->prior=topd->prior->prior;  free(pd);  pd=topd->prior;
    n6=pd->n;     
    topr->prior=topr->prior->prior;   free(pr); pr=topr->prior;
进行运算
       switch(c2){
        case 0:
         n6=n6+n7;
         break;
        case 1:
         n6=n6-n7;
         break;
        case 2:
         n6=n6*n7;
         break;
        case 3:
         n6=n6/n7;
         break;
    }
    pd->n=n6;  
   }
判断优先级
   else if(optr[j][i]==-1){//栈中符号优先级
    topr->c=i;      pr=topr;
    if(!(topr=(OPTR*)malloc(OPTR_SIZE)))     return 0;
    topr->prior=pr;    
          scanf("%c",&c1);     sig=0;    symbol=0;
   }
   else if(optr[j][i]==3){ //为  #号 
    topr->prior=topr->prior->prior;  free(pr);   pr=topr->prior;
    sig=0;
      }
   else if(optr[j][i]==2){ //为()号 
    topr->prior=topr->prior->prior;  free(pr);   pr=topr->prior;  
    c2=pr->c;     j=c2;
       scanf("%c",&c1); 
    for(k=1,i=-1;k==1&&i<7;i++){    //i标记输入 
    if(optr0[i]==c1){ k=0;}
   }   i--; 
   }
   else{
    printf("输入有误!\n");  return 0;
   }
  }
  }
 }
 printf("=%d",pd->n);
 free(topr);
 free(pd);
 free(topd);
 return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值