正解は順に 「%d
」, 「&n
」, 「%f
」,
「n/5.0
」(あるいは 「(double)n/5
」など)
平均点 1.58/2 (79%)
この程度の変換指定は暗記する必要がある。
&を手で書けない人が若干いるようだ。
このさい覚えておくこと。(この記号はラテン語の etに由来するので eとtをつなげた形になっている。)
ついでにいうと、
*(アスタリスク)
を手で書くとき、※と書くひとがいるようだが、
後者は「こめじるし」といって日本でしか使わない記号である。
正解は 「i=0; i<200; i=i+8
」
または 「i=0; i<200; i+=8
」
平均点 1.9/3 (63%)
i=i+8
の部分はいろいろな珍答が多かった。
など。i+8
,i*8
,(i++)*8
,i*8++
,i++*8
,i*=8
,8*i++
,i=8*i
,i++8
,i/8++
,i/8
,(i%8==0)++
,i*8*1++
,i%8==0
,(8*i)++
,8*(i+1)
i+=8
という書き方は忘れても、i=i+8
なら書けるはず。
「以上」と「未満」の意味をわかっていない人がいる?
正解は「C→F→D→B→E→A」の順
平均点 1.53/3 (51%)
この程度の問題ができるかどうかが、合格圏(正解率60%)の上と下をわけたようだ。
sin, cosの値を勘違いして間違えていると考えられる誤答はせいぜい5人程度、
あとの誤答は for
文の動作を理解していないためと考えられる。
正解は教科書 p.???を参照のこと
平均点 2.7/4 (68%)
「関数を定義する」という言葉の意味がわかっていないのではないかと思われる誤答が見られる。
正解は「3 1 6 1 4 2
」
平均点 0.79/3 (26%)
次のような呼び出しの関係をイメージできれば、正解できるはず。
さすがにこの段階にきて、この問題でNGの人は、自分の解答を友人やTAにチェックしてもらうこと。
else
をif
と同じ列に揃えて、
if (i % 3 == 0) { printf("!%d ", i); i++; } else { printf("?%d ", i); i -= 2; }としている人が多い。別に間違いではないが、
if (i % 3 == 0) { printf("!%d ", i); i++; } else { printf("?%d ", i); i -= 2; }のように、
if (…) {
に対応する}
の後ろに続けて書く方が多いと思われる。
今回はかなり甘く採点しているが、期末試験で同じような問題を出すことになれば、 もっと厳しく採点する。
ほとんどの人が正解していたが、
for (i = 1; i <= 9; i++) { for (j = 1; j <= 9; j++) { if (j <= i) { printf("%3d", i * j); } } printf("\n"); }という効率の悪い解答もあった。これではループを無駄に回るので、
j <= i
という条件は次のようにループの中に繰り込むべきである。
for (i = 1; i <= 9; i++) { for (j = 1; j <= i; j++) { printf("%3d", i * j); } printf("\n"); }
期末試験ではこれほどのサービス問題は出ない。
誤答というか未完成の解答で多かったのは最小値を求めているだけのもの。
void min_sofar(int vc[], int no) { int i; int min = vc[0]; for (i = 1; i < no; i++) { if (vc[i] < min) { min = vc[i]; } } }この値を使って配列の中身を書き換えなければいけない。
void min_sofar(int vc[], int no) { int i; int min = vc[0]; for (i = 1; i < no; i++) { if (vc[i] < min) { min = vc[i]; } else { vc[i] = min; } } }
配列の添字の範囲を逸脱している解答も多かった。 (今回はこの誤りの減点は小さいが、本来はもっとも気を付けなればいけない誤りである。)