小学科学作业计算器c语言,怎样用C实现一个简单科学计算器

写了两个小时写的很粗陋,只能计算整数,但是可以支持多级别括号,和同一级别的多个括号。

希望大家多多指教,这个题目其实很有意思,要是大家有兴趣,可以把功能做的更加全面,比如算次方什么的

#include

#include

#include

void del(char* ,char *);

void del2(int [],int );

void convert(char [],char *,char *);

int jisuan(char []);

int num[100]={0};

void main()

{

char str[100];

int i;

printf("IF you want to exit,CTRL+Z will help you!!\n");

while(EOF!=scanf("%s",str))

{

printf("%d\n",jisuan(str));

for(i=0;i<100;i++)

num[i]=0;

}

}

int jisuan(char str[])

{

char *p;

char ss[100]={'\0'};

char fuhao[20]={'\0'};

int number[20]={0};

int kk=0,k,l,i,j=0,end=0,jj,wei=0;

p=strchr(str,'(');

while(p!=NULL)//查找str中的括号,并且优先处理,直到没有为止,

{

for(k=l=i=0;str[i]!='\0';i++)

{

if(str[i]=='(')k++;//这里是匹配多个括号,大家列个式子就能找到规律

if(str[i]==')')l++;

if(k==l&&k!=0)//第n个'('是和第'n'个')'匹配的

{

convert(ss,++p,&str[i-1]);//把括号中的字符传递出来处理

number[kk++]=jisuan(ss);//处理括号中的字符

num[0]=0;

*(--p)='q';//原来str中的括号位置用'q'来标志

p++;

del(p,&str[i+1]);//删除处理过的括号内容

k=l=0;

i=-1;

break;

}

}

p=strchr(str,'(');//继续查找括号

}

kk=0;

for(i=0;str[i]!='\0';i++)//这里我自己都觉得很没有条理,大家多花点时间

{

if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/')

{

if(str[i-1]!='q')

{

for(jj=i-1,wei=0;jj>=end;jj--)

{

num[j]+=(str[jj]-'0')*(int)pow(10,wei++);

}

end=i+1;//end记录的是最后数字的位子,比如说“123”end记录的应该是2的位置

fuhao[j++]=str[i];

}

else

end=i+1;

}

if(str[i]=='q')

{

num[j]=number[kk++];//遇到第几个q就把number中的第机个元素传递给num

end=i+2;

fuhao[j++]=str[i+1];

}

}

if(str[i-1]!='q')//这里是考虑到数组的结尾有没有处理的数据

{ //比如说字符串"1+2+q+3"按照上面的处理最后就还有一个'3'没处理

for(--i,wei=0;i>=end;i--)

{

num[j]+=(str[i]-'0')*(int)pow(10,wei++);

}

}

for(jj=0;fuhao[jj]!='\0';jj++)//开始进行计算这时候原来有括号的式子

{ //已经简化为没有括号的式子

if(fuhao[jj]=='*'||fuhao[jj]=='/')//先乘除

{

if(fuhao[jj]=='*')//参与第jj个符号计算的数据是num[]中的第jj个和第jj+1

{

num[jj]*=num[jj+1];

}

else

{

num[jj]/=num[jj+1];

}

del(&fuhao[jj],&fuhao[jj+1]);

del2(num,jj+1);

jj=-1;

}

}

for(jj=0;fuhao[jj]!='\0';jj++)

{

if(fuhao[jj]=='+'||fuhao[jj]=='-')

{

if(fuhao[jj]=='+')

{

num[jj]+=num[jj+1];

}

else

{

num[jj]-=num[jj+1];

}

del(&fuhao[jj],&fuhao[jj+1]);

del2(num,jj+1);

jj=-1;

}

}

return num[0];

}

void del(char *i,char *j)

{

for(i;*j!='\0';j++)

{

*(i++)=*j;

}

*i=*j;

}

void del2(int num[],int i)

{

for(;i<100;i++)

{

num[i]=num[i+1];

}

}

void convert(char ss[],char *p,char *q)

{

int i=0;

char *pp;

for(pp=p;pp<=q;pp++)

{

ss[i++]=*pp;

}

}

刚开始偷了个懒,把number[]和num[] 设置成为int型,所以精度只能做到整数,其次还不能处理 小数和负数,

如果大家有兴趣就替小弟我改一下,提示一下要是想处理负数和小数在做字符串转换成数字的时候建议用atoi;

免的用什么pow10(),等我作业写完了自己在来改一下

6f83fddf9cb9ff6843fffd45e1807199.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值