共有回帖数  0  个 
	 
	
	
	
     
          
          
               
				
			 
				
					 
 
            
				   - 
						
						
							 
									下面是我写的一个计算器程序,请大家赏个脸看一看。 
用法很简单,输入式子就可以得到答案。 
支持一般的数学符号,有兴趣的可以补充。 
如果看得懂得话就给个评价,这很重要。好就表扬一下,不好就批评漫骂都可以,最好是指出缺点,这也很重要。 
如果看不懂代码,那么就拿去编译成文件用一用,好还是不好也评价一下。(我觉得读代码很难,特别是不明朗得代码,然而我这次写的代码很不好看.) 
感谢大家,我是新来的PT,说明完毕,谢幕,退��
#includestdio.h 
#includeconio.h 
#includemath.h 
#includestdlib.h 
#define UNKNOWN_CHAR 2 
#define DIVISOR_IS_ZERO 3 
#define FALSE 0 
#define TRUE 1 
/*定义结构,主要用于GetString函数,可以不管它*/ 
typedef struct string 
{char str; 
 struct string *next; 
}string; 
/*函数声明*/  
/*可以无限接受字符,输入一个字符就给你个空间,返回一个字符串首地址 . */ 
/*这个函数可以看成普通的scanf()*/  
char *GetString(); 
/*从字符串str第*rank个字符开始分析直到遇到 ')' or ']' or '}' or ' ' . */ 
/*有错误就把错误代号装在*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.0n"); 
 printf("Made by PTn"); 
 printf("Date 2005-07-16nn"); 
 printf("Please input your arithmetic:n"); 
 str=GetString(); 
 /*调用处理函数,*/ 
 value = GetASResultOf(str, &rank, &errorNum); 
  
 /*错误处理(没完善)*/ 
 if (errorNum==TRUE) printf("The result is: %lfn",value, rank); 
 else if (errorNum==UNKNOWN_CHAR) printf("char error!n"); 
 else if (errorNum==DIVISOR_IS_ZERO) printf("Divisor could not be 0n"); 
 else printf("Other errorn"); 
 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(iarraySize) 
 { 
 if (s-str=='=' || s-str=='n') break; 
 if (s-str!=32) strArray[i++]=s-str; 
 s=s-next; 
 } 
 strArray=' '; 
 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]!=' '); (*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 ' ' */ 
double GetASResultOf(char * str, int *rank, int *errorNum) 
{ 
 double GetPDResultOf(char * str, int *rank, int *errorNum); 
 double value; 
 double dwIf_Zero; 
  
 /*遇上 ')' or ']' or '}' or ' ' 就返回*/  
 while (str[*rank]!=')' && 
 str[*rank]!=']' && 
 str[*rank]!='}' && 
 str[*rank]!=' ') 
 { 
 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]==' ') 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; 
}
我在xp下用TC(准确的说是WinTc v1.2)和dev-C++4.9.9.2下通过。 
完毕,收工。 
又是一个通宵��
							 
							 
							 
							  
							  
							  楼主 2016-03-16 12:38 回复
						 
						 
           
          
          
         
   
         
      
 
   
             
                  
                  
 
 
 
     
	 
  
	Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
	
	意见反馈 | 
	关于直线 | 
	版权声明 | 
	会员须知