期末テストはペーパーテストが 32 点満点、
オンラインテストが 8 点満点で採点する。
今回はテストであるので、NG というメッセージがあっても、 再提出する必要はない。
以下のプログラムは動作はするがインデンテーションが滅茶苦茶で プログラムの構造を正しく反映していない。プログラムの構造を明確にするために 「プログラミング」のインデンテーションの約束事(問題用紙末尾に記載)に厳密に従って (特にⅤ番目のルールに注意)、必要に応じてブレースを挿入し、 インデントしなおせ。この問題については、ブレース内の字下げは3文字分とせよ。
もちろん、プログラムの意味(実行結果)が変わらないようにすること。
解答は、最初の #include <stdio.h> は省略せよ。また、 解答欄のスペースの都合で、空行は入れずに記入せよ。なお、 putchar は p-----r、 while は w---e、 return は r----nのように省略してよい。
int main(void) { int i = 1, j = 1; while (i++ < 5) while (j++ < 6) if (j % 2 == 0) putchar('@'); putchar('*'); if (i % 3 == 0) putchar('\n'); return 0; }
正解は以下の通りである。
#include <stdio.h> int main(void) { int i = 1, j = 1; while (i++ < 5) { while (j++ < 6) { if (j % 2 == 0) { putchar('@'); } } } putchar('*'); if (i % 3 == 0) { putchar('$'); } putchar('\n'); return 0; }
次のプログラムは、 「整数を入力してください。」と出力してから一つの整数値を読み込んで、 その数を初項とし、以降の各項が前項の -2 倍 になる数列(公比 -2 の等比数列)を、 -1000 以上 1000 以下の範囲に収まるあいだ表示するプログラムである。 空欄を埋めて、プログラムを完成させよ。
#include <stdio.h> int main(void) { int n; printf("整数を入力してください。"); scanf("%d", ); while ( ) { printf("%d ", n); n *= -2; } putchar('\n'); return 0; }
正解(例)とコメントは以下のとおりである。
番号 | 正解例 | コメント |
---|---|---|
(ⅰ) | &n | |
(ⅱ) | -1000 <= n && n <= 1000 | ≤ とか ≥ と書いている人が意外に多いが、そんな演算子は C 言語にない。 && のところを || としている間違いが多い。 「&」 が「〜かつ〜」なのは、覚え間違えないようがないと思うが…。 |
以下のプログラムの空欄に、
double average3(double x, double y, double z)
を定義せよ。(解答欄は横幅が狭いので、適当なところで改行を入れること。)
#include <stdio.h>int main(void) { double a = 1.0, b = 1.5, c = 3.0; printf("%f と %f と %f の平均は %f です。\n", a, b, c, average3(a, b, c)); return 0; }
正解例は、以下の通りである。
double average3(double x, double y, double z) { return (x + y + z) / 3; }
分母を 3.0 や (double)3 と書いても間違いではないが、 必要ない。
正解は以下の通りである。(問題文の掲載は省略する。)
(ⅰ). (C), (ⅱ). (C), (ⅲ). (D), (ⅳ). (B), (ⅴ). (A), (ⅵ). (D), (ⅶ). (C), (ⅷ). (C), (ⅸ). (A), (ⅹ). (D),
正の整数 n を入力として受け取って、 1 から n までの整数を空白で区切って表示するが、
正の整数を入力して下さい: 10↵ !1 !2 3 !4 5 6 !7 8 9 !10実行例 2:
正の整数を入力して下さい: 25↵ !1 !2 3 !4 5 6 !7 8 9 !10 11 !12 !13 14 15 !16 !17 18 !19 20 21 !22 23 24 !25
正解例は以下の通りである。
#include <stdio.h> int main(void) { int i, n; printf("正の整数を入力して下さい: "); scanf("%d", &n); for (i = 1; i <= n; i++) { if (i % 3 == 1 || i % 5 == 2) { putchar('!'); } printf("%d ", i); } putchar('\n'); return 0; }
下に示すように、0 以上の段数 n を入力として受け取って、 以下の条件をみたす数
を 10 で割った余りを表示して、与えられた段数の三角形を表示するプログラムを作成せよ。
何段ですか:5↵ 1 34 567 7890 90123
何段ですか:7↵ 1 34 567 7890 90123 123456 3456789
何段ですか: 0↵
正解例は以下の通りである。
#include <stdio.h> int main(void) { int i, j, n; printf("何段ですか: "); scanf("%d", &n); for (i = 0; i < n; i++) { int k = i * 2; for (j = 0; j <= i; j++) { printf("%d", ++k % 10); } putchar('\n'); } return 0; }
int 型の引数 a, n を受け取り、 初項は \(a_1 = a\)、それ以外の項は \(a_k = 2 \times a_{k - 1} - 1\) \((k \ge 2)\) で定義される数列の、\(a_1\) から \(a_n\) までを空白区切りで出力する関数 void foo(int a, int n) を定義せよ。nは 1 以上と仮定してよい。
main 関数は、以下のコードを使用して、確認せよ。
/* … 略 … */ int main(void) { int a, n; printf("初項を入力してください: "); scanf("%d", &a); printf("項数を入力してください: "); scanf("%d", &n); foo(a, n); putchar('\n'); return 0; }
出力例は、以下のようになる。
実行例 1:初項を入力してください: 2↵ 項数を入力してください: 5↵ 2 3 5 9 17実行例 2:
初項を入力してください: -1↵ 項数を入力してください: 10↵ -1 -3 -7 -15 -31 -63 -127 -255 -511 -1023実行例 3:
初項を入力してください: 3↵ 項数を入力してください: 6↵ 3 5 9 17 33 65実行例 4:
初項を入力してください: 10↵ 項数を入力してください: 1↵ 10
正解例は以下の通りである。
void foo(int a, int n) { int i; for (i = 0; i < n; i++) { printf("%d ", a); a = 2 * a - 1; } }
上の解答例より微妙に複雑になっている解答が多い。 単純な処理はそれに見当った単純なコードで定義できないと、処理が複雑になったときに、 コードが爆発的に複雑になってしまう。
2 つのint 型の(同じ要素数の)配列 va, vb と、 これら 2 つの配列の要素数を表す int 型の引数 noをこの順に受け取り、 同じ添字の要素を比べて va のほうが vb より大きくなる (va[i] > vb[i] となる)回数を数える関数 int countLarger(const int va[], const int vb[], int no) を定義せよ。
main 関数は、countLarger を適用した結果を表示するようにせよ。
#include <stdio.h> /* countLarger の定義 */ void printArr(int arr[], int no) { int j; printf("{"); for (j = 0; j < no; j++) { printf("%d, ", arr[j]); } printf("};\n"); } #define N … int main(void) { int va[N] = { … }; int vb[N] = { … }; printf("va = "); printArr(va, N); printf("vb = "); printArr(vb, N); printf("va が勝ったのは %d 回です。\n", countLarger(va, vb, N)); return 0; }
実行例 1:(#define N 10)
va = {9, 2, 3, 7, 0, 1, 5, 4, 6, 8, }; vb = {2, 8, 7, 0, 1, 9, 5, 6, 4, 3, }; va が勝ったのは 4 回です。
実行例 2:(#define N 5)
va = {5, 4, 3, 2, 1, }; vb = {5, 4, 3, 2, 1, }; va が勝ったのは 0 回です。
実行例 3:(#define N 6)
va = {2, 4, 5, 10, 3, 8, }; vb = {1, 3, 4, 9, 2, 7, }; va が勝ったのは 6 回です。
正解例は以下の通りである。
int countLarger(int va[], int vb[], int no) { int i, n = 0; for (i = 0; i < no; i++) { if (va[i] > vb[i]) { n++; } } return n; }
ほとんどの人ができていた。