| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3919 人关注过本帖
标题:怎样用C实现一个简单科学计算器
只看楼主 加入收藏
crackerwang
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:833
专家分:0
注 册:2007-2-14
收藏
得分:0 
差不多就这样子了,希望大家多多找出错误
目前同一级别括号只能支持100个,不算括号内的运算符号最多支持100个,要是想扩大你可以扩大number[]和fuhao[]的大小
可以使用小数,和负数,不过非表达式开头的负数请用括号括起来,没学过数据结构不会用笺只能写成这个德行了
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
double transform(char [],int );
void del(char* ,char *);
void del2(double [],int );
void convert(char [],char *,char *);
double jisuan(char []);

void main()
{
char str[100];
printf("IF you want to exit,press twice CTRL+Z will help you!!\n");
while(scanf("%s",str)!=EOF)
printf("%f\n",jisuan(str));
}
double jisuan(char str[])
{
char *p;
char ss[100]={'\0'},fuhao[100]={'\0'};
double number[100]={0.0},num[100]={0.0};
int kk=0,right,left,i,j=0,flag=0;
p=strchr(str,'(');
while(p!=NULL)
{
for(left=right=i=0;str[i]!='\0';i++)
{
if(str[i]=='(')left++;
if(str[i]==')')right++;
if(left==right&&left!=0)
{
convert(ss,++p,&str[i-1]);
number[kk++]=jisuan(ss);
*(--p)='q';
p++;
del(p,&str[i+1]);
left=right=0;
i=-1;
break;
}
}
p=strchr(str,'(');
}
if(str[0]=='-')
flag=1;
for(i=1,kk=0;str[i-1]!='\0';i++)
{
if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'||str[i]=='\0')
{
if(str[i-1]!='q')
{
num[j]=transform(str,i);
fuhao[j++]=str[i];
}
else
{
num[j]=number[kk++];
fuhao[j++]=str[i];
}
}
}
if(flag)
{
num[0]=0-num[0];
flag=0;
}
for(i=0;fuhao[i]!='\0';i++)
{
if(fuhao[i]=='*'||fuhao[i]=='/')
{
if(fuhao[i]=='*')
num[i]*=num[i+1];
else
num[i]/=num[i+1];
del(&fuhao[i],&fuhao[i+1]);
del2(num,i+1);
i=-1;
}
}
for(i=0;fuhao[i]!='\0';i++)
{
if(fuhao[i]=='+'||fuhao[i]=='-')
{
if(fuhao[i]=='+')
num[i]+=num[i+1];
else
num[i]-=num[i+1];
del(&fuhao[i],&fuhao[i+1]);
del2(num,i+1);
i=-1;
}
}
return num[0];
}
void del(char *i,char *j)
{
for(i;*j!='\0';j++)
*(i++)=*j;
*i=*j;
}
void del2(double 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;
}

double transform(char str[],int j)
{
char temp[100]={'\0'};
int k=0,i;
i=j;
while(i--)
{
if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/')
break;
}
for(i++;i<j;i++)
temp[k++]=str[i];
return atof(temp);
}
自己没有测试过太复杂的数据,最复杂的就是这个了1.0+(-3.0)/2.0+((3.0-4.0)/2.0)

2007-03-19 14:39
wuwei168668
Rank: 1
等 级:新手上路
帖 子:154
专家分:0
注 册:2007-3-11
收藏
得分:0 
好牛啊!

学C语言难得过老外学用中国的筷子吗?
2007-03-25 00:35
perdaiz
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2009-10-31
收藏
得分:0 
怎样写计算器,还能使计算器保留式子?运算用栈或者树比较好写点,但我也没做,各位大牛指导!
2010-09-06 10:30
junlove09
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2012-6-25
收藏
得分:0 
学习一下
2013-01-10 19:37
快速回复:怎样用C实现一个简单科学计算器
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019229 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved