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

博士「(^^♪」

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


ぷうさん

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


博士

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


困った顔のぷうさん

一休み、一休み・・・


博士「怒」

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


ぷうさん「怒」

長老がのせたんでしょ!


博士「?」

はん?


ぷうさん

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


困った顔の博士

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


ぷうさん

どうせ・・


博士

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


博士「ここをチェックじゃ」

まずは、絶対値を返す関数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関数のようにあらかじめ用意されている関数はたくさんあるが、自分で作ることもできるのじゃ。


困った顔のぷうさん

げげげーーーーー

関数を自作してみよう

博士「Good!」

手始めに、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で大きい方の数値を返される・・・と。


ぷうさん「OK」

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


困った顔の博士

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


困った顔のぷうさん

・・・・・・


博士「Good!」

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


ぷうさん「?」

・・・そんなもん?


博士

習うより慣れよって言ってじゃな・・・お前さんの場合、深く考えない方がよいじゃろ。

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

ぷうさん「(^^♪」

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


困った顔の博士

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


ぷうさん「OK」

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


博士「Good!」

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








博士

というわけで、ちょっとまとめてみるかの。

関数の作り方

関数のプロトタイプを書く

型 関数名(型 引数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がないよ!?


博士「Good!」

そうじゃ、そうじゃ、よく気がついたの。

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

ぷうさん「(^^♪」

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


困った顔の博士

ゴホン、ゴホン・・・関係ないと思うんじゃが・・・それは横においておいて・・

実は、mainもprintfも関数なんじゃ。
本当はvoid mainとすべきなのじゃが、省略されておるんじゃよ。

printfのようにあらかじめ用意されている関数を標準関数と言ってな、printfのプロトタイプはstdio.hという名前のフャイルにあるんじゃ。
そういうファイルをヘッダ・ファイルというんじゃ。

ぷうさん「?」

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


博士「Good!」

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

一日目 C言語の基礎 目次

零日目へ

ぷうさんの七日間戦争 一日目

二日目へ