【PowerShellでやさしいプログラミング】第5回:場合分けの処理

こんにちは、けいぞうです。

前回の記事はこちら⇩

場合分け」は中学数学で習う考え方ですが、
普通にみんなが日常的に考えていることでもあります。

例えば・・・

今週末の予定を立てよう!

もし晴れたら🌞  → ピクニックに行く
もし雨だったら☔ → 映画館に行く

このように、シチュエーションに応じて何をするかを変えることを
場合分けと言います。

そして、この場合分けは
プログラミングでは基本中の基本の大事な考え方になります💡

if文

プログラミングで場合分けをする方法はいくつかありますが、
最もスタンダードな方法がこの「if文(イフぶん)」を使った方法です。

if文の構文はこんな感じ

※ざっくりイメージ

if ( 条件式 )
{
 条件に一致したときに実施したいこと
}

例えばこれを「天気が晴れたらピクニックに行く」というイメージに書き換えると

※ざっくりイメージ

if ( 天気 -eq 晴れ )
{
 ピクニックに行く
}

こんな感じになります。

条件式の部分に書いてある「-eq」は第4回で出てきた比較演算子でしたね。

さらに、晴れたとき以外の条件を追加したいときもあると思います。
例えば、雨のときなど。

そういう場合は「elseif」を使います。

※ざっくりイメージ

if ( 天気 -eq 晴れ )
{
 ピクニックに行く
}
elseif ( 天気 -eq 雨 )
{
 映画館に行く
}

さらに、どの条件にも一致しないとき、どうするかを決める場合もあると思います。

そういう場合は「else」を使います。

※ざっくりイメージ

if ( 天気 -eq 晴れ )
{
 ピクニックに行く
}
elseif ( 天気 -eq 雨 )
{
 映画館に行く
}
else
{
 お家で過ごす
}


では、具体的にこれをPowerShellで書いたらどうなるか
見ていきましょう。

例として、天気を入力させて
晴れ」なら「ピクニックに行こう!」と表示させる
」なら「映画館に移行!」と表示させる
それ以外なら「お家で過ごそう」と表示させる
プログラムを作成します。

#天気を入力してもらう
$weather = Read-Host "今日の天気は何ですか?"

if ($weather -eq "晴れ") {
    Write-Output "ピクニックに行こう!"
}
elseif ($weather -eq "雨") {
    Write-Output "映画館に行こう!"
}
else {
    Write-Output "お家で過ごそう!"
}

基本的にプログラミングは言語によって書き方が異なりますが、
if文の書き方は大体がおなじような感じですので、

これさえ覚えておけば他の言語にも応用が効きます!

switch文

場合分けの条件分岐が多い場合に
この「switch文(スイッチぶん)」を使います。

if文でも書くことはできますが、
分岐が多いときはswitchを使った方が便利なことがあります。

switch文の構文はこんな感じ

※ざっくりイメージ

switch ( 値 ) 
{    
 条件1 { 値が条件1と一致したときに処理させたい内容 }    
 条件2 { 
値が条件2と一致したときに処理させたい内容  }    
 条件3 { 
値が条件3と一致したときに処理させたい内容  }    
 Default { どの条件にも一致しないときに処理させたい内容 }
}

上記の例では条件1~3を書きましたが、この条件の数は10個でも100個でも
必要な数だけ書いてOKです。

最後に書いてあるDefaultはswitch文特有の書き方で、
どの条件にも一致しない場合に処理させたい内容があるときに記述します。

if文のelseと似ていますね。

先ほどのif文のときと同じ例に条件を追加して、
switch文の具体的な書き方を見てみましょう。

#天気を入力してもらう
$weather = Read-Host "今日の天気は何ですか?"

switch ($weather) {
    "晴れ" { Write-Output "ピクニックに行こう!" }
    "雨" { Write-Output "映画館に行こう!" }
    "雪" { Write-Output "スキーがしたい!" }
    Default { Write-Output "お家で過ごそう" }
}

if文とswitch文の挙動の違いについて

ここは少し細かい話になりますので、
興味ない方はスルーでもOK。

PowerShellでは、if文とswitch文でこのような挙動の違いがありますよ
という話です。

例えば以下のif文を使った例文1

#天気を入力してもらう
$weather = Read-Host "今日の天気は何ですか?"

if ($weather -eq "晴れ") {
    Write-Output "ピクニックに行こう!"
}
elseif ($weather -eq "晴れ") {
    Write-Output "映画館に行こう!"
}
else {
    Write-Output "お家で過ごそう!"
}

それから、以下のswitch文を使った例文2

#天気を入力してもらう
$weather = Read-Host "今日の天気は何ですか?"

switch ($weather) {
    "晴れ" { Write-Output "ピクニックに行こう!" }
    "晴れ" { Write-Output "映画館に行こう!" }
    Default { Write-Output "お家で過ごそう!" }
}

1つ目の条件と、2つ目の条件が同じ「晴れ」のときになっています。

この場合if文の処理結果は以下になります。

ピクニックに行こう!

switch文の処理結果は以下になります。

ピクニックに行こう!
映画館に行こう!

つまり、
if文では最初に合致した条件式に対応する処理のみが実施され、
switch文では全ての条件式に対応する処理が実施されます。

練習問題

問題1

入力された西暦がうるう年かどうか判別するプログラムを作成せよ。

なお、うるう年の条件は以下となる。
・西暦が4で割り切れる
・ただし、上記のうち100で割り切れるものはうるう年ではない
・ただし、上記のうち400で割り切れる年はうるう年

答え

#西暦を入力してもらう
$year = Read-Host "西暦を入力してください。例)2000"

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

if ($year % 400 -eq 0 )  {
    Write-Output "うるう年です"
}
elseif ($year % 100 -eq 0 ) {
    Write-Output "うるう年ではありません"
}
elseif ( $year % 4 -eq 0 ) {
    Write-Output "うるう年です"
}
else {
    Write-Output "うるう年ではありません"
}