回答編集履歴

8

os.system を使う方法を追加

2020/09/07 16:36

投稿

kazuma-s
kazuma-s

スコア8224

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 のバグ修正

2020/09/07 16:35

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -104,7 +104,7 @@
104
104
 
105
105
  self.pos += 4
106
106
 
107
- v = math.sqrt(self.expr(i));
107
+ v = math.sqrt(self.expr(0));
108
108
 
109
109
  if self.c == ')': self.get()
110
110
 

6

sqrt の追加

2020/09/06 14:59

投稿

kazuma-s
kazuma-s

スコア8224

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
- op = "+-*/\7\7"
13
+ op = "+-*/\7\7"
12
14
 
13
- pat = r"\d+.?\d*([eE][+-]?\d+)?";
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
- print(' Error')
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 を出さないように修正

2020/09/06 14:48

投稿

kazuma-s
kazuma-s

スコア8224

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.0
147
+ 1024
148
148
 
149
149
  >> .
150
150
 

4

op と pat を Expr の中に入れた

2020/09/06 06:05

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -6,13 +6,13 @@
6
6
 
7
7
 
8
8
 
9
- op = "+-*/\7\7"
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

コードの修正

2020/09/06 04:36

投稿

kazuma-s
kazuma-s

スコア8224

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
- return self.c
59
+ return self.c
58
-
59
- else: return self.c
60
60
 
61
61
  self.c = '\0'
62
62
 

2

**= に修正

2020/09/06 04:11

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -82,7 +82,7 @@
82
82
 
83
83
  elif self.c == '/': v /= self.expr(i+2)
84
84
 
85
- else: v = v ** self.expr(i)
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

コードの修正と実行例の追加

2020/09/06 03:02

投稿

kazuma-s
kazuma-s

スコア8224

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: v = 0.0; self.c = '\1'
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
+ ```