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

ペーパーテストの解答

問題

正解

Ⅰ. (ⅰ).  &p    (ⅱ).  p < 0 || 100 < p    (ⅲ).  break   
Ⅱ.  i = 1; i <= 100; i += 3  など
Ⅲ.
 double corge(double x, double y) {
     return 2 * x * y / (x + y);
 }

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

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

問題


  1. 提出ファイル名: feb10f_1.c

    以下のプログラムは動作はする(はずだ)がインデンテーションが滅茶苦茶である。 (つまり、プログラマが恐らく意図している通りには動かない。) プログラミングのインデンテーションの約束事に厳密に従って(特に 5 番目のルール「選択されたり、繰り返したりされる文が一つだけの場合も、ブレース({})に囲む」に注意)、 プログラムの意味が変らないように(つまり、 プログラマのミスがあらわになるように)インデントしなおせ。 ブレース内の字下げは 4 文字分とせよ。

    #include <stdio.h>
    
    int main(void) {
        int c, i;
    
        while ((c = getchar()) != EOF) 
            for (i = 0; i < 3; i++)
                putchar(c);
                putchar('!');
            putchar('\n');
    
        return 0;
    }
    

  2. (必須)繰返し:
    提出ファイル名: feb10f_2.c

    下に示すように、段数 n を入力として受け取って、 奇数段目には 1 から n まで 1 つずつ増えていく数(を10で割った余り)を 偶数段目には n から 1 まで 1 つずつ減っていく数(を10で割った余り)を 表示して、与えられた段数の正方形を描くプログラムを作成せよ。

    何段ですか:4
    1234
    4321
    1234
    4321
    
    何段ですか:1
    1
    
    何段ですか:12
    123456789012
    210987654321
    123456789012
    210987654321
    123456789012
    210987654321
    123456789012
    210987654321
    123456789012
    210987654321
    123456789012
    210987654321
    
    何段ですか:7
    1234567
    7654321
    1234567
    7654321
    1234567
    7654321
    1234567
    

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

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

    月日を入力する関数 inputDate を定義する。 まず、「月(1 から 12 の整数)を入力して下さい: 」というメッセージを出力して、 1 から 12 の範囲の整数として「月」を読込み(範囲外の整数が入力されたときは、 もう一度メッセージを出力して読み込むところに戻る。 1 から 12 が入力されるまで何度でも繰り返す。) 次に、「日(1 から 31 の整数)を入力して下さい: 」というメッセージを出力して、 1 から 31 の範囲の整数として「日」を読込み(範囲外の整数が入力されたときは、 もう一度メッセージを出力して読み込むところに戻る。 1 から 31 が入力されるまで何度でも繰り返す。) 「月」×100 + 「日」を返す、引数のない関数 int inputDate(void) を定義せよ。 つまり、12 と 31 がこの順に入力されたときは 1231 を返し、 4 と 1 がこの順に入力されたときは 401 を返す。

    なお、2月30日や 4月31日などが入力できてしまうが、 今回の問題ではそれで構わない。

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

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

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

    実行例 1:
    月(1 から 12 の整数)を入力して下さい: 2
    日(1 から 31 の整数)を入力して下さい: 10
    あなたが入力した日付は 2 月 10 日です。
    
    実行例 2:
    月(1 から 12 の整数)を入力して下さい: 13
    月(1 から 12 の整数)を入力して下さい: 10
    日(1 から 31 の整数)を入力して下さい: 24
    あなたが入力した日付は 10 月 24 日です。
    
    実行例 3:
    月(1 から 12 の整数)を入力して下さい: 1
    日(1 から 31 の整数)を入力して下さい: 0
    日(1 から 31 の整数)を入力して下さい: 1
    あなたが入力した日付は 1 月 1 日です。
    
    実行例 4:
    月(1 から 12 の整数)を入力して下さい: 13
    月(1 から 12 の整数)を入力して下さい: 12
    日(1 から 31 の整数)を入力して下さい: 32
    日(1 から 31 の整数)を入力して下さい: 31
    あなたが入力した日付は 12 月 31 日です。
    

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

  4. (必須)関数と配列:
    提出ファイル名: feb10f_4.c

    要素数 no の 2 つのint 型の配列 va, vb を受け取り、 va[0]vb[0] を、 va[i]vb[i] - vb[i - 1] (i が 1,…, (no - 1)のとき) を代入する関数 void calcDiff(int va[], const int vb[], int no) を定義せよ。

    main 関数は、次のように元の配列と calcDiff を適用した結果を表示するようにせよ。

    #include <stdio.h>
    #define N …
    
    /* calcDiff の定義 */
    
    void printArr(int arr[], int no) {
        int j;
        printf("{");		
        for (j = 0; j < no; j++) {
            printf("%d, ", arr[j]);
        }
        printf("};\n");
    }
    
    int main(void) {
        int i;
    
        int orig[N] = { … }; 
        int dest[N]; 
    
        printf("orig = "); 
        printArr(orig, N);    
        calcDiff(dest, orig, N);
        printf("dest = "); 
        printArr(dest, N);    
    
        return 0;
    }
    

    実行例 1:

    #define N 10
    
    int orig[N] = { 3, 7, -4, 2, 8, 6, -9, 1, 5, 0 };
    
    

    の場合、

    orig = {3, 7, -4, 2, 8, 6, -9, 1, 5, 0, }; 
    dest = {3, 4, -11, 6, 6, -2, -15, 10, 4, -5, };
    

    実行例 2:

    #define N 5
    
    int orig[N] = { 1, 2, -3, -4, 5 };
    

    の場合、

    orig = {1, 2, -3, -4, 5, }; 
    dest = {1, 1, -5, -1, 9, }; 
    

    実行例 3:

    #define N 3
    
    int orig[N] = { 3, 2, 1 };
    

    の場合、

    orig = {3, 2, 1, }; 
    dest = {3, -1, -1, }; 
    

Koji Kagawa