四则运算计算器
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;
}