📄 shilyu.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 + -