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

ペーパーテストの解答

問題

正解

Ⅰ. (ⅰ).  %d    (ⅱ).  &n    (ⅲ).  1000 <= n && n <= 9999    など
Ⅱ.  p = 100; p > 0; p -= 7 など
Ⅲ.
double hoge (int n) {
    return 1.618 * n;
}

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

オンラインテストの解答例


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

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

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

    #include <stdio.h>
    
    int main(void) {
    int i, j;
    for (i = 0; i < 10; i++)
    for (j = 0; j < i; j++) 
    if (j % 3 == 0)
    printf("*");
    else 
    printf("&");
    for (j = 0; j< i; j++)
    printf("#");
    return 0;
    }
    

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

    下に示すように、段数を受け取って、数字、空白、*# を繰返し表示して、与えられた段数の三角形を描くプログラムを作成せよ。 1 列目に行番号の下一桁の数字を表示し、2 列目の空白のあと、 上から 1 行目は * が 1 つ、2 行目は # が 2 つ、3 行目は * が 3 つ、… というように、奇数行目は *、偶数行目は # が行番号と同じ数だけ繰り返すようにせよ。

    実行例 1:
    何段ですか:4
    1 *
    2 ##
    3 ***
    4 ####
    
    実行例 2:
    何段ですか:7
    1 *
    2 ##
    3 ***
    4 ####
    5 *****
    6 ######
    7 *******
    
    実行例 3:
    何段ですか:12
    1 *
    2 ##
    3 ***
    4 ####
    5 *****
    6 ######
    7 *******
    8 ########
    9 *********
    0 ##########
    1 ***********
    2 ############
    
    実行例 4:
    何段ですか:0
    

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

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

    秘密のルールを知っていなければ、整数を入力できない関数 foo を定義する。 つまり、2 つの整数の入力を読込み、2 つの数の和が 9999 のときは、 1 つめに入力された整数を返し、2 つの数の和が 9999 以外のときは、 2 つの整数の入力の読込みを繰り返す関数 int foo(void) を定義せよ。

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

    /* … 略 … */
    
    int main(void) {
        int m = foo(); 
        printf("あなたが入力した整数は %d です。\n", m); 
        return 0;
    }
    

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

    実行例 1:
    整数1を入力してください: 1234
    整数2を入力してください: 8765
    あなたが入力した整数は 1234 です。
    
    実行例 2:
    整数1を入力してください: 1111
    整数2を入力してください: 7777
    整数1を入力してください: 2222
    整数2を入力してください: 7777
    あなたが入力した整数は 2222 です。
    
    実行例 3:
    整数1を入力してください: 0
    整数2を入力してください: 9999
    あなたが入力した整数は 0 です。
    
    実行例 4:
    整数1を入力してください: 10000
    整数2を入力してください: 0
    整数1を入力してください: 10000
    整数2を入力してください: -1
    あなたが入力した整数は 10000 です。
    

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

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

    int 型の配列 vc を受け取り vc の中の、vc の正の要素の最大値を返す関数 maxArr(const int vc[]) を作成せよ。 ただし、この関数は引数として配列の要素数を受け取らず、 0 または負の要素が現れたら、その直前の要素を配列の最後の要素と見なす。

    なお、vc 中に正の要素がない場合は戻り値として 0 を返すようにせよ。

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

    #include <stdio.h>
    
    int maxArr(const int vc[]) {
        /* … ここを考える … */
    }
    
    int vc1[] = {1, 6, 3, 4, 2, 5, -1};
    int vc2[] = {8, 5, 6, 2, 3, 7, 3, 2, -1};
    int vc3[] = {3, 7, 4, 12, 19, 2, 29, 31, -1};
    int vc4[] = {-1};
    
    int main(void) {
        printf("vc1 中の最大値は %d です。\n",  maxArr(vc1));
        printf("vc2 中の最大値は %d です。\n",  maxArr(vc2));
        printf("vc3 中の最大値は %d です。\n",  maxArr(vc3));
        printf("vc4 中の最大値は %d です。\n",  maxArr(vc4));
    
        return 0;
    }
    

    この出力結果は、以下のようになる。

    vc1 中 の最大値は 6 です。
    vc2 中 の最大値は 8 です。
    vc3 中 の最大値は 31 です。
    vc4 中 の最大値は 0 です。
    

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


Koji Kagawa