第7回:関数(4)

今週で,関数をマスターしてしまおう.まずは,演習の回答から


演習の回答

西暦(2002年)などを入力すると,和暦(平成13年)を答える関数を作成せよ.

明治 1868-1911
大正 1912-1925
昭和 1926-1988
平成 1989-2002

#include <stdio.h>

void wareki(int seireki)
{
    if ((seireki >= 1868) && (seireki <= 1911)){
        printf("明治%d年です\n", seireki - 1867);
    }else if ((seireki >= 1912) && (seireki <= 1925)){
        printf("大正%d年です\n", seireki - 1911);
    }else if ((seireki >= 1926) && (seireki <= 1988)){
        printf("昭和%d年です\n", seireki - 1925);
    }else if ((seireki >= 1989) && (seireki <= 2002)){
        printf("平成%d年です\n", seireki - 1988);
    }else{
        printf("範囲外です\n");
    }
}

void main()
{
    int seireki;

    printf("和暦を求めたい西暦を入力してください:");
    scanf("%d", &seireki);

    wareki(seireki);
}

よく使う関数を用意しておこう.

1.二つの整数を渡すと,大きい方を答える関数
2.整数の2乗を計算する関数
3.整数の3乗を計算する関数
4.整数のn乗を計算する関数
5.整数の階乗を計算する関数

main関数の部分はこんな感じ.あとは,関数の定義部分を作ってみよう.

#include <stdio.h>

int large(int a, int b)
{
    if(a>b) {
        return a;
    }else{
        return b;
    }
}

int square(int a)
{
    a *= a;
    return a;
}

int cube(int a)
{
    a *= square(a);
    return a;
}

int power(int a, int n)
{
    int i, b;

    b = 1;

    if(n == 0) {
        return 1;
    }else{
        for(i=0; i<n; i++){
            b *= a;
        }
        return b;
    }
}

int factorial(int a)
{
    int i, b;

    b = 1;

    for(i=0; i<a; i++){
        b *= a-i;
    }
    return b;
}

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

    printf("aの値を入力してください:");
    scanf("%d", &a);
    printf("bの値を入力してください:");
    scanf("%d", &b);
    printf("n乗のnの値を入力してください:");
    scanf("%d", &n);  

    printf("大きい数の値は%d\n", large(a, b));
    printf("aの2乗は%d\n", square(a));
    printf("bの3乗は%d\n", cube(b));
    printf("aの%d乗は%d\n", n, power(a, n));
    printf("bの階乗は%d\n", factorial(b));
}

(アドレス参照の練習)

円の半径を入力すると,円の面積と円周の長さの二つの値を返す関数を作ってみよう.

ヒント:値を返してもらう場所も,関数に伝える必要がある.

#include <stdio.h>
int square(int a)
{
    a *= a;
    return a;
}

void en(int r, float *s, float *l)
{
    *s = 3.14 * square(r);
    *l = 2 * 3.14 * r;
}

void main()
{
    int r;
    float s, l;

    printf("円の半径を入力してください:");
    scanf("%d", &r);

    en(r, &s, &l);

    printf("円の面積は%.2fです\n", s);
    printf("円周の長さは%.2fです\n", l);
}


前期の期末試験で作成した,入力されたアルファベットの小文字の文字列をabc順に並べ替えるプログラムを関数を用いて書き換えよ.

手順:

   文字数を数える関数を用いて,文字数を数える

   二つの文字を入れ替えるswapという関数を作る

   swap関数をもちいて,配列の並べ替えをするsortという関数を作る

(ヒント)関数の中から,すでに定義してある別の関数を呼び出して使うことができる.

#include <stdio.h>

void swap(char *s, int i, int j)
{
    char t;

    t = s[i];
    s[i] = s[j];
    s[j] = t;
}

int moji_nagasa(char *str)
{
    int i;

    for(i=0; str[i] != 0x00; i++);

    return i;
} 
 
void sort(char *s)
{
    int i, j, n;

    n = moji_nagasa(s);

    for(i=0; i<n-1; i++){
        for(j=i+1; j<n; j++){
            if(s[i]>s[j]){
                swap(s, i, j);
            }
        }
    }
}


void main()
{
    char s[256], t;
    int n, i, j;

    //文字列の入力
    printf("単語を入力してください:");
    scanf("%s", s);
    printf("入力された文字列は%sです.\n", s);

    // 並び替え
    sort(s);

    printf("結果 : %s\n", s);
}


再帰呼び出し

C言語の関数は,ある関数の中で,自分自身を呼び出すことができます.これを,再帰呼び出し(recursive call)と呼びます.

値nの階乗を求めるプログラムを,再帰呼び出しで作ってみましょう.

演習で作成したループを使って,n!を求めるプログラムを参考に,再帰を用いて,n!を求めるプログラムを作成する.

考え方:n! = n X (n-1)!

#include <stdio.h>

int factorial(int a)
{
    int b;

    if(a==1){
        return 1;
    }else{
        b = a * factorial(a-1);
        return b;
    }
}

void main()
{
    int b;

    printf("bの値を入力してください:");
    scanf("%d", &b);

    printf("bの階乗は%d\n", factorial(b));
}


演習

フィボナッチ数列を求めるプログラムを作る

フィボナッチの数列とは,(n番目の値)=(n-1番目の値)+(n-2番目の値)

1 1 2 3 5 8 13 21 34...