Final2010comment
From Prog0
Contents |
全般について
全平均点は59.6点でした。最高点は98点でした。各問題の平均点は
- 問1 31.5点 (40点満点)
- 問2 13.4点 (20点満点)
- 問3 4.8点 (20点満点)
- 問4 11.1点 (20点満点)
問1 採点基準と講評
(1) 比較的よくできていましたが、(a)(c)(i) は誤答が多く見られました。(a)の条件式がx >= 0 && (x > 5 || x < 3)ならx の値が0以上3未満か5より大きいときだけ真になりますが、問題文ではカッコがないのでxの値が5より大きいか3未満のときだけ真になります。(c)の関数のプロタイプ宣言には、関数の戻値の型、関数名と仮引数名(なくても可)のほかに、仮引数の型の宣言も必要です。(i)を間違えた人は自動変数について復習してください。この他に(b)(e)(g)(h)(l) を間違えている人も多少見られました。半角の数字、アンダースコアは変数名の先頭では使えませんがそれ以外の場所なら使えるので、これらが変数名の中に含まれていてもかまいません。したがって(h)の答えは○です。また、関数はmain()でない関数の中からも呼び出せるので、(l)は×が正解です。
(2) 比較的よくできていました。ただ、クイズ5には(a)と似ている問題があるのに、(a)については11ではなく10としてしまったケースが多く見られました。(b)では、%dを使ってしまったり、引用符で囲まなかった間違いが多かったようです。(c)では、問題文の仕様と異なり 「i = 2; i <= 100; i+=2」のような回答が目立ちました。仕様をよく確認してから解答してください。(d)は偽やfalseあるいはelseという答えが目立ちました。(d)は条件式の「値」を答える問題ですが、これらはどれもC言語の値ではありません。なお、(b)(c)の答案で、printf や for などの下線部以外の箇所まで書いているものは1点減点しました。また、(b)で2つの%fの間に空白があるのかどうか分かりづらいものも1点減点しました。
(3) (a)と(c)は、演習問題をよく理解しているなら簡単な問題ですが、意外にあまりできはよくありませんでした。(b)では、「#」を書き忘れたり、最後に「;」を付けるといった誤答が少なくないです。(d)はクイズ5に似ている問題がありましたが、正しく答えられなかった人が多かったようです。講義の内容だけではなく、演習問題及びクイズ問題も十分理解して試験に臨んで欲しかったです。後期からはプログラミングCも始まるので、ハンドアウト、演習問題、クイズ問題をよく復習しておいてください。
問2 採点基準と講評
(1) 5点
[採点基準] 変数宣言正解 1点 二重ループ正解 2点 scanf正解 2点
[講評]
- 比較的良く出来ていました。
- いまだにループの範囲で for(i=0; i<=8; i++) などとする人がいます。再度ループの復習をしましょう。
- 外側内側のループの順が逆の人がたまにいました。これでは配列の形と全く違う添字(例えば data[1][7])へのアクセスを行ってしまいます。
for(i=0; i<2; i++)
for(j=0; j<8; j++)
scanf("%d", &data[i][j]);
- ただ、上記でscanf("%d", &data[j][i]);となっている場合はデータの読み方の順序が変りますが、問題に特に指定していないので、正解としました。
(2) 5点
[採点基準] 1つの数値のみの場合: 9又は12なら2点 それ以外なら0点
2つの数値を記述した場合: 両方正解で5点 (改行されている物もOKとした) 一方のみだと2点 両方不正解で0点
3つの数値を記述した場合: 9 12 * の場合は2点 それ以外は0点
4つ以上記述した場合は、正解の数値(9、12)が含まれていても0点
[講評]
- とても出来が悪かったです。
- 非常に多かった間違いは以下のようなパターンです(改行含む)
1 4 9 2 6 12
これはsumを書かせるprintf文、改行させるprintf文ともに実行される回数を間違えています。(正解は前者2回 後者1回)
解答する際には、ループはどこまでなのか、落ち着いてプログラムを良く見る必要があります。
(3) 5点
[採点基準] ア 2点 sum >= 100 は1点減点
イ 2点 %dが違う(%fなど)もの、iが違う(sumなど)ものはそれぞれ1点減点
ウ 1点
[講評]
- まあまあの出来でした。
- アでは例によってsum >= 100にしてしまう人がいました。
- イでは「ループ回数」を表示させる指示なのにsumを表示してしまう人がいました。
- ウではたまにbreakの綴り違いがいました。きちんと覚えましょう。
(4) 5点
[採点基準] 基本的には論理的に正しく動くプログラムには点数をあげていますが、以下の場合には若干の減点をしています。
ア 3点 関数sanjou()を使用していない物は1点減点
イ 2点 複数行にまたがる物は1点減点
[講評]
- まあまあの出来でした。
- 解答する場合は問題を良く読んで解答しましょう。この問題の場合は「3乗関数sanjouを利用するプログラムに書き換える」であるので、関数を使用していない物は本来不正解です。採点では「論理的に正しく動作する物」にて満点とはいかなくても点をあげています。
- アでは a3*a3*a3 は1点減点しています。sanjou(sanjou(1.5))は減点していません。また結構多かった答えが sanjou(1.5)*sanjou(1.5) ですが、これは1.5の6乗となるので、不正解です。
- イでは以下のような感じの複数行の人が見受けられました。これは1点減点としています。また変数としてintを使用したりして正しく動作しない物は不正解としています。
float ans; ans = x * x * x; return ans;
- 関数はあまり良く分かっていない人が割と多いのではないかと思います。是非夏休みに復習をして後期に備えましょう!
問3
採点基準
正しい結果が表示されるようであれば満点とします。
他、以下のようなポイントについて、基本的に減点法で採点しました。
- マクロを定義していない
- 200以下の素数という条件をみたしていない
- isPrime()を定義していない
- isPrime()の実装が間違っている
- 三つ子素数判定のロジックが間違っている
- isPrime()が正しい場合5点としました
- マクロ宣言、isPrime()のプロトタイプ宣言、最初のprintf文、ループの初期値などがあっている場合1点加点します。
講評
出来不出来に大きく差があり、平均点が非常に低かったです。三つ子素数の例をもとに、四つ の連続した奇数をピックアップし、素数判定と3の倍数の判定をするのが素直なアルゴリ ズムでした。点数が悪い人は、このアルゴリズムが全く書かれていなかったり、 isPrime()の定義を書いていなかったです。
- 三つ子素数判定のアルゴリズムは、皆さんかなり苦しんでいました。場合分けをすればそれほど難しくはないです。
- 一つ一つの要素を分けて考えればよいのですが、一度にやろうとして後々うまくいかなくなるケースが目立ちます。
- ポイントは、如何に上手に、途中に入り込んでくる3の倍数を排除するかです。そのためには、最初にプログラムの設計を行っておくことが重要です。例にならって、4つの数の素数判定をし、その中の3の倍数を排除します。
- isPrime()は真偽を判定する関数であるのに、数値を返したり、三つ子素数の判定を実装している答案がありました。
- 3の倍数をチェックしているだけのisPrime()が多いです。
- NUMのマクロを宣言しているにもかかわらず、196や198といった数字を書いている人がいます。
- continueの使い方を間違えている人が多かったです。
問4 採点基準と講評
配列、関数、分岐などが含まれる総合問題です。仕様と実行例に沿う形で、正しい結果が表示されるようであれば満点(20点)としています。ほとんどの人に部分点が与えられています。平均は11.1点でした。
配点は大きく分けて、
- 12人分の、身長、体重の入力が正しくできていれば、3点
- 12人分の、bmiの計算が正しくできていれば、3点
- 12人について、関数bmi_hanteiを正しく呼び利用できていたら、3点
- 12人について、「正常」「やせている」「太っている」の表示が正しくできていたら、3点
- bmiが「正常」範囲内な人の割合計算と表示が正しくできていたら、3点
- 関数bmi_hantei自体が正しく記述できていたら、5点
を基本としていますが、バランスを考え、多少調整している場合もあります。
間違いが最も多かったのは、bmi計算における身長の単位変換(cm→m)忘れでした(これはこの問題の重要部分なので、2点減点しています)。問題文をよく読みましょう。
また、bmiが「正常」範囲内な人の割合計算と表示について、抜けていた人もかなり多かったです。やり方がわからなかった人は良く復習して下さい。
尚、割合計算まではできていても、パーセント表示にしていなかったり、四捨五入を忘れているあるいは正しくできていない、表示の書式が間違っている、等の答案も多く見られました。勿体ないです、注意しましょう。
他には、初期値の設定忘れ、bmi_hanteiの戻り値が仕様の指定外、関数bmi_hanteiの型違い、など細かいミスも散見されました。特に初期値の設定がきちんとできていないと、間違った結果になるので、常に気をつけましょう。
尚、12人という人数をマクロで宣言している答案には、ボーナス点として、2点を加算しています。
この問題では、配列の使い方は自由です。模範解答のような2次元配列を使わなくても、1次元配列だけで行うことも可能です。
ただ、根本的に、ループと配列の基礎がわかっていないと思われるような答案もいくつか見られました。
配列を一切使わず、人数分のループの中で同じ変数に入力し続けるだけ(bmiの計算はしない)でループが終了する時、その変数には最後のループのデータが格納されるだけです。1変数に、複数人数のデータは入りません。
配列を使う必要性から思い起こして十分復習してください。
