fork(1) download
  1. /* 979 名前: デフォルトの名無しさん Mail: sage 投稿日: 2011/11/29(火) 21:17:42.06 */
  2. /* [1] 授業単元:コマンドライン引数 */
  3. /* [2] 問題文(含コード&リンク): */
  4. /* コマンドライン引数を用いて,以下の計算ができる簡易電卓プログラムを作成せよ. */
  5. /* 1. 2 ~5項式までの四則演算(計算順もちゃんと考慮すること) */
  6. /* (出力例)C :¥Programming>dentaku 2 + 5 / 5 + 4 * 2 + 1 */
  7. /* 答えは 12 */
  8.  
  9. /* C :¥Programming>dentaku 2 * 3 + 1 */
  10. /* 答えは 7 */
  11.  
  12. /* 2.()を用いた演算(かっこの中の計算を最優先する) */
  13. /* (出力例)C :¥Programming>dentaku ( 2 + 3 ) * 7 * ( 3 - 1 ) */
  14. /* 答えは 70 */
  15.  
  16. /* 3. (sin, cos, tan)の演算 */
  17. /* (出力例)C :¥Programming>dentaku sin(90) * 2 + 1 - 2 */
  18. /* 答えは 1 */
  19.  
  20. /* 4.logの演算 */
  21. /* (出力例)C :¥Programming>dentaku log(3) * 2 + 1 */
  22. /* 答えは 1.9542425094 */
  23.  
  24. /* 5. 半角スペースを入れ忘れても演算可能 */
  25. /* (出力例)C :¥Programming>dentaku 1-2*(3+1)-2 */
  26. /* 答えは 9 */
  27. /* [3] 環境 */
  28. /* [3.1] OS:Windows7 */
  29. /*  [3.2] コンパイラ名とバージョン:Borland C++ Compiler 5.5 */
  30. /*  [3.3] 言語:C言語 */
  31. /* [4] 期限:12/3まで */
  32. /* [5] その他の制限: */
  33.  
  34. #include <stdio.h>
  35. #include <stdlib.h>
  36. #include <string.h>
  37. #include <math.h>
  38. #define N 100
  39.  
  40. void
  41. pp(char v[][20])
  42. {
  43. int i;
  44. puts("---------------");
  45. for (i = 0; *v[i]; i++)
  46. printf("%s, ", v[i]);
  47. puts("\n---------------");
  48. }
  49.  
  50. double
  51. calc(char *s)
  52. {
  53. char *w = malloc(N), *p, *p2, v[N][20];
  54. int i, diff;
  55. double acc;
  56.  
  57. /* ()calc */
  58. while ((p = strchr(s, ')'))) {
  59. p2 = p + 1;
  60. *p = '\0';
  61. while (*p != '(')
  62. p--;
  63. *p = '\0';
  64. sprintf(w, "%s %g %s", s, calc(p + 1), p2);
  65. sprintf(s, "%s", w);
  66. }
  67.  
  68. /* tokenize */
  69. i = 0;
  70. sscanf(s, "%s", v[i]);
  71. p = strtok(s, " ");
  72. while (p) {
  73. sprintf(v[i], "%s", p);
  74. p = strtok(NULL, " ");
  75. i++;
  76. }
  77. sprintf(v[i], "%s", "");
  78.  
  79. /* log calc */
  80. for (i = 0; *v[i]; i++) {
  81. if (strcmp("log", v[i]) == 0) {
  82. sprintf(v[i], "%g", log10(atof(v[i + 1])));
  83. sprintf(v[i + 1], " ");
  84. }
  85. }
  86.  
  87. /* sin calc */
  88. for (i = 0; *v[i]; i++) {
  89. if (strcmp("sin", v[i]) == 0) {
  90. sprintf(v[i], "%g", sin(atof(v[i + 1]) / 180 * M_PI));
  91. sprintf(v[i + 1], " ");
  92. }
  93. }
  94.  
  95. /* cos calc */
  96. for (i = 0; *v[i]; i++) {
  97. if (strcmp("cos", v[i]) == 0) {
  98. sprintf(v[i], "%g", cos(atof(v[i + 1]) / 180 * M_PI));
  99. sprintf(v[i + 1], " ");
  100. }
  101. }
  102.  
  103. /* tan calc */
  104. for (i = 0; *v[i]; i++) {
  105. if (strcmp("tan", v[i]) == 0) {
  106. sprintf(v[i], "%g", tan(atof(v[i + 1]) / 180 * M_PI));
  107. sprintf(v[i + 1], " ");
  108. }
  109. }
  110.  
  111. /* compact */
  112. diff = 0;
  113. for (i = 0; *v[i]; i++) {
  114. if (*v[i] == ' ')
  115. diff++;
  116. if (diff && *v[i] != ' ')
  117. sprintf(v[i - diff], "%s", v[i]);
  118. }
  119. sprintf(v[i - diff], "%s", "");
  120.  
  121. /* - calc */
  122. for (i = 0; *v[i]; i++) {
  123. if (strcmp("-", v[i]) == 0) {
  124. sprintf(v[i], "+");
  125. sprintf(v[i + 1], "%g", -atof(v[i + 1]));
  126. }
  127. }
  128.  
  129. /* / calc */
  130. for (i = 0; *v[i]; i++) {
  131. if (strcmp("/", v[i]) == 0) {
  132. sprintf(v[i], "*");
  133. sprintf(v[i + 1], "%g", 1 / atof(v[i + 1]));
  134. }
  135. }
  136.  
  137. /* * calc */
  138. for (i = 0; *v[i]; i++) {
  139. if (strcmp("*", v[i]) == 0) {
  140. sprintf(v[i], " ");
  141. sprintf(v[i + 1], "%g", atof(v[i - 1]) * atof(v[i + 1]));
  142. sprintf(v[i - 1], "0");
  143. }
  144. }
  145.  
  146. /* pp(v); */
  147.  
  148. /* + calc */
  149. acc = 0;
  150. for (i = 0; *v[i]; i++)
  151. acc += atof(v[i]);
  152. return acc;
  153. }
  154.  
  155. char *
  156. insertBlank(char *s)
  157. {
  158. char *w = malloc(N);
  159.  
  160. *w = '\0';
  161. while (*s) {
  162. if (strchr("+-*/()", *s)) {
  163. strcat(w, " ");
  164. strncat(w, s, 1);
  165. strcat(w, " ");
  166. } else {
  167. strncat(w, s, 1);
  168. }
  169. s++;
  170. }
  171.  
  172. return w;
  173. }
  174.  
  175.  
  176. double
  177. dentaku(char *s)
  178. {
  179. return calc(insertBlank(s));
  180. }
  181.  
  182. int
  183. main(int argc,char**argv)
  184. {
  185.  
  186. char *s[] = {
  187. "2 + 5 / 5 + 4 * 2 + 1",
  188. "2 * 3 + 1",
  189. "( 2 + 3 ) * 7 * ( 3 - 1 )",
  190. "sin(90) * 2 + 1 - 2",
  191. "log(3) * 2 + 1",
  192. "1-2*(3+1)-2",
  193. "log(log(123))",
  194. "log log 123",
  195. "1+( log(2 *sin (5*log (2)+1)/2)+3*4)"
  196. };
  197. int i;
  198. for (i = 0; i<9; i++)
  199. printf("input = %s\nresult = %g\n\n", s[i], dentaku(s[i]));
  200.  
  201. return 0;
  202. }
Success #stdin #stdout 0.01s 1856KB
stdin
Standard input is empty
stdout
input = 2  +  5  /  5  +  4   *   2   +   1
result = 12

input = 2 * 3 + 1
result = 7

input = ( 2 + 3 ) * 7 * ( 3 - 1 )
result = 70

input = sin(90) * 2 + 1 - 2
result = 1

input = log(3) * 2 + 1
result = 1.95424

input = 1-2*(3+1)-2
result = -9

input = log(log(123))
result = 0.320128

input = log log 123
result = -inf

input = 1+(  log(2 *sin (5*log (2)+1)/2)+3*4)
result = 11.6406