#author("2020-10-23T09:47:57+09:00","default:takataka","takataka")
#author("2020-11-02T18:26:59+09:00","default:takataka","takataka")
* 応用プログラミング及び実習 2020年度 ex05 [#xa9b83a6]

&color(red){''工事中''};
//&color(red){''工事中''};

#contentsx

** ex04A [#kadaiA]
** ex05A [#kadaiA]

[[ex04kadaiA.ipynb>https://gist.github.com/55d93d15b0847ebb17cef44a273ba38d]]
[[ex05kadaiA.ipynb>https://gist.github.com/69e48cac7cc215031c36f7729eecb208]]

+ 上記のリンク先から notebook ファイルをダウンロードして開く
-- リンク先の画面右の方の「Raw」を ''右'' クリックして「リンク先を別名で保存」とかそんなん
+ そこに記された指示にしたがって notebook を編集して保存
-- 以下の「注意」も参照してね
+ その notebook ファイルを以下の提出場所へ提出

提出場所: [[この授業のMoodleコース>https://moodle.media.ryukoku.ac.jp/course/view.php?id=2278]] の  [[ex04A>https://moodle.media.ryukoku.ac.jp/mod/assign/view.php?id=71909]]
提出場所: [[この授業のMoodleコース>https://moodle.media.ryukoku.ac.jp/course/view.php?id=2278]] の  [[ex05A>https://moodle.media.ryukoku.ac.jp/mod/assign/view.php?id=71984]]

''注意''
>
notebook のセルを実行していると,たまにセルの番号のところが [*] となったままで反応が返ってこなくなるときがあります.
ありがちな状況と対処法を書いときます
+ 単に処理に時間がかかってるだけ → 待てばいい
+ input( ) が入力待ってる → 入力欄になんか入力して Enter
+ いつまで待ってもだめ → ウィンドウ上部の「■」ボタンを押して,そのセルの実行を強制的に停止させる
<

** ex04B [#kadaiB]
** ex05B [#kadaiB]

ex05A のつづきで,文字列を入力したら単語内の文字をひっくり返して出力してくれるプログラムを作りましょう.
名前は ex05reverse.py としてください(''名前間違えないように'').

+ 右のリンク先のファイルを自分の AProg2020 フォルダ/ディレクトリに保存しましょう.: [[zipdata.txt>AProg:zipdata.txt]]
-- リンクを右クリックして「リンク先を別名で保存」とかそんなん
-- このファイルは,文字コード UTF-8  / UNIX改行コードで作成されたテキストファイルです.
Windows環境の一部のソフトウェア(メモ帳など)で開くと,文字コードを変換できなくて化けちゃうことがあります.
+ ダウンロードしたファイルを VSCode で開いて内容を確認しておきましょう.
+ AProg2020 に,以下の内容のファイル ex04zip.py を作りましょう.
#pre{{
#### AProg2020 第4回課題B

### 関数 readZIP() の定義
#      中身は一部知らないこともあるので,現時点では眺めてふーんって感じでよい
def readZIP(fn):
*** step1 [#u5a410d8]

    dZIP = {}       # 空のディクショナリを作る

    #  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 とも文字列
次のような関数 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」思い出そう.

    return dZIP

*** step2 [#l0f62b73]

# 引数にファイル名を指定して readZIP() を呼ぶ
#    何を引数に指定するかは自分で考えよう.戻り値は郵便番号データのディクショナリ
zip = readZIP( )
プログラムの末尾に,次のようなコードを挿入して実行しよう.読み込むファイルはこちら: [[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)       # そのまま表示
}}

# ディクショナリに対する len() は,キーの数を返す
print(len(zip), "件の郵便番号データを読み込みました")
}}
+ 上記を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://moodle.media.ryukoku.ac.jp/course/view.php?id=2278]] の  [[ex04B>https://moodle.media.ryukoku.ac.jp/mod/assign/view.php?id=71910]]
提出場所: [[この授業のMoodleコース>https://moodle.media.ryukoku.ac.jp/course/view.php?id=2278]] の  [[ex05B>https://moodle.media.ryukoku.ac.jp/mod/assign/view.php?id=71985]]


**ex04S (omake)  [#kadaiS]
**ex05S (omake)  [#kadaiS]

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

&color(red){''これはおまけ課題です.やらなくても減点はありません.やったら棒茄子?''};

[[ex04kadaiS.ipynb>https://gist.github.com/8a25200c4876bff44f470f24d2886a73]]
- 以下の説明にしたがって作ったプログラムのファイルを提出してください
- 提出場所: Classroom 上の [[こちら>https://classroom.google.com/c/MTYxODQ4NzczNzgy/a/MTkwNjMyNjYzODk5/details]] (ファイルをここに提出したら,Teams のチャットで知らせてね)
- 期限: 1103火の授業終了時

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

- 上記の notebook を開き,その指示にしたがって編集・実行してください
- 仕上げた notebook ファイルを提出してください
- 提出場所: Classroom 上の [[こちら>https://classroom.google.com/c/MTYxODQ4NzczNzgy/a/MTkwNjMyNjYzODk5/details]] (ファイルをここに提出したら,Teams のチャットで知らせてね)
- 期限: 1027火の授業終了時
''画像処理してみよう''

この課題のねらい:
- Pythonで初歩的なデータ分析を経験してみる
- ネット上のリファレンス等の情報を自分で収集してプログラムを書く経験をする
&ref(http://www-tlab.math.ryukoku.ac.jp/~takataka/course/AProg/blackuni3.png,nolink);

+ 以下では OpenCV という,''コンピュータビジョン''(コンピュータに人間のような視覚をもたせる方法を考える研究開発分野)のためのライブラリを利用します.次のようにしてインストールしてください(macのひとはpip3).
 pip 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()
}}


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