以下のプログラムは動作はするがインデンテーションが滅茶苦茶でプログラム の構造を正しく反映していない。(そして、おそらく作成者の意図したように は動かない。)プログラムの構造を明確にするために「プログラミング」の インデンテーションの約束事(別紙)に厳密に従って(特に 5 番目のルー ルに注意)、必要に応じてブレースを挿入し、インデントしなおせ。ただし、 ブレース内の字下げは紙幅の制限のため 3 文字分とせよ。
もちろん、プログラムの意味(実行結果)が変わらないようにすること。 (つまり、作成者の(よくわからない)意図を忖度するのではなく、 コンパイラーが解釈する通りにインデントすること。)
解答は、最初の #include <stdio.h> は省略せよ。
また、解答欄のスペースの都合で、(最後は別として)空行は入れずに記入せよ。
正解は以下の通りである。
次のような誤りが多い。ほぼ、半数が以下のどちらかの誤りを犯している。 この2つはどちらもプログラムの意味が変わってしまっている。
あるいは、
上の 2 つの誤答例のようにプログラムの意味(実行結果)を変えてしまうようにブレースを入れてしまう誤答が
とても多い。C 言語の文法の理解があやふやなままと判断せざるを得ない。
if や while や for の対象となるのは、1 つの文だから、
if や while や for の対象となるのは、1 つの文だから、
if や while や for の対象となるのは、1 つの文だから、
(スペースや改行の位置は別にして、)ブレースは以下の位置に入る。
int main(void) {
int i = 0, j = 9;
while (j-- > 0) {
while (i++ < 7) {
if (i % 2 == 0) {
putchar('*'); }}}
if (j % 3 == 0) {
putchar('@'); }
else if (j % 5 == 0) {
putchar('&'); }
putchar('#');
putchar('\n');
return 0; }
教科書の p.43, p.44, p.46pp.44–49, pp.58–59pp.60–61, p.72–73pp.74–75, p.80p.82, pp.90–91p.94–95 の図を確認しておくこと。
開発チームの他の人や 3 ヵ月後の自分がソースを読んだときに、 このような勘違いが起きないよう、インデンテーションの約束事がある。 特に:
ブレース({ 〜 })の中の文は、外よりも 4(ただし、今回のテストでは 3)
字分(首尾一貫した文字数)を字下げする。
if 文, if 〜 else 文 や for 文,
while 文, do 〜 while 文などでは、
選択されたり、繰り返したりされる文が一つだけの場合も、
ブレース({〜})に囲む。
は徹底する必要がある。
なお、このようなブレースを追加しても、 コンパイルされた結果である実行可能ファイルの効率が悪くなる心配はない。
完全に正解したのは 16 名で、正解率は 18.2 % (16 / 88) だった。 ちなみに、この問題を正解した人は、15 名がオンラインテストは満点で、 あと 1 名も僅かな減点のみだった。
インデンテーションがちゃんとできない人は、 肝心のプログラムの構造がわかっていない、勘でプログラムを作っている、 と判断せざるをえない。教科書を読み返して、C 言語の文法を充分に理解しておくこと。
プログラミング言語の文法は、日本語や英語などの自然言語の文法に比べてはるかに単純である。 理解せずに勘でプログラムを書こうとするのは、時間の浪費で、今後の進歩が望めない。
次のプログラムは一つの整数値を読み込んで、 それを整数として 3 で割った値と、3.3 倍した値を表示するプログラムである。 たとえば、8 を入力すると、
整数を入力して下さい: 8↵
それを整数として 3 で割った値は 2 です。
それを 3.3 倍した値は 26.4000000 です。
と出力する。 空欄を埋めて、プログラムを完成せよ。
正解(例)とコメントは以下のとおりである。
| 番号 | 正解例 | コメント |
|---|---|---|
| (ⅰ) | int |
|
| (ⅱ) | %d |
%lf は double 型のための変換指定 |
| (ⅲ) | &m |
|
| (ⅳ) | %d |
%f は double 型のための変換指定 |
| (ⅴ) | %f |
%lf は望ましくない。 |
| (ⅵ) | 3.3 * m |
暗黙の型変換が起こるので、キャストは必要ない。 |
次のプログラムの出力を書け。
正解は、「A C 」である。
ほとんどできていたが、間違えた人は if〜else 文の意味を再確認しておくこと。
n % 12 == 0 という条件が成り立つので、else 部の
if (n % 15 == 0) { … } は評価されない。つまり D は出力されない。
以下の空欄を埋めて、 0 以上 300 未満の 3 の倍数をすべて昇順 (つまり、0, 3, 6, …, 297 の順)に出力するプログラムを完成させよ。
正解例は、「n = 0; n < 300 ; n += 3」などである。
セミコロン「;」がコンマ「,」になっている人がときどきいる。
「i = 0; i < 300; i += 3」など、変数名が違うのはもちろんダメである。
以下のプログラムは、整数の組のデータを
(i,j) という形式で出力する。
このプログラムの出力を書け。ただし、この問題の解答では、
空白は明示的に空白記号(␣)を、
改行は矢印(↵)を書くこと。
正解は以下の通りである。
(4,4)␣↵ (3,4)␣↵ (2,4)␣(2,2)␣↵ (1,4)␣(1,2)␣↵
プログラミングとは関係ないことだが、感想の中で余りにも同じ漢字の間違いが多いので気になる。 「講議」(誤)ではなくて「講義」(正)である。
繰り返しを用いて 1 から 60 までの整数 i に対して、
i の 3 倍と 5 倍を表示するプログラムを作成せよ。
ただし、i が 7 で割り切れる、または 11 で割り切れる数のときは表示せずに飛ばすこと。
以下のように、各行は「? の 3 倍は ?、5 倍は ? です。」 という形式で表示せよ。 (7, 11, …, 55, 56 は飛ばしていることに注意する。)
1 の 3 倍は 3、5 倍は 5 です。 2 の 3 倍は 6、5 倍は 10 です。 3 の 3 倍は 9、5 倍は 15 です。 4 の 3 倍は 12、5 倍は 20 です。 5 の 3 倍は 15、5 倍は 25 です。 6 の 3 倍は 18、5 倍は 30 です。 8 の 3 倍は 24、5 倍は 40 です。 9 の 3 倍は 27、5 倍は 45 です。 10 の 3 倍は 30、5 倍は 50 です。 12 の 3 倍は 36、5 倍は 60 です。 … 54 の 3 倍は 162、5 倍は 270 です。 57 の 3 倍は 171、5 倍は 285 です。 58 の 3 倍は 174、5 倍は 290 です。 59 の 3 倍は 177、5 倍は 295 です。 60 の 3 倍は 180、5 倍は 300 です。
正解例は以下のとおりである。
あるいは
「n 回繰り返す」(「for (i = 1; i <= n; i++)」
または、「for (i = 0; i < n; i++) 」)というのは繰返しの基本の形である。
これができていないのでは、とても正解に到達することはできない。
printf(""); という意味のない文を書いている解答が多い。
printf("%d の 3 倍は %d、5 倍は %d です。", i, i * 3, i * 5);
putchar('\n');
とか
printf("%d の 3 倍は %d、5 倍は %d です。", i, i * 3, i * 5);
printf("\n");
とか、改行の出力だけ別にしている解答が何故か多いのだが、なぜシンプルに
printf("%d の 3 倍は %d、5 倍は %d です。\n", i, i * 3, i * 5);
と書かないのか気になってしまう。
やはりインデンテーションが約束事にそってできていない解答が多い。 この問題の場合はインデンテーションの誤りは 10 〜 30 % の減点とする。
下に示すように、正の整数 n を受け取ってディスプレイ上に、
最初の行の長さ(列数)が n, 1 行ごとに 1 文字分ずつ長さが短くなっていって、
縦の長さ(行数)が n となる左上直角三角形を表示するプログラムを作成せよ。
文字は列番を10で割った余りを繰り返して表示する。ただし、7個め、14 個め、21 個め …
(つまり 7 の倍数番目)の数字の代わりに * を表示せよ。
また最後に(途中に空行を開けずに) end と表示せよ
(n として負の数または 0 を受け取ったときは、end のみを表示する。)
正の整数を入力してください: 5↵
12345
1*34
123
1*
1
end
実行例 2:
正の整数を入力してください: 9↵
123456*89
1234*678
123*567
123*56
1234*
1234
12*
12
1
end
実行例 3:
正の整数を入力してください: 12↵
123456*89012
1*345678*01
1234*67890
1*345678*
123456*8
12345*7
12345*
12345
1*34
123
1*
1
end
実行例 4:
正の整数を入力してください: 0↵
end
正解例は以下のとおりである。