C++ でコンソール電卓を作成する

C++ プログラマーにとってよくある出発点は、コマンド ラインで実行される "Hello, world!" アプリケーションです。 この記事ではまず、電卓アプリというより困難な作業に進みます。

前提条件

  • C++ ワークロードを使用したデスクトップ開発がコンピューターにインストールされ、実行されている Visual Studio。 インストールするには、Visual Studio での C++ サポートのインストールに関するページを参照してください
  • このチュートリアルでは、アプリの実行中にコードを変更できるエディット コンティニュという機能を示します。 編集を有効にして続行するには、メイン メニューから [ツール>オプションのデバッグ>全般]>を選択し、[元のバージョンと完全に一致するソース ファイルが必要] がチェックされていることを確認します。

アプリのプロジェクトを作成する

Visual Studio では、プロジェクトを使用してアプリのコードを整理し、ソリューションを使用して 1 つ以上のプロジェクトを整理します。 プロジェクトには、アプリのビルドに使用されるすべてのオプション、構成、ルールが含まれています。 また、プロジェクトでは、プロジェクトのすべてのファイルと、外部のファイルとの間のリレーションシップも管理します。 アプリを作成するには、最初に、新しいプロジェクトとソリューションを作成します。

  1. Visual Studio の起動 - Visual Studio の [スタート] ダイアログ ボックスが表示されます。 [新しいプロジェクトの作成] を選択して開始します。

    Visual Studio 2022 の起動時に表示されるダイアログのスクリーンショット。

    このダイアログには、リポジトリの複製、プロジェクトまたはソリューションの開き、ローカル フォルダーの開き、新しいプロジェクトの作成を行うオプションがあります。

  2. プロジェクト テンプレートの一覧で[コンソール アプリ]、[次へ] の順に選択します。

    Visual Studio の [新しいプロジェクトの作成] ダイアログのスクリーンショット。[コンソール アプリ テンプレート] オプションが強調表示されています。

    重要

    必ず、コンソール アプリ テンプレートの C++ バージョンを選択してください。 [C++][Windows] 、および [コンソール] のタグと、アイコンの隅に "++" が表示されています。

  3. [新しいプロジェクトの構成] ダイアログ ボックスで、[プロジェクト名] テキスト ボックスを選択し、新しいプロジェクトに CalculatorTutorial という名前を付けて、[作成] を選択します

    Visual Studio の [新しいプロジェクトの構成] ダイアログのスクリーンショット。プロジェクト名、プロジェクトの場所、ソリューション名のフィールドがあります。

    空の C++ Windows コンソール アプリケーション 'Hello World' アプリが作成されます。 コンソール アプリケーションは Windows コンソール ウィンドウを使用して出力を表示し、ユーザー入力を受け付けます。 Visual Studio でエディター ウィンドウが開き、生成されたコードが表示されます。

    // CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends there.
    //
    
    #include <iostream>
    
    int main()
    {
        std::cout << "Hello World!\n";
    }
    
    // Run program: Ctrl + F5 or Debug > Start Without Debugging menu
    // Debug program: F5 or Debug > Start Debugging menu
    
    // Tips for Getting Started:
    //   1. Use the Solution Explorer window to add/manage files
    //   2. Use the Team Explorer window to connect to source control
    //   3. Use the Output window to see build output and other messages
    //   4. Use the Error List window to view errors
    //   5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project
    //   6. In the future, to open this project again, go to File > Open > Project and select the .sln file
    

新しいアプリがビルドされ、動作することを確認する

新しい Windows コンソール アプリケーション用のテンプレートで、単純な C++ の "Hello World" アプリを作成します。 この時点で、作成したアプリを IDE から直接 Visual Studio でビルドおよび実行する方法を確認できます。

  1. プロジェクトをビルドするには、[ビルド] メニューから [ソリューションのビルド] を選択します。 [出力] ウィンドウに、ビルド プロセスの結果が表示されます。

    Visual Studio の [出力] ウィンドウのスクリーンショット。ビルドが成功したことを示すメッセージが表示されます。

  2. コードを実行するには、メニュー バーで [デバッグ]、[デバッグなしで開始] の順に選択します (Ctrl + F5 キーを押します)。

    アプリケーションの出力が表示されている Visual Studio デバッグ コンソールのスクリーンショット: Hello World!。

    コンソール ウィンドウが開き、アプリが実行されます。

    Visual Studio でコンソール アプリを起動すると、コードが実行され、「このウィンドウを閉じるには、どれかキーを押してください...」 . と表示されるので、出力を確認できます。

    お疲れさまでした。 Visual Studio で最初の "Hello, world!" コンソール アプリを作成しました。

  3. キーを押してコンソール ウィンドウを閉じ、Visual Studio に戻ります。

これで、変更を加えるたびにアプリをビルドして実行するツールを利用して、コードが期待どおりに機能することを確認できるようになりました。 そうならない場合のデバッグ方法については後で説明します。

コードを編集する

次に、このテンプレートのコードを電卓アプリに変更しましょう。

  1. CalculatorTutorial.cpp ファイルの内容を次のコードに置き換えて、この例と一致するようにします。

    // CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends there.
    //
    
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        cout << "Calculator Console Application" << endl << endl;
        cout << "Please enter the operation to perform. Format: a+b | a-b | a*b | a/b"
            << endl;
        return 0;
    }
    
    // Run program: Ctrl + F5 or Debug > Start Without Debugging menu
    // Debug program: F5 or Debug > Start Debugging menu
    // Tips for Getting Started:
    //   1. Use the Solution Explorer window to add/manage files
    //   2. Use the Team Explorer window to connect to source control
    //   3. Use the Output window to see build output and other messages
    //   4. Use the Error List window to view errors
    //   5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project
    //   6. In the future, to open this project again, go to File > Open > Project and select the .sln file
    

    コードの概要:

    • #include ステートメントを使用すると、他のファイル内のコードを参照できます。 ファイル名は、山かっこ (<>) で囲まれる場合や引用符 (" ") で囲まれる場合があります。 一般に、山かっこは C++ 標準ライブラリを参照するときに使用され、引用符は他のファイルに使用されます。
    • using namespace std; 行は、このファイルに C++ 標準ライブラリの内容が使用されることを想定するようにコンパイラに指示します。 この行がないと、ライブラリの各キーワードの前に std:: を付けて、そのスコープを示す必要があります。 たとえば、その行がない場合、cout への各参照は std::cout と記述する必要があります。 using ステートメントは、コードをわかりやすくするために追加されています。
    • cout キーワードは、C++ の標準出力に出力するために使用されています。 << 演算子は、その右側にあるものはすべて標準出力に送信するようにコンパイラに指示します。
    • endl キーワードは Enter キーに似ています。つまり、その行を終了し、カーソルを次の行に移動します。 常にプログラムのパフォーマンスを損なう可能性のあるバッファーをフラッシュするためendl、同じことを行うには、文字列内に (含まれている"") ことを行\nうことをお勧めします。 ただし、これは非常に小さなアプリなので、読みやすいように代わりに endl を使用します。
    • すべての C++ ステートメントの末尾にはセミコロンを付ける必要があります。また、すべての C++ アプリケーションには main() 関数を含める必要があります。 この関数は、プログラムが最初に実行するものです。 使用するには、すべてのコードが main() からアクセスできる必要があります。
  2. ファイルを保存するには、Ctrl キーを押しながら S キーを押すか、IDE の上部付近にある保存アイコン (メニュー バーの下にあるツール バーのフロッピー ディスク アイコン) を選択します。

  3. アプリケーションを実行するには、Ctrl キーを押しながら F5 キーを押すか、[デバッグ] メニューに移動し、[デバッグなしで開始] を選択します。 コードで指定したテキストを表示するコンソール ウィンドウが出現するのを確認できます。

  4. 完了したらコンソール ウィンドウを閉じます。

計算を実行するコードを追加する

クラスは、何かを実行するオブジェクトのブループリントのようなものです。 この場合、計算ロジックを格納する電卓クラスを定義します。

Calculator クラスを追加する

  1. [プロジェクト] メニューに移動し、[クラスの追加] を選択します[クラス名] 編集ボックスに、「Calculator」と入力します。 [OK] を選択します。

    Visual Studio の [クラスの追加] ダイアログ ボックスのスクリーンショット。

    クラス名フィールドは電卓に設定されます。 .h ファイル フィールドには Calculator.h が含まれています。 .cpp ファイル フィールドには、Calculator.cppが含まれています。 基底クラスのフィールドが空です。 仮想デストラクター、インライン、およびアンマネージのその他のオプションはチェックされません。

    2 つの新しいファイルがプロジェクトに追加されます。 変更したファイルを一度にすべて保存するには、Ctrl + Shift + S キーを押します。 これは [ファイル]>[すべて保存] のキーボード ショートカットです。 [保存] ボタンの横にあるツール バーのボタン [すべて保存] (2 枚のフロッピー ディスクのアイコン) もあります。 一般に、保存時にファイルの漏れがないように、 [すべて保存] を頻繁に実行することをお勧めします。

    クラス追加ウィザードが作成され、クラスと.cpp同じ名前のファイルが作成.hされます。 IDE の横に表示される [ソリューション エクスプローラー] ウィンドウには、プロジェクト ファイルの完全な一覧が表示されます。 ウィンドウが表示されない場合は、メニュー バーの [表示>] を選択ソリューション エクスプローラーから開くことができます。

    Visual Studio ソリューション エクスプローラー ウィンドウのスクリーンショット。

    電卓チュートリアル プロジェクトには、Calculator.h を含むヘッダー ファイル ノードがあります。 ソース ファイル ノードには、Calculator.cppとCalculatorTutorial.cppが含まれています。 参照、外部依存関係、およびリソース ファイルのノードは表示されますが、閉じられます。

    ファイルを開くには、ソリューション エクスプローラー ウィンドウでダブルクリックします。 ダブルクリックして Calculator.h 開きます。

  2. ファイルが次のようになるように、Calculator.h の内容を次のコードに置き換えます。

    #pragma once
    class Calculator
    {
    public:
        double Calculate(double x, char oper, double y);
    };
    

    コードの概要

    • このコードでは、Calculate という新しい関数が宣言されています。これは、加算、減算、乗算、除算の算術演算を実行するために使用します。
    • C++ コードは、"ヘッダー" (.h) ファイルと "ソース" (.cpp) ファイルに編成されています。 さまざまなコンパイラが他のいくつかのファイル拡張子をサポートしていますが、これらは知っておくべき主な拡張子です。 通常、関数と変数は宣言されます。つまり、ヘッダー ファイルで名前と型が指定され、ソース ファイルで実装されるか定義が与えられます。 別のファイルで定義されているコードにアクセスするには、#include "filename.h" を使用できます。filename.h は、使用する変数または関数が宣言されているファイルの名前です。
    • コードは、処理内容に基づいて複数のファイルに編成することをお勧めします。こうすることで、後で必要なコードを簡単に見つけられます。 この例では、main() 関数を含むファイルとは別に Calculator クラスを定義しますが、main() 内から Calculator クラスを参照する予定です。
  3. 関数は宣言されていますが、定義されていないため、緑色のCalculate波線が表示Calculateされます。 上にマウス ポインターCalculateを置き、表示されるドライバーの下矢印をクリックし、[計算Calculator.cpp] の [定義の作成] を選択します。

    Visual Studio エディター ウィンドウのドライバー ドロップダウンのスクリーンショット。[Calculator.cppで計算の定義を作成する] オプションが強調表示されています。

    このコードは次に Calculator.cpp追加されます。

    コンストラクターの定義は、double Calculator::Calculate( double x, char oper, double y) { return 0.0; } です。

    現時点では単に 0.0 が返されます。 これを変えてみましょう。

  4. エディター ウィンドウで Calculator.cpp ファイルに切り替えます。 Calculator::Calculate(double x, char oper, double y) の内容を次のコードで置き換えます。

    double Calculator::Calculate(double x, char oper, double y)
    {
        switch(oper)
        {
            case '+':
                return x + y;
            case '-':
                return x - y;
            case '*':
                return x * y;
            case '/':
                return x / y;
            default:
                return 0.0;
        }
    }
    

    コードの概要

    • 関数 Calculate では、数値、演算子、および 2 番目の数値を使用してから、その数字に対して要求された操作を実行します。
    • switch ステートメントでは、指定された演算子を確認し、その演算に対応する case のみを実行します。 既定値: case は、ユーザーが受け入れられない演算子を入力した場合のフォールバックです。そのためプログラムは中断しません。 一般に、より洗練された方法で無効なユーザー入力を処理することが最善ですが、このチュートリアルでは扱いません。
    • double キーワードは、小数をサポートする数値の種類を表します。 このようにすると、電卓は小数の計算と整数の計算の両方を扱うことができます。 Calculate 関数は、コードの先頭に double があるため、常にこのような数値を返す必要があります (これは関数の戻り型を表します)。そのため、既定の case でも 0.0 が返される理由です。
    • .h ファイルでは、関数の "プロトタイプ" が宣言されています。これは、必要なパラメーターと、それから返される戻り値の型をコンパイラに事前に通知します。 .cpp ファイルには、関数の実装に関する詳細がすべて含まれています。

この時点でコードをビルドして再実行すると、実行する操作を要求した直後に終了します。 そのため、関数を main 変更して複数の計算を行います。

クラス メンバー関数を Calculator 呼び出す

  1. 次のように関数CalculatorTutorial.cppmain更新します。

    // CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends there.
    //
    
    #include <iostream>
    #include "Calculator.h"
    
    using namespace std;
    
    int main()
    {
        double x = 0.0;
        double y = 0.0;
        double result = 0.0;
        char oper = '+';
    
        cout << "Calculator Console Application" << endl << endl;
        cout << "Please enter the operation to perform. Format: a+b | a-b | a*b | a/b"
             << endl;
    
        Calculator c;
        while (true)
        {
            cin >> x >> oper >> y;
            result = c.Calculate(x, oper, y);
            cout << "Result " << "of " << x << oper << y << " is: " << result << endl;
        }
    
        return 0;
    }
    

    コードの概要

    • C++ プログラムは常に main() 関数から始まり、そこから他のコードを呼び出す必要があるため、#include ステートメントが必要です。
    • 一部の初期変数 xyoper、および result は、それぞれ最初の数値、2 番目の数値、演算子、および最終結果を格納するために宣言されています。 未定義の動作を回避するために、いくつかの初期値を指定することをお勧めします。これはここで行われます。
    • Calculator c; 行は、Calculator クラスのインスタンスとして 'c' というオブジェクトを宣言しています。 このクラス自体は、電卓がどのように機能するかを示す単なるブループリントです。オブジェクトは計算を実行する特定の電卓です。
    • while (true) ステートメントはループです。 () 内の条件を満たしている限り、ループ内のコードは繰り返し実行されます。 条件は単に true と指定されているため、常に true になり、ループは永遠に実行されます。 プログラムを閉じるには、ユーザーは手動でコンソール ウィンドウを閉じる必要があります。 それ以外の場合、プログラムは常に新しい入力を待機します。
    • cin キーワードは、ユーザーからの入力を受け付けるために使用されます。 コンソール ウィンドウに入力されたテキストの行を処理し、ユーザー入力が必要な仕様に一致すると想定して、列挙された各変数の内側に順番に配置するのであれば、この入力ストリームで十分です。 この行を変更して、異なる種類の入力 (2 つより多くの数値など) を受け入れることができますが、これを処理するには Calculate() 関数も更新する必要があります。
    • c.Calculate(x, oper, y); 式は、前に定義したCalculate 関数を呼び出し、入力された値を提供します。 次に、関数は result に格納された数値を返します。
    • 最後に、result がコンソールに出力されるので、ユーザーには計算結果が表示されます。

コードのビルドとテストの再実行

ここで、プログラムをもう一度テストして、すべてが正常に動作することを確認します。

  1. Ctrl + F5 キーを押してアプリをビルドして起動します。

  2. 5+5」と入力し、Enter キーを押します。 結果が 10 であることを確認してください。

    プログラムの実行結果を示すコマンド ウィンドウのスクリーンショット。

    アプリがメッセージを出力します。実行する操作を入力してください。 書式: a +b |a-b |a*b |a/b。 ユーザーが 5 + 5 と入力しました。 アプリの出力: 5 + 5 の結果は次のとおりです: 10

アプリをデバッグする

ユーザーは自由にコンソール ウィンドウに何かを入力できるため、電卓で予期しない入力が処理されるようにしましょう。 プログラムを実行する代わりに、プログラムをデバッグして、ステップ バイ ステップで何が行っているかを調べてみましょう。

デバッガーでアプリを実行する

  1. CalcuatorTutorial.cpp、行にブレークポイントを設定します。 result = c.Calculate(x, oper, y); ブレークポイントを設定するには、行の横の、エディター ウィンドウの左端に沿った灰色の縦線をクリックします。 赤い点が表示されます。

    Visual Studio エディターのスクリーンショット。ブレークポイントを表す赤い点が行に表示されます。result = c.Calculate(x, oper, y)。

    プログラムをデバッグすると、その行で実行が一時停止します。 単純なケースではプログラムが動作することが既に大体わかっています。 呼び出 Calculate()すたびに実行を一時停止したくないので、ブレークポイントを条件付きにします。

  2. ブレークポイントを表す赤い点を右クリックし、[条件] を選択します。 条件の編集ボックスに「(y == 0) && (oper == '/')」と入力します。 [閉じる] ボタンを選択して、ブレークポイントの条件を保存します。

    [ブレークポイント] 設定ポップアップが表示されている Visual Studio のスクリーンショット。

    ブレークポイントの条件は、y==0 & oper == '/' は true です。

    これで、アプリが 0 で除算しようとすると、ブレークポイントで実行が一時停止します。

  3. プログラムをデバッグするには、F5 キーを押すか、緑色の矢印アイコンが表示されている [ローカル Windows デバッガー] ツール バー ボタンを選択します。 コンソール アプリで、「5 - 0」のように入力した場合、プログラムは正常に動作し、実行が継続されます。 ただし、「10/0」と入力すると、ブレークポイントで一時停止されます。 演算子と数値 cin の間には任意の数のスペースを入れることができます。入力を適切に解析するのに十分なスマートです。

    Visual Studio エディターのスクリーンショット。プログラムの実行が、行の条件付きブレークポイントで停止しました: result = c.Calculate(x, oper, y);。

デバッガーの便利なウィンドウ

コードをデバッグすると、いくつかの新しいウィンドウが表示されることがあります。 これらは、デバッグ エクスペリエンスを支援するウィンドウです。 [自動] ウィンドウを見てください。 [自動] ウィンドウには、3 行以上前から現在の行までに使用されている変数の現在の値が表示されます。

Visual Studio デバッガーの [自動変数] ウィンドウのスクリーンショット。

oper の値は 47 '/' で、結果は 5、x は 10、y は 0 です。

その関数のすべての変数を確認するには、 [ローカル] ウィンドウに切り替えます。 デバッグ中にこれらの変数の値を変更して、プログラムに与える影響を確認できます。 この例では、そのままにします。

デバッグ中にローカル変数の現在の値が表示されている、Visual Studio の [ローカル] ウィンドウのスクリーンショット。

oper の値は 47 '/' で、結果は 0、x は 10、y は 0 です。

コード内の変数の上にマウス ポインターを置くと、実行が現在一時停止されている時点で現在の値を確認することもできます。 まずエディター ウィンドウをクリックして、フォーカスを切り替えます。

変数 'oper' の値 (47 または '/') を示すヒントのスクリーンショット。

デバッグの続行

  1. 左側の黄色の矢印は、現在の実行ポイントを示します。 現在の行で Calculate を呼び出すため、F11 キーを押して関数の [ステップ イン] を行います。 現在は、Calculate 関数の本体のコードを実行しています。 [ステップ イン] は、標準ライブラリ関数を含め、現在いる行の関数にステップ インするため、注意してください。 標準ライブラリにステップ インしても問題ありませんが、ライブラリ コードではなく自分のコードに注目する方が大事ではないですか。

  2. 実行ポイントが Calculate 関数の先頭になったら、F10 キーを押してプログラムの実行内の次の行に移動します。 F10 キーは [ステップ オーバー] とも呼ばれます。 [ステップ オーバー] を使用すると、行の各部分で発生していることを詳しく調べることなく、行から行へ移動できます。 一般に、(Calculate の本体に移動したときのように) 別の場所から呼び出されているコードを詳しく見るのでない限り、[ステップ イン] ではなく [ステップ オーバー] を使う必要があります。

  3. もう一方のファイルの main() 関数に戻るまで繰り返し F10 キーを押して各行の [ステップ オーバー] を行い、cout 行で停止します。

    プログラムは期待どおりの処理を行っています。最初の数値を受け取り、2 番目の数値で除算します。 cout 行の result 変数をポイントするか、 [自動] ウィンドウの result を確認します。 その値 inf は正しくないので、修正しましょう。 cout 行は、result に格納されている値をそのまま出力するため、F10 キーを使用してもう 1 行進むと、コンソール ウィンドウに次が表示されます。

    ゼロ除算操作の結果を表示する Visual Studio デバッグ コンソールのスクリーンショット。

    アプリの出力: 実行する操作を入力してください。 書式: a +b |a-b |a*b |a/b。 ユーザーが 5 から 0 を入力しました。 アプリの出力: 結果は 5 です。 ユーザーは 10/0 と入力しました。 アプリの出力: 結果: inf

    この結果は、0 による除算が未定義であるため、プログラムには要求された操作に対する数値の回答がないためです。

"0 除算" エラーを修正する

ユーザーが問題を理解しやすいように、ゼロ除算をより適切に処理しましょう。

  1. CalculatorTutorial.cpp で次の変更を行います。 (エディット コンティニュというデバッガー機能のおかげで、編集中にプログラムを実行したままにすることができます)。 次cin >> x >> oper >> y;のステートメントを if 0 で除算するチェックに追加し、発生した場合はメッセージをユーザーに出力します。 それ以外の場合は、結果が出力されます。

    // CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends there.
    //
    
    #include <iostream>
    #include "Calculator.h"
    
    using namespace std;
    
    int main()
    {
        double x = 0.0;
        double y = 0.0;
        double result = 0.0;
        char oper = '+';
    
        cout << "Calculator Console Application" << endl << endl;
        cout << "Please enter the operation to perform. Format: a+b | a-b | a*b | a/b" << endl;
    
        Calculator c;
        while (true)
        {
            cin >> x >> oper >> y;
            if (oper == '/' && y == 0)
            {
                cout << "Attempted to divide by zero!" << endl;
                continue;
            }
            else
            {
                result = c.Calculate(x, oper, y);
            }
            cout << "Result " << "of " << x << oper << y << " is: " << result << endl;
        }
    
        return 0;
    }
    
  2. F5 キーを 1 回押します。 ユーザー入力を求めるために一時停止する必要があるまで、プログラムの実行が継続されます。 もう一度「10 / 0」と入力します。 今度はより役に立つメッセージが表示されます。 ユーザーはさらに入力を求められ、プログラムは通常どおり実行が継続されます。

    ゼロ除算を処理する変更を実装した後の最終的な出力を示すコンソール ウィンドウのスクリーンショット。

    コンソール ウィンドウに 2 つの行が表示されます。10 / 0 結果は inf で、その後に 10/ 0 数学エラー: 0 で除算しようとしました。

    Note

    デバッグ モードでコードを編集すると、コードが古くなる危険性があります。 これは、デバッガーがまだ古いコードを実行していて、まだ変更が反映されていない場合に発生します。 これが発生すると、ユーザーに知らせるダイアログがデバッガーで表示されます。 F5 キーを押して実行中のコードを更新する必要がある場合があります。 具体的には、実行ポイントが関数内にあるときに関数内で変更を行った場合は、関数をステップ アウトしてからステップ インして、更新されたコードを取得する必要があります。 それでも問題が解決せず、エラー メッセージが表示された場合は、IDE の上部にあるメニューの下にあるツール バーの赤い四角形をクリックしてデバッグを停止し、F5 キーを押すか、ツール バーの停止ボタンの横にある緑色の "再生" 矢印を選択してデバッグを再開できます。

    編集と続行が失敗するもう 1 つの理由は、「Debug-Options-General>> の元のバージョン設定と完全に一致するようにソース ファイルを要求する」というメッセージが表示された場合です。この問題を解決するには、メイン メニューの [ツール>オプションのデバッグ>全般]>を選択し、[元のバージョンと完全に一致するソース ファイルが必要] がチェックされていることを確認します。

    [実行] と [デバッグ] のショートカットの概要

    • F5 キーを押すと (または [デバッグ]>[デバッグの開始] )、デバッグ セッションがまだアクティブでない場合は開始され、プログラムが実行され、ブレークポイントにヒットするか、ユーザー入力が必要になると停止されます。 ユーザー入力が不要で、ヒットするブレークポイントがない場合、プログラムは終了します。プログラムの実行が完了すると、コンソール ウィンドウは自動的に閉じます。 "Hello World" のようなプログラムを実行する場合は、F5 キーを押す前に Ctrl + F5 キーを押すか、ブレークポイントを設定してウィンドウを開いたままにします。
    • Ctrl + F5 キーを押すと (または [デバッグ]>[デバッグなしで開始] )、デバッグ モードに移行せずにアプリケーションを実行します。 これはデバッグよりもわずかに速く、プログラムの実行が完了した後もコンソール ウィンドウは開いたままです。
    • F10 キー ( [ステップ オーバー] と呼ばれます) を使用すると、コードを 1 行ずつ繰り返し実行し、コードの実行方法と各実行手順での変数値を視覚化できます。
    • F11 キー ( [ステップ イン] と呼ばれます) を使用すると、 [ステップ オーバー] と同様に機能しますが、実行中の行で呼び出される関数にステップ インする点が異なります。 たとえば、実行中の行が関数を呼び出す場合、F11 キーを押すと、ポインターが関数の本文に移動するので、開始した行に戻る前に実行中の関数のコードに従うことができます。 F10 キーを押すと、関数呼び出しがステップ オーバーされ、次の行に移動します。関数呼び出しはまだ行われますが、実行内容を示すためにプログラムは一時停止しません。

アプリを閉じる

  • まだ実行中の場合は、電卓アプリのコンソール ウィンドウを閉じます。

Git ソース管理を追加する

これでアプリを作成できたので、それを Git リポジトリに追加したいと思うかもしれません。 そのような場合でもご利用いただけます。 Visual Studio では、IDE から直接使用できる Git ツールで、その作業を簡単に行うことができます。

ヒント

Git は最も広く使用されている最新のバージョン コントロール システムであるため、プロフェッショナルな開発者にも、コードの作成を学習している方にも、Git は非常に便利です。 Git を初めてお使いになる場合は、https://git-scm.com/ の Web サイトから開始することをお勧めします。 そこには、チート シート、人気のオンライン ブック、Git の基本についてのビデオがあります。

コードを Git に関連付けるには、まず、コードを配置する新しい Git リポジトリを作成します。 その方法は次のとおりです。

  1. Visual Studio の右下隅にあるステータス バーで、 [ソース管理に追加] を選択し、 [Git] を選択します。

    [ソリューション エクスプローラー] ペインの下の Git ソース管理ボタンのスクリーンショット。[ソース管理に追加] ボタンが強調表示されています。

  2. [Git リポジトリの作成] ダイアログ ボックスで、GitHub にサインインします。

    新しい GitHub リポジトリを作成する [Git リポジトリの作成] ダイアログ ウィンドウのスクリーンショット。

    リポジトリ名は、フォルダーの場所に基づいて自動的に設定されます。 既定では、新しいリポジトリはプライベートになります。つまり、アクセスできるのは自分だけです。

    ヒント

    リポジトリがパブリックかプライベートかに関係なく、コードのバックアップをリモートの GitHub に安全に保存しておくことをお勧めします。 チームで作業していない場合でも、リモート リポジトリを使用すると、コードをご自分のすべてのコンピューターから利用できるようになります。

  3. [作成とプッシュ] を選択します。

    リポジトリを作成すると、ステータス バーに状態の詳細が表示されます。

    Visual Studio ソリューション エクスプローラー ペインの下にあるリポジトリ ステータス バーのスクリーンショット。ブランチ名と未解決の変更の数が示されています。

    矢印の付いた最初のアイコンには、現在のブランチにある出力/入力方向のコミットの数が表示されます。 このアイコンを使用して、入力方向のコミットをプルしたり、出力方向のコミットをプッシュしたりすることができます。 また、これらのコミットを最初に表示することもできます。 これを行うには、アイコンを選択し、 [View Outgoing/Incoming](出力/入力の表示) を選択します。

    鉛筆の 2 番目のアイコンは、コードに対する確定されていない変更の数を示しています。 このアイコンを選択すると、 [Git 変更] ウィンドウにこれらの変更が表示されます。

ご自分のアプリで Git を使用する方法の詳細については、「Visual Studio のバージョン コントロールに関するドキュメント」を参照してください。

完成したアプリ

お疲れさまでした。 電卓アプリのコードを完了し、ビルドしてデバッグし、すべて Visual Studio でリポジトリに追加しました。

次のステップ

Visual Studio for C++ の詳細

C++ プログラマーにとってよくある出発点は、コマンド ラインで実行される "Hello, world!" アプリケーションです。 この記事では、まず、電卓アプリというより困難な作業に進んでください。

前提条件

アプリのプロジェクトを作成する

Visual Studio では、プロジェクトを使用してアプリのコードを整理し、ソリューションを使用して 1 つ以上のプロジェクトを整理します。 プロジェクトには、アプリのビルドに使用されるすべてのオプション、構成、ルールが含まれています。 また、プロジェクトでは、プロジェクトのすべてのファイルと、外部のファイルとの間のリレーションシップも管理します。 アプリを作成するには、最初に、新しいプロジェクトとソリューションを作成します。

  1. Visual Studio のメニュー バーで、[新しい>プロジェクトのファイル>] を選択します。 [新しいプロジェクト] ウィンドウが開きます。

  2. 左側のサイドバーで [Visual C++] が選択されていることを確認します。 中央の [Windows コンソール アプリケーション] を選択します。

  3. 下部にある [名前] ボックスに新しいプロジェクト CalculatorTutorial という名前を付け、[OK] を選択します

    [新しいプロジェクト] ダイアログのスクリーンショット。Windows コンソール アプリケーション プロジェクトの種類が選択されています。[名前] テキスト ボックスは CalculatorTutorial に設定されます。

    空の C++ Windows コンソール アプリケーション 'Hello World' アプリが作成されます。 コンソール アプリケーションは Windows コンソール ウィンドウを使用して出力を表示し、ユーザー入力を受け付けます。 Visual Studio でエディター ウィンドウが開き、生成されたコードが表示されます。

    // CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends there.
    //
    
    #include <iostream>
    
    int main()
    {
        std::cout << "Hello World!\n";
    }
    
    // Run program: Ctrl + F5 or Debug > Start Without Debugging menu
    // Debug program: F5 or Debug > Start Debugging menu
    
    // Tips for Getting Started:
    //   1. Use the Solution Explorer window to add/manage files
    //   2. Use the Team Explorer window to connect to source control
    //   3. Use the Output window to see build output and other messages
    //   4. Use the Error List window to view errors
    //   5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project
    //   6. In the future, to open this project again, go to File > Open > Project and select the .sln file
    

新しいアプリがビルドされ、動作することを確認する

新しい Windows コンソール アプリケーション用のテンプレートで、単純な C++ の "Hello World" アプリを作成します。 この時点で、作成したアプリを IDE から直接 Visual Studio でビルドおよび実行する方法を確認できます。

  1. プロジェクトをビルドするには、[ビルド] メニューから [ソリューションのビルド] を選択します。 [出力] ウィンドウに、ビルド プロセスの結果が表示されます。

    ビルドが成功したことを示す Visual Studio の [出力] ウィンドウのスクリーンショット。

  2. コードを実行するには、メニュー バーで [デバッグ]、[デバッグなしで開始] の順に選択します (Ctrl + F5 キーを押します)。

    出力 Hello World! を示す Visual Studio のデバッグ コンソールのスクリーンショット。

    コンソール ウィンドウが開き、アプリが実行されます。

    Visual Studio でコンソール アプリを起動すると、コードが実行され、「このウィンドウを閉じるには、どれかキーを押してください...」 . と表示されるので、出力を確認できます。

    お疲れさまでした。 Visual Studio で最初の "Hello, world!" コンソール アプリを作成しました。

  3. キーを押してコンソール ウィンドウを閉じ、Visual Studio に戻ります。

これで、変更を加えるたびにアプリをビルドして実行するツールを利用して、コードが期待どおりに機能することを確認できるようになりました。 そうならない場合のデバッグ方法については後で説明します。

コードを編集する

次に、このテンプレートのコードを電卓アプリにしましょう。

  1. CalculatorTutorial.cpp ファイルの内容を次のコードに置き換えて、この例と一致するようにします。

    // CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends there.
    //
    
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        cout << "Calculator Console Application" << endl << endl;
        cout << "Please enter the operation to perform. Format: a+b | a-b | a*b | a/b" << endl;
        return 0;
    }
    
    // Run program: Ctrl + F5 or Debug > Start Without Debugging menu
    // Debug program: F5 or Debug > Start Debugging menu
    // Tips for Getting Started:
    //   1. Use the Solution Explorer window to add/manage files
    //   2. Use the Team Explorer window to connect to source control
    //   3. Use the Output window to see build output and other messages
    //   4. Use the Error List window to view errors
    //   5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project
    //   6. In the future, to open this project again, go to File > Open > Project and select the .sln file
    

    コードの概要:

    • #include ステートメントを使用すると、他のファイル内のコードを参照できます。 ファイル名は、山かっこ (<>) で囲まれる場合や引用符 (" ") で囲まれる場合があります。 一般に、山かっこは C++ 標準ライブラリを参照するときに使用され、引用符は他のファイルに使用されます。
    • using namespace std; 行は、このファイルに C++ 標準ライブラリの内容が使用されることを想定するようにコンパイラに指示します。 この行がないと、ライブラリの各キーワードの前に std:: を付けて、そのスコープを示す必要があります。 たとえば、その行がない場合、cout への各参照は std::cout と記述する必要があります。 using ステートメントは、コードをわかりやすくするために追加されています。
    • cout キーワードは、C++ の標準出力に出力するために使用されています。 *<< 演算子は、その右側にあるものはすべて標準出力に送信するようにコンパイラに指示します。
    • endl キーワードは Enter キーに似ています。つまり、その行を終了し、カーソルを次の行に移動します。 常にバッファーをフラッシュし\n、プログラムのパフォーマンスを損なうことがあるためendl、同じことを行うには、文字列内に (含まれている"") ことを行うことをお勧めします。 ただし、これは非常に小さなアプリなので、読みやすいように代わりに endl を使用します。
    • すべての C++ ステートメントの末尾にはセミコロンを付ける必要があります。また、すべての C++ アプリケーションには main() 関数を含める必要があります。 この関数は、プログラムが最初に実行するものです。 使用するには、すべてのコードが main() からアクセスできる必要があります。
  2. ファイルを保存するには、Ctrl キーを押しながら S キーを押すか、IDE の上部付近にある保存アイコン (メニュー バーの下にあるツール バーのフロッピー ディスク アイコン) を選択します。

  3. アプリケーションを実行するには、Ctrl キーを押しながら F5 キーを押すか、[デバッグ] メニューに移動し、[デバッグなしで開始] を選択します。 このプロジェクトが最新ではないというポップアップが表示された場合は、[このダイアログを再度表示しない] を選択し、[はい] を選択してアプリケーションをビルドできます。 コードで指定したテキストを表示するコンソール ウィンドウが出現するのを確認できます。

    IDE で電卓アプリを実行するプロセスを示すビデオ。

    最初に、プロジェクトが古いためにビルドするかどうかを確認するダイアログ ボックスが表示されます。 [今後、このダイアログを表示しない] チェック ボックスがオンになっています。 [はい] を選択してプロジェクトをビルドし、電卓プロジェクトをビルドして、Windows コンソール ウィンドウで起動します。

  4. 完了したらコンソール ウィンドウを閉じます。

計算を実行するコードを追加する

クラスは、何かを実行するオブジェクトのブループリントのようなものです。 この場合、計算ロジックを格納する電卓クラスを定義します。

Calculator クラスを追加する

  1. [プロジェクト] メニューに移動し、[クラスの追加] を選択します[クラス名] 編集ボックスに、「Calculator」と入力します。 [OK] を選択します。

    ユーザーが [クラスの追加] ダイアログ ボックスを開き、[クラス名] フィールドに「電卓」と入力し、[OK] をクリックする様子を示すビデオ。

    クラスは、何かを実行するオブジェクトのブループリントのようなものです。 この例では、電卓とそれがどのように動作するかを定義します。

    2 つの新しいファイルがプロジェクトに追加されます。 変更したファイルを一度にすべて保存するには、Ctrl + Shift + S キーを押します。 これは [ファイル]>[すべて保存] のキーボード ショートカットです。 [保存] ボタンの横にあるツール バーのボタン [すべて保存] (2 枚のフロッピー ディスクのアイコン) もあります。 一般に、保存時にファイルの漏れがないように、 [すべて保存] を頻繁に実行することをお勧めします。

    クラス追加ウィザードが作成され、クラスと.cpp同じ名前のファイルが作成.hされます。 IDE の横に表示される [ソリューション エクスプローラー] ウィンドウには、プロジェクト ファイルの完全な一覧が表示されます。 ウィンドウが表示されない場合は、メニュー バーの [表示>] を選択ソリューション エクスプローラーから開くことができます。

    Visual Studio ソリューション エクスプローラー ウィンドウのスクリーンショット。

    電卓チュートリアル プロジェクトには、Calculator.h、stdafx.h、targetver.h を含むヘッダー ファイル ノードがあります。 ソース ファイル ノードには、Calculator.cpp、CalculatorTutorial.cpp、およびstdafx.cppが含まれます。 参照、外部依存関係、およびリソース ファイルのノードは表示されますが、閉じられます。

    ファイルを開くには、ソリューション エクスプローラー ウィンドウでダブルクリックします。 ダブルクリックして Calculator.h 開きます。

  2. ファイルが次のようになるように、Calculator.h の内容を次のコードに置き換えます。

    #pragma once
    class Calculator
    {
    public:
        double Calculate(double x, char oper, double y);
    };
    

    コードの概要

    • このコードでは、Calculate という新しい関数が宣言されています。これは、加算、減算、乗算、除算の算術演算を実行するために使用します。
    • C++ コードは、"ヘッダー" (.h) ファイルと "ソース" (.cpp) ファイルに編成されています。 さまざまなコンパイラが他のいくつかのファイル拡張子をサポートしていますが、これらは知っておくべき主な拡張子です。 通常、関数と変数は宣言されます。つまり、ヘッダー ファイルで名前と型が指定され、ソース ファイルで実装されるか定義が与えられます。 別のファイルで定義されているコードにアクセスするには、#include "filename.h" を使用できます。filename.h は、使用する変数または関数が宣言されているファイルの名前です。
    • コードは、処理内容に基づいて複数のファイルに編成することをお勧めします。こうすることで、後で必要なコードを簡単に見つけられます。 この例では、main() 関数を含むファイルとは別に Calculator クラスを定義しますが、main() 内から Calculator クラスを参照する予定です。
  3. 関数は宣言されていますが、定義されていないため、緑色のCalculate波線が表示Calculateされます。 上にマウス ポインターCalculateを置き、表示されるドライバーの下矢印をクリックし、[計算Calculator.cpp] の [定義の作成] を選択します。 ポップアップが表示され、他のファイルで行われたコード変更を確認できます。 コードが Calculator.cpp に追加されました。

    電球ドロップダウンを使用して [Calculator.cppで計算の定義を作成する] を選択する方法を示すビデオ。

    現時点では単に 0.0 が返されます。 これを変えてみましょう。 Esc キーを押してポップアップを閉じます。

  4. エディター ウィンドウで Calculator.cpp ファイルに切り替えます。 ファイルの内容を次のコードに置き換えます。

    #include "Calculator.h"
    
    double Calculator::Calculate(double x, char oper, double y)
    {
        switch(oper)
        {
            case '+':
                return x + y;
            case '-':
                return x - y;
            case '*':
                return x * y;
            case '/':
                return x / y;
            default:
                return 0.0;
        }
    }
    

    コードの概要

    • 関数 Calculate では、数値、演算子、および 2 番目の数値を使用してから、その数字に対して要求された操作を実行します。
    • switch ステートメントでは、指定された演算子を確認し、その演算に対応する case のみを実行します。 既定値: case は、ユーザーが受け入れられない演算子を入力した場合のフォールバックです。そのためプログラムは中断しません。 一般に、より洗練された方法で無効なユーザー入力を処理することが最善ですが、このチュートリアルでは扱いません。
    • double キーワードは、小数をサポートする数値の種類を表します。 このようにすると、電卓は小数の計算と整数の計算の両方を扱うことができます。 Calculate 関数は、コードの先頭に double があるため、常にこのような数値を返す必要があります (これは関数の戻り型を表します)。そのため、既定の case でも 0.0 が返される理由です。
    • .h ファイルでは、関数の "プロトタイプ" が宣言されています。これは、必要なパラメーターと、それから返される戻り値の型をコンパイラに事前に通知します。 .cpp ファイルには、関数の実装に関する詳細がすべて含まれています。

この時点でコードをビルドし、もう一度実行すると、実行する操作を問われた後に終了となります。 次に、いくつかの計算を行うように main 関数を変更します。

Calculator クラスメンバー関数を呼び出す

  1. それでは、CalculatorTutorial.cppmain 関数を更新しましょう。

    // CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends there.
    //
    
    #include <iostream>
    #include "Calculator.h"
    
    using namespace std;
    
    int main()
    {
        double x = 0.0;
        double y = 0.0;
        double result = 0.0;
        char oper = '+';
    
        cout << "Calculator Console Application" << endl << endl;
        cout << "Please enter the operation to perform. Format: a+b | a-b | a*b | a/b" << endl;
    
        Calculator c;
        while (true)
        {
            cin >> x >> oper >> y;
            result = c.Calculate(x, oper, y);
            cout << "Result is: " << result << endl;
        }
    
        return 0;
    }
    

    コードの概要

    • C++ プログラムは常に main() 関数から始まり、そこから他のコードを呼び出す必要があるため、#include ステートメントが必要です。
    • 一部の初期変数 xyoper、および result は、それぞれ最初の数値、2 番目の数値、演算子、および最終結果を格納するために宣言されています。 未定義の動作を回避するために、いくつかの初期値を指定することをお勧めします。これはここで行われます。
    • Calculator c; 行は、Calculator クラスのインスタンスとして 'c' というオブジェクトを宣言しています。 このクラス自体は、電卓がどのように機能するかを示す単なるブループリントです。オブジェクトは計算を実行する特定の電卓です。
    • while (true) ステートメントはループです。 () 内の条件を満たしている限り、ループ内のコードは繰り返し実行されます。 条件は単に true と指定されているため、常に true になり、ループは永遠に実行されます。 プログラムを閉じるには、ユーザーは手動でコンソール ウィンドウを閉じる必要があります。 それ以外の場合、プログラムは常に新しい入力を待機します。
    • cin キーワードは、ユーザーからの入力を受け付けるために使用されます。 コンソール ウィンドウに入力されたテキストの行を処理し、ユーザー入力が必要な仕様に一致すると想定して、列挙された各変数の内側に順番に配置するのであれば、この入力ストリームで十分です。 この行を変更して、異なる種類の入力 (2 つより多くの数値など) を受け入れることができますが、これを処理するには Calculate() 関数も更新する必要があります。
    • c.Calculate(x, oper, y); 式は、前に定義したCalculate 関数を呼び出し、入力された値を提供します。 次に、関数は result に格納された数値を返します。
    • 最後に、result がコンソールに出力されるので、ユーザーには計算結果が表示されます。

コードのビルドとテストの再実行

プログラムをもう一度テストして、すべてが正常に動作することを確認します。

  1. Ctrl + F5 キーを押してアプリをビルドして起動します。

  2. 5+5」と入力し、Enter キーを押します。 結果が 10 であることを確認してください。

    電卓アプリを実行しているコマンド ウィンドウのスクリーンショット。5 + 5 の結果が 10 であることを示します。

アプリをデバッグする

ユーザーは自由にコンソール ウィンドウに何かを入力できるため、電卓で予期しない入力が処理されるようにしましょう。 プログラムを実行する代わりに、プログラムをデバッグして、何が行っているかを段階的に調べてみましょう。

デバッガーでアプリを実行する

  1. CalcuatorTutorial.cpp、行にブレークポイントを result = c.Calculate(x, oper, y); 設定します。 ブレークポイントを設定するには、行の横の、エディター ウィンドウの左端に沿った灰色の縦線をクリックします。 赤い点が表示されます。

    25 行目にブレークポイントを設定しているユーザーを示すビデオ: result = c.Calculate(x, oper, y);。

    プログラムをデバッグするときは、常にその行で実行が一時停止されます。 単純なケースではプログラムが動作することが既に大体わかっています。 実行を毎回一時停止させないために、条件付きのブレークポイントを設定しましょう。

  2. ブレークポイントを表す赤い点を右クリックし、[条件] を選択します。 条件の編集ボックスに「(y == 0) && (oper == '/')」と入力します。 完了したら、[閉じる] ボタンを選択してブレークポイントの条件を保存します。

    条件付きブレークポイントを設定するプロセスを示すビデオ。

    ブレークポイントは行にあります:result = c dot Calculate ( x, oper, y)。 'Conditions...'がブレークポイントのドロップダウンで選択され、ブレークポイント設定ウィンドウが開きます。 [条件] オプションがチェックされ、その下にドロップダウンが "条件式" と "True" として設定されます。 ユーザーは、条件テキスト ボックスに y == 0 & oper == '/' と入力し、閉じるを選択して条件付きブレークポイントを設定します。

    これで、ゼロ除算が試行された場合に、ブレークポイントで実行が一時停止されます。

  3. プログラムをデバッグするには、F5 キーを押すか、緑色の矢印アイコンが表示されている [ローカル Windows デバッガー] ツール バー ボタンを選択します。 コンソール アプリで、「5 - 0」のように入力した場合、プログラムは正常に動作し、実行が継続されます。 ただし、「10/0」と入力すると、ブレークポイントで一時停止されます。 演算子と数値の間には任意の数のスペースを入れることもできます。cin で、入力を適切に解析できます。

    プログラムの実行が条件付きブレークポイントで一時停止されている様子を示すビデオ。

    ユーザーは 5 から 0 を入力します。 アプリの出力: 結果は 5 です。 その後、ユーザーは 10/0 を入力し、条件付きブレークポイントの条件が満たされているため、行で実行が停止します。result = c.Calculate(x, oper, y);

デバッガーの便利なウィンドウ

コードをデバッグすると、いくつかの新しいウィンドウが表示されることがあります。 これらは、デバッグ エクスペリエンスを支援するウィンドウです。 [自動] ウィンドウを見てください。 [自動] ウィンドウには、3 行以上前から現在の行までに使用されている変数の現在の値が表示されます。

Visual Studio デバッガーの [自動変数] ウィンドウのスクリーンショット。

oper の値は 47 '/' で、結果は 5、x は 10、y は 0 です。

その関数のすべての変数を確認するには、 [ローカル] ウィンドウに切り替えます。 このような変数の値をデバッグ中に変更して、プログラムにどのような影響があるかを確認できます。 この例では、そのままにします。

デバッグ中にローカル変数の現在の値が表示されている、Visual Studio の [ローカル] ウィンドウのスクリーンショット。

oper の値は 47 '/' で、結果は 0、x は 10、y は 0 です。

コード自体の変数の上にマウス ポインターを置くと、実行が現在一時停止されている現在の値を確認することもできます。 まずエディター ウィンドウをクリックして、フォーカスを切り替えます。

変数 y の上にマウス ポインターを置くと表示されるヒントを示すビデオ。y の現在の値 (0) が表示されます。

デバッグの続行

  1. 左側の黄色の矢印は、現在の実行ポイントを示します。 現在の行で Calculate を呼しているので、F11 キーを押してその関数にステップ インし、Calculate 関数の本体に移動します。 [ステップ イン] は、標準ライブラリ関数を含め、現在いる行の関数にステップ インするため、注意してください。 標準ライブラリにステップ インしても問題ありませんが、ライブラリ コードではなく自分のコードに注目する方が大事ではないですか。

  2. 実行ポイントが Calculate 関数の先頭になったら、F10 キーを押してプログラムの実行内の次の行に移動します。 F10 キーは [ステップ オーバー] とも呼ばれます。 [ステップ オーバー] を使用すると、行の各部分で発生していることを詳しく調べることなく、行から行へ移動できます。 一般に、(実行して Calculate の本文に達したので) 別の場所から呼び出されたコードを詳しく掘り下げる場合を除き、 [ステップ イン] ではなく [ステップ オーバー] を使用することをお勧めします。

  3. もう一方のファイルの main() 関数に戻るまで繰り返し F10 キーを押して各行の [ステップ オーバー] を行い、cout 行で停止します。

    Calculate 関数でコードの各行をステップオーバーする様子を示すビデオ。

    Calculate 関数のコードの各行は、コントロールがメイン関数に戻るまでステップオーバーされます。 その後、ユーザーは result という名前の変数の上にマウス ポインターを置くと、その値 (inf) が表示されます。

    プログラムは期待どおりの処理を行っています。最初の数値を受け取り、2 番目の数値で除算します。 cout 行の result 変数をポイントするか、 [自動] ウィンドウの result を確認します。 その値は inf であり正しくないので、修正しましょう。 cout 行は、result に格納されている値をそのまま出力するため、F10 キーを使用してもう 1 行進むと、コンソール ウィンドウに次が表示されます。

    ゼロ除算操作の結果を表示する Visual Studio デバッグ コンソールのスクリーンショット。

    アプリの出力: 実行する操作を入力してください。 書式: a +b |a-b |a*b |a/b。 ユーザーが 5 から 0 を入力しました。 アプリの出力: 結果は 5 です。 ユーザーは 10/0 と入力しました。 アプリの出力: 結果: inf

    この結果は、0 による除算が未定義であるため、プログラムには要求された操作に対する数値の回答がないためです。

"0 除算" エラーを修正する

ユーザーが問題を理解しやすいように、ゼロ除算をより適切に処理しましょう。

  1. CalculatorTutorial.cpp で次の変更を行います。 (エディット コンティニュというデバッガー機能のおかげで、編集中にプログラムを実行したままにすることができます)。 変更は、cin >> x >> oper >> y; の後に if ステートメントを追加し、0 による除算を調べて、それが行われている場合はメッセージをユーザーに出力することです。 それ以外の場合は、結果が出力されます。

    // CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends there.
    //
    
    #include <iostream>
    #include "Calculator.h"
    
    using namespace std;
    
    int main()
    {
        double x = 0.0;
        double y = 0.0;
        double result = 0.0;
        char oper = '+';
    
        cout << "Calculator Console Application" << endl << endl;
        cout << "Please enter the operation to perform. Format: a+b | a-b | a*b | a/b" << endl;
    
        Calculator c;
        while (true)
        {
            cin >> x >> oper >> y;
            if (oper == '/' && y == 0)
            {
                cout << "Division by 0 exception" << endl;
                continue;
            }
            else
            {
                result = c.Calculate(x, oper, y);
            }
            cout << "Result is: " << result << endl;
        }
    
        return 0;
    }
    
  2. F5 キーを 1 回押します。 ユーザー入力を求めるために一時停止する必要があるまで、プログラムの実行が継続されます。 もう一度「10 / 0」と入力します。 今度はより役に立つメッセージが表示されます。 ユーザーはさらに入力を求められ、プログラムは通常どおり実行が継続されます。

    コード変更後の最終的な結果を示すデバッグ コンソールのビデオ。10/ 0 が入力され、プログラムに 'Division by 0 exception' と表示されます。

    Note

    デバッグ モードでコードを編集すると、コードが古くなる危険性があります。 これは、デバッガーがまだ古いコードを実行していて、まだ変更が反映されていない場合に発生します。 このような状況になると、デバッガーによってダイアログがポップアップ表示されます。 F5 キーを押して実行中のコードを更新する必要がある場合があります。 具体的には、実行ポイントが関数内にあるときに関数内で変更を行った場合は、関数をステップ アウトしてからステップ インして、更新されたコードを取得します。 それが何らかの理由でうまくいかず、エラー メッセージが表示される場合は、IDE の上部にあるメニューの下にあるツール バーの赤色の四角をクリックしてデバッグを中止し、F5 キーを押してデバッグを再開します。または、ツール バーの停止ボタンの横にある緑色の [再生] 矢印を選択します。

    編集と続行が失敗するもう 1 つの理由は、メイン メニューに移動し、[ツール>オプションの>デバッグ全般] を>選択し、元のバージョンと完全に一致するソース ファイルがチェックされていることを確認する必要があるということです。

    [実行] と [デバッグ] のショートカットの概要

    • F5 キーを押すと (または [デバッグ]>[デバッグの開始] )、デバッグ セッションがまだアクティブでない場合は開始され、プログラムが実行され、ブレークポイントにヒットするか、ユーザー入力が必要になると停止されます。 ユーザー入力が不要で、ヒットするブレークポイントがない場合、プログラムは終了します。プログラムの実行が完了すると、コンソール ウィンドウは自動的に閉じます。 "Hello World" のようなプログラムを実行する場合は、F5 キーを押す前に Ctrl + F5 キーを押すか、ブレークポイントを設定してウィンドウを開いたままにします。
    • Ctrl + F5 キーを押すと (または [デバッグ]>[デバッグなしで開始] )、デバッグ モードに移行せずにアプリケーションを実行します。 これはデバッグよりもわずかに速く、プログラムの実行が完了した後もコンソール ウィンドウは開いたままです。
    • F10 キー ( [ステップ オーバー] と呼ばれます) を使用すると、コードを 1 行ずつ繰り返し実行し、コードの実行方法と各実行手順での変数値を視覚化できます。
    • F11 キー ( [ステップ イン] と呼ばれます) を使用すると、 [ステップ オーバー] と同様に機能しますが、実行中の行で呼び出される関数にステップ インする点が異なります。 たとえば、実行中の行が関数を呼び出す場合、F11 キーを押すと、ポインターが関数の本文に移動するので、開始した行に戻る前に実行中の関数のコードに従うことができます。 F10 キーを押すと、関数呼び出しがステップ オーバーされ、次の行に移動します。関数呼び出しはまだ行われますが、実行内容を示すためにプログラムは一時停止しません。

アプリを閉じる

  • まだ実行中の場合は、電卓アプリのコンソール ウィンドウを閉じます。

お疲れさまでした。 電卓アプリのコードを完了し、Visual Studio でビルドしてデバッグしました。

次のステップ

Visual Studio for C++ の詳細