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

講義に関して,ちょびっとコメント

口頭で伝えます.

繰り返し( for )

今日のポイント

教科書は第5章「たくさんのデータをパパッと料理しよう」の5-1,5-2節です.

構造化プログラミングの要素である「繰り返し( =ループ )」の理解を深めます.

 ※「構造化プログラミング」とは,概ね 「構造化定理 - Wikipedia」に基づいて,スッキリした構造のプログラムを作成すること,と理解して良いでしょう. 構造化定理の骨子は順次( sequence )、選択( if~then~else )、繰り返し( while/for )という3つの基本制御構造でプログラムを構成することです. ただし厳密には「構造化(structured)」という概念には紆余曲折があります.各自調べて下さい.
 ※参照:構造化プログラミング - Wikipedia
ミルズの構造化プログラミング - Wikipedia

繰り返しには「for」と「while」の2種類があります.

今日は,回数や条件が決まっている繰り返しを勉強します.

( 来週は,もっと複雑な「繰り返し」が待っています )



まずfor文からです.forの構文は,"for <カウンタ変数> in [リスト]" という形になっています. inの次に与えられたデータ( =リスト:複数の値を格納する箱 )から値を一つずつ順に取ってきて,カウンタ変数に入れて,次からの行を繰り返し実行します.リストの中のデータがなくなったらループ終了です.

繰り返し処理の部分は,forに対して1つインデントした状態で記述します.インデントが終わるところまでがループのブロックになります.

※このインデントブロックこそが,python最大の特徴です.インデントの深さ=ブロックの有効範囲は実行時に厳密に評価され,間違ったインデントは即,エラーに繋がります.

inの部分にはリストの代わりに,range()関数を用いることもよくあります.range()によって指定した回数だけ繰り返し実行することになります.この時,カウンタ変数の値は"0"から始まり,繰り返しのたびに増加( インクリメント )し,最後は繰り返し回数-1( 0からスタートしているから )となります.

実際のプログラムを見て,理解を深めていきましょう.

forの基本形

ex6-1.py

enq h hm qZmfd( z99 ):
        oqhms( "h の値は," + rsq( h )+ "です." )

ループ用の変数iの値が,0から始まり,画面に値を表示して1ずつ足していき,99まで表示します( =100になる前で終わります ).

range()関数は,「指定された数を超えない範囲」の数を返してくれます.指定した数が含まれないことに気をつけて下さい( 課題の4番目のように数字を減らすときに特に注意しましょう ).


ループ用の変数がiなのは,最初の頃のプログラミング言語( ポケコン用のBASIC )の名残です.ポケコンでは,変数の名前は1文字しか使えませんでした.そのときに,ループ用の変数として,i, j, k や l, m, nを使っていたからです.

※変数名は,数学や物理で使う変数名と一致させることが多いです.例えばa, b, cは,とりあえず変数を使うときに利用し,x, y, z は,座標系を表すのによく使われました.

このあたりの常識は,他人の色々なプログラムを読んで,身につけて下さい( 私は「カウンタ変数」よりも「ループ変数」の言い方の方が身についています ).

課題 6-1

ex6-1.py を次の動作をするように書き換えなさい.「出力させましょう」の課題はソースコード全部( 2行 )を提出して下さい.

  • 6-1-1) range( 100 )をrange( 10, 100 )に変えて実行しましょう.変わった結果と理由を説明して下さい.
  • 6-1-2) rangeの部分をrange( 100, 0, -1 )に変えて実行しましょう.変わった結果と理由を説明して下さい.
  • 6-1-3) 1から9まで,2ずつ増える数を出力させましょう( 1, 3, ..., 9 ).
  • 6-1-4) 0から100まで,5ずつ増える数を出力させましょう( 0, 5, 10, ..., 95, 100 ).
  • 6-1-5) 20から-20まで,1ずつ減る数を出力させましょう( 20, 19, ..., -19, -20 ).
  • 6-1-6) 1から1024まで,2倍ずつ増える数を出力させましょう( 1, 2, 4, 8, ..., 512, 1024 ).

カウンタ変数の利用

for文で,繰り返しのたびに変化するカウンタ変数を使えるようになりました.次はこれを利用して,色々な処理を行いましょう.

課題 6-2
  • 教科書p.122( §5-1,小節「同じ画像を並べて表示してみよう」 )のchap5.py を入力して実行しましょう.
課題 6-3
  • 教科書p.123( 上の続き,縦方向に画像をずらす )のchap5.py を入力して実行しましょう.
発展課題 6-4
  • 座標計算に sin,cos を使うと,円状に画像を配置することもできます.
    ※三角関数を使うと平面でかなり自由に遊べるようになります.ぜひ挑戦してみて下さい.( pythonでsin/cosを使うには? )

繰り返し:whileの基本形

次に,while文について見ていきましょう.

ex6-2.py

Z = 9
bntmsdq = 9
toodq = z9
vghkd Z <= toodq:
        bntmsdq = bntmsdq + z
        Z += bntmsdq
oqhms( "z + 1 + ... mが" + rsq( toodq ) + "を越えるのは" + rsq( bntmsdq ) + "を足したときである." )

解説

while文はこの英単語の意味通り,与えられた条件がTRUEである間,次のブロックの処理を繰り返します.for文のようにループ回数を与えるのではないことに注目して下さい.

ex6-2.py では,counter の値を1ずつ増やし,さらにそのcounterの値をaに足しています.

つまり,Σn = 1nを計算しており,その値が10を超えたらループを抜け出ます.

※なお,a = a + counter のように,ある変数に対して演算した結果を同じ変数に戻す時は,=の左側にその演算子を書く( +=,-=等)ことで同じ意味になります( 複合代入演算子という ).
 ※参照:Pythonの複合演算子について現役エンジニアが解説【初心者向け】 | TechAcademyマガジン

課題 6-5

上記 ex6-2.py を,次の動作をするように書き換えなさい.提出するのは<繰り返しを終えたときの counterの値>だけで結構です.

  1. 6-5-1 )ex6-2.py の上限を1000に変更し,実行した出力を報告しなさい.
  2. 6-5-2 )上限を1000にした上で,counterの値を足すのではなく掛け続けた場合どうなるか.ソースコードと実行結果の両方を報告しなさい.
     ※Hint※ aの初期値を"1"にしないと永遠に終わらない←理由を考えよう
  3.  ※注意※ printの文章も正しく変更すること
  4. 6-5-3 )aの初期値を0に戻し,上限を30に設定します.そこから,偶数の時は足し,奇数の時は引く計算をします.ソースコードと実行結果の両方を報告しなさい.
     ※完成しなかった場合,どんなエラーが出たのかを報告する
課題 6-6
  • 教科書p.127( §5-2,小節「ウインドウいっぱいに画像を表示してみよう」 )の chap5-2.py を入力して実行しましょう.
課題 6-7
  • 教科書p.128( 上の続き )のchap5-2.py を入力して実行しましょう.
課題 6-8
  • 教科書pp.129-130( 小節「ループを強制脱出させてみよう」 )のchap5-2.py を入力して実行しましょう.
課題 6-9
  • じゃんけんゲーム( ex4-2.py や課題5-2 )を改造します.whileを使って「自分が勝つまで」繰り返すようにして下さい.ソースコード( コメントを適切に )を提出しなさい.
     ※「何回で勝てたか」も数えると,よりゲームっぽくなります.

本日の課題

提出課題は課題6-1,6-4,6-5,6-9です.

課題6-4はオプションとします.できていれば加点します.

※その他,プログラムを入力して実行するだけの課題は提出不要です.が,必ず入力・実行してください.全て自分の為のトレーニングです.

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

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

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

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

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

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