=================================================================== RCS file: /home/cvs/OpenXM/src/cfep/Doc/Intro/next2.tex,v retrieving revision 1.6 retrieving revision 1.7 diff -u -p -r1.6 -r1.7 --- OpenXM/src/cfep/Doc/Intro/next2.tex 2009/10/09 11:47:27 1.6 +++ OpenXM/src/cfep/Doc/Intro/next2.tex 2012/08/28 04:42:58 1.7 @@ -18,7 +18,7 @@ \title{ {\bf 超入門 Cfep/asir (MacOS X)} } \author{ 高山信毅 } -\date{ 2006年(平成18年), 3月12日版(cfep 1.1). 2008-09-26, 2009-09-19 修正 \\ コメントは takayama@math.kobe-u.ac.jp まで} +\date{ 2006年(平成18年), 3月12日版(cfep 1.1). 2008-09-26, 2009-09-19, 2012-08-27 修正 \\ コメントは takayama@math.kobe-u.ac.jp まで} \makeindex \begin{document} @@ -1237,6 +1237,154 @@ for (T=0; T<=deval(2*@pi); T = T+E) { 複雑な機能を実現する. このようなアプローチをとることにより, ``困難が分割'' される. +円の例をしばらく離れ, +簡単な関数の例をとり関数の書き方を説明しよう. +前の節では $2$ の巾の表を作成するプログラムを書いた. +これを元に次のような関数を作る. +\begin{screen} +\begin{verbatim} +def power_table(N) { + X=2; + for (I=1; I<=N; I++) { + print(X^I); + } +} +power_table(8); +\end{verbatim} +\end{screen} +関数の定義は次のように {\tt def} 命令で行なう. +\begin{verbatim} +def 関数名(引数) { + 関数本体 +} +\end{verbatim} +上の例では関数名は {\tt power\_table} であり, 引数(argument)は {\tt N} である. +関数名は英数字と {\tt \_} を用いてつける. +ただし数字や大文字ではじまる名前をつけることはできない. +処理内容を連想させるような名前をつけるのが望ましい. +{\tt def} 命令では関数を定義するだけで実行は行なわない. +実行させるには, 上の例のように {\tt power\_table(8);} と引数の部分に実際の数字等を入れて +呼び出す. + +引数は二つ以上あってもよくて,たとえば, +\begin{screen} +\begin{verbatim} +def power_table2(X,N) { + for (I=1; I<=N; I++) { + print(X^I); + } +} +power_table2(3,8); +\end{verbatim} +\end{screen} +なる関数定義と最後の行のその呼び出しは +$3^i$ を $i=1, \ldots, 8$ の範囲で計算して表示する. +このような関数を用意しておけば, +$2^i$, $3^i$, $5^i$, $1 \leq i \leq 10$ の表を表示したいとすると, +\begin{screen} +\begin{verbatim} +power_table2(2,10); +power_table2(3,10); +power_table2(5,10); +\end{verbatim} +\end{screen} +と書くだけで良く, プログラムも短くなり, かつ整理されているので, 読みやすくなる. + +さて, {\tt power\_table2(2,3);} を実行すると +\begin{screen} +\begin{verbatim} +2 +4 +8 +0 +\end{verbatim} +\end{screen} +と表示される. +最後の 0 は一体何であろうか? +これは実は関数の値である. +関数の値のことを戻り値ともいう. +戻値を指定するには, {\tt return} 文を用いる. +\begin{flushleft} +\begin{minipage}[t]{7cm} +\begin{screen} +\begin{verbatim} +def twotimes(N) { + S=2*N; + return(S); +} +\end{verbatim} +\end{screen} +\end{minipage} \quad +% +\begin{minipage}[t]{7cm} +関数 {\tt twotimes(N)} は +$2N$ の値を計算して戻す. \\ +この定義を書いておいて +\begin{verbatim} +A=twotimes(10); +B=twotimes(100); +print(A+B); +\end{verbatim} +を実行すると, {\tt A} には $20$ が代入され, {\tt B} には $200$ が代入され, +{\tt print}文により $220$ が出力される. +そのあと $0$ が出力されるがこれは {\tt print}文の戻り値である. +\end{minipage} \\ +\end{flushleft} + +\noindent +関数の戻り値 (return value) は {\tt return} 文で +指定する. +いまの場合は変数 {\tt S} の値である. +なお, {\tt print} と {\tt return} は違う. +{\tt print} は画面に値を印刷するのに対して, +{\tt return} は関数の値を戻す働きを持つ. +{\tt print} 文では, 関数の値を戻すことはできない. + +``戻り値''(return value) という言い方は計算機言語特有の言いまわしである. +``関数 {\tt twotimes} は引数の2倍を計算して結果を戻す'' みたいに使う. +上の例でいえば {\tt A=twotimes(10)} としたとき, +戻り値が関数の値として変数 {\tt A} に代入される. + + +関数のなかで利用されている変数と引数は, +その関数の実行中のみ生成される変数であり, +さらにその関数外部の同名の変数の値を変えない. +このように一時的に生成される変数を局所変数 (local variable) とよぶ. +関数の中で変数の値を変更したら, その関数の外の同じ名前の変数の +値もかわってしまうとしたら, 処理を分割した利点がすくない. +そこででてきた概念がこの ``局所変数'' +の概念である. +上のプログラム例では, +{\tt N}, {\tt S} が局所変数である. +局所変数はその関数のなかだけで有効な変数である. +これを, ``局所変数のスコープはその関数のなかだけ'' という +言いかたをする. +局所変数の考え方は, 計算機言語の歴史では大発明の一つである. + +\noindent +例: +%%%%%%%%%% mini page template %%%%%%%%%%%% +\begin{flushleft} +\begin{minipage}[t]{7cm} +\begin{screen} +\begin{verbatim} +S=3; +twotimes(2); +print(S); +\end{verbatim} +\end{screen} +\end{minipage} \quad +% +\begin{minipage}[t]{7cm} +このプログラムの {\tt S} と関数 {\tt twotimes} のなかの変数 {\tt S} は別物 +である. +したがって, {\tt twotimes} の終了時点で関数 {\tt twotimes} のなかの変数 {\tt S} +の値は $6$ であるが, {\tt print} 文で {\tt S} の値を表示させてみても +やはり $3$ のままである. +\end{minipage} \\ +\end{flushleft} + + %