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