配列は、変数の集合体!電車の連結をイメージしよう!
配列とは?
「プログラミングって、変数をたくさん作らないといけないから大変だなぁ」と思っている方は、ぜひ配列を学習しましょう!
配列とは、同じ型の変数を1列に並べたものです。
イメージとしては、電車をイメージすると分かりやすいと思います。
電車の車両のように、変数同士を繋げたり、切り離したりできます。
また、変数は1つの値しか代入できませんが、配列にはたくさんの値を代入することができます。
そのため配列は、複雑なプログラムをスッキリさせたり、大量のデータを一度に処理させたりできます。
「変数がわからないよ!」という方は、先に下の記事を読んでみると、分かりやすいです。
配列の書き方
配列の書き方は以下のパターンが多いです。
・配列のデータ型の宣言
・配列の初期化
・配列に値を代入
1つずつ見ていきましょう。
配列のデータ型の宣言する方法
まず初めに、配列のデータ型の宣言をします。
これは変数の時と同じですね。
よく使うのは「int型」「double型」「string型」です。
宣言するやり方は、パターンが決まっているので、覚えてしまいましょう。
「データ型をよく知らない」という方は、こちらが参考になります。
配列の宣言は以下のように書きます。
//配列の宣言
int array[3];
これは3つの変数が入る、arrayという名前の配列を宣言しています。
ここでは「int型」です。
「array[]」のカギ括弧の数値を変えることで、任意の個数が入る配列を宣言することができます。
例えば、「array[1000]」のように宣言すると、1000つの変数が入る配列を作成できます。
このように配列は、カギ括弧に数値を入れる必要がありますが、基本的には変数と同じように宣言することが分かると思います。
静的配列は上記の例のように、数値を入れた配列です。
int array[3]のように宣言します。
動的配列は、数値を入れない配列です。
int array[]のように宣言します。
違いは、データの量を制限するかしないかです。
動的配列は、何個でもデータを入れることができます。
しかし、特殊な関数を使うため、静的配列で慣れてから使うことをオススメします。
配列を初期化する方法
配列は宣言したら、次に初期化を行いましょう。
実は初期化しなくても大丈夫なのですが、配列に何もデータが入っていない状態だと、エラーが出てしまうため、初期化はやっておいた方が無難です。
int型の場合、初期化とは配列の全てに「0」を入れることです。
今回は、以下の書き方を紹介します。
//配列の初期化
ArrayInitialize(array,0);
「ArrayInitialize」という関数を使っています。
この関数は、MQLに組み込まれている関数なので、自分で作成する必要はありません。
いつでも使うことができます。
ArrayInitializeは引数が2つあります。
・1つ目には「array」が入っています。先程宣言した配列です。
・2つ目には「0」が入っています。この数値を配列全てに代入します。
つまり、「ArrayInitialize(array,0)」と書くだけで、以下のプログラムを実行したことになります。
//配列全てに「0」を代入
array[0] = 0;
array[1] = 0;
array[2] = 0;
このように配列の初期化は「ArrayInitialize」だけ覚えていれば、問題ないため、覚えておくと良いでしょう。
ちなみに、今回は「int型」の初期化を行いましたが、どのデータ型でも「ArrayInitialize」で初期化できます。
その場合は「0」ではなく、データ型に合った値を書いてください。
例えば、string型なら「ArrayInitialize(array, “”);」といった感じです。
配列の番号は0からスタートします。
なぜ0から始まるのかは、難しすぎるので割愛します。
配列に値を代入する方法
初期化の後は、値を代入していきます。
具体的には、以下の2つの方法があります。
・1つ1つ代入する
・for文と組み合わせる
それぞれ見ていきましょう。
1つ1つ代入する
このやり方が一番簡単ですが、どうしても書く量が多くなってしまうため、ミスに注意しましょう。
メリットは、自由な値を代入できることです。
そのため、文字列を配列として使いたい時などに、この方法でやると良いでしょう。
書き方は、以下のように1つ1つ代入します。
//配列に値を代入
array[0] = "りんご";
array[1] = "ゴリラ";
array[2] = "ラッパ";
このように、配列の要素に1つ1つ代入します。
今回は3つしか書いていませんが、配列の量が多くなると、そのぶん書く量が増えます。
for文と組み合わせる
こちらがオススメの方法です。
配列を使う場合、計算結果を代入することが多いです。
具体的には以下のようなプログラムです。
//配列に値を代入
for(int i = 0; i < 3; i++)
{
array[i] = i+1;
}
今回は、「i+1の計算結果を、配列に代入する」というプログラムを作成しました。
このように、一定の計算の結果を代入する場合は、for文と組み合わせると良いでしょう。
ちなみに、ほとんどのプログラムは、この方法で書かれています。
for文をマスターしていないかたは、こちらの記事を参考にしてください。
配列を使うと何が便利なのか
配列が便利なのは以下3点ができるからです。
・複雑なプログラムがスッキリする
・大量のデータを処理できる
・順番が重要なデータを扱いやすい
それぞれ解説します。
複雑なプログラムがスッキリする
たくさんの変数を使う場合を考えます。
そのときプログラムは、以下のように複雑なものになるでしょう。
//変数を宣言し、代入する
int hensu1 = 1;
int hensu2 = 2;
int hensu3 = 3;
int hensu4 = 4;
int hensu5 = 5;
int hensu6 = 6;
int hensu7 = 7;
int hensu8 = 8;
int hensu9 = 9;
int hensu10 = 10;
//変数の値を表示する
Print(hensu1);
Print(hensu2);
Print(hensu3);
Print(hensu4);
Print(hensu5);
Print(hensu6);
Print(hensu7);
Print(hensu8);
Print(hensu9);
Print(hensu10);
10個の変数を宣言し、値を代入した後に、表示するプログラムです。
この例だと、複雑に見えないかもしれません。
しかしプログラミングのレベルが上がってくると、ものすごく複雑で、読み辛いプログラムになってきます。
「配列を使わないと、何をプログラムしているのか分からなくなる」というレベルです。
これを配列を使って書くと、以下のようになります。
//配列の宣言
int array[10];
//配列に値を代入
array[0] = 1;
array[1] = 2;
array[2] = 3;
array[3] = 4;
array[4] = 5;
array[5] = 6;
array[6] = 7;
array[7] = 8;
array[8] = 9;
array[9] = 10;
//配列の値を表示
Print(array[0]);
Print(array[1]);
Print(array[2]);
Print(array[3]);
Print(array[4]);
Print(array[5]);
Print(array[6]);
Print(array[7]);
Print(array[8]);
Print(array[9]);
先程とほとんど変わってないように見えます。
むしろ配列を使ったために、分かりにくくなっているように思えます。
ちなみにarray[]が配列です。今回は10個の変数の集合体です。
このような配列は、for文と組み合わせることで、下のようなスッキリとしたプログラムになります。
//配列の宣言
int array[10];
//配列の初期化
ArrayInitialize(array,0);
//配列に値を代入
for(int i = 0; i < 10; i++)
{
array[i] = i+1;
}
//配列の値を表示
for(int i = 0; i < 10; i++)
{
Print(array[i]);
}
行数が減り、少しスッキリしたように見えませんか?
プログラムを書く量が減り、疲れも溜まりにくいでしょう。
ちなみに、このプログラムを書いていて気づきましたが、配列を使った方が書くスピードが圧倒的に早いです。
というのも、「代入」と「表示」の部分はコピペで済んだからです。
このようにプログラムの見た目がスッキリするだけでなく、書くスピードも格段にアップさせることができるのが配列です。
大量のデータを処理できる
先程のプログラム例では、10個の変数を使っていましたが、今回は1,000,000個の変数を使う場合を考えます。
当然ながら、手動で1,000,000個の変数を宣言することは不可能だと思います。
宣言できたとしても、取り扱うことは難しいでしょう。
この場合でも配列を利用すると、とても便利です。
以下のプログラム例を見てください。
//配列の宣言
int array[1000000];
//配列の初期化
ArrayInitialize(array,0);
//配列に値を代入
for(int i = 0; i < 1000000; i++)
{
array[i] = i+1;
}
//配列の値を表示
for(int i = 0; i < 1000000; i++)
{
Print(array[i]);
}
先程のプログラム例とほとんど同じです。
しかし、今回のプログラムは1,000,000個の変数の集合体です。
2行目を見てください。以下のプログラムが書かれています。
int array[1000000];
1,000,000個の値を代入できる配列を宣言しています。
この1行だけで、「1,000,000個の変数を宣言した」ことと同じなのです。
このように配列を使うと、手動では到底できないプログラミングを、とても簡単に書くことができます。
順番が重要なデータを扱いやすい
順番が重要なデータを扱いやすいことも、配列の特徴です。
例えば「時間」です。
1時 → 2時 → 3時 → ・・・ → 12時 と、順番がとても重要です。
2時 → 1時 は絶対にあり得ません。
この場合でも配列が役に立ちます。
下のプログラム例を見てください。
//配列の宣言
int times[12];
//配列の初期化
ArrayInitialize(times,0);
//配列に値を代入
for(int i = 0; i < 12; i++)
{
times[i] = i+1;
}
//配列の値を表示
for(int i = 0; i < 12; i++)
{
Print(times[i+1]);
}
またまたプログラムの使い回しです(汗)
今回は、意味のない1,000,000個の配列ではなく、「時間」という順番に意味のある配列です。
少し詳しく見ていきましょう。
times[]という配列は、12個の変数の集合体です。
times[0]~times[11] までの配列です。
times[0]、times[1]、・・・times[11] がそれぞれ変数と同じ機能です。
そのため、それぞれに値を代入することができます。
次に配列の意味を見ていきましょう。
・times[0] は1時を表現している
・times[1] は2時を表現している
・times[2] は3時を表現している
というように、今回は配列に意味があります。
プログラミングする時には、何を表現しているのかを常に考えましょう。
ちなみに代入するものは、適切なものを代入してください。
例えば、「times[2]は3時を表現しているため、”おやつの時間”という値を代入」という感じです。
配列のプログラム例
配列のプログラム例は、こちらになります。
//+------------------------------------------------------------------+
//| SampleMQL_Array.mq4 |
//| Copyright 2021, 朝日奈りさFXchannel |
//| https://mql-programing.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, 朝日奈りさFXchannel"
#property link "https://mql-programing.com/"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//配列の宣言
int array[10];
//配列の初期化
ArrayInitialize(array,0);
//配列に値を代入
for(int i = 0; i < 10; i++)
{
array[i] = i+1;
}
//配列の値を表示
for(int i = 0; i < 10; i++)
{
Print(array[i]);
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
プログラム例を、OnInit関数に書きました。
このプログラムを動かすと、コンソールに1~10までの数字が出力されます。
コンソールは MT4 > ターミナル > エキスパートタブ から確認することができます。
実行結果は以下のようになります。
ちゃんと1~10までの値が出力されていることが分かります。
まとめ
配列はパッと見、難しそうですが、変数を順番に繋いでいるだけと考えましょう。
また、配列の使い方は3ステップあり、これを完了することで、配列を使えるようになります。
・配列のデータ型の宣言
・配列の初期化
・配列に値を代入
特にfor文と組み合わせることができるようになると、プログラミングが楽になって来ますので、マスターすることをオススメします。
まずは1つ1つ代入してみて、配列のコツを掴んでください!
コメント