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

はじめに

概要

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

到達目標

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

実習方法

本実習はオンラインと対面のハイブリッドです.

対面受講者は瀬田1号館609計算機教室に来て下さい.

計算機を用いて実習を行います. python が動く計算機のOSとしては,Windows,Linux,そしてmacOSが考えられますが,BYODに関してはWindows環境を前提として実習を進めます. それ以外の環境を使う場合は、各自の責任で進めて下さい. なお,対面で実習を受けたい人は 1-609実習室に来てください.実習室の計算機( Windows/Linux )を使うことも可能です.

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

出席

出席は,responの送信と期限内のレポート提出をもって出席とみなします.

※注意※ 教員を説明をしっかり聞かずに教科書とオンラインテキストだけで課題にちゃんと答えられるとは思わないで下さい.
また,人から答えをもらってコピペするのはもってのほかです.それは自分で自分の価値を貶め,学びの機会をドブに捨てていることにほかなりません. コピペについてはコピーした方もさせた方も厳重に対応します.

課題提出の指示

課題の提出はmanaba「計算機実習2 U51Y323」のレポートを利用します.

課題の提出締切は次回の実習開始(金曜日9:15)までとします.

成績評価

原則として全出席,レポート全提出を合格の条件とします.
平常点( 30点 ),レポート点( 30点 ),最終課題点( 40点 )で評価します.
※レポート点は形式/書式,内容の両方を評価します
※期末試験は行いません

テキスト

毎回の実習内容はweb page「2025年度 電子情報通信課程 計算機実習II」 に提示されます.

 ※先読み防止のため,毎回の内容は数日前に公開されます.

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

 ※教科書の表紙がちょっとイタい感じなので,抵抗がある人はカバーを外せばおとなしい表紙になります.

素材について

ソースコードは自分の手で入力してください.手で入力することが理解に繋がるということです.

★課題プログラムで使う画像は,いらすとやさんの素材を元にした物を用意しています.それを利用して下さい.

なお,教科書のソースコードや画像ファイルは,出版社( ラトルズ )のwebページからダウンロードできます.教科書のP.VIIIにURLが載っています.コードはあくまでも「答え合わせ」として活用してください.

担当

  • 主担当:小堀 聡
  • 副担当:藤井 大輔
  • T.A. :樫野 克明,小堀研
  •    :岩本 承王智,小堀研
  •    :舩本 大士,小堀研
  •    :中田 月海,小堀研
  •    :城山 翔吾,酒田研
  •    :山下 衛紀,酒田研
  •    :堀 浩大,木村昌研

課題について

各回,複数の「課題」を用意しています.それらに取り組んだ結果をレポートとしてまとめ,manabaで提出してもらいます. 実行結果等をテキストファイルとして保存して下さい.

TAさんや教員への質問や確認は,Teams「科目_計算機実習2_電子情報通信課程」 >「10.質問受付」に書き込んで下さい.

※その際には使っている環境,エディタ,課題番号,起きている状態,エラーメッセージ 等の情報を整理して提示して下さい

なお,時間内に終わらなかった場合は宿題となりますが,締切は「次回の実習開始( 金曜 9:15 )まで」とします.

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

教科書は第1章「Pythonをはじめよう」と第2章「まずは簡単なことからやってみよう」です.

開発環境の準備( python )

計算機実習1の(重要08)WSLとUbuntu導入(Windows)にて, WSL( Windows Subsystem for Linux )上で Python3 のインストールを終えているかと思います.
本実習では,12歳からはじめる ゼロからの Pythonゲームプログラミング教室を教科書として用います. この本では,Python はバージョン3.6を,エディタとしてVisual Studio Code(VS Code)を採用し,またGUIプログラムを作るためにtkinterというモジュールを利用しています.

この本通りにやりたいのならVS Codeを使うのがよいでしょう.

しかし本実習では,pythonとtkinterが使える環境であれば,OSやエディタは何でも構いません.前期でやったように,WSLでnanoやviをエディタとして使用しても良いです.(WSL Ubuntuでもtkinterは使えます)また,jupyter notebookのような別の開発環境を利用しても良いでしょう.OSもWindows,Linux,MacOSのどれでも大丈夫です.

ただし,標準の組み合わせ以外で不都合が生じたときは,各自で調べて対処してください( TAや教員は完璧にサポートできるわけではありません ).

とは言え,新しいことに挑戦するのは素晴らしいことです.困難があればスタッフも一緒に考えていきましょう.

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

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

課題1-1

この課題は実習のみです.レポート提出は不要.

自分がわかりやすい場所に,計算機実習2用のディレクトリ「com02」を作り,そこに移動しなさい.

※今後,本実習での作業はすべて,この com02 ディレクトリで行います.

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 / GPU / NPU等)のための命令=機械語( マシン語 )=2進数です. CPUが変われば,命令の種類やその数値は異なります.
 ※例:Intelのx86系CUPとARM社のARM系CPUでは機械語が異なるので,同じバイナリープログラムは実行できない
 ※例:プレステのゲームがswitchでは使えない

機械語だけでは人間には理解が難しいので,対応する命令に置き換えたものがアセンブリ言語です.

アセンブリ言語で書かれたプログラムを,直接CPUが読める機械語に変換することを「アセンブル」といい, アセンブルするための実行プログラムを「アセンブラ」といいます.
 ※アセンブリ言語と機械語は1対1対応しているため,機械語 = アセンブリ言語として扱われることもあります.

当然,アセンブリ言語もCPU に依存しており,CPU が変わると,新しいアセンブリ言語を使う必要があります. 違うハードウェアにソフトを作り直すことを「移植( porting )」と呼びます.

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


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


このような置き換え作業をする時に,大きく2つのやり方があります.

  1. 一度に全ての命令を読み込んで全てを機械語に置き換え,実行ファイルを生成する方法 = コンパイラ方式
  2. プログラムコードから順番に命令を取ってきて,それに対応する動作を順次実行する方法 = インタプリタ方式

それぞれの長所・短所は以下の通りです.

  • コンパイラ方式は変換し終えるまでに時間がかかる代わりに,一度変換すればまとめて実行するので動作速度が速いのが特徴です
  • インタプリタ方式はプログラムコードを一文ずつ順次処理するので,間違いを見つけやすく,訂正しやすいのが特徴です.ただしその分,プログラム全体の実行速度は遅くなります.

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

※補足すると,現在はCPU/GPUの速度が上がり,インタプリタでも相当なサイズのプログラムであっても,十分に実用速度を出すことができます.また,本来インタプリタであるpythonにもコンパイラ版があり,実行速度の速い実行体を生成することができます.

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

命令:print

ex1-1.pyの中身( 再掲 )

oqhms("Gdkkn Vnqkc!")

解説-2

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

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

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

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

課題1-2

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

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

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

ex1-1.py を ex1-3.py としてコピーします.
この ex1-3.py に対して,教科書p.34( §2-2「日本語を表示してみよう」以下 )を参考に表示内容を変えてみましょう. 改行を含む表示ができたら,ex1-3.py のソースコードを提出して下さい

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

コメントの使い方

プログラムに影響を与えない文をコメントとして記入することができます. ( 教科書p.35「コメントを付けて読みやすくしよう」参照 )

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

解説-3

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

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

自分の書いたプログラムでも数日もすると忘れます.後々プログラムをメンテナンスする事を考え, 適切なコメントを入れるように工夫しましょう.

解説-4

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

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

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

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

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

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

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

課題1-4

課題1-3 で作った ex1-3.py を ex1-4.pyとしてコピーし,コメントを加え,ex1-4.py を提出して下さい.

今日の目標

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

画像ファイルは,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()

Tips: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-2 から 1-4までを,今回の課題とします.

※課題1-1は作業のみなので,報告する必要はありません.

  • 課題をmanabaのレポート欄「第1回課題」に提出して下さい.
  • 直接書き込む「オンライン入力方式」です.
  • 冒頭には「誰へ」「学籍・氏名」「挨拶一言」「要約:どの課題に答えたか」を文章として書きます.
  • 実習時間内に終わらなかった場合,締切は「次回の実習開始( 金曜 9:15 )まで」です.
     ※例:小堀先生,Y000999の電子龍之介です.お世話になります.
        第1回の課題をお送りします.よろしくお願いいたします.
  • 実習時間内に終わらなかった場合,締切は「次回の実習開始( 金曜 9:15 )まで」です.
※注意※

◎しっかり課題文を読み,「何をどう答えるべきか」を把握して下さい.

◎manaba入力画面には時間制限があります.いったんPCのエディタでテキストファイルを作成してから,それをコピーするようにしてください.その際のファイル名は自由ですがわかりやすいものを.特にプログラムのソースファイルと混同しないように注意しましょう.

◎実行画面,ソースコード,エラーメッセージ等は"----"や"====="等の境界線を入れて「ここから」「ここまで」を明確にして下さい.

◎ひとまとまりの回答の前後には空行を入れて読みやすくして下さい.びっしり書かれているとチェック/評価の際の間違いの原因になります.

◎提出前にもう一度,冷静に読み直して下さい.細かい部分でも訂正があれば手をかけて下さい.