#!C:\Python32\python.exe
# -*- coding: utf-8 -*-
# Copyright (C) 2011 k. shirakami @ facebook. com All Rights Reserved.
class 演算器:
def __init__(self):
self.基数 = 10
self.御破算()
def 御破算(self):
self.入力値 = 0
self.演算値 = 0
self.演算スタック = []
self.二項演算子入力 = self.二項演算子記憶
return self.演算値
def 数値入力(self, 数値):
self.演算値 = 数値
self.入力値 = 数値
self.二項演算子入力 = self.二項演算子記憶
return self.演算値
def 単項演算子入力(self, 単項演算子):
self.演算値 = 単項演算子.演算(self.演算値)
self.入力値 = 0
self.二項演算子入力 = self.二項演算子記憶
return self.演算値
def 二項演算子記憶(self, 二項演算子):
self.演算値 = 二項演算子.記憶(self.演算値, self.演算スタック)
self.入力値 = 0
self.二項演算子入力 = self.二項演算子入替
return self.演算値
def 二項演算子入替(self, 二項演算子):
self.演算値 = 二項演算子.入替(self.演算値, self.演算スタック)
self.入力値 = 0
return self.演算値
class 単項演算子:
def 入力(self, 演算器):
return 演算器.単項演算子入力(self)
class 二項演算子:
def __init__(self, 優先順位):
self.優先順位 = 優先順位
def 入力(self, 演算器):
return 演算器.二項演算子入力(self)
def 記憶(self, 演算値, スタック):
while (len(スタック) > 0 and スタック[-1].優先順位 >= self.優先順位):
優先演算子 = スタック.pop()
被数 = スタック.pop()
演算値 = 優先演算子.演算(被数, 演算値)
スタック.append(演算値)
スタック.append(self)
return 演算値
def 入替(self, 演算値, スタック):
スタック.pop()
スタック.pop()
return self.記憶(演算値, スタック)
class 御破算:
def 入力(self, 演算器):
return 演算器.御破算()
class 数:
def __init__(self, 数値):
self.数値 = 数値
def 入力(self, 演算器):
return 演算器.数値入力(演算器.入力値 * 演算器.基数 + self.数値)
class 入力後退:
def 入力(self, 演算器):
return 演算器.数値入力(int(演算器.入力値 / 演算器.基数))
class 入力破棄(単項演算子):
def 演算(self, 演算値):
return 0
class 符号反転(単項演算子):
def 演算(self, 演算値):
return (-1) * 演算値
class 加算(二項演算子):
def 演算(self, 被数, 加数):
return 被数 + 加数
class 減算(二項演算子):
def 演算(self, 被数, 減数):
return 被数 - 減数
class 乗算(二項演算子):
def 演算(self, 被数, 乗数):
return 被数 * 乗数
class 除算(二項演算子):
def 演算(self, 被数, 除数):
return 被数 / 除数
class 演算(二項演算子):
def 演算(self, 被数, 演算値):
return 演算値
class 電卓:
def __init__(self):
self.演算器 = 演算器()
self.操作 = {}
self.操作['C'] = 御破算()
self.操作['E'] = 入力破棄()
self.操作['B'] = 入力後退()
self.操作['+'] = 加算(1)
self.操作['-'] = 減算(1)
self.操作['*'] = 乗算(2)
self.操作['/'] = 除算(2)
self.操作['='] = 演算(0)
self.操作['#'] = 符号反転()
self.操作['0'] = 数(0)
self.操作['1'] = 数(1)
self.操作['2'] = 数(2)
self.操作['3'] = 数(3)
self.操作['4'] = 数(4)
self.操作['5'] = 数(5)
self.操作['6'] = 数(6)
self.操作['7'] = 数(7)
self.操作['8'] = 数(8)
self.操作['9'] = 数(9)
def 入力(self, 式):
for 文字 in 式:
計算結果 = self.操作[文字].入力(self.演算器)
return 計算結果
電卓 = 電卓()
print("電卓.入力('1+2*3=')", 電卓.入力('1+2*3='))
print("電卓.入力('+5=')", 電卓.入力('+5='))