情報教育のブーターとしてのプログラミング 情報教育論 2002.12.16
情報教育のブーターとしてのプログラミング 情報教育において「プログラミング」の学習は、「ブーターの読み込み」の過程に相当する 「ブーター」とは、コンピュータが起動(ブート)する際に一番最初に読み込まれる最小限の命令群 ブーターは、その後に読み込まれる、より複雑なプログラム(ひいてはシステム全体)の基礎となる ここでは、「応用的な知識を生み出すために必要な最小限の基盤」を表す比喩
コンピュータの本質 コンピュータの本質はプログラム コンピュータのあらゆる動作はプログラムによって規定される 「コンピュータの何たるか」を理解するためには、「プログラムの何たるか」を学ばなければならない
プログラムとは プログラムは「仕事の手順」を書いたもの プログラムが書けないことを、コンピュータは実行できない 人間は手順が書けなくてもいろいろなことを実行できる 人の顔を見分ける、声を聞き分ける、字を読む
プログラムの基本構造(1) プログラムの基本は命令文の連続 命令は上から順に実行される→逐次構造 1: fd(100); 2: rt(90); 3: fd(100); .……… ………. 命令は上から順に実行される→逐次構造
プログラムの基本構造(2) 同じ命令の繰り返しをひとまとめにして記述できる →繰り返し for( i=0; i<4; i++){ 同じ命令の繰り返しをひとまとめにして記述できる →繰り返し for( i=0; i<4; i++){ fd(100); rt(90); }
プログラムの基本構造(3) あらかじめ設定した条件に応じて複数の命令を選択的に実行できる →条件分岐 if( i==2 ){ あらかじめ設定した条件に応じて複数の命令を選択的に実行できる →条件分岐 if( i==2 ){ fd(100); } else{ fd(50);
プログラムの基本構造(4) 逐次、繰り返し、条件分岐は、仕事の手順を記述する際のもっとも基本となる構造 これら三つをまとめて「制御構造」と呼ぶ
プログラムの基本構造(5) 逐次、繰り返し、条件分岐は「入り口1つ、出口1つ」の構造を持つ点で共通している 一つの構造の中に別の構造を埋め込んで(=入れ子構造)、複雑な手順を実現できる
プログラムのコメント(1) 実際にプログラムを書く場合、命令文(=コンピュータに対する指示)だけを書けば済むわけではない 命令文に加えて、コメント(=人間に対する注釈)を書くようにする コメントはコンピュータの動作にとっては不要だが、人間にとっては重要な意味を持つ
プログラムのコメント(2) コメントには目的を書く × ○ double x; // xは正の数とする double y; // xの小数部は0.5以上か? if((x - Math.floor(x)) < 0.5){ y = Math.floor(x); // xの整数部を // yとする }else if((x - Math.floor(x)) >= 0.5){ y = Math.floor(x) + 1; // xの整数部+1を // yとする } double x; // xは正の数とする double y; // xを四捨五入する(xの小数部は?) if((x - Math.floor(x)) < 0.5){ y = Math.floor(x); // (0.5未満)xの // 整数部をyとする }else if((x - Math.floor(x)) >= 0.5){ y = Math.floor(x) + 1; // (0.5以上)xの // 整数部+1をyとする }
プログラムのコメント(3) 見出しコメント ブロックコメント 行コメント /** * 家を描くプログラム * 家を描くプログラム * 作成日:00.5.3 (1bcBコース教材より) */ import Turtle; class House01 extends Turtle{ /** * 家を描く void start(){ // 屋根を描く rt(30); // 前処理(タートルの角度を調整する) int i; for(i=1; i<=3; i++){ fd(100); rt(120); // 三角形の一辺を描く } rt(60); // 後処理(タートルの角度を調整する) // 本体を描く for(i=1; i<=4; i++){ fd(100); rt(90); // 四角形の一辺を描く 見出しコメント ブロックコメント 行コメント
書法を徹底したプログラム
日本語プログラミング 日本語をベースとしたプログラミング言語が実現されることによって、従来コメントとして記述していた内容がそのままプログラムの命令文となる 岡田さんによる日本語プログラミングのレクチャー
日本語プログラミング言語「言霊」
Javaと日本語プログラム言語 例えばタートルグラフィックスで家を書くプログラムはJAVAではどうなるか?
public class House extends Turtle{ public static void main( String args[] ){ drawHouse( 100 ); //一辺の長さが100の家を描く。 } //家を描くメソッド public static void drawHouse( int length ){ drawTriangle( length ); // 一辺の長さがlength の三角形を描く。 drawRectangle( length ); //一辺の長さがlength の四角形を描く。 }
//三角形を描くメソッド public static void drawTriangle( int length ){ rt(30);//前処理として角度を調整する for( int i=0 ; i<3 ; i++ ){ //一辺を描く処理を3回繰り返す fd(length); rt(120); //一辺を描く処理 } lt(30); //後処理として角度を調整する } //四角形を描くメソッド public static void drawRectangle( int length ){ //「一辺を描く」という処理を4回繰り返す。 for( int i=0 ; i<4 ; i++ ){ rt(90); fd(length); //一辺を描く処理 } } }
Javaと日本語プログラム言語 日本語プログラミング言語「言霊」を用いると、先ほどのプログラムが日本語で記述できる
「言霊」によるプログラム メインとは{ 大きさが100の家を描く。 } 大きさが「A(整数型)」の家を描くとは{ 長さがAの三角形を描く。 長さがAの四角形を描く。 長さが「A(整数型)」の三角形を描くとは{ 30度右に曲がる。 {A歩進む。120度右に曲がる。}を3回繰り返す。 30度左に曲がる。 長さが「A(整数型)」の四角形を描くとは{ {90度右に曲がる。A歩進む。}を4回繰り返す。
言霊の特徴 手続きの表現が自由である 文法表現が理解しやすい
手続きの表現が自由 ここでは「大きさが~の家を描く」と表現したが、状況によっては違う表現の方が良いかもしれない・・・ メインとは{ 大きさが100の家を描く。 } 大きさが「A(整数型)」の家を描くとは{ 長さがAの三角形を描く。 長さがAの四角形を描く。
手続きの表現が自由 好きなように表現を変えることができる メインとは{ 大きさが100の家を描く。 } 大きさが「A(整数型)」の家を描くとは{・・・} メインとは{ 一辺の長さが100の家を描く。 } 一辺の長さが「A(整数型)」の家を描くとは{・・・}
手続きの表現が自由 メインとは{ 家を、三角形と四角形の長さを100として描く。 } 家を、三角形と四角形の長さを「A(整数型)」として描く とは{・・・} メインとは{ 家描画100。 } 家描画「A(整数型)」とは{・・・}
手続きの表現が自由 手続き名の変更 引数の順序 drawLine( 0 , 0 , 100 , 100 ); 既存のプログラム言語では、可能な表現が限られている 手続き名の変更 引数の順序 drawLine( 0 , 0 , 100 , 100 );
手続きの表現が自由 日本語プログラム言語「言霊」なら、好きな文型で表現する事ができる 座標(0,0)から座標(100,100)に線を引く。 座標(「A(整数型)」、「B(整数型)」)から 座標(「C(整数型)」、「D(整数型)」)に線を引くとは{ ・・・ }
コメントがプログラムになる 言霊はその表現力により、 Javaなどで記述していたコメントの 大部分が必要なくなる。
文法表現が理解しやすい Javaによる以下の表現がどういう意味か、わかるでしょうか? 既存のプログラム言語は、文法が難しいという問題がある if ( a%3 == 5 && b != 10 ){ ・・・ }
文法表現が理解しやすい 日本語プログラム言語「言霊」では、以下のような記述になる if ( a%3 == 5 && b != 10 ){ ・・・ } もし aを3で割った余りが5と等しい かつ bが10と等しくない ならば{ ・・・ } ※空白を入れなくても解釈できます。
文法表現が理解しやすい 既存のプログラム言語は文法が難しいと言う問題がある その為、やるべき事が分かっているのに、その処理の記述ができないという人が非常に多い。
文法表現が理解しやすい 例えば、以下の問題。 タートルグラフィックを使って以下の画像を描いて下さい。 ただし、for文とif文を使って下さい。 ヒント:繰り返し回数が奇数と偶数で場合分けをする
文法表現が理解しやすい 議論すると、この?部分が分からず困る人がたくさんいる。 public static void main( String args[] ){ for( int i=0 ; i<4 ; i++ ){ if( ){ drawSikaku( 50 ); }else{ drawSankaku( 50 ); } move( 60 ); ??????
文法表現が理解しやすい メインとは{ 繰り返し回数(整数型)を生成する。 繰り返し回数に0を代入する。 { 繰り返し回数を2で割った余りが0と等しいならば{ 長さが50の4角形を描く。 }そうでなければ{ 長さが50の3角形を描く。 } 右に60移動する。 繰り返し回数を1増やす。 }を4回繰り返す。
日本語プログラミング言語「言霊」 これにより、 Java言語の文法に悩むのではなく、 アルゴリズムを考え、作り出し、記述する事に集中できる
プログラムを学ぶもう一つの意味
何故、プログラムを学ぶか? コンピュータの本質を理解するため 論理的思考・表現能力を得るため
論理的思考能力とは? ・ 漠然としたアイデアを具体的な「目的」に 置き換える能力 ・ 「目的」を実現する為に必要なプロセスを、 ・ 漠然としたアイデアを具体的な「目的」に 置き換える能力 ・ 「目的」を実現する為に必要なプロセスを、 正確に順序だてて組み立てる能力 ・ 組み立てたプロセスを正確かつ 簡潔に記述する能力
なぜプログラムを学ぶのか 自分の考えを組み立てる能力 自分の考えを他人に伝える能力 この能力は、あらゆる所で必要になる なぜなら… に等しいからである 自分の考えを組み立てる能力 自分の考えを他人に伝える能力
なぜプログラムを学ぶのか 端的な例として… 授業中に 大地震が発生したら どうする?
なるべく多くの人命を救わなければならない! なぜプログラムを学ぶのか なるべく多くの人命を救わなければならない! 目的 ・建物内にいる人を避難場所に誘導する ・消火活動を行う ・避難場所を整備する(食料・布団・テントの確保) ・外部へ救難要請
建物内の人を迅速に避難場所に誘導するためには? なぜプログラムを学ぶのか 建物内の人を迅速に避難場所に誘導するためには? ・ 避難経路の確保する ・ 限られた通路を有効活用して誘導する ・ 人数を数人単位のグループに分割し、 グループ単位で行動する
限られた通路を有効活用して誘導する為には? なぜプログラムを学ぶのか 限られた通路を有効活用して誘導する為には?
限られた通路を有効活用して誘導する為には? なぜプログラムを学ぶのか 限られた通路を有効活用して誘導する為には?
限られた通路を有効活用して誘導する為には? なぜプログラムを学ぶのか 出口の一つが使えなかった場合、 限られた通路を有効活用して誘導する為には?
なぜプログラムを学ぶのか 避難方法 教室内でグループに分かれる。 避難はA、B、C・・・の順序で行われる。 教室内でグループに分かれる。 避難はA、B、C・・・の順序で行われる。 避難中、各グループ内ではぐれないよう注意する。 避難経路は、前ページに従う。 A B C ネットワークプログラムと 通じるものがあると思う… D E F
なぜプログラムを学ぶのか 論理的思考・表現能力があれば・・・ これを養う為の訓練なのです。 このような能力は、社会のあらゆる所で 必要になってきます 「地震が発生した際にどのように行動すれば 被害が少なくできるか」 について、 他人に伝え、議論する事が出来る
なぜプログラムを学ぶのか タートルで以下の絵が書けると言う事は 絵を書くための論理的なプロセスを 分析・創造・表現 する事ができると言う事なのです