以下のプログラムは動作はするがインデンテーションが滅茶苦茶でプログラムの構造を正しく反映していない。 (そして、おそらく作成者の意図したようには動かない。) プログラムの構造を明確にするために「プログラミング」のインデンテーションの約束事(別紙)に厳密に従って(特に Ⅴ 番目のルールに注意)、必要に応じてブレースを挿入し、インデントしなおせ。ただし、 ブレース内の字下げは紙幅の制限のため 3文字分とせよ。
もちろん、プログラムの意味(実行結果)が変わらないようにすること。 (つまり、作成者の(よくわからない)意図を忖度するのではなく、 コンパイラーが解釈する通りにインデントすること。
解答は、最初の #include <stdio.h>
は省略せよ。また、
解答欄のスペースの都合で、(最後は別として)空行は入れずに記入せよ。
なお、putchar
は p r
のように省略してよい。
int main(void) { int i, j; for (i = 0; i < 9; i++) if (i % 2 == 0) for (j = 1; j < 9; j++) putchar('&'); else putchar('@'); putchar('*'); return 0; }
正解は以下の通りである。
int main(void) { int i, j; for (i = 0; i < 9; i++) { if (i % 2 == 0) { for (j = 1; j < 9; j++) { putchar('&'); } } else { putchar('@'); } } putchar('*'); return 0; }
次のプログラムは、「整数を入力してください。」と出力してから一つの 整数値を読み込んで、その 1/3 の値を小数第 3 位まで出力し、 もし入力した整数が、-1 以下か 101 以上のときは続けて「想定外の入力です。」 と出力するプログラムである。空欄を埋めて、プログラムを完成させよ。
#include <stdio.h> int main(void) { int n; printf("整数を入力してください。"); scanf("%d", &n); printf("その 1/3 は %.3f です。\n", (ⅰ) ); if ( (ⅱ) ) { printf("想定外の入力です。\n"); } putchar('\n'); return 0; }
実行例 1
実数を入力してください。12↵
その 1/3 は 4.000 です。
実行例 2
実数を入力してください。100↵
その 1/3 は 33.333 です。
実行例 3
実数を入力してください。-9↵
その 1/3 は -3.000 です。
想定外の入力です。
正解(例)とコメントは以下のとおりである。
番号 | 正解例 | コメント |
---|---|---|
(ⅰ) | n / 3.0 |
(double)n / 3 なども可 |
(ⅱ) | n < 0 || 100 < n |
n <= -1 || 101 <= n なども可 |
以下のプログラムの空欄に、
2つの double
型の引数 \(s\), \(p\) を受け取り、
\(\sqrt{s^2 - 4 p}\) を返す関数
double diff(double s, double p)
を定義せよ。(平方根を求めるライブラリー関数は sqrt
である。)
#include <stdio.h> #include <math.h>int main(void) { double s = 7, p = 10; printf("2数の和が %.2f、積が %.2f のとき、差は %.2f です。\n", s, p, diff(s, p)); return 0; }
このプログラムは
2数の和が 7.00、積が 10.00 のとき、差は 3.00 です。
と出力する。
正解は、以下の通り。
double diff(double s, double p) { return sqrt(s * s - 4 * p); }
次のプログラムの出力結果を下の選択肢より 1つ選べ。
#include <stdio.h> int main(void) { double x, y, z, w; x = ((double)2) / 5; printf("%f ", x); y = 2 / 5; printf("%f ", y); w = 5; z = 2 / w; printf("%f ", z); putchar('\n'); return 0; }
(A). | 0.000000 0.400000 0.400000 |
(B). | 0.400000 0.400000 0.000000 |
(C). | 0.400000 0.000000 0.400000 |
(D). | 0.400000 0.000000 0.000000 |
正解は、(C) である。
次のプログラムの出力結果を下の選択肢より 1つ選べ。
#include <stdio.h> int main(void) { int a = 2, b = 3, c = 5, d = 8; if (a < b) { a = b; } if (a < c) { a = c; } else if (a < d) { a = d; } printf("%d\n", a); return 0; }
(A). | 2 | (B). | 3 | (C). | 5 | (D). | 8 |
正解は (C) である。
次のプログラムの出力結果を下の選択肢より 1つ選べ。
#include <stdio.h> int main(void) { int i; for (i = 0; i < 6; i++) { printf(" %d", i); } printf("+%d\n", i); return 0; }
(A). | 0 1 2 3 4 5+6 |
(B). | 0 1 2 3 4 5+5 |
(C). | 0 1 2 3 4 5 6+6 |
(D). | 0 1 2 3 4 5 6+7 |
正解は (A) である。
次のプログラムの出力結果を下の選択肢より 1つ選べ。
#include <stdio.h> int main(void) { int i, j; for (i = 8; i > 0; i /= 2) { for (j = 9; j > 0; j /= 3) { printf("(%d,%d) ", i, j); } putchar('\n'); } return 0; }
(A) | (9,8) (9,2) (4,8) (4,2) (2,8) (2,2) (1,8) (1,2) |
(B). | (8,9) (8,4) (8,2) (8,1) (2,9) (2,4) (2,2) (2,1) |
(C). | (9,8) (9,4) (9,2) (9,1) (3,8) (3,4) (3,2) (3,1) (1,8) (1,4) (1,2) (1,1) |
(D). | (8,9) (8,3) (8,1) (4,9) (4,3) (4,1) (2,9) (2,3) (2,1) (1,9) (1,3) (1,1) |
正解は (D) である。
次のプログラムの出力結果を下の選択肢より 1つ選べ。
#include <stdio.h> int main(void) { int i, j, n = 5; for (i = 1; i <= n; i++) { for (j = i; j <= n; j++) { printf("%d", (j - i + 1) % 10); } putchar('\n'); } return 0; }
(A). |
1 23 345 4567 56789 |
(B). | 1 21 321 4321 54321 |
(C). |
12345 3456 567 78 9 |
(D). |
12345 1234 123 12 1 |
正解は (D) である。
次のプログラムの出力結果を下の選択肢より 1つ選べ。
#include <stdio.h> int main(void) { int n = 0; printf("%d ", n++); printf("%d ", n--); printf("%d ", --n); printf("%d ", ++n); printf("%d ", n); return 0; }
(A). | 0 1 0 -1 0 | (B). | 0 1 -1 0 0 | (C). | 1 0 0 -1 0 | (D). | 1 0 -1 0 0 |
正解は (B) である。
次のプログラムの出力結果を下の選択肢より 1つ選べ。
#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 + 1][i]); } return 0; }
(A). | 5 1 7 | (B). | 1 7 3 | (C). | 7 1 5 | (D). | 3 7 1 |
正解は (A) である。
次のプログラムの出力結果を下の選択肢から 1つ選べ。
#include <stdio.h> void bar(int x, int y[]) { int tmp = x; x = y[0]; y[0] = tmp; } int main(void) { int x = 3; int y[] = { 5 }; bar(x, y); printf("x = %d, y[0] = %d\n", x, y[0]); return 0; }
(A). | x = 3, y[0] = 5 | (B). | x = 3, y[0] = 3 |
|
(C). | x = 5, y[0] = 3 | (D). | x = 5, y[0] = 5 |
正解は (B) である。
次のプログラムの出力結果を下の選択肢より 1つ選べ。
#include <stdio.h> int x = 2; void baz(void) { static int x = 3; printf("%d ", x++); } void qux(void) { printf("%d ", x++); } int main(void) { int i, x = 5; baz(); qux(); printf("%d ", x++); for (i = 1; i <= 2; i++) { int x = 0; baz(); qux(); printf("%d ", x++); } baz(); qux(); printf("%d ", x); return 0; }
(A). | 3 2 5 3 3 0 3 4 0 3 5 1 | (B). | 3 2 5 4 3 0 5 4 0 6 5 1 |
|
(C). | 3 2 5 3 3 0 3 4 0 3 5 6 | (D). | 3 2 5 4 3 0 5 4 0 6 5 6 |
正解は (D) である。
次のプログラムの出力結果を下の選択肢から 1つ選べ。
#include <stdio.h> void foo(int n) { if (n < 10) { foo(n + 3); printf("%d ", n); foo(n * 2); } } int main(void) { foo(1); return 0; }
(A). | 9 3 5 7 9 1 9 3 5 7 9 | (B). | 7 4 8 1 8 5 2 7 4 8 |
|
(C). | 8 4 7 2 5 8 1 8 4 7 | (D). | 7 4 8 1 8 5 9 |
正解は (B) である。
下に示すように、正の整数 n をキーボードから受け取って、初項 1, 公比 2 の等比数列の
第 1 項から第 n 項までを表示するプログラムを作成せよ。ただし、一の位が 2 になる数は
代わりにそれに 1 を足した数を表示すること。
(n として負の数または 0
を受け取ったときは、改行のみ表示するか、もしくは何も表示しなくてよい。)
正の整数を入力してください: 4↵
1 3 4 8
実行例 2:
正の整数を入力してください: 15↵
1 3 4 8 16 33 64 128 256 513 1024 2048 4096 8193 16384
実行例 3:
正の整数を入力してください: 0↵
実行例 4:
正の整数を入力してください: 1↵
1
正解例は以下の通りである。
下に示すように、正の整数 n をキーボードから受け取って、ディスプレイ上に、
一辺の長さが n の左下直角三角形を表示するプログラムを作成せよ。文字は
各行ごとに 1, 2, 3, 4, …, 8, 9, 0, 1, 2,… (つまり、列番を
10 で割った余り)を表示するが、全体で 5 の倍数個目(5 個目、10 個目、
15 個目、20 個目、…)には代わりに「#
」を表示する。
(n として負の数または 0 を受け取ったときは何も表示しない、あるいは改行のみを表示する、
のいずれかで良い。)
正の整数を入力してください: 5↵
1
12
1#3
123#
1234#
実行例 2:
正の整数を入力してください: 13↵
1
12
1#3
123#
1234#
1234#6
123#567
1#3456#8
123#5678#
1234#6789#
1234#6789#1
123#5678#012
1#3456#8901#3
実行例 3:
正の整数を入力してください: 0↵
正解例は以下の通りである。
int
型の引数 \(n\) を受け取り、
次のように定義される数列
\[\begin{eqnarray}
a_0 & = & n \\
a_k & = & \frac{2 a_{k - 1}}{3} & (k > 0\; かつ\; a_{k - 1} が\, 3\, の倍数のとき)\\
a_k & = & \frac{a_{k - 1}}{2} & (k > 0\; かつ\; a_{k - 1} が\, 3\, の倍数でない\, 2\, の倍数のとき)\\
a_k & = & a_{k - 1} - 1 & (k > 0\; かつ\; a_{k - 1} が\, 3 \,の倍数でも\, 2\, の倍数でもないとき)\\
\end{eqnarray}
\]
の、初めて \(a_k = 0\) となる正の
整数 \(k\) を返す関数 int
foo(int n)
を定義せよ。\(n\) は 0 以上と仮定してよい。
例えば、\(n = 9\) のとき、\(\{ a_k \}\) は
\[a_0 = 9, a_1 = 6, a_2 = 4, a_3 = 2, a_4 = 1, a_5 = 0, a_6 = 0, a_7 = 0, \ldots\]
という数列なので、foo(9)
は 5 である。
main
関数は、以下のコードを使用して、確認せよ。
int main(void) { int i; for (i = 1; i <= 30; i++) { printf("foo(%d) = %d\n", i, foo(i)); } return 0; }
この main
関数の出力は次のようになる。
foo(1) = 1 foo(2) = 2 foo(3) = 3 foo(4) = 3 foo(5) = 4 foo(6) = 4 foo(7) = 5 foo(8) = 4 foo(9) = 5 foo(10) = 5 foo(11) = 6 foo(12) = 5 foo(13) = 6 foo(14) = 6 foo(15) = 6 foo(16) = 5 foo(17) = 6 foo(18) = 6 foo(19) = 7 foo(20) = 6 foo(21) = 7 foo(22) = 7 foo(23) = 8 foo(24) = 6 foo(25) = 7 foo(26) = 7 foo(27) = 7 foo(28) = 7 foo(29) = 8 foo(30) = 7
正解例は以下の通りである。
int
型の配列 v
と、
この配列の要素数を表す int
型の引数 no
をこの順に受け取り、
v
の隣り合う要素の差 v[i] - v[i - 1]
の絶対値が 5
以上になる回数を返す関数
int bar(const int v[], int no)
を定義せよ。例えば、
/* 差の絶対値が 5 以上の箇所を下線で示す。 */ int va[10] = {1, 6, 2, 4, 1, 5, 8, 2, 9, 7}; int vb[12] = {0, -6, -2, 6, -4, 2, 8, 4, 0, 2, 4, -2};
のとき、
bar(va, 10)
は 3、
bar(vb, 12)
は 6、
である。
正解例は以下の通りである。