CodeGym /コース /C# SELF /ネストされたif、多段階ロジック

ネストされたif、多段階ロジック

C# SELF
レベル 3 , レッスン 2
使用可能

1. ネストされたifの基本構文

リアルな場面で、判断が一つの条件だけで決まることってあんまりないよね。たいてい複数の条件を同時にチェックするし、それらはお互いに依存してることも多い。例えば、コンサートに行くには大人であるだけじゃ足りなくて、招待リストに載ってる必要がある場合もある。こういう時に登場するのが、いわゆる多段階ロジックで、それを助けてくれるのがネストされたif文なんだ。

ネストされた条件っていうのは、あるifの中にさらに別のifが入ってる状態。箱の中に箱があるイメージだね:最初の箱が開いた(条件がtrueになった)ら、中身を見て、さらにもう一つ箱を開けるかも。コードとロジック的には、これってかなり強力なツールだよ。

まずはシンプルな例から:

if (条件A)
{
    // 条件Aがtrue(真)のときの処理
    if (条件B)
    {
        // 両方の条件が真のときの処理
    }
}
外側の ifの中にネストされた if

これ、マトリョーシカを思い出したら正解!外側のifが通ったときだけ、中のネストされたifが実行されるよ。

例:クラブへの入場

前にユーザーが名前と年齢を入力するアプリを作ったよね。今度はチェックをもう一段追加しよう:例えば、クローズドなクラブに入るには21歳以上かつ招待コードが必要、みたいな感じ。

Console.Write("あなたの名前を入力してください: ");
string name = Console.ReadLine();

Console.Write("あなたの年齢を入力してください: ");
int age = int.Parse(Console.ReadLine());

if (age >= 21)
{
    Console.Write("招待コードを入力してください: ");
    string code = Console.ReadLine();

    if (code == "VIP2024")
    {
        Console.WriteLine("ようこそ、" + name + "さん、VIPクラブへ!");
    }
    else
    {
        Console.WriteLine("ごめん、コードが間違ってる。入場できません。");
    }
}
else
{
    Console.WriteLine("ごめん、21歳からしか入れないよ!");
}

ポイント:内側のifは、年齢チェックを通った場合だけコードを確認する。これでリソースも節約できるし(警備員もイライラしない)。

2. ネストの深さはどこまでOK?

技術的には、いくらでもネストできる。でも実際は、ネストが深くなればなるほどコードが読みにくくなるし、メンテも大変。現場では23段くらいまでが普通。もしifが4段以上の「はしご」になってたら、ロジックをもっとシンプルにできないか、あるいは一部を関数に分けられないか考えてみて(それはまた別のレクチャーで!)。

3. ネストされたifとelse:落とし穴とコツ

初心者あるある:波括弧の書き方が雑。

ネストした条件を書くとき、特にelseを使う場合、C#はシンタックスのルールに超厳しい。波括弧{}を付けないと、ifelseの直後の1行だけが対象になる。これがバグの温床なんだよね。

ミスしやすい例:

if (age >= 21)
    if (code == "VIP2024")
        Console.WriteLine("ようこそ!");
else
    Console.WriteLine("コードが違うよ。");

多くの人はelseが年齢チェックに対応してると思うけど、実は直前のif(招待コードのチェック)にくっついてる。だから、思った通りにメッセージが出ないことも。波括弧は必ず付けよう—中身が1行でもね!

誤解を避けるためにもう一度。コンパイラは上のコードをこう解釈するよ:

if (age >= 21)
{    
    if (code == "VIP2024")
        Console.WriteLine("ようこそ!");
else
    Console.WriteLine("コードが違うよ。");
}    

大事なことなので繰り返す!
if-else構文で波括弧がないと、elseは直前(いちばん近い)のifにくっつくよ。

4. 代替案:ネスト内のelse if

外側のifの中で、追加の条件だけじゃなくて、別の選択肢も用意したいときがあるよね。例えば、招待コードが違ったらチケット購入を提案する、みたいな。これはネストしたelse if/elseで書ける:

if (age >= 21)
{
    Console.Write("招待コードを入力してください: ");
    string code = Console.ReadLine();

    if (code == "VIP2024")
    {
        Console.WriteLine("クラブへようこそ!");
    }
    else if (code == "GUEST")
    {
        Console.WriteLine("ゲストモード:23:00まで入場OK。");
    }
    else
    {
        Console.WriteLine("残念、入場できません。");
    }
}
else
{
    Console.WriteLine("21歳からしか入れないよ。");
}

この例では、VIPコード・ゲストコード・拒否の3パターンをネストで分岐してる。

5. 実践:多段階ロジックの割引計算アプリ

こんなアプリを書いてみよう:ユーザーの年齢とクラブカードの有無で、ショップの割引率を決めるやつ。

  • ユーザーの年齢が60以上なら、割引は15%
  • 年齢がそれ未満で、クラブカードを持っていれば7%
  • それ以外は割引なし。

どう書く?

Console.Write("あなたの年齢を入力してください: ");
int age = int.Parse(Console.ReadLine());

double discount = 0.0;

if (age >= 60)
{
    discount = 0.15;
}
else
{
    Console.Write("クラブカードを持っていますか(はい/いいえ)? ");
    string hasCard = Console.ReadLine();

    if (hasCard == "はい")
    {
        discount = 0.07;
    }
}

Console.WriteLine("あなたの割引率: " + (discount * 100) + "%");

ここでは、elseの中にネストしたifを使ってる。年齢が条件に合わなかったときだけ、カードを持ってるか聞くようにしてるよ。

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION