前回の続きです。
未だ、
F1-2.プログラミングの基礎1を読んでいないプログラミング未経験者は
F1-2.プログラミングの基礎1のページを読んで下さい。
繰り返し
今回はプログラムの基本動作の1つの「繰り返し」について説明します。
まずは前回最後に作成した
インクリメントを使って変数を0から5まで加算するプログラムを見てみましょう。
ソースコード:
#property strict
void OnStart()
{
int template_value;
template_value = 0;
Print( template_value );
template_value++;
Print( template_value );
template_value++;
Print( template_value );
template_value++;
Print( template_value );
template_value++;
Print( template_value );
template_value++;
Print( template_value );
}
結果:
TestProgram EURUSD,H1: 0
TestProgram EURUSD,H1: 1
TestProgram EURUSD,H1: 2
TestProgram EURUSD,H1: 3
TestProgram EURUSD,H1: 4
TestProgram EURUSD,H1: 5
同じ事を繰り返していて無駄に感じません?
これを1万回
インクリメントする事を想像して見て下さい。
簡単なプログラムを作成して自動化すれば、プログラム作成と動作チェックも含めて5分以内で終わる作業を、
コンピュータを使ってわざわざ手入力で残業しているIT企業の社員みたいな事をやっていますよね?
せっかくコンピュータを使っているんですから、こういう単純な機械作業は全てコンピュータに指示してやらせましょう。
コンピュータはこういう機械作業の繰り返しが大得意です。
ソースコード:
#property strict
void OnStart()
{
int template_value;
template_value = 0;
Print( template_value );
int count;
for ( count = 0; count < 5; count++ )
{
template_value++;
Print( template_value );
}
}
結果:
TestProgram EURUSD,H1: 0
TestProgram EURUSD,H1: 1
TestProgram EURUSD,H1: 2
TestProgram EURUSD,H1: 3
TestProgram EURUSD,H1: 4
TestProgram EURUSD,H1: 5
for文の式を見て、訳が分からなくて見る気を無くしました?
とりあえず説明しないので、ソースコードとフローチャートを見比べて、感覚的にどういう動作をしているのかを感じ取って下さい。
感じ取る事は出来ました?
緑色の囲いの中で処理が繰り返されている事をなんとなく感じ取れたと思います。
そして中括弧{ }で囲まれている部分の処理が繰り返されている事をなんとなく感じ取れたと思います。
この中括弧は
重文処理と呼びますが、
今は詳しいことを知る必要はありません、動作から感じ取って下さい。
ちなみに
重文処理の中の処理をオフセットさせていますが
これは単純にソースコードを読み易くする為です。
このオフセットする事を
インデントと呼びます。
未だ
インデントの必要性を感じ取れないかもしれませんが、
ソースコードが長くなってくると必要性を理解できるようになると思いますので、今はとりあえず深く考え込む必要はありません。
ところでプログラミング未経験者の人はちゃんと手を動かして説明した通りにプログラムを作成して動作させていますよね?
ただ見ているだけでは全く役に立たないので、面倒でも実際に手を動かして下さい。
for文の使い方
今度は
for文の動作を感じ取りましょう。
結果:
TestProgram EURUSD,H1: ループ開始前
TestProgram EURUSD,H1: 0
TestProgram EURUSD,H1: 1
TestProgram EURUSD,H1: 2
TestProgram EURUSD,H1: 3
TestProgram EURUSD,H1: 4
TestProgram EURUSD,H1: ループ終了後
TestProgram EURUSD,H1: 5
for文とループ処理の動作を見る事に重点を置いたソースコードです。
ええ言いたい事は分かります、
Print( "ループ開始前" );
ダブルクォーテーション(")で囲まれた日本語が登場していますが、今は気にしないで下さい。
ソースコードに日本語や全角文字は使えませんが、
文字列や
コメントだけは日本語や全角文字が使えます。
でも細かい事は今は気にしないで下さい。
「日本語のログ出力をしたい場合はこうすればいいいんだ~」とだけ感じ取ってくれれば大丈夫です。
今回確認したいのは、ループ開始前とループ終了後の間のログ出力内容です。
今は細かい説明はしません、フローチャートとログ出力内容を見比べて、
for文がどういう動作をしているのかを感じ取って下さい。
よく分からなかったら単純に5回処理を繰り返したい時に
ソースコード:
int count;
for ( count = 0; count < 5; count++ )
{
Print( count );
}
このソースコードをパクって下さい。
この
for文ループの繰り返し処理は良く使われます。
それでは簡単に説明します。
for文で繰り返し処理をするにはループ用の変数が必要という事はなんとなく感じ取れました?
for文の最初の「count = 0;」はループ用の変数を初期化しています。
2番目の「count < 5;」はcountの値を5と比較しています。
「<」は
関係演算子(比較演算子とも呼ばれます)でcountと5より小さいかを比較する為の演算子です。
countの値が5未満の場合は
中括弧{}内の処理を行います。
3番目の「count++」は、
中括弧{}内の処理が終了する度に処理されます。
つまり最初に
中括弧{}の処理を開始した時は処理されません。
なので最初のログ出力でcountの値を見ると0になっています。
そして
中括弧{}内の処理が終了する度に処理されるので、
ループ処理が終わって、ループ処理を抜けた先でcountの値を確認すると、
インクリメントされています。
これは最後にループ処理内でcountが4まで加算された後に、
中括弧{}内の処理が終了した時にcountが
インクリメントされてcountの値が5になります、
その後に「count < 5;」の比較が行われて
forループ処理を抜けるので、
forループ処理を抜けた先でcountの値を確認すると5になります。
説明内容を読んでも理解出来ない人は、とにかくソースコードと結果を見比べて動作を感じ取って下さい。
ところでプログラミング未経験者の人はちゃんと手を動かして説明した通りにプログラムを作成して動作させていますよね?
ただ見ているだけでは全く役に立たないので、面倒でも実際に手を動かして下さい。
変数名について
forループ用の変数名に「i」や「j」という一文字を使う人が多いのですが、
これはプログラム言語の参考書のサンプルソースに「i」や「j」がよく使われるからだと思います。
IT企業でも当たり前のように「i」や「j」という一文字が使われています。
私はicountやjcount等の長い名前を使用します。
理由としては「i」という一文字にすると検索時に大量にヒットしてしまう為、
いちいち単語検索指定をしなければならなくなり、その時間が勿体ないというか面倒というか煩わしいからです。
こういう地味に時間を奪われる事で作業工数を損失していきます。
実際のソースコードで「i」を検索してみると
「i」で検索してヒットした部分が青くなっていますが、検索で大量にヒットして検索の意味を成していないですよね?
ループ用変数名に「i」を使っている人は何も不便さを感じないのでしょうか?
他みんなが当然のように「i」を使うので、逆に私だけが頭がおかしいだけなのかもしれませんがw
管理人の個人的なルールですが、ループ用変数の命名規則として
・3文字以上
・ソースコード中の他単語と被らない名前にする
・小文字のみ使用
というのを独自に設けています。
これは単純に、検索のデフォルト設定が
「大文字/小文字の区別」をOFF
「単語の検索」をOFF
「正規表現」をOFF
にしている為、この検索条件で意図しない単語にヒットする事を避ける為に意識して変数名を決めています。
条件分岐
プログラムの基本動作の「処理」「繰り返し」「条件分岐」の最後の「条件分岐」の説明です。
条件分岐は簡単に言うと、処理の分かれ道です。
フローチャートの菱形の部分が条件分岐です。
条件の内容がTrueなら処理Aに進み、Falseなら処理Aを回避します。
結果:
TestProgram EURUSD,H1: 処理A
TestProgram EURUSD,H1: 処理B
まず最初にint型の変数宣言と初期化を同時に行っていますが、こういう事も出来ます。
if文の処理の中で「==」という演算子が登場しました。
前回「=」は値を代入する為の説明しました。
今回の「==」は値が等しいか比較するための
比較演算子です。
「==」は左辺と右辺を比較して、内容が一致していれば
trueを返し、不一致なら
falseを返します。
演算子 |
使用例 |
意味 |
== |
a == b |
aとbが等しければtrue |
!= |
a != b |
aとbが等しくなければtrue |
< |
a < b |
aがbより小さければtrue |
> |
a > b |
aがbより大きければtrue |
<= |
a <= b |
aがb以下であればtrue |
>= |
a >= b |
aがb以上であればtrue |
フローチャートにすると
test_noの値が0なので、「test_no == 0」の結果は
trueになります。
なので
if文は
trueのルートを通ります。
今回は
falseのルートを通っていないので分かり難いかもしれません。
次は
falseのルートを通らせる為に、test_noの初期値を1に変更して下さい。
結果:
TestProgram EURUSD,H1: 処理B
test_noの値が1なので、「test_no == 1」の結果は
falseになります。
今回は
falseのルートを通って
trueのルートを回避した事が分かります。
次は条件分岐でそれぞれ違う処理を行わせる方法です。
結果:
TestProgram EURUSD,H1: 処理B
TestProgram EURUSD,H1: 処理C
if文で
falseの処理を行いたい場合は、
else文を使う必要があります。
気が付かれたと思いますが、for文の時のように
重文処理(中括弧{}で囲まれた部分だけが処理)が使われます。
ところでプログラミング未経験者の人はちゃんと手を動かして説明した通りにプログラムを作成して動作させていますよね?
ただ見ているだけでは全く役に立たないので、面倒でも実際に手を動かして下さい。
3つ以上の条件分岐
ルートを2つに分岐する方法は分かったと思いますので、次は3つ以上の条件分岐を体得しましょう。
結果:
TestProgram EURUSD,H1: 処理C
TestProgram EURUSD,H1: 処理D
3つ以上の条件分岐の場合は、
if文と
else文の間に、
else if文を追加します。
まず最初に
if文で判定を行いfalseであれば、
次の
else if文の判定を行います。
その
else if文の判定結果もfalseであれば、
最後の
elseの処理が行われます。
更に条件分岐を増やしたいのであれば、
else if文の判定処理を追加します。
ところでプログラミング未経験者の人はちゃんと手を動かして説明した通りにプログラムを作成して動作させていますよね?
ただ見ているだけでは全く役に立たないので、面倒でも実際に手を動かして下さい。
判定条件が複数の条件分岐
最後に判定条件が複数存在する場合の条件分岐を体得しましょう。
どういう事かと言うと、フラグAとフラグBの2つの条件を見て条件分岐をする状況の事です。
結果:
TestProgram EURUSD,H1: true
突然
bool型という変数が登場しましたが、これは
true/
falseの値を入れる為の変数です。
注目して欲しい部分は
result = flag_A && flag_B;
「&&」という
論理演算子です。
「&&」は論理積またはAndと呼ばれ、
左辺と右辺の両方がtrueの場合に、trueを返します。
左辺と右辺のいずれかがfalseの場合は、falseを返します。
■「&&」論理積(And)のパターン
左辺 |
右辺 |
結果 |
false |
false |
false |
false |
true |
false |
true |
false |
false |
true |
true |
true |
もう一つよく使われる
論理演算子で「||」があります。
「||」は論理和またはOrと呼ばれ、
左辺と右辺のいずれかがtrueの場合は、trueを返します。
左辺と右辺の両方がfalseの場合に、falseを返します。
■「||」論理和(Or)のパターン
左辺 |
右辺 |
結果 |
false |
false |
false |
false |
true |
true |
true |
false |
true |
true |
true |
true |
論理積(&&)を用いたif文判定
それでは実際にif文判定で論理積(&&)を使ってみましょう。
変数の値が20以上且つ80以下かどうかを判定します。
結果:
TestProgram EURUSD,H1: ●範囲内
TestProgram EURUSD,H1: 50
temp_valueの値を変化させると結果は以下の通りになります。
■結果一覧
temp_valueの値 |
結果 |
19 |
範囲外 |
20 |
●範囲内 |
21 |
●範囲内 |
79 |
●範囲内 |
80 |
●範囲内 |
81 |
範囲外 |
重要な閾値付近のみ確認しました。
見ての通りtemp_valueの値が20以上 且つ 80以下の場合に、trueのルートを通っています。
理由は、まず左辺と右辺がそれぞれ
比較演算子で判定を行っていて、それぞれが判定結果を返します。
もう忘れてしまったかもしれませんが、
比較演算子はtrue/falseの結果を返します。
比較演算子の結果を
「&&」論理積演算子で判定し、両辺がtrueなのでtrueを返します。
if文は、最後の論理積の判定結果を判定します。
細かい説明をするとこんな感じです。
これもよく使われる演算子なので体得して欲しいのですが、この説明が難しいと感じるのであれば、
ソースコードと結果一覧を眺めて、なんとなく動作を感じ取って下さい。
早い話が、左辺と右辺の両方ともtrueならtrue、それ以外ならfalseという事です。
難しく考える必要はありません。
ところでプログラミング未経験者の人はちゃんと手を動かして説明した通りにプログラムを作成して動作させていますよね?
ただ見ているだけでは全く役に立たないので、面倒でも実際に手を動かして下さい。
論理和(||)を用いたif文判定
今度は逆の論理和(||)を使ってみましょう。
変数の値が20未満又は80より大きいかを判定します。
結果:
TestProgram EURUSD,H1: 範囲外
TestProgram EURUSD,H1: 50
temp_valueの値を変化させると結果は以下の通りになります。
■結果一覧
temp_valueの値 |
結果 |
19 |
●範囲内 |
20 |
範囲外 |
21 |
範囲外 |
79 |
範囲外 |
80 |
範囲外 |
81 |
●範囲内 |
こちらの場合は
早い話が、左辺と右辺のいずれかがtrueならtrue、それ以外ならfalseという事です。
難しく考える必要はありません。
ところでプログラミング未経験者の人はちゃんと手を動かして説明した通りにプログラムを作成して動作させていますよね?
ただ見ているだけでは全く役に立たないので、面倒でも実際に手を動かして下さい。