用意されている関数・標準関数を使ってみよう

さて、関数じゃ、関数じゃ。

・・・なんか喜んでない?

気にしない、気にしない!

一休み、一休み・・・

・・・こらっ!寝るんじゃない!今日のノルマはまだこなしておらんぞ!

長老がのせたんでしょ!

はん?

慌てない、慌てない、一休み一休みって。一休さんと語呂合わせしたんでしよ?

・・・そういう事にはすぐピンとくるんじゃな、お前さんの頭は。

どうせ・・

まあとにかく気を取り直して、と。

まずは、絶対値を返す関数absじゃ。
実行文
#include <stdio.h> #include <stdlib.h> main() { int a; a=-10; printf("1:a=%d\n",a); a=abs(-50); printf("2:a=%d\n",a); printf("3:a=%d\n",abs(-80)); }
2行目の「stdlib.h」の読み込みはabs関数を使うのに必要(今は深く考えない)
実行結果
1:a=-10
2:a=50
3:a=80
チェックポイント

ま、あえて説明する必要もなかろう。
このabs関数のようにあらかじめ用意されている関数はたくさんあるが、自分で作ることもできるのじゃ。

げげげーーーーー
関数を自作してみよう

手始めに、2つの数値を比較させて人きい数値を返すという関数を作ってみるかの。
命名はmax関数とでもしようかの。

うへ~い☆
実行文
#include <stdio.h> int max(int カズ1,into カズ2); //関数のプロトタイプ main() { printf("main=オオキイカズ=%d\n\n",max(10,20)); printf("main=オオキイカズ=%d\n\n",max(30,40)); } int max(){ //max関数ここから int オオキイカズ; //関数の中だけで使う変数の宣言 printf("*** max start ***\n"); printf("カズ1=%d カズ2==%d\n\n",カズ1,カズ2); if (カズ1>カズ2) { オオキイカズ=カズ1; } if (カズ1<カズ2) { オオキイカズ=カズ2; } printf("main=オオキイカズ=%d\n\n",オオキイカズ); printf("*** max end ***\n"); return (オオキイカズ); //数値を返す } //max関数の終わり
実行結果
*** max start ***
カズ1=10 カズ2==20
オオキイカズ=20
*** max end ***
main オオキイカズ=20
*** max start ***
カズ1=30 カズ2==40
オオキイカズ=40
*** max end ***
main オオキイカズ=40
チェックポイント

上の様にmax関数に二つ数値が渡り、その関数内で大きさを比較され、returnで大きい方の数値を返される・・・と。

ほうほう、プロトタイプ・・篠原製イングラム型量産機・・・・・

なんじゃ、そりゃ?まお、よい。どうせろくな方に頭が回っておらんのじゃろ。

・・・・・・

とにかくじや、まずこういう形のこの関数を使うとmainに入る前に宣言して、mainのプログラムの後に関数のプログラムを書き加える、と。
まあ、こんな感じで覚えておけばよいじゃろ?

・・・そんなもん?

習うより慣れよって言ってじゃな・・・お前さんの場合、深く考えない方がよいじゃろ。
mainにあるmax(10,20)とmax関数の型max(int カズ1,int カズ2)と形が同じじゃろ?
じゃからmax関数に渡すんじゃなと判断され、関数に数値が渡されるんじゃ。
こういった関数に渡す値の事を『引数(ひきすう)』というんじゃ。
でもって、関数から値を返すには『return』を用いるのじゃ。ここでは、関数内だけで使うオオキイカズという変数に入っている値をな。
式を直接() 内に書いてもいいんじゃぞ。

ふ~ん・・・メインルーチンとサブルーチンのようなもん?

う~ん・・・正確には違うんじゃが、まあ、お前さんの頭にはそうインプットしておいた方が覚えれるかもしれんな。

まずプロトタイプの宣言をして、mainで関数を呼んで、関数内で処理させて、その値をmainに戻すってことでしょ?

そうじゃ、お前さんとしちゃ上出来じゃ。

というわけで、ちょっとまとめてみるかの。
関数の作り方
関数のプロトタイプを書く
型 関数名(型 引数1,型 引数2・・・);
int max(int カズ1,int カズ2);
int型の値を返します
関数の名前はmaxです
int型(整数型)の値を関数に与えるよ
関数の基本形
型 関数名(型 引数1,型 引数2・・・);
関数内だけで使う変数の宣言
なんらかの処理
return(戻り値);
}

関数の基本はもうちょっと続くんじゃよ。

えーっ!まだやるの?眠いよう~・・・・。
まとめだったから今日はこれで終わったと思ったのに~…。

もう少しがんばるんじゃ。道は長いんじゃぞ!

ぶうぶう!Booing!
戻り値のない関数

とりあえず下の実行文と実行結果を見るのだぞい。
実行文
#include <stdio.h> void kansu(int kazu); void main() { kansu(2); kansu(10); } void kansu(int kazu) { printf("%d^2=%d\n",kazu*kazu); }
実行結果
2^2=4
10^2=100
チェックポイント

どうかな、気がついた事を言ってみなされ。

・・・う~んと、voidなんてものがついてる.
・・・それと、returnがないよ!?

そうじゃ、そうじゃ、よく気がついたの。
関数の中には戻り値のないものもあるんじゃ。
そういった関数の場合、型をvoidとするんじゃ。

いいね、それって。いただいてよし!・・・なんてどこかの政治家みたい。

ゴホン、ゴホン・・・関係ないと思うんじゃが・・・それは横においておいて・・
実は、mainもprintfも関数なんじゃ。
本当はvoid mainとすべきなのじゃが、省略されておるんじゃよ。printfのようにあらかじめ用意されている関数を標準関数と言ってな、printfのプロトタイプはstdio.hという名前のフャイルにあるんじゃ。
そういうファイルをヘッダ・ファイルというんじゃ。

それでいつも最初にinclude〈stdio.h〉つて書いてたわけ?
includeって挿入とかいう意味があるよね?

ビンポ~ン!
標準関数を使う度にプロトタイプを書くのは面倒だからの。
じゃから自作したものもそこに書き込んでおけばいいんじゃぞ。
自分卑用の***.hを作ってその中にまとめておけば、他のとごちゃごちゃにならずにすむじゃろ。