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