5月から,木曜5限のプログラミング演習に,M1のTAが加わりました.受講者が用紙を取っている間,そのTAさんに,コードを読んでみてどうでしたかと聞いてみると,「エレガントですね」という答えが返ってきました.
テーマは「演算子と式の評価」で,課題プログラムの一つは,次のとおりです(一部変更しています).
#include <stdio.h> int main(void) { unsigned char x = 0; unsigned char b; do { printf("%3d: ", x); for (b = 1 << 7; b > 0; b >>= 1) { if (x & b) { printf("1"); } else { printf("0"); } } printf("\n"); } while (++x); return 0; }
受講生は,プログラムを打ち込み,正しく動作することを確認*1してから,所要時間を書き込みます.それが小問(1)で,他の出題も同様です.
小問(2)以降は課題により異なります.上記のコードでは,「このプログラムは何を行うか」を問いました.そうすると,「10進数を2進数に変換するプログラム」という答案がずいぶんと多く,出席簿への記入を兼ねた面談で,一人ずつ指導しました.「型」,「値」と,printfを用いた表示あるいは「表現」について,違いを理解しておきたいところです.
上のコードでは,charは8ビットであることを暗黙の了解としています.そのもとで,unsigned char型変数xの値が255のとき,++xによってxが0になることは,Cの規格で保証されています(例えば『C言語によるプログラミング―スーパーリファレンス編』p.151).
エレガントじゃないもの
複雑に思える問題に対して斬新な観点から見るなどして得られた比較的短い証明(解答)を、エレガントな証明(解答)と言うことがある。四色定理の証明は、これと対極にあるものとして若干揶揄を込めて「エレファント(象)」な証明とも言われた。5色による塗り分けが可能であることの証明が簡潔なものであるのと対照的である。
四色定理 - Wikipedia
(リリース:2013-05-22 深夜)
*1:動作確認ができるよう,xが9,99,199のときの出力(行)を,問題文に入れています.