IDコールをいただいていました.正直,困惑しております.コールがあったことそのものではなく,今年度の授業で,あれでよかったのかなあと思う「順序」が,あったからです.
かいつまんで説明します.Cで反復の制御文を使って,1,4,9,16,…と,平方数を小さいものから9つ求めるプログラムを用意し,学生に打ち込ませました.中心となるのは,以下のforループです.
int i; for (i = 1; i <= 9; i++) { printf("%3d", i * i); } printf("\n");
「"%3d"」とすることで,3桁に満たない数に対しては,3文字になるよう,左に必要なだけ空白をつけて出力します.いわゆる右詰めです.
これにコードを書き足して,九九の表を出力できるようにしましょう,というのがメインの課題です.もう一つ,変数jを宣言し,2重ループにするといいですよとヒントを与え,取り組ませると,次のコードになります*1.なお,内部のかけ算は,「j * i」でもかまいません.
int i, j; for (j = 1; j <= 9; j++) { for (i = 1; i <= 9; i++) { printf("%3d", i * j); } printf("\n"); }
コードを書き足すと,上記になるのが自然ですが,新規にプログラムを作るなら,次のようになるはずです.
int i, j; for (i = 1; i <= 9; i++) { for (j = 1; j <= 9; j++) { printf("%3d", i * j); } printf("\n"); }
違いはiとjの出現順です.書き足したほうでは,jのforループが先(外側)で,iのforループが後(内側)です.
「九九の表」を求めるのであれば,同じことですが,プログラミングとして,jが先というのは違和感を持ちます.(数学の)行列における行位置・列位置の指定の慣例を思い起こしてみても,新規に書いたように,iを先(外側),jを後(内側)にしたいところです.
結局,授業ではこの課題に取り組んでもらった次の回で,「前のスライドでは,修正を最小限にするため,変数jのfor文を外側,変数iのfor文を内側に書いていますが,一般にはiを先(外側),jをその次(内側)に書きます.」と注意書きを入れました.
関連:
- 大学の数学とプログラミングで,行列を学ぼう
- 九九表生成プログラム
- 九九表生成プログラム〜かけられる数とかける数に配慮
- 九九表生成プログラムのバリエーション
- calloc
- 第12回情報教育合同研究会で,プログラミング的思考とプログラミング教育の一端に触れる
自分の経験の範囲内で,「プログラミング的思考」と「算数」とを結びつけるなら,「はかせどん」でしょうか.「速く・簡単に・正確に・どんなときも」の頭文字で「はかせどん」です.Googleで検索すれば,それなりに事例がヒットします.
ある対象に対して,解法が複数,考えられるときに,「いろいろな求め方があるね」で終わらせるのではなく,解法を比較して,より良いものを見つけよう,という意味合いが込められています.「どんなときも」は「あらゆる場合(に適用できる)」ではなく,「他の問題にも使える」と解釈されます.
検索結果の中に,当ブログの記事がありました.
算数教育にも,「かけ算の順序」の議論にも使えそうな情報は,以下のところでしょうか.
- よく聞いてみると,一理ある
という段階まで行けたら,
- 第三者検証可能な情報と,矛盾してしまうことはないだろうか
- 個別の問題にうまく対応できるのだろうか,どんな課題が待ち受けているだろうか
- どのくらいの範囲に,適用・利用できるだろうか
といった観点で,良し悪しを相対的に判断するようにしています.
書きっぱなしでないプログラミングとコードの公開,そして情報の発信をしていきたい,と思いつつも,どうやら茨の道のようです.
*1:授業では,「i * i」にしたままで,平方数が9回,繰り返して出力したりだとか,「printf("\n");」を2重ループの外に書いて,「表」になってくれない,といったことも見かけました.一つ一つ指導しました.