Final2023comment

From Prog0

Jump to: navigation, search

2023年度期末試験 採点基準・別解、講評等

Contents

問1

全体的によくできていたと思います. 間違った問題についてどこに原因があったのか確認しておくとよいでしょう.

問2

採点基準:

  • (b)-(f)は順不同、各1点
  • (g)-(h)も順不同、各1点
  • (j)別解 i<=5、1点
  • (k)別解 ++i、1点
  • (l)別解 i<=1、1点
  • (m)別解 —i もしくはi-=1もしくはi=i-1、1点
  • (n) if条件式誤りや未完成は-2点、max = data[i][j];が誤りないし逆符号は-2点、r=i;もしくはc=j;が欠けていればそれぞれ-1点、減点合計が負となったらこの小問を0点とする。3点。

講評:

  • switch case文は全般によくできていたが、文法を全く理解していない答案もいくつかみられました。
  • for文のデクリメントが上手く扱えない答案が目立ちました。
  • 黙読してプログラムを追えばすぐに気づく誤りが珍しくなかったので、必ず見直して処理の流れを追えるようになってほしい。

問3

採点基準:

  • (a), (c): 各1点
  • (b), (d), (e): 各2点
  • (a) は評価値が 0 になるもの以外は正解としました.
  • (b) は "return 0" も正解としました.
  • (d) と (e) とは順序が重要です.
  • (e) は "n /= 2 (または n = n / 2)" が正解ですが,"n = (n-r) / 2" としている解答もいくつか見られました."n-r" という不要な演算を行なっているためおすすめはしませんが,プログラムとしては正常に動作するためこちらも正解としました.

講評:

  • while 文の二重ループというあまり見られないプログラムですが,全体的に比較的よくできていました.
  • 外側のループは無限ループとするため条件式を (a) "1" とするところですが,不正解の中には変数 n を用いた条件式が多く見られました.この条件式を最初に実行するときは n は不定値なのでこれは正しくありません.
  • 内側のループで (c) while とすべきところ,直前の if 文に引きずられたのか,"(else) if" といった解答 (不正解) も多く見られました.
  • この問題のプログラムでは 2進数が逆順で表示されますが,正しい順序で表示するためにはどのような改修が必要か考えてみてください.(ハンドアウト Lec12-24 参照)

問4

採点基準:すべて2点。

  • (c) は n=n-7 も当然OKですが、 n-7 のみはバツです。
  • (e) は k<=i-1 もOK

講評:

  • (a) i が宣言時に初期化されていないので、そのままでは何が入っているか分からないことに注意して下さい。出来は良かったです。
  • (b) は、なぜか n>=0 や n<=0 などの誤答が目立ちました。while ループでn が正の数のみとなるようにするので n>0 とすれば良いだけなのですが。また、 i<=n/7 等の間違いも案外多かったです。nが6や7のときに正しく動作するか考えてみてください。
  • (d)(e)(f) はそれぞれ i+1, k<=i, i-k とする間違いがかなり多く見られました。変数 i は arr の最後の添字より1大きい状態で条件式 (b) が偽となりループを終了する、ということに注意してください。

問5

採点基準:

  • 解答と異なるが動作が実行例と同じようになる場合には正解にしています。
  • 題意の通りに動作しない場合は不正解にしています。
  • またコンパイルエラーとなる場合も不正解にしています。
  • 些細なミスは2点の箇所(a,b,f,g,h)は1点減点、1点の箇所(c,d,e)は0点にしています。

講評:

  • (a) "int"の宣言をつけていない答案が見られました。この変数をdouble型で宣言も出来ますが、その場合(b)のscanfの部分も変更する必要があります。
  • (f) 平均点の計算は誤りが多かったです。
  • (g) 「小数点以下一桁」という指定を満たしていれば正解にしています。
  • (h) 平均点以上の点数を判定する条件式も誤りが多かったです。

問6

  • (a) 解答例ではマクロTRUEとの比較を行うことになっていますが、isprime()関数自体がTRUEかFALSEのいずれかの値しか取らないので、比較をあえて行わなくても条件式として使用できます。また、比較としてはマクロTRUEを使って欲しいところですが、前記の比較をしない解答を正答としているのでバランスをとってこちらも正答としました。結果として、
isprime(i) == TRUE
isprime(i)
isprime(i) == 1

が正答としてあります。時折関数の引数を()ではなく[]で囲っている人がいました。これは正しくありませんがおまけしています。実際プログラムを書く際には書き間違えないように気をつけてください。

  • (b) 解答例では配列への代入と配列添字変数のインクリメントを一度に行う技巧的な書き方になっていますが、素直に
pri[n] = i;
n++;

と2つに分けて書いてもよいのでそちらも正答としています(この解答をしている人が圧倒的多数で、正答率は良好でした)。

  • (c) i < n-1 も正答にしました。あまり正答率は高くありませんでした。
  • (d) 素数を大きなものから逆順に表示させるためには pri[i] と単純に書くわけにはいかないところですが、そう書いてしまう人や、逆順にすることは認識しつつも間違った書き方になっている人が多かったです。
  • (e) 配点が4点なので、forループを正しく書けているかどうかと、内部の条件式による対応を正しくかけているかどうかで2点づつ部分点を与えています。
int isprime(int n) {
 for (i = 2; i < n; i++) {
   if ( n%i == 0 ) return FALSE;
 }
 return TRUE;
}

が解答例で想定している完成形ですが、

int isprime(int n) {

...

if (...)
 return FALSE;
else 
 return TRUE;
}

という形にしようとして難しい書き方にしてしまっている人がかなりの人数いました。関数内でreturn文はどこに出現してもよいので、無理に上のような書き方にする必要はありません。

問7

  • (a)-(e)は原則完全解答です。
  • (f),(e)は内容に応じて中間点をつけています。
  • (a)は単純な整数値の入力で概ねできていました。
  • (b)はscanfの戻り値と入力dataの両方をチェックする必要があります。EOFを思いつかなかったのか、control+dと書いた人も多少いました。
  • (c)(d)のfor文はiをダウンカウントしているので、(c)i=N(マクロ必須), (d)i>0または i>=1である必要があります。
  • (e)は概ねできていました。
  • (f)はループ回数が(pos-1)回になっている必要があります。また、マクロBASEを使っていない場合は減点しています。
  • (g)はif-else構文で書く必要があります。条件式やprintfが間違っているものも減点しています。
  • 全体を通して、変数名を間違えている人が僅かですがいました。ちょっとした間違いですが、減点の対象になるので、注意して下さい。

問8

採点基準:

  • (d)以外の1点問題は正答に従った解になるもののみに〇をつけました。
  • (d)の2点問題は、%eの部分を書けていれば1点、
  • 完全な正答を書けていれば2点を与えています。

講評:

  • 基本的に皆さん、良くできており、5点以上取れている方が多い印象です。
  • ただ、やはり指数表示[%e]に関しては、覚えていない方が多く、正答率が低かったです。特に完全正解は数名しかいませんでした。
  • また、標準エラー出力の[stderr]に関しても間違いが多い箇所だったと思います。
  • ハンドアウトを良く覚えていないと難しかったかもしれません。
Personal tools