| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3927 人关注过本帖
标题:怎样用C实现一个简单科学计算器
只看楼主 加入收藏
多维数组
Rank: 1
等 级:新手上路
帖 子:238
专家分:0
注 册:2006-8-16
收藏
 问题点数:0 回复次数:13 
怎样用C实现一个简单科学计算器
怎样用C实现一个简单科学计算器?
好像是用数型结构表示,但我不知道怎么写。

输入一个算式(可以有+ - * / ( )运算符),得到结果。
如:
(2+9*2)/5-(-2)(回车)
6

谢谢
搜索更多相关主题的帖子: 计算器 科学 
2007-03-17 21:42
wuwei168668
Rank: 1
等 级:新手上路
帖 子:154
专家分:0
注 册:2007-3-11
收藏
得分:0 
呵呵。我不会写。

学C语言难得过老外学用中国的筷子吗?
2007-03-17 23:36
iwfy
Rank: 1
等 级:新手上路
威 望:2
帖 子:888
专家分:0
注 册:2007-2-23
收藏
得分:0 
有点思路,开始先分解运算表达式
#include<math.h>
#include<stdlib.h>
#include <stdio.h>
main()
{
union gs
{
int shu;
char fh;
}ysfh[20];
int i,j=0,n,k=0,wei[4],l;
char *s;
scanf("%s",s);
n=strlen(s);
for(i=0;i<=n;i++)
{
if(57>=(int)*(s+i) && (int)*(s+i)>=48) //如果碰到整数字
wei[k++]=(int)*(s+i)-48; //把数字各位放到数组里
else
{
--k;
if(k>=0)
{
ysfh[j].shu=0;
l=0;
while(k>=0) //把wei里的数也放到gs里
ysfh[j].shu=ysfh[j].shu+wei[l++]*((int)pow10(k--));
j++;
}
if(i<n)
{
ysfh[j++].shu=-*(s+i); //gs[]里放+-*/()等运算符号
k=0;
}
}
}
i=j-1; //可以看到分解后的各结果
j--;
while(j>=0)
if(ysfh[i-j].shu>=0) printf("%d",ysfh[i-j--].shu); //分解运算表达式后的结果
else printf("%c",(char)(-ysfh[i-j--].shu));
//开始分析怎么运算,先判断有几个()每找到一个进入分解找到最里层的()
//
getch();
}后面的明天再想,估计今天晚上通宵是想不出来了,干脆睡觉

英语不好还想学编程??逆天之路,不由分说!! 数学太差还想学编程??离经叛道,义无返顾!!
2007-03-18 00:56
mujiu
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2007-3-18
收藏
得分:0 

人才~!!!


2007-03-18 02:19
liel
Rank: 1
等 级:新手上路
帖 子:115
专家分:0
注 册:2007-1-16
收藏
得分:0 

用数据结构里面的栈来实现最好!!


2007-03-18 08:59
crackerwang
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:833
专家分:0
注 册:2007-2-14
收藏
得分:0 
写了两个小时写的很粗陋,只能计算整数,但是可以支持多级别括号,和同一级别的多个括号。
希望大家多多指教,这个题目其实很有意思,要是大家有兴趣,可以把功能做的更加全面,比如算次方什么的
#include<stdio.h>
#include<string.h>
#include<math.h>
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(),等我作业写完了自己在来改一下

2007-03-18 17:16
w362034710
Rank: 1
等 级:新手上路
帖 子:169
专家分:0
注 册:2006-12-2
收藏
得分:0 

中缀转后缀,,,,

2007-03-18 17:56
crackerwang
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:833
专家分:0
注 册:2007-2-14
收藏
得分:0 
看来没有人有兴趣

2007-03-18 18:53
iwfy
Rank: 1
等 级:新手上路
威 望:2
帖 子:888
专家分:0
注 册:2007-2-23
收藏
得分:0 
不错,挺好的

英语不好还想学编程??逆天之路,不由分说!! 数学太差还想学编程??离经叛道,义无返顾!!
2007-03-19 09:28
crackerwang
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:833
专家分:0
注 册:2007-2-14
收藏
得分:0 
多谢楼上提供思路

2007-03-19 09:50
快速回复:怎样用C实现一个简单科学计算器
数据加载中...
 
   



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

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