计算器
通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。
输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。
补充说明:
1、操作数为正整数,不需要考虑计算结果溢出的情况。
2、若输入算式格式错误,输出结果为“0”。
要求实现函数:
void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr);
【输入】 pInputStr: 输入字符串
lInputLen: 输入字符串长度
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例
输入:“4 + 7” 输出:“11”
输入:“4 - 7” 输出:“-3”
输入:“9 ++ 7” 输出:“0” 注:格式错误
-
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #define MAXCHAR 256 5 void stringFilter(constchar* pInputStr ,long lInputLen ,char* pOutputStr) 6 { 7 bool hash[26]={0};//统计字符是否出现 8 int i , j; 9 for(i =0, j =0; i < lInputLen;++i) 10 { 11 if(false== hash[pInputStr[i]-'a'])//该字符还木有出现过 12 { 13 hash[pInputStr[i]-'a']=true; 14 pOutputStr[j++]= pInputStr[i]; 15 } 16 } 17 pOutputStr[j]='\0'; 18 } 19 void stringZip(constchar* pInputStr ,long lInputLen ,char* pOutputStr) 20 { 21 int i , j , k , num; 22 char buffer[20]; 23 for(i =0, k =0; i < lInputLen;) 24 { 25 num =0; 26 for(j = i +1; j < lInputLen ;++j) 27 { 28 if(pInputStr[i]== pInputStr[j])//统计字符串中每个字符后面连续出现的重复字母次数 29 ++num; 30 else 31 break; 32 }//for 33 if(0!= num)//num可能是两位或三位或更多位的整数 34 { 35 memset(buffer ,0,sizeof(buffer)); 36 itoa(num +1, buffer ,10);//将整数按10进制转换为字符串 37 strcpy(pOutputStr + k , buffer); 38 k += strlen(buffer); 39 } 40 pOutputStr[k++]= pInputStr[i]; 41 i = i + num +1; 42 }//for 43 pOutputStr[k]='\0'; 44 } 45 void arithmetic(constchar* pInputStr ,long lInputLen ,char* pOutputStr) 46 { 47 int i , j , num1 , num2 , result , num_space; 48 char buffer[4]; 49 bool add , sub; 50 add = sub =false; 51 for(i =0, num_space =0; i < lInputLen ;++i) 52 { 53 if(pInputStr[i]==' ') 54 ++num_space; 55 } 56 if(2!= num_space)//空格数非法 57 { 58 pOutputStr[0]='0'; 59 pOutputStr[1]='\0'; 60 return; 61 } 62 num1 = num2 =0; 63 for(i =0; pInputStr[i]!=' ';++i) 64 { 65 if(pInputStr[i]>='0'&& pInputStr[i]<='9') 66 num1 = num1 *10+ pInputStr[i]-'0'; 67 else//第一个操作数中有非法字符 68 { 69 pOutputStr[0]='0'; 70 pOutputStr[1]='\0'; 71 return; 72 } 73 } 74 for(j = i +1; pInputStr[j]!=' ';++j); 75 if(1!= j - i -1)//运算符长度不合法 76 { 77 pOutputStr[0]='0'; 78 pOutputStr[1]='\0'; 79 return; 80 } 81 else//操作符的长度为1 82 { 83 if('+'!= pInputStr[i+1]&&'-'!= pInputStr[i+1])//操作符号非法 84 { 85 pOutputStr[0]='0'; 86 pOutputStr[1]='\0'; 87 return; 88 } 89 else 90 { 91 if('+'== pInputStr[i+1]) 92 add =true; 93 if('-'== pInputStr[i+1]) 94 sub =true; 95 for(i = j +1; i < lInputLen ;++i) 96 { 97 if(pInputStr[i]>='0'&& pInputStr[i]<='9') 98 num2 = num2 *10+ pInputStr[i]-'0'; 99 else//第二个操作数中有非法字符 100 { 101 pOutputStr[0]='0'; 102 pOutputStr[1]='\0'; 103 return; 104 } 105 }//for 106 if(add) 107 result = num1 + num2; 108 elseif(sub) 109 result = num1 - num2; 110 memset(buffer ,0,sizeof(buffer)); 111 itoa(result , buffer ,10);//将整数按10进制转换为字符串 112 strcpy(pOutputStr , buffer); 113 }//esle 114 }//else 115 } 116 int main(void) 117 { 118 printf(" -- 2014年华为校园招聘机试题 (http://blog.csdn.net/hackbuteer1) --\n\n"); 119 char pInputStr1[]={"aaabbbcccdde"}; 120 char pInputStr2[]={"aaaaaaaaaaaabbcddddddddddddddddde"}; 121 char pInputStr3[]={"3 + 4"}; 122 char pOutputStr1[MAXCHAR]={0}; 123 char pOutputStr2[MAXCHAR]={0}; 124 char pOutputStr3[MAXCHAR]={0}; 125 stringFilter(pInputStr1 , strlen(pInputStr1), pOutputStr1); 126 stringZip(pInputStr2 , strlen(pInputStr2), pOutputStr2); 127 arithmetic(pInputStr3 , strlen(pInputStr3), pOutputStr3); 128 puts(pOutputStr1); 129 puts(pOutputStr2); 130 puts(pOutputStr3); 131 return0; 132 }
浙公网安备 33010602011771号