Python 三角形の面積を求めるプログラムを作る(ユーザーからの入力)

Pythonを用いて三角形の面積を求めるプログラムを作成する

概要

 三角形の面積を求めるプログラムを例に,「ユーザからの入力を受け付ける」「入力内容をチェックする」処理を作成します。

計算結果を表示するシンプルなコード

base = 10
height = 5
area = base * height / 2
print("area =",area)

実行結果

area = 25.0

  • = は「代入演算子(だいにゅうえんざんし)」といって,イコールの右側の値(右辺)を左側の変数(左辺)に格納する処理が行われます。(右辺から先に読むと処理を理解しやすいです。10をbaseに入れる。5をheightに入れる。baseにheightをかけて2で割った計算結果をareaに入れる。)
  • * はかけ算,/ は割り算を示す「算術演算子」です。
  • " は二重引用符(ダブルクォーテーション)でShiftキーを押しながら2のキーを押すと入力できます。2つの二重引用符に囲まれた内容は「文字列」データとして扱われます。
  • print()関数は,カッコ内に書かれた文字列や変数を画面に出力します。カッコ内の文字列や変数のことを「引数(ひきすう)」と呼びます。

print()例 #の後が画面出力の例

print(50)               # 50
print("Hello world")    # Hello world
a = 10
b = 5
c = "日本語文字列"
print(a,b,c)            # 10 5 日本語文字列

高さの変数をユーザが入力できるようにする

 プログラムを使用して画面を操作したりする人を「ユーザ」と呼びます。input()関数を使ってプログラム実行時にユーザが高さの値を入力できるようにコードを変更します。

base = 10
# 入力の受付
height = input("高さを入力 > ")
area = base * height / 2
print("area =",area)

実行結果

高さを入力 >

 input()関数により,画面からの入力待ちとなります。(input()関数は引数の文字列を画面に表示するので,ユーザに入力を促すメッセージとして利用します)
 キーボードから数値を入力してEnterキーを押すとプログラムに入力内容を渡せるのですが,7と入力したところエラーが表示されてしまいました。

高さを入力 > 7
Traceback (most recent call last):
File "C:\test\sample.py", line 4, in
area = base * height / 2
TypeError: unsupported operand type(s) for /: 'str' and 'int'

 エラーメッセージにエラーの発生行が表示されています。line 4(コードファイルの4行目)の「area = base * height / 2」でエラーになったことがわかります。エラーメッセージの最後の行に「TypeError」とあります。変数のデータ型が合っていないというエラーです。
エラーになった「area = base * height / 2」を見てみると

  • base は10という数値を代入したので整数(int)です。
  • height にはinput()関数の戻り値(画面からの入力文字列)が代入されたので文字列(str)です。
  • 2 は整数(int)です。

整数と文字列は一緒に計算できないためエラーになっていました。

input()で取得した文字列を数値に変換するコード

 float()関数を用いて,文字列を数値に変換するように変更したコードです。

base = 10
# 入力の受付
height = input("高さを入力 > ")
# 入力文字列を数値に変換
height = float(height)
area = base * height / 2
print("area =",area)
  • float()関数は,引数の値を小数に変換します。(整数に変換するint()関数もあります)
  • 「height = float(height)」で右辺と左辺に同じ変数 height があるのでコードの読み方に注意しましょう。まず右辺の計算が行われるので,heightの文字列がfloat()関数に渡されて処理されます。その後,float()関数の戻り値の小数値がheightに格納されます。

実行結果

高さを入力 > 7
area = 35.0

ユーザが入力した高さで三角形の面積を計算できました。

負の数値を入力できないようにする

 ユーザが高さに-5を入力したときを考えてみます。プログラムは命令通りに動くので計算通りのマイナスの値を表示します。三角形の面積を求めるプログラムとしては負の面積を表示したくないので,高さが負の値にならないようにする処理を組み込みます。

 どんな処理にすればよいか図で考えてみましょう。まずは,入力された値が負の値かどうかを判定する処理が必要です。

 再度入力してもらうためには入力受付の処理(input()関数)を何度も呼び出す必要がありそうです。

 繰り返し命令の一つに「while文」という制御構造があります。簡単なサンプルプログラムを次に示します。

i = 0
while i < 3:
    print("i=",i)
        
    print("ループ内")
    i = i + 1

print("ループ外!!")

実行結果

i= 0
ループ内
i= 1
ループ内
i= 2
ループ内
ループ外!!

 while 式 : の次の行からの固まりが繰り返しの対象になっています。

 プログラムの命令や計算式は上から順に実行され処理が進みますが,「if文」を用いると状況に応じて処理を切り替えることができます。簡単なサンプルプログラムを次に示します。

a = 5
if a < 10 :
    # 条件式が真のときに実行される固まり
    print("10より小さいです")
else:
    print("10以上です")

実行結果

10より小さいです


例では変数 a の値に5を代入していますので,a<10の条件式が成り立つ(真)ので「10より小さいです」が表示され,else:の次の固まりは実行されませんでした。変数 a に10を代入してプログラムを実行すると,条件式が成り立たない(偽)ので「10より小さいです」の固まりは実行されずに,else節が実行され「10以上です」が表示されます。

完成コード

 三角形の面積を求めるプログラムに戻り,高さの入力処理を while文で繰り返すように変更します。繰り返しの固まりの中で,文字列から数値への変換と,負の数値の判定を行います。

base = 10
# 入力受付のループ
while True:
    height = input("高さを入力 > ")
    # 入力文字列を数値に変換
    height = float(height)
    
    # 入力数値のチェック
    if height < 0:
        print("正の数値を入力してください")
    else:
        # 負でなければループを抜ける
        break
    
area = base * height / 2
print("area =",area)
  • while文の条件式を True としたので,常に真となり無限にループします。
  • if文のelse節にある「break文」が実行されるとwhileのループを終了します。
  • プログラム誤りにより無限ループが終了しない場合は,キーボードで「Ctrl+C」を入力するとプログラムを中断できます。

実行結果

高さを入力 > -7
正の数値を入力してください
高さを入力 > 7
area = 35.0

 これでユーザが入力した高さの値が負の数値となった場合に,再入力を受け付けることができるようになりました。プログラムの学習初期の内容としてはここまでで十分だと思います。

エラー処理を組み込んだコード(やや高度な内容)

 頑張って作成した「三角形の面積を求めるプログラム」ですが,高さの入力時にユーザが数値以外の文字を入力したらどうなるでしょうか。

高さを入力 > a
Traceback (most recent call last):
File "C:\test\sample.py", line 6, in
height = float(height)
ValueError: could not convert string to float: 'a'

 float()関数で数値に変換できない文字列が渡された場合に ValueError が発生します。対応としては,入力した文字列の内容を先にチェックしてエラーにならないようにするか,エラーの発生(例外と呼ばれます)を処理することが考えられます。
 ここでは「try ... except 文」で例外処理を組み込んだコードの例を示します。

#
# 三角形の面積を計算するプログラム
#

print("三角形の面積を計算します")

# 入力受付のループ
while True:
    base = input("底辺を入力 > ")
    height = input("高さを入力 > ")
    
    # 入力文字列を数値に変換
    try:
        base = float(base)
        height = float(height)
    except ValueError:
        print(" Error! 数値を入力してください")
        continue
    except:
        print("予期していないエラーです")
        import sys
        sys.exit()

    # 入力数値のチェック
    if base < 0 or height < 0 :
        print(" Error! 正の数値を入力してください")
    else:
        # 負の数値でなければ入力ループ終了
        break

# 面積の計算
area = base * height / 2
print("三角形の面積は " + str(area) + " です")
  • try: の固まりで発生した例外に応じて,あてはまる except節の処理が実行されます。
  • 例外が発生しなければexcept節の処理は実行されません。
  • コード例の最終行のprint()関数の引数内は,文字列の連結を行っています。文字列どうしは +演算子を用いると文を連結できます。area変数のデータ型は浮動小数点数(float)なので,str()関数で文字列に変換しています。


 ここまでできたら,次のような改造も考えてみましょう。

  • 面積の計算処理と結果表示の処理をwhileのループの中に入れて,入力と計算を何度も繰り返せるようにする。
  • 入力が end の場合はループを終了する。