はじめに
プログラミング初学者の私がPythonとGoの学習のため、とりあえず簡単な計算機を作ってみたという趣旨の学習レポートです。この記事ではPython 3.13.8とgo1.25.1を使用しています。
Python編
まずmain.pyと計算の処理を行うcalculation.pyを作る
main.pyの中に計算処理を行う関数を置いても良かったですが、今回はモジュール化の練習も兼ねてるのでわざとファイルを分割して書いていきます。ディレクトリ構造は以下の様になりました。
.
├── main.py
└── modules
├── __init__.py
└── calculation.py
init.pyは、ディレクトリをPythonの「パッケージ」として識別させるためのファイルです。準備ができたので早速calculation.pyの中身を書いていきます。
def plus(num1, num2):
"""add two numbers"""
return float(num1) + float(num2)
def minus(num1, num2):
"""substract numbers"""
return float(num1) - float(num2)
def times(num1, num2):
"""multiply two numbers"""
return float(num1) * float(num2)
def divide(num1, num2):
"""divide two numbers"""
if num2 == 0:
return None
return float(num1) / float(num2)
一応除算の部分の処理に0で割った場合の処理も置きます。
そしたら次にmain.pyでユーザーのインプット部分や条件分岐を書いていきます。
from modules import calculation
print("Select your options[1:PLUS][2:MINUS][3:TIMES][4:DIVIDE]")
operator = input()
if operator in ["1","2","3","4"]:
print(f"You selected:{operator}")
try:
result = 0
num1 = input("Enter the first number:")
num2 = input("Enter the second number:")
if operator == 1:
result = calculation.plus(num1, num2)
elif operator == 2:
result = calculation.minus(num1, num2)
elif operator == 3:
result = calculation.times(num1, num2)
elif operator == 4:
result = calculation.divide(num1, num2)
if result is None:
print("Error: Cannot divide by zero.")
exit()
print(f"Result:{result}")
except ValueError:
print("ERROR:Please Enter valid numbers.")
else:
print("ERROR:invalid option")
オプション以外の数字を入力した場合にエラーを吐くようにちゃんとエラーハンドリングもして完成!と思っていたら...
ここで問題発生
デバックとしてオプション1(足し算)を選択して1+1をしたら0になってしまいました。

有識者に聞いてみたところどうやら原因はユーザーの入力がstr型だが、条件分岐の部分がint型になってしまっているためプログラムが「どの条件にも当てはまんねぇや、resultの初期値の0を出したろ」と0を返されてしまっていたみたいです。
解決方法は簡単で条件分岐の数値をstr型に変えるだけでいいみたいです。
変更前:
if operator == 1:
result = calculation.plus(num1, num2)
elif operator == 2:
result = calculation.minus(num1, num2)
elif operator == 3:
result = calculation.times(num1, num2)
elif operator == 4:
result = calculation.divide(num1, num2)
変更後:
if operator == "1": #<--変更点
result = calculation.plus(num1, num2)
elif operator == "2": #<--変更点
result = calculation.minus(num1, num2)
elif operator == "3": #<--変更点
result = calculation.times(num1, num2)
elif operator == "4": #<--変更点
result = calculation.divide(num1, num2)
ダブルクォーテーションで囲んだだけです。Calculation.pyの中のdivide関数も修正しておきましょう。
def divide(num1, num2):
"""divide two numbers"""
if num2 == "0": #<--ここ
return None
return float(num1) / float(num2)
これで動かしてみましょう。

はい、ようやく1+1は2という計算ができました!

オプションにない数字を入力するとエラーがちゃんと表示されることも確認できます。これでPythonの簡単な計算機が完成しました。
Go編
それでは次にGoで計算機を作っていきます。一旦プロジェクトフォルダを作ってディレクトリ構造を構築していきます。そしたら以下のディレクトリ図になりました。
.
├── cmd
│ └── my-app
│ └── main.go
├── go.mod
├── internal
│ └── calculation
│ └── calculation.go
└── pkg
go言語のディレクトリ構造は以下のサイトを参考にしました。
Goのディレクトリ構成の標準について
go言語はgo.modファイルをプロジェクトに置かないと動かないらしい。どうやらこのファイルはモジュールの依存関係を管理しているらしいです。
ひとまずPythonの時と同じく計算処理を行う関数をcalculation.goに書いていきます。
package calculation
//calculation module
func Plus(a int, b int) int {
result := a + b
return result
}
func Minus(a int, b int) int {
result := a - b
return result
}
func Multiply(a int, b int) int {
result := a * b
return result
}
func Divide(a int, b int) int {
if b == 0 {
println("Zero division error")
return 0
}
result := a / b
return result
}
ではこんな感じに書き終わったらmain.goの中身も書いていきます。Pythonの方の計算機を有識者に見せたところ条件分岐はswitch文を使った方がいいと聞いたので今回はそれを使っていきます。ユーザーが1から4の数字を入力するとそれに対応した演算子を使用するように条件分岐を作りました。goのswitch文はdefaultというのを置くと例外処理をしてくれるらしいです。
package main
import (
"fmt"
"test/internal/calculation"
)
var (
input int
a int
b int
result int
)
func main() {
fmt.Printf("Choose an operator [1:PLUS, 2:MINUS, 3:MULTIPLY, 4:DIVIDE]")
fmt.Scanln(&input)
fmt.Printf("Enter a first number: ")
fmt.Scanln(&a)
fmt.Printf("Enter a second number: ")
fmt.Scanln(&b)
switch input {
case 1:
result = calculation.Plus(a, b)
fmt.Printf("The result is %d", result)
case 2:
result = calculation.Minus(a, b)
fmt.Printf("The result is %d", result)
case 3:
result = calculation.Multiply(a, b)
fmt.Printf("The result is %d", result)
case 4:
result = calculation.Divide(a, b)
fmt.Printf("The result is %d", result)
default:
println("ERROR: Invalid operator")
}
}
また問題発生

オプションにない整数を入れてると一応エラーは表示してくれますが、"Enter a first number"と"Enter a second number"がでてきてしまっています。私が期待した動作はエラーだけを表示した後にプログラムを終了させる動きなのでこれを修正していきます。
以下が修正後のソースコードになります。大きな変更点としてif文を最初につけることでエラーハンドリングを行うようにしました。こうすることでオプションにない数字を入力したらエラーだけを表示して、例外処理で計算をし始めます。ついでにif文のおかげでdefaultも必要なくなったので消しました。
package main
import (
"fmt"
"test/internal/calculation"
)
var (
input int
a int
b int
result int
)
func main() {
fmt.Printf("Choose an operator [1:PLUS, 2:MINUS, 3:MULTIPLY, 4:DIVIDE]")
fmt.Scanln(&input)
if 0 >= input || input > 4 {
println("ERROR: Invalid operator")
} else {
fmt.Printf("Enter a first number: ")
fmt.Scanln(&a)
fmt.Printf("Enter a second number: ")
fmt.Scanln(&b)
switch input {
case 1:
result = calculation.Plus(a, b)
fmt.Printf("The result is %d", result)
case 2:
result = calculation.Minus(a, b)
fmt.Printf("The result is %d", result)
case 3:
result = calculation.Multiply(a, b)
fmt.Printf("The result is %d", result)
case 4:
result = calculation.Divide(a, b)
fmt.Printf("The result is %d", result)
}
}
}
最後に
PythonとGoで超初歩的な計算機を作ってみました。言語ごとに文法や必要なファイルが違ってくるのが面白かったです。課題としては今回は二つの数字だけの計算でしたが連続した計算が行えるように発展させたいですね。
