見出し画像

高校数学をプログラミングで解く(準備編)「3-2 関数の作成」

マガジンリスト > 準備編 3.テキスト・関数 > 3-2 関数の作成


はじめに

今回は、プログラムを作成するにあたって必要不可欠となる関数化について改めてまとめておきます。

関数化について

「高校数学をプログラミングで解く」では、主に2つの関数化を利用します。返り値を返す関数の作成と返り値を返さない関数の作成です。順に、解説していきます。

返り値を返す関数

まず、返り値を返す関数です。この形の関数は高校数学での関数をプログラムとしての関数にするのに便利です。例えば、高校数学で2次関数$${y=ax^2+bx+c}$$などが挙げられます。

返り値を返す関数の一般形

返り値を返す関数の一般的な形は以下のようになります。

// 返り値を返す関数の一般的な形
datatype_0 function_name( // 1. 関数名
  datatype_1 variable_1, //2. 1つ目の引数
  datatype_2 variable_2, //2. 2つ目の引数
  …
  datatype_n variable_n // 2. n個目の引数
){
  // 3. “{“と”}”の間に、この関数が行う処理を記載
  return value; // 3. 関数のデータ型と一致する値(value)を返す
}

ソースコード1 返り値を返す関数の一般的な形

  1. 最初に関数名(function_name)を与えます。その際、関数名の左側に関数のデータ型(datatype_0)を記載します。

  2. 関数名の右側に“(“と”)”を記載します。それらの括弧の間に、関数の引数を記載します。引数は複数記載することができ、引数同士はカンマ”,”で区切ります。1つの引数は「データ型 変数名」(datatype variable)の形で与えます。なお、引数として与えた変数は、以下の3.で説明する関数の処理の中で宣言することなしに利用することができます。

  3. “)”の右側に、”{“と”}”を記載します。その間に、この関数が行う処理を記載していきます。処理の最後に、処理の結果を”return”の右側に与えます。これを「返り値」と呼びます。返り値は1.で与えた関数のデータ型と一致する値になります。

返り値を返す関数の作成例:2次関数

では、実際に返り値を返す関数を2次関数$${y=ax^2+bx+c}$$を例に作成してみます。

// 2次関数の関数化
float quadraticfunction(
  float a, // 2次の係数
  float b, // 1次の係数
  float c, // 定数項
  float x
){
  return a*x*x + b*x + c;
}

ソースコード2 2次関数の関数化

  1. 関数名は「2次関数」の英語表記「quadraticfunction」とします。また、返り値は2次関数の値で小数(浮動小数点数)となりますので、関数のデータ型はfloat型にします。

  2. また、2次関数$${y=ax^2+bx+c}$$は係数$${a,b,c}$$を決めて変数$${x}$$の値を与えると、関数の値$${y}$$が得られるので、関数の引数は、float型の変数a, b, c, xの4つを用意します。

  3. 2次関数の値を返す関数になりますので、2次関数の値a*x*x + b*x +cをreturnの右側に記述します。

返り値を返す関数の利用例:2次関数

ソースコード2の2次関数を利用して、2次関数$${y=x^2+2x+3}$$の$${x=1}$$での値をコンソールに出力するプログラムを作成します。

// 2次関数y=ax^2+bx+cのグラフを描く
void setup(){

  // 2次関数の係数
  float a = 1.0;
  float b = 2.0;
  float c = 3.0;
  
  // xの値が1のときの2次関数の値を求める
  float x = 1.0;
  float y = quadraticfunction(a, b, c, x);
  println(x, y);
  
}

// 2次関数の関数化
float quadraticfunction(
  float a, // 2次の係数
  float b, // 1次の係数
  float c, // 定数項
  float x
){
  return a*x*x + b*x + c;
}

ソースコード3 2次関数$${y=x^2+2x+3}$$の$${x=1}$$の時の値

このソースコード3を、Processingの開発環境ウィンドウを開いて(スケッチ名を「makeQuadraticFunction」としています)、テキストエディタ部分に書いて実行すると、図1のように、$${x}$$の値とそのときの関数quadraticfunctionの値との組「1.0 6.0」をコンソールに出力します。

図1 関数の結果をコンソールに出力

ソースコード3のように、作成した関数は、他の関数(今回はsetup関数)の中で

  // 2次関数の係数
  float a = 1.0;
  float b = 2.0;
  float c = 3.0;
  
  // xの値が1のときの2次関数の値を求める
  float x = 1.0;
  float y = quadraticfunction(a, b, c, x);

と具体的な値を引数に与えて記述することで利用することができます。これを「関数を呼び出す」と言います。関数を呼び出すと、その関数は具体的な処理を行い、その結果を返り値として返します。今回はその返り値をfloat型の変数yに代入しています。なお、関数自体(今回はquadraticfunction)はsetup関数の下などに記述しておきます(ソースコード3参照)。

返り値を返さない関数

次は、返り値を返さない関数です。この形の関数は図形などを描くプログラムを関数化するのに便利です。

返り値を返さない関数の一般形

返り値を返す関数の一般的な形は以下のようになります。

// 返り値を返さない関数の一般的な形
void function_name( // 1. 関数名
  datatype_1 variable_1, //2. 1つ目の引数
  datatype_2 variable_2, //2. 2つ目の引数
  …
  datatype_n variable_n // 2. n個目の引数
){
  // 3. “{“と”}”の間に、この関数が行う処理を記載
  return; // 省略可
}

ソースコード4 返り値を返さない関数の一般的な形

  1. 最初に関数名(function_name)を与えます。その際、関数名の左側に関数のデータ型として"void"を記載します。

  2. 関数名の右側に“(“と”)”を記載します。それら括弧の間に、関数の引数を記載します。引数は複数記載することができ、引数同士はカンマ”,”で区切ります。1つの引数は「データ型 変数名」(datatype variable)の形で与えます。なお、引数として与えた変数は、以下の3.で説明する関数の処理の中で宣言することなしに利用することができます。

  3. “)”の右側に、”{“と”}”を記載します。その間に、この関数が行う処理を記載していきます。処理の最後に"return;"を記載しますが、返り値を返さない関数の場合、"return"を省略することができます。

返り値を返さない関数の作成例:2重円

では、実際に返り値を返さない関数を2重円を描くプログラムを例に作成してみます。

// 2重円を描くための関数
void doublecircle(
  float x, // 円の中心のx座標
  float y, // 円の中心のy座標
  float r  // 大きい円の半径
){
  circle(x, y, 2.0 * r);
  circle(x, y, 1.0 * r);
  return;
}

ソースコード5 2重円を描くための関数

  1. 関数名は「2重円」の英語表記「doublecircle」とします。また、今回は返り値を返さないので、関数のデータ型はvoidにします。

  2. また、今回は2重円の中心位置$${(x,y)}$$と大きい円の半径$${r}$$(小さい方の半径は大きい方の半径の半分とします)を指定すると、2重円の描画位置とサイズが決まるので、関数の引数は、float型の変数x, y, rの3つを用意します。

  3. 2重円を描くために、circle関数を利用して大きな円と小さな円を順にキャンバスに描くようにコードを記載します。

返り値を返さない関数の利用例:2重円

ソースコード5の2重円を描く関数を利用して、実行ウィンドウのキャンバスの中心位置に半径100ピクセルの2重円を描くプログラムを作成します。

// 2重円を描く
void setup(){
  size(300, 300);

  // 2重円の中心座標と大きい円の半径
  float x = width/2.0;
  float y = height/2.0;
  float r = 100.0;

  // 2重円を描画
  doublecircle(x, y, r);
  
}

// 2重円を描くための関数
void doublecircle(
  float x, // 円の中心のx座標
  float y, // 円の中心のy座標
  float r  // 大きい円の半径
){
  circle(x, y, 2.0 * r);
  circle(x, y, 1.0 * r);
  return;
}

ソースコード6 2重円を描くプログラム

このソースコード6を、Processingの開発環境ウィンドウを開いて(スケッチ名を「drawDoubleCircle」としています)、テキストエディタ部分に書いて実行すると、図2のように、2重円がキャンバス上に描かれます。

図2 2重円

ソースコード6のように、作成した関数は、他の関数の中で

  // 2重円の中心座標と大きい円の半径
  float x = width/2.0;
  float y = height/2.0;
  float r = 100.0;

  // 2重円を描画
  doublecircle(x, y, r);

と具体的な値を引数に与えて記述することで利用できます。

まとめ

プログラムを作成するにあたって必要不可欠となる関数化について改めてまとめました。
関数化は大きく分けて、返り値を返す関数と返り値を返さない関数があります。返り値を返す関数は高校数学での関数をプログラムとしての関数にするのに便利です。一方、返り値を返さない関数は、図形など描くためのプログラムを関数化するときに便利です。
関数化のやり方はどちらも大きく変わりませんが、今後利用していくことで用途別にうまく関数化できるようになってください。

参考文献

Processingをはじめよう 第2版(オライリー・ジャパン、オーム社、ISBN9784873117737)

いいなと思ったら応援しよう!