応用プログラミング及び実習 2019年度 第2回 実習課題B

以下の課題を全てやりなさい.

課題B-1

以下のセルを順に実行していくと,グラフが描かれる. これは,2004年度1年間の大津市の日平均気温の変化を表そうとしているのだが,次のところがおかしい.

  1. 6月末までの半年分しかない
  2. 1月1日を0日目として100日目に 45 という値が入っているが,これは間違いで,本当は 14.6
  3. 同様に,200日目も本当は 28.9

以下の「この課題で書き加えたり修正したりしてよいのはこのセルだけ」と書かれたセルに書き加えたり内容を修正したりして,おかしい所が修正された正しい1年間のグラフが描かれるようにしなさい.

In [ ]:
# 2004年度の大津市の日平均気温.1月-6月     ★ここを書き換えるはNG★
tempOtsu_1H = [
    7.4, 7.2, 7.4, 5.7, 4.2, 3.2, 5.4, 3.4, 2.6, 4.4, 3.4, 3.7, 3.8, 2.2, 2.7, 1.9, 1.2, 3.0, 5.0, 4.3, 2.7, -1.7, 1.2, 2.5, 1.6, 2.2, 2.6, 3.5, 4.6, 4.4, 4.0, 
    3.5, 5.9, 6.3, 3.1, 2.0, 1.9, 1.9, 3.0, 2.7, 2.1, 3.4, 5.2, 4.8, 6.3, 4.5, 3.6, 3.3, 5.4, 5.3, 7.4, 9.6, 11.0, 6.6, 5.8, 9.4, 7.6, 3.8, 5.7, 7.0, 
    6.0, 4.3, 2.5, 3.5, 4.2, 4.1, 1.5, 2.8, 5.4, 9.3, 10.1, 7.0, 6.9, 7.3, 8.1, 9.8, 16.0, 8.1, 6.1, 6.3, 6.9, 4.7, 8.0, 8.7, 9.4, 8.8, 8.4, 9.8, 13.4, 13.0, 11.5, 
    10.5, 13.2, 10.8, 6.7, 9.1, 11.8, 14.3, 10.8, 11.1, 45, 16.4, 17.0, 15.1, 12.9, 14.6, 17.6, 18.4, 17.7, 17.8, 15.9, 16.7, 20.3, 15.1, 10.8, 11.9, 15.1, 15.7, 12.3, 16.0, 16.5, 
    17.4, 16.1, 18.3, 17.4, 14.9, 17.0, 17.5, 18.1, 17.6, 17.9, 18.3, 19.9, 19.5, 17.5, 18.8, 18.0, 20.8, 18.1, 15.3, 15.7, 19.8, 19.4, 18.4, 18.0, 18.4, 20.0, 22.0, 22.5, 23.1, 26.0, 22.0, 
    19.3, 19.1, 20.9, 21.1, 22.7, 21.6, 23.8, 20.2, 22.3, 23.5, 20.1, 20.8, 20.5, 20.4, 21.9, 22.8, 23.7, 24.5, 24.7, 26.4, 25.2, 24.8, 24.6, 25.0, 24.3, 23.7, 25.9, 25.5, 26.9, 26.4,
]

# 2004年度の大津市の日平均気温.7月-12月     ★ここを書き換えるはNG★
tempOtsu_2H = [
    25.1, 25.1, 26.7, 27.8, 27.8, 28.2, 28.6, 30.1, 29.1, 25.0, 25.1, 23.3, 27.2, 27.1, 27.7, 27.9, 27.7, 27.8, 45, 29.1, 27.9, 27.5, 27.2, 29.3, 26.8, 26.1, 28.1, 28.8, 28.4, 28.1, 25.7, 
    27.4, 27.2, 25.5, 26.1, 26.5, 28.5, 27.0, 27.1, 27.7, 28.1, 26.7, 26.4, 27.7, 27.6, 23.8, 24.4, 26.0, 28.3, 29.5, 25.5, 24.5, 24.7, 24.5, 24.4, 24.4, 24.8, 26.9, 26.1, 25.8, 27.9, 27.3, 
    25.8, 20.3, 23.5, 24.1, 24.7, 26.6, 28.7, 26.3, 24.2, 22.0, 23.6, 25.4, 26.4, 25.3, 24.0, 24.4, 25.5, 24.5, 24.2, 25.7, 26.1, 20.6, 23.1, 23.6, 23.9, 23.7, 21.5, 23.6, 21.2, 21.3, 
    21.1, 20.8, 19.1, 20.1, 18.2, 19.6, 18.9, 17.2, 19.5, 21.9, 20.7, 19.9, 18.3, 15.2, 14.8, 14.0, 15.4, 17.0, 16.7, 18.1, 17.5, 15.9, 14.6, 13.7, 16.9, 14.5, 11.2, 10.4, 14.1, 15.5, 16.3, 
    17.6, 16.3, 15.3, 13.5, 12.8, 13.6, 14.3, 13.1, 13.4, 14.9, 17.6, 17.1, 11.0, 10.8, 12.6, 11.1, 10.0, 10.0, 12.2, 11.6, 10.9, 10.9, 9.7, 10.2, 10.9, 11.5, 12.1, 11.6, 9.8, 8.9, 
    8.2, 9.5, 8.1, 11.9, 13.3, 8.1, 7.3, 8.5, 7.5, 9.3, 9.8, 7.5, 9.5, 6.8, 6.8, 8.2, 6.4, 5.4, 9.0, 11.4, 8.2, 7.4, 5.0, 4.5, 5.8, 6.9, 6.0, 4.8, 4.2, 3.0, 1.3, 
]

print(len(tempOtsu_1H), len(tempOtsu_2H))
In [ ]:
### この課題で書き加えたり修正したりしてよいのはこのセルだけ
tempOtsu = tempOtsu_1H
In [ ]:
%matplotlib inline
import matplotlib.pyplot as plt
plt.plot(tempOtsu)

課題B-2

C言語の配列やPythonのリストのようなデータ構造(数や文字列などのデータの集まりをコンピュータ上で扱うときの形式)では,要素が順番付きで格納されており要素番号を指定してその値を知ることができる.

このようなデータ構造に格納されたデータに対して次のようなアルゴリズム(手順)を適用すると,最大値を求めることができる(ここでは要素番号は 0 からはじまると仮定している).

  1. 最大値を格納するための変数(ここでは max とする)を用意し,要素番号 0 の要素の値を代入する
  2. i を1, 2, ..., と大きくしながら以下を繰り返す:
    • max の値と i 番目の要素の値を比較し,後者の方が大きければその値を max に代入する

最大値そのものを覚えておくかわりに,「最大値が入っている要素番号」を覚えておくことにすると,次のアルゴリズムで同じことができる.

  1. 「最大値が入っている要素番号」表す変数(ここでは imax とする)を用意し, 0 を代入する
  2. i を1, 2, ..., と大きくしながら以下を繰り返す:
    • imax 番目の要素の値と i 番目の要素の値を比較し,後者の方が大きければ i の値をimax に代入する

これらを元にして, 課題B-1 のリスト tempOtsu に格納された気温の値の最大値およびその要素番号(何日目だったか)を求めて出力するコードを以下のセルに書きなさい.

ちなみに,ループを 1 からはじめる方法については,今日の notebook または課題B-3 に手がかりがある.

In [ ]:
### 最大値とその番号を求めるコードはここに書く

print("最大値は", 45, "度", end = " ")   # 修正してね
print("(", 100, "日目 )")                        # 修正してね

課題B-3

まずは以下を実行しよう.

In [ ]:
gengou = [ "明治", "大正", "昭和", "平成", "令和" ]   # 和暦の元号名
gannen = [ 0, 1912, 1926, 1989, 2019]                  # それらの元年の西暦年
for i in range(1, len(gengou)):
    print(gengou[i] + "元年は西暦" + str(gannen[i]) + "年です")
    
y = int(input("生まれ年を西暦で入力して Enter 押してね: "))
if y < gannen[3]:
    print(gengou[2] + "生まれ")
else:
    print(gengou[3] + "生まれ")

変数の内容や意味はコードと実行結果から読み取ろう(明治元年はややこしいので 0 にしてある.気になるひとは Wikipediaの明治元年 へ).

上記のコードは不完全なので,これを正しく動作するよう修正しなさい. ただし,本当は年だけでは判定できない(例えば平成は1989年1月8日からなので,この年の1月1日から1月7日までは昭和64年,同様に令和元年は2019年5月1日から)のだけれど,簡単のためその点には目をつぶることにしよう. また,明治以前の場合は全て明治生まれとすればよい.

elif をうまく使うこと.

In [ ]: