第4回:関数


先週のポインタは,理解できましたか?メモリのアドレスを直接いじるというイメージだけ作っておいてください.

先週の復習

変数a,bに数字をキーボードから入力し,a+bを求めて表示するプログラムをポインタ変数を使って書き換えよ.

#include <stdio.h>

void main()
{
    int a,b;
    int *pa,*pb;

    pa = &a;
    pb = &b;

    scanf("%d", pa);
    scanf("%d", pb);

    printf("a + b = %d\n", *pa + *pb);
}


整数型配列に初期値として,(10,20,30,40,50)を設定したとき,全ての要素の値を表示するプログラムをループとポインタを用いて作成しなさい.

#include <stdio.h>

void main()
{
    int a[] = {10, 20, 30, 40, 50}, i;
    int *p;

    p = &a[0];

    for(i = 0; i < 5; i++){
        printf("%d番目の要素 %d\n", i+1, *(p+i));
    }
}

今日からは関数を取り上げます.C言語の関数の役割は,プログラムで頻繁に使われる部分を,一つのグループとして扱いやすくする仕組みです.


関数の考え方

材料(引数)を渡すと,レシピ(関数の定義)に基づいて調理し,料理(戻り値)を届けてくれる.


例:二つの数を入力すると,その和を表示するプログラムを作ってみよう

普通 関数版
#include <stdio.h>

void main()
{
    int a, b, sum;

    printf("一つ目の数を入力してください:");
    scanf("%d", &a);
    printf("二つ目の数を入力してください:");
    scanf("%d", &b);

    sum = a + b;        /* 和を求める */

    printf("二つの数の和は,%dです.",sum);
}
#include <stdio.h>

int wa(int c, int d)    /* 二つの数の和を求める関数の定義 */
{
    int x;

    x = c + d;

    return x;
}

void main()
{
    int a, b, sum;

    printf("一つ目の数を入力してください:");
    scanf("%d", &a);
    printf("二つ目の数を入力してください:");
    scanf("%d", &b);

    sum = wa(a, b);        /* 関数を呼び出す */

    printf("二つの数の和は,%dです.",sum);
}

関数を用いる場合,

    printf("二つの数の和は,%dです.", wa(a, b));

と書くこともできます.


引数と戻り値の関係


戻り値を持たない関数の例

#include <stdio.h>

void wanohyouji(int a, int b)    /* 二つの数の和を求め表示する関数の定義 */
{
    int x;

    x = a + b;

    printf("二つの数の和は,%dです.", x);
}

void main()
{
    int a, b, sum;

    printf("一つ目の数を入力してください:");
    scanf("%d", &a);
    printf("二つ目の数を入力してください:");
    scanf("%d", &b);
  
    wanohyouji(a, b);
}

【練習】

・長方形の二辺の長さを渡すと,面積を戻す関数を作成してみよう.

・円の半径を渡すと,面積を戻す関数を作成してみよう. 面積は,実数であることに注意.


【演習】

ある数 n の階乗 n! を求めるプログラムを,関数を用いて作成せよ

ただし,0! = 1 であることに注意.

できた人は、上の関数を利用して、m枚のカードからn枚選んで順に並べる場合の数(順列)を,自然数m, n を入力すると答えるプログラムを作成せよ.


プログラムには必ず,学年,組,番号,氏名を記入すること.