期末テストはペーパーテストが 32 点満点、
オンラインテストが 8 点満点で採点する。
今回はテストであるので、NG というメッセージがあっても、 再提出する必要はない。
以下のプログラムは動作はするがインデンテーションが滅茶苦茶でプログラムの構造を正しく反映していない。 (そして、おそらく作成者の意図したように は動かない。) プログラムの構造を明確にするために「プログラミング」のインデンテーションの約束事(別紙)に厳密に従って (特にⅴ番目のルールに注意)、必要に応じてブレースを挿入し、 インデントしなおせ。ただし、この問題では、ブレース内の字下げは3文字分とせよ。
もちろん、プログラムの意味(実行結果)が変わらないようにすること。
解答は、最初の #include <stdio.h> は省略せよ。また、 解答欄のスペースの都合で、空行は入れずに記入せよ。なお、 putchar は p-----r、 while は w---e のように省略してよい。
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;
}
正解は以下の通りである。
#include <stdio.h>
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;
}
次のプログラムは、「実数を入力してください。」と出力してから一つの実数値を読み込んで、 その数を初項とし、以降の各項が前項の 0.5 倍 になる数列(公比 0.5 の等比数列)の、第 1 項から第 10 項まで表示するプログラムである。 空欄を埋めて、プログラムを完成させよ。
#include <stdio.h>
int main(void) {
int i;
double d;
printf("実数を入力してください。"); scanf("%lf", &d);
for ( ) {
printf("%.2f ", d);
;
}
putchar('\n');
return 0;
}
正解(例)とコメントは以下のとおりである。
| 番号 | 正解例 | コメント |
|---|---|---|
| (ⅰ) | i = 0; i < 10; i++ | |
| (ⅱ) | d /= 2 |
以下のプログラムの空欄に、
double discriminant(double a, double b, double c)
を定義せよ。(解答欄は横幅が狭いので、適当なところで改行を入れること。)
#include <stdio.h>int main(void) { double a = 1, b = 4, c = 6; printf("%.2f * x * x + %.2f * x + %.2f の判別式は %.2f です。\n", a, b, c, discriminant(a, b, c)); return 0; }
このプログラムは
1.00 * x * x + 4.00 * x + 6.00 の判別式は -8.00 です。
と出力する。
正解例は、以下の通りである。
double discriminant(double a, double b, double c) {
return b * b - 4 * a * c;
}
正解は以下の通りである。(問題文の掲載は省略する。)
(ⅰ). (D), (ⅱ). (C), (ⅲ). (B), (ⅳ). (C), (ⅴ). (B), (ⅵ). (D), (ⅶ). (A), (ⅷ). (B), (ⅸ). (A), (ⅹ). (D),
下に示すように、正の整数 n を受け取って、初項 3, 公差 7 の等差数列の 第 1 項から第 n 項までを表示するプログラムを作成せよ。ただし、一の位が 4 になる数は とばすこと。(n として負の数または 0 を受け取ったときは、改行のみ表示するか、もしくは何も表示しなくてよい。)
実行例 1:
正の整数を入力してください: 4↵
3 10 17
実行例 2:
正の整数を入力してください: 15↵
3 10 17 31 38 45 52 59 66 73 80 87 101
実行例 3:
正の整数を入力してください: 0↵
実行例 4:
正の整数を入力してください: 1↵
3
正解例は以下の通りである。
#include <stdio.h>
int main(void) {
int i, a = 3, n;
printf("正の整数を入力してください: "); scanf("%d", &n);
for (i = 0; i < n; i++) {
if (a % 10 != 4) {
printf("%d ", a);
}
a += 7;
}
putchar('\n');
return 0;
}
下に示すように、正の整数 n を受け取ってディスプレイ上に、 一辺の長さが n の左下直角三角形を表示するプログラムを作成せよ。文字は 9876543210 を繰返し使う(9 からはじめて 9ずつ増えていく数の一の位を使う)が、3 の倍数列目(3 列目、6 列目、9 列目、12 列目、 …)には代わりに「!」を表示する 。(n として負の数または 0 を受け取ったときは何も表示しない、あるいは改行のみを表示する、 のいずれかで良い。)
実行例 1:
正の整数を入力してください: 4↵
9
87
65!
32!0
実行例 2:
正の整数を入力してください: 12↵
9
87
65!
32!0
98!65
43!10!
87!54!2
10!87!54
32!09!76!
43!10!87!5
43!10!87!54
32!09!76!43!
実行例 3:
正の整数を入力してください: 0↵
正解例は以下の通りである。
#include <stdio.h>
int main(void) {
int i, j, k = 9, n;
printf("正の整数を入力してください: "); scanf("%d", &n);
for (i = 1 ; i <= n; i++) {
for (j = 1; j <= i; j++) {
if (j % 3 == 0) {
putchar('!');
} else {
printf("%d", k % 10);
}
k += 9;
}
putchar('\n');
}
return 0;
}
int 型の引数 \(n\) を受け取り、 \( (k - 1)! \le n < k! \) となる正の整数 \(k\) を返す関数 int foo(int n) を定義せよ。n は 1 以上と仮定してよい。
ただし、 \(k! = k \times (k - 1) \times \ldots \times 2 \times 1\) である。例えば、\(6! = 6 \times 5 \times 4 \times 3 \times 2 \times 1 = 720\) である。
main 関数は、以下のコードを使用して、確認せよ。
/* … 略 … */
int main(void) {
int i;
for (i = 1; i < 25; i++) {
printf("foo(%d) = %d\n", i, foo(i));
}
return 0;
}
この出力は次のようになる。
foo(1) = 2 foo(2) = 3 foo(3) = 3 foo(4) = 3 foo(5) = 3 foo(6) = 4 foo(7) = 4 foo(8) = 4 foo(9) = 4 foo(10) = 4 foo(11) = 4 foo(12) = 4 foo(13) = 4 foo(14) = 4 foo(15) = 4 foo(16) = 4 foo(17) = 4 foo(18) = 4 foo(19) = 4 foo(20) = 4 foo(21) = 4 foo(22) = 4 foo(23) = 4 foo(24) = 5
正解例は以下の通りである。
int foo(int n) {
int f = 1, i;
for (i = 1; f <= n; i++) {
f *= i;
}
return i - 1;
}
上の解答例より微妙に複雑になっている解答が多い。 単純な処理はそれに見当った単純なコードで定義できないと、処理が複雑になったときに、 コードが爆発的に複雑になってしまう。
int 型の配列 v と、 この配列の要素数を表す int 型の引数 no、 int 型の引数 u をこの順に受け取り、 v の要素のうち、u 以下のものの和を返す関数 int bar(const int v[], int no, int u)を定義せよ。例えば、
int va[10] = {1, 2, 2, 4, 1, 5, 8, 5, 9, 5};
のとき、 bar(va, 10, 0) は 0、 bar(va, 10, 1) は 2、 bar(va, 10, 2) は 6、
int vb[12] = {0, -2, 2, -2, 1, 2, 1, 5, 0, -2, 2, 1};
のとき、 bar(vb, 12, 0) は -6、 bar(vb, 12, 1) は -3、 bar(vb, 12, 2) は 3 である。
正解例は以下の通りである。
int bar(const int a[], int n, int u) {
int i, sum = 0;
for (i = 0; i < n; i++) {
if (a[i] <= u) {
sum += a[i];
}
}
return sum;
}
ほとんどの人ができていた。