中間テストはペーパーテストが 12 点満点(順に 2, 3, 2, 2, 3 点)、
オンラインテストが 8 点満点(4, 4 点)で採点する。
(ただし、最終的な成績の計算にはこの半分 — ペーパーテスト 6点満点、
オンラインテスト 4 点満点 — の割合で用いる。)
期末テストは、もっと難易度は高くなる。
今回はテストであるので、NG というメッセージがあっても、 再提出する必要はない。
ペーパーとオンラインを合算して、得点率が 7 割未満の者には、 追試験を実施する予定である。詳細は追って連絡する。
オンラインテストでセミコロンの付け忘れなど基本的な文法事項で何度もエラーを出しているようでは、 時間内に課題を仕上げることが非常に困難になる。 文法は“何となく”ではなく、確実に理解しておく必要がある。
以下のプログラムは動作はするがインデンテーションが滅茶苦茶でプログラム
の構造を正しく反映していない。(そして、おそらく作成者の意図したように
は動かない。)プログラムの構造を明確にするために「プログラミング」の
インデンテーションの約束事(別紙)に厳密に従って(特に 5 番目のルー
ルに注意)、必要に応じてブレースを挿入し、インデントしなおせ。ただし、
ブレース内の字下げは紙幅の制限のため 3 文字分とせよ。
もちろん、プログラムの意味(実行結果)が変わらないようにすること。 (つまり、作成者の(よくわからない)意図を忖度するのではなく、 コンパイラーが解釈する通りにインデントすること。)
解答は、最初の #include <stdio.h>
は省略せよ。
また、解答欄のスペースの都合で、(最後は別として)空行は入れずに記入せよ。
正解例は以下の通りである。
なお、問題に不備があったため、字下げ幅が 3 文字か 4 文字かは問わない。統一されていなくても構わない。
次のような誤りが多い。
これだと
if (…) { … } else { … }
でいったん文が終わってしまい、いきなり else …
という文が始まることになってしまうがそんな文法はない。
あるいは、次の誤りも多い。
これだと、putchar('\n');
は i >= 9
のときしか実行されないが、
実際には常に実行される。
次のプログラムは一つの整数値を読み込んで、 それを整数として 4 で割った値(切り捨てた値)と、実数として 4 で割った値を表示するプログラムである。 たとえば、9 を入力すると、
整数を入力して下さい: 9↵
整数として 4 で割った値は 2 です。
実数として 4 で割った値は 2.250000 です。
と出力する。 空欄を埋めて、プログラムを完成せよ。
正解(例)とコメントは以下のとおりである。
番号 | 正解例 | コメント |
---|---|---|
(ⅰ) | %d |
%lf は double 型のための変換指定 |
(ⅱ) | &k |
& を忘れている解答がときどきある。 |
(ⅲ) | %d |
%f は double 型のための変換指定 |
(ⅳ) | k / 4 |
なぜか k / 2 という間違いが多い。 |
(ⅴ) | %f |
%lf は望ましくない。 |
(ⅵ) | k / 4.0 |
(double) k / 4 なども可、(double)(k / 4) , (double k) / 4 などの間違いが多い。 |
次のプログラムの出力を書け。
正解は、「C D W
」である。
「C W
」という間違いが多かった。間違えた人は、教科書 p.68 をよく読んでおくこと。
「A B C D W
」という間違いも数名いた。どうしてこういう間違いになったのかよくわからない。
以下の空欄を埋めて、 2 以上 102 以下の偶数をすべて降順 (つまり、102, 100, 98, …, 2 の順)に出力するプログラムを完成させよ。
正解例は、「i = 102; i >= 2; i -= 2
」などである。
変数名が違うの(「k = 102; k >= 2; k -= 2
」など)はもちろんダメである。
「i => 2
」や「i ≧ 2
」という解答があったが、
「=>
」や「≧
」という演算子は C 言語にはない。
セミコロン「;
」がなかったり、コンマ「,
」やコロン「:
」になっている解答がときどきある。
「i -= 2
」のところを「i - 2
」という誤答もあった。これでは変数の値は変わらない。
「i = i - 2
」なら許容範囲である。
以下のプログラムは、整数の組のデータを
(i,j)
という形式で出力する。
このプログラムの出力を書け。ただし、この問題の解答では、
空白は明示的に空白記号(␣
)を、
改行は矢印(↵
)を書くこと。
正解は以下の通りである。
(4,1)␣(4,5)␣(4,9)␣↵ (3,1)␣(3,5)␣(3,9)␣↵ (2,1)␣(2,5)␣↵ (1,1)␣↵
繰り返しを用いて 1 から 30 までの整数 i
に対して、
i を 3 で割った余りと 5 で割った余りを表示するプログラムを作成せよ。
以下のように、各 i
に対しては 「(?,?)
」 という組の形で左に 3 で割った余り、右に 5 で割った余りを表示し、
また、4 組ごとに表示したあとに(と、プログラム終了前に一度)改行を出力せよ。
(1,1) (2,2) (0,3) (1,4) (2,0) (0,1) (1,2) (2,3) (0,4) (1,0) (2,1) (0,2) ⋮ (1,0) (2,1) (0,2) (1,3) (2,4) (0,0)
正解例は以下のとおりである。
「n 回繰り返す」(「for (i = 1; i <= n; i++)
」
または、「for (i = 0; i < n; i++)
」)というのは繰返しの基本の形である。
これができていないのでは、とても正解に到達することはできない。
間違いとは言えないが、変数を(無駄に)何個も使っている解答があって気になる。
#includeint main(void) { int i, j = 1; for (i = 1; i <= 30; i++) { printf("(%d,%d) ", i % 3, i % 5); if (j % 4 == 0) { // j は常に i と同じ値 putchar('\n'); } j++; } putchar('\n'); return 0; }
この問題ならば、i
(という名前でなくてもよいが)1 つあれば十分なはずである。
必要ならば変数はいくつ使ってもよいが、常に同じ値を取る変数は必要ない。
下に示すように、正の整数 n を受け取ってディスプレイ上に、
最初の横の長さ(列数)が 1 で 1 行ごとに 1 文字分ずつ長さが長くなっていって、n まで増える「@
」の左下直角三角形と
最初の横の長さ(列数)が n で、1 行ごとに 1 文字分ずつ長さが短くなっていって、1 まで減る、数字の右上直角三角形、
を並べて表示するプログラムを作成せよ。数字の三角形の数字は、1 から始まって、4, 7, 0, 3, 6, 9, 2, 5, 8, 1, … というように
3 ずつ増える数の一の位の数を表示せよ。
また最後に(空行を開けずに) end
と表示せよ。
(n として負の数または 0 を受け取ったときは、end
のみを表示する。)
正の整数を入力してください: 5↵
@14703
@@6925
@@@814
@@@@70
@@@@@3
end
実行例 2:
正の整数を入力してください: 9↵
@147036925
@@81470369
@@@2581470
@@@@369258
@@@@@14703
@@@@@@6925
@@@@@@@814
@@@@@@@@70
@@@@@@@@@3
end
実行例 3:
正の整数を入力してください: 12↵
@147036925814
@@70369258147
@@@0369258147
@@@@036925814
@@@@@70369258
@@@@@@1470369
@@@@@@@258147
@@@@@@@@03692
@@@@@@@@@5814
@@@@@@@@@@703
@@@@@@@@@@@69
@@@@@@@@@@@@2
end
実行例 4:
正の整数を入力してください: 0↵
end
正解例は以下のとおりである。
あるいは
前者のほうが、条件式の評価回数が少なくて望ましいが、後者でも OK とする。