プログラミング
期末テスト（ペーパーテスト）問題用紙 （訂正済）（2023 年 02 月 08 日）

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

I. 以下のプログラムは動作はするがインデンテーションが滅茶苦茶でプログラムの構造を正しく反映していない。（そして、おそらく作成者の意図したようには動かない。）プログラムの構造を明確にするために「プログラミング」のインデンテーションの約束事（別紙）に厳密に従って（特に 5 番目のルールに注意）、必要に応じてブレースを挿入し、インデントしなおせ。
プログラムの意味（実行結果）が変わらないようにすること。（つまり、作成者の（よくわからない）意図を忖度するのではなく、コンパイラーが解釈する通りにインデントすること。）
解答は、最初の #include <stdio.h> は省略せよ。また、解答欄のスペースの都合で、（最後は別として）空行は入れずに記入せよ。なお putchar は p-----r のように省略してよい。
1 int main(void) {2 int k;3 for (k = 0; k < 8; k++)4 if (k % 2 == 0)
5 putchar('!');
6 else if (k % 3 != 0)
7 putchar('#');
8 else9 putchar('$');
10 putchar('%');
11 putchar('\n');12 return 0; }II. 次のプログラムは、「整数を入力してください。」 と出力してから一つの 整数値を読み込んで、その数を初項（第 1 項）とし、以降の各項が前項の -2 倍になる数列（公比 -2 の等比数列）を第 10 項まで、ただし「0 以下である」か、または「5 で割った余りが 1 でない」項のみ表示するプログラムである。このプログラムは、
実行例 1:
整数を入力して下さい: 1↵-2 4 -8 -32 64 -128 -512
実行例 2:
整数を入力して下さい: -3↵-3 -12 24 -48 -192 384 -768
実行例 3:
整数を入力して下さい: 0↵
0 0 0 0 0 0 0 0 0 0と出力する。空欄を埋めて、プログラムを完成せよ。
1 int main(void) {2int i, n;3
printf("整数を入力して下さい: "); scanf("%d", &ｎ);
4for ((ⅰ)) {5if ((ⅱ)) {6789101112 }printf("%d ", n);}n *= -2;}
putchar('\n');return 0;

III. 以下のプログラムの空欄 (ⅰ) に、double 型の引数 a と b を受け取り、 (a + 1) を返す関数
2bdouble foo(double a, double b)を定義せよ。（m を求める関数は double pow(double m , double n) である。）
n1 #include <stdio.h>
2 #include <math.h>3(ⅰ)

4 int main(void) {5printf("0.44 と 0.25 に対する foo の値は %f です。\n",6foo(0.44, 0.25));
7return 0;
8 }このプログラムは、次のように出力する。
0.44 と 0.25 に対する foo の値は 1.200000 です。
IV. 以下の問に答えよ。
â‘´ 次のプログラム（の断片）は、0.333333 か 0.000000 と表示する。このうち、0.333333 と表示されるものに○を 0.000000 と表示されるものに×を記せ。
(A).

(B).

(C).

double z;
double z;
double z;z = ((double)1) / 3; z = (double)(1 / 3); z = 0.0 + 1 / 3;
printf("%f", z);printf("%f", z);printf("%f", z);
(D).

(E).

(F).

double z;z = 1 / (3 * 1.0);
printf("%f", z);

int x = 3;
double z = 1 / x;printf("%f", z);double y = 3;
double z = 1 / y;printf("%f", z);

(G).

(H).

double z;z = 1 / 3;
printf("%f", z);double z;z = 1 / 3.0;
printf("%f", z);â‘µ 次のプログラム（の断片）のうち「2」と必ず表示するものに○を「2」と表示するとは限らないものに×を記せ。
(A). putchar('5' - '3');(C). printf("%d", '5' - '3');(B). putchar('5' - 3);(D). printf("%d", '5' - 3);

V. 次のプログラムはどのように出力するか？ 空欄 (ⅰ) 〜 (ⅳ) を埋めて完成させよ。
1 int main(void){
2int x = 010;3int y = 10;
4
int z = 0x10;
5
6
printf("%o\t%o\t%o\n", x, y, z);7
printf("%d\t%d\t%d\n", x, y, z);
8
printf("%x\t%x\t%x\n", x, y, z);9return 0;
10 }
出力
(ⅰ)

10

12(ⅱ)

10(ⅲ)

(ⅳ)

a

10

VI. 以下の問に答えよ。

â‘´ 次のプログラムの出力結果を下の選択肢より 1 つ選べ。
1 int main(void) {2
int a, b;34
a = 2; b = 3;
5
a = b + 2;
6
b = 2 * b - 1;
7
printf("a = %d, b = %d\n", a, b);8
9return 0;
10 }(A). a = 5, b = 1(C). a = 3, b = 1(B). a = 5, b = 5(D). a = 7, b = 5

â‘µ 次のプログラムの出力結果を下の選択肢より 1 つ選べ。
1 int main(void) {2int a = 30;
3if (a % 2 == 0) {4printf("A ");5}
6if (a % 3 == 0) {7printf("B ");8}9if (a % 5 == 0) {10printf("C ");11}12printf("D\n");13
return 0;
14 }(A). A D(B). A B D(C). A C D(D). A B C D(E). B D(F). C D(G). B C D(H). Dâ‘¶ 次のプログラムの出力結果を下の選択肢より 1 つ選べ。
1 int main(void) {2int k = 5;3
4printf("%d ", k++);5printf("%d ", ++k);6printf("%d ", k--);7printf("%d ", --k);8printf("\n");910
return 0;
11 }(A). 5 7 7 5(B). 6 6 6 6(C). 5 7 6 6(D). 6 6 7 5

â‘· 次のプログラムの出力結果を下の選択肢より 1 つ選べ。
1 int main(void) {2int i;3for (i = 8; i > 1; i /= 2) {4printf(" %d", i);5}6printf("#%d\n", i);7
return 0;
8 }(A). 8 4 2 1#0(B). 8 4 2 1#1(C). 8 4 2#2(D). 8 4 2#1

â‘¸ 次のプログラムの出力結果を下の選択肢より 1 つ選べ。
1 int main(void) {2
int i, j;
3for (i = 0; i < 8; i += 2) {4for (j = 1; j < 10; j *= 2) {5
printf("(%d,%d) ", i, j);6}
7putchar('\n');8}
9return 0;
10 }(0,1) (0,2) (0,4) (0,8)(2,1) (2,2) (2,4) (2,8)(A). (4,1) (4,2) (4,4) (4,8)(6,1) (6,2) (6,4) (6,8)(8,1) (8,2) (8,4) (8,8)(B).

(0,1) (0,2) (0,4) (0,8)(2,1) (2,2) (2,4) (2,8)(4,1) (4,2) (4,4) (4,8)(6,1) (6,2) (6,4) (6,8)(0,1) (2,1) (4,1) (6,1) (8,1)(0,1) (2,1) (4,1) (6,1)(0,2) (2,2) (4,2) (6,2) (8,2)(0,2) (2,2) (4,2) (6,2)
(C).
(D).
(0,4) (2,4) (4,4) (6,4) (8,4)(0,4) (2,4) (4,4) (6,4)(0,8) (2,8) (4,8) (6,8) (8,8)(0,8) (2,8) (4,8) (6,8)

â‘¹ 次のプログラムの出力結果を下の選択肢より 1 つ選べ。
1 int main(void) {2
int i, j, n = 5;
3
4
for (i = 1; i <= n; i++) {5for (j = n; j >= i; j--) {6
printf("%d", (j - i + 1) % 10);7}8putchar('\n');9}10
11
return 0;
12 }5554321
54321
5445
5432
4321
(A). 543(B). 345(C). 543(D). 321
5432
2345
5421
54321
12345
51
1112345
12345
1221
1234
2345
(E). 123(F). 321(G). 123(H). 345
1234
432112451234554321
15â‘º 次のプログラムの出力結果を下の選択肢より 1 つ選べ。
1 int main(void) {2int i, j, k;
3
4for (i = 0; i < 4; i++) {5if (i % 3 == 2) continue;
6for (j = 0; j < 3; j++) {7if (j % 3 == 1) continue;
8
printf("(%d,%d),", i, j);9}10for (k = 0; k < 3; k++) {11if (k % 3 == 1) break;12
printf("(%d,%d),", i, k);
13}
14}
15
return 0;
16 }(A). (0,0),(0,0),(0,2),(1,0),(1,0),(1,2),(B). (0,0),(0,0),(1,0),(1,0),(3,0),(3,0),(C). (0,0),(0,2),(0,0),(1,0),(1,2),(1,0),(D). (0,0),(0,2),(0,0),(0,2),(1,0),(1,2),(1,0),(1,2),(E). (0,0),(0,0),(0,2),(1,0),(1,0),(1,2),(3,0),(3,0),(3,2),(F). (0,0),(0,2),(0,0),(1,0),(1,2),(1,0),(3,0),(3,2),(3,0),â‘» 次のプログラムの出力結果を下の選択肢から 1 つ選べ。
1 int main(void){2
int a[4][4] = { {0, 1, 2, 3}, {4, 5, 6, 7},
3{8, 9, 0, 1}, {2, 3, 4, 5} };4for (int i = 1; i <= 2; i++) {5printf("%d ", a[i + 1][i]);6}7putchar('\n');8
return 0;
9 }(A). 1 6(B). 5 0(C). 9 4(D). 4 9â‘¼ 次のプログラムの出力結果を下の選択肢より 1 つ選べ。
1 void bar(int a[], int b) {2a[0]--;
3b--;
4 }
5
6 int main(void){
7int s[] = { 9 };8
int t = 9;9bar(s, t);
10printf("%d %d\n", s[0], t);11
return 0;
12 }(A). 8 9(B). 9 9(C). 9 8(D). 8 8â‘½ 次のプログラムの出力結果を下の選択肢より 1 つ選べ。
1 int x = 3;2
3 void hoge(void) {4
static int y = 5;
5
int z = 7;
6
printf("(%d,%d,%d)", ++x, ++y, ++z);7 }8
9 void fuga(void) {10
static int y = 5;
11
int z = 7;
12
printf("(%d,%d,%d)", --x, --y, --z);
13 }14
15 int main(void) {16
int i, j;17
for (i = 0; i < 2; i++) {18hoge();19fuga();20}
21
putchar('\n');22
return 0;
23 }(A). (4,6,8)(2,4,6)(5,7,8)(1,3,6) (B). (4,6,8)(2,4,6)(5,7,9)(1,3,5)(C). (4,6,8)(3,4,6)(4,7,8)(3,3,6) (D). (4,6,8)(3,4,6)(4,6,8)(3,4,6)(E). (4,6,8)(3,4,6)(4,7,9)(3,3,5) (F). (4,6,8)(3,5,6)(4,6,8)(3,5,6)

â‘¾ 次のプログラムの出力結果を下の選択肢より 1 つ選べ。
1 int x = 10;
2
3 void baz(void) {4printf("%d ", --x);
5 }6
7 int main(void) {8int i, j;
9for (i = 0; i < 2; i++) {10int x = 6;
11baz();
12
printf("%d ", --x);13for (j = 0; j < 2; j++) {14
int x = 3;
15baz();
16
printf("%d ", --x);
17}
18baz();
19
printf("%d ", --x);
20}
21baz();
22
printf("%d ", --x);23
putchar('\n');24
25
return 0;
26 }(A). 5 4 2 1 2 1 0 -1 5 4 2 1 2 1 0 -1 -2 -3(B). 5 4 3 2 2 2 1 0 5 4 3 2 2 2 1 0 -1 -2(C). 9 5 8 2 7 2 6 1 5 5 4 2 3 2 2 1 1 0(D). 9 5 8 2 7 2 6 1 5 5 4 2 3 2 2 1 1 9(E). 9 5 8 2 7 2 6 4 5 5 4 2 3 2 2 4 1 0(F). 9 5 8 2 7 2 6 4 5 5 4 2 3 2 2 4 1 3(G). 9 5 8 2 7 2 6 4 5 5 4 2 3 2 2 4 1 9â‘¿ 次のプログラムの出力結果を下の選択肢より 1 つ選べ。
1 void qux(int n) {2if (n < 8) {3qux(n + 2);
4printf("%d ", n);5qux(2 * n - 1);
6}7 }8
9 int main(void) {10qux(2);11putchar('\n');12
13
return 0;
14 }(A). 7 5 7 5 3 7 6 4 2(C). 6 4 7 2 7 5 3 7 5(B). 6 7 4 7 5 7 5 3 2(D). 5 7 3 5 7 2 7 4 6(E). 2 4 6 7 3 5 7 5 7(F). 2 3 5 7 5 7 4 7 6â’€ 次の Python プログラムの出力結果を下の選択肢から 1 つ選べ。
1 x = 15
2 if x % 3 == 0:3
print("A", end=" ")4
print("B", end=" ")5 if x % 4 == 0:6print("C", end=" ")7
print("D", end=" ")8 else:9
print("E", end=" ")10
print("F", end=" ")11 print("G", end=" ")(A). A B(B). A B G(C). A B C D(D). A B C D G(E). A B E F(F). A B E F G

â’ 次の Python プログラムの出力結果を下の選択肢から 1 つ選べ。
1 print([(i, j) for i in range(1, 5)
2for j in range(i, 2 * i)
3if (i + j) % 2 == 1])(A). [(2, 3), (3, 4), (4, 5), (4, 7)](B). [(2, 1), (2, 3), (3, 2), (3, 4)](C). [(1, 2), (2, 3), (3, 4), (3, 6), (4, 5), (4, 7)](D). [(1, 2), (2, 3), (3, 4), (3, 6)]

「プログラミング」インデンテーションについての約束事
http://guppy.eng.kagawa-u.ac.jp/2022/Programming/indentation.htmlより抜粋したものである。（ただし今回の問題に関係ない部分は割愛した。）
0. 原則として、一行には文は一つしか書かない。
1. ブレース（{ 〜 }）の中の文は、外よりも 4 字分を字下げする。
2. 一つのファイルで空白文字とタブ文字を混ぜない。（タブ文字を使わずに空白文字だけで字下げする。あるいは空白文字を使わずにタブ文字だけで字下げする。）
3. 開きブレース（{）は if や else, switch, do, while, for などのキーワードと 同じ行に改行せずに書く。開きブレースのあとは何も書かず改行する。
4. 閉じブレース（}）は対応する if や switch, do, while, for などのキーワードのはじめの文字と列をそろえて書く。 その行には閉じブレース以外には何も書かない。
ただし、else … や do 〜 while 文の while … は閉じブレース（}）と同じ行に続けて書く。（else や do 〜 while 文の while は、新しい文の始まりではないことに注意する。）
5. if 文, if 〜 else 文 や for 文, while 文, do 〜 while 文などでは、選択されたり、繰り返したりされる文が一つだけの場合も、 ブレース（{〜}）に囲む。 この約束事だけは、 教科書のプログラム例は必ずしもそうなっていないので、 特に注意する。
ただし、else の対象が一つの if 文の場合の else if … というかたちは、 else {if … } とはしない。
良いif (n > 0) {printf("正です。\n");} else if (n == 0) {printf("0です。\n");} else {printf("負です。\n");}悪いif (n > 0) {printf("正です。\n");} else {if (n == 0) {printf("0です。\n");} else {printf("負です。\n");}}プログラミング・期末テスト解答用紙（2023 年 02 月 08 日）
学籍番号

氏名

（4 点）

I.
i n t

m a i n ( v o i d )i n t{k ;r e t u r n

0 ;}（2 × 2 点）

II.
(ⅰ)
(ⅱ)

（4 点）

III.

(ⅰ)

（2 × 2 点）

IV.
(1)

(A)

(B)

(C)

(D)

(2)

(A)

(B)

(C)

(D)

(E)

(F)

(G)

(H)

（0.5 × 4 点）

V.
(ⅰ)

(ⅱ)

(ⅲ)

(ⅳ)
（1 × 14 点）

VI.
(1)

(2)

(3)

(4)

(5)

(6)

(7)

(8)

(9)

(10)

(11)

(12)

(13)

(14)

授業・テストの感想