第5講 メソッド(1)
第6話 戻り値
今まで扱ってきた関数(社員)は、命じられた仕事をするだけで、
結果を命令者に報告しませんでしたが、
結果を報告する社員もあります。
結果を報告するを正確に表現すると、
値を返す−−−になります。
例えば、1から100までの和を調べて報告しなさいと、
命じられて和5050を報告する社員が考えられます。
くどいようですが、比輸でなく正確に表現すると、
値5050を返すメソッドです。
この返す値を戻り値といいます。
ここでも事例を示しましょう。
//以下C#を始めるためのお呪い
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//以上C#を始めるためのお呪い
namespace a //初心者はお呪い=決まり事と思い一切気にしない
{
class Program //初心者はお呪い=決まり事と思い一切気にしない
{
static void Main(string[] args) //私は社長だ。
{
int x = 3;
Console.WriteLine("{0:d}の2倍は{1:d}です", x, f(x));
}
static int f(int x)
{
return (2 * x); //xを2倍にして返す
}
}
}
実行画面
3の2倍は6です。
どうして戻り値といい、そしてどこに返しているかと申しますと、
の図をご覧になればわかります。
戻す値だから戻り値ですし、
戻す場所は図のf(x)です。
さて、なぜ関数というのでしょうか。
コードを次のように書き換えて下さい。
//以下C#を始めるためのお呪い
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//以上C#を始めるためのお呪い
namespace a //初心者はお呪い=決まり事と思い一切気にしない
{
class Program //初心者はお呪い=決まり事と思い一切気にしない
{
static void Main(string[] args) //私は社長だ。
{
int x = 3,y;
y = f(x);
Console.WriteLine("{0:d}の2倍は{1:d}です", x, y);
}
static int f(int x)
{
return (2 * x); //xを2倍にして返す
}
}
}
実行結果はまったく同じです。
コードを書き換えた意図は、
y = f(x);
にあります。
高校の数学で学びましたよね。
これがメソッドですね。
メソッドとは、左の入り口から値を入れると加工されて別の値となり、
出てくるものです。
私の実家は、温泉まんじゅうを製造販売していましたが、
その製造機械は原料を入れると加工して、おまんじゅうを出してくれるものでした。
つまり、入り口から原料を入れると、
出口からはおまんじゅうが出てきました。
関数=メソッドとはおまんじゅう製造機械のようなものです。
値を加工して別の値を出してくれる機械がメソッドだとイメージすれば良いのです。
今回のコード
//以下C#を始めるためのお呪い
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//以上C#を始めるためのお呪い
namespace a //初心者はお呪い=決まり事と思い一切気にしない
{
class Program //初心者はお呪い=決まり事と思い一切気にしない
{
static void Main(string[] args) //私は社長だ。
{
int x = 3,y;
y = f(x);
Console.WriteLine("{0:d}の2倍は{1:d}です", x, y);
}
static int f(int x)
{
return (2 * x); //xを2倍にして返す
}
}
}
だと、入り口から3を入れると2倍に加工され、6となって出てきます。
その加工工場こそ
static int f(int x)
{
return (2 * x); //xを2倍にして返す
}
なのです。
尚、
//以下C#を始めるためのお呪い
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//以上C#を始めるためのお呪い
namespace a //初心者はお呪い=決まり事と思い一切気にしない
{
class Program //初心者はお呪い=決まり事と思い一切気にしない
{
static void Main(string[] args) //私は社長だ。
{
int x = 3;
Console.WriteLine("{0:d}の2倍は{1:d}です", x, f(x));
}
static int f(int x)
{
return (2 * x); //xを2倍にして返す
}
}
}
は、ピンクの部分を削り、青の部分を下のように変更して、
//以下C#を始めるためのお呪い
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//以上C#を始めるためのお呪い
namespace a //初心者はお呪い=決まり事と思い一切気にしない
{
class Program //初心者はお呪い=決まり事と思い一切気にしない
{
static void Main(string[] args) //私は社長だ。
{
Console.WriteLine("{0:d}の2倍は{1:d}です", 3, f(3));
}
static int f(int x)
{
return (2 * x); //xを2倍にして返す
}
}
}
としても同じです。
Console.WriteLine("{0:d}の2倍は{1:d}です", x, f(x));
のxは箱そのものではなく箱の中身である値3でしたね。
変数そのものか変数の参照(変数に入っている値)はちゃんと区別して下さい。
後でもう一度詳しく触れますが、引数で渡しているものは、
変数そのもの(箱そのもの)ではなくて、
あくまで、変数に入っている値(箱に入っている値)であることに注意して下さい。
箱そのものは原則として渡せません。
(原則としてという言葉に留意して下さい。
実は、C#には箱そのものは渡せないのに、
箱を他の社員に使わせるという摩訶不思議な方法が用意されています。)
この世の中は関数で出来ていると言っても過言でないと申し上げたことがあります。
生物もインプットとアウトプットでできています。
単細胞生物も外界から栄養を吸収して、
不要物を排出します。
O157等の細菌の場合、その排出したものが人間にとっては毒物ですから、
問題になるわけですが、
生物の連鎖って結局は、インプットとアウトプットですね。
会社も同じです。
原材料を購入して、加工して製品として売り出す。
入り口と出口です。
資本を投入すると、
より多くの資本となって帰ってくるから営利企業が成立するわけです。
これもインプットとアウトプットです。
数学の関数という考え方は、
分析哲学の物事は関数関係で出来ているというアイデアの先取りだったわけです。
仕事の単位=細胞をC言語とC++では関数といいます。
でも、値を返さないvoid型もどうして関数というのでしょうか。
値を返さないとしても、仕事をするということ自体が、
命令に対する回答ですね。
仕事をすること自体が仕事を命じた人への見返りだと考えれば、
void型の仕事をする塊のことを、
関数と呼んで良いことになります。
それで、プログラムを構成する単位=細胞=部品(パーツ)のことをC言語とC++では、
関数と呼ぶのです。
そして、C#では、関数のことをメソッドと呼んでいるわけです。
では、問題を出して第6話を終了します。
第5話の解答例
B引数を初項・交差・末項にして等差数列の和を計算。ただし、引数の各値はmain()においてキーボード上から取得。
//以下C#を始めるためのお呪い
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//以上C#を始めるためのお呪い
namespace a //初心者はお呪い=決まり事と思い一切気にしない
{
class Program //初心者はお呪い=決まり事と思い一切気にしない
{
static void Main(string[] args) //私は社長だ。
{
int s, k, m; //s:初項 k:交差 m:末項
Console.WriteLine("キーボーから初項、交差、末項を順に入力して下さい。");
Console.Write("初項=");
s = int.Parse(Console.ReadLine()); //キーボードからsの値を取得
Console.Write("交差=");
k = int.Parse(Console.ReadLine()); //キーボードからkの値を取得
Console.Write("末項=");
m = int.Parse(Console.ReadLine()); //キーボードからmの値を取得
f(s, k, m); //社員f()に仕事を命じている。
}
static void f(int s,int k,int m)
{
int w = 0;
for (int i = s; i<= m; i += k) w += i;
Console.WriteLine("初項{0:d}、交差{1:d}、末項{2:d}の等差数列の和={3:d}",
s, k, m, w);
}
}
}
のメソッドf()を戻り値を持つタイプに変更して、同じ実行結果になるプログラムを考えて下さい。
ただし、コンソール画面への表示の仕事はMain()が担当するものとします。