2023年度 電子情報通信課程 計算機実習II

はじめに

概要

コンピュータプログラミングの基礎を習得します.具体的には言語としてpythonを用い,条件分岐,繰り返し,変数の扱いなどについて学びます.

到達目標

プログラミングの基礎がわかるようになり,簡単なプログラムができるようになるのが到達目標です.

講義方法

計算機を用いて演習を行います. pythonが動く計算機のOSとしては,Windows,Linux,そしてmacOSが考えられますが,BYODに関してはWindows環境を前提として講義を進めます. それ以外の環境を使う場合は、各自の責任で進めて下さい. なお,講義は基本的には1-609実習室から中継しますので,実習室の計算機(Linux)を使うことも可能です.

※ただし,教員の都合により別の場所からの配信の場合もあります.その際はTeamsで通知しますので見落とさないように.

講義の説明部分を動画で用意しますので,各自,自分の進捗に合わせてそれを見ながら課題を進めて下さい.

授業時間外における予・復習等の指示

課題の提出締切は翌週の水曜日が終わるまでとします.木曜日に集計作業をする予定です.

注意点

原則として全出席,レポート全提出を合格の条件とします. レポート点(レポート:30点),最終課題点(小テスト:40点)にて評価します. 出席点(平常点:30点)には受講態度も考慮します.期末試験は行いません.

オンライン講義における出席点は,「締切までにレポートを提出した」ことを評価します.

また,書式が不適切なメールに対する減点は,受講態度として平常点の評価に含めます.

テキスト

大槻有一郎 12歳からはじめる ゼロからの Pythonゲームプログラミング教室

素材について

教科書のソースコードや画像ファイルは,出版社(ラトルズ)のwebページからダウンロードできます.教科書のP.VIIIにURLが載っていますのでそちらを参照して下さい.

ただし,ソースコードは自分の手で入力することを強く勧めます.その方が頭に入ってきて勉強になります.

教科書の表紙も同様ですが,このサイトの素材(画像)を扱うのは恥ずかしいと思うかもしれません.教科書に関してはカバーを外すと,おとなしい表紙になります.画像に関しては,いらすとやさんの素材を元に同じフォーマットで作り直した物を用意していますので,そちらの利用を検討して下さい.

担当

  • 主担当:植村 渉(1-410 or 1-432右)
  • 副担当:藤井 大輔(1-403
  • T.A. :川村 大樹
  •    :別莊 貴信
  •    :宇賀 圭佑
  •    :齊藤 真希
  •    :高井 知可史
  •    :田邉 稜汰

課題について

各回,「課題」をいくつか用意しています.それらを最後にメールで提出してもらいますので,実行結果等をテキストファイルに保存しておきましょう.

TAさんへの質問や確認は,Teamsの「10.質問受付」に書き込んで下さい.

なお,時間内に終わらなかった場合は宿題となりますが,締切は「翌週の水曜日まで」とします.

計算機実習Iの復習

利用環境は,各自のノートパソコンを基本とします(BYOD).大学の演習室のパソコンを使うのであれば,Linuxを薦めます.

パソコン(計算機)の基本的な使い方(ログインとログアウトなど)に関してはそれぞれの環境に依存するので本講義では扱いません.

ブラウザ(FireFoxなど)を立ち上げて,実習のページをブックマークしましょう

GUIで作業しても良いのですが,将来的なことを考えるとターミナル上でコマンドを入力して作業することを薦めます.第2回 ファイルとディレクトリ・エディタを思い出しながらコマンドを復習しましょう

  • ファイルの移動: mv
  • ファイルの削除: rm
  • ファイルの編集: nano / vi (植村はvi派です)
  • ファイルの中身表示: cat
  • ディレクトリの移動: cd
  • ファイルコピー: cp

ディレクトリとファイルシステムに関しては計算機実習1:第2回 ファイルとディレクトリ・エディタ(1)を参照して下さい.

※なお,上記のコマンドのうち「ファイル」に対する操作は,いずれも「ディレクトリ」に対しても操作できます.

Linux基本操作の復習,プログラミングの練習

開発環境の準備(python)

情報基礎/計算機実習1の講義にて,WSL(Windows Subsystem for Linux)上でPython3のインストールを終えているかと思います. 本講義では,12歳からはじめる ゼロからの Pythonゲームプログラミング教室を教科書として用います.この本では,Pythonは3.6を,エディタとしてVisual Studio Code(VS Code)を採用しています.そのため,Windows環境の人はWSLではなく,VS Codeを使うことを勧めます. またGUIプログラムを作るためにtkinterというモジュールを使っています.

本講義では,これら(pythonとtkinter)が使える環境であれば,それで問題ありません.viをエディタとして使用しても良いですし,jupyter notebookを利用しても良いです.OSもWindows,Linux,そしてMacOSのどれでも大丈夫です.

ただし,標準の組み合わせ以外で不都合が生じたときは,各自で調べて対処する必要があります(そのような状況に対して,T.A.や教員は完璧にサポートすることはできません).

※と,突き放したようなことを書いていますが,個人的にはそのようなことに挑戦するのは素晴らしいことと思っていますので,ぜひ,挑戦して下さい.

 インストール方法やトラブルシューティングに関しては,こちらのページに載せていますので,そちらを参照して下さい(3年前の情報なので,古いかも…).

教科書に書かれているインストール方法に関しては,「Pythonのインストール」として動画でも公開していますので,作業が分からない人は参照して下さい(こちらも古いかも…).

課題1-1

計算機実習2用のディレクトリ「com02」を作り,その中にex1-1.pyというファイルを作って実行しなさい.
※以降のソースコードに\が出てきた場合,それは日本語のキーボードではです(正確には半角文字の円記号です).

なお,講義ではファイル名をex1-1.py としていますが,教科書ではchap1.pyですので気をつけて下さい.

ex1-1.pyの中身
oqhms("Gdkkn Vnqkc!")
コマンド入力例
$ ljchq bnl91
$ bc bnl91
$ uh dwz-z.ox
$ oxsgnm2 dwz-z.ox

解説-1

インタプリタ/コンパイル

計算機が処理できるのは,各CPU のための命令一覧表(=数字) = 機械語(マシン語)です. CPU が変われば,命令の数字も変わります.
数字の一覧表では,人間には理解が難しいので,対応する命令に置き換えたものがアセンブリ言語です. アセンブリ言語で書かれたプログラムを,機械語に変換することをアセンブルといい,そのプログラムをアセンブラといいます. 1対1で対応しているため,文脈によっては機械語 = アセンブリ言語として用いることもあります.


当然,アセンブリ言語もCPU に依存しており,CPU が変わると,新しい言語を覚え直さないといけませんでした. ゲーム機のソフトが,そのゲーム機でしか使えない理由は,このためです. 違うハード用にソフトを作り直すことを「移植」と読んでいました.

これでは面倒くさいので,アセンブリ言語で書いたある動作をするプログラムに対して名前をつけて,その名前の単位でプログラムを書く方法が出てきました. 内部的な視点で言うと,アセンブリ言語を組み合わせて1つの機能(= 関数 = 命令)を作り上げ,命令が出てきたら対応するアセンブリ言語の集合体に置き換える という方式です.


ロボットアームの制御でいうと,「各関節につながっているモーターの角度を与えて動かす」ことしかマシン語レベル(ハードウエアの制御レベル)ではできないのですが,各モーターの角度の組み合わせに対して「手を開いた状態」とか「手を閉じた状態」といった名前をつけることができます. そして,それを時間軸に並べることで「手を振る動作」とか「物を掴む動作」などの命令を作ることができます. そのうち,「歩く」「走る」などの命令に発展するはずです.


このような置き換え作業をする時に,大きく2つのやり方があります. 一度に,全ての命令を置き換えて,置き換えた結果の機械語を用意して,それを実行する方法(コンパイラ方式)と,順番に命令を取ってきて,それに対応する動作をその都度実行する方法(インタプリタ方式)があります.


これは,外国語の翻訳作業をイメージするとわかりやすいのですが,外国語の文章を一気に日本語に翻訳し,落ち着いて日本語で読む方式(コンパイル方式)と,一文ずつ外国語を取ってきてそれを日本語に訳して理解する方式(インタプリタ方式)に対応します.


長所・短所も,まさに翻訳作業と同様です. コンパイラ方式は翻訳し終えるまでに時間がかかる代わりに,一度翻訳すればあとはすらすらと読むことができます(翻訳には時間がかかるが,実行速度は早い). 一方,なにか間違いがあったときに,それが元の文章のどこに対応しているのかは見つけられません(実行時にエラーで止まった場合に原因を見つけるのが難しい).

インタプリタ方式は一文ずつ翻訳するので,すぐに翻訳結果を返してくれますが,1つ1つの実行速度は遅いです(手軽に実行できるけど,実行速度は遅い). 一方,翻訳作業(プログラムの実行)を手軽に中断でき,その時点での翻訳元の文章を見つけるのが簡単にできます(実行時にエラーで止まったとき,どの文で止まったかがわかる).


本講義で用いるpythonは,インタプリタ方式です.なお,2回生向けの実習「アルゴリズムとデータ構造1・演習」で用いるC言語はコンパイラ方式です.

まとめ
  • 計算機(CPU)は,機械語しか処理できない
  • それ以外のプログラミング言語は,機械語に一括翻訳(コンパイル)するか逐次翻訳(インタプリタ)して実行する.

命令:print

ex1-1.pyの中身(再掲)
oqhms("Gdkkn Vnqkc!")

解説-2

計算機に指示を出す命令のことを「関数」と言います.このprintも関数です. この関数を呼び出すと計算機は「画面に文字を表示する」という作業をします.

関数に引き渡すデータは,丸括弧の中にカンマで区切って与えます. 今回は1つしかデータがないのでカンマはありません. 引き渡すデータのことを「引数」と言います(※読み方に注意!「ひきすう」です).

ここでは,引数として「文字列」を与えています. 文字列は「」で囲った文字の並びです.

なお,計算機は「全角/半角」「大文字/小文字」をそれぞれ区別します. 別の文字コードを割り当てていますので,それらを間違えるとエラーがでます.

課題1-2

ex1-1.py に対して,次の指示に従って変更して実行してみましょう.どのようなエラーが出たかを報告して下さい.

※その都度,元に戻しましょう.動かないプログラムのまま次の指示に従っても,意味がありません.

  • 「print」を「Print」に変える.
  • 右側の「”」を全角に変える.
  • 「”」を両方全角に変える.
  • 文末に全角でスペース「 」を入れる.
課題1-3

ex1-1.py に対して,教科書p.34を参考に表示内容を変えてみましょう.改行を含む表示ができたら,それを提出して下さい

※改行は「\n」です.そのような特殊記号を表すときの「\」を「エスケープシーケンス」と呼び,「\」そのものを表示するには「\\」と二回重ねます(教科書p.35の表参照).

コメントの使い方

プログラムに影響を与えない文をコメントとして記入することができます.

記述の仕方は2通りあり,1行で完結する書き方(#)と,複数行に渡るコメントを書く方法("""もしくは'''で囲む)とがあります.

解説-3

プログラムは,動作手順を書くものですので,「何をしようとしているのか」を一目で読み解くのは難しいです. そこでコメントを利用して,「次のコードは,こういうことをしようとしている」というのを言葉で残しておきます.

他人のプログラムを読むときに,適切なコメントが入っているソースは,読みやすいです(可読性が良いです). 一方,コメントが一つもないプログラムは,「ソースを読んで理解しろ」という大変わがままなプログラムであり,読みにくいものです.

特に,たとえ自分の書いたプログラムでも,数カ月もするとその時の考えは忘れてしまい,他人のプログラムと同等になります. のちの自分のためにも,適切なコメントを入れるように工夫しましょう.

解説-4

コメントの別の利用方法を紹介します.

シングルクォートとダブルクォートのコメントアウトは,それぞれ入れ子にすることが可能です. 普通のコメントでは,そのような使い方をすることはありません.

プログラムの動作がおかしい(=自分の期待していない動作をする)とき,コードを一部削って,どこがおかしいか調べる方法があります.

このときに,コメント文をうまく利用すると,簡単に問題個所を見つけることができます.

その際に,コメントとしてシングルクォートを使っているのであればダブルクォートを,ダブルクォートを使っているのであればシングルクォートを使って,削りたいコードを囲うことで,簡単にコードを擬似的に削除することができます.

もう少し複雑なプログラムを扱うようになると,コメントアウトによるデバグの便利さが理解できるようになるはずです.

シングルクォートは日本語キーボードの場合「7」のところにあります(ダブルクォートは「2」のところ).英語キーボードでは「Enter」の左にあり,通常入力でシングルクォート,シフトキーを使うとダブルクォートになります(英語版の方がわかりやすい組み合わせになっています).

課題1-4

ex1-1.py に対して,教科書p.35を参考にコメントを加えてみましょう.

今日の目標

以下のプログラムが実行できる環境を作って下さい.

画像ファイルは,chap3-back.pngを利用して下さい.

今回は,com01-1.py と同じフォルダにchap3-back.png の画像ファイルを置いて下さい.

com01-1.pyの中身
hlonqs sjhmsdq

qnns = sjhmsdq.Sj()
qnns.shskd("計算機実習1")
qnns.lhmrhyd(539, 379)

bZmuZr = sjhmsdq.BZmuZr(af="akZbj", vhcsg = 539, gdhfgs = 379)
bZmuZr.okZbd(w = 9, x = 9)
hlf = sjhmsdq.OgnsnHlZfd(ehkd="bgZo2-aZbj.omf")
bZmuZr.bqdZsd_hlZfd(219, 139, hlZfd = hlf)

qnns.lZhmknno()

vim を使いやすくするには

日本語の混じったプログラムを作成する際に,日本語/英語の切り替えを正しくしないと,プログラムコード中に日本語が入ってしまい,コンパイルエラーが出ます.

特に,全角スペースと半角スペースは見分けがつきにくいので,それを見つけるのは大変です.

以下の内容を,各ユーザディレクトリの下の.vimrc ファイルに書き込んでおくと,全角スペースをハイライトするようになります.

(Windowsの場合は,_vimrcです)

~/.vimrc
function! JISX0208SpaceHilight()
    syntax match JISX0208Space " " display containedin=ALL
    highlight JISX0208Space term=underline ctermbg=LightCyan
endf
if has("syntax")
    syntax on
        augroup invisible
        autocmd! invisible
        autocmd BufNew,BufRead * call JISX0208SpaceHilight()
    augroup END
endif

今日の課題

上記の作業課題1-1から1-4までを,今回の課題とします.

※課題1-1は作業のみですので,内容について報告する必要はありません.

課題をメールで提出して下さい.メールの書き方は,情報基礎:メールの受信・送信を思い出して下さい.

件名は,report01.アドレスは,com02@elec.ryukoku.ac.jp です.

メールの最初に,「誰から」「誰へ」「挨拶文」を必ず書いてください.
メールを使う上でのマナーです.
※順番は「誰へ」「誰から」「挨拶文」です.

また,メールの最後に署名を入れるのを忘れないように.

メールの形式は,プレーンテキスト形式にして下さい.

リッチテキスト形式(RTF,HTML形式)はメールサーバによってはSPAM扱いで受け取らないことがあります. そのため,本講義でも,リッチテキスト形式で提出されたメールは未提出とほぼ同様の扱いにします.


次に進むには,■こちら■をクリックして下さい.