#author("2018-09-27T19:35:26+09:00","default:takataka","takataka")
#author("2018-09-28T12:50:08+09:00","default:takataka","takataka")
*応用プログラミング及び実習 2018年度 第3回 [#ex03]

&color(#ff0000){工事中};
//&color(#ff0000){工事中};

#contents

** 今日の notebook [#c5575be4]

は [[AProg/2018]] からたどってください.
Notebook の扱いが分からないというひとはこちら: [[AProg/2018/ex01/Step1#step1_3]]

''<Notebook の開き方についてひとこと>''

 $ jupyter notebook hoge.ipynb
として開いたあと,メニューの 「File」 > 「Open」をたどると,hoge.ipynb と同じディレクトリ内のファイルを一覧できます.ここから他の notebook を開くこともできます.また,開きたい notebook のあるディレクトリで
 $ jupyter notebook
とすると,最初からファイル一覧が開きます.

**課題A (self) 期限: 授業当日11:45 [#kadaiA]

今日の notebook を開いてそこに記されたことを読んで&実行して学習しなさい.
完了したらチェックを受けなさい(notebookを開いたままにしておくこと).
**課題B (self) 期限: 当日の授業終了まで [#kadaiB]


[[02exB.ipynb>AProg:02exB.ipynb]]
[[03exB.ipynb>AProg:03exB.ipynb]]

上記リンク先の Jupyter Notebook を開いてその指示にしたがいなさい.
完了したらチェックを受けなさい.

** IPython について [#ipython]
&color(#ff0000){工事中};
**課題C (TA) 期限: 次回2講時開始直後 [#kadaiC]

次のことをやりなさい.
+ 右のリンク先のファイルを ~/aprog20XY ディレクトリに保存しなさい: [[02score.txt>AProg:02score.txt]]
+ less コマンドでファイルの中身を確認しなさい.終了は 'q' (Q)
-- このファイルの中身は次のようになっている.
次のことを全てやりなさい.

***課題C-1 [#w5fc6426]

+ [[前回課題C>AProg/2018/ex02#kadaiC]] のプログラム 02exC.py をコピーして 03exC1.py を作成しなさい.
+ ex03exC1.py に課題B-1で作った関数 argmin の定義を追加し,この関数を呼び出すように修正しなさい.
+ 最大値の要素番号を返す関数 argmax の定義を追加し,同様に修正しなさい.
+ 平均値を求めて返す関数 average の定義を追加し,同様に修正しなさい.

***課題C-2 [#w5cc067c]

+ 右のリンク先のファイルを ~/aprog20XY に保存しなさい: [[zipdata>AProg:zipdata]]
+ less コマンドで内容を確認しなさい.終了はアルファベットの 'q'
+ 同じディレクトリに以下の内容のファイルを 03exC2.py という名前で作りなさい.
#pre{{
ptz541   3.08
add210   3.40
  :
}}
-- これは,あるゲームのユーザごとのスコアを記録したものである.
各行がユーザ一人分の情報で,空白より前が「ユーザID」,後が「スコア」である.
+ 同じディレクトリに以下の内容のファイルを 02exC.py という名前で作りなさい.
#pre{{
##### AProg2018 第2回課題C
#### AProg2018 第3回課題C-2

### 関数 readScore() の定義
#      関数の話は次回以降の内容なので,この課題ではちゃんとわからなくてもよい
#      中身も知らないこと多数なので,現時点では眺めてふーんって感じでよい
def readScore(fn):
### 関数 readZIP() の定義
#      中身は一部知らないこともあるので,現時点では眺めてふーんって感じでよい
def readZIP(fn):

    with open(fn, "r") as f:  # ファイルを読み込みモードで開く
        idL = []     # 空のリストを作る.ID用
        scoreL = []  # 空のリストを作る.スコア用
    dZIP = {}       # 空のディクショナリを作る
    with open(fn, "r") as f:  # ファイル名 fn のファイルを読み込みモードで開く
        for line in f:  # ファイルから1行ずつ読み込んでループ
            line = line.strip()  # line は1行分の文字列.行末の改行文字を除去
            i, s = line.split()  # 空白区切りで分割.1つ目を i に,残り(2つ目)を s に 
            idL.append(i)           # idL の末尾に i を追加
            scoreL.append(float(s)) # scoreL の末尾に float(s) を追加
            x, y = line.split()   # 空白区切りで分割.1つ目を x に,残り(2つ目)を y に
            dZIP[x] = y           # キー x に対する値を y とする.いずれも文字列

    return idL, scoreL
    return dZIP


# 引数にファイル名を指定して readScore() 関数を呼ぶ
# 戻り値2つを idList, scoreList として受け取る
idList, scoreList = readScore("02score.txt")
# 引数にファイル名を指定して readZIP() を呼ぶ
#    何を引数に指定するかは自分で考えよう.戻り値は郵便番号データのディクショナリ
zip = readZIP( )

# ディクショナリに対する len() は,キーの数を返す
print(len(zip), "件の郵便番号データを読み込みました")

# 無限ループ
while True:
    num = input("郵便番号を入力してください(負の数だったら終了): ")
}}
+ 02exC.py を実行しなさい.
+ 02exC.py を修正し,以下の実行結果が示すようにスコアの最小最大およびそれぞれに対応するユーザID,スコアの平均値を出力するようにしなさい.
-- 最小・最大を求めるプログラムは自分で書く(組み込み関数 min(), max(), sum() および類似の機能に頼らない)こと.
-- 組み込み関数 len() は使って構わない
+ readZIP() を呼び出すところを修正して実行しなさい.無限ループを止めるには CTRL+C.
+ これを修正して,以下のように郵便番号を検索できるようにしなさい.
#pre{{
<実行結果(実際の正解とは異なる)>  
最小: hog820 1.03
最大: oge095 6.79
平均: 3.8520999999999996
   : (途中省略)
郵便番号を入力してください(負の数だったら終了): 5202123
5202123 滋賀県大津市瀬田大江町
郵便番号を入力してください(負の数だったら終了): 0010010
0010010 北海道札幌市北区北十条西(1〜4丁目)
郵便番号を入力してください(負の数だったら終了): 9998525
9998525 山形県飽海郡遊佐町直世
郵便番号を入力してください(負の数だったら終了): 1057219
1057219 東京都港区東新橋汐留メディアタワー(19階)
郵便番号を入力してください(負の数だったら終了): 1057229
1057229 東京都港区東新橋汐留メディアタワー(29階)
郵便番号を入力してください(負の数だったら終了): 1234567
見つかりません
郵便番号を入力してください(負の数だったら終了): -1
}}


**課題S (omake)  [#kadaiS]

//&color(#ff0000){工事中}; 
&color(#ff0000){工事中}; 

NumPy や Matplotlib をちょっと使ってみよう.02exC.py を 02exS.py にコピーして,次のことをやろう.

***ちょこっと NumPy [#uc6f4d3f]

+ プログラムの先頭に,次の行を追加
 import numpy as np   #  NumPy モジュールを np という名前で扱えるようにインポート
+ readScore() 関数を直後に以下を挿入して実行してみる
 score = np.array(scoreList)  # scoreList から NumPy の配列を作る
 print(score)
+ 最小最大平均を求めている部分を,NumPy の関数を呼び出すように書き換える.
どんな関数を使えばよいかは,「numpy ほげ」(ほげに適当なキワード)とか検索すれば分かるだろう.
+ ついでに標準偏差も計算させる
***ちょこっと Matplotlib [#b040aaa4]
+ プログラムの先頭に,次の行を追加
 import matplotlib.pyplot as plt
+ プログラムの末尾に,次の行を追加.ヒストグラムが描かれるはず.ヒストグラムのウィンドウを閉じればプログラムも終了する.
 plt.hist(score)
 plt.show()
+ 上記を修正して,以下のようなヒストグラムが描かれるようにしよう.
-- ヒント: これは,色を変えて,棒の幅を変えて,ヒストグラムのビン(1本の棒に相当する区間)を変えて作っている.

&ref(https://www-tlab.math.ryukoku.ac.jp/~takataka/course/AProg/02exS-hist.png,nolink);


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS