プロが教えるわが家の防犯対策術!

C言語を学習しています。
C言語の入門書を読んでいて、どうしても関数のこと(引数とか戻り値とか自作関数についてのこと)が分かりませんでした。ネットで調べてみたりもしたのですが分かりませんでした。

かみ砕いて説明していただけるとありがたいです。

A 回答 (6件)

えぇと, 「関数の『こと』」と書かれていますが,


・関数の書き方が分からない
・関数に付随する「引数」とか「戻り値」とかの意味が分からない
・なぜ「関数」なんてものがあるのか分からない
など, いろいろなものが考えられます. このうちどれ (あるいは複数) なのかを明確にしないと, それぞれの人が勝手に解釈してしまい結果としてあなたのほしい答えにならないことがあります.

で, どこが分からないのでしょうか?
    • good
    • 0

関数とは、本来ブラックボックスのことです。


何かをいれたら何かが起こる。
ブラックボックスの中に何かを入れたら、入れたものに応じて決まった答えが出てきます。

時間 親父(点数 テストの点数)

 時間 説教時間; 
 説教時間=(100ーテストの点数)/50;
 return 説教時間;


たとえば上の親父関数は、親父にテストの点数を入れたら説教時間が帰ってきます。
引数は親父に渡すテストの点数。
戻り値は説教時間です。

返すのが説教時間という時間の単位なので、関数「親父」の名前の前に「時間」という型を設定しておきます。


年 裁判長(数 罪の数)
{
年 懲役;
懲役 = 罪の数*3;
return 懲役;
}


この関数の引数、戻り値 何をする関数なのか、わかりますよね
    • good
    • 1

ひょっとして、テキストを読んだだけの勉強スタイルですか?



百聞は一見にしかず。

いくつか、関数を使っているプログラムを書いて動かしてみれば
分かると思うんですけど。
ステップ実行できればなおさら。

抽象的な例えになりますが、
関数は、「○○する人」みたいなものだと思っています。
引数は、材料。○○する人に「渡したいもの」
戻り値は、○○した結果です。

関数が「ミルクティーを作る人」だとして
引数になるのは、「茶葉」と「ミルク」です。
ミルクティーを作る人に「渡したいもの」が引数です。
戻り値は、実際に作ったもの。この場合は「ミルクティー」ですね。
ちょっと抽象的すぎましたかね。

実際のプログラムにありがちな例だと、
関数「利息を計算する人」
引数「入金額」と「利率」と「期間」
戻り値「利息」
で、実際の関数の中に、利息を求める計算式を入れておきます。

利息を計算する人に、入金額と利率と期間を渡せば、
その人が「計算してくれる」ので、ひとつのプログラム内で何回も計算する場面があると、
関数化した方がプログラムがスッキリします。
また、利息を求める計算式に、あとから変更を加えたいと思った場合、
関数化してあれば、この「利息を計算する人」だけを修正すれば済みます。
関数化してないと、利息を計算する式が、ソース内のあちこちに散らばって
直接書かれており、計算式を変更する場合は、そのすべての計算式を直さなければならなくなります。
この場合、一箇所だけ直し忘れた、とかいって不具合を招く恐れがあります。


自作関数は、こういう処理を自分で定義して、自分で書くことです。

標準関数は、言語仕様として、あらかじめ用意されているものです。
おなじみのprintf関数は、「画面に表示する人」と言えます。
書式の文字列と、変数を渡すと、それを画面に表示してくれるでしょ?
戻り値は、「これだけ表示しましたよ」と文字数を返してくれることになっていますが
一般的には使っていません。
    • good
    • 0
この回答へのお礼

私の質問の書き方が悪く、大変申し訳なかったです。
聞きたかったことにぴったり答えて下さっていたので、bajutsuさんをBAにします。
皆さんの回答、とても参考になりました。
本当にありがとうございました。

お礼日時:2011/01/02 11:36

--------------------------------------------------------------------


関数を使わないで作成した場合
--------------------------------------------------------------------
#include <stdio.h>

void main(){

int i;

for ( i=0 ; i<100 ; i++ ){
printf ( "%d回目のHello World\n",i);
}
printf ( "%d回表示しました\n",100-0);

for ( i=20; i<50 ; i++ ){
printf ( "%d回目のHello World\n",i);
}
printf ( "%d回表示しました\n",50-20);
}
--------------------------------------------------------------------
関数を使って作成した場合
--------------------------------------------------------------------
#include <stdio.h>

// プロトタイプ宣言
int roop(int,int);

void main(){

int d;

d = roop(0,100);
printf ( "%d回表示しました\n",d);
d = roop(20,50);
printf ( "%d回表示しました\n",d);
}

int roop(int a,int b)
// 戻したい値の型 関数名(使いたい変数)

{
int m;
int c; //戻したい値の型

for ( m=a ; m<b ; m++ ){
printf ( "%d回目のHello World\n",m);
}

c = b-a;
return c;// 戻したい値
}
--------------------------------------------------------------------
何回も同じ処理をする必要がある時などに便利です。
    • good
    • 0

プログラムの関数は要するにサブルーチンの事です。


同じ処理を何回も記述するのは無駄が大きいので、1ヶ所に記述して色々な所から呼び出せる様にしています。サブルーチンが終わったら呼び出し元に戻るようになっています。

そのサブルーチンへパラメータ(引数)や結果(戻り値)の受け渡しをできる様にしたり、
サブルーチン内に限定した変数(ローカル変数)など設け保守性を良くしたのが、C言語やPASCAL言語などの関数です。
プログラムでの記述や使い方は数学の関数になぞらえていますね。
C言語では文字の表示や入力など標準的な機能は標準関数として決まられています。
    • good
    • 0

数学の関数はわかりますか?実数から実数への写像である


f(x)=x+3
という関数で、f(1) は 4 になりますが、1が実引数で、4が戻り値です。これをCで書くと、

double f(double x) { return x+3; }

これでわからないのであれば、どの当たりでつまずいているのか、書いてください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!