Cで学ぶ プログラミングの基礎 (2003年共立出版:宇野毅明著)
2003年度 授業記録
・ 共立出版から出版された「Cで学ぶ プログラミングの基礎」を使って宇野毅明が2003年度に行った授業の記録です。
(授業名:東京海洋大学・プログラミング演習)
■■■ 第1回:予習・イントロダクション ■■■
・ 今回は授業の進め方の説明と、プログラムの基礎概念の解説。コンピュータは使用しない。
・ 各回の授業の進め方は、基本的なことがら、例題を打ち込み実行、追加の解説をして、演習問題を解く、という方式。授業の採点は出席点とレポート。満点は150点くらいにするので、普通にやっていれば早々単位を落とすことはないよ、と伝える。再履修で出席できない人は、レポートのみで150点満点として採点した。
・ 黒板を使って、コンピュータの基本的な仕組みと、プログラムの基礎的な概念を説明。黒板に大きく四角を2つ書く。片方がCPUで片方がメモリ。「世のコンピュータは、すべてこれが基本。メモリの読み書き+計算、条件分岐しかできない」。携帯や洗濯機を例に挙げ、「ボタンを押したり、電話がかかったりすると、メモリの一部の値が変わる、と説明。(実際はIOポートだが、ごまかす)。CPUはそれを見て計算をし、メモリに情報を数値に変えて書く。そうすると、処理をする機械がそこを読み、必要な処理(ベルを鳴らす、洗濯機を回す)などをする。」
・ プログラムの基礎概念も説明。黒板に四角を書き、「プログラムはこういう指令書。コンピュータはこれを見て、書いてあることを順番に正確に実行する」。指令書の例として、インスタントラーメンの作り方、領収書の合計の出し方を出す。「人間はおりこうだから、簡単に言っただけで勝手に理解するけど、コンピュータには細かいところまで正確に順序だてて説明しなければならない。だからプログラムは人間には理解しにくいものになる。」
・ 続いて、プログラムの作り方と実行のしかたを解説
1. エディタでプログラムを打ち込む
2. 保存する
3. コンパイルする
4. 実行する
・ この際に、「コンパイル」「実行」の概念を教える。「Cはプログラムを書くための言葉のようなもの。ある程度人間にわかりやすいプログラムを作れるようになっている。これをコンピュータ語に翻訳する作業がコンパイル。」
・ 最後に宿題。「例題1-1を打ち込み、コンパイルし、実行すること」。この宿題のおかげで、次回の授業で「コンパイルって何ですか」「例題をどうすればいいんですか」と、とんちんかんなことを言う人は格段に減る。
■■■ 第2回:1章と2章前半、プログラムの実行とprintf の使い方 ■■■
・ 今回は何よりも、授業の進め方に慣れるのが目的。コンパイルや実行の仕方をもう一度教え、さらに、教科書の見方、どこに何が書いてあるかも解説。
・ 続いて、例題を打ち込み、動かす練習(先週の宿題でだいぶできてるはず)。打ち込みと実行ができたら、続いて、例題1-1を使って練習。基本的に、いじくればできる問題なので、いかに楽しくいじってもらうか、が勝負。文字で絵を書く例題は、みなさん意外とがんばってくれる。
・ 教室内を見回って、うまくコンパイルできてない人などを助ける。典型的な失敗例は「こうなった人はここを注意して」「こういうエラーが出たらこうするんだよ」と全員に言う。
・ エラーメッセージの読み方を解説。「エラーには、間違いのある行数が書いてあるから、意味は分からなくても、どこでエラーが出たのかは確認できるようになろう。」
・ プログラムを画面に書き、1つずつ命令が実行され、画面に文字が書かれていく様子を順々に黒板に書く。「こういう風に、上から順番に命令が実行されるんだよ。」
・ 時間が余ったので、2章に突入。計算のさせ方と結果の表示の仕方を勉強。
・ printfの使い方を説明する。%d は「おまじない」とした。
・ 10億以上の値をint に代入して「変な数が表示されます」という人が出てきた。実は、扱える数に限界があるんだ、と説明。
・ 高校のときから部活でプログラミングをしていて、Cをばっちり知っている学生がいた。練習問題、みな簡単だと言うので、「10章のところは難しいと思うよ」と再帰呼び出しと組合せ計算をやらせてみた。
■■■ 第3回:2章後半、変数の使い方 ■■■
・ 今回は、変数の使い方、変数の値の表示の仕方を学ぶ。「変数の仕組み」の解説をメインにする。整数変数と小数変数の使い方も説明し、「変数には型がある」という概念も教えるが、小数の例題は極力出さないようにしてある。「覚えなきゃいけないことは、なるべく少なくしたい」ので、「double型の使い方を覚える必要がない」ようにするため。
・ 黒板に、簡単なプログラムとメモリを表す四角を書き、
「変数が宣言されるとコンピュータはその変数用の記録場所を確保する」
「変数への代入があると、コンピュータは数値/計算結果をそこに書き込む」
「変数の値が参照されると、コンピュータはそこの値を読む」
ということを説明。最初は、代入・参照という言葉を使わず、「値を場所に記録/しまう」というような言葉を使うので、多少まどろっこしいが、このほうがわかってもらえるようだ。
・ 実際に変数を使ったプログラムを体験するため、例題2-1,2-2をやり、「例題を使って練習」もする。
・ 最後に、例題2-4の通りに3択クイズを出す。正解発表後、黒板でプログラムの動きに伴う変数の値の変化を説明。「例題2-4を使って練習」での問題についても、変数がどのように変化するかを、プログラムを追いながら解説。これくらいしっかりやると、理解度は上がるようだ。
・ 早く終わってしまった上級者向けに、「3の10乗を、*を4個だけ使ってやろう」という問題を出した。正解は
x=3*3;
y=x*x;
printf ("%d\n", y*y*x);
知識は要らないけど、頭はひねらなきゃいけない、パズル問題。
・ 教科書があるということは、思いもよらず効果があるようだ。去年よりも、テキストを見たり、プログラムを打ち込んだりする学生が多い。感覚的だが、倍ぐらいの学生がテキストを見ている気がする。「プリントが教科書になった」というだけで、学生の勉強の進み方がアップしたように思う。世の大学教授が一生懸命教科書を書いているわけがよくわかった。
■■■ 第4回:3章と4章前半、scanf と if の使い方 ■■■
・ 今回は、キーボードからの入力の仕方、つまり scanf の説明。命令の機能の説明はないので、さほど真剣な説明は不要なのだが、「キーボードからどうやって数を入れるのかわからない」「キーボードからの入力を待つ間、実行が止まっている」という点にひっかかることもあるので、注意した。
・ まずscanf の基礎的な使い方、整数変数xに数値を代入する方法のみ説明する。
・ 続いて例題3-1を打ち込み、実行させる。キーボードから数を入力する、というところがどのようにやるものなのかわからず、戸惑う人が多い。「プログラムを実行した窓で、キーボードから数値を入力するんだよ。で、入力したらEnterキーを押す」
・ すぐにはうまく実行できない人が多いので、さっさとできた人に課題を出す。「例題3-1を使って練習」をして、それもできた人は、「数値を3つ入力して、その合計を表示するプログラムを作ってみましょう。今まで習ったことだけ使ってできるので、どう組合せて作るか、じっくり考えましょう」
・ 実行して数値を入力できるようになったら、プログラムの動きを解説。「実行すると、実行した窓でカーソルが点滅します。これはコンピュータが、数値が入力されるのを待っている状態です。コンピュータはscanfを実行すると、「入力された数値を変数にしまわなきゃ」と思って、入力を待ちます。そこで、例えば10を打ち込むと、コンピュータは、入力された10を変数10に代入します(黒板に書いてあるxのマスに10を書く)。これで、10が記録されました。そして、次の行でxの値を表示すると、10が表示されるのです。」
・ 続いて、2つの数を一度に入力する方法、小数を入力する方法を解説。続いて、例題3-1を使った練習の解答を解説。数値を3つ入力する問題は、scanf を3つ使う方法を紹介。その際に、
scanf ("%d",&x);
scanf ("%d",&x);
scanf ("%d",&x);
こういうプログラムを書いて、これじゃ何が悪いのか?と質問。黒板にx の値の移り変わりを書き、
同じところに入力した値が上書きされてしまうので、それでは狙ったとおりのプログラムが作れない、ということを説明する。
・ これで3章はおしまい。時間があるので続いて4章に入る。「数を入力して、1だったら "Yes" と表示する」というプログラムを作ろう。今まで勉強したことでやろうとすると、何が問題か、考えよう。「数を入力する」と「"Yes"を表示する」というところはできるよね。でも、「1だったら」がうまくいかないでしょ。これをやるための命令が if です、という導入で始めた。
・ 黒板に
scanf("%d",&x);
(間を1行空ける)
printf("%d",x);
(間を1行空ける)
と書いて、「この2つはできるでしょ。あとは、1だったらという部分をifという命令でやります。」
if ( x==1 ){ を2行目に、
} を4行目に追加。
「if は、() の中の式が成り立つなら、続く { } の中の命令を実行する命令だよ」と説明。「これにmain()とか#includeの行を追加して動くプログラムにして下さい。」と練習問題をさせる。
・ エラーが出る人が多いので、エラーの解説。「コンパイルしたときに undeclared ほにゃらら、とエラーが出る人は、変数の宣言を忘れてるよ」、「paren ほにゃらら、と出る人は、かっこの対応が間違ってるよ」、「1以外の数を入力してもYes が出る人は、== が = になっているよ」
・ 次にelse の解説。さっきのプログラムに「1でないときは"No"と表示するようにする」という機能を付けましょう。そのため、最後の行に printf("No\n"); を1行をつけます。さて、これでどこが悪いでしょうか?と質問する。実際に1を入力した場合、1以外を入力した場合のアルゴリズムの動きを追った。
・ 今年の授業は、「これでなんでいけないのか?」「なんでこうなるのか」という質問をたくさんするようにした。考える機会を増やしたいと考えてのこと。
■■■ 第5回:ドリル1、自習 ■■■
・ ぼくが出張のため、自習。学生さんには、授業時間に演習室に来てもらって、ドリル1と3章の章末演習問題をしてもらう。
・ TAの学生さんに出席を取ってもらった。前回の授業で、「何で出席取るかと言うと、出席点がたくさんあったほうが、単位取りやすいでしょ」と説明したら、納得したようだ。
■■■ 第6回: 4章後半、if の使い方 ■■■
・ 前回では簡単にしか if の説明をしていないので、今回の最初でもう一度詳しく説明。
・ 先週まできっちりとやっていたせいか、飲み込みはそこそこ良い。if の入れ子、&& や || の解説もするが、それほど難解ではないようだ。if は基本の分岐のしかただけ理解すれば十分なので、次に進む。
・ 基本が理解できていれば、後は慣れの問題なので、練習問題をさせる。
・ 最後に、残りの時間を使って、5章、ループの基本のところだけ説明した。
■■■ 第7回:ドリル1の続き、自習 ■■■
・ またぼくが出張のため、自習。TAの学生さんに出席を取ってもらう。
・ 先週のドリルの続き、及び、「複雑なプログラムを少しずつ組み立てて作る練習」の部分をやる。だいたいの人が、なんだかんだと言いながらも、半分くらいまでは組めて、全体の半分の学生が、最後のところまで到達できたようだ。
■■■ 第8回: 5章前半、ループ ■■■
・ 今回は ループの説明。今まで教えてきた、「プログラムは上から順に命令を実行される」という大前提がくずれるので、しっかりと解説する。
・ まずは、while を使った無限ループの解説。黒板にプログラムを書き、「こういう順で実行されるのだ」ということを1行1行どのように実行されるかを含めて解説。
・ 学生の様子を見ると、ぼくの話はぜんぜん聞かず、どかどか例題や問題を打ち込んでいる人がけっこういる。ペースがゆっくりなので、さっさと先に進みたいのだろう。しかし、まだ分かってないような顔をしている人もいる。(当然、何も聞いていないで遊んでいる学生もいる)
・ 次に、「条件が成り立っている間だけ実行するループ」の説明。いわゆる普通のwhile ループ。まずは簡単な例として、例題5-3を解説。
・ その後、「入力した数の回数だけ"***" を表示する」というプログラムを作らせる。ここは取りこぼしたくないところなので、今日はこの問題ができるまで取り組む。
・ プログラムの基本設計をできない学生が多い。今まで習った命令を考えなしに組合わせているように見える。この辺、「知識はあるが応用力はない」という現代の学生の特質を見た気がする。
・ できない学生に向け、まず、基本の設計を説明する。まず、(1)繰り返す数を入力し、(2)その回数だけ繰り返すループを作る、という構造を説明。まずはここが納得できるよう、考えよう、と解説。while ループの中にscanf を入れてしまっている人には、「こういう構造になっているはずだから、ループの中にscanf が入っているのはおかしいでしょ」と説明する。
・ 次に、このプログラムに必要な変数の説明。(1)入力した、繰り返す数を記録する変数、と(2) ループの繰り返し回数を記録する変数、の2つが必要であることを説明。
・ 最後に正解。ここまでにかけた時間は1時間弱。正解を言うときには、98%の学生がプログラム完成まで到達した。一人の学生は、「初めて分かった気がする。感動」と言っていた。しかし、できる人には退屈な授業だったと思う。
■■■ 第9回:5章中盤、ループの続き ■■■
・ だいたい毎年、ループのところで半数が脱落する。この授業は必修であるし、取りこぼしを出さないために、ここは非常にゆっくり、丁寧に行う。
・ まず、do 〜 whileとfor ループの説明。どちらも while が理解できればおまけのようなものなので、簡単に流す。
・ 続いて、「例題5-8を使って練習」をやる。案の定、(5)でみなつっかえるので、ここを重点的に行う。例題5-4をベースにすればできるので、その旨を伝える。
・ それでもできない人が多いので、まずは基本の設計の仕方を説明。「(1) 0が入力されるまで繰り返すループを作ろう。(2) で、その中に、何回繰り返したかをカウントする機能と、繰り返し回数が10を超えたら終了する仕組みを入れよう。だから、ループを2つ書いている人は、おかしいはず。2重ループを作りたいわけではないでしょ。」
・ さっさとできた人は、後にある例題やその問題、および章末演習問題をやってもらう。
・ それでも難しいので、問題を簡単にする。「数を入力し、その数を表示し、続いてループの繰り返し回数(今までに何回入力したか)を表示する、という作業を、0が入力されるまで繰り返す」というプログラムを作る問題にした。
・ 例題5-8 を打ち込んだまま、画面とにらめっこして固まっている学生が何人もいる。頭が回っていないようなので、「ともかくまず5-4を打ち込んで、易しいほうの問題からトライしよう」と指示。
・ 続いて、例題5-4のこの部分に、「繰り返し回数を1増やす」「繰り返し回数を表示する」という2つの命令を入れればいいんだよ、と解説。黒板にループの命令を書き、「繰り返し回数を1増やす」「繰り返し回数を表示する」の命令を日本語で書く。そして、「あとは、この日本語の部分をプログラムに直そうね。」
・ 最後に正解を解説。どうにかこうにか、95%の人がここまでたどり着いたようだ。5-8にかけた時間は1時間。じっくりやれば、けっきょくは最後まで到達できるようにはなっているが、それがちゃんと応用力となって身についているかどうか、ちょっと不安。
■■■ 第10回:5章後半、ループの続きの続き ■■■
・ 今日は引き続きループ。残っているのは、2重ループの作り方と break について。両方とも、ループ自体に比べれば(初歩としては)重要ではないので、多少流した解説を行う。
・ 例題5-8、5-9を打ち込んでもらい、それぞれ「例題を使って練習」をしてもらう。今回は、前回みたいに「取りこぼしを少なく」は狙わない。その代わり、練習問題を説いている間に、自分で、オリジナルおまけプログラムを作成した。この狙いは、「2重ループを使うと楽しいことができるんだよ」ということを知ってもらう。
・ おまけプログラムの内容は掛け算の九九の表の表示。練習問題と同じだが、より高度な表示を、いろいろなバリエーションで行った。バリエーションは以下の通り。
− 表の上と左に、「かける数」と「かけられる数」を表示する。
−1桁の数の左に1つ空白を表示して、各列がずれないようにする。
− 枠線を表示して、表を見やすくする。
全部行うと、このような表になる。(等幅フォントで見てください)
*| 1 2 3 4 | 5 6 7 8 9 |
-+-------------+----------------+
1| 1 2 3 4 | 5 6 7 8 9 |
2| 2 4 6 8 | 10 12 14 16 18 |
3| 3 6 9 12 | 15 18 21 24 27 |
4| 4 8 12 16 | 20 24 28 32 36 |
5| 5 10 15 20 | 25 30 35 40 45 |
-+-------------+----------------+
......
・ 学生さんたちにコンピュータの画面を見せながら、「こんどはこういう風にしてみよう」と言って、プログラムを改良していった。どういう改良をしているのか、理解はできていないと思うし、説明しようと思ったら時間もかかるしテンポも悪くなる。ここは見せる事だけに専念した。そのかいあってか、それなりに面白がってもらえたようだ。
・ 時間があまったので、次の章に入る。次の章はカウンタやフラグなど補助変数の章。ちなみに補助変数と言うのは僕の考えた言葉。たぶんプログラムの用語集などにはないと思う。しかし、プログラム言語教育では必要な概念だし、あると便利な言葉なので、導入した。この言葉がないと、変数のより高度な使い方を直接的な説明は難しいと思う。
・ 「数を入力する」を繰り返すループを作る、そして、入力した数が前回入力したのものと同じだったら終了する、というプログラムを例にして解説。
・ まずは、「さてどうしよう」考えてもらう。およそ3分。ときどき、「ループ終了の条件を設定しなきゃいけないんだよね」「前回のと比較しなきゃならないよね、何と比較する?」など、ヒントっぽい解説を加えつつ考えてもらう。
・ そしてプログラムを書き、解説。入力した数と前回入力した数が、変数・補助変数にどのように代入され、どのように値が変わっていくかを解説。前回の値を保存する仕組みを理解してもらうのが目的。繰り返し言葉を変えて説明。
・ 例題を使った練習問題をしてもらう。しかし、やはり難しいようだ。でも、2割くらいの学生は理解したようだ。残りは徐々に理解してもらうつもり。
■■■ 第11回:6章、カウンタとフラグ ■■■
・ 今日はカウンタとフラグの話をする予定。しかし、風邪を引いてしまい、頭がとても痛かったため、迫力のない授業になった。
・ まず、「今日は新しい知識はなし。今までに学んだことをどうやって活用するか、応用力を鍛える授業」と説明。つまりは変数の上手な使い方。
・ カウンタ、フラグを、例題を使って説明。まずは、「こういうプログラムを作るためには、どのような仕組みにすればいいか(つまりは、ループをまわして10以下の数を記録すること)」「そのためにはどういう変数を用意すればいいか(カウンタを用意して、10以下が入力されるたびに1つ大きくすればいいこと)」と、プログラム作りの動機と仕組みをじっくりと解説する。
・ 続いて、プログラムを黒板で説明。その後、実際に実行すると、値がどのように変わるかを、やはりじっくりと説明。ここでの、変数の値の変化の仕組みが分かれば、なぜ補助変数を使っているかが分かると思う。
・ そして練習問題。今回の内容は「自分で補助変数の使い方を理解すること」がとても重要なので、みっちりやってもらう。が、できない人も多い。こんな変数を使うよ、とかここにscanfがあるのはおかしいんじゃない、と正解は言わず、間違いをちょっとずつ直して、あくまでも自分で見つける感覚を大事にする。
・ 息抜きに、おまけプログラム「雪降る夜」を作った。1行の、ランダムな位置に"*"を表示(空白をランダムな個数表示した後に"*"を表示する)して改行、を繰り返すもの。適当に~ループをまわしてゆっくりにすると、下から上に雪が降っているように見える。
■■■ 第12回:7章、サブルーチン ■■■
・ 今回はサブルーチンの説明。ここで初めて、命令を実行する順序が複雑になる。つまり、プログラムの他の場所にジャンプして、そこの命令を実行して、帰ってくる、ということがおこる。そのため、今回は「プログラムの途中で、他の場所にジャンプする」という概念をみっちり説明する。
・ 今回は、例題、応用の問題はあまり力を入れない。黒板にプログラムを書き、「サブルーチン、メインルーチンはこういう順で実行される」ということを、矢印を書き込んだりして丁寧に説明。この説明が今日のメイン。
・ その後、引数と返り値の説明。これは、教科書の図を利用した。引数・返り値の受け渡しのされ方を図示したもの。黒板には簡単なものを書き、学生さんたちには教科書を見てもらう。黒板の図に値を書き込んで解説をする。後で分からなくなったときに、図を見て思い出せるようにするのが狙い。
・ 今回は練習問題を繰り返して感覚をつかむよりも、話と図の理解が大切。なので、練習問題はあまりせず、説明と図解を中心にした。
■■■ 第13回:9章、配列 ■■■
・ 今日は配列の使い方を勉強。
・ まず、配列の概念から。たくさんの数値を記録したい場合、必要な数だけの変数を用意するのは、宣言や代入を書くだけでも大変。記録する数値の数が変わるたびに、プログラムを書き換えるのは大変。たくさんの変数を機械的に扱える方法があると便利、と説明。
・ そのために用意されているのが配列です。配列は、変数の後に添え字をつけて、何番目の変数、というように数で指示できるため、添え字の数だけ多くの変数を使える。
・ 添え字には変数や計算式も使えるので、for ループなどで添え字を変化させると、たくさんの変数をループを使って簡単に扱える。
・ 黒板に配列の絵を書き、宣言を行うと指定した数だけ配列の変数がメモリに準備されること、添え字で指定した場所の変数に代入/を参照することを説明。続いて例題を使って練習を行う。
・ 配列は、ループなどと組合せて、機械的に全てに代入などを行う操作が直感的に難しい。その点に注意して、例題の解説をした。
・ 難しい割には、一度きっかけがあれば理解度は高くなるようだ。
■■■ 第14回:10章、再帰呼出し ■■■
・ 今回は再帰呼び出しの説明。再帰呼出しは、自分で自分を呼出す、ということを直感的に理解するのが難しい。そのため、再帰呼出しとは何なのか、説明した後、再帰呼出しの例題プログラムの動きを、ひたすら丁寧に説明。
・ 絵での説明では、黒板に、「サブルーチン」「サブルーチンか呼ばれたサブルーチン」...を四角(プログラムを表す)で書く。「各四角がサブルーチンだよ、サブルーチンから呼ばれたサブルーチンは、分かりやすいように別の四角で書くよ」と説明。四角の中に再帰呼出しに関する命令だけ書き込む。
・ メインルーチンの四角を上から下になぞり「こういう順で実行して」。サブルーチン呼び出しのところまで来たら「サブルーチンを呼び出すのでこちらに移動」とサブルーチンの四角に移動する。そして同じことを行い、次のサブルーチンに移動。「このようにして、ループ命令と同じように繰り返しができるんだよ」と説明。ここで、例題を打ち込んで実行してもらい、動かさせてみる。
・ 続いて終了条件が付いた場合の説明。先ほどの各四角に終了条件の命令と、受け取る変数の値を書く。「これが成り立たない場合は再帰呼び出しをしないのだ」と説明。同じように四角をなぞって動きを解説する。その後、練習をさせる。
・ そして、再帰呼び出しを2回行うようにする。そうすると、「各レベルを2回ずつ実行する、組合せ的な計算ができるよ」と、これも動きを説明。
・ その後で、1円10円100円の3つを使ってできる金額を全て計算するプログラムを解説する。これも、変数の変化、プログラムの動きを四角をなぞり、値を記入して丁寧に行う。
・ 最後に、例題を使って練習をさせる。暇な人のために占いプログラムを作った。日付をランダムシードにして、乱数を使い、占い文を表示する簡単なもの。こういうプログラム、うける人には楽しんでもらえる。
・ 理解度はやはり低いようだ。再帰の概念は難しい。しかし、3割程度の学生は理解できていたように思う。去年は1割くらい、と見えたので、それよりはだいぶよくなった。
■■■ 第15回:11章、文字列の操作 ■■■
・ 今日は文字型変数と文字列の説明。文字変数の説明は、通常の変数の説明をしっかりしてあるので、「文字が1文字記録されるよ」ということのみを説明。文字列は、文字変数の配列を使うこと、0文字目から順に入り、最後の文字の次に終了文字が入ることを説明。比較的簡単に説明ができる。
・ すでに変数も配列も学んでいるので、今回は「文字を数字や配列して扱うこと」と「文字列を配列に格納すること」の2点を、プログラムを組んで実感することを目標にする。これを授業の前半で行う。
・ 授業の後半は、配列をいじって文字列の操作をするプログラムを作る。文字列の結合などの良くある普通の操作は面白くないし、学ぶ機会もいくらでもあるので、例題や演習問題にあるような、多少トリッキーな問題に取り組む。変数や代入の仕方を上手に組み立てられないとできない。
・ テクニカルな課題なので、解説をしっかり行う。黒板にプログラムの重要な部分と配列の絵を描き、配列に文字列を代入していく様子を図解する。変数の変化に伴い、代入のされる場所が変わっていくところを直感的に説明。
■■■ レポートと授業の感想 ■■■
・ レポートは、2問のうち1つを選んで回答、というものを3つ用意した。問題によって得意不得意があると思われるので、不本意な取りこぼしが発生しないように、という配慮。また、プログラムをどのような発想に基づいて作成したか、解説を付けさせるようにした。
・ 各セットは、scanf とif に関する問題、2重などのループに関する問題、再帰呼び出しに関する問題からなっている。2つの問題の難度がなるべく同じになるようにした。
・ レポートは、授業に出席していた人間のほぼ全員が提出。問題が簡単であったということもあり、正答率は高く、80%程度。これまでの年度(ほぼ同じ程度のレベルの問題を出題した)に比べて高くなっていると思う。再帰呼び出しのところに関しては、難しかったようで、正解者は少ないが、それでも昨年よりは格段に理解度があがっていた。
・ 授業の感想は、大別して2つ。「丁寧にやってもらえたので、わかりやすかった。授業についていけた。」というものと、「ペースが遅すぎ。もっと高度なことを学びたかった」というもの。今年度は、授業の受け手を「学習ペースの遅い人」と想定して、授業の進行を組み立てたが、良い面と悪い面がある。ペースの遅い人を取りこぼさずに、かつペースの速い人には高度なことを教えられるよう、工夫が必要だ。