Pythonで入力した数が整数でも有理数でも計算できるプログラムを書きたいと思っています。
Python
1import re 2 3class Rat: 4 n = 0 5 d = 0 6 7 def __init__(self, n, d): 8 self.n = n 9 self.d = d 10 11 def gcd(a, b): 12 if(a % b == 0): 13 return b 14 else: 15 return Rat.gcd(b, a % b) 16 17 def __repr__(self): 18 if(self.d / Rat.gcd(self.n, self.d) != 1): 19 return '{}/{}'.format(int(self.n / Rat.gcd(self.n, self.d)), int(self.d / Rat.gcd(self.n, self.d))) 20 elif(self.d / Rat.gcd(self.n, self.d) == 1): 21 return '{}'.format(int(self.n / Rat.gcd(self.n, self.d))) 22 23 def __add__(self, other): 24 return Rat((self.n * other.d) + (self.d * other.n), (self.d * other.d)) 25 26 def __sub__(self, other): 27 return Rat((self.n * other.d) - (self.d * other.n), (self.d * other.d)) 28 29 def __mul__(self, other): 30 return Rat((self.n * other.n), (self.d * other.d)) 31 32 def __truediv__(self, other): 33 return Rat((self.n * other.d), (self.d * other.n)) 34 35 36def is_int(arg): 37 """ 38 int型かどうか調べる関数 39 """ 40 try: 41 int(arg) 42 return True 43 44 except ValueError: 45 return False 46 47def input_number(): 48 """ 49 標準入力で分数あるいは整数を受け取り、全て分数に変換して返す関数 50 """ 51 while(True): 52 msg = input("Number is fraction or integer? Enter (f or i):") 53 54 if(msg == "i"): 55 num = input("Enter integer:") 56 if(is_int(num)): 57 num = Rat(int(num), 1) 58 break 59 else: 60 print("ValueError : not integer") 61 continue 62 63 elif(msg == "f"): 64 tmp = input("Enter fraction like 3/5:") 65 print(re.match("//", tmp)) 66 if(re.match("//", tmp)): 67 tmp_list = re.split("//", tmp) 68 print(tmp_list) 69 if((is_int(tmp[0]) and is_int(tmp[1]))): 70 num = Rat(int(tmp[0]), int(tmp[1])) 71 print(num) 72 break 73 else: 74 print("ValueError : not fraction") 75 continue 76 77 elif(msg == "quit"): 78 exit() 79 80 return num 81 82def main(): 83 num1 = input_number() 84 num2 = input_number() 85 86 print() 87 print("Arithmetic of num1 & num2") 88 print("({}) + ({}) = {}".format(num1, num2, num1 + num2)) 89 print("({}) - ({}) = {}".format(num1, num2, num1 - num2)) 90 print("({}) * ({}) = {}".format(num1, num2, num1 * num2)) 91 print("({}) / ({}) = {}".format(num1, num2, num1 / num2)) 92 print() 93 94if __name__ == "__main__": 95 main()
しかし、実行すると分数の"/"で分割して分数の分母分子を区別したいのに、コマンドラインで"/"を入力しても認識されません。おそらくは正規表現の部分でNoneと返って来ているのでその部分が怪しいと思うのですが・・・。
Terminal
1Yuji-no-MacBook-Air:tmp_file YujiNarita$ python hw0423.py 2Number is fraction or integer? Enter (f or i):f 3Enter fraction like 3/5:23/34 4None 5Number is fraction or integer? Enter (f or i):quit 6Yuji-no-MacBook-Air:tmp_file YujiNarita$ python hw0423.py 7Number is fraction or integer? Enter (f or i):i 8Enter integer:6 9Number is fraction or integer? Enter (f or i):i 10Enter integer:8 11 12Arithmetic of num1 & num2 13(6) + (8) = 14 14(6) - (8) = -2 15(6) * (8) = 48 16(6) / (8) = 3/4 17 18Yuji-no-MacBook-Air:tmp_file YujiNarita$
なお、上記の通り、整数では問題なく計算できました。また、正規表現を使わず("/"をコマンドラインで入力し忘れるなどのErrorを無視して)書いた場合は有理数でも問題なく計算できたのでclass Ratの部分は間違っていないかと思われます。
もし記載不足などございましたらご指摘いただけると幸いです。また、コードの書き方などもご指摘いただければと思います。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/10 07:06