teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

8

os.system を使う方法を追加

2020/09/07 16:36

投稿

kazuma-s
kazuma-s

スコア8222

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

2020/09/07 16:35

投稿

kazuma-s
kazuma-s

スコア8222

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(i));
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 の追加

2020/09/06 14:59

投稿

kazuma-s
kazuma-s

スコア8222

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
- op = "+-*/\7\7"
7
+ op = "+-*/\7\7"
7
- pat = r"\d+.?\d*([eE][+-]?\d+)?";
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
- print(' ', v if v != int(v) else int(v))
68
+ if e.ok(): print(' ' , v if v != int(v) else int(v))
64
- else:
65
- print(' Error')
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 を出さないように修正

2020/09/06 14:48

投稿

kazuma-s
kazuma-s

スコア8222

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.0
74
+ 1024
75
75
  >> .
76
76
  ```

4

op と pat を Expr の中に入れた

2020/09/06 06:05

投稿

kazuma-s
kazuma-s

スコア8222

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

コードの修正

2020/09/06 04:36

投稿

kazuma-s
kazuma-s

スコア8222

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
- return self.c
30
+ return self.c
30
- else: return self.c
31
31
  self.c = '\0'
32
32
  return self.c
33
33
 

2

**= に修正

2020/09/06 04:11

投稿

kazuma-s
kazuma-s

スコア8222

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 = v ** self.expr(i)
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

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

2020/09/06 03:02

投稿

kazuma-s
kazuma-s

スコア8222

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