#author("2021-10-07T16:26:34+09:00","default:takataka","takataka") #author("2021-10-07T17:47:26+09:00","default:takataka","takataka") * 応用プログラミング及び実習 2021年度 ex03 [#xa9b83a6] //&color(red){''工事中''}; #contentsx **注意 [#ib719427] notebook のセルを実行していると,たまにセルの番号のところが [*] となったままで反応が返ってこなくなるときがあります. ありがちな状況と対処法を書いときます + 単に処理に時間がかかってるだけ → 待てばいい + input( ) が入力待ってる → 入力欄になんか入力して Enter + いつまで待ってもだめ → ウィンドウ上部の「■」ボタンを押して,そのセルの実行を強制的に停止させる ** ex03A [#kadaiA] [[ex03kadaiA.ipynb>https://github.com/takatakamanbou/AProg/blob/main/ex03kadaiA.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] 以下の指示にしたがってください *** Step1 [#a6fd109c] [[gamescores.txt>AProg:gamescores.txt]] + 上記リンク先のファイルをダウンロードして,自分の AProg2021 フォルダ/ディレクトリ内におく. + 同じ場所に,下記の内容のファイル ex03score.py を作る(コピペしたらよい). + ex03score.py を実行できることを確認. gamescores.txt には,あるゲームの参加者のID(文字列)とスコア(浮動小数点数)が格納されています #pre{{ ##### AProg2021 ex03B ### 関数 readScore() の定義 # この関数はいじる必要はない # 中身は知らないことだらけなので,現時点では眺めてふーんって感じでよい # def readScore(fn): with open(fn, 'r', encoding='utf-8') as f: # ファイルを読み込みモードで開く idL = [] # 空のリストを作る.ID用 scoreL = [] # 空のリストを作る.スコア用 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) を追加 return idL, scoreL ### ほげ # 引数にファイル名を指定して readScore() 関数を呼ぶ # 戻り値2つを idList, scoreList として受け取る idList, scoreList = readScore("gamescores.txt") # 最初の5件だけ中身を表示 for i in range(5): print(i, idList[i], scoreList[i]) ### ふが }} *** Step2 [#jbd21153] + 「###ほげ」のところに,次の仕様の関数を定義する -- 関数名は 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 という拡張モジュールををちょっと使ってみよう. - ex03score.py を ex03S.py にコピーして,次のことをやろう. - 期限と提出場所: 1021火の11時までに Teams チャットで takataka へ - 期限と提出場所: 1021木の授業終了までに 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 ほげ」(ほげに適当なキワード)とか検索すれば分かるだろう. ***ちょこっと 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);