回答編集履歴

2

追記

2017/06/19 07:54

投稿

toki_td
toki_td

スコア2850

test CHANGED
@@ -20,9 +20,45 @@
20
20
 
21
21
 
22
22
 
23
+ **追記1**
24
+
25
+ enumと構造体を使ってオペレータか数字の配列を作る
26
+
27
+ ```C
28
+
29
+ enum {
30
+
31
+ OP_ADD,
32
+
33
+ OP_SUB,
34
+
35
+ OP_MUL,
36
+
37
+ OP_DIV,
38
+
39
+ NUMEBR,
40
+
41
+ }KIND;
23
42
 
24
43
 
44
+
45
+ struct {
46
+
47
+ KIND kind;
48
+
49
+ int value;
50
+
51
+ }ELEMENT;
52
+
53
+
54
+
55
+ ELEMENT elements[30];
56
+
57
+ ```
58
+
59
+
60
+
25
- **追記**
61
+ **追記2**
26
62
 
27
63
  ()を総当たりで挿入する(オペレータは1文字、スペースは含まない前提)
28
64
 

1

追記

2017/06/19 07:54

投稿

toki_td
toki_td

スコア2850

test CHANGED
@@ -17,3 +17,123 @@
17
17
 
18
18
 
19
19
  3が難しかったらとりあえず式を文字列として見て、数字の前に(、それ以降の数字の後ろに)を挿入した文字列を順次作成していけば、あとは一般的な式の評価を行えばいいと思います。
20
+
21
+
22
+
23
+
24
+
25
+ **追記**
26
+
27
+ ()を総当たりで挿入する(オペレータは1文字、スペースは含まない前提)
28
+
29
+
30
+
31
+ ```C
32
+
33
+
34
+
35
+ static int evaluateExpression(const char* exp)
36
+
37
+ {
38
+
39
+ printf("eval: %s\n", exp);
40
+
41
+ return 0; // none
42
+
43
+ }
44
+
45
+ static const char* passNumber(const char* s)
46
+
47
+ {
48
+
49
+ while (*s && isdigit(*s)) s++;
50
+
51
+ return s;
52
+
53
+ }
54
+
55
+
56
+
57
+ int main()
58
+
59
+ {
60
+
61
+ const char* exp = "18-7*3-1+2=6";
62
+
63
+
64
+
65
+ const char* openPara = exp;
66
+
67
+ const char* closePara;
68
+
69
+
70
+
71
+ char exp2[100];
72
+
73
+
74
+
75
+ while (1) {
76
+
77
+ closePara = passNumber(openPara);
78
+
79
+
80
+
81
+ while (*closePara != '=') {
82
+
83
+ closePara = passNumber(closePara + 1); // +1 : pass operator
84
+
85
+
86
+
87
+ char* d = exp2;
88
+
89
+
90
+
91
+ for (const char* s = exp; *s; s++) {
92
+
93
+ if (s == openPara) *d++ = '(';
94
+
95
+ if (s == closePara) *d++ = ')';
96
+
97
+ *d++ = *s;
98
+
99
+ }
100
+
101
+ *d = '\0';
102
+
103
+
104
+
105
+ if (evaluateExpression(exp2)) {
106
+
107
+ printf("anser is : %s\n", exp2);
108
+
109
+ goto EXIT:
110
+
111
+ }
112
+
113
+ }
114
+
115
+
116
+
117
+ openPara = passNumber(openPara);
118
+
119
+ if (*openPara == '=') {
120
+
121
+ break;
122
+
123
+ }
124
+
125
+ openPara++; // pass operator
126
+
127
+ }
128
+
129
+ EXIT:
130
+
131
+
132
+
133
+ return 0;
134
+
135
+ }
136
+
137
+ ```
138
+
139
+ あとは[このへんを参考に](http://blog.goo.ne.jp/masaki_goo_2006/e/754f937f81f8b3ac389b9265c52fd98d)式を評価してみる