プログラミング入門 第14回

プログラミング入門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文は説明していません。
期末試験について
• 最低限、各回の基本課題のプログラムが書
けるようにしておいてください。
• 中間試験で出題した問題が解けるようにして
おいてください。
• 細かい書き間違い(セミコロンの付け忘れ、中
括弧の閉じ忘れ、変数宣言のし忘れ等)に注
意してください。減点対象とします。
• 読みやすく書いてください。字下げを適切にし
てくれると読みやすくなります。