2014年度・プログラミング期末テストに対するコメント

ペーパーテストの解答

問題

正解

Ⅰ. (ⅰ).  %lf    (ⅱ).  &d    (ⅲ).  %f    (ⅳ).  (int)d   など
Ⅱ.  k = 7; k < 49; k += 7
Ⅲ.
double foo (double d) {
    return 0.5 * d + 2.5;
}

Ⅳ. (ⅰ). B   (ⅱ). C   (ⅲ). A   (ⅳ). D   (ⅴ). C   (ⅵ). B   (ⅶ). C   (ⅷ). B   (ⅸ). A   (ⅹ). D  

オンラインテストの評価

全体


  1. (必須)インデンテーション:
    提出ファイル名: feb13_1.c

    以下のプログラムは動作はする(はずだ)がインデンテーションが滅茶苦茶である。 「プログラミング」のインデンテーションの約束事に厳密に従ってブレースを追加し、意味を変えずにインデントしなおせ。 ブレース({})内の字下げは 4 文字分とせよ。 特に 5 番目のルール:

    iffor などでは、選択されたり、 繰り返したりされる文が一つだけの場合も、ブレース({})に囲む。
    に注意すること。 もちろんプログラムの動作は変えないこと。

    #include <stdio.h>
    
    int main(void) {
    int i;
    for (i = 0; i < 20; i++)
      if (i%5 == 0)
        printf("%d ", i+1);
          if (i%2 == 0) 
            printf("%d ", i-1);
              else 
                printf("%d ", i*2);
    return 0;
    }
    

  2. (必須)二重ループ:
    提出ファイル名: feb13_2.c

    下に示すように、段数を受け取って、* を繰返し表示して、 与えられた段数の三角形を描くプログラムを作成せよ。 1 行目は * が 1 つ、2 行目は 3 つ、3 行目は 5 つ、… というように、2つずつ * の数が増えていくようにせよ。

    実行例 1:
    何段ですか:3
    *
    ***
    *****
    
    実行例 2:
    何段ですか:7
    *
    ***
    *****
    *******
    *********
    ***********
    *************
    
    実行例 3:
    何段ですか:12
    *
    ***
    *****
    *******
    *********
    ***********
    *************
    ***************
    *****************
    *******************
    *********************
    ***********************
    
    実行例 4:
    何段ですか:0
    

    参考にするプログラム: List 4-18

  3. (必須)関数:
    提出ファイル名: feb13_3.c

    int 型の引数 m, n を受け取り、 以下のように出力する関数 void foo(int m, int n) を定義せよ。

    • mn のとき、m から n までの数(m, n を含む)を順に空白で区切って出力する。
      m > n のときは何も出力しない。)

      • 2 で割り切れる数には ! を後ろに付ける。

      • 5 で割り切れる数には ? を後ろに付ける。

      • 10 で割り切れる数には(!, ? に加えて) * を後ろに付ける。

    (以上の要件の一部を満たすだけで、部分点がつく場合もある。)

    なお、main関数は、以下のコードを使用して、確認せよ。

    /* … 略 … */
    
    int main(void) {
        int m, n; 
        printf("整数1を入力してください: ");
        scanf("%d", &m);
        printf("整数2を入力してください: ");
        scanf("%d", &n);
    
        foo(m, n);
        putchar('\n');
    
        return 0;
    }
    

    出力例は、以下のようになる。

    実行例 1:
    整数1を入力してください: 1
    整数2を入力してください: 10
     1 2! 3 4! 5? 6! 7 8! 9 10!?*
    
    実行例 2:
    整数1を入力してください: 10
    整数2を入力してください: 10
    10!?*
    
    実行例 3:
    整数1を入力してください: -10
    整数2を入力してください: 0
    -10!?* -9 -8! -7 -6! -5? -4! -3 -2! -1 0!?* 
    
    実行例 4:
    整数1を入力してください: 10
    整数2を入力してください: 0
    

    参考にするプログラム: (あえて言えば) List 4-12 List 6-7

  4. (必須)配列:
    提出ファイル名: feb13_4.c

    int 型の配列 vc を受け取り vc の中の、偶数の現れる添字を、 空白で区切ってすべて出力する関数 void fuga(const int vc[]) を作成せよ。 ただし、この関数は引数として配列の要素数を受け取らず、limits.h に定義されている INT_MIN の要素が現れたら、その直前の要素を配列の最後の要素と見なす。 (つまり、INT_MIN は偶数と見なさない。)

    なお、テストデータは以下のコードの断片を使用して、結果を確認せよ。

    #include <stdio.h>
    #include <limits.h>
    
    
    void fuga(const int vc[]) {
        /* … ここを考える … */
    }
    
    int vc1[] = {1, 2, 3, 4, 5, 6, INT_MIN};
    int vc2[] = {2, 4, 6, 8, 10, 12, 14, 16, INT_MIN};
    int vc3[] = {3, 7, 11, 15, 19, 23, 29, 31, INT_MIN};
    int vc4[] = {INT_MIN};
    
    int main(void) {
        printf("vc1 中の条件を満たす要素の添字は、");
        fuga(vc1);
        printf("です。\n");
        printf("vc2 中の条件を満たす要素の添字は、");
        fuga(vc2);
        printf("です。\n");
        printf("vc3 中の条件を満たす要素の添字は、");
        fuga(vc3);
        printf("です。\n");
        printf("vc4 中の条件を満たす要素の添字は、");
        fuga(vc4);
        printf("です。\n");
    
        return 0;
    }
    

    この出力結果は、以下のようになる。 (空白の入り方などは、この通りでなくてもよい。)

    vc1中の条件を満たす要素の添字は、 1 3 5 です。
    vc2中の条件を満たす要素の添字は、 0 1 2 3 4 5 6 7 です。 
    vc3中の条件を満たす要素の添字は、 です。
    vc4中の条件を満たす要素の添字は、 です。
    

    参考にするプログラム(あえて言えば): List 6-11, List 7-1


Koji Kagawa