関数

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kerotan0820

関数

#1

投稿記事 by kerotan0820 » 15年前

前回の質問{for(応用ループ)}ではお世話になりました


今回は、ニコニコ動画の(nm6415611)にて関数の勉強をしております

一通り動画を目に通して実際に取り組んでみたところ、関数以前に分からない点がありましたので質問させていただきます

プログラムはこのようなものでした
/*tasizan.c*/
#include<stdio.h>
int tasizan(int x,int y);
int main(void){
    int a,b,add;
    scanf("%d%d",&a,&b);
    add=tasizan(a,b);
    printf("add=%d\n",add);
    return 0;
}
int tasizan(int x,int y){
    int answer;
    answer=x+y;
    return answer;
}
表現の方法の違いなのかもしれないのですが。

add=tasizan(a,b);

これがどういった役割を果たしているのかが分かりません

scanfで二つの整数を入力してそれぞれを a と b に代入、その後の行です
add=tasizan(足し算)とあるので
int tasizan(int x,int y){
    int answer;
    answer=x+y;
    return answer;
この部分に関係しているのかなと憶測はつくものの理解が出来ません

この動画での関数についての解説もまったくといってよいほど理解が出来ていないのですが、それについては今もう少し勉強してみます


そもそもこの関数の役割が理解できません
動画では ミク、ルカの二人のキャラを利用して大まかな解説がされています
このような内容です

ミクを「取りまとめ役」、ルカを「足し算担当」というように役割を分担した例を考えます
まず、ミクが、「どんな数を足し算してほしいのか」という情報をルカに伝達します
ルカが受け取った数を「加算処理」します
答えをだします
出した答えをミクに伝えます
それをミクが受け取ったらやり取りは終了です

動画では図や画像で説明されているので、見ていただけると分かると思います

これについてですが、関数(今回の単元)を理解せずに僕が二つの入力された整数を加算処理するプログラムを書けといわれたらこのようなものを作ります。
#include<stdio.h>
int main(void){
    int a,b,c;
    printf("二つの整数を入力してください\n");
    printf("①:");scanf("%d",&a);
    printf("②:");scanf("%d",&b);
    c=a+b;
    printf("結果=%d\n",c);
    return 0;
}
出来なかったらどうしようとか思いながらも今書いてみたプログラムです
結果はきちんと表示されます
このプログラムと関数の動画のプログラムで行う処理はまったく同じに思えます。

いったい関数は何の役割を果たしているのでしょうか;

最初の論点から大分ずれてしまいました すみません

■追記
質問の途中、なぜか改行が反映されないというバグ?がおきているので、読みにくいかと思われますがお許しください; 画像

Dixq (管理人)

Re:関数

#2

投稿記事 by Dixq (管理人) » 15年前

携帯なんで簡単にしかかけませんが…

動画は見てませんが、それはプロトタイプ宣言といって関数がありますよという印です。
けろたんさんは、上からプログラムを読んでいますか?

下敷きか何かでプログラムを隠して上から少しずつみていってみて下さい。

tasizanという関数の呼出し行を見ても、初めて見るものだから意味わかんないですよね。
コンパイラだって意味わかんなくなるんです。
だから、実態の定義より前に呼出しを書くときは実態は下で定義してるよ!と先に言っておく必要があるのです。


で、関数化する意味ですが、今aとbの足し算一回ならできましたね。では、
a1とb1の足し算
a2とb2の足し算

とこれが1億回あったらどうします?
ひたすら1億行書きますか?

こう考えると効率化の面で利点が見えてくるかも。

non

Re:関数

#3

投稿記事 by non » 15年前

関数というものを説明するために用意されたプログラムなので、わざわざ関数にするまでも
ない(というよりも、関数にしない方が簡単な)ものを関数にした例です。

やりたいことは、kerotan0820さんの作られたとおり、
c=a+b;
を行うだけのことを関数にしています。
関数には、引数という形で渡して、答えを返してもらうことができるよという例です。
このように簡単なものをわざわざ関数にする必要はないわけですが、もう少し複雑な
ことをするような場合、関数にした方が可読性もよくわかりやすくなります。

Dixq (管理人)

Re:関数

#4

投稿記事 by Dixq (管理人) » 15年前

自分で言っておいてなんですが、さっきのはいい例じゃないですね。
別に関数じゃなきゃできない話じゃないし…。

携帯だからプログラムがうてない;

まぁ、機能分解してわかりやすくしたり、計算の再利用性を高めたりできるんですよ。関数ポインタ使って似たような計算まとめたりって事も出来ます。
具体例はほかの回答者様におゆずりします^^;

kerotan0820

Re:関数

#5

投稿記事 by kerotan0820 » 15年前

■Dixq様
回答ありがとうございます^^
はい、上から読んでます。
プロトタイプ宣言… 動画の中で繰り返し説明されていた気がするのでもう一度確認してみます

■non様
ということは、この足し算の電卓プログラムをtasizanという関数に代入できてしまうということですか?

non

Re:関数

#6

投稿記事 by non » 15年前

>ということは、この足し算の電卓プログラムをtasizanという関数に代入できてしまうということですか?

ごめんなさい。意味がわかりません。

SooA

Re:関数

#7

投稿記事 by SooA » 15年前

まず一番解っていないと不味いのは、
処理が移動しているということです。

今は「足し算」は頭から切り離して下さい、
tasizan()関数に処理が移り、
そこでの処理が終わったら本流へと戻ってくる。

ここまでは解りますか?

dic

Re:関数

#8

投稿記事 by dic » 15年前

関数の機能として
戻り値 関数名(引数1,引数2,...);
と定義されます

今回の件では
int tasizan( int x, int y );
とあるので この関数は引数xと引数yをとり、
int型の変数を返すという意味になります

もし、void tasizan( int x, int y );
と宣言されてると
引数x、引数yをとり、何も値を返さない関数になります

double tasizan( int x, int y );
だと
引数x、引数yをとり、double 型の変数を返す関数になります

わかりやすいように ミク、やルカを用いているようですが、
私としてはよけいに話が複雑になる気がします
アセンブラ出身の方が、そういうたとえをよくしますね


関数のプロトタイプの意味としては
コンパイラはソースコードの上からソースコードを読み込んでコンパイルします
この時、tasizanというオリジナルの関数を作りますと先に宣言することを意味し、
コンパイルするときにtasizanという文字がでてきたとき、これはオリジナルの
関数だと解釈させるために必要です

なんで、関数なんか作るの?という疑問は
勉強を進めていくうちに徐々に分かってきますね

kerotan0820

Re:関数

#9

投稿記事 by kerotan0820 » 15年前

■non様
分かりにくくて申し訳ありません;

入力された二つの整数を加算するというプログラムをくくってしまうことができるのかな?
と、勘違いしてたのです;

ほかの回答者様への返信は、もう一度動画を確認し、その後返信させていただきます。
たくさんの回答ありがとうございます。

kerotan0820

Re:関数

#10

投稿記事 by kerotan0820 » 15年前

しばらくCをいじれそうにないので一旦閉めさせていただきます
次質問する際はこのURLをリンクします

閉鎖

“C言語何でも質問掲示板” へ戻る