- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2021-10-07T17:39:48+09:00","default:takataka","takataka")
[[AProg/2021/ex04]]
#author("2021-10-27T10:37:43+09:00","default:takataka","takataka")
* 応用プログラミング及び実習 2021年度 ex05 [#xa9b83a6]
* 応用プログラミング及び実習 2021年度 ex04 [#xa9b83a6]
//&color(red){''工事中''};
&color(red){''工事中''};
#contentsx
**注意 [#ib719427]
notebook のセルを実行していると,たまにセルの番号のところが [*] となったままで反応が返ってこなくなるときがあります.
ありがちな状況と対処法を書いときます
+ 単に処理に時間がかかってるだけ → 待てばいい
+ input( ) が入力待ってる → 入力欄になんか入力して Enter
+ いつまで待ってもだめ → ウィンドウ上部の「■」ボタンを押して,そのセルの実行を強制的に停止させる
** ex04A [#kadaiA]
** ex05A [#kadaiA]
[[ex04kadaiA.ipynb>https://github.com/takatakamanbou/AProg/blob/main/ex04kadaiA.ipynb]]
[[ex05kadaiA.ipynb>https://github.com/takatakamanbou/AProg/blob/main/ex05kadaiA.ipynb]]
+ 上記のリンク先から notebook ファイルをダウンロードして開く
-- notebook の扱い方を忘れたひとは [[こちら>../Setup#part2]]
+ そこに記された指示にしたがって notebook を編集・実行して保存
+ その notebook ファイルを以下の提出場所へ提出
提出場所: [[この科目の Moodle コース>https://www-tlab.math.ryukoku.ac.jp/moodle/course/view.php?id=5]] の「ex04課題A」
''注意'': 文章をきちんと読んでもらえばわかりますが, P2 のところに書いてある「文字列を入力したら,単語内の文字をひっくり返して出力してくれるようにする問題を考えます」というのは,P2の最終目標ではなく,この課題と次の課題(ex05B)全体での目標です.
P2 で(またはP4までで)「文字列を入力したら,単語内の文字をひっくり返して出力してくれる」処理を完成させろと言っているわけではありません.
** ex04B [#kadaiB]
提出場所: [[この科目の Moodle コース>https://www-tlab.math.ryukoku.ac.jp/moodle/course/view.php?id=5]] の「ex05課題A」
+ 右のリンク先のファイルを自分の AProg2021 フォルダ/ディレクトリに保存しましょう.: [[zipdata.txt>AProg:zipdata.txt]]
-- ''リンクを右クリックして「リンク先を別名で保存」とかそんなん''
-- このファイルは,文字コード UTF-8 / UNIX改行コードで作成されたテキストファイルです.
Windows環境の一部のソフトウェア(メモ帳など)で開くと,文字コードを変換できなくて化けちゃうことがあります.
+ ダウンロードしたファイルを VSCode で開いて内容を確認しておきましょう.
+ AProg2021 に,以下の内容のファイル ex04zip.py を作りましょう.
#pre{{
#### AProg2021 第4回課題B
** ex05B [#kadaiB]
### 関数 readZIP() の定義
# 中身は一部知らないこともあるので,現時点では眺めてふーんって感じでよい
def readZIP(fn):
dZIP = {} # 空のディクショナリを作る
ex05A のつづきで,文字列を入力したら単語内の文字をひっくり返して出力してくれるプログラムを作りましょう.
名前は ex05reverse.py としてください(''名前間違えないように'').
# macOS のひとは,以下の「encoding="utf-8"」の部分はなくても ok
with open(fn, "r", encoding="utf-8") as f: # ファイル名 fn のファイルを読み込みモードで開く
for line in f: # ファイルから1行ずつ読み込んでループ
x, y = line.split() # 空白区切りで分割.1つ目を x に,残り(2つ目)を y に
dZIP[x] = y # キー x, 値 y のペアを登録.x, y とも文字列
return dZIP
*** step1 [#u5a410d8]
# 引数にファイル名を指定して readZIP() を呼ぶ
# 何を引数に指定するかは自分で考えよう.戻り値は郵便番号データのディクショナリ
zip = readZIP( )
次のような関数 reverseSentence() の定義を書いて,動作確認しよう.
- 関数名は reverseSentence
- 引数は1つ(文字列),戻り値は文字列
- 実行例(1)
S1 = " ぼく ほげお \tほげ ほげ〜\n"
R1 = reverseSentence(S1)
print(R1)
くぼ おげほ げほ 〜げほ
- 実行例(2)
print(reverseSentence("sihT si a .nep"))
This is a pen.
- ヒント: 部分文字列ごとにひっくりがえす.「ex05 Notebook その3」思い出そう.
# ディクショナリに対する len() は,キーの数を返す
print(len(zip), "件の郵便番号データを読み込みました")
*** step2 [#l0f62b73]
プログラムの末尾に,次のコードを挿入して実行しよう.読み込むファイルはこちら: [[ex05msg.txt>AProg:ex05msg.txt]]
#pre{{
fn = "ex05msg.txt"
with open(fn, "r", encoding="utf-8") as f: # ファイル名 fn のファイルを読み込みモードで開く
for line in f: # ファイルから1行ずつ読み込んでループ
print(line) # そのまま表示
}}
+ 上記を1箇所だけ修正(コード中のコメント参照,引数にはダウンロードしたファイルの名前を指定しましょう)して,動作確認しましょう.
+ さらにプログラムを修正して, 実行すると次のように郵便番号から住所を検索できるようにしてください
-- 入力の扱い方や終了の条件等は,[[ex04A>#kadaiA]] を参考にしてね
上記の for 文の中を修正して,読み込んだファイルの各行に reverseSentence() を適用した結果を出力するようにしてください.
//&size(8){なんかのりでほげおに新たな設定が爆誕...};
*** step3 [#p8f8df2e]
プログラムの末尾に次のようなコードを追加して動作確認しましょう(姓名や学籍番号は自分ので).
確認できたら,提出しましょう.
#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
myID = "A01055 ほげ ほげお" # 学籍番号,姓,名を空白区切りで
print(reverseSentence(reverseSentence(myID)))
}}
+動作確認をして間違いがないことを確認したら,以下へ提出してください.提出するのは,ex04zip.py です.
提出場所: [[この科目の Moodle コース>https://www-tlab.math.ryukoku.ac.jp/moodle/course/view.php?id=5]] の「ex04課題B」
**ex04S (omake) [#kadaiS]
提出場所: [[この科目の Moodle コース>https://www-tlab.math.ryukoku.ac.jp/moodle/course/view.php?id=5]] の「ex05課題B」
**ex05S (omake) [#kadaiS]
//&color(#ff0000){工事中};
&color(red){''これはおまけ課題です.やらなくても減点はありません.やったら棒茄子?''};
[[ex04kadaiS.ipynb>https://github.com/takatakamanbou/AProg/blob/main/ex04kadaiS.ipynb]]
- 以下の説明にしたがって作ったプログラムのファイルを提出してください
- 期限と提出場所: 1104木の授業終了までに Teams チャットで takataka へ
- 高橋のところで「数理情報セミナー」やってるひとは「おまけのおまけ」のところまで含めてすでにやってるので,残念ながらこの課題を提出しても点数は付きません
''画像処理してみよう''
- 上記の notebook を開き,その指示にしたがって編集・実行し,仕上げた notebook ファイルを提出してください
- 期限と提出場所: 1028火の11時までに Teams チャットで takataka へ
&ref(http://www-tlab.math.ryukoku.ac.jp/~takataka/course/AProg/blackuni3.png,nolink);
この課題のねらい:
- Pythonで初歩的なデータ分析を経験してみる
- ネット上のリファレンス等の情報を自分で収集してプログラムを書く経験をする
//&color(#ff0000){工事中};
+ 以下では OpenCV という,''コンピュータビジョン''(コンピュータに人間のような視覚をもたせる方法を考える研究開発分野)のためのライブラリを利用します.次のようにしてインストールしてください.
pip3 install opencv-python
+ 上記の画像を手元に保存しなさい.
+ 次のプログラムを実行しなさい.ファイル名は ex05S.py としよう.
#pre{{
import cv2 # OpenCV モジュール
# 画像の読み込み
img = cv2.imread('blackuni3.png')
if img is None:
print('File Not Found')
print(img.shape) # 正しく読み込めたら, img は NumPy の3次元配列になる(カラーの場合)
# 画像を表示
cv2.imshow("hoge", img)
cv2.waitKey(0) # 画像を表示したウィンドウ内で何かキーが押されるまで待つ
# 画像を書き込み
cv2.imwrite("hoge.png", img)
}}
+ 上記の画像とは別の画像を使って実行してみよう.
+ 上記を書き換えて遊ぼう.ただし,次の処理を必ず行うこと.情報収集は「opencv python ほげ」でウェブ検索したりがよいだろう.
-- 左右and/or上下反転
-- 色反転(画素値を反転させる)
-- ググると bitwise_notを使う方法が出てくるでしょう.それを使う場合,それでなぜ画素値の反転ができるのかを考えて,コメントとして書いてください
-- bitwise_not を使わない場合,「255から元の画素値を引く」で実現できます.こちらのやり方する場合も,それでなぜできるのかをコメントに書きましょう
-- 画像の大きさを変える
-- 適当に上記のもの以外の何か面白い処理を追加
(おまけのおまけ)カメラ付きのPCまたはウェブカメラを持ってるひとは,以下のプログラムを実行してみるとよいでしょう.
#pre{{
import cv2
cap = cv2.VideoCapture(0)
while(True):
rv, frame = cap.read()
cv2.imshow('hoge', frame)
if cv2.waitKey(1) == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
}}