- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2021-10-07T17:04:42+09:00","default:takataka","takataka")
[[AProg/2021/ex03]]
#author("2021-10-14T18:23:55+09:00","default:takataka","takataka")
* 応用プログラミング及び実習 2021年度 ex04 [#xa9b83a6]
* 応用プログラミング及び実習 2021年度 ex03 [#xa9b83a6]
//&color(red){''工事中''};
#contentsx
**注意 [#ib719427]
notebook のセルを実行していると,たまにセルの番号のところが [*] となったままで反応が返ってこなくなるときがあります.
ありがちな状況と対処法を書いときます
+ 単に処理に時間がかかってるだけ → 待てばいい
+ input( ) が入力待ってる → 入力欄になんか入力して Enter
+ いつまで待ってもだめ → ウィンドウ上部の「■」ボタンを押して,そのセルの実行を強制的に停止させる
** ex03A [#kadaiA]
** ex04A [#kadaiA]
[[ex03kadaiA.ipynb>https://github.com/takatakamanbou/AProg/blob/main/ex03kadaiA.ipynb]]
[[ex04kadaiA.ipynb>https://github.com/takatakamanbou/AProg/blob/main/ex04kadaiA.ipynb]]
+ 上記のリンク先から notebook ファイルをダウンロードして開く
-- notebook の扱い方を忘れたひとは [[こちら>../Setup#part2]]
+ そこに記された指示にしたがって notebook を編集・実行して保存
+ その notebook ファイルを以下の提出場所へ提出
提出場所: [[この科目の Moodle コース>https://www-tlab.math.ryukoku.ac.jp/moodle/course/view.php?id=5]] の「ex03課題A」
** ex03B [#kadaiB]
提出場所: [[この科目の Moodle コース>https://www-tlab.math.ryukoku.ac.jp/moodle/course/view.php?id=5]] の「ex04課題A」
以下の指示にしたがってください
** ex04B [#kadaiB]
*** Step1 [#a6fd109c]
[[gamescores.txt>AProg:gamescores.txt]]
+ 上記リンク先のファイルをダウンロードして,自分の AProg2021 フォルダ/ディレクトリ内におく.
+ 同じ場所に,下記の内容のファイル ex03score.py を作る(コピペしたらよい).
+ ex03score.py を実行できることを確認. gamescores.txt には,あるゲームの参加者のID(文字列)とスコア(浮動小数点数)が格納されています
+ 右のリンク先のファイルを自分の AProg2021 フォルダ/ディレクトリに保存しましょう.: [[zipdata.txt>AProg:zipdata.txt]]
-- ''リンクを右クリックして「リンク先を別名で保存」とかそんなん''
-- このファイルは,文字コード UTF-8 / UNIX改行コードで作成されたテキストファイルです.
Windows環境の一部のソフトウェア(メモ帳など)で開くと,文字コードを変換できなくて化けちゃうことがあります.
+ ダウンロードしたファイルを VSCode で開いて内容を確認しておきましょう.
+ AProg2021 に,以下の内容のファイル ex04zip.py を作りましょう.
#pre{{
##### AProg2021 ex03B
#### AProg2021 第4回課題B
### 関数 readScore() の定義
# この関数はいじる必要はない
# 中身は知らないことだらけなので,現時点では眺めてふーんって感じでよい
#
def readScore(fn):
### 関数 readZIP() の定義
# 中身は一部知らないこともあるので,現時点では眺めてふーんって感じでよい
def readZIP(fn):
with open(fn, 'r', encoding='utf-8') as f: # ファイルを読み込みモードで開く
idL = [] # 空のリストを作る.ID用
scoreL = [] # 空のリストを作る.スコア用
dZIP = {} # 空のディクショナリを作る
# macOS のひとは,以下の「encoding="utf-8"」の部分はなくても ok
with open(fn, "r", encoding="utf-8") 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 のペアを登録.x, y とも文字列
return idL, scoreL
return dZIP
### ほげ
# 引数にファイル名を指定して readScore() 関数を呼ぶ
# 戻り値2つを idList, scoreList として受け取る
idList, scoreList = readScore("gamescores.txt")
# 引数にファイル名を指定して readZIP() を呼ぶ
# 何を引数に指定するかは自分で考えよう.戻り値は郵便番号データのディクショナリ
zip = readZIP( )
# 最初の5件だけ中身を表示
for i in range(5):
print(i, idList[i], scoreList[i])
### ふが
# ディクショナリに対する len() は,キーの数を返す
print(len(zip), "件の郵便番号データを読み込みました")
}}
+ 上記を1箇所だけ修正(コード中のコメント参照,引数にはダウンロードしたファイルの名前を指定しましょう)して,動作確認しましょう.
+ さらにプログラムを修正して, 実行すると次のように郵便番号から住所を検索できるようにしてください
-- 入力の扱い方や終了の条件等は,[[ex04A>#kadaiA]] を参考にしてね
#pre{{
118014 件の郵便番号データを読み込みました
郵便番号を入力してください('q'か'Q'で終了) 1057219
1057219 東京都港区東新橋汐留メディアタワー(19階)
郵便番号を入力してください('q'か'Q'で終了) 1057220
1057220 東京都港区東新橋汐留メディアタワー(20階)
郵便番号を入力してください('q'か'Q'で終了) 0010010
0010010 北海道札幌市北区北十条西(1〜4丁目)
郵便番号を入力してください('q'か'Q'で終了) 9998525
9998525 山形県飽海郡遊佐町直世
郵便番号を入力してください('q'か'Q'で終了) 5202123
5202123 滋賀県大津市瀬田大江町
郵便番号を入力してください('q'か'Q'で終了) 1234567
見つかりません
郵便番号を入力してください('q'か'Q'で終了) q
}}
+動作確認をして間違いがないことを確認したら,以下へ提出してください.提出するのは,ex04zip.py です.
提出場所: [[この科目の Moodle コース>https://www-tlab.math.ryukoku.ac.jp/moodle/course/view.php?id=5]] の「ex04課題B」
*** Step2 [#jbd21153]
**ex04S (omake) [#kadaiS]
+ 「###ほげ」のところに,次の仕様の関数を定義する
-- 関数名は myaverage
-- 引数は一つだけ受け取る.名前は X とする(本来は好きな名前でいいのですが,練習のため指定します)
-- 引数として受け取ったものが数値の格納されたリストと仮定して,その要素の平均を求め,その値を返す
-- 引数として受け取ったものがリストではないときや,数値でないものが入っていた場合の処理は考えなくてよい
-- 組み込み関数 sum は使ってはいけない
+ 「###ふが」のところで, scoreList を引数として myaverage を呼んで,得られた平均値を print する.
print('平均値:', ほげ)
みたいにそれが何の値かわかるようにしてね.
+ 動作を確認する.最初はたとえば関数に scoreList[:2] を渡して結果を確認とかするのもよいでしょう.
*** Step3 [#i82379b7]
+ 先の Step と同様にして,もうひとつ関数定義を追加する
-- 関数名は myargmax
-- 引数として受け取ったものが数値の格納されたリストと仮定して,その中の最大値の要素番号を返す
-- 引数の数や名前等については myaverage と同様
-- len と range は使ってもよいが,それ以外の組み込み関数は使ってはいけない
+ 同様に,定義した関数を呼ぶコードを追加する.
+ 動作確認する
-- 最初はたとえば scoreList[:5] を渡して正しい要素番号が返ってくることを確認したらよいでしょう
+ 返ってきた要素番号を利用して,「スコアが最も大きかったひとの ID」と「そのスコアの値」を表示するように書き換える
+ 動作確認する
-- 提出版はちゃんと全体の最大が求まるようにしといてね
*** Step4 [#g2c0b10f]
動作確認をして間違いがないことを確認したら,以下へ提出してください.提出するのは,ex03score.py です.
提出場所: [[この科目の Moodle コース>https://www-tlab.math.ryukoku.ac.jp/moodle/course/view.php?id=5]] の「ex03課題B」
**ex03S (omake) [#kadaiS]
//&color(#ff0000){工事中};
&color(red){''これはおまけ課題です.やらなくても減点はありません.やったら棒茄子?''};
NumPy や Matplotlib という拡張モジュールををちょっと使ってみよう.
[[ex04kadaiS.ipynb>https://github.com/takatakamanbou/AProg/blob/main/ex04kadaiS.ipynb]]
- ex03score.py を ex03S.py にコピーして,次のことをやろう.
- 期限と提出場所: 1021火の11時までに Teams チャットで takataka へ
***ちょこっと NumPy [#uc6f4d3f]
+ プログラムの先頭に,次の行を追加
import numpy as np # NumPy モジュールを np という名前で扱えるようにインポート
+ readScore() 関数を読んだ直後で次のようにする
idList, scoreList = readScore("gamescores.txt")
score = np.array(scoreList) # scoreList から NumPy の配列を作る
print(score)
+ myaverage, myargmax のかわりに,同じことをする NumPy の関数を利用するように書き換える.
どんな関数を使えばよいかは,「numpy ほげ」(ほげに適当なキワード)とか検索すれば分かるだろう.
- 上記の notebook を開き,その指示にしたがって編集・実行し,仕上げた notebook ファイルを提出してください
- 期限と提出場所: 1028木の授業終了までに Teams チャットで takataka へ
***ちょこっと Matplotlib [#b040aaa4]
+ プログラムの先頭に,次の行を追加
import matplotlib.pyplot as plt
+ プログラムの末尾に,次の行を追加.ヒストグラムが描かれるはず.ヒストグラムのウィンドウを閉じればプログラムも終了する.
plt.hist(score)
plt.show()
+ 上記を修正して,以下のようなヒストグラムが描かれるようにしよう.
-- ヒント: これは,色を変えて,棒の幅を変えて,ヒストグラムのビン(1本の棒に相当する区間)を変えて作っている.
この課題のねらい:
- Pythonで初歩的なデータ分析を経験してみる
- ネット上のリファレンス等の情報を自分で収集してプログラムを書く経験をする
&ref(https://www-tlab.math.ryukoku.ac.jp/~takataka/course/AProg/02exS-hist.png,nolink);