プログラミング
期末テスト（ペーパーテスト）問題用紙（2019 年 2 月 13 日）

解答上、その他の注意事項

I. 問題は、問 I〜IV まである。
II. 持ち込みは 不可 である。筆記用具・時計・学生証以外のものは、かばんの中などにしまうこと。
III. 解答用紙の右上の欄に学籍番号・名前を記入すること。
IV. 解答欄がマス目になっている場合は、1 字に 1 マスを用いること。特に空白にも必ず 1マスを用いること
V. 解答中の文字 (特に a と d) がはっきりと区別できるよう注意すること。
VI. ペーパーテストの配点は 32 点とする。（オンラインテスト — 8 点）
VII. スペースの都合上、テスト中のプログラム例では、最初の#include <stdio.h>は省略する場合がある。

1

I. 以下のプログラムは動作はするがインデンテーションが滅茶苦茶でプログラムの構造を正しく反映していない。（そして、おそらく作成者の意図したようには動かない。）プログラムの構造を明確にするために「プログラミング」のインデンテーションの約束事（別紙）に厳密に従って（特に V 番目のルールに注意）、必要に応じてブレースを挿入し、インデントしなおせ。ただし、この問題では、ブレース内の字下げは 3 文字分とせよ。
もちろん、プログラムの意味（実行結果）が変わらないようにすること。（つまり、作成者の（よくわからない）意図を忖度するのではなく、コンパイラーが解釈する通りにインデントすること。）
解答は、最初の #include <stdio.h> は省略せよ。また、解答欄のスペースの都合で、（最後は別として）空行は入れずに記入せよ。なお、putchar は p-----r のように省略してよい。

int main(void) {int i, j;for (i = 0; i < 6; i++)for (j = 1; j < 100; j *= 2)
if (j % 10 == 4) putchar(’@’);
else putchar(’*’); putchar(’#’);
if (i % 3 == 0) putchar(’$’);
return 0;}
II. 次のプログラムは、「実数を入力してください。」と出力してから一つの実数値を読み込んで、その数を初項とし、以降の各項が前項の 0.5 倍 になる数列（公比 0.5 の等比数列）の、第 1 項から第 10 項まで表示するプログラムである。空欄を埋めて、プログラムを完成させよ。
1 #include <stdio.h>
23 int main(void) {4int i;5double d;67printf("実数を入力してください。"); scanf("%lf", &d);
8for ((i)) {9printf("%.2f␣", d);(ii);1011}
12putchar(’\n’);1314
return 0;
15 }実行例 1（次頁につづく）

2

実数を入力してください。 512

512.00 256.00 128.00 64.00 32.00 16.00 8.00 4.00 2.00 1.00

実行例 2

実数を入力してください。 -100-100.00 -50.00 -25.00 -12.50 -6.25 -3.12 -1.56 -0.78 -0.39 -0.20



III. 以下のプログラムの空欄に、• 3 つの double 型の引数 a, b, c を受け取り、b2 − 4ac を返す関数
double discriminant(double a, double b, double c)を定義せよ。（解答欄は横幅が狭いので、適当なところで改行を入れること。）

1 #include <stdio.h>2
34
5
6
7 int main(void) {8double a = 1, b = 4, c = 6;910
printf("%.2f␣*␣x␣*␣x␣+␣%.2f␣*␣x␣+␣%.2f␣ の判別式は ␣%.2f␣ です。\n",11a, b, c, discriminant(a, b, c));1213
return 0;
14 }このプログラムは

1.00 * x * x + 4.00 * x + 6.00 の判別式は -8.00 です。

と出力する。

3IV. 以下の問に答えよ。
(i) 次のプログラムの出力結果を下の選択肢より 1 つ選べ。
1 #include <stdio.h>
2
3 int main(void) {4double x, y, z, w;
5
6x = 3 / 4;
printf("%f␣", x);
7y = (double)(3 / 4); printf("%f␣", y);
8w = 3; z = w / 4;
printf("%f␣", z);
9putchar(’\n’);1011
return 0;
12 }
(A).
(C).

0.000000 0.750000 0.750000
0.750000 0.750000 0.750000

(B).
(D).

0.750000 0.750000 0.000000
0.000000 0.000000 0.750000(ii) 次のプログラムの出力結果を下の選択肢より 1 つ選べ。
1 #include <stdio.h>
2
3 int main(void) {4int a = 3, b = 5, c = 7, d = 6;
5
if (a < b) {6a = b;7} else if (a < c) {8a = c;9}10if (a < d) {11a = d;12}
13
printf("%d\n", a);1415
return 0;
16 }
(A).

3(B).

(C).

546(D).

7

(iii) 次のプログラムの出力結果を下の選択肢より 1 つ選べ。
1 #include <stdio.h>
23 int main(void) {4int i;56for (i = 10; i > 1; i--) {7printf("␣%d", i);8}9printf("$%d\n", i);10
11return 0;
12 }
(A).
(C).

(B).
(D).

10 9 8 7 6 5 4 3 2$2
10 9 8 7 6 5 4 3 2 1$1

10 9 8 7 6 5 4 3 2$1
10 9 8 7 6 5 4 3 2 1$0(iv) 次のプログラムの出力結果を下の選択肢より 1 つ選べ。
1 #include <stdio.h>
23 int main(void) {4int i, j;
56for (i = 1; i < 5; i *= 2) {7
for (j = 1; j < 5; j *= 3) {8
printf("(%d,%d)␣", i, j);9}10putchar(’\n’);
11}
12
13
return 0;
14 }
(A).

(1,1) (2,1) (4,1)(1,3) (2,3) (4,3)(B).

(1,1) (1,2) (1,4)(3,1) (3,2) (3,4)(C).

(1,1) (1,3)(2,1) (2,3)(4,1) (4,3)(D).

(1,1) (3,1)(1,2) (3,2)(1,4) (3,4)

5

(v) 次のプログラムの出力結果を下の選択肢より 1 つ選べ。
1 #include <stdio.h>
23 int main(void) {4
int i, j, n = 5;5for (i = 1; i <= n; i++) {6for (j = 1; j <= i; j++) {7printf("%d", (i + j - 1) % 10);8}9putchar(’\n’);10}
11
return 0;
12 }
(A).

1
23456
7890
12345

(B).

(C).

1
23345
4567
56789

12345
2345
345
45
5(vi) 次のプログラムの出力結果を下の選択肢より 1 つ選べ。
1 #include <stdio.h>
2
3 int main(void) {4int k = 4;
5if (5 <= k && k <= 9) {6printf("A␣");7} else {8printf("B␣");
9}10if (k <= 0 || 5 <= k) {11printf("C␣");12} else {13printf("D␣");
14}
15
return 0;
16 }
(A).
(C).

(B).
(D).

A C
B C

6A D
B D

(D).

12345
6789
012
34
5

(vii) 次のプログラムの出力結果を下の選択肢より 1 つ選べ。
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16

#include <stdio.h>
int arr[5][5] = { { 0, 1, 2, 3, 4 },{ 5, 6, 7, 8, 9 },{ 0, 1, 2, 3, 4 },{ 5, 6, 7, 8, 9 },{ 0, 1, 2, 3, 4 }};int main(void) {int i;for (i = 0; i < 3; i++) {printf("%d␣", arr[i][4 - i]);}return 0;}(A).

4 8 2(B).

(C).

0 6 2

2 6 0(D).

(viii) 次のプログラムの出力結果を下の選択肢から 1 つ選べ。
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16

#include <stdio.h>void bar(int x, int y[]) {x -= 3;y[0] += 3;}
int main(void) {int x= 9;
int y[] = { 6 };bar(x, y);printf("x␣=␣%d,␣y[0]␣=␣%d\n", x, y[0]);return 0;}
(A).
(C).

(B).
(D).

x = 9, y[0] = 6
x = 6, y[0] = 67

x = 9, y[0] = 9
x = 6, y[0] = 9

2 8 4

(ix) 次のプログラムの出力結果を下の選択肢より 1 つ選べ。
1234
5678
910
1112
13
14
15
16
1718
1920
21222324
25
26272829#include <stdio.h>
int x = 2;
void baz(void) {printf("%d␣", x++);}void qux(void) {printf("%d␣", x++);}int main(void) {int i, x = 4;
baz();
qux();
printf("%d␣", x++);for (i = 1; i <= 2; i++)int x = 9;
baz();
qux();
printf("%d␣", x--);}baz();
qux();
printf("%d␣", x);{

return 0;}
(A).
(C).

(B).
(D).

2 3 4 4 5 9 6 7 9 8 9 5
2 2 4 3 3 9 4 4 9 5 5 58

2 3 4 4 5 9 6 7 9 8 9 8
2 2 4 3 3 9 4 4 9 5 5 8

(x) 次のプログラムの出力結果を下の選択肢から 1 つ選べ。
123
45
678
910111213
14#include <stdio.h>void foo(int n) {if (n > 0) {foo(n - 3);
printf("%d␣", n);foo(n / 3);}}
int main(void) {foo(9);
return 0;}
(A).
(C).

(B).
(D).

2 6 3 1 9 1 3
3 1 9 1 3 6 29

1 3 9 2 6 1 3
3 1 6 2 9 3 1

（計算・下書き用紙）

10「プログラミング」インデンテーションについての約束事
http://guppy.eng.kagawa-u.ac.jp/2018/Programming/indentation.html より抜粋したものである。（ただし今回の問題に関係ない部分は割愛した。また、字下げ幅はオリジナルは 4 だが、ここでは紙幅の制限のため、3 とした。）
I. 原則として、一行には文は一つしか書かない。
II. ブレース（{〜}）の中は、外よりも 3 字分を字下げする。
III. 開きブレース（{）は if や else, while, for などのキーワードと同じ行に改行せずに書く。開きブレースのあとは何も書かず改行する。
IV. 閉じブレース（}）は if や while, for などのキーワードのはじめの文字と列をそろえて書く。
その行には閉じブレース以外には何も書かない。
• ただし、else . . . が続く場合は、閉じブレース（}）と同じ行に書く。
V. if 文, if 〜 else 文 や for 文, while 文などでは、選択されたり、繰り返したりされる文が一つだけの場合も、ブレース（{〜}）に囲む。
この約束事だけは、教科書のプログラム例は必ずしもそうなっていないので、特に注意する。

• ただし、else のあとにすぐ if 文が続く else if . . . というかたちは、 else { if . . . }とはしない。

（計算・下書き用紙）

2

プログラミング・期末テスト解答用紙 （2019 年 2 月 13 日）

学籍番号

氏名

(4 点)

I.
i n tm a i n ( v o i d )i n t

i ,j ;

r e t u r n0 ;{}(2 点 × 2)

II.
(i).
(ii).

III.

(4 点)

IV.

( 各 2 点)
(i).

(ii).

(iii).

(iv).

(v).

(vi).

(vii).

(viii).

(ix).

(x).
授業・テストの感想.................................................................................................
.................................................................................................
.................................................................................................
.................................................................................................
.................................................................................................
.................................................................................................
.................................................................................................
.................................................................................................
.................................................................................................
.................................................................................................
.................................................................................................
.................................................................................................
.................................................................................................
.................................................................................................

2