| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 365 人关注过本帖
标题:刚得到一个程序,但是一部分读不懂!请求高手援助
只看楼主 加入收藏
guoxiaowei
Rank: 2
等 级:论坛游民
帖 子:15
专家分:20
注 册:2010-11-2
结帖率:50%
收藏
已结贴  问题点数:16 回复次数:3 
刚得到一个程序,但是一部分读不懂!请求高手援助
《简单计算器》
我自读懂的地方我已经加了注释了,没加注释的地方请高手帮忙加上!越详细越好!在下不胜感激!!!


#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
#define UNKNOWN_CHAR 2
#define DIVISOR_IS_ZERO 3
#define FALSE 0
#define TRUE 1


typedef struct string /*定义结构,主要用于GetString函数*/
{    char str;
    struct string *next;
}string;

/*函数声明:可以无限接受字符,输入一个字符就给你个空间,返回一个字符串首地址. */
/*这个函数可以看成普通的scanf()函数*/  
char *GetString();
/*从字符串str第*rank个字符开始分析直到遇到 ')' or ']' or '}' or '\0' . */
/*有错误就把错误代号装在*errorNum中,返回从中计算出的值*/  
double GetASResultOf(char * str, int *rank, int *errorNum);
/*从字符串str第*rank个字符开始分析直到遇到不符合要求的字符,返回这个单位值.*/
/*如:str="12+sin(30)+[12+cos(60)]"
 GetUnitageOf(str,0,errorNum)=12
 GetUnitageOf(str,3,errorNum)=0.5
 GetUnitageOf(str,11,errorNum)=12.5 */
double GetUnitageOf(char * str, int *rank, int *errorNum);
/*Are you ready? Let's go!----------------------------------*/
int main()
{
 /*定义变量*/  
 double value;
 int rank=0;
 int errorNum=TRUE;
 char * str;

 /*接收字符*/
 printf("counter v1.0\n");
 printf("Made by PT\n");
 printf("Date 2005-07-16\n\n");
 printf("Please input your arithmetic:\n");
 str=GetString();

 /*调用处理函数,*/
 value = GetASResultOf(str, &rank, &errorNum);
  
 /*错误处理(没完善)*/
 if (errorNum==TRUE) printf("计算结果为: %lf\n",value, rank);
 else if (errorNum==UNKNOWN_CHAR) printf("char error!\n");
 else if (errorNum==DIVISOR_IS_ZERO) printf("Divisor could not be 0 \n");
 else printf("Other error\n");
 getch();
 return 0;
}
/*0==[=========>无限动态字符接受函数*/
char *GetString()
{
 char *CharToString(string * sHead, int arraySize);
 int arraySize=0;  
 string *s;
 string *sHead;   
 s = (string *)malloc(sizeof(string));
 sHead = s;
 s->str = getchar();
 arraySize++;  
 while((s->str)!='\n')
 {
     arraySize++;
     s->next=(string *)malloc(sizeof(string));
     s=s->next;
     s->str=getchar();
 }  
 return CharToString(sHead, arraySize);
}
char *CharToString(string * sHead, int arraySize)
{
 char *strArray;
 string *s=sHead;
 int i=0;
 strArray = (char*)malloc(arraySize*sizeof(char));  
 while(i<arraySize)
 {
 if (s->str=='=' || s->str=='\n') break;
 if (s->str!=32) strArray[i++]=s->str;
 s=s->next;
 }
 strArray[i]='\0';
 return strArray;
}
/*0==[=========> 得到一个单位的值*/
double GetUnitageOf(char * str, int *rank, int *errorNum)
{
 double CharToNum(char * str, int *rank);
 double value;   
 /*如果是数字或负号就返回这个数字*/  
 if ((str[*rank]>=48 && str[*rank]<=57) || (str[*rank]=='-'))
 {if (str[*rank]=='-') {(*rank)++;value = (-1)*GetUnitageOf(str, rank,errorNum);}
 else {value = CharToNum(str, rank);}}
  
 /*如果是括号就用GetASResultOf取得括号里面的值并返回*/
 else if (str[*rank]=='(' ||
 str[*rank]=='[' ||
 str[*rank]=='{' )
 {(*rank)++;
 value = GetASResultOf(str, rank, errorNum);}
  
 /*返回sin(x)*/
 else if (str[*rank]=='s' &&
 str[(*rank)+1]=='i' &&
 str[(*rank)+2]=='n')
 { (*rank)=(*rank)+3;
 value = GetUnitageOf(str, rank, errorNum);
 value = sin(value);
 }
  
 /*返回cos(x)*/
 else if (str[*rank]=='c' &&
 str[(*rank)+1]=='o' &&
 str[(*rank)+2]=='s')
 {*rank=*rank+3;
 value = cos(GetUnitageOf(str, rank, errorNum));}
  
 /*返回tan(x)*/
 else if (str[*rank]=='t' &&
 str[(*rank)+1]=='a' &&
 str[(*rank)+2]=='n')
 {*rank=*rank+3;
 value = tan(GetUnitageOf(str, rank, errorNum));}
 /*还可以加一些的,懒得加了*/  
  
 /*defult:处理错误*/
 else {*errorNum = UNKNOWN_CHAR;value = 0;}
  
 /*检查errorNum*/
 if (*errorNum==TRUE){return value;}
 else return FALSE;
}

/*0==[=========>这个是把字符转换成数字的函数,只在GetUnitageOf()里用*/
/*数字不能超过15个,其余的将被抹去.*/
double CharToNum(char * str, int *rank)
{
 int j=0;
 double value=0;
  
 while((str[*rank]>=48 && str[*rank]<=57) || (str[*rank]==46))
 {
 if (str[*rank]!='.')
 {if ((j++)<=15) {value = value*10+(str[*rank]-48);}}
 else
 {if (j<=15)
 {
 for ((*rank)++,j=1; (str[*rank]>=48 && str[*rank]<=57 && str[*rank]!='\0'); (*rank)++, j++)
 {value = value+(str[*rank]-48)*pow(0.1,j);}
 return value;
 }
 }
  
 (*rank)++;
 }
 return value;
}
/*0==[=========>这个函数写的太复杂了,实在不好作解释,反正是在GetPDResultOf
函数和GetUnitageOf函数之间转啊转的*/
/*简单地说就是把str中第一个加减号前的式子算出来放在value变量中.再用函数  
GetPDResultOf算出直到二个加减号前的式子然后与value相加或相减放在
变量value中,以此类推,直到遇上 ')' or ']' or '}' or '\0' */
double GetASResultOf(char * str, int *rank, int *errorNum)
{
 double GetPDResultOf(char * str, int *rank, int *errorNum);
 double value;
 double dwIf_Zero;
  
 /*遇上 ')' or ']' or '}' or '\0' 就返回*/  
 while (str[*rank]!=')' &&
 str[*rank]!=']' &&
 str[*rank]!='}' &&
 str[*rank]!='\0')
 {
 if ((str[*rank]>=48 && str[*rank]<=57) ||
 str[*rank]=='s' ||
 str[*rank]=='c' ||
 str[*rank]=='t')
 {
 if ((str[*rank-1]==')' ||
 str[*rank-1]==']' ||  
 str[*rank-1]=='}') &&
 *rank!=0)  
 {value = value*GetUnitageOf(str, rank, errorNum);}  
 else  
 {value = GetUnitageOf(str, rank, errorNum);}  
 }
  
 else if (str[*rank]=='+')
 {if (str[*rank-1]!= '(' &&
 str[*rank-1]!= '[' &&
 str[*rank-1]!= '{' && (*rank)!=0 )
 {(*rank)++; value = value + GetPDResultOf(str, rank, errorNum);}
 else {*errorNum=UNKNOWN_CHAR;return 0;}}
  
  
 else if (str[*rank]=='-')
 {if (str[*rank-1]!= '(' &&
 str[*rank-1]!= '[' &&
 str[*rank-1]!= '{' && (*rank)!=0 )
 {(*rank)++; value = value - GetPDResultOf(str, rank, errorNum);}
 else {value = GetUnitageOf(str, rank, errorNum);}}
  
 else if (str[*rank]=='*')
 {if (str[*rank-1]!= '(' &&
 str[*rank-1]!= '[' &&
 str[*rank-1]!= '{' && (*rank)!=0 )
 {(*rank)++; value = value * GetUnitageOf(str, rank, errorNum);}
 else {*errorNum=UNKNOWN_CHAR;return 0;}}

 else if (str[*rank]=='/')
 {if (str[*rank-1]!= '(' &&
 str[*rank-1]!= '[' &&
 str[*rank-1]!= '{' && (*rank)!=0 )
 {(*rank)++;
 dwIf_Zero=GetUnitageOf(str, rank, errorNum);
 if (dwIf_Zero==0) {*errorNum=DIVISOR_IS_ZERO;return 0;}
 else value = value /dwIf_Zero;}
 else {*errorNum=UNKNOWN_CHAR;return 0;}}

 else if (str[*rank]== '(' ||
 str[*rank]== '[' ||
 str[*rank]== '{' )
 {if (str[*rank-1]!= '(' &&
 str[*rank-1]!= '[' &&
 str[*rank-1]!= '{' && (*rank)!=0 )
 {(*rank)++; value = value*GetASResultOf(str, rank, errorNum);}
 else {value = GetUnitageOf(str, rank, errorNum);}}


 else {*errorNum=UNKNOWN_CHAR;return FALSE;}


 if (*errorNum!=TRUE) return FALSE;
 }
 (*rank)++;
 return value;
}

double GetPDResultOf(char * str, int *rank, int *errorNum)
{
 double value;
 double dwIf_Zero;
 value = GetUnitageOf(str, rank, errorNum);
 if (str[*rank]=='\0') return value;
  
 while (str[*rank]!='+' &&
 str[*rank]!='-' &&
 str[*rank]!=')' &&
 str[*rank]!=']' &&
 str[*rank]!='}')
 {
 if (str[*rank]=='*')  
 value = value * GetUnitageOf(str, rank, errorNum);
 else if (str[*rank]=='/')
 {
dwIf_Zero= GetUnitageOf(str, rank, errorNum);
if (dwIf_Zero=0) {*errorNum=DIVISOR_IS_ZERO;return 0;}
 else value = value /dwIf_Zero;
}
 else if (str[*rank]=='(' ||
 str[*rank]=='[' ||
 str[*rank]=='{')
 {(*rank)++;
 value = value * GetUnitageOf(str, rank, errorNum);}
 else {*errorNum=UNKNOWN_CHAR;return FALSE;}
 if (*errorNum!=TRUE) return FALSE;
 }
  
 return value;
}
搜索更多相关主题的帖子: 计算器 不胜感激 字符串 
2010-12-28 09:22
zhaoya881010
Rank: 9Rank: 9Rank: 9
来 自:芒砀古郡
等 级:蜘蛛侠
威 望:1
帖 子:339
专家分:1177
注 册:2010-11-21
收藏
得分:8 
顶一下!

Go Go Go
2010-12-28 09:36
guoxiaowei
Rank: 2
等 级:论坛游民
帖 子:15
专家分:20
注 册:2010-11-2
收藏
得分:0 
高手呢??快快快!
我又发现一个问题,就是凡是有关于三角函数的运算都是错的!有没有高手能够顺便解决了!
2010-12-28 09:41
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:8 
代码太长了,我汗

   唯实惟新 至诚致志
2010-12-28 12:01
快速回复:刚得到一个程序,但是一部分读不懂!请求高手援助
数据加载中...
 
   



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

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