プログラミング入門2 中間試験の結果について 情報工学科 篠埜 功 中間試験について 36点満点です。 受験者123名 得点分布 0-10: 0人 11-20: 5人 21-22: 4人 23-30: 32人 31-36: 82人 22点以下の人は要注意です。期末の準備を 十分にしてください。 注意事項1 scanf関数の使い方ですが、 scanf (“%d\n”, &x); のように改行コードを入れないようにしてください。 scanf (“%d”, &x); のように記述してください。 上の書き方だと、整数を入力して改行しても scanf関数が終わりません。 (ただし、scanf関数の使い方は詳しくは説明して いないので、上記の間違いは減点対象とはしま せん。) 注意事項2 x=x++; のような文を書く人がいましたが、この文は意味が一意 に定まりません。この文の実行後、xの値が、1を足され た後の値になるか、1を足される前の値になるかは、処 理系に依存します。 (より詳しい説明) x=x++; の実行によって代入されるのはこの文の実行前 のxの値ですが、++によってxに1が足されるタイミングは C99(あるいはC89)の規格上、自由です。(正確には、副 作用完了点(sequence point)の前までに行われれば良 い。この例では、x=x++;の実行中、どの時点でも良い。) これは減点対象とします。 注意事項3 • 関数定義の中に関数定義を書いた人が1名いま した。これは、ISO規格では許されていません。た だし、GNUの言語拡張では許されています。演 習室のCコンパイラはGNUのコンパイラであり、 関数定義内に関数定義を記述可能です。 • 関数定義のネストは他の多くの言語では許され ており、自然ですが、ISO規格では許されていな いということを知っておいてください。(規格に取 り入れてもよさそうに思いますが、今は入ってい ません。) • 減点対象とはしません。 関数定義のネストの例 #include <stdio.h> int main (void) { 赤字部分が、関数定義 int sum (int n){ 内に記述した関数定義 int i, sum=0; for (i=1; i<=n; i++) このプログラムは演習室の環 sum=sum+i; 境ではコンパイルが通るが、 return sum; ISO規格では許されていな } い。 printf ("sum(10)=%d\n", sum(10)); $ gcc –pedantic test.c return 0; のように-pedanticをオプショ } ンに指定することによって、 警告が出るようになる。 注意事項4 • 関数定義の外に変数宣言を書いた人がいま した。関数定義の外で宣言すると、グローバ ル変数となり、関数呼び出しとは関係なく、プ ログラム実行の最初から最後まで存在しま す。関数定義の内部に書いた変数は、その 関数の呼び出し毎に別の変数として扱われ ます。 • グローバル変数を使って挙動のおかしいプロ グラムを書いた場合は減点対象とします。 • グローバル変数は講義では説明していませ ん。 例 #include <stdio.h> int s=0; int sum (int n) { int i; for (i=1; i<=n; i++) s=s+i; return s; } int main (void) { printf ("sum=%d\n", sum(10)); printf ("sum=%d\n", sum(10)); return 0; } このプログラムではsをグロー バル変数として宣言している。 main関数内で2回sumを呼び 出している。1回目はsの値が 55になり、返り値が55となる が、2回目はsの値が55の状 態から計算が始まり、返り値 が110となる。 注意事項5 • スコープ外で変数を使っている人がいまし た。 int main (void) { (例) int n; printf (“整数を入力: “); scanf (“%d”, &n); for (int i=n; i>0; i--) { printf (“%d, “, i); } printf (“%d”, i); return 0; } このiはforループで宣言さ れている変数iの有効範 囲からはずれています。 (コンパイル時にエラーに なります。) これは減点対象としま す。 注意事項6 • ループではないところでbreak文を使っている人 がいました。 (例) int main (void) { int n; printf (“整数を入力: “); scanf (“%d”, &n); if (n < 0) break; …. } このようなプログラムは、 コンパイル時にエラーに なります。 (補足) break文は、繰り返し文(while文、for文、do while文) の本体部分か、switch文の本体部分の中でしか使えませ ん。講義ではdo while文とswitch文は説明していません。 期末試験について • 最低限、各回の基本課題のプログラムが書 けるようにしておいてください。 • 中間試験で出題した問題が解けるようにして おいてください。 • 細かい書き間違い(セミコロンの付け忘れ、中 括弧の閉じ忘れ、変数宣言のし忘れ等)に注 意してください。減点対象とします。 • 読みやすく書いてください。字下げを適切にし てくれると読みやすくなります。
© Copyright 2024 ExpyDoc