回答編集履歴
8
os.system を使う方法を追加
answer
CHANGED
@@ -80,4 +80,18 @@
|
|
80
80
|
```
|
81
81
|
**追記**
|
82
82
|
sqrt を追加しました。sqrt(2) は 1.4142135623730951 になります。
|
83
|
-
同様にして、exp, log, sin, cos, tan の追加も可能です。
|
83
|
+
同様にして、exp, log, sin, cos, tan の追加も可能です。
|
84
|
+
|
85
|
+
**追記2**
|
86
|
+
eval の代わりに os.system を使ってもいいのでしょうか?
|
87
|
+
```Python
|
88
|
+
import os
|
89
|
+
|
90
|
+
while True:
|
91
|
+
s = input(">> ");
|
92
|
+
if s == '.': break;
|
93
|
+
cmd = "python -c 'print(" + s + ")'"
|
94
|
+
os.system(cmd)
|
95
|
+
```
|
96
|
+
daemonright さん、質問をしたまま放置はよくないですよ。
|
97
|
+
コメントをお願いします。
|
7
sqrt のバグ修正
answer
CHANGED
@@ -51,7 +51,7 @@
|
|
51
51
|
elif self.c == '-': v = -self.expr(i)
|
52
52
|
elif self.s[self.pos-1:self.pos+4] == 'sqrt(':
|
53
53
|
self.pos += 4
|
54
|
-
v = math.sqrt(self.expr(
|
54
|
+
v = math.sqrt(self.expr(0));
|
55
55
|
if self.c == ')': self.get()
|
56
56
|
else: self.c = '\1'
|
57
57
|
else: self.c = '\1'
|
6
sqrt の追加
answer
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
こんなのはどうでしょうか?
|
2
2
|
```Python
|
3
3
|
import re
|
4
|
+
import math
|
4
5
|
|
5
6
|
class Expr:
|
6
|
-
|
7
|
+
op = "+-*/\7\7"
|
7
|
-
|
8
|
+
pat = r"\d+.?\d*([eE][+-]?\d+)?";
|
8
9
|
|
9
10
|
def __init__(self, s):
|
10
11
|
self.c = '.'
|
@@ -48,6 +49,11 @@
|
|
48
49
|
else: self.c = '\1'
|
49
50
|
elif self.c == '+': v = self.expr(i)
|
50
51
|
elif self.c == '-': v = -self.expr(i)
|
52
|
+
elif self.s[self.pos-1:self.pos+4] == 'sqrt(':
|
53
|
+
self.pos += 4
|
54
|
+
v = math.sqrt(self.expr(i));
|
55
|
+
if self.c == ')': self.get()
|
56
|
+
else: self.c = '\1'
|
51
57
|
else: self.c = '\1'
|
52
58
|
return v
|
53
59
|
|
@@ -59,10 +65,8 @@
|
|
59
65
|
if s == '.': break;
|
60
66
|
e = Expr(s)
|
61
67
|
v = e.expr(0)
|
62
|
-
if e.ok():
|
63
|
-
|
68
|
+
if e.ok(): print(' ' , v if v != int(v) else int(v))
|
64
|
-
else:
|
65
|
-
|
69
|
+
else: print(' Error')
|
66
70
|
```
|
67
71
|
実行例
|
68
72
|
```text
|
@@ -73,4 +77,7 @@
|
|
73
77
|
>> 2**10
|
74
78
|
1024
|
75
79
|
>> .
|
76
|
-
```
|
80
|
+
```
|
81
|
+
**追記**
|
82
|
+
sqrt を追加しました。sqrt(2) は 1.4142135623730951 になります。
|
83
|
+
同様にして、exp, log, sin, cos, tan の追加も可能です。
|
5
結果が整数の場合は、.0 を出さないように修正
answer
CHANGED
@@ -60,7 +60,7 @@
|
|
60
60
|
e = Expr(s)
|
61
61
|
v = e.expr(0)
|
62
62
|
if e.ok():
|
63
|
-
print(' ', v)
|
63
|
+
print(' ', v if v != int(v) else int(v))
|
64
64
|
else:
|
65
65
|
print(' Error')
|
66
66
|
```
|
@@ -71,6 +71,6 @@
|
|
71
71
|
>> 355 / 113
|
72
72
|
3.1415929203539825
|
73
73
|
>> 2**10
|
74
|
-
1024
|
74
|
+
1024
|
75
75
|
>> .
|
76
76
|
```
|
4
op と pat を Expr の中に入れた
answer
CHANGED
@@ -2,10 +2,10 @@
|
|
2
2
|
```Python
|
3
3
|
import re
|
4
4
|
|
5
|
+
class Expr:
|
5
|
-
op = "+-*/\7\7"
|
6
|
+
op = "+-*/\7\7"
|
6
|
-
pat = r"\d+.?\d*([eE][+-]?\d+)?";
|
7
|
+
pat = r"\d+.?\d*([eE][+-]?\d+)?";
|
7
8
|
|
8
|
-
class Expr:
|
9
9
|
def __init__(self, s):
|
10
10
|
self.c = '.'
|
11
11
|
self.s = s
|
@@ -18,7 +18,7 @@
|
|
18
18
|
self.c = self.s[self.pos]
|
19
19
|
self.pos += 1
|
20
20
|
if self.c.isdigit():
|
21
|
-
res = re.match(pat, self.s[self.pos-1:])
|
21
|
+
res = re.match(Expr.pat, self.s[self.pos-1:])
|
22
22
|
self.val = float(res.group())
|
23
23
|
self.pos += res.span()[1] - 1
|
24
24
|
return '0'
|
@@ -35,7 +35,7 @@
|
|
35
35
|
v = 0.0
|
36
36
|
if i < 6:
|
37
37
|
v = self.expr(i+2)
|
38
|
-
while self.c == op[i] or self.c == op[i+1]:
|
38
|
+
while self.c == Expr.op[i] or self.c == Expr.op[i+1]:
|
39
39
|
if self.c == '+': v += self.expr(i+2)
|
40
40
|
elif self.c == '-': v -= self.expr(i+2)
|
41
41
|
elif self.c == '*': v *= self.expr(i+2)
|
3
コードの修正
answer
CHANGED
@@ -17,17 +17,17 @@
|
|
17
17
|
while self.pos < self.n:
|
18
18
|
self.c = self.s[self.pos]
|
19
19
|
self.pos += 1
|
20
|
+
if self.c.isdigit():
|
21
|
+
res = re.match(pat, self.s[self.pos-1:])
|
22
|
+
self.val = float(res.group())
|
23
|
+
self.pos += res.span()[1] - 1
|
24
|
+
return '0'
|
25
|
+
if self.c == '*' and self.s[self.pos] == '*':
|
26
|
+
self.pos += 1
|
27
|
+
self.c = '\7'
|
28
|
+
return self.c
|
20
29
|
if self.c != ' ':
|
21
|
-
if self.c.isdigit():
|
22
|
-
res = re.match(pat, self.s[self.pos-1:])
|
23
|
-
self.val = float(res.group())
|
24
|
-
self.pos += res.span()[1] - 1
|
25
|
-
return '0'
|
26
|
-
elif self.c == '*' and self.s[self.pos] == '*':
|
27
|
-
self.pos += 1
|
28
|
-
self.c = '\7'
|
29
|
-
|
30
|
+
return self.c
|
30
|
-
else: return self.c
|
31
31
|
self.c = '\0'
|
32
32
|
return self.c
|
33
33
|
|
2
**= に修正
answer
CHANGED
@@ -40,7 +40,7 @@
|
|
40
40
|
elif self.c == '-': v -= self.expr(i+2)
|
41
41
|
elif self.c == '*': v *= self.expr(i+2)
|
42
42
|
elif self.c == '/': v /= self.expr(i+2)
|
43
|
-
else: v
|
43
|
+
else: v **= self.expr(i)
|
44
44
|
elif self.get() == '0': v = self.val; self.get()
|
45
45
|
elif self.c == '(':
|
46
46
|
v = self.expr(0)
|
@@ -72,4 +72,5 @@
|
|
72
72
|
3.1415929203539825
|
73
73
|
>> 2**10
|
74
74
|
1024.0
|
75
|
+
>> .
|
75
76
|
```
|
1
コードの修正と実行例の追加
answer
CHANGED
@@ -27,8 +27,7 @@
|
|
27
27
|
self.pos += 1
|
28
28
|
self.c = '\7'
|
29
29
|
return self.c
|
30
|
-
else: return self.c
|
30
|
+
else: return self.c
|
31
|
-
|
32
31
|
self.c = '\0'
|
33
32
|
return self.c
|
34
33
|
|
@@ -49,7 +48,7 @@
|
|
49
48
|
else: self.c = '\1'
|
50
49
|
elif self.c == '+': v = self.expr(i)
|
51
50
|
elif self.c == '-': v = -self.expr(i)
|
52
|
-
else:
|
51
|
+
else: self.c = '\1'
|
53
52
|
return v
|
54
53
|
|
55
54
|
def ok(self):
|
@@ -64,4 +63,13 @@
|
|
64
63
|
print(' ', v)
|
65
64
|
else:
|
66
65
|
print(' Error')
|
66
|
+
```
|
67
|
+
実行例
|
68
|
+
```text
|
69
|
+
>> 1+2*(3-4)/5
|
70
|
+
0.6
|
71
|
+
>> 355 / 113
|
72
|
+
3.1415929203539825
|
73
|
+
>> 2**10
|
74
|
+
1024.0
|
67
75
|
```
|