⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shilyu.c

📁 unix环境下c语言屏幕编程开发
💻 C
字号:
/**  *  -些常用的函数  */#include "./../inc/screen.h"static int Result ;  /**计算出的结果**/static int Flag ;    /**计算过程中是否有两个0标志,这里的0不是输入的**/static char ModuleCalStr[16]={"123456789+-*/()"};void InitStr( char *pStr ){   int len ;   len = 0 ;   len = sizeof( pStr ) ;   memset( pStr, 0x00, len ) ;}/* *  生成1-9随机数 */int randnum(){   int num;   num = 0 ;   while( num == 0 )   {      num=random();      num=num%10;   }   return( num ); }/*在指定位置输出提示函数**/void Prompt( char *str ) {   plot( 25, 19, str );}/* * 判断字符串中运算符是 '*' '/' - +  1 - 为'*' 2 - 为'/' 3-为'-' 4-为'+' 0-为没有计算符 **/int JudgeCalChr( char *str, int *a, int *b ){	char TmpStr[ 3 ] ;	char *ptr ;		memset( TmpStr, 0x00, sizeof( TmpStr ));	ptr=NULL ;		if( ptr = strchr( str, '*' )  )	{		memcpy( TmpStr, str, ptr-str );		*a=atoi( TmpStr );		*b=atoi( ptr + 1 );		if( *a == 0 ) *a=Result ;		if( *b==0 ) *b=Result ;	   return 1 ;	}      if( ptr = strchr( str, '/' )  )	{		memcpy( TmpStr, str, ptr-str );		*a=atoi( TmpStr );		*b=atoi( ptr + 1 );		if( *a==0 ) *a=Result ;		if( *b==0 ) *b=Result ;		return 2 ;	}	   if( ptr = strchr( str, '-' )  )	{		memcpy( TmpStr, str, ptr-str );		*a=atoi( TmpStr );		*b=atoi( ptr + 1 );		if( *a==0 && *b==0 )		  Flag = 1 ;		if( *a==0 ) *a=Result ;		if( *b==0 ) *b=Result ;	   return 3 ;	}      if( ptr = strchr( str, '+' )  )	{		memcpy( TmpStr, str, ptr-str );		*a=atoi( TmpStr );		*b=atoi( ptr + 1 );		if( *a==0 && *b==0 )		  Flag = 1 ;		if( *a==0 ) *a=Result ;		if( *b==0 ) *b=Result ;	   return 4 ;	}   		return 0 ;}/*判断有没有运算符号*/int IsHaveCalChr( char *str ){	char *ptr;	ptr = NULL ;	if( ptr = strchr( str, '*' ) )	{	   return 1 ;	}      if( ptr = strchr( str, '/' ) )	{		return 2 ;	}	   if( ptr = strchr( str, '-' ) )	{	   return 3 ;	}      if( ptr = strchr( str, '+' ) )	{	   return 4 ;	}   		return 0 ;}/* * a*b|a-b|a+b|a/b 计算函数 输入为字符串 输出为计算出的字符串 */void Cal3Str( char *str ){	int a, b ;	int num , i;	char *ptr ;		a=b=num=i=0 ;			i = JudgeCalChr( str, &a, &b ) ;		if( i == 1 )	  num = a*b;   else if( i == 2 )	  num = a/b;	else if( i == 3 )	  num = a-b;	else if( i == 4 )	  num = a+b;    	        if( num == 0 )	  Result = Result ;		else	  Result = num ;  }	/* *  从字符串中取出运算符号的3位字符串 并将原字符串更新 */void UpteStr ( char *str, char *bakstr ){   char TmpStr[ 20 ] ;	char *ptr ;	char *ptr1, *ptr2 ;	int i , j, len ;		memset( TmpStr, 0x00, sizeof( TmpStr ));	ptr=ptr1=ptr2=NULL ;	i=j=len=0 ;	        len=strlen( str );	if( ptr1=strchr( str, '*' ) )	   i=ptr1-str ;	if( ptr2=strchr( str, '/' ) )	   j=ptr2-str ;	      if( ( ptr1 != NULL ) && ( ptr2 != NULL ) )	{		if( i < j ) 		   ptr = ptr1 ;		else		   ptr = ptr2 ;		goto RTN ;   	}		   	if( ptr = strchr( str, '*' )  )	{		goto RTN;	}      if( ptr = strchr( str, '/' )  )	{		goto RTN;	}			if( ptr1=strchr( str, '-' ) )	   i=ptr1-str ;	if( ptr2=strchr( str, '+' ) )	   j=ptr2-str ;		if( ( ptr1 != NULL ) && ( ptr2 != NULL ) )	{		if( i < j ) 		   ptr = ptr1 ;		else		   ptr = ptr2 ;		goto RTN ;   	}	   	   if( ptr = strchr( str, '-' )  )	{		goto RTN;	}      if( ptr = strchr( str, '+' )  )	{		goto RTN;	}   RTN:	 {       	int m, n ;	m=n=0;	m=ptr-str;	memcpy( TmpStr, str, ptr-str-1 );  /*运算符号前有一位*/        strcat( TmpStr, "0" );	strcat( TmpStr, ptr + 2 ) ;	memcpy( bakstr, ptr - 1, 3 ) ;	memset( str, 0x00, strlen( str ) );	strcpy( str, TmpStr ) ; }}	/**判断有没有括号 0 没有 1 有*/	int IsHaveBracket( char *str ){	if( strchr( str, '(' ) )	   return 1 ;	return 0 ;}/**取出括号内的字符串并用0代替原字符串*/int GetBrkStr( char *str, char *bakstr ){	char *ptr1, *ptr2;	char TmpStr[ 20 ] ;		ptr1=ptr2=NULL ;	InitStr( TmpStr ) ;		ptr1=strchr( str, '(' );	ptr2=strchr( str, ')' );	memcpy( TmpStr, str, ptr1-str ) ;	strcat( TmpStr, "0" ) ;	strcat( TmpStr, ptr2+1 ) ;	memcpy( bakstr, ptr1+1, ptr2-ptr1 ) ;	memset( str, 0x00, strlen( str ) ) ;	strcpy( str, TmpStr ) ;		return 0 ;}/**判断str字符串中是否有不符合的字符**//*0-没有 1-有*/int IsHaveNotNUM( char *str ){   char c;   char *ptr1, *ptr2;   char ModuleCalStr1[20];   InitStr( ModuleCalStr1 ) ;   ptr1=ptr2=NULL;   ptr1=str;   strcpy( ModuleCalStr1, "123456789+-*/()" );   while( *ptr1 != 0x00 )   {      c=*ptr1;      ptr2=strchr( ModuleCalStr1, c ) ;      if( ptr2 == NULL )	 return 1 ;      ptr1++ ;   }   return 0 ;}/**判断str字符串中运算符,括号和数字的个数是否符合**//**0-符合 1-不符合**/int JugStrOptNumBrak( char *str ){   int NumberNum;  /*数字的个数*/   int BrakNum1;   /*左括号的个数*/   int BrakNum2;   /*右括号的个数*/   int OptNum;     /*运算符的个数*/   char c;   char *ptr;   NumberNum=BrakNum1=BrakNum2=OptNum=0 ;   ptr=NULL;   ptr=str;   while( *ptr != 0x00 )   {      c=*ptr;      if( ( c >= '1' ) && ( c <= '9' ) )  NumberNum ++ ;      if( c == '(' )  BrakNum1 ++ ;      if( c == ')' )  BrakNum2 ++ ;      if( ( c == '+' ) || ( c == '-' ) || ( c == '*' ) || ( c == '/' ) )	 OptNum ++ ;      ptr ++ ;   }   if( ( NumberNum != 4 ) || ( OptNum != 3 ) )      return 1;   if( (BrakNum1 > 2) || (BrakNum2 > 2) || (BrakNum1 != BrakNum2) )      return 1;   return 0 ;}int IsNumber( char c ){   if( ( c >= '1' ) && ( c <= '9' ) )  return 1;   return 0 ;}int IsOpt( char c ){   if( ( c == '+' ) || ( c == '-' ) || ( c == '*' ) || ( c == '/' ) )      return 1;   return 0 ;}int IsBrakL( char c ){   if(  c == '(' )  return 1;   return 0 ;}int IsBrakR( char c ){   if(  c == ')' )  return 1;   return 0 ;}int IsBrak( char c ){   if( ( c == ')' ) || ( c == '(' ) )  return 1;   return 0 ;}/**判断str字符串中运算符,括号和数字的组合是否符合规则**//**0-符合 1-不符合**/int IsFormatStr( char *str ) {   char c, c1, c2 ;   char *ptr;   int len, i, j ;   ptr=NULL;   len=i=0;   len=strlen( str );   i=len-1;   ptr=str;   /**str第一位是运算符或')'**/   c=*ptr;   if( IsBrakR( c ) || IsOpt( c ) )  return 1 ;   /*最后一位是运算符或'('*/   ptr=str+i;   c=*ptr;   if( IsBrakL( c ) || IsOpt( c ) )  return 1 ;   /*邻近两位都是数字或都是运算符或是括号*/   j=1;    ptr=str;   while( j < len )   {     c1=*ptr; c2=*(ptr+1);     if( IsNumber( c1 ) && IsNumber( c2 ) )  return 1 ;     if( IsNumber( c1 ) && IsBrakL( c2 ) )   return 1 ;     if( IsBrakR( c1 ) && IsNumber( c2 ) )   return 1 ;     if( IsBrak( c1 ) && IsBrak( c2 ) )      return 1 ;     if( IsOpt( c1 ) && IsOpt( c2 ) )        return 1 ;     if( IsOpt( c1 ) && IsBrakR( c2 ))       return 1 ;     if( IsBrakL( c1 ) && IsOpt( c2 ))       return 1 ;     j++ ; ptr++ ;    }{     char *ptr1, *ptr2;   ptr1=ptr2=NULL;   /**右括号不能在左括号之前**/   if( IsHaveBracket( str ) )   {      ptr1=strchr( str, '(' );      ptr2=strchr( str, ')' );      if( ( ptr2-ptr1 ) < 0 )   return 1 ;   }}   return 0 ; }/**将数字排序**/void TaxisNum( a1, a2, a3, a4 )int *a1, *a2, *a3, *a4;{   int b, i;   b=i=0;   for( i=0; i<4; i++ )   {   if( *a1 > *a2 )   {  b=*a1; *a1=*a2; *a2=b;   }   if( *a2 > *a3 )   {  b=*a2; *a2=*a3; *a3=b;   }   if( *a3 > *a4 )   {  b=*a3; *a3=*a4; *a4=b;   }   }}/*从str字符串中抽出数字*/void GetNumFrmStr( str, d1, d2, d3, d4 )char *str;int *d1, *d2, *d3, *d4;{   int a[5], i ;   char c, TmpStr[5] ;   char *ptr;      a[1]=*d1; a[2]=*d2; a[3]=*d3; a[4]=*d4;   ptr=NULL;   ptr=str;   while( *ptr != 0x00 )   {      c=*ptr;      if( IsNumber( c ) )      {         i=1;  InitStr( TmpStr );         while( a[i] !=0 ) i++;         sprintf( TmpStr, "%c", c );         a[i] = atoi( TmpStr );       }      ptr++;   }    *d1=a[1]; *d2=a[2]; *d3=a[3]; *d4=a[4];}/**判断str字符串中的数字和屏幕中显示的数字是否一至**//**0-一样 1-不一样**/int JudgerNumIsScr( str, a1, a2, a3, a4 ) char *str;int a1, a2, a3, a4;{   int i, b;   int c1, c2, c3, c4;   int d1, d2, d3, d4;   c1=c2=c3=c4=0;   d1=d2=d3=d4=0;   c1=a1; c2=a2; c3=a3; c4=a4;   /*排序*/   TaxisNum( &c1, &c2, &c3, &c4 );   /*从str字符串中抽出数字*/   GetNumFrmStr( str, &d1, &d2, &d3, &d4 );   /*排序*/   TaxisNum( &d1, &d2, &d3, &d4 );   if( ( c1 != d1 ) || ( c2 != d2 ) || ( c3 != d3 ) || ( c4 != d4 ) )      return 1;    return 0;}/* *分析输入计算公式是否符合规范 *0-不符合 1-符合 */int AnalyCalStr( str, a1, a2, a3, a4, ErrMsg )char *str, *ErrMsg;int a1, a2, a3, a4 ;{  /**判断str字符串中是否有不符合的字符**/   if( IsHaveNotNUM( str ) )  {  strcpy( ErrMsg, "计算公式中有不符合的字符" );     return 0 ;  }  /**判断str字符串中运算符,括号和数字的个数是否符合**/  if( JugStrOptNumBrak( str ) )  {  strcpy( ErrMsg, "计算公式中的运算符或数字或括号的个数不符合" );     return 0 ;  }  /**判断str字符串中运算符,括号和数字的组合是否符合规则**/  if( IsFormatStr( str ) )  {  strcpy( ErrMsg, "计算公式中的运算符,数字,括号的组成不符合规则" );     return 0 ;  }  /**判断str字符串中的数字和屏幕中显示的数字是否一至**/  if( JudgerNumIsScr( str, a1, a2, a3, a4 ) )  {  strcpy( ErrMsg, "计算公式中的数字与屏幕显示的数据不一至" );     return 0 ;  }  return 1 ;}/**判断str中有几对括号**/int StrBarkNum( char *str ){   int BarkNum;   char *ptr, c;   BarkNum=0;   ptr=str;      while( *ptr != 0x00 )   {      c=*ptr;      if( IsBrakL( c ) )          BarkNum ++ ;      ptr++ ;   }   return( BarkNum );}/**计算两对括号的公式**/   /*返回计算出的值*/int Cal2BarkStr( char *str ){	char TmpStr1[20];	char TmpStr2[20];	int  CalNum1, CalNum2;	   InitStr( TmpStr2 ) ;   CalNum1=CalNum2=0;   GetBrkStr( str, TmpStr2 ) ;   while( IsHaveCalChr( TmpStr2 ) )   {     InitStr( TmpStr1 ) ;     UpteStr( TmpStr2, TmpStr1 ) ;     Cal3Str( TmpStr1 ) ;   }   CalNum1=Result;      InitStr( TmpStr2 );   GetBrkStr( str, TmpStr2 ) ;   while( IsHaveCalChr( TmpStr2 ) )   {     InitStr( TmpStr1 ) ;     UpteStr( TmpStr2, TmpStr1 ) ;     Cal3Str( TmpStr1 ) ;   }   CalNum2=Result;   return( CalNum1 * CalNum2 );   }	    /*计算字符串函数**/int AnaStrAndCal( str, a1, a2, a3, a4  )char *str ;int a1, a2, a3, a4 ;{	char TmpStr1[ 20 ] ;	char TmpStr2[ 20 ] ;		Result = 0 ;	Flag = 0 ;		InitStr( TmpStr1 ) ;	InitStr( TmpStr2 ) ;  if( StrBarkNum( str ) < 2 )  {     /*2.分析计算公式*/     while( strlen( str ) != 1 )     {        if( IsHaveBracket( str ) )        {        	   /**取出括号内的字符串并用0代替原字符串*/        	   InitStr( TmpStr2 ) ;        	   GetBrkStr( str, TmpStr2 ) ;        	   while( IsHaveCalChr( TmpStr2 ) )        	   {          	      InitStr( TmpStr1 ) ;        	      UpteStr( TmpStr2, TmpStr1 ) ;                 Cal3Str( TmpStr1 ) ;              }           }        else        {	           	             while( IsHaveCalChr( str ) )           {           	  InitStr( TmpStr1 ) ;           	  UpteStr( str, TmpStr1 ) ;           	  Cal3Str( TmpStr1 ) ;  	             }        }             }     }  else  {  	   return( Cal2BarkStr( str ) ) ;  }  /*3,计算出公式的结果*/  if( ( Result == 48 ) && ( Flag == 1 ) )      Result = Result / 2 ;    return( Result );}/**设置输出字符串的属性**/void PrtSet( j )int j;{	printf("%c[%dm",27,j);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -