码迷,mamicode.com
首页 > 其他好文 > 详细

计算器

时间:2015-07-06 19:39:18      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:

通过键盘输入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(const char* 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(const char* 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(const char* 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. else if(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. return 0;
  132. }





计算器

标签:

原文地址:http://www.cnblogs.com/ssy-zju/p/4625127.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!