はじめに
python研修の最後に電卓を作成するという演習があったので作成しました。参考になれば嬉しいです。
結果
数値と記号(+,-,*,/,=)を交互に入力し、=を入力すると計算結果を順番に表示させます。
入力時に適当でない入力をした場合はエラーを表示させます。
入力?->a
エラー:一つ目は数値を入力してください。
入力?->3
入力?->7
エラー:数値のあとは必ず記号(+,-,*,/,=)を入力してください。
入力?->+
入力?->=
エラー:記号(+,-,*,/,=)のあとは必ず数値を入力してください。
入力?->4
入力?->
入力?->a
エラー:数値または記号(+,-,*,/,=)を入力してください。
入力?->/
入力?->0
エラー:/の後に0を入力しないでください。
入力?->2
入力?->+
入力?->1
入力?->=
計算結果: 3 + 4 = 7
計算結果: 7 / 2 = 3.5
計算結果: 3.5 + 1 = 4.5
答え: 4.5
ソースコード
入力時
入力時のソースコードは以下のようになっています。
formula = []
symbol = ["+","-","*","/","="]
while True:
a = input("入力?->")
if a == "":
continue
if len(formula) >= 1 and a == "0" and formula[len(formula)-1] == "/":
print("エラー:/の後に0を入力しないでください。")
continue
if len(formula) == 0 and a.isdigit() == False:
print("エラー:一つ目は数値を入力してください。")
continue
if (a in symbol) == False and a.isdigit() == False:
print("エラー:数値または記号(+,-,*,/,=)を入力してください。")
continue
if a.isdigit() == False and len(formula) % 2 == 0:
print("エラー:記号(+,-,*,/,=)のあとは必ず数値を入力してください。")
continue
if (a in symbol) == False and len(formula) % 2 == 1:
print("エラー:数値のあとは必ず記号(+,-,*,/,=)を入力してください。")
continue
if a == "=":
break
formula.append(a)
入力された文字列に対して、それぞれのエラーに該当するか確認し、エラーが無ければ配列変数のformulaに入力した文字列を追加していきます。
isdigit()は数値かどうかを判定する関数です。
数値と記号が交互に入力されるので、len(formula)%2で入力される文字列が数値(len(formula)%2==0)もしくは記号(len(formula)%2==1)のタイミングかを判断しています。
計算結果の表示
計算結果の表示のソースコードは以下のようになっています。
answer = 0
if len(formula) < 3:
print("答え:", formula[0])
else:
for i in range(0, len(formula) - 2, 2):
if formula[i+1] == '+':
answer = float(formula[i]) + float(formula[i+2])
if formula[i+1] == '-':
answer = float(formula[i]) - float(formula[i+2])
if formula[i+1] == '*':
answer = float(formula[i]) * float(formula[i+2])
if formula[i+1] == '/':
answer = float(formula[i]) / float(formula[i+2])
if answer.is_integer():
answer = int(answer)
print("計算結果:", formula[i], formula[i+1], formula[i+2], "=", answer)
formula[i+2] = answer
print("答え:", answer)
for文で最初の計算~最後の計算まで表示しています。今回はfor文の変数iの上昇値を2にしています。
計算はfloat型(少数)で行い、is_integer()で計算結果が整数かどうか判定し、計算結果が整数ならint型(整数)に直しています。
formula[i+2]=answerをすることでfor文の次の繰り返しの時のformula[i]を前回の計算結果にしています。
最初のif文は一つ目の数値の入力の後に=を入力された場合なので、基本的にはelseになります。
一つ目の数値の入力の後に=を入力された場合の結果
入力?->5
入力?->=
答え: 5
全体のソースコード
全体のソースコードは以下のようになっています。
formula = []
answer = 0
symbol = ["+","-","*","/","="]
while True:
a = input("入力?->")
if a == "":
continue
if len(formula) >= 1 and a == "0" and formula[len(formula)-1] == "/":
print("エラー:/の後に0を入力しないでください。")
continue
if len(formula) == 0 and a.isdigit() == False:
print("エラー:一つ目は数値を入力してください。")
continue
if (a in symbol) == False and a.isdigit() == False:
print("エラー:数値または記号(+,-,*,/,=)を入力してください。")
continue
if a.isdigit() == False and len(formula) % 2 == 0:
print("エラー:記号(+,-,*,/,=)のあとは必ず数値を入力してください。")
continue
if (a in symbol) == False and len(formula) % 2 == 1:
print("エラー:数値のあとは必ず記号(+,-,*,/,=)を入力してください。")
continue
if a == "=":
break
formula.append(a)
if len(formula) < 3:
print("答え:", formula[0])
else:
for i in range(0, len(formula) - 2, 2):
if formula[i+1] == '+':
answer = float(formula[i]) + float(formula[i+2])
if formula[i+1] == '-':
answer = float(formula[i]) - float(formula[i+2])
if formula[i+1] == '*':
answer = float(formula[i]) * float(formula[i+2])
if formula[i+1] == '/':
answer = float(formula[i]) / float(formula[i+2])
if answer.is_integer():
answer = int(answer)
print("計算結果:", formula[i], formula[i+1], formula[i+2], "=", answer)
formula[i+2] = answer
print("答え:", answer)
感想
エラーの処理と結果の表示の部分の記号の判定が、上手くやれば短くなりそうなので悔しいです。それ以外は綺麗にまとめられたので良かったです。