• 検索結果がありません。

Microsoft Word - no11.docx

N/A
N/A
Protected

Academic year: 2021

シェア "Microsoft Word - no11.docx"

Copied!
6
0
0

読み込み中.... (全文を見る)

全文

(1)

3. 関数

3.1 関数 関数は数学の関数と同じようなイメージを持つと良いでしょう。例えば三角関数の様に一つの実 数値(角度)から値を求めますし、対数関数の様に二つの値から一つの値を出すものもあるでしょう。 これをイメージしてもらえば結構です。つまり、何らかの値を渡し、それをもとに何かの作業や計 算を行い、その結果を返すのが関数です。C 言語の関数も基本は同じです。 まず、簡単に関数の記法です。return は途中にあってもよく、その場合はそれ以降は実行され ません。 一つの例として、一の位の数字を返す関数を作ります。 ex19.c /*一の位の数字の関数 */ #include <stdio.h> int lastdigit(int n); /* プロトタイプ宣言 */ int main(void) { int x; printf("整数を入力してください: ? "); scanf("%d",&x); printf("%d の一の位の数字は%d です。\n", x, lastdigit(x)); return(0); }

/* 戻り値の型が int 型、引数が int 型の関数 lastdigit を宣言 */ int lastdigit(int n) { return (n % 10); } log 2 2 4 cos 0 1 cos(0) = 1 log2 4 = 2 関数の戻り値の型 関数名(型 1 仮引数 1, 型 2 仮引数 2, ...) { 宣言と文 return (変数); }

(2)

ここで「int lastdigit(int n){ … }」の部分が関数を定義している部分、「lastdigit (x)」 が関数を呼び出す部分です。定義する部分で括弧の中にある変数を仮引数といい、呼び出す側で括 弧の中にある変数を実引数といいます。実引数の値が仮引数に渡されて、関数の中で使われます。 ところで、関数の定義は最後にあります。つまり、lastdigit(x) と関数を呼び出す段階で は lastdigit 関数の型や引数の数や型などがわかりません。したがって、この関数の呼び出しが 正しいかどうかの判断ができないのです。そこで、プロトタイプ宣言をおこなって、関数の型や引 数の型をあらかじめ教える必要があります。 使う時点で関数が定義されていない場合はプロトタイプ宣言をする のが原則です。 ところでこのプログラムの main の部分を見てみましょう int main(void) { int x; printf("整数を入力してください: ? "); scanf("%d",&x); printf("%d の一の位の数字は%d です。\n", x, lastdigit(x)); return(0); } ここの「int main(void)」も実は関数だったのです。つまり、 ・関数の名前は main ・引数はない(void はないことを表す特別の型) ・戻り値は int 型 である関数を定義していたのです。C では実行の際には必ず main 関数が呼ばれるのです。逆に言 えば main 関数がなければ、C のプログラムは実行できないということなのです。 さらに、少し考えてみましょう。ここでは printf を使っています。この printf は形からわか るように関数です。では、この関数はどこで定義されているのでしょうか? 残念ながらどこでも 定義されていません。では、どこかでプロトタイプ宣言されているのでしょうか? 一見ではどこ にもプロトタイプ宣言がされていないように見えますが、実はきちんとプロトタイプ宣言がされて いるのです。実は、「#include <stdio.h>」の部分ではヘッダーファイル stdio.h は読み込む という命令で、このヘッダーファイルの中に標準で用意されている関数のプロトタイプ宣言が書か れているのです。そのため、関数の型や引数の型がチェックすることができ、ゆえに関数を利用す ることができるのです。

(3)

もう少し簡単な例を出します。 ex20.c

/* 2乗を計算する関数・3乗を計算する関数 */ #include <stdio.h>

int sqr(int n); /* sqr 関数のプロトタイプ宣言 */ int cub(int n); /* cub 関数のプロトタイプ宣言 */ int main(void) { int x, y; printf("整数を入力してください:"); scanf("%d",&x); y = sqr(x); printf("%d の2乗は%d です。\n", x, y); printf("%d の3乗は%d です。\n", x, cub(x)); printf("%d の4乗は%d です。\n", x, sqr(y)); printf("%d の5乗は%d です。\n", x, y * cub(x)); printf("%d の6乗は%d です。\n", x, cub(sqr(x))); printf("%d の8乗は%d です。\n", x, sqr(sqr(y))); printf("%d の9乗は%d です。\n", x, cub(cub(x))); return(0); } /* sqr 関数の定義 */

int sqr(int n) {/* 戻り値の型が int 型、引数が int 型の関数 */ return (n * n);

}

/* cub 関数の定義 */

int cub(int n) {/* 戻り値の型が int 型、引数が int 型の関数 */ return (n * n * n); } ここのように、関数の結果を変数に入れて利用しても良いですし、関数の括弧の中に関数の呼び 出しを書いてもかまいません。 3.2 複数の引数をもつ関数 引数の数は1つだけでなく複数あってもかまいません。その場合は「 , 」を間において仮引数 を必要な数だけ並べます。呼び出す側でも、実引数をその数だけ並べなければなりません。 また、関数の中で、変数を宣言したり、if 文や for 文も利用できます。

(4)

ex21.c

/* べき乗を計算する関数 */ #include <stdio.h>

int power(int m, int n); /* プロトタイプ宣言 */ int main(void) { int x, y; printf("整数を入力してください: "); scanf("%d", &x); printf("何乗を計算しますか:"); scanf("%d", &y);

printf("%d の%d 乗は%d です。\n", x, y, power(x, y)); return(0);

}

/* power 関数の定義 */

int power(int m, int n) { int i, x = 1; for(i = 0; i < n; i++) { x *= m; } return (x); } 3.3 文字の関数 文字も数値でしたから、関数を作ることもできます。 ex22.c /* 文字の関数 */ #include <stdio.h> int kind(char c); /* プロトタイプ宣言 */ char lower(char c); int main(void) { char c; int x; printf("文字を入れてください : "); scanf("%c", &c); x = kind(c); printf("種類=%d\n", x); if(x == 1) {

(5)

/* kind 関数の定義 */ int kind(char c) {

if(c >= '0' && c <= '9') { return(0);

} else if(c >= 'A' && c <= 'Z') { return(1);

} else if(c >= 'a' && c <= 'z') { return(2); } else { return(3); } } char lower(char c) {

if(c >= 'A' && c <= 'Z') { c = c + 32; } return(c); } 戻り値は文字にするのか他のものにするのかをきちんと考える必要があります。 ex23.c /* 文字列の簡単な例 */ #include <stdio.h> char next_char(char c); int main(void) { char str[81]; /* 80 文字までの文字列が格納できるように */ int i; printf("文字列を入れてください:"); scanf("%s", str); /* ここは&str としないことに注意 */ for(i = 0; str[i] != '\0'; i++) {

str[i] = next_char(str[i]); } printf("1 文字ずらすと、%s\n", str); return (0); } char next_char(char c) { return(c + 1); }

(6)

練習問題 3.1 次は平成 23 年度の大学入試センター試験 数学 II・B の問題の一部である。 今回はまず、上の操作に当る関数、つまり、変換するための関数を f とおいて、 という関数を作りなさい。 ex24.c /* 関数で変換する */ #include <stdio.h> int f(int x); /* プロトタイプ宣言 */ int main(void) { int x; printf("調べる整数を入力してください"); scanf("%d", &x); printf("%d→%d", x, f(x)); return (0); } int f(int x) { } 練習問題 3.2 (ex25.c) 次は東京の電車の中にあった広告である。 f (x) = x2 (x が偶数) 3x +1 (x が奇数) ! " # $ #

参照

関連したドキュメント

例えば,立証責任分配問題については,配分的正義の概念説明,立証責任分配が原・被告 間での手続負担公正配分の問題であること,配分的正義に関する

P‐ \ovalbox{\tt\small REJECT}根倍の不定性が生じてしまう.この他対数写像を用いた議論 (Step 1) でも 1のp‐ \ovalbox{\tt\small REJECT}根倍の不定性が

線遷移をおこすだけでなく、中性子を一つ放出する場合がある。この中性子が遅発中性子で ある。励起状態の Kr-87

EU の指令 Restriction of the use of certain Hazardous Substances in Electrical and Electronic Equipment の略称。詳しくは以下の URL

膵管内乳頭粘液性腺癌、非浸潤性 Intraductal papillary mucinous carcinoma(IPMC), noninvasive 8453/2 膵管内乳頭粘液性腺癌、浸潤性 Intraductal papillary mucinous

これらの定義でも分かるように, Impairment に関しては解剖学的または生理学的な異常 としてほぼ続一されているが, disability と

2813 論文の潜在意味解析とトピック分析により、 8 つの異なったトピックスが得られ

・咽頭周囲リンパ節 para- and retropharyngeal nodes (4)側頸リンパ節 lateral cervical nodes. ① 浅頸リンパ節 superficial cervical nodes: