基礎の基礎 プログラムについての関数

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

基礎の基礎 プログラムについての関数

#1

投稿記事 by あるめす » 11年前

関数の意味わかるんですけど
プログラムでの関数が分かりません。
例えば
(結果)
ボタン押す→TVがつく
      (ボタンを押すの関数)

    (結果)
???→printf()

printf()は何の結果・・?

こんな感じです。初心者の質問ですが、答えてくださればありがたいです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 基礎の基礎 プログラムについての関数

#2

投稿記事 by softya(ソフト屋) » 11年前

すいません。
質問自体の想定がよく分からないので、もう少し具体的なコードで書いて貰えませんか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
shiro4ao
記事: 224
登録日時: 13年前
住所: 広島

Re: 基礎の基礎 プログラムについての関数

#3

投稿記事 by shiro4ao » 11年前

原因→結果としてかくと
テレビであれば
ボタン押す→TVがつく
printfなら
printf("hoge");を呼び出す → hogeが表示される
という喩え話で伝わりますでしょうか?

プログラムの一部を関数にするの目的の1つとして中身にこだわらないようにするというものがあると考えています
例えばテレビなら子供でもスイッチオンでテレビが見れますが
子供(そしてほとんどの大人も)はテレビがなぜ映るのかの仕組みについては知りません
しかし、スイッチの操作とその結果さえ知っていればテレビは見れます
原因と結果の対応関係(スイッチを押せば見れる)だけに注目し
その間の仕組み(電波を受け取り信号を解釈して画面に出すetc)を意識しなくていいようになっています
だから多くの人が使うことができるのです

同じ事がプログラミングでもあります
例えば、2人のテストの点数を渡して平均を出す場合、

コード:

int heikin(int hitorimenotennsuu ,int futarimenotennsuu){
	int heikinntennsuu;
	heikinntennsuu =( hitorimenotennsuu+futarimenotennsuu)/2;
	return heikinntennsuu;
	//平均点なので本当は小数で返すべきですが。
}
という関数を作っておけば、平均点の求め方を知らない人でさえも
この関数heikinnさえ使えれば平均点を求めることができます。

平均点の求め方なんて多くの人は知っていますが、
データを暗号化したり、メッセージボックスを表示したり、他のコンピュータへ接続する方法は
知らないかも知れません。データの暗号化には数学の知識が必須ですし、メッセージボックスを
自前で出そうとすれば大変です、他のコンピュータへ接続なんて想像もつきません!

でもそれらを実現する関数さえ知っていれば簡単に色々なことができるのです。

文法書は文法のことを中心に書いているので、
習っていることを実際に使う状況がわからないかも知れません
ただ、関数に限って言えば、例えばWindows上でなにかソフトを作りたいと思った時には
Windowsがプログラミングしやすいように様々な機能を関数として提供しています
(Windows APIというものです)
そしてその機能を利用して作っていくほうが0から作るよりはるかに早いため
関数を使うのです。


/*追記*/
だからといって関数の中身を知らなくていいだというわけでもありません
関数だって人の作ったものなのでバグが入っているかもしれませんし
同じことをしてくれる関数でも実現する方法がよりよいやり方のとあまりそうでないやり方があったりします
すでにある関数を自分で作ってみることも勉強になったりします

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 基礎の基礎 プログラムについての関数

#4

投稿記事 by beatle » 11年前

ちょっと難しい話かもしれませんが、関数の「結果」という言葉を使っていらっしゃいましたので、少し詳しく。

まず数学的な関数について。
与えられた値に対して、ただ1つだけ決まる値を求める式です。
例えば関数 f(x, y) = x + y は、与えられた値 x, y に対して、 x + y という値を決める式。
x + y が数学でいう関数の「結果」です。

これをC言語で書くと
int f(int x, int y) { return x + y; }
となります。与えられた引数 x, y に対して、ただ1つだけ決まる値 x + y を「戻り値」として返します。
数学での関数の「結果」は、プログラミング言語では「戻り値」に相当するのです。

さて、プログラミング言語では、関数はもう1つの「結果」を産む場合があります。
printf() は、引数で渡された値を画面に表示しますが、普段は戻り値は使いませんね(実は、printfは表示した文字数を返すのですが)。
プログラミング言語の世界では、このように、戻り値ではない結果のことを「副作用」と呼びます。

まとめると、プログラミング言語の関数には戻り値と副作用の2種類の役割があります。
strcmp, max, strtol などの関数は主に戻り値を得るために使い、
print, scanf, strcat などの関数は主に副作用を起こすために使います。


「ボタン押す→TVがつく」
の「TVがつく」は副作用。

shiro4ao さんが言う
「printf("hoge");を呼び出す → hogeが表示される」
の「hogeが表示される」のも副作用です。

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: 基礎の基礎 プログラムについての関数

#5

投稿記事 by YuO » 11年前

元のたとえの粒度が違う気がしますが……。
あるめす さんが書きました:(結果)
ボタン押す→TVがつく
      (ボタンを押すの関数)
に対応させるのであれば,
プログラムを実行する→メッセージが表示される
といったレベルの話に相当します。
ボタンを押すとTVがつくというのは,ユーザーの動作に対しての,ユーザーから見た結果(というか,機器の反応)です。
そのレベルで,内部の構造を気にする必要は無いです。
ソフトウェアでもユーザーは内部の構造を気にする必要が無いのは同じで,ユーザーから見た場合にprintfなんてのは存在しません。

TVのたとえの文脈でprintfを語るなら,ICとかLSIとかでしょうか。
外部から与えられた入力によって,出力が変化するものです。

対比させている物との喩えの粒度が大きく違うので,関数のイメージが捉えられていないのかなぁ,という気がしました。

閉鎖

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