創造工学演習で競技部門の説明
4年の創造工学演習では、電子情報工学実験の2週を創造工学の予備実験としても 利用する。このため、実験のガイダンスの後半で、創造工学演習の説明を行う。 特に、今年のプログラミングコンテストでの競技部門について説明を行う。
通信ネタの競技部門の事例
今年のプログラミングコンテストでは、サイコロでデータ通信を行うテーマとなっている。
- 基本は、送信側は、与えられた英数字に合わせて、サイコロでデータを表現する。
- サイコロは、トレイに並べてWebカメラの前に置く。
すると、一定周期で撮影したデータを受信側で、サイコロを見ることができる。 - 受信側は、そのサイコロの並びを解析して、元の文字を取り出す。
こういったテーマであるが、その難しさを理解してもらうために、 過去のプロコンでの通信関連の競技を説明する。
ポケベルコードで勝利
送信側、受信側の2部屋があり、ネットワークでのみ情報交換が可能。 送信側は、送信側の部屋の様子についての問題の答えを、ネットワーク通信で受信側に送る。 こうなると、Skypeの様なソフトで音声通話するとか、デジカメの画像情報を、伝送するとかの作戦がとられたけど、実際のこの回の優勝チームは、 ポケベルコードだけを送るプログラムを作ったチームであった。 この頃は、携帯電話もなかったし、ポケベルで情報交換していた時代だったので、 優勝した女子チームは、ポケベルコードを素でデコードできた…
赤青緑黄のボールで通信
送信側の部屋と受信側の部屋は、2つのパイプが通っていて、 このパイプには、赤青緑黄の4色のボールを転がすことができる。 このボールを使って、簡単な文面を4色の並びに変換して送る。
ただし、パイプのボールは、何個かに1個のランダムなペースで、 ボールが抜かれる可能性がある。 簡単に考えると、4色を00/01/10/11に割りつければ、ボール1個を送るたびに、 2ビットの伝送が可能である。 しかし、途中でボールが抜かれる可能性があるので、 データ区切りの先頭を見つける必要性、通信でのデッドロックにならないルール決め、 などの必要性を説明する。 また、人間が間違えてボールを送る可能性もあるため、 間違い訂正の手段として、パリティチェック・チェックサム・CRC(巡回冗長検査)などの話をする。
プログラミング応用のガイダンス
例年通りのプログラミング応用の初回ガイダンス。 今年度は、前期の段階でネットワークの基礎の話を入れたいと計画中。 とは言いながら、授業の予定、テストの傾向、評価方法、教科書などを説明していく。
制御構文の復習
ガイダンスの残りの時間は、制御構文の復習ということで、 「文のブロック」について意識付けを行うように説明を行う。
C言語の文 式 ; { 文 [文...] } 複文と呼ぶ if ( 条 ) 文 [ else 文 ] while( 条 ) 文 do 文 while( 条 ) ; for( A ; B ; C ) 文 ; # セミコロンだけ...は、空文と呼ばれる。 その他の構文
これらの文の「ブロック」を繰り返し、分岐といった制御する命令で、 複文{} でブロックを組みながら、表現することをが、 手続きの構造化と呼ばれる。これに構造体などのデータの構造化を組合せて、 「構造化プログラミング(Structured Programming)」と呼ぶ。
手続きの構造化では、処理のブロックの範囲が分かりやすくなるように、 同じ処理レベルの物とそれを取り囲むブロックを字下げをすることで、 分かりやすく見せる。これをインデントと呼ぶ。
説明では、処理のフローチャートと合せ、処理ブロックを一塊の処理と見なしながら、 処理順序や命令の繰り返しの塊を説明する。
break , continue , switch-case
制御構文での説明で、特殊な命令として、break , continue , switch-case を説明する。
break文は、while,do-while,for,switch-case文のブロックを抜け出し、次の文に移る命令。 continue文は、while,do-while,for で、次の処理ループに移る命令。
// while の場合 while( A ) { : break ; // goto labelB ; と同じ : continue ; // Aの条件判定に飛ぶ : } labelB: // for の場合 for( A ; B ; C ) { : break ; // goto labelD ; と同じ : continue ; // Cの繰り返し更新処理に飛ぶ : } labelD:
switch(式) { case … } 文は、switchの式の値に応じて、 その値と同じ定数が書いてある case ラベルにジャンプする命令。
for( i = 0 ; i < 5 ; i++ ) { switch( i ) { case 1 : case 2 : print( "(1or2)" ; // 1,2の値の場合 break ; case 3 : print( "(3)" ) ; // 3の場合(break;が無いので4も実行) case 4 : print( "(4)" ) ; // 4の場合 break ; default: print( "(?)" ) ; // 該当の値がなければ break ; // default ラベルに飛ぶ。 } }