微软计算器c语言代码大全,C语言计算器代码

include

#include

#define LEN 100

#define FLOAT 30///这两个参数控制表达式最大长度

unsigned char left;

unsigned char right;///括号起始和结束

int opverify( char*s)///检查运算符是否有错误的函数

{

unsigned char i,flagl=0,flagr=0;

int a;

for(i=0;i

{

if(s[i]==43||s[i]==45)

{

flagr=0;

for(a=i+1;a

{

if(s[a]==46||(s[a]>=48&&s[a]<=57)||s[a]==40)

{

flagr=1;

break;

}

if(s[a]==42||s[a]==47||s[a]==41)

{

return i;

}

}

if(flagr==0)

return i;

}

if(s[i]==42||s[i]==47)

{

flagl=0;flagr=0;

for(a=i-1;i>=0;a--)          ///左边有数字

{

if(s[a]==46||(s[a]>=48&&s[a]<=57)||s[a]==41)

{

flagl=1;

break;

}

if(s[a]==42||s[a]==47||s[a]==40)

{

return i;

}

}

for(a=i+1;a

{

if(s[a]==46||(s[a]>=48&&s[a]<=57)||s[a]==40)

{

flagr=1;

break;

}

if(s[a]==42||s[a]==47||s[a]==41)

{

return i;

}

}

if(flagl==0||flagr==0)

return i;

}

}

return -1;

}

int dotverify( char*s)///检查小数点是否有错误的函数

{

unsigned char i,dotcount,numcount;

for(i=0;i

{

if(s[i]==46||(s[i]>=48&&s[i]<=57))

{

dotcount=0;

numcount=0;

while(1)

{

if(s[i]==46)

{

dotcount++;

i++;

continue;

}

if(s[i]>=48&&s[i]<=57)

{

numcount++;

i++;

continue;

}

break;

}

if(dotcount>1||numcount==0)

{

while(s[i]!=46)

i--;

return i;

}

}

}

return -1;

}

int kuohaoverify( char*s)///检查括号是否有错误的函数

{

unsigned char i;

char wrongposition=0;

int flag=0;

for(i=0;i

{

if(i>0)

if(s[i-1]==40&&s[i]==41)

return wrongposition;

if(s[i]==40)

flag++;

if(s[i]==41)

flag--;

if(flag<0)

return wrongposition;

if(s[i]!=0)

wrongposition++;

}

if(flag==0)

return -1;

return wrongposition;

}

int kuohaolocater( char*s)///定位内层配对括号起点和终点

{

unsigned char i;

for(i=0;i

{

if(s[i]==40)

left=i;

if(s[i]==41)

{

right=i;

return 1;

}

}

return 0;

}

void convert( char*s,float*num)///原始字符串分离成运算符和编号数组+浮点数组

{

int source=LEN-1,target=LEN-2;

unsigned char count=0;

while(s[source]==0)

source--;

count=target-source;

while(source>=0)

{

s[target]=s[source];

target--;

source--;

}

for(source=0;source

s[source]=0;

source=count;target=0;count=0;

while(source

{

if(s[source]==46||(s[source]>=48&&s[source]<=57))

{

num[count]=(float)atof(s+source);

s[target]=48+count;

count++;

source++;

target++;

while(s[source]==46||(s[source]>=48&&s[source]<=57))

source++;

continue;

}

if(s[source]==41&&(s[source+1]==46||(s[source+1]>=48&&s[source+1]<=57)))

{

s[target]=s[source];

target++;

source++;

s[target]=42;

target++;

continue;

}

if(s[source]==40&&(s[source-1]==46||(s[source-1]>=48&&s[source-1]<=57)))

{

s[target]=42;

target++;

}

s[target]=s[source];

target++;

source++;

}

for(source=target;source

s[source]=0;

}

void signprocess(char *s,float*num)///运算符处理函数,负责处理符号以及处理一些不标准的写法

{

unsigned char flagl;

int a,i;

for(i=right;i>=left;i--)

{

if(s[i]==43||s[i]==45)

{

flagl=0;

for(a=i-1;a>=left;a--)          ///zuobianyoushuzi

{

if(s[a]>=48)

{

flagl=1;

break;

}

if(s[a]>=40&&s[a]<=47)

{

break;

}

}

if(flagl==0)

{

if(s[i]==43)

s[i]=0;

if(s[i]==45)

{

s[i]=0;

for(a=i+1;;a++)

if(s[a]>=48)

{

num[s[a]-48]=-num[s[a]-48];

break;

}

}

}

}

}

}

void multipledivide(char *s,float*num)///乘除法计算函数

{

unsigned char i,flagl,flagr,a;

for(i=left+1;i

{

if(s[i]==42||s[i]==47)

{

for(a=i+1;;a++)

if(s[a]>=48)

{

flagr=s[a]-48;

break;

}

for(a=i-1;;a--)

if(s[a]>=48)

{

flagl=s[a]-48;

break;

}

if(s[i]==42)

{

num[flagr]=num[flagl]*num[flagr];

s[a]=0;

s[i]=0;

}

if(s[i]==47)

{

num[flagr]=num[flagl]/num[flagr];

s[a]=0;

s[i]=0;

}

}

}

}

void addminus(char*s,float*num)///加减法计算函数

{

unsigned char i,flagl,flagr,a;

for(i=left+1;i

{

if(s[i]==43||s[i]==45)

{

for(a=i+1;;a++)

if(s[a]>=48)

{

flagr=s[a]-48;

break;

}

for(a=i-1;;a--)

if(s[a]>=48)

{

flagl=s[a]-48;

break;

}

if(s[i]==43)

{

num[flagr]=num[flagl]+num[flagr];

s[a]=0;

s[i]=0;

}

if(s[i]==45)

{

num[flagr]=num[flagl]-num[flagr];

s[a]=0;

s[i]=0;

}

}

}

}

void singlecacu(char*s,float*num)///中间层运算函数,不带括号的计算函数,可以处理无括号的表达式

{

signprocess(s,num);

printf("***正负号处理完毕***\n");

multipledivide(s,num);

printf("***乘除完毕***\n");

addminus(s,num);

printf("***加减完毕***\n");

if(s[left]==40)

{

printf("***去括号***\n");

s[left]=0;

}

if(s[right]==41)

s[right]=0;///每次计算都将被处理的运算数、运算符、括号抹掉并在原位值写入本次计算结果,这样表达式越来越简。

}

void caculate (char*s,float*num)///顶层运算函数,循环调用括号查找和无括号计算函数,直到把括号消完

{

while(kuohaolocater(s))

singlecacu(s,num);

left=0;right=LEN-1;

singlecacu(s,num);

}

void display(char*s,float*num)///显示最终结果

{

unsigned char i;

for(i=0;i

if(s[i]>=48)

{

printf("结果:%f",num[s[i]-48]);

break;

}

}

int main()///注意不要使用中文括号和小数点

{

char wrongposition;///表达式错误位置

unsigned char i;

char s[LEN];///STEP1:初始化部分开始

for(i=0;i

{

s[i]=0;

}

float num[FLOAT];

for(i=0;i

{

num[i]=0;

}///初始化部分结束

printf("输入表达式\n");

scanf("%s",s);

///STEP2:表达式查错开始

wrongposition=kuohaoverify(s);

if(kuohaoverify(s)!=-1)

{

printf("括号错误\n位置:%d\n",wrongposition);

return 0;

}

printf("括号检查完毕\n");

wrongposition=dotverify(s);

if(dotverify(s)!=-1)

{

printf("小数点错误\n位置:%d\n",wrongposition);

return 0;

}

printf("小数点检查完毕\n");

wrongposition=opverify(s);

if(opverify(s)!=-1)

{

printf("运算符错误\n位置:%d\n",wrongposition);

return 0;

}

printf("运算符检查完毕\n");

///表达式查错部分结束

///STEP3:开始处理表达式,数据与运算符分离

convert(s,num);

printf("%s\n",s);

for(i=0;i

printf("%f  ",num[i]);

printf("\n***数据与运算符分离完毕***\n");

printf("\n");

///表达式处理完成

///STEP4:开始计算

caculate(s,num);

display(s,num);

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值