期末試験講評
問題1
コマンド引数とファイルを扱う問題ですが、全体的にあまり出来はよくありませんでした。
-
(1): 実行に必要なコマンドライン引数の数の問題です。
"./a.out"を考慮せず、4と答える人がいました。
-
(2): おおむねできていましたが、若干名"stdout"と答える人がいました。
-
(3)(4): コマンドライン引数で与えられたファイルを開く問題です。
"fopen"を書き忘れた人、"argv"を使用せず直接ファイル名を指定している人、余計な文字が入っている人がいました。
-
(5)(10): 開いたファイルを閉じる問題です。おおむねできていました。
-
(6): ファイルから1ずつ英単語を読み取る問題です。
"%s"でなく"%c"を使用している人、"fpin"を書き忘れた人がいました。
-
(7): ファイルから読み取った英単語とコマンドライン引数で与えられた英単語が同じか確認する問題です。
おおむねできていました。
-
(8)(9): (8)はコマンドライン引数で与えられた置換後の英単語、(9)はファイルから読み取った英単語をファイルに出力する問題です。
改行コードを忘れている人、"fpout"を書き忘れた人がいました。
問題2
問題2-1
ポインタの問題ですが、全体的にあまり出来はよくありませんでした。
プログラムと実行例の両方ができて、1点です。
-
(1): "%p"と答える人が多かったです。
-
(2)-(4): 実行例の穴埋めを間違える人が多かったです。
-
(5)(6): おおむねできていました。
-
(7): "%d"と答える人が多かったです。
-
(8): "%p"と答える人が多かったです。
-
(9)(10): 実行例の穴埋めを間違える人が多かったです。
問題2-2
-
(1): そこそこ出来ている人が多かったです。なお sizeof という誤答がありましたが、
str_array[] のサイズは文字数とは関係ありません。
(ポインタなので8バイト、配列全体なら32バイト)
-
(2)(3): ほとんど出来ていませんでした。order[i]という惜しい誤答も少数でした。
order[i]にはキーボードから入力された(1が先頭の)順番情報が入っているので、プログラムの内部で配列の添字に対応させるには-1しなければなりません。
-
(6): ダブルクォートを使っているものはバツにしました。
C言語では文字列はダブルクォートで囲い、文字はシングルクォートで囲うことになっていることを思い出してください。
バックスラッシュのはずが普通のスラッシュになっているものもバツにしています。
-
(7)(8): あまり出来が良くない印象です。なぜか、文字列定数配列と書き換え可能、
文字列配列と書き換え不可能という組み合わせにしている人が多数いました。
定数なら書き換えできないし、配列(変数)なら書き換え可能なはずですが…
講義第5回のハンドアウトなどを見て復習してみてください。
問題3
構造体の問題なので、構造体宣言やプログラム中のコメントをよく読んで解答する必要があります。
-
(1): inputall関数のコメントをよく読めば分かる(戻り値に使っている文字も同じ n)
と思うのですが、それほど出来が良いわけでもなかったです。
-
(2)-(4): 出来は半々くらいでした。
-
(5): 添字が二重につくので難しかったと思います。
&を付け忘れる惜しい誤答もあり、正解は極めて少なかったです。
-
(6)(7): 出来ている人が多かったようです。前後の記述から類推しやすかったのでしょう。
-
(8): 下の方での temp の使われ方を見れば、型が分かるはずです。出来はいまいちでした。
-
(9): 2つの変数の値の交換の仕方の問題です。この小問は多くの人が出来ていました。
-
(11)(12): コメントに従って、辺の長さの2乗 a2, b2, c2 を使って書いてください。
これも出来は良かったのですが、a2等をさらに2乗している誤答がありました。
プログラムをよく読んでください。
等号 == を代入 = にしてしまうミスも少し見られました。
なお、(12) を a2+b2>=c2 としたものは、動作はするものの、問題文の趣旨から外れているのでバツにしています。
問題4
(1)(2)で、マクロ定義で間違えた人が多かった模様。
-
(1): a,bはXY型構造体変数ですので、.xや.yを書かなかった人が多かった。
-
(2): xのカッコの書き忘れが多かった。
-
(3): 正解率が高いが、ヘッダファイルのダブルクオーテーションではなく<>という回答も見られます。
-
(4)-(7): 正解している人が多かったが、解答は小文字であることを注意。
-
(11)(12): 条件コンパイルのオプション -DINPUT=1を書かなかった解答が多い模様。また、-DDEBUG、の最初のDが抜けている解答もあった。
-
(14): 全体で正解率が低い。
データの入力のリダイレクション用の-DINPUT=2忘れがメイン。
また、-cオプションで複数行に分けてコンパイルするときと、まとめて1つのコンパイルコマンドで行うときのの書き方が混在している解答も少なくはない。
あとは、 -cが-oとなったり、ヘッダファイルもコンパイルしている解答も見られます。
再度分割コンパイル、単体テストなどの手順をよく復習することをお勧めします。
問題5
-
(1)(2): 引数のnumberを用いて、桁数を並べ替えたときの最大数字と最小数字を取得する関数を呼び出す穴埋めで、正解している人が多かった。
若干名、関数の引数に「int」をつける人がいた。
-
(3): カプレカ操作の「差をとる」部分の穴埋めで、こちらも正解している人が多かった。
-
(4): 再帰のif文条件式の穴埋め。直前に「 計算結果がこの関数の引数の値と異なれば 〜」という趣旨のコメントがあるので、ある程度人数は正解していた。
何人かは、カプレカ数「6174」と比較している人が、その場合、実行例のような動作をしないので不正解とした。
また、kaprekar関数の戻り値と比較している人もいたがこれも不正解。
-
(5): 再帰の呼び出しの穴埋め問題。問題文に実行例の流れを記載していたのにも関わらず、「kaprekar(number)」と答える人が数名いた。
正解としては計算後の値を使って再帰を行うので、「kaprekar(result)」が正解である。
-
(6): 再帰終了条件を満たした時のkaprekar関数の戻り値の穴埋め。
プログラムコードの関数の説明(コメント)に戻り値の説明をしているので正答率は高かった印象がある。
- (7)(8): 引数に配列の変数を渡す必要がある関数の呼び出し・穴埋め問題で、(7)はnumber2digit関数、(8)はsort関数の呼び出しとそれぞれの適切な引数を渡す問題。
2つある引数のうち1つの「digits」もしくは「&digits[0]」と答えるべき場所を、「*digits」や「digits[]」と答える人がいた。
また、「&digits」と答える人もいたが、コンパイル時にwarningが出るが同じ結果が得られるので正解としている。
(8)においてsort関数の第2引数は「配列の要素数」を渡す必要があるので数字の「4」を渡してあげるのが正解だが、「何かしらの変数を渡す必要がある」と考える生徒が多かったのか、変数numberを第2引数に渡していた生徒がいた。
問題6
for文で連結リストの各ノードをたどりながら、
partial_match関数で、学籍番号に部分一致するデータを表示するという問題でした。
その際、headの次のノードからたどるように指示されているので、それができていないものは大きく減点しています。
また、headからたどってしまっていて、ループ内でn->next->data,,,を使っている場合は、半分点数を上げました。
その他、半数ぐらいの人が手つかずでした。その一方で、20点(満点)の人もそこそこいました。
採点基準
- 概ねfor文のところが完成していて8点(ただし、たどり方の条件に合っていること)
- if文が完成していて6点
- printf文の内容ができていて6点の配点
if文の条件式で==NULLを使っていて、continueと組み合わせて正しく動作するものは正解としています。
また、printf文の後でbreakしてしまっているのは、1つしか結果表示がされないので、減点しています。