回答編集履歴
8
os.system を使う方法を追加
test
CHANGED
@@ -163,3 +163,31 @@
|
|
163
163
|
sqrt を追加しました。sqrt(2) は 1.4142135623730951 になります。
|
164
164
|
|
165
165
|
同様にして、exp, log, sin, cos, tan の追加も可能です。
|
166
|
+
|
167
|
+
|
168
|
+
|
169
|
+
**追記2**
|
170
|
+
|
171
|
+
eval の代わりに os.system を使ってもいいのでしょうか?
|
172
|
+
|
173
|
+
```Python
|
174
|
+
|
175
|
+
import os
|
176
|
+
|
177
|
+
|
178
|
+
|
179
|
+
while True:
|
180
|
+
|
181
|
+
s = input(">> ");
|
182
|
+
|
183
|
+
if s == '.': break;
|
184
|
+
|
185
|
+
cmd = "python -c 'print(" + s + ")'"
|
186
|
+
|
187
|
+
os.system(cmd)
|
188
|
+
|
189
|
+
```
|
190
|
+
|
191
|
+
daemonright さん、質問をしたまま放置はよくないですよ。
|
192
|
+
|
193
|
+
コメントをお願いします。
|
7
sqrt のバグ修正
test
CHANGED
@@ -104,7 +104,7 @@
|
|
104
104
|
|
105
105
|
self.pos += 4
|
106
106
|
|
107
|
-
v = math.sqrt(self.expr(
|
107
|
+
v = math.sqrt(self.expr(0));
|
108
108
|
|
109
109
|
if self.c == ')': self.get()
|
110
110
|
|
6
sqrt の追加
test
CHANGED
@@ -4,13 +4,15 @@
|
|
4
4
|
|
5
5
|
import re
|
6
6
|
|
7
|
+
import math
|
8
|
+
|
7
9
|
|
8
10
|
|
9
11
|
class Expr:
|
10
12
|
|
11
|
-
|
13
|
+
op = "+-*/\7\7"
|
12
14
|
|
13
|
-
|
15
|
+
pat = r"\d+.?\d*([eE][+-]?\d+)?";
|
14
16
|
|
15
17
|
|
16
18
|
|
@@ -98,6 +100,16 @@
|
|
98
100
|
|
99
101
|
elif self.c == '-': v = -self.expr(i)
|
100
102
|
|
103
|
+
elif self.s[self.pos-1:self.pos+4] == 'sqrt(':
|
104
|
+
|
105
|
+
self.pos += 4
|
106
|
+
|
107
|
+
v = math.sqrt(self.expr(i));
|
108
|
+
|
109
|
+
if self.c == ')': self.get()
|
110
|
+
|
111
|
+
else: self.c = '\1'
|
112
|
+
|
101
113
|
else: self.c = '\1'
|
102
114
|
|
103
115
|
return v
|
@@ -120,13 +132,9 @@
|
|
120
132
|
|
121
133
|
v = e.expr(0)
|
122
134
|
|
123
|
-
if e.ok():
|
135
|
+
if e.ok(): print(' ' , v if v != int(v) else int(v))
|
124
136
|
|
125
|
-
print(' ', v if v != int(v) else int(v))
|
126
|
-
|
127
|
-
else:
|
128
|
-
|
129
|
-
|
137
|
+
else: print(' Error')
|
130
138
|
|
131
139
|
```
|
132
140
|
|
@@ -149,3 +157,9 @@
|
|
149
157
|
>> .
|
150
158
|
|
151
159
|
```
|
160
|
+
|
161
|
+
**追記**
|
162
|
+
|
163
|
+
sqrt を追加しました。sqrt(2) は 1.4142135623730951 になります。
|
164
|
+
|
165
|
+
同様にして、exp, log, sin, cos, tan の追加も可能です。
|
5
結果が整数の場合は、.0 を出さないように修正
test
CHANGED
@@ -122,7 +122,7 @@
|
|
122
122
|
|
123
123
|
if e.ok():
|
124
124
|
|
125
|
-
print(' ', v)
|
125
|
+
print(' ', v if v != int(v) else int(v))
|
126
126
|
|
127
127
|
else:
|
128
128
|
|
@@ -144,7 +144,7 @@
|
|
144
144
|
|
145
145
|
>> 2**10
|
146
146
|
|
147
|
-
1024
|
147
|
+
1024
|
148
148
|
|
149
149
|
>> .
|
150
150
|
|
4
op と pat を Expr の中に入れた
test
CHANGED
@@ -6,13 +6,13 @@
|
|
6
6
|
|
7
7
|
|
8
8
|
|
9
|
-
|
9
|
+
class Expr:
|
10
10
|
|
11
|
+
op = "+-*/\7\7"
|
12
|
+
|
11
|
-
pat = r"\d+.?\d*([eE][+-]?\d+)?";
|
13
|
+
pat = r"\d+.?\d*([eE][+-]?\d+)?";
|
12
14
|
|
13
15
|
|
14
|
-
|
15
|
-
class Expr:
|
16
16
|
|
17
17
|
def __init__(self, s):
|
18
18
|
|
@@ -38,7 +38,7 @@
|
|
38
38
|
|
39
39
|
if self.c.isdigit():
|
40
40
|
|
41
|
-
res = re.match(pat, self.s[self.pos-1:])
|
41
|
+
res = re.match(Expr.pat, self.s[self.pos-1:])
|
42
42
|
|
43
43
|
self.val = float(res.group())
|
44
44
|
|
@@ -72,7 +72,7 @@
|
|
72
72
|
|
73
73
|
v = self.expr(i+2)
|
74
74
|
|
75
|
-
while self.c == op[i] or self.c == op[i+1]:
|
75
|
+
while self.c == Expr.op[i] or self.c == Expr.op[i+1]:
|
76
76
|
|
77
77
|
if self.c == '+': v += self.expr(i+2)
|
78
78
|
|
3
コードの修正
test
CHANGED
@@ -36,27 +36,27 @@
|
|
36
36
|
|
37
37
|
self.pos += 1
|
38
38
|
|
39
|
+
if self.c.isdigit():
|
40
|
+
|
41
|
+
res = re.match(pat, self.s[self.pos-1:])
|
42
|
+
|
43
|
+
self.val = float(res.group())
|
44
|
+
|
45
|
+
self.pos += res.span()[1] - 1
|
46
|
+
|
47
|
+
return '0'
|
48
|
+
|
49
|
+
if self.c == '*' and self.s[self.pos] == '*':
|
50
|
+
|
51
|
+
self.pos += 1
|
52
|
+
|
53
|
+
self.c = '\7'
|
54
|
+
|
55
|
+
return self.c
|
56
|
+
|
39
57
|
if self.c != ' ':
|
40
58
|
|
41
|
-
if self.c.isdigit():
|
42
|
-
|
43
|
-
res = re.match(pat, self.s[self.pos-1:])
|
44
|
-
|
45
|
-
self.val = float(res.group())
|
46
|
-
|
47
|
-
self.pos += res.span()[1] - 1
|
48
|
-
|
49
|
-
return '0'
|
50
|
-
|
51
|
-
elif self.c == '*' and self.s[self.pos] == '*':
|
52
|
-
|
53
|
-
self.pos += 1
|
54
|
-
|
55
|
-
self.c = '\7'
|
56
|
-
|
57
|
-
|
59
|
+
return self.c
|
58
|
-
|
59
|
-
else: return self.c
|
60
60
|
|
61
61
|
self.c = '\0'
|
62
62
|
|
2
**= に修正
test
CHANGED
@@ -82,7 +82,7 @@
|
|
82
82
|
|
83
83
|
elif self.c == '/': v /= self.expr(i+2)
|
84
84
|
|
85
|
-
else: v
|
85
|
+
else: v **= self.expr(i)
|
86
86
|
|
87
87
|
elif self.get() == '0': v = self.val; self.get()
|
88
88
|
|
@@ -146,4 +146,6 @@
|
|
146
146
|
|
147
147
|
1024.0
|
148
148
|
|
149
|
+
>> .
|
150
|
+
|
149
151
|
```
|
1
コードの修正と実行例の追加
test
CHANGED
@@ -56,9 +56,7 @@
|
|
56
56
|
|
57
57
|
return self.c
|
58
58
|
|
59
|
-
else: return self.c
|
59
|
+
else: return self.c
|
60
|
-
|
61
|
-
|
62
60
|
|
63
61
|
self.c = '\0'
|
64
62
|
|
@@ -100,7 +98,7 @@
|
|
100
98
|
|
101
99
|
elif self.c == '-': v = -self.expr(i)
|
102
100
|
|
103
|
-
else:
|
101
|
+
else: self.c = '\1'
|
104
102
|
|
105
103
|
return v
|
106
104
|
|
@@ -131,3 +129,21 @@
|
|
131
129
|
print(' Error')
|
132
130
|
|
133
131
|
```
|
132
|
+
|
133
|
+
実行例
|
134
|
+
|
135
|
+
```text
|
136
|
+
|
137
|
+
>> 1+2*(3-4)/5
|
138
|
+
|
139
|
+
0.6
|
140
|
+
|
141
|
+
>> 355 / 113
|
142
|
+
|
143
|
+
3.1415929203539825
|
144
|
+
|
145
|
+
>> 2**10
|
146
|
+
|
147
|
+
1024.0
|
148
|
+
|
149
|
+
```
|