2019 年度プログラミング・期末テスト・解答例

ペーパーテスト

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

    もちろん、プログラムの意味(実行結果)が変わらないようにすること。 (つまり、作成者の(よくわからない)意図を忖度するのではなく、 コンパイラーが解釈する通りにインデントすること。

    解答は、最初の #include <stdio.h> は省略せよ。また、 解答欄のスペースの都合で、(最後は別として)空行は入れずに記入せよ。 なお、putcharp 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;
    }
    
  2. 次のプログラムは、「整数を入力してください。」と出力してから一つの 整数値を読み込んで、その 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 です。
    想定外の入力です。
    
  3. 以下のプログラムの空欄に、

    • 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 です。
    

    と出力する。

  4. 以下の問に答えよ。
    1. 次のプログラムの出力結果を下の選択肢より 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) である。

    2. 次のプログラムの出力結果を下の選択肢より 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) である。

    3. 次のプログラムの出力結果を下の選択肢より 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) である。

    4. 次のプログラムの出力結果を下の選択肢より 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) である。

    5. 次のプログラムの出力結果を下の選択肢より 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) である。

    6. 次のプログラムの出力結果を下の選択肢より 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) である。

    7. 次のプログラムの出力結果を下の選択肢より 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) である。

    8. 次のプログラムの出力結果を下の選択肢から 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) である。

    9. 次のプログラムの出力結果を下の選択肢より 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) である。

    10. 次のプログラムの出力結果を下の選択肢から 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) である。

オンラインテスト


Koji Kagawa