2018 年度プログラミング・中間テスト・解答例

全体

ペーパーテスト

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

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

    解答は、最初の #include <stdio.h> は省略せよ。また、 解答欄のスペースの都合で、(最後は別として)空行は入れずに記入せよ。

    int main(void) {
        int i, j;
        for (i = 0; i < 3; i++)
        for (j = 0; j < 4; j++) 
            if (j % 2 == 0) putchar('@'); 
            else if (i % 3 == 0) putchar('*'); 
            else putchar('#'); 
            if (j % 3 == 1) putchar('\n');
        return 0; 
    }
    
  2. 次のプログラムは一つの実数値を読み込んで、 それを 3 倍した値と、10 倍して(切り捨てて)整数に変換した値を表示するプログラムである。

    たとえば、3.31 を入力すると、

        それを 3 倍した値は 9.930000 です。
        それを 10 倍して切り捨てた値は 33 です。
    

    と出力する。 空欄を埋めて、プログラムを完成せよ。

    int main(void) {
        double num;
        printf("実数を入力して下さい: ");
        scanf("%lf    ", ∓num );
        printf("それを 3 倍した値は %f    です。\n",   num * 3);
        printf("それを 10 倍して切り捨てた値は %d    です。\n",   (int)(num * 10)  );
        return 0;
    }
    
    
  3. 次のプログラムの出力を書け。

    int main(void) {
        int k = 30;
    
        if (k % 6 == 0) {
            printf("A ");
        } 
        if (k % 2 == 0) {
            printf("B ");
        } else if (k % 3 == 0) {
            printf("C ");
        } 
        if (k % 5 == 0) {
            printf("D ");
        }
        printf("\n");
        return 0;
    }
    
  4. 以下の空欄を埋めて、 1 以上 15 以下 の整数のみを入力として受付け、 範囲外の整数が入力された場合は読込みを繰り返すプログラムを完成させよ。

    int main(void) {
        int n;
        do {
            printf("1 〜 15 の整数を入力してください: ");
            scanf("%d", &n);
        }  while (                         ); 
        printf("徳川幕府第 %d 代将軍は、", n);
        switch (n) {
          case 1:  printf("家康");   break;
          case 2:  printf("秀忠");   break;
          case 3:  printf("家光");   break;
          case 4:  printf("家綱");   break;
          case 5:  printf("綱吉");   break;
          /* 途中略 */
          case 15: printf("慶喜");   break;
        }
        printf("です。\n");
        return 0;
    }
    
  5. 以下のプログラムは、整数の組のデータを (i,j) という形式で出力する。 このプログラムの出力を書け。ただし、 空白は明示的に空白記号(␣)を、 改行は明示的に矢印(↓)を書くこと。
    int main(void) {
        int i, j, n = 4;
        for (i = 1; i <= n; i++) {
            for (j = i; j < 2 * i; j++) {
                printf("(%d,%d) ", i, j);
            }
            printf("\n");
        }
        return 0;
    }
    
    • 正解は以下の通りである。

      (1,1)␣↓
      (2,2)␣(2,3)␣↓
      (3,3)␣(3,4)␣(3,5)␣↓
      (4,4)␣(4,5)␣(4,6)␣(4,7)␣↓
      
    • 最後にもう一列付け足してしまう次のような誤りがやや多かった。

      (1,1)␣(1,2)␣↓
      (2,2)␣(2,3)␣(2,4)␣↓
      (3,3)␣(3,4)␣(3,5)␣(3,6)␣↓
      (4,4)␣(4,5)␣(4,6)␣(4,7)␣(4,8)␣↓
      

      for (j = i; j < 2 * i; i++) …」という形は j が 2 * i になったときには繰返しを抜けることに注意する。

オンラインテスト


Koji Kagawa