计算器

通过键盘输入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.   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 }

     

 





posted on 2015-07-06 19:05  立顿经典醇  阅读(118)  评论(0)    收藏  举报

导航