8章 関数のお話

http://www.geocities.jp/ky_webid/c/008.html

関数です。ある一連の処理を一まとめにしたものが関数。

今まで使用していたprintf等も関数です。

関数は自作することも可能とのこと。

ふむふむ。読み進めること5分。

関数の引数の定義の仕方のところで少し躓く。

引数が無ければ、今までのように空白にするか「void」と記述します。C言語の規格上は、空白にした場合と、voidと書いた場合とでは意味が異なります。そのため、voidと明示する方が適切です。

引数を定義するときに空白の場合とvoidと書いた場合とでは規格上意味が違うとのこと。しかしどう意味が違うのか語られてない。

Googleで色々調べてみた物の、結局違いがわからなかった。読み進めていけばいずれ分かる日が来るのだろうか。


というところで練習問題

問題1

キーボードから整数の入力を受け取って、それを10倍した値を返す関数を作って下さい。

入力の受け取りは前回習ったscanfを使う。

int kakeru10 (int num) {
    return num * 10;
}

int main () {
    int num;
    
    scanf("%d", &num );
    printf("入力した値 = %d\n", num );
    printf("10かけた値 = %d\n", kakeru10(num) );
    return 0;
}

受け取って10かけて返すだけ。

答え合わせ
int getnum(void) {
    int input;

    printf( "整数を入力して下さい\n" );
    scanf( "%d", &input );
    return input * 10;      /* 10倍して返す */
}

ちょっと問題の意図を読み間違えた。全部自作関数でやってくれってことねorz

問題2

変数名 = 関数名( 実引数 ); という形は代入式ということになります。ならば次のような使い方も可能なはずです。

num = myprint( 10 ) + 10;  /* myprint関数の戻り値を+10してから、変数numに代入 */

実際に試してみて下さい。

試せということなので適当なmyprintを作って試してみた

int myprint(int num) {
    printf("%d\n",num);
    return num;
}

int main () {
    int num;
    num = myprint( 10 ) + 10; 
    myprint(num);
}
$ main
10
20

確かにうまくいってる模様。

問題3

円の面積を求めるプログラムを、できるだけ自作関数を多く使って作って下さい。最低限、以下のことを守って下さい。

  • 円の半径をキーボードから入力させる関数を作る
  • 円の半径を計算する関数を作る
  • 結果を画面に表示する関数を作る

なお、円の面積の公式は、「面積 = 半径 × 半径 × 3.14」とします。また、半径はfloat型で扱うものします。

おお、何だか問題文が長いぞ。難しそうだ。

float input () {
    float input;
    scanf("%f",&input);
    return input;
}

float keisan (float hankei) {
    float pi = 3.14;
    return hankei * hankei * pi;
}

void myprint(float num) {
    printf("%f\n",num);
}

int main () {
    float num;
    num = input();
    num = keisan(num);
    myprint(num);
}
$ main
3
28.260000

多分大丈夫のはず。半径が3の円の面積は28.26。あってるよね。

答え合わせ

だいたいあってた。でもinputの値と計算後の値で変数分けてるのはやっぱわかりやすくするためだろうか。

今度から俺もそうしよう。