現: 2009-04-20 (月) 22:47:44 SHOO ソース
With "vote" plugin. at 2012-06-08 (金) 17:20:12
Line 1: Line 1:
 +TITLE:関数について
 +#navi
 +* #01 - 関数とは [#eb3f939a]
 +** 数学の関数について [#v2f44e92]
 +今回は関数というものについて説明します。~
 +まぁ、今回も変数の時と同様、大して楽しくもないので、数学の関数については周知だ、な人は[[こちら>#e4619d77]]~
 +ご託はいい、とりあえずコード晒せ、な人は[[こちら>#v48157c1]]~
 +へどうぞ。~
 +~
 +
 +――さて、関数は、数学などでおなじみの、機能を持った数のことです。~
 +Wikipediaや辞書をみると、とある変数を入力してやることで、その変数に対応した値が従属的に定まる対応関係と表現されているようです。~
 +たとえば中学校の2年生で習う一次関数では、ある数xに対応したyがありますね。
 +#block(class=math){{
 +y = 3x + 5
 +}}
 +この式では、xに0を代入するとyは5に、xに1を代入するとyは8に、xに2を代入するとyは11になりますね。
 +
 +|~x...|-3|-2|-1|0|1| 2| 3|...|
 +|~y...|-4|-1| 2|5|8|11|14|...|
 +
 +このような関数の書き方は、数学では高校生で習う範囲では、
 +#block(class=math){{
 +f(x) = 3x + 5
 +}}
 +と書くことがありますね。
 +f(1)とすると、この値は8になるわけです。
 +
 +円の面積を求めるような関数を考えるとこのようになります。
 +#block(class=math){{
 +A(r) = πr&sup{2};
 +}}
 +この関数を利用すると、次のようなことができます。
 +
 +例題)半径10mの赤く塗られた円があります。その赤い円の中には半径1mの穴が4個あります。穴の開いていない赤い部分の面積は何平方メートルでしょうか。
 +#ref(function_circlehole.png,40%);
 +この例題の赤い部分の面積は、先のA(r)の関数を使って、このように表すことができます。
 +#block(class=math){{
 +A(10) - 4×A(1)
 +}}
 +半径10の円の面積から、半径1の円の面積×4つ分を引くわけですね。
 +
 +数学で関数と言って、特に有名なものは、たとえば三角関数がありますね。
 +#block(class=math){{
 +- sin(x) = x -(x&sup{3};/3!) +(x&sup{5};/5!) -(x&sup{7};/7!) ....... ((右辺はテイラー展開されたもの))
 +- cos(x) = 1 -(x&sup{2};/2!) +(x&sup{4};/4!) -(x&sup{6};/6!) ....... ((右辺はテイラー展開されたもの))
 +- tan(x) = sin(x) / cos(x)
 +}}
 +先ほどのA(r)などのように、自分で定義したような関数もあれば、正弦関数や余弦関数などのように、有名な人が定義してそのまま常識になってしまったような関数もあります。 関数の利点としては、正弦関数のような、中身が非常に複雑なものでも、内容はブラックボックスとして、適当な入力を与えるとそれに対応した値が返ってくるという事実だけを見て、利用することができるという点が挙げられます。~
 +また、先ほどの三角関数のように、複雑なものを一つにまとめることで記述を簡略化することもできたりもします。
 +
 +このような使い方ができるもの、それが関数というものです。~
 +詳しくはWikipediaやGoogle大先生に頼るなり、中学高校の数学の教科書などを見るなどしましょう。
 +
 +** 今回のミソ [#cf34a1f2]
 +- 関数とは、機能を持った数
 +- 関数に与えた値と返ってくる値はそれぞれ対応している
 +- 数学での関数の定義は
 +#block(class=math){{
 +f(x) = 3x + 5
 +}}
 +のように書く
 +- sin(x)やcos(x)などの有名なものもある
 +- 関数の中身はブラックボックスとして扱うことができる
 +- 関数を使うと簡単に書ける場合がある。
 +
 +
 +
 +* #02 - プログラミングでの関数 [#e4619d77]
 +** プログラミングの関数について [#cb5afb26]
 +さて、その関数ですが、D言語にも関数というものがあります。~
 +D言語といわず、プログラミング言語では、ある作業をひとまとめにして、一つの手続きにしたものという意味合いが強いです。~
 +数学の、簡単に書ける場合があるっていうそれですね。~
 +プログラミングにおいての''関数''の呼び方としては、''サブルーチン''や、''メソッド''ということもあります。~
 +
 +プログラミングで関数とはどういうことかというと、たとえば、前回までに使ってきた writef というもの。~
 +これは、入力されたものを、文字列に直して表示させるというものでしたが、この中では、
 +
 ++ 文法の解釈
 ++ 入力されたものを文字列に変換する
 ++ 整形する
 ++ コンソールに出力する
 +
 +というような一連の処理を行って文字を表示しています(いるのだと思います)。~
 +これらの処理を writef という「関数」にまとめて一つの手続きにしてあるので、このような一連の処理を writef という関数に任せることができるわけです。
 +
 +ところで、数学の関数では、ある''変数''に対応した一定の''値''が定まります。~
 +プログラミングでも、これに相当するものがあります。~
 +たとえば、一次関数で
 +#block(class=math){{
 +y = ( f(x) = ) 3x + 5
 +}}
 +という式があるとして、この式の変数xのことをプログラミングでは''引数''(ひきすう)と呼び、変数yのことを''戻り値''と呼びます。
 +
 +関数の大きな利点としては、再利用性というのが挙げられます。~
 +プログラミングをしていると、同じようなことの繰り返しや、以前にやったことにある処理など、コピーペーストをするような処理がたくさんあります。~
 +これらを、再び使いたいと思ったときに、この一連の処理を関数としてまとめてやると、楽になることが多いわけですね。
 +
 +他にも、人間にとって読みやすいものになることもあります。~
 +複雑なことをプログラムで行うと、後々コードを読み返したときに、カオスになっていることがよくありますが、そのカオスを少しでも秩序あるものにしてやるために、関数化してやることもありますね。
 +
 +** 今回のミソ [#c0aed1f1]
 +- 関数を使うと一連の処理をまとめることができる
 +- 関数を使うと処理の内容をブラックボックス化できる
 +- 関数を使うと再利用性が増す
 +- 関数を使うと可読性が増す
 +- 関数には引数と戻り値がある
 +
 +
 +
 +* #03 - 関数の定義 [#v48157c1]
 +** 今回は… [#n784b348]
 +今回はD言語での関数の定義方法を説明します。~
 +さて、数学的な関数の具体例として、
 +#block(class=math){{
 +f(x) = 3x + 5
 +}}
 +という表現は高校生のあたりで習うはずですね。 関数の定義です。~
 +これと同じ「関数の定義」をD言語で書くと、
 +#code(d,nomenu,nonumber,nooutline){{{
 +real f(real x)
 +{
 +   return 3*x + 5;
 +}
 +}}}
 +というようになります。~
 +いちばん最初の real というのが戻り値の型を示していて、real xという部分で引数の型と変数名を示します。~
 +また、今までおまじないだったreturnというものが出てきますね。~
 +returnというのは、そこに書かれたものを、戻り値として関数を呼んだところ(使ったことろ)に返しますということです。~
 +この場合は引数は実数で、戻り値も実数ですね。
 +
 +同様に、半径から円の面積を求めるための関数は、数学では
 +#block(class=math){{
 +A(r) = πr&sup{2};
 +}}
 +という風に書きました。プログラミングでは、
 +#code(d,nomenu,nonumber,nooutline){{{
 +real A(real r)
 +{
 +   return 3.141592 * r * r;
 +}
 +}}}
 +というように書きます。~
 +これも、引数が実数で、戻り値も実数です。
 +
 +ところで、これら関数は、 writef などと同様、プログラミングのコードの中で f(1) や A(10) などのように使いますが、~
 +#code(d,nomenu,nonumber,nooutline){{{
 +real A(real r)
 +}}}
 +と書いた時の r と、 A(10) と書いた時の10では、同じ「引数」でも特別に意味を分けて使用したい場合には呼び方が若干異なります。
 +定義をする時の引数(変数)のことを、仮引数と呼び、使用するときに関数の中に入力する引数を実引数と呼びます。
 +#block(class=math){{
 +f(x) = 3x + 5
 +}}
 +では、xが仮引数で、 f(10)等とした際の10が実引数ということになります。
 +
 +それでは、実際に関数を定義し、使用する例をソースコードで示します。
 +
 +
 +** 今回のミソ [#oeea615f]
 +- 関数は次のように定義します。
 +#code(d,nomenu,nonumber,nooutline){{{
 +戻り値の型 関数名(変数の型 変数名, 変数の型2 変数名2 ....)
 +{
 +    /+... 処理内容 ...+/
 +}
 +}}}
 +- 定義する場所の引数は「仮引数」と呼びます
 +- 使用するときの引数は「実引数」と呼びます
 +
 +
 +
 +** サンプルコード [#se21ae72]
 +#code(d,sample0703p.d);
 +#region(Tango用はこちら){{
 +#code(d,sample0703t.d);
 +}}
 +
 +
 +** 実行結果 [#e6e5aa51]
 +#code(console){{{
 +$ dmd -run sample0703p.d
 +615.752
 +}}}
 +
 +
 +** まとめ [#cd7b2c5a]
 +というわけで、今回は関数の定義について説明しました。~
 +勘の良い方は気づかれるかと思いますが、今まで取り扱った writefln や readln, chomp といったものも、関数となっています。これらは標準[[ライブラリ>Wikipedia:ライブラリ]]であらかじめ定義されているもので、それらを使うよと宣言することで使用することができるようになります。
 +#code(d,nomenu,nonumber,nooutline){{{
 +// writefln, readln等を使うための宣言
 +import std.stdio;
 +// chomp等を使うための宣言
 +import std.string;
 +// toInt等を使うための宣言
 +import std.conv;
 +}}}
 +いままでおまじないとして使ってきたこれらは、関数を使えるようにする作業だったのです。~
 +次は、関数の使い方です。
 +
 +
 +
 +
 +* #04 - 関数の使い方 [#ad3e246a]
 +** 今回は… [#sce2157e]
 +関数の使い方について説明します。 といっても、前回のプログラムですでに一応関数を使っているので、今回の内容としては、もうちょっと高度な、いわゆる数学でいうところの合成関数や2変数関数の定義と使い方、それから標準関数の使い方なんかについて説明…というか紹介します。
 +
 +** 今回のミソ [#zda5b5a4]
 +- 使いたい関数の入っているモジュールをインポートして関数が使えるようにするには次のようにimportを使います。
 +#code(d,nomenu,nonumber,nooutline){{{
 +import モジュール名;
 +}}}
 +- 複数の引数をとる関数も定義できる。
 +- 数学でいう合成関数のようなことも可能。
 +
 +
 +** サンプルコード [#wc16e928]
 +#code(d,sample0704p.d);
 +#region(Tango用はこちら){{
 +#code(d,sample0704t.d);
 +}}
 +
 +
 +** 実行結果 [#nfa21f8c]
 +#code(console){{{
 +$ dmd -run sample0704p.d
 +原点と点(10,10)からの距離をそれぞれ求めます。
 +まずはx座標を入力 : 15
 +つぎにy座標を入力 : 8
 +原点からの距離は : 17.000000
 +点(10, 10)からの距離は : 5.385165
 +}}}
 +
 +
 +** まとめ [#r7bab7c8]
 +というわけで、今回は関数の使い方について説明しました。~
 +モジュールについてもちょっとだけ触れました。~
 +今回は引数も戻り値もrealのものばかり定義しましたが、引数にchar[]などとすれば文字列なども引数にできますし、戻り値もchar[]型などにすることもできます。~
 +また、今回紹介した標準関数以外の関数もたくさんあります。~
 +多すぎるので紹介はできませんが、案ないならすることができます。~
 +
 +http://www.kmonos.net/alang/d/phobos/phobos.html
 +
 +準公式のページですが、ここを見ると標準関数のほとんどが記載されています。~
 +この中から、モジュール名から推測したりして、目的の関数を捜すわけです。
 +
 +
 +
 +
 +* #summary - まとめ [#h58aa014]
 +** 第07章のミソ [#qf8544f8]
 +- 関数とは、機能を持った数
 +- 関数に与えた値と返ってくる値はそれぞれ対応している
 +- 数学での関数の定義は f(x) = 3x + 5 のように書く
 +- sin(x)やcos(x)などの有名なものもある
 +- 関数の中身はブラックボックスとして扱うことができる
 +- 関数を使うと簡単に書ける場合がある。
 +- 関数を使うと再利用性が増す
 +- 関数を使うと可読性が増す
 +- 関数には引数と戻り値がある
 +- 関数は次のように定義します。
 +#code(d,nomenu,nonumber,nooutline){{{
 +戻り値の型 関数名(変数の型 変数名, 変数の型2 変数名2 ....)
 +{
 +    /+... 処理内容 ...+/
 +}
 +}}}
 +- 定義する場所の引数は「仮引数」と呼びます
 +- 使用するときの引数は「実引数」と呼びます
 +- 使いたい関数の入っているモジュールをインポートして関数が使えるようにするには次のようにimportを使います。
 +#code(d,nomenu,nonumber,nooutline){{{
 +import モジュール名;
 +}}}
 +- 複数の引数をとる関数も定義できる。
 +- 数学でいう合成関数のようなことも可能。
 +
 +
 +** 宿題 [#n59dd419]
 +今回は合成関数のようなものだとして扱った~
 +to!(int)( chomp( readln() ) )~
 +や、~
 +to!(real)( chomp( readln() ) )~
 +という表現。~
 +今回のような例では割とよく使うと思いませんか?~
 +InputInt() や InputReal() といったような関数にしてしまってもいいと思いませんか?~
 +やってみましょう。~
 +以下のmain関数を一切書き変えずに、その下のような出力結果を出してください
 +#code(d,nonumber){{{
 +int main(char[][] args)
 +{
 +    write("整数を入力 : ");
 +    int a = InputInt();
 +    write("入力された整数は");
 +    writeln(a);
 +    write("実数を入力 : ");
 +    real b = InputReal();
 +    write("入力された実数は");
 +    writeln(b);
 +    return 0;
 +}
 +}}}
 +#code(console){{{
 +整数を入力 : 5
 +入力された整数は5
 +実数を入力 : 1.6
 +入力された実数は1.6
 +}}}
 +
 +** コメント [#s63ce49c]
 +さて、今章では今までおまじないだった部分が解決されましたね。~
 +標準関数以外にも、いろいろな人が開発した様々な関数があります。~
 +ライブラリという形で提供されているのですが、まぁ、この話はまた別の機会にでも。
 +
 +さて、次回は、配列です。~
 +今まで文字列として扱ってきた char[] というものですが、これは文字の配列で成り立っています。~
 +そんな話を次章ではしていきます。~
 +そんなわけで、宿題できたら、あるいは予想ついたら次にいきましょう~
 +
 +
 +#navi
 +
 +
 +* 投票とコメント [#sb7c0e1f]
 +#vote(#lastvote:0e13cc4e9e9151ad8d4eddefad226321,大変参考になった[3],参考になった,あまり参考にならなかった,まったく参考にならなかった,#notimestamp)
 +#pcomment
  

  • Articles/D言語入門講座/第07章 - 関数1 のバックアップ差分(No. All)
    • 現: 2009-04-20 (月) 22:47:44 SHOO
      • With "vote" plugin. at 2012-06-08 (金) 17:20:12

トップ   差分 バックアップ 複製 名前変更 リロード印刷に適した表示   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom Powered by xpWiki
Counter: 1205, today: 4, yesterday: 3
メインメニュー

ログイン

ユーザー名:


パスワード:





パスワード紛失  |新規登録

Menu