以下のプログラムは動作はするがインデンテーションが滅茶苦茶でプログラムの構造を正しく反映していない。 (そして、おそらく作成者の意図したようには動かない。) プログラムの構造を明確にするために「プログラミング」のインデンテーションの約束事(別紙)に厳密に従って(特に Ⅴ 番目のルールに注意)、必要に応じてブレースを挿入し、インデントしなおせ。ただし、 ブレース内の字下げは紙幅の制限のため 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、
である。
正解例は以下の通りである。