プログラミング学習入門、アルゴリズムの考え方がわかる記事

アルゴリズムのイメージ画像 技術コラム

アルゴリズムとは、コンピュータの計算方法を意味します。プログラマーは、自分が実現したい目的を達成する為に、正しい計算手順(アルゴリズム)を考え構築します。

プログラミングにある程度慣れてくると、まるでパズルゲームを解いていく様な感覚で、面白くなっていきます。小学生でも、プログラミングが楽しく組める時代です。

JavaScriptの入門講座を既に終えた方であれば、更に理解が深まる内容となっております。無料ですのでぜひご活用ください。

プログラミング学習入門、アルゴリズムの考え方

難しくて面倒な計算は、コンピュータが代わりにやってくれます。プログラミングは、高度な数学的知識が無くても、コツがわかれば誰でも簡単に組むことが出来ます。

プログラマーに課せられた使命は、正しい理論(アルゴリズム)を構築する事です。

具体例 . 1: 三角形の面積を求めるプログラム

アルゴリズム構築の最も単純な例として、三角形の面積を求めるプログラムを作る必要がある場合を考えます。

三角形の面積を求める公式は、底辺 × 高さ ÷ 2 です。

これをJavaScriptで考えると、以下の様なコードになります。

var baseLength = 10;  // 底辺の長さが10
var heightLength = 5; // 高さの長さが5

var areaSize = baseLength * heightLength / 2;  // 三角形の公式で、面積を求める。

console.log(areaSize);  // ログに面積が表示される。(25)

このように、プログラマーは自分の目的を達成する為に、まずは必要なパーツを揃えます。後はそれらを正しい手順で当てはめる事で、アルゴリズムを構築する事が出来ます。

アルゴリズムの考え方フローチャート画像

1. 自分の目的をはっきりさせる。 → 2.目的達成に必要なパーツを全て洗い出す。 → 3.処理の流れを考える。 → プログラムコードに当てはめる。(コードを実際に記述する。)

具体例 . 2:面積を求めたい三角形が複数ある場合

三角形の面積を求める基本的な流れ(アルゴリズム)は、先程完成しました。複数ある場合は、先程のコードを流用する事が出来ます。

// 三角形A
var baseLength_A = 10;  // 底辺の長さが10
var heightLength_A = 5; // 高さの長さが5

var areaSize_A = baseLength_A * heightLength_A / 2;  // 三角形の公式で、面積を求める。

console.log(areaSize_A);  // ログに面積が表示される。(25)

// 三角形B
var baseLength_B = 3;  // 底辺の長さが3
var heightLength_B = 2; // 高さの長さが2

var areaSize_B = baseLength_B * heightLength_B / 2;  // 三角形の公式で、面積を求める。

console.log(areaSize_B);  // ログに面積が表示される。(3)

具体例.1で示した通り、一番シンプルな形(最小パターン)をまず完成させ、具体例.2の様に、後は繰り返し同じアルゴリズムを流用すれば良い、という考え方がプログラムを組む上では非常に有効です。

アルゴリズムの考え方フローチャート画像

三角形の面積を求めるアルゴリズムは繰り返し使用されるので、この部分を関数化出来ると便利です。

function calcAreaOfTriangle(base, height) {
  return base * height / 2;
}

具体例 . 3:三角形が無数にある場合

こちらは脱初心者を目指す際に参考に成り得る知識となりますので、まだプログラミング学習したての場合は、しっかりと理解出来なくて大丈夫です。ステップアップを目指す際に、そういえばこんなやり方があったな、と思い返して頂けましたら幸いです。

先程と同じ方法でも実現可能ですが、コードが汚くなり見辛くなってしまいます。ひたすらコピペを繰り返すのも、人為的な間違いが起こり易く、スマートではありません。

三角形の底辺と高さは、プログラミング講座でご紹介した「オブジェクト」を用いて一つのセットとして捉えてみましょう。更にそれらを「配列」でまとめて、無数の三角形の集まりとして管理すると、とても実用的で変化に強いプログラムを組むことが出来ます。

function calcAreaOfTriangle(base, height) {
  return base * height / 2;
}

var triangleList = [];

function mainProc() {
  
  function Triangle(name, baseLength, heightLength) {
    this.name = name;
    this.baseLength = baseLength;
    this.heightLength = heightLength;
  }
  
  triangleList.push(new Triangle("三角形A", 10, 5));
  triangleList.push(new Triangle("三角形B", 3, 2));
  triangleList.push(new Triangle("三角形C", 5, 4));
  triangleList.push(new Triangle("三角形D", 20, 10));
  triangleList.push(new Triangle("三角形E", 30, 25));
  
  triangleList.forEach(function (obj) {
    var areaSize = calcAreaOfTriangle(obj.baseLength, obj.heightLength);
    console.log(obj.name + ":", areaSize);
  });
}
オブジェクト指向のログ

上記のコードでは、一行のコードで新しい三角形を生成出来ます。

triangleList.push(new Triangle("三角形A", 10, 5));  // 新しい三角形を生成

例えば、ユーザーが新しい三角形を新規作成するボタンを用意して、入力した名前、底辺、高さで作れるようにしたい、といった時に便利な構造です。

ボタンをクリックした時に、以下の関数を呼び出せば、新しい三角形を無数に追加できる様になります。

function addTriangle(){
  var name = 入力された名前
  var base = 入力された底辺
  var height = 入力された高さ
  triangleList.push(new Triangle(name, base, height));
}

アルゴリズムを組む際には、「いかに楽をするか」という堕落的思考を持つ事も大切です。ただし、最小パターンは完璧に作っておく必要があります。そうでないと、全てが台無しです。

苦労して実現したごちゃごちゃのコードよりも、さくっと書いたシンプルなコードの方が、圧倒的にメンテナンスしやすく、また理解もしやすいので再利用性が高いです。

プログラミング脱初心者 – オブジェクト指向プログラミングへの入口

三角形という物(オブジェクト)に、自分自身の面積を返す機能(メソッド)を追加する事で、より管理しやすいコードデザインになります。

function Triangle(name, baseLength, heightLength) {
  this.name = name;
  this.baseLength = baseLength;
  this.heightLength = heightLength;

  this.getArea = function calcArea() {
    return this.baseLength * this.heightLength / 2;
  }
}

var triangleList = [];

function mainProc() {
  
  triangleList.push(new Triangle("三角形A", 10, 5));
  triangleList.push(new Triangle("三角形B", 3, 2));
  triangleList.push(new Triangle("三角形C", 5, 4));
  triangleList.push(new Triangle("三角形D", 20, 10));
  triangleList.push(new Triangle("三角形E", 30, 25));
  
  triangleList.forEach(function (obj) {
    console.log(obj.name + ":", obj.getArea());
  });
}
オブジェクト指向のログ

オブジェクト指向プログラミングとは?

  • オブジェクトごとにパラメータと機能をひと固まりにまとめる。

分かり易い例として、RPGゲームを想像して下さい。キャラクターにはレベルや体力、攻撃力などの基本的なステータス(パラメータ値)があります。特殊スキルとして、敵をスタンさせる、味方を回復させるなどの機能を盛り込むとより楽しいゲームになりますよね。こういった時に、オブジェクトごとにパラメータと機能をひと固まりにまとめると、プログラムコードのメンテナンスがとても楽になります。

  • 共通の記述で処理が出来る。

キャラクターそれぞれが歩いたり、走ったりするスピードの速度に違いがあったとしても、プログラムコード上では、キャラクターが歩く、キャラクターが走るといった様に、共通の記述で処理が出来ると、とても便利です。(コントローラで移動するボタンが押された時に、プレイヤーが現在選択中のキャラクターのパラメータを参照するといったイメージ)今回の三角形の例では、全ての異なる三角形を、共通の記述 obj.getArea() で面積を求める事が出来ています。

オブジェクト指向プログラミングはデザインパターンであり、あくまで抽象的な表現です。大変奥が深く、活用出来ると素晴らしい成果を得る事が出来ます。まずは基礎を身に付け自信が湧いてきたら、ぜひ学習を深めて頂けたらと思います。

以下は、三角形だけでなく、四角形も扱えるようにした具体例です。

function Triangle(name, baseLength, heightLength) {
  this.name = name;
  this.baseLength = baseLength;
  this.heightLength = heightLength;

  this.getArea = function calcArea() {
    return this.baseLength * this.heightLength / 2;
  }
}

function Square(name, baseLength, heightLength) {
  this.name = name;
  this.baseLength = baseLength;
  this.heightLength = heightLength;

  this.getArea = function calcArea() {
    return this.baseLength * this.heightLength;
  }
}

var figureList = [];

function mainProc() {
  figureList.push(new Triangle("三角形A", 10, 5));
  figureList.push(new Triangle("三角形B", 3, 2));
  figureList.push(new Triangle("三角形C", 5, 4));
  figureList.push(new Square("四角形A", 10, 10));
  
  figureList.forEach(function (obj) {
    console.log(obj.name + ":", obj.getArea());
  });
}
オブジェクト指向のログ画像

まとめ

・アルゴリズムとは、コンピュータの計算手順・理論を意味します。

・まずは目的を明確にし、次に必要な材料を揃え、アルゴリズムを構築しましょう。

・もっと楽が出来ないか、抜け目なく機会を伺い続けましょう。

コメント