【PowerShellでやさしいプログラミング】第6回:繰り返し処理

前回の記事はこちら⇩

今回は「繰り返し処理」というテーマです。

例えば・・・

体重が65kg以下になるまで
 →毎日5kmランニングする

このように、我々は日常生活のなかでも、目標を満たすまで何か繰り返す
ということを行っていますよね。

これが「繰り返し処理」です。
ループ処理」とも言います。

プログラミングでは、
上記の繰り返し処理は「while文」を使って以下のように書くことができます。

※ざっくりイメージ

while(体重が65kgより大きい)
{
    5kmランニングする
}

⇧これを実行すると、体重が65kg以下になるまで
5kmのランニングをすることになります。

このような繰り返し処理は
プログラミングにおいては重要で初歩的な考え方になるので
しっかり押さえておきましょう。

今回は「繰り返し処理」の中でも、
特によく使われる「 while文 」と「 for文 」について説明していきます。

while文

はじめに書いたように、while文

条件を満たしている間は処理を繰り返し続ける

ものになります。
PowerShellでのwhile文の構文は以下になります。

while( 繰り返し条件 )
{
    処理内容
}

繰り返し条件“が満たされる間は { } 内が繰り返し実行されて、”処理内容“が実行され続けます。


例えば、数値型の変数に1をプラスし続けて、100になるまで繰り返す処理をする場合は、以下のように書きます。

$number = 0
while( $number -eq 100 )
{
    $number++
}

「$number++」という書き方は$numbreにプラス1するという書き方ですね。
第4回の「式と演算子」で出てきた書き方です。

無限ループに注意

上記のような足し算であれば、{ } 内の処理内容が実行され続ければいずれは100に到達して、繰り返し条件を満たさないようになり、ループを抜けることができます。

が、処理内容に不具合があり、永久にループを抜けることが無い処理を書いてしまうと、プログラムが実行されてしまったら最後。

ずーっと動き続けてしまいます。
そうなったら強制終了するしかなくなります。

プログラムを強制終了させるというのは、
よっぽどのことで、通常はあまりすることはありません。

無限ループしてしまうプログラムを作ってしまったらこうなりますので、
注意しましょう。

for文

まずはfor文の構文を以下に書いてみます。
⇩こんな感じです。

for( 最初にする処理; 繰り返し条件; 毎回実施する処理; )
{
    処理内容
}

while文より少し構文が複雑になっています。

イメージしやすいように簡単な例文をみてみましょう。

for( $i = 1; $i -le 10; $i++)
{
    Write-Output "繰り返し $i 回目"
}
#-leは「<=」と同じ。「以下」の意味。$iが10以下のとき繰り返す

※実行結果

繰り返し 1 回目
繰り返し 2 回目
繰り返し 3 回目
繰り返し 4 回目
繰り返し 5 回目
繰り返し 6 回目
繰り返し 7 回目
繰り返し 8 回目
繰り返し 9 回目
繰り返し 10 回目

このように、while文と同じように「繰り返し条件」を満たす間は処理内容を実行し続けるのですが、

while文と違うところは「最初にする処理」と「毎回実施する処理」があるところです。

以下のような順番で処理が実行されます

1.最初にする処理を実行
2.繰り返し条件を満たすかチェック
  →満たさなかったらここでループ終了
3.処理内容を実行
4.毎回する処理を実行
5.繰り返し条件を満たすかチェック
  →満たさなかったらここでループ終了
6.毎回する処理を実行
7.繰り返し条件を満たすかチェック
  →満たさなかったらここでループ終了
以下繰り返す・・・

図にするとこんな感じになります

このような感じで、最初に処理する内容、毎回実施する処理の内容を明記するのがfor文になります。

具体的に何回ループ処理させたい、とかいう場合によく使いますので覚えておくと良いでしょう。

foreach文

for文の兄弟的な存在として「foreach文」というものがあります。

以下の記事で使い方をサラリと説明していますので、参考にどうぞご覧ください。

breakとcontinue

break(ループを強制的に抜ける)

繰り返し処理では「繰り返し条件」を満たす間は処理内容を続けるというものですが、

場合によっては強制的にループ処理を中断させたい場合があると思います。
その時使用するのが「break」です。

例えば、先に説明した以下のfor文

for( $i = 1; $i -le 10; $i++)
{
    Write-Output "繰り返し $i 回目"
}

これだと10回ループが繰り返されますが、
例えばこれを強制的に5回目で終わらせたい場合はこのように書きます。

for( $i = 1; $i -le 10; $i++)
{
    Write-Output "繰り返し $i 回目"
    
    if($i -eq 5)
    {
        break
    }
}

continue(次のループ処理に移る)

breakの場合はループ処理を完全に抜ける場合に使用しますが、

そうではなくて、今回のループ処理だけは処理内容を実施せずに、次のループに移りたい場合などもあると思います。
そのようなときにcontinueを使います。

例えば、同じように以下のfor文

for( $i = 1; $i -le 10; $i++)
{
    Write-Output "繰り返し $i 回目"
}

※処理結果

繰り返し 1 回目
繰り返し 2 回目
繰り返し 3 回目
繰り返し 4 回目
繰り返し 5 回目
繰り返し 6 回目
繰り返し 7 回目
繰り返し 8 回目
繰り返し 9 回目
繰り返し 10 回目

今回は、ループの5回目のときだけ、処理内容をスキップしたいとしましょう。
以下のように書くことで実現できます。

for( $i = 1; $i -le 10; $i++)
{
    if($i -eq 5)
    {
        continue
    }

    Write-Output "繰り返し $i 回目"
}

繰り返し 1 回目
繰り返し 2 回目
繰り返し 3 回目
繰り返し 4 回目
繰り返し 6 回目
繰り返し 7 回目
繰り返し 8 回目
繰り返し 9 回目
繰り返し 10 回目


このようにbreakとcontinueを使うことで

繰り返し処理の例外的な処理を書くことが出来るので、
より複雑な処理を記述することができるようになります。

練習問題

問題1

入力された数字の回数だけ「*」を表示するプログラムを作成せよ

問題2

入力された数字が素数であるかどうか判別するプログラムを作成せよ
※素数:1より大きくて、1と自分自身以外の数字で割り切れる数が無い自然数のこと

答え1

#数値を入力してもらう
$num = Read-Host "数字を入力してください"

#数値型に変換
$num = [System.Int32]$num

for ($i = 0; $i -lt $num; $i++) {
    Write-Output "*"
}

実行結果

答え2

#数値型に変換
$num = [System.Int32]$num

#素数フラグ
$primeNumber = $true
for ($i = 2; $i -lt $num; $i++) {
    if ($num % $i -eq 0) 
    {
        Write-Output "素数ではありません"
        $primeNumber = $false
        break    
    }
}

if ($primeNumber) {
    Write-Output "素数です"
}

実行結果