C プログラミング (C Programming)

[2020/05/31, H.Aman]

[8] 関数(1)【中級クラス】演習課題

提出〆切は 6/4(金)の 14:10 です.

  • 演習 1

    サンプルプログラム①を別名(ex01.c)にコピーし, それを次のように編集しなさい:
    • 関数の名前を print_all から print_sum へ変更する.
    • 関数 print_sum の内容を変更して,1 から n までの合計を表示させ, その後で改行するようにする.
    具体的には,main の中身を
    int main(void){
    
       print_sum(5);
       print_sum(10);
       print_sum(15);
    
       return 0;
    }
    として,実行結果が
    1 から 5 までの合計は 15 です
    1 から 10 までの合計は 55 です
    1 から 15 までの合計は 120 です
    となるようにしなさい.
    【注意すべきこと】
    print_sum での計算で,等差数列の和の公式を使ってはいけません.
    また,繰り返しで合計を求める前に,合計値のための変数を 0 に初期化するのを忘れないこと.

    ちなみに上の main の内容は
    int main(void){
       int i;
    
       for ( i = 5; i <= 15; i+= 5){
          print_sum(i);
       }
    
       return 0;
    }
    と書いてもよい(←演習 2 のヒント)
  • 演習 2

    サンプルプログラム②を別名(ex02.c)にコピーし, それを次のように編集しなさい:
    • 関数 power の内容は変更しない
    • main 内で power の呼出しを for 文か while 文で繰り返して, x の 1 乗,x の 2 乗, x の 3 乗, ..., x の y 乗をすべて表示させなさい.(上のヒントを参照)
    例えば,x = 5, y = 4 の場合,実行結果が
    5 の 1 乗は 5 です
    5 の 2 乗は 25 です
    5 の 3 乗は 125 です
    5 の 4 乗は 625 です
    となるようにしなさい.
  • 演習 3

    サンプルプログラム③を別名(ex03.c)にコピーし, それを次のように編集しなさい:
    • 関数 print_array はサンプルプログラムでの動作に加え, 最後に全要素の合計値と平均値(小数点以下第 2 位まで)も表示する.
    例えば,入力が 10, 5, 3, 8, 7 であった場合,
    [0] 10
    [1] 5
    [2] 3
    [3] 8
    [4] 7
    合計値は 33 です
    平均値は 6.60 です
    となるようにしなさい.

    さらに,SIZE を 100 に変更してコンパイルをやり直し,以下のデータファイルでも実行してみなさい.
    【実行方法】
    a < data3-1.txt
    data3-1.txt の場合の合計値は -641, 平均値は -6.41 である.

    演習用データ 1 (data3-1.txt) / 2 (data3-2.txt) / 3 (data3-3.txt)

    【注意すべきこと】
    マクロ SIZE の定義以外の場所で 5 や 100 といった具体的な数値を書いてはいけません(すべて SIZE と書くこと).
    そうしないとマクロを使う意味がなくなってしまいます.
    なお,提出するプログラムでは SIZE を 100 としなさい.
  • 演習 4

    サンプルプログラム④を別名(ex04.c)にコピーし, それを次のように編集しなさい:
    • 関数 print_Y, print_N で表示される内容を 「合格」,「不合格」がより分かりやすいものに改良しなさい. (内容は各自の自由とする)

余裕のある人は

  • 演習 1【発展課題】

    上の演習 1 で作った print_sum を改良し, 単に合計だけでなく,偶数のみの合計と奇数のみの合計も表示させなさい.
    こちらはソースファイル名を ex01e.c としなさい.

    (実行例)
    1 から 5 までの合計は 15 です(偶数のみ 6, 奇数のみ 9)
    1 から 10 までの合計は 55 です(偶数のみ 30, 奇数のみ 25)
    1 から 15 までの合計は 120 です(偶数のみ 56, 奇数のみ 64)
  • 演習 2【発展課題】

    関数 power は y が負の整数の場合に対応できていない. これにも対応できるように改良しなさい.ただし,x > 0 とする.
    なお,この場合は答えが実数になることもあるので,計算結果は double 型で扱うことにし,表示は %f で行いなさい(桁数指定は不要).
    こちらはソースファイル名を ex02e.c としなさい.

    【ヒント】y < 0 の場合は割り算を繰り返すことになる.

    (実行例)x = 5, y = -4 とした場合,
    5 の -4 乗は 0.001600 です
  • 演習 3【発展課題】

    関数 print_array を改良し,上記の演習 3 の動作に加え, 各要素の順位(最大値が 1 位)も表示させなさい.
    こちらはソースファイル名を ex03e.c としなさい.

    (実行例)入力が 10, 5, 3, 8, 7 であった場合(ただし SIZE は 5),
    10 5 3 8 7
    [0] 10 (1位)
    [1] 5 (4位)
    [2] 3 (5位)
    [3] 8 (2位)
    [4] 7 (3位)
    合計値は 33 です
    平均値は 6.60 です

    SIZE を 100 として,上の data3-1.txt で実行した場合,1 位は 488 となります.
    【注意すべきこと】
    提出するプログラムではマクロ SIZE を 100 としなさい.