PYTHONでプログラムを作っていきます。
前回は年齢を表示させるところまで作成しました。今回では生年月日を入れて年齢と星座を表示して完成させます。
星座の名前のリストを作る
zodiac = ["山羊座", "水瓶座", "魚座", "牡羊座", "牡牛座", "双子座", "蟹座", "獅子座", "乙女座", "天秤座", "蠍座", "射手座"] print(zodiac[0]) #山羊座が出力される print(zodiac[11]) #射手座が出力される
上記の通り、zodiacという星座のリストを作成します。zodiac[0]には山羊座が格納されzodiac[11]には射手座が格納されます。最初のリストの番号が0(ゼロ)から始まることに気を付けて下さい。
ここでpythonの機能の面白いことを試してみます。
print(zodiac[-1]) #射手座が出力される print(zodiac[-12]) #山羊座が出力される
リスト番号にマイナスを入力してみると、後ろから数えた星座が出力されます。
print(zodiac[12]) #IndexError: list index out of range print(zodiac[-13]) #IndexError: list index out of range
但し、リスト番号を12、もしくは-13にするとエラー「IndexError: list index out of range」になります。12個の要素しかない為、範囲外ということですね。
これからのこの星座のリストに日付の情報も加えていきましょう。
星座のリストに日付の範囲を加える
星座は下記のように日付で分けられます。この日付の範囲を先ほどのリストに加えていきます。
山羊座 | 12/22~1/19 | 牡牛座 | 4/20~5/20 | 乙女座 | 8/23~9/22 |
水瓶座 | 1/20~2/18 | 双子座 | 5/21~6/21 | 天秤座 | 9/23~10/23 |
魚座 | 2/19~3/20 | 蟹座 | 6/22~7/22 | 蠍座 | 10/24~11/22 |
牡羊座 | 3/21~4/19 | 獅子座 | 7/23~8/22 | 射手座 | 11/23~12/21 |
zodiac = [ ["山羊座", 12, 22], ["水瓶座", 1, 20], ["魚座", 2, 19], ["牡羊座", 3, 21], ["牡牛座", 4, 20], ["双子座", 5, 21], ["蟹座", 6, 22], ["獅子座", 7, 23], ["乙女座", 8, 23], ["天秤座", 9, 23], ["蠍座", 10, 24], ["射手座", 11, 23] ] print(zodiac[0]) #["山羊座", 12, 22, 1, 19]が出力される
print(zodiac[0])を実行すると[“山羊座”, 12, 22, 1, 19]が出力されることになります。
星座の判断の仕方
では、星座の判断の仕方を考えます。
並びは[星座の名前(A)、星座の月の始め(B)、星座つの日の始め(C)]となっています。例えば、生まれた月日が8月15日とします。まず、zodiac[0]からzodiac[11]の配列の中の(B)が8かどうかを確認します。該当する配列は、zodiac[9]になります。次にzodiac[9]の(C)が15より小さければ、zodiac[9]の配列(A)が星座に該当し、大きければ、一つ前のzodiac[8]の配列(A)が星座に該当します。
説明文だと解りにくいかもしれないので、実際にコードにしてみます。
for i in range(len(zodiac)): if zodiac[i][1] == int(birthmonth): if zodiac[i][2] <= int(birthday): print(f"{name}さんの星座は{zodiac[i][0]}です") break else: print(f"{name}さんの星座は{zodiac[i-1][0]}です") break
1行目:len(zodiac)はzodiacの中に何個配列があるかを調べる関数で、配列は12個あるので、len(zodiac)は12になります。iの初期値は0なので、iが11になるまでforループが繰り返されます。rangeは範囲という意味ですね。
2行目:zodiacの配列は3列の配列が12列ある多次元配列になっています。zodiac内A列目の配列の、B列目になるのでzodiac[A-1][B-1]という書き方になります。例えば、[“魚座”, 2, 19]の2列目の2の値を取得したい場合は、zodiac内3列目の配列の、2列目になるのでzodiac[2][1]という書き方になります。
2行目:int(birthmonth)は前回した文字列を整数に変換する式です。数字で入力したとしても文字列として判断されるために、数値に戻す必要があります。
2行目:Pythonの条件文を使う時は、if, elif, elseで最大構成されています。 今回はif、elseのみです。
- if(1つ以上の条件文)
- elif(3つ以上の条件文)
- else(2つ以上の条件文)
そして、大小の比較する場合、下記の演算子を使用します。
- 等しい: a == b
- 等しくない: a != b
- aはbより小さい a < b
- aはb以下: a <= b
- aはbより大きい: a > b
- aはb以上: a >= b
5、8行目:break。これはforループから抜け出すものです。今回は12回ループするだけで、breakを入れる必要はありませんが、ループ回数が長かったり、無限ループであればbreakを入れる必要があります。
プログラム コード
前回のプログラムと組み合わせてみます。
import datetime todaydt = datetime.datetime.now() #todaydtに本日の日付を入力 zodiac = [ ["山羊座", 12, 22], ["水瓶座", 1, 20], ["魚座", 2, 19], ["牡羊座", 3, 21], ["牡牛座", 4, 20], ["双子座", 5, 21], ["蟹座", 6, 22], ["獅子座", 7, 23], ["乙女座", 8, 23], ["天秤座", 9, 23], ["蠍座", 10, 24], ["射手座", 11, 23] ] name = input("名前を入力して下さい >> ") birthyear = input("生まれた西暦を入力して下さい(例:1999)>> ") birthmonth = input("生まれた月を入力して下さい(例:12) >> ") birthday = input("生まれた日を入力して下さい(例:1)") age01 = todaydt.year - int(birthyear) print(f"{name}さんの年齢は{age01}歳です") for i in range(len(zodiac)): if zodiac[i][1] == int(birthmonth): if zodiac[i][2] <= int(birthday): print(birthday) print(f"{name}さんの星座は{zodiac[i][0]}です") break else: print(f"{name}さんの星座は{zodiac[i-1][0]}です") break
PYTHONではインテンド(intend:字下げ)が重要です。
上記のプログラムで気づいて頂きたいのは、for文、if文ではインテンド(intend:字下げ)を必ずしています。C言語等はインテンドをしなくても大丈夫ですが、PYTHONは必ずしなければなりません。
私の場合、このインテンドについて知らなかったので、何度もエラーを繰り返していました。その後、おかげでコードが整って記述できるようになりました。
まとめ
いかがでしたか。PYTHONはシンプルで解りやすいプログラムであることが実感できたのではないでしょうか。
次回はGUIを使ったプログラムを作ってみたいと思います。
コメント