概ね方位不定だが多分割と偏っている
スポンサーサイト
--年--月--日 (--) | 編集 |
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


C 関数
2006年08月18日 (金) | 編集 |
今まで当たり前のようにprintfだのscanfだのを使ってきたが、これらは皆関数である。
関数みたいなものだと思っておけといったものも一部あったが。
この章はそこら辺を少し突っ込んでやってみようというものではないかな。
やってみないと分からんけど。
長いプログラムを見てみると、それは大抵は色々な仕事の寄せ集めで出来ているそうな。そういった個々の仕事に分割した単位は機能単位と呼ばれる。
この機能単位をメインになるプログラムと別の所に書いておいて、必要に応じて呼び出せるようにしておいたものを一般にはサブルーチンと呼ぶらしい。このサブルーチンは関数で構成されているのだと。

で、ここからよく分からなくなってくるのだが、サブルーチンは関数によって構成されているのだが、サブルーチンはサブルーチン自体で値を持つことは無いが、関数の方は関数自体で値を持つのだそうだ。関数が値を持つのなら必然的に関数で構成されるサブルーチンも値持つんじゃねーのって気がするんだが。

どうなっておるのやら。

ま、いいや。そういうことにしておいて先に進もう。暑いし。

標準的な関数としては算術関数というものがあり、

y=10.0*sin(x);

みたいな感じで使われる。sin(x)という関数がコールされると、sinの計算が行われ、その結果がsin(x)の値として返され、そのまま式を計算することが出来るわけだ。この関数から返される値のことを戻り値という。
C言語ではsin( )のような典型的な計算用の関数以外にも、全ての処理単位が関数として扱われているのだそうだ。例えばgetchar( )はキーボードから1文字の入力を行う関数だが、この入力された1文字が関数の戻り値として返されている。

さて上に述べたようなgetchar、scanf、printf等の関数はC言語のメーカーが予め作成しておいたものを、ライブラリとして提供しているので今まで当たり前のように使えてきたわけだが、こういったメーカーがライブラリとして提供している関数のことを標準ライブラリ関数と呼ぶ。
これに対し、俺らも独自に関数を作って定義し、使うことも出来る関数があり、これはユーザー関数と呼ばれる。ユーザー関数の呼び出しと定義は

データ型 関数名(データ型 仮引数,データ型 仮引数,…)
{
   中略
   return(式);
}


という記述で行われる。
関数は値を返すという性質を持っており、その関数がどういった型のデータを返すものなのかをきっちり宣言しなくてはならないらしい。で、return(式)の式の値が関数の戻り値として呼び出し元に返される為、式の値と関数の型が一致しなくてはならない。

呼び出し元と関数との間でデータのやりとりを行うには引数というものを用いるんだが、呼び出し側で指定する引数を実引数、関数側で指定する引数を仮引数という。上記の記述例は仮引数ってことだな。
仮引数は関数の定義のところで型を宣言しておく必要があるが、仮引数はデータを受け取る器なので変数しか使えない。逆に、実引数では定数や変数や式など様々使うことが出来る。なお、対応する実引数と仮引数は同じ名前をつける必要は無いが、型は必ず一致していなくてはならない。

例)
呼び出し元で

test(10,20);

という関数を呼び出す時、10と20がそれぞれ実引数であり、これらはINT型なので

int test(int a,int b)
{
 return(式);
}


仮引数aとbはINT型で宣言する必要があるということ。



…。

イマイチよく分からんので例によって実際にやってみるとしよう。
2つの整数a、bのうち、大きい方を返す関数maxを作ってみる。

返す数値はaかbであり、どちらも整数なのでINT型であり、maxもINT型。
当然仮引数もINT型。

int max(int a,int b)
{


aとbを比較して大きいものを返すには、

もしa>bならば
 aを戻り値とし
そうでなければ
 bを戻り値とする


ようにすればいいので、

int max(int a,int b)
{
 if(a>b)
  return(a);
 else
  return()b;
}


これでOK。
らしい。

後はメインプログラムでa,bに数値を入力し、関数maxを呼び出すのみ。

void main(void)
{
 int a,b;
 scanf("%d",&a);
 scanf("%d",&b);
 printf("大きいのは%dだぜ\n",max(a,b));
}


最後のprintf文にあるmax(a,b)というのが関数maxの呼び出しで、
このa,bというのがそれぞれ実引数ってことだ。

function_test.jpgfunction_test2.jpg
こんな感じ

どうせなので絶対値を求める関数も作ってみよう。

関数absで整数xの絶対値を求めるとして、xが正の整数の時はxをそのまま戻り値とし、xが負の整数の時はxに-1をかけて戻り値とすればいいだけなので

int abs(int x)
{
 if(x>=0)
  return(x);
 else
  return(-x);
}


これでOK。
後は上の例と同様にこの関数をメインプログラムで呼び出せばよし。

void main(void)
{
 int x;
 while(scanf("%d",&x)!=EOF){
 printf("絶対値は%dだぜ\n",abs(x));
}
}


function_ex.jpgfunction_ex2.jpg
概ねOK。

こんなもんかね。

まとめてみる。

関数は自分で作ることが出来る
型 関数名(型 仮引数,型 仮引数,…) という形式で宣言し
{ }の中でreturn(式)で返される値を定義する
実引数と仮引数は型が一致してないとめーなの
だが変数名は同じ名前である必要は無い


以上。
なかなか難しいかね。
スポンサーサイト

コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。