問題の分割と関数設計
<目次>
今回の主題と達成目標
例題
関数設計してみよう。
授業中の設計例
今回の主題と達成目標
シラバスの達成目標
の6「プログラミングの概念と
設計方法
を理解し,
KISS原則
を意識した構造化プログラミング(100行程度)を実践することができる。(小作品制作)」
問い: システムの仕様が提示された時、どのようにシステムを組み上げていけば(プログラミングしていけば)良いだろうか?
A1: KISS原則に則った開発。一度に全体を実装するのではなく、問題を機能単位に分割して個別に仕上げる(KISS原則)。
A2: 機能の洗い出し。対象知識の無い人に、実装すべき作業をやってもらうにはどう伝えたら(指導したら)良いか検討することで必要な機能を洗い出す。
関連
授業4回目の「取り組み方」
(1) 問題を分割する。
分割して分かるところから手を付ける(土台を作る)
分からないところは、更に分割できないか考える
(2) 個々のサブ問題を個別に解く。
これ以上分割できない≒最小の部品なら、教科書・授業で習っているはず(該当部分を復習)
今回追加: 分割した要素を関数として設計する。(=関数名、入力、出力を検討する)
(3) それらの組み合わせ方を考える。
別の視点
シラバスの「授業内容と方法」
言語仕様を学ぶだけではなく,「実現したいことを理解し,説明できるレベルまで整理し,コンピュータが処理できる形に翻訳する」というプログラミング開発一連の流れを体験する。
いきなりコードを書くのではなく、やりたいタスクを人に説明してみる。(他人にタスクを依頼できるぐらい、やりたいことを理解する必要がある)
例題
下記の書式でオセロの対戦ログが用意されているとする。
書式
1行目: ログファイルに掲載されてる手数。
2行目以降: 1行に1手分の記録が掲載さている。例えば黒が6-5に指した場合「B 6 5」、白が4-6に指した場合「W 4 6」が記録されている。なお、「B 6 5」は「縦6、横5」とする。
ログファイルの例
下記log1.txt参照。
補足
ログファイルには記載されていないが、プレイ開始時には中央に黒と白が2個ずつ置かれているものとする。
ログファイルには「白黒どちらがどこに指したか」しか記録しておらず、白黒反転処理は自前で処理する必要がある。
プログラム目標
ログファイルを読み込み、勝敗を判定せよ。
初期配置
1
2
3
4
5
6
7
8
1
2
3
4
W
B
5
B
W
6
7
8
ログファイル1(log1.txt)
2
B 6 5
W 4 6
1
2
3
4
5
6
7
8
1
2
3
4
W
W
W
5
B
B
6
B
7
8
関数設計してみよう。
考え方の例
どんな機能が必要だろうか?
オセロを知らない人に、ログファイルからゲームを再現させるにはどうしたら良いだろうか?
授業中の設計例
白と黒の数を数える->白と黒の置いてある場所を返す
入力: ボード情報(どこに何があるのか)
list[8x8]
出力: 「Bが5-4, 5-5, 5-6にある」のようにWもやる。
{B:[][], W:[][]}
機能を列挙
機能の概要(=関数名)
機能を実現するために必要な情報源(入力)
機能を実現した結果(出力)
石の数を数える
挟まれてる石の有無判定
挟まれてる石を裏返す処理
-