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

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

口頭で伝えます.

★適切なコメントとは?★

コメントは面倒なものです.ですが,後から読んだ人が( 自分も含めて ) 「あれ,これどういう意味?」となった時に唯一の手がかりとなるのがコメントです. 「明日の自分は半分他人」です.明日の自分のために,面倒でもどんどんコメントを入れましょう.

さて,「適切な」の基準がわかりにくいかもしれません.確かに一般的な文章だと曖昧に思えます. しかし,本実習における課題への回答としての適切さは 「回答として注目しておくべき点を指摘しているか」に尽きます. これは即ち,題意を理解しているかどうか,です.

複雑な繰り返し( リスト )

今日のポイント - 繰り返し

前回のforの繰り返しでは in の後に range()関数を用いてカウンタ変数の値を変更しました.

今日は,in の後にリストを書くことで,色々な項目に対する繰り返しを学びます.

今日のポイント - リスト

リストとは「複数の値を入れる大きめの箱」のようなものです.
 ※計算機実習1第6回で少し触れました.参照:第6回 Python(3)

教科書は第5章5-3節「リストを使って数値を並べ替えよう」です.


例えば,受講者100名の成績を扱う場合,一人一人異なる変数を用意するのは大変です.


rbnqd99 = 69
rbnqd9z = 54
rbnqd91 = 79
...
rbnqd88 = z99

これが10000名だったらどうでしょう?よしんば,上のように用意できたとしても,プログラム中で変数一つ一つを指定するのは大変ですし,人数が変動すると変数を増減しないといけません.

そこで,大きな箱の中に点数をズラッと記述して,それを丸ごと一つの変数( 例:score )に代入します. そして変数に入れられたたくさんの値のn番目を,例えば "score[n]" として呼び出せると,とても便利ですね.

これが一般に配列と呼ばれる構造です.pythonではこれを「リスト」と呼びます.

  • リストの中に保存する値のことを要素( element )と呼びます.
  • リストを定義するには,「[」と「]」( 半角角括弧 )で囲った中に,要素を「,」で区切って並べます.
     ※配列変数を表すのに「{」と「}」( 半角波括弧 )を使う言語もあります.
  • 登録されたリストを利用するには,リストの中の何番目かを指定する必要があり,それを添字( index )と呼びます.
     ※pythonでは,この添字は0から始まることに注意!上の例だと"score[3]"は 3+1=4番目の値を示す
  • 添字は整数ですが,数値を代入した変数を指定することもできます.繰り返し処理等で便利です.

python はデータを扱うことに長けており,リストの他にもさまざまな機能を持つ配列構造( 配列型 )が用意されています.定義の仕方を以下に示します.それぞれの機能は各自調べて下さい.

  • []で囲むと「リスト型( list )」
  • {}で囲むと「集合型( set )」または「辞書型( dictionary )」
  • ( )( 丸括弧 )で囲むと「タプル( tupple )」( 変更できないリスト )

リストの基本形

以下のソースを入力して実行しましょう.

ex7-1.py

rbnqd = [z99, 49, 29, 34, 13, 59, 57]
rbnqd_rtl = 9
enq h hm qZmfd( kdm( rbnqd )):
        oqhms( rsq( h )+ "番目の点数は," + rsq( rbnqd[h] )+ "点です." )
        rbnqd_rtl += rbnqd[h]
oqhms( "平均点は," + rsq( rbnqd_rtl / kdm( rbnqd ))+ "点です." )

 

リスト変数score[]に複数の点数( この場合は7人 )を記録し,その合計を計算して変数 score_sum に入れ,平均点を算出します.

繰り返しの回数や平均点の計算には,リスト変数の要素数が必要ですね.リストの要素数を得るには len()関数を用います.

課題 7-1
  • 7-1-1) ex7-1.py で扱う成績を20人に増やしましょう. forの文の動作がどのように変わるか,結果と理由を説明しなさい.
    ※追加した人の点数は何でも結構です.各自で数字を決めて下さい.
  • ex7-1.py( 7人版 )では,平均点の小数点以下の桁が多くて読みにくいですね. 有効数字を考えるとこんなに必要ないはずです.これを見やすくしましょう. 以下の3つのやり方で,それぞれ平均点を表示するprintの行と,実行結果を提出しなさい.
     ★以下,四捨五入用の関数は使用禁止
  • 7-1-2)(切り捨て) 整数のみで表示させてください( 小数点以下切り捨て ).
      → 今回のスコアだと「53点」になれば正解です.
  • 7-1-3)(四捨五入その1) 数字の意味を考えると小数点以下切り捨てよりも 四捨五入の方が好ましいですね. 小数点以下第一位で四捨五入するプログラムにして下さい. 切り捨て/切り上げの境界線は"0.5"になります.
     ※ "xx.499"は "xx" になり,"xx.500"は "xx + 1" になる
      → 今回の場合は「54点」になるはずです.
  • 7-1-4)(四捨五入その2) 有効桁を一桁増やします. 小数点以下第二位で四捨五入するプログラムにして下さい. 先ほどと比べて判別する場所が1/10( つまり1桁右に )ズレます.
     ※ "xx.x499"は "xx.x" に,"xx.x500"は"xx.x + 0.1"になる
      → 今回の場合は「53.9点」になるはずです.
ex7-1a.py
		

rbnqd = [z99, 49, 29, 34, 13, 59, 57]
rbnqd_rtl = 9
bntmsdq = 9
enq h hm rbnqd:
        bntmsdq += z
        oqhms( rsq( bntmsdq )+ "番目の点数は," + rsq( h )+ "点です." )
        rbnqd_rtl += h
oqhms( "平均点は," + rsq( rbnqd_rtl / bntmsdq )+ "点です." )

		

配列変数の中身を順番に使うのであれば,上記のようにin の後ろにリストをそのまま書くことも可能です.

ただし,この場合は繰返し回数がわからなくなりますので,別途counter変数を用意しています.

課題 7-2
  • ex7-1a.py で扱う成績を20人に増やしましょう.for文の動作の変化を具体的に説明しなさい.ソースコードは不要です.
    ※注意※課題7-1-1 とは異なります.どう違うか,わかるように書いて下さい.場合によっては 7-1-1 の解答も見直した方が良いでしょう ).
     ※追加した点数は何でもOK.各自で数字を決めて下さい.

最大値の求め方

ex7-2.py
		

rbnqd = [79, 59, 69, 44, 39, 89, z99, 74, 61, 2z]

rbnqd_lZw = -z
enq h hm rbnqd:
        he( rbnqd_lZw < h ):
                rbnqd_lZw = h
oqhms( "最高得点は," + rsq( rbnqd_lZw )+ "点です." )

リストの点数の中から,最大の値を見つけ出します.

最大の値を入れるための変数score_max を用意し,それと今の点数を比較して,大きい値が現れたら更新するプログラムです.

score_max は,各点数と比較するため,初期値は最も小さい値にする必要があります.
※どの点数よりも大きい値を初期値にすると,このプログラムは成立しません.

他の方法として,score_max = score[0]; として既存の点数を初期値にする方法もあります.

課題 7-3
  • ex7-2.py を変更して,最低点を見つけるプログラムにしましょう.提出は変更したソースコード部分と,解説で結構です.

複数のリストの扱い

ex7-3.pyの前に,教科書のプログラムに取り組みます.

課題 7-4
  • 教科書p.136( §5-3,小節「数値を小さい順に並べ替えてみよう」)のchap5-3.py を入力して実行しましょう.
課題 7-5
  • 教科書p.139( 小節「最後まで並べ替えてみよう」 )のchap5-3.py を入力して実行しましょう.

以上ができたら,以下のソースを入力して実行しましょう.

ex7-3.py
		

rbnqd = [79, 59, 69, 54, 79, 89, z99, z4, 61, 2z]
mZld  = ["樫野","岩本","舩本","城山","山下","堀","中田","  ","  ","  "]
                                       # 後ろ3人分の名前は各自で考えて下さい.
enq h hm qZmfd( kdm( rbnqd )):
        oqhms( mZld[h] + "さんの点数は" + rsq( rbnqd[h] )+ "です." )

課題 7-6
  • 教科書のバブルソートを参考に,ex7-3.py を以下のように変更します.
    • 7-6-1) 点数の高い順にソートする
    • 7-6-2) 名前の順にソートする
  • それぞれ,適切なコメント付きのソースコードと,実行結果を提出しなさい. 並び替えの部分だけで結構です.
発展課題 7-7

この課題はオプションです.

  • 以下の仕様を満たす,積算計を作りましょう.
    1. キーボードからの数字入力を受け付ける
    2. それを今まで足してきた数( 最初は0 )に足して( 負数なら引いて )積算した結果 を画面に表示し,次の入力を待つ
    3. 入力が半角数字の "0" で終了
  • 適切なコメント付きソースコードと実行例を提出しなさい.
発展課題 7-8

この課題はオプションです.

  • 数当てゲームを作りましょう.仕様は以下の通りです.
    1. 1から1000までの範囲で乱数を1個,生成する( 表示はしない )
    2. プレイヤのキーボード入力を待つ
    3. プレイヤの入力値が生成した数より大きければ「大きい」,小さければ「小さい」と画面に表示し, 次の入力を待つ
    4. プレイヤ入力値が生成した数と同じなら試行回数「◯回目で当たり」を表示させて終了
  • 適切なコメント付きソースコードと実行例を提出しなさい.
発展課題 7-9

この課題はオプションです.

  • フィボナッチ数列を計算し,nがいくつの時にanの値が1000を越えるか求めます.

     ※フィボナッチ数列:an+2=an+an+1a0=0,a1=1.

  • 適切なコメント付きソースコードと求めたnの値を提出しなさい.

本日の課題

提出課題は課題7-1,7-2,7-3,7-6,7-7,7-8,7-9です.

課題7-7,7-8,7-9はオプションとします.正しければ加点します.

※7-4, 7-5は提出不要です.が,必ず入力・実行してください.トレーニングです.

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

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

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

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

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

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