GNU/Linux >> Linux の 問題 >  >> Linux

方法:プログラミング入門–フロー制御

ハウツーシリーズ

これは、プログラミング入門

の5部構成のシリーズの第4部です。

  1. プログラミング入門:はじめに
  2. プログラミング入門:最初のプログラム
  3. プログラミング入門:変数、型、およびデータの操作
  4. プログラミング入門:フロー制御
  5. プログラミング入門:オブジェクト指向プログラミング

おかえりなさい、意欲的なプログラマー!

この記事では、制御フローと、条件、分岐、ループ、およびその他のメカニズムを使用して、プログラムで何が発生するかを判断する方法について説明します。

このシリーズの以前の記事をまだ読んでいない場合は、読むことを強くお勧めします。私たちはこれらすべての記事の以前の知識に基づいて構築しているので、私たちがすでにカバーしたことを理解していることを理解することが重要です。

この記事ではカバーすることがたくさんあるので、それ以上の式典なしで、ビジネスに取り掛かりましょう。

例外の処理

最後にプログラムを終了したとき、3行のコードと問題がありました。コードは次のようになります:

Console.WriteLine("Guess a number between 1 and 10:");
string text = Console.ReadLine();
int input = int.Parse(text);

ただし、このプログラムを実行し、プロンプトが表示されたときに数字以外のものを入力すると、コンパイラが非数値テキストを整数に変換する方法を知らないため、プログラムがクラッシュします。

前回から思い出すと、いわゆる例外が発生します 、これは、非常に特殊な状況、つまり例外的な状況が発生した場合に、プログラムのフローを制御する方法の1つです。

例外処理から始めたいと思いました。これは、フロー制御で最も複雑で混乱を招く可能性があるトピックであるためです。ここで行うことを理解できれば、残りの概念をはるかに理解しやすくなります。

プログラミングでの例外処理については、理解しておく必要のある2つの重要なアイデアがあります。最初のアイデアは、プログラムに何かを試すように依頼できるということです。 2番目のアイデアは、コンピューターが試行していることに失敗した場合、問題を見つけて処理できるということです。

これらの2つのアイデアは、セーフティネットを備えた綱渡りのように機能します。ほとんどの場合、綱渡り(プログラム)は綱渡りに沿って通常どおりに実行できます。しかし、綱渡りの失敗(例外)など、異常なことが起こった場合は、パフォーマーが地面に急降下するのを防ぐためのセーフティネットが必要です(例外を処理するためのキャッチ)。

例外処理を理解すると、問題の解決策を見つけることができます。コンピューターにテキストを整数に解析するように依頼できます。失敗した場合は、プログラムをクラッシュさせるのではなく、間違いを見つけてユーザーに伝え、再試行するように依頼できます。

それが私たちのコードでどのように見えるか見てみましょう。

Console.WriteLine("Guess a number between 1 and 10:");
string text = Console.ReadLine();
int input = 0;
try
{
    input = int.Parse(text);
}
catch
{
    Console.WriteLine("Whoops, you didn't enter a number");
}

最初の変更は、最初にintを設定することです。 ユーザーからのテキスト入力の解析結果に設定する前に、ゼロに入力します。最初に値をゼロに設定し、後で別の値に設定した特定の理由があります。

tryの後に注意してください 行、私たちが試したいコードは、次のような中括弧で囲まれています:

{
}

C#および多くの同様の言語では、中括弧を使用して、特定のアクション、操作、さらには可変のライフサイクルの範囲を包含または制限します。一般に、変数はこれらの括弧内でのみ存続します。コードの実行がこれらの角かっこのセットを終了すると、その中の変数はすべて消えます(範囲外と呼ばれることもあります)。

catchの後に同じ中括弧が表示されます 行も、中括弧内にあるものはすべて、間違いまたは例外をキャッチした場合にのみ実行する必要があるという指示です。中括弧内のコードは、多くの場合、コードブロックと呼ばれます。 。

これが意味するのは、intを作成した場合です。 入力 try内 コードブロックの場合、tryを渡すと、変数は消えてしまいます。 コードブロックであり、シークレット値と一致するかどうかを確認するためにアクセスできなくなりました。コードから例を作成して、私が何を意味するかを示します。以下の図1で、intを定義しない方法に注意してください。 入力 tryの中括弧の中に入るまで ステートメント。

図1:可変スコープ

ああ、//で始まる行があることに注意してください 。 C#では、二重スラッシュは、その後に続くものはすべて、行の終わりまではプログラムの一部ではないコメントであることを示します。コンパイラはそのような行を単に無視します。


プログラムを試すために、catch内にブレークポイントを設定できます。 Console.WriteLineの角かっこ 行、次にプログラムを実行します。数値以外の入力を入力して、プログラムがクラッシュするのではなく、catchにステップインすることを確認します。 コードブロックを実行すると、図2に示すように、最終的にユーザーにエラーメッセージが表示されます。

図2:例外がキャッチされました!

条件

現在、このコードは値を読み込んでいるため、現在記述されているようにかなり役に立たないが、ユーザーが間違いを犯したかどうかをユーザーに伝えることを除いて、値を何にも使用していない。これを試して、たとえば7の数字を入力しても、ブレークポイントがヒットしないことを確認できます。

コードを推測ゲームとして役立つようにするには、正しい数を推測したかどうかをテストする必要があります。ここでは、条件と呼ばれる新しいフロー制御の概念を導入する必要があります。 。

条件は、特定のルールまたはルールのセットが満たされた場合にのみ実行されるコードブロックです。このような条件は、ifという単語で始まります。 かっこでチェックしているルールまたはルールのセットを続け、次に実行するコードブロックを続けます。

if (condition is met) 
{
    // execute this code block
}

もちろん、これらの条件をフォーマットする方法には非常に厳密な構文規則があり、必ずしも直感的であるとは限りません。たとえば、値を比較するには、C#では2つの等号を使用する必要があり、JavaScriptでは3つの等号を使用する必要があります。 (1つの等号を使用することが割り当ての方法であることを忘れないでください 値。)

if (value == other_value) // example value comparison

さまざまな比較演算子を使用でき、残りはもう少し直感的です。たとえば、通常の数学と同様に、大なり記号(>)と小なり記号(<)を使用し、これらを等号と組み合わせて、以上(> =)または以下(<=)の条件を作成できます。

ネガティブな条件を作成することもできます。多くのプログラミング言語では、感嘆符(!)を使用して負の演算子を示します。これは、「バング」とも呼ばれます。たとえば、2つの値が等しくない場合に実行される条件を作成する場合は、次のように記述できます。

if (value != other_value)

&&のいずれかを使用して異なる条件を分離することにより、複数の条件を作成することもできます。 (ダブルアンパサンド)「AND」条件または||の場合 (二重パイプ)「OR」条件の場合。

if (value1 == other_value && value2 == other_value) … 
//means both value1 and value2 must be equal to other_value

if (value1 == other_value || value2 == other_value) … 
//means either value1 or value2 must be equal to other_value

条件を使用して、プレーヤーが正しい数を推測したかどうかを確認するためのテストを作成できます。 catchの最後の中括弧の後に次の行を追加します コードブロック:

if (input == 3)
{
    Console.WriteLine("Congratulations! You guessed correctly!");
}

この条件は、入力かどうかをテストします (ユーザーが入力した値)は3に等しい。この条件が満たされると、図3に示すように、ゲームはお祝いのメモを表示します。

図3:条件が満たされ、おめでとうございます

ユーザーが数字の3を推測しない場合、プログラムはそれ以上何も表示せず、アプリケーションは終了します。

コードのどこにでもブレークポイントを設定して実行を停止し、実行中の結果を確認できることを忘れないでください。これからコードに加える変更の結果を確認するために、これを実行します。


ただし、ユーザーが正しい番号を推測しなかった場合に別のメッセージを表示できれば便利です。幸いなことに、条件によってはelseを介してこの動作も可能になります キーワード。

else キーワードはifの直後に配置する必要があります コードブロックし、ifの括弧内の条件が発生した場合に何が起こるかを示します ステートメントが実行されません。これを試すには、ifの後に次の行を追加します ブロック:

else
{
    Console.WriteLine("No, sorry, that wasn't it. Better luck next time!");
}

これで、条件付きコードブロック全体が下の図4のようになります。

図4:条件付きコードブロックを使用したゲームプログラムコードの推測

プログラムを実行すると、3を推測するかどうかに応じて、おめでとうまたは再試行の励ましが得られます。このタイプのフロー制御を条件付き分岐と呼びます。 プログラムは、あなたが提示した条件に応じて、1つまたは別のブランチに入るからです。

魔法の数が常に3であることを知らない人のために、オッズを少し上げましょう。プレイヤーが正しく推測しない場合は、何度も推測を試みることができます。

ループに行く

この新しい機能を実現するには、ループと呼ばれるものを実装する必要があります。 。プログラミングでは、ループは繰り返し実行されるコードのブロックです。 2つの非常に一般的なループタイプはfor ループとwhile ループします。

forの最適な使用法 ループとは、何かを起こさせたい特定の回数がある場合です。それをコードで始めて、それが私たちをどこに導くかを見てみましょう。

for ループ、キーワードforが必要です その後に、3つの情報を含む括弧で囲まれたブロックが続きます。

まず、ループの開始環境を定義します。これには、コードブロックが実行された回数を追跡するために使用する変数が含まれます。次に、ループを続行するかどうかを決定する条件が必要です。最後に、ループを実行するたびにループ条件に加えたい変更があります。例を見てみましょう。

for (int i = 0; i < 3; i++)
{
    // This code block will execute three times.
}

ここで重要なのは最初の行です。私が言及した3つの部分を区切るセミコロンに注意してください。各部分の内訳は次のとおりです。

int i=0; // Initialization: Creates an integer variable called "i" and sets it to 0.
i<3; // Condition: Continue executing as long as "i" is less than 3.
i++ // Change happening during each loop: "i" increases by one each time the loop runs.

i++ 表記はi=i+1を書くための省略形です 、 iを設定します iの値に プラス1–つまり、 iが増加します 一つ。 i=i+1と書くこともできます 同様に、この特定のパターンはプログラミングで非常に一般的であるため、有用な例として示します。

forに続くブロックに入れるものは何でも ループ宣言は、条件が満たされている限り(この場合は3回)発生します。たとえば、Console.WriteLine()を追加できます コードブロック内で、下の図5のように、3回繰り返されます。

for (int i = 0; i < 3; i++)
{
    Console.WriteLine("I am in a loop!");
}

図5:「私はループに入っています!」

この種のループを使用して、ユーザーが正しい数を何度も推測できるようにします。したがって、すでに作成したプログラム全体をfor内にラップできます。 上記のようにループします。コードは次の図6のようになります。

図6:推測ループ

もちろん、3回の試行に達する前に正しい数を推測した場合、推測を続けることは意味がありません。そのため、私たちは非常に悪いことをしようとしています…。

継続実行の条件は、 iであることを忘れないでください 3未満のままです。したがって、ループを停止する場合は、 iを増やすだけです。 ループを停止するには、3以上にします。 i = 3を追加した場合 下の図7に示すように、ユーザーが正しく推測した場合に実行されるブロック内では、ユーザーが3を推測するとゲームが停止します。

図7:Forループの短絡

なぜこれが悪い考えなのか理解できないかもしれません。実際、それは技術的な議論というよりも哲学的な議論です。しかし、それは重要な議論なので、それを作りましょう。

for ループは、特定の回数実行するように設計されています。ループを何回実行するかが事前にわからない場合は、for ループは悪い選択です。このタスクにより適した他のループ形式があるため、forを使用します ループがジョブに間違ったツールを選択しています。

この議論は取るに足らないものであり、衒学的に思えるかもしれません。プログラムはそのままで正常に動作し、期待どおりに動作します。

ただし、プログラマーの心は明確さを目指して努力する必要があり、この例は確かに明確ではありません。現在のコードの最初の行を見ると、これは3回実行されるループだと思いますが、ループが1〜3回実行されるように、途中でループを「チート」します。私たちが知る方法はありません。何が起こるかという明確さを破りましたが、それは悪いことです。

誰かがコードを読んでいることを気にしない場合でも、プログラマーとして、私たちは意図を理解できないマシンを使用していることを忘れないでください。それは私たちが言うことだけを正確に理解します。不明な場合は、予期しない結果が生じる可能性が高くなります。プログラムがより複雑になると、将来的に問題が発生するリスクがあります。

そのため、より良いアプローチを見つける必要があり、そのより良いアプローチはwhile ループ。

Whileループ

while ループは、条件が真のときに実行されます。それが何回であっても関係ありません。条件が真である限り、ループは継続します。

while ループは、forよりも宣言が簡単です。 ループし、キーワードwhileで構成されます 続いて、開き括弧、条件、および閉じ括弧が続きます。

while (condition) 
{
    // Code to execute
}

明確な条件がない場合、この実行は非常に危険です。間違いを犯したり、すべての条件やイベントを適切に説明しなかったりすると、プログラムが暴走し、マシンが停止する可能性があります。

危険なのは、実行を停止したいときにコードブロック内の条件を無効にすることを確認することです。それ以外の場合、ループは永久に実行されます。

forを変更しましょう whileにループします ループして、ユーザーが3回推測していない限り実行します。 int i=0;を宣言することで、この条件を作成できます。 ループが開始する前に、 iの値を設定します ループ内。そのようにコードを更新します:

static void Main(string[] args)
{
    int i=0;
    while(i < 3)
    {
        Console.WriteLine("Guess a number between 1 and 10:");
        string text = Console.ReadLine();
        int input = 0;
        try
        {
            input = int.Parse(text);
        }
        catch
        {
            Console.WriteLine("Whoops, you didn't enter a number");
        }
        if (input == 3)
        {
            Console.WriteLine("Congratulations! You guessed correctly!");
            i = 3;
        }
        else
        {
            Console.WriteLine("No, sorry, that wasn't it. Better luck next time!");
        }
    }
}

このコードには誤りがあることに注意してください。これは、無限ループを作成するのがいかに簡単かを示しています。 iは増えていません 正しく推測しない限り!言い換えれば、プレーヤーは無限の試行を取得しますが、正しく推測しない場合は推測を停止する方法はありません!

幸いなことに、このプログラムを開始すると、答えは3に固定されているので推測できますが、それを除けば、手に大きな問題がある可能性があります。

これは、whileの使用を怖がらせないためです。 ループするのではなく、彼らの力に対する尊敬の念を植え付けるためです。 While ループは非常に強力で便利ですが、注意しないと危険な場合もあります。

問題を修正するには、i++;を追加します whileコードブロック内の最初の行として、Console.WriteLine("Guess a number between 1 and 10:")の直前 。これで、コードは期待どおりに機能し、非常に明確になり、非常に基本的ですが退屈な推測ゲームが得られるはずです。

オブジェクト指向のプレビュー

では、このゲームをリモートでさらに面白くするために何ができるでしょうか。わかっています、秘密の番号をランダムにしましょう!

乱数を作成するためにいくつかの新しいアイデアを導入する必要があるため、これを行うのを控えました。これらのアイデアは、オブジェクト指向を扱う次の記事で明らかになります。とりあえず、コードをお伝えしましょう。このシリーズの最後の記事で、コードが何をするのかを詳しく説明します。

static void Main(string[] args)
{
    Random random = new Random(); // Object orientation stuff
    int answer = random.Next(10)+1; // Give me a random number less than 10 and add one
    int i = 0;
    while (i < 3)
    {
        i++;
        Console.WriteLine("Guess a number between 1 and 10:");
        string text = Console.ReadLine();
        int input = 0;
        try
        {
            input = int.Parse(text);
        }
        catch
        {
            Console.WriteLine("Whoops, you didn't enter a number");
        }
        if (input == answer)
        {
            Console.WriteLine("Congratulations! You guessed correctly!");
            i = 3;
        }
        else
        {
            Console.WriteLine("No, sorry, that wasn't it. Better luck next time!");
        }
    }
}

現在2つの新しい行と1つの変更された行があります。新しい行はランダムな整数answerを作成します 1から10の間で、変更された行で、ユーザーが推測したものをそのランダムな答えと比較します。

今のところ、乱数の生成について心配する必要はありません。次の記事で説明します。しかし、今のところ、おめでとうございます。これにより、プログラマーであることに加えて、正式にゲーム開発者になります。今すぐゲームをプレイして、運賃を確認してください。平均して、10回のうち3回ゲームに勝つ必要があります。

追加の演習として、ゲームの終了後に、秘密の番号が何であるかをプレーヤーに伝えるメッセージを追加してみませんか?ただし、ここでは、まとめて、説明した内容を確認しましょう。

まとめ

この記事では、プログラムフローと、プログラムのフローを制御する方法について学習しました。間違いを処理するための例外について学びました。 ifを使用したコードブロックと条件分岐について学習しました。 およびelseforを使用したループについても学習しました およびwhile

次の記事では、ゲームを磨き上げるために少し時間を費やします。また、オブジェクト指向についても詳しく調べます。

ハウツーシリーズ

これは、プログラミング入門

の5部構成のシリーズの第4部です。
  1. プログラミング入門:はじめに
  2. プログラミング入門:最初のプログラム
  3. プログラミング入門:変数、型、およびデータの操作
  4. プログラミング入門:フロー制御
  5. プログラミング入門:オブジェクト指向プログラミング

Linux
  1. Cプログラミング言語-はじめに

  2. プログラミング言語の学習を開始する方法

  3. 方法:Pythonでのソケットプログラミング

  1. LinuxにNimプログラミング言語をインストールする方法

  2. バージョン管理システムの概要

  3. プログラムの出力をZipファイルにリダイレクトする方法は??

  1. Vagrantコマンドを使用してVagrantボックスを制御する方法

  2. AlpineLinuxにGoプログラミング言語をインストールする方法

  3. Vestaコントロールパネルでウェブサイトを作成する方法