わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

プログラミングと順序指導

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をその次(内側)に書きます.」と注意書きを入れました.


関連:


自分の経験の範囲内で,「プログラミング的思考」と「算数」とを結びつけるなら,「はかせどん」でしょうか.「速く・簡単に・正確に・どんなときも」の頭文字で「はかせどん」です.Googleで検索すれば,それなりに事例がヒットします.
ある対象に対して,解法が複数,考えられるときに,「いろいろな求め方があるね」で終わらせるのではなく,解法を比較して,より良いものを見つけよう,という意味合いが込められています.「どんなときも」は「あらゆる場合(に適用できる)」ではなく,「他の問題にも使える」と解釈されます.
検索結果の中に,当ブログの記事がありました.

算数教育にも,「かけ算の順序」の議論にも使えそうな情報は,以下のところでしょうか.

  • よく聞いてみると,一理ある

という段階まで行けたら,

  • 三者検証可能な情報と,矛盾してしまうことはないだろうか
  • 個別の問題にうまく対応できるのだろうか,どんな課題が待ち受けているだろうか
  • どのくらいの範囲に,適用・利用できるだろうか

といった観点で,良し悪しを相対的に判断するようにしています.

書きっぱなしでないプログラミングとコードの公開,そして情報の発信をしていきたい,と思いつつも,どうやら茨の道のようです.

*1:授業では,「i * i」にしたままで,平方数が9回,繰り返して出力したりだとか,「printf("\n");」を2重ループの外に書いて,「表」になってくれない,といったことも見かけました.一つ一つ指導しました.