2009年度期末テスト

注意事項

以下の問に答えよ。

  1. 繰返し:
    提出ファイル名: jul23_1.c

    scanfなどで、 正の整数 n を受け取って、下の実行例に示すようにディスプレイ上に高さと幅が n の、 文字の三角形を表示するプログラムを作成せよ。 ただし、 ij で割り切れるときは、 ij 列めの文字は ‘*’、そうでないときは ‘_’になるようにせよ。

    実行例1:
      正の整数を入力して下さい: 4
      *
      **
      *_*
      **_*
    
    実行例2:
      正の整数を入力して下さい: 10
      *
      **
      *_*
      **_*
      *___*
      ***__*
      *_____*
      **_*___*
      *_*_____*
      **__*____*
    
  2. 文字列:
    提出ファイル名: jul23_2.c

    文字列 strを引数として受け取り、 strの中に現われる文字 '!'を その時点での'!'の出現回数に置き換えて (つまり、1回目の出現は '1'に、 2回目の出現は'2'に、…、置き換えて) 出力する関数 void countBang(const char *str)を定義せよ。 (ただし、配列の記法str[i]や、それと同等の*(str+i) という記法は使わず、ポインタのインクリメントを使うこと。)

    テンプレートとしては次のようなものを使用せよ。 (このどこかにcountBangの定義を挿入する。)

    #include <stdio.h>
    
    int main(void) {
        countBang("! little, ! little, ! little Indians.\n");
        countBang("! ! !, dah.\n");
        countBang("!!!!!!!!!!!!.\n");
    
        return 0;
    }
    
    実行例:
    1 little, 2 little, 3 little Indians.
    1 2 3, dah.
    123456789101112.
    
  3. 構造体とポインタ:
    提出ファイル名: jul23_3.c

    分数を n, dの 2つのint型のメンバを持つ構造体 struct ratioとして定義し、次のような関数 bakersTransformationを定義せよ。

    ratio構造体へのポインタを受け取り、そのメンバの値が、
    • n*2 ≤ dならば、n2*nで、
    • n*2 > dならば、n2*(d-n)で、
    置き換える。

    テンプレートとしては次のようなものを使用せよ。 (このどこかに struct ratiobakersTransformation の定義を挿入する。)

    #include <stdio.h>
    
    int main(void) {
        struct ratio r;
        int i, n;
    
        printf("初期値を ?/? の形式で入力して下さい。 ");
        scanf("%d/%d", &r.n, &r.d); 
        printf("繰返し回数は? ");
        scanf("%d", &n); 
        
        for (i=0; i<n; i++) {
            bakersTransformation(&r);
            printf("%d/%d ", r.n, r.d);
        }
        printf("\n");
    
        return 0;
    }
    
    実行例1:
    初期値を ?/? の形式で入力して下さい。 1/5
    繰返し回数は? 10
    2/5 4/5 2/5 4/5 2/5 4/5 2/5 4/5 2/5 4/5 
    
    実行例2:
    初期値を ?/? の形式で入力して下さい。 3/11
    繰返し回数は? 10
    6/11 10/11 2/11 4/11 8/11 6/11 10/11 2/11 4/11 8/11 
    
    実行例3:
    初期値を ?/? の形式で入力して下さい。 6/17
    繰返し回数は? 10
    12/17 10/17 14/17 6/17 12/17 10/17 14/17 6/17 12/17 10/17 
    
    実行例3:
    初期値を ?/? の形式で入力して下さい。 7/23
    繰返し回数は? 15
    14/23 18/23 10/23 20/23 6/23 12/23 22/23 2/23 4/23 8/23 16/23 14/23 18/23 10/23 20/23 
    

Koji Kagawa