期末テストはペーパーテストが 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; }
ほとんどの人ができていた。