ケイバハック

競馬ソフトは自分で作ろう!

レース結果を適当に予想するアプリ

入力された頭立て数をチェックするようにしたコンソールアプリ

入力された頭立て数をチェックするようにしたコンソールアプリ

今回は、競馬ソフトを開発してみたいプログラミング未経験者のうち、.NET Core環境での開発手順の基本が分かっている人に向けての情報です。

「.NET Core環境での開発手順って何?」という方は、まずは、次の記事から読み進め、.NET Core環境での開発手順の基本を学んでください。

.NET Core環境でのコンソールアプリを作るときの基本手順

さて、前回のそのレースが何頭立てかを後から変えられるようにしたコンソールアプリの記事では、そのレースの頭立て数をアプリの実行後に入力できるよう改良し、ソースコードが変更できない人でも、アプリを使えるようにしました。

今回は、そのアプリに、さらにもうひと改良加えて、より使いやすくします。具体的には、コンソールに入力された頭立て数が、整数かをチェックし、そうではない場合は、エラーメッセージを表示するように変更します。

ユーザーが何を入力して来るかは、わからない

今回、このようにアプリを改良する目的として、「ユーザーが何を入力して来るかは、わからない」ということがあります。プログラムを作った自分自身は決してやらなくても、他人に使ってもらうと、想定外のことをされるものなんですね。

例えば、次の動画をみてください。

この動画を見ると、前回作成したアプリを実行し、エラーが起きる様子が確認できます。

なぜエラーが起きているかというと、「次のレースは何頭立てですか?:」という質問に対し、本来、数字が入力されるべきところに、「キングカメハメハ」と入力されてしまったからです。

そして、前回作成したソースコードでは、数字が入力される前提でプログラムしていたため、エラーとなっています。

で、さすがに、「次のレースは何頭立てですか?:」という質問に、「キングカメハメハ」と入力するユーザーは、考えにくいです。ですが、全角の数字で「16」と入力したり、漢字で「十頭」と入力する人ならば、いてもおかしくないですよね。

なので、入力された数字が、半角の数字かどうかをチェックする必要があるわけです。

修正するソースコード

では、コンソールに入力された文字が、半角の整数かどうかをチェックするには、どうしたら良いかをご紹介します。

まず、修正後イメージを掴むために、修正後のアプリの動作の様子を、次の動画で確認してください。

修正後の動画を見ると、コンソールで「キングカメハメハ」と入力した場合は、それが不正であることを示す、エラーメッセージが表示されることがわかります。

その後、半角数字で「16」と入力すると、これまで通りに、その頭立て数を上限に、適当な馬番を選んだ結果が表示されています。つまり、半角数字以外が入力されても、問題がなくなりました。

このようにプログラムを改良するためには、Program.csのソースコードを次のように修正します。

Program.csのソースコード

using System;

namespace ConsoleApplication
{
    public class Program
    {
        public static void Main(string[] args)
        {
            //コンソールから何頭立てかを入力させる
            Console.Write("次のレースは何頭立てですか?: ");
            string line = Console.ReadLine();

            //入力された文字が整数かをチェックして設定する
            int toudate = 0;
            if(!int.TryParse(line, out toudate))
            {
                Console.WriteLine("入力された文字が不正です。半角の数字で整数を入力してください。");
                return; //プログラムを終える
            }

            //1〜入力頭立て数の範囲でランダムな数字をkekkaに設定する
            var random = new Random();
            int kekka = random.Next(1, toudate+1);

            //kekkaをコンソールに出力する   
            Console.WriteLine($"次のレースは、{kekka}番の馬が来るよ");   
        }
    }
}

このソースコードにおいて、「//入力された文字が整数かをチェックして設定する」の行から下の数行が、今回の修正のポイントになります。

ここでは、「コンソールから入力された文字を格納する変数lineを整数に変換してみて、ダメだったらエラーメッセージを表示する。変換できる場合は、変数toudateにその数を設定する。」という処理を行っています。

以降は、これまでのソースコードと変わっていません。

条件分岐するためのif文を理解する

さて、今回のソースコードのポイントにおいて、特に重要なのが、「if(!int.TryParse(line, out toudate))」と書いている箇所です。

ここでは、if文と呼ばれる構文を利用し、「整数に変換できる場合・できない場合」の条件分岐を行なっています。

で、if文は、次のように記述することになります。

if(条件)
{
    //条件を満たす時の処理
}

なので、今回のソースコードでは、「!int.TryParse(line, out toudate)」の箇所が、その条件に該当します。

では、「!int.TryParse(line, out toudate)」の箇所がどのような意味なのかというと、「変数lineを整数に変換できない」という意味になります。

ちなみに、先頭の「!」を外して、「int.TryParse(line, out toudate)」とした場合は、「変数lineを整数に変換できる」という意味になります。「!」には、条件を否定する意味があることを覚えておいてください。

つまり、

if(!条件)
{
    //条件を満たさない時の処理
}

ということですね。

今回の例では、整数に変換できない場合にエラーメッセージを表示し、プログラムを終了させたいです。ので、先頭に「!」をつけて、「変換できない」場合の条件分岐を行っています。

if文は、このように、プログラムを作る時に、そのロジックを作るの基本となります。ので、ぜひ使い方を学んでください。

次に読むべき記事:頭立て数が正しく入力されるまで繰り返しチェックするようにしたコンソールアプリ

Return Top