回答編集履歴

7

サンプルプログラム追加

2019/02/23 15:10

投稿

toshi17922062
toshi17922062

スコア183

test CHANGED
@@ -131,3 +131,241 @@
131
131
  calculated result: 48.6
132
132
 
133
133
  ```
134
+
135
+
136
+
137
+ おまけ。
138
+
139
+ ついでに二分木なしのをpythonの勉強がてら作ってみました。まだバグあると思いますが。
140
+
141
+ pythonいいですよ。
142
+
143
+
144
+
145
+ ```python
146
+
147
+
148
+
149
+ atom={
150
+
151
+ 'H':1,
152
+
153
+ 'C':12,
154
+
155
+ 'O':16,
156
+
157
+ 'Cl':17,
158
+
159
+ 'Co':27
160
+
161
+ }
162
+
163
+
164
+
165
+ def is_num(s):
166
+
167
+ return s.replace(',', '').replace('.', '').replace('-', '').isnumeric()
168
+
169
+
170
+
171
+ def chmicalc(cf):
172
+
173
+ cflist=list(cf) #リスト化する
174
+
175
+ cftemp=[]
176
+
177
+ for temp in cflist:
178
+
179
+ if temp in ['(',')']:
180
+
181
+ #1.括弧'('or')'のケース
182
+
183
+ if (not len(cftemp)==0) and cftemp[-1].isalpha() and temp=='(':
184
+
185
+ #最初ではない、'('かつリスト最後が文字のとき:'+'をappend後、tempをappend
186
+
187
+ cftemp.append('+')
188
+
189
+ cftemp.append(temp)
190
+
191
+ else:
192
+
193
+ #それ以外の括弧:tempをappend
194
+
195
+ cftemp.append(temp)
196
+
197
+ elif temp.isalpha():
198
+
199
+ #2.文字(元素記号)のケース:
200
+
201
+ if temp==temp.upper():
202
+
203
+ #大文字のケース:
204
+
205
+ if (not len(cftemp)==0) and (is_num(cftemp[-1]) or cftemp[-1].isalpha()):
206
+
207
+ #最初ではない、かつリスト最後が文字か数字なら'+'をappend後、tempをappend
208
+
209
+ cftemp.append('+')
210
+
211
+ cftemp.append(temp)
212
+
213
+ else:
214
+
215
+ #それ以外の文字:tempをappend
216
+
217
+ cftemp.append(temp)
218
+
219
+ else:
220
+
221
+ #小文字のケース:cftempの最後の文字に追加
222
+
223
+ cftemp[-1]+=temp
224
+
225
+ elif temp.isnumeric():
226
+
227
+ #3.数字のケース
228
+
229
+ if cftemp[-1]==')':
230
+
231
+ #リスト最後の文字が')':'*'をappend後、tempをappend
232
+
233
+ cftemp.append('*')
234
+
235
+ cftemp.append(temp)
236
+
237
+ elif (is_num(cftemp[-1])):
238
+
239
+ #リスト最後が数字:cftempの最後の文字に追加
240
+
241
+ cftemp[-1]+=temp
242
+
243
+ elif (not cftemp[-1].find('.')==-1):
244
+
245
+ #リスト最後がピリオド:cftempの最後の文字に追加
246
+
247
+ cftemp[-1]+=temp
248
+
249
+ else:
250
+
251
+ #それ以外の数字:'*'をappend後、tempをappend
252
+
253
+ cftemp.append('*')
254
+
255
+ cftemp.append(temp)
256
+
257
+ elif temp=='.':
258
+
259
+ #4.ピリオドのケース:cftempの最後の文字に追加
260
+
261
+ cftemp[-1]+=temp
262
+
263
+
264
+
265
+ compleatcf=''
266
+
267
+ for temp in cftemp:
268
+
269
+ if temp.isalpha():
270
+
271
+ compleatcf+=str(atom[temp]) #元素記号の数値化
272
+
273
+ else:
274
+
275
+ compleatcf+=temp
276
+
277
+
278
+
279
+ print('元の化学式:cf:{}'.format(cf))
280
+
281
+ print('テンポラリ:cftemp:{}'.format(cftemp))
282
+
283
+ print('compleatcf:{}'.format(compleatcf))
284
+
285
+ print('eval(compleatcf):{}'.format(eval(compleatcf)))
286
+
287
+
288
+
289
+
290
+
291
+
292
+
293
+ #CO2
294
+
295
+ chmicalc('CO2')
296
+
297
+
298
+
299
+ #(CH3)2CO
300
+
301
+ chmicalc('(CH3)2CO')
302
+
303
+
304
+
305
+ #CH(C0.8H0.2)2O
306
+
307
+ chmicalc('CH(C0.8H0.2)2O')
308
+
309
+
310
+
311
+ #CH3CH2OH
312
+
313
+ chmicalc('CH3CH2OH')
314
+
315
+
316
+
317
+ #CoCl2
318
+
319
+ chmicalc('CoCl2')
320
+
321
+
322
+
323
+ ```
324
+
325
+
326
+
327
+ ```実行結果
328
+
329
+ 元の化学式:cf:CO2
330
+
331
+ テンポラリ:cftemp:['C', '+', 'O', '*', '2']
332
+
333
+ compleatcf:12+16*2
334
+
335
+ eval(compleatcf):44
336
+
337
+ 元の化学式:cf:(CH3)2CO
338
+
339
+ テンポラリ:cftemp:['(', 'C', '+', 'H', '*', '3', ')', '*', '2', '+', 'C', '+', 'O']
340
+
341
+ compleatcf:(12+1*3)*2+12+16
342
+
343
+ eval(compleatcf):58
344
+
345
+ 元の化学式:cf:CH(C0.8H0.2)2O
346
+
347
+ テンポラリ:cftemp:['C', '+', 'H', '+', '(', 'C', '*', '0.8', '+', 'H', '*', '0.2', ')', '*', '2', '+', 'O']
348
+
349
+ compleatcf:12+1+(12*0.8+1*0.2)*2+16
350
+
351
+ eval(compleatcf):48.6
352
+
353
+ 元の化学式:cf:CH3CH2OH
354
+
355
+ テンポラリ:cftemp:['C', '+', 'H', '*', '3', '+', 'C', '+', 'H', '*', '2', '+', 'O', '+', 'H']
356
+
357
+ compleatcf:12+1*3+12+1*2+16+1
358
+
359
+ eval(compleatcf):46
360
+
361
+ 元の化学式:cf:CoCl2
362
+
363
+ テンポラリ:cftemp:['Co', '+', 'Cl', '*', '2']
364
+
365
+ compleatcf:27+17*2
366
+
367
+ eval(compleatcf):61
368
+
369
+
370
+
371
+ ```

6

実行結果追加

2019/02/23 15:10

投稿

toshi17922062
toshi17922062

スコア183

test CHANGED
@@ -56,7 +56,11 @@
56
56
 
57
57
  (入力) CH(C0.8H0.2)2O
58
58
 
59
- +-
59
+ +-----
60
+
61
+ | |
62
+
63
+ +- O
60
64
 
61
65
  | |
62
66
 
@@ -64,15 +68,15 @@
64
68
 
65
69
  | |
66
70
 
67
- H *---------
71
+ H *--------------
68
72
 
69
- | |
73
+ | |
70
74
 
71
- +------ 2O
75
+ +------ 2
72
76
 
73
77
  | |
74
78
 
75
- *-- *--
79
+ *-- *--
76
80
 
77
81
  | | | |
78
82
 
@@ -80,4 +84,50 @@
80
84
 
81
85
 
82
86
 
87
+
88
+
83
89
  ```
90
+
91
+ ついでの先にリンクしたサイトのpythonバージョンでの実行結果を載せておきます。
92
+
93
+ CHOをそれぞれ数値化して、式に+*を明示して()もそのまま入力しました。
94
+
95
+
96
+
97
+ ```実行結果
98
+
99
+ input expression: expression: 12+16*2
100
+
101
+ reverse polish notation: 12 16 2 * +
102
+
103
+ infix notation: (12 + (16 * 2))
104
+
105
+ polish notation: + 12 * 16 2
106
+
107
+ calculated result: 44
108
+
109
+
110
+
111
+ input expression: expression: (12+1*3)*2+12+16
112
+
113
+ reverse polish notation: 12 1 3 * + 2 * 12 + 16 +
114
+
115
+ infix notation: ((((12 + (1 * 3)) * 2) + 12) + 16)
116
+
117
+ polish notation: + + * + 12 * 1 3 2 12 16
118
+
119
+ calculated result: 58
120
+
121
+
122
+
123
+ input expression: expression: 12+1+(12*0.8+1*0.2)*2+16
124
+
125
+ reverse polish notation: 12 1 + 12 0.8 * 1 0.2 * + 2 * + 16 +
126
+
127
+ infix notation: (((12 + 1) + (((12 * 0.8) + (1 * 0.2)) * 2)) + 16)
128
+
129
+ polish notation: + + + 12 1 * + * 12 0.8 * 1 0.2 2 16
130
+
131
+ calculated result: 48.6
132
+
133
+ ```

5

イメージ図の修正

2019/02/22 19:02

投稿

toshi17922062
toshi17922062

スコア183

test CHANGED
@@ -14,15 +14,17 @@
14
14
 
15
15
  ```imege
16
16
 
17
+
18
+
17
19
  (入力)CO2
18
20
 
19
- +
21
+ +--
20
22
 
21
- +-+
23
+ | |
22
24
 
23
- C O2
25
+ C *-
24
26
 
25
- +-*
27
+ | |
26
28
 
27
29
  O 2
28
30
 
@@ -30,48 +32,52 @@
30
32
 
31
33
  (入力)(CH3)2CO
32
34
 
33
- +
35
+ +------
34
36
 
35
- +--------+
37
+ | |
36
38
 
37
- (CH3)2 CO
39
+ *---- +--
38
40
 
39
- +-----* +-+
41
+ | | | |
40
42
 
41
- (CH3) 2 C O
43
+ +-- 2 C O
42
44
 
43
- +-+
45
+ | |
44
46
 
45
- C H3
47
+ C *-
46
48
 
47
- +-*
49
+ | |
48
50
 
49
51
  H 3
50
52
 
51
53
 
52
54
 
55
+
56
+
53
57
  (入力) CH(C0.8H0.2)2O
54
58
 
55
- +
59
+ +-
56
60
 
57
- +-+
61
+ | |
58
62
 
59
- C H(C0.8H0.2)2O
63
+ C +-
60
64
 
61
- +-+
65
+ | |
62
66
 
63
- H (C0.8H0.2)2O
67
+ H *---------
64
68
 
65
- +----------*
69
+ | |
66
70
 
67
- (C0.8H0.2) 2O
71
+ +------ 2O
68
72
 
69
- +----+
73
+ | |
70
74
 
71
- C0.8 H0.2
75
+ *-- *--
72
76
 
73
- +-* +-*
77
+ | | | |
74
78
 
75
79
  C 0.8 H 0.2
76
80
 
81
+
82
+
77
83
  ```

4

誤字修正

2019/02/22 17:57

投稿

toshi17922062
toshi17922062

スコア183

test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
  (入力)CO2
18
18
 
19
- *
19
+ +
20
20
 
21
21
  +-+
22
22
 
@@ -30,7 +30,7 @@
30
30
 
31
31
  (入力)(CH3)2CO
32
32
 
33
- *
33
+ +
34
34
 
35
35
  +--------+
36
36
 
@@ -52,7 +52,7 @@
52
52
 
53
53
  (入力) CH(C0.8H0.2)2O
54
54
 
55
- *
55
+ +
56
56
 
57
57
  +-+
58
58
 

3

誤字修正

2019/02/22 17:21

投稿

toshi17922062
toshi17922062

スコア183

test CHANGED
@@ -1,4 +1,4 @@
1
- 回答ではなくあくまで参考意見なのですが、本来このような構文解析は分木を使うのはないかと思います。
1
+ 回答ではなくあくまで参考意見なのですが、本来このような構文解析は分木を使うのはないかと思います。
2
2
 
3
3
 
4
4
 

2

イメージ図の修正

2019/02/22 16:03

投稿

toshi17922062
toshi17922062

スコア183

test CHANGED
@@ -11,6 +11,8 @@
11
11
 
12
12
 
13
13
  サンプルケースの二分木イメージ(違うかもですが)
14
+
15
+ ```imege
14
16
 
15
17
  (入力)CO2
16
18
 
@@ -71,3 +73,5 @@
71
73
  +-* +-*
72
74
 
73
75
  C 0.8 H 0.2
76
+
77
+ ```

1

サンプルイメージの追加

2019/02/22 15:58

投稿

toshi17922062
toshi17922062

スコア183

test CHANGED
@@ -7,3 +7,67 @@
7
7
 
8
8
 
9
9
  [数式の二分木化・記法変換・計算 (C#) - Programming/Tips/二分木を使った数式の逆ポーランド記法化と計算 - 総武ソフトウェア推進所](https://smdn.jp/programming/tips/polish/impl_cs/)
10
+
11
+
12
+
13
+ サンプルケースの二分木イメージ(違うかもですが)
14
+
15
+ (入力)CO2
16
+
17
+ *
18
+
19
+ +-+
20
+
21
+ C O2
22
+
23
+ +-*
24
+
25
+ O 2
26
+
27
+
28
+
29
+ (入力)(CH3)2CO
30
+
31
+ *
32
+
33
+ +--------+
34
+
35
+ (CH3)2 CO
36
+
37
+ +-----* +-+
38
+
39
+ (CH3) 2 C O
40
+
41
+ +-+
42
+
43
+ C H3
44
+
45
+ +-*
46
+
47
+ H 3
48
+
49
+
50
+
51
+ (入力) CH(C0.8H0.2)2O
52
+
53
+ *
54
+
55
+ +-+
56
+
57
+ C H(C0.8H0.2)2O
58
+
59
+ +-+
60
+
61
+ H (C0.8H0.2)2O
62
+
63
+ +----------*
64
+
65
+ (C0.8H0.2) 2O
66
+
67
+ +----+
68
+
69
+ C0.8 H0.2
70
+
71
+ +-* +-*
72
+
73
+ C 0.8 H 0.2