技術とか戦略とか

SIerで証券レガシーシステムを8年いじってからSESに転職した業務系エンジニアによる技術ブログ。

for文を書けない・使いこなせない方に向けて

for文は意外と理解が難しく、ここで躓いた経験がある人は決して少なくありません。
for文の文法を理解していたとしても、for文を使うべき箇所で使えていないこともあります。
 
プログラムの基本は「順次」と「分岐」と「反復」ですが、for文は最後の「反復」にあたります。
今回の記事では、「反復」について、その使い所を一つずつ順を追って説明していきます。
説明の際には、画面に特定の文字を出力する例を挙げていきます。
 
----
 
まず、以下のように文字を出力する例を考えてみます。
☆★
 
これは、以下のようにプログラミングすれば出力できます。
「☆」を出力する
「★」を出力する
 
----
 
次に、以下のように文字を出力する例を考えてみます。
☆★☆★☆★☆★☆★
 
先ほどと同じ要領で、以下のようにプログラミングすれば出力できます。
「☆」を出力する
「★」を出力する
「☆」を出力する
「★」を出力する
「☆」を出力する
「★」を出力する
「☆」を出力する
「★」を出力する
「☆」を出力する
「★」を出力する
 
----
 
しかし、この書き方では、出力する文字数だけプログラミングする量が増えてしまいます。
仮に100文字出力する場合、100行書く必要が出てきてしまいます。
 
このような場合、「反復」の出番です。
「反復」を用いることで、プログラミングする量を減らすことができる場合があります。
「プログラミングする量を減らすことができる場合」とは、「法則がある場合」です。
 
今回の例で言うと
・最初に「☆」を出力する
・次に「★」を出力する
というパターンが繰り返されている、という法則があります。
 
この法則を「反復」というパターンでプログラミングすると、以下のようになります。
繰り返し開始
 「☆」を出力する
 「★」を出力する
繰り返し終了
 
----
 
しかし、先ほどのようにプログラミングしてしまうと、以下のように出力されています。
☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★…(以降繰り返し)
 
本当は10文字分、つまり5回分だけ繰り返して欲しいのですが、そうはならずに、処理が繰り返され続けてしまいます。
これは、「無限ループ」と呼ばれるバグであり、実務でも良く見るバグです。
 
これを防ぐためには、「反復」を止める条件を書く必要があります。
イメージとしては、以下のようにプログラミングする必要があります。
繰り返し開始(5回分だけ)
 「☆」を出力する
 「★」を出力する
繰り返し終了
 
----
 
「反復」を止める条件、先ほどの例で言うと「5回分だけ」という部分に関しては、いくつか書き方があります。
for文の場合は、以下の式を使って条件を指定します。
・初期化式…繰り返しを始める前の処理
・条件式 …繰り返しを続ける条件
・変化式 …1回の繰り返しが終わる度に実行される処理
 
これらの式を記述する上では、「ループカウンタ」と呼ばれる値を用いることが多いです。
ループカウンタとは、今が何回目の繰り返しなのか、というのを示す値です。
1回目の繰り返しなら「1」、2回目の繰り返しなら「2」…といったように増えていく値です。
 
これらの式を使って「反復」を止める条件を書くと、以下のようになります。
繰り返し開始
初期化式:ループカウンタを1にする
条件式 :ループカウンタが5以下なら処理を続ける
変化式 :ループカウンタを1増やす
 「☆」を出力する
 「★」を出力する
繰り返し終了
 
このようにプログラミングした場合、以下のように処理が行われます。
・繰り返しの最初でループカウンタが1になる
・繰り返しの中の処理で「☆」と「★」を出力する
・繰り返しが終わる時にループカウンタを1増やして2にする
・ループカウンタが5以下なので繰り返しを続ける
・繰り返しの中の処理で「☆」と「★」を出力する
・繰り返しが終わる時にループカウンタを1増やして3にする
・ループカウンタが5以下なので繰り返しを続ける
・繰り返しの中の処理で「☆」と「★」を出力する
・繰り返しが終わる時にループカウンタを1増やして4にする
・ループカウンタが5以下なので繰り返しを続ける
・繰り返しの中の処理で「☆」と「★」を出力する
・繰り返しが終わる時にループカウンタを1増やして5にする
・ループカウンタが5以下なので繰り返しを続ける
・繰り返しの中の処理で「☆」と「★」を出力する
・繰り返しが終わる時にループカウンタを1増やして6にする
・ループカウンタが5以下ではないので繰り返しを終える
 
----
 
ループカウンタは、繰り返しの中の処理で使うこともできます。
そうすることで、より複雑な処理を書くことができるようになります。
 
例えば、最初の繰り返しだけ「☆」と「★」の代わりに「□」と「■」を出力したいとします。
出力のイメージは以下です。
□■☆★☆★☆★☆★
 
このように出力したい場合、以下のように繰り返しの中でループカウンタを使って分岐条件を書くことで、上手くプログラミングすることができます。
繰り返し開始
初期化式:ループカウンタを1にする
条件式 :ループカウンタが5以下なら処理を続ける
変化式 :ループカウンタを1増やす
 もしループカウンタが1の場合は
  「□」を出力する
  「■」を出力する
 そうではない場合は
  「☆」を出力する
  「★」を出力する
繰り返し終了