今週で,関数をマスターしてしまおう.まずは,演習の回答から
西暦(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 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...