C++ でコンソール電卓を作成する
C++ プログラマーにとってよくある出発点は、コマンド ラインで実行される "Hello, world!" アプリケーションです。 この記事でも、まず Visual Studio でそれを作ってから、さらに難しい電卓アプリに進みます。
必須コンポーネント
- Visual Studio 2019 と、C++ によるデスクトップ開発ワークロードがコンピューターにインストールおよび実行されている必要があります。 まだインストールされていない場合は、Visual Studio での C++ のインストール サポートに関するページを参照してください。
- このチュートリアルでは、アプリの実行中にコードを変更できるエディット コンティニュという機能を示します。 この記事でエディット コンティニュが機能できるようにするには、メイン メニューから [ツール]>[オプション]>[デバッグ]>[全般] を選び、[元のバージョンと完全に一致するソース ファイルを必要とする] チェック ボックスがオンになっていることを確認します。
アプリのプロジェクトを作成する
Visual Studio では、"プロジェクト" を使用してアプリのコードを整理し、"ソリューション" を使用してプロジェクトを整理します。 プロジェクトには、アプリをビルドする場合に使用するすべてのオプション、構成、および規則が含まれています。 また、プロジェクトでは、プロジェクトのすべてのファイルと、外部のファイルとの間のリレーションシップも管理します。 アプリを作成するには、最初に、新しいプロジェクトとソリューションを作成します。
Visual Studio を起動すると、Visual Studio の [開始] ダイアログ ボックスが表示されます。 [新しいプロジェクトの作成] を選択して始めます。
あるいは、Visual Studio のメニューバーで、 [ファイル]>[新規作成]>[プロジェクト] の順に選択します。 [新しいプロジェクトの作成] ウィンドウが開きます。
プロジェクト テンプレートの一覧で [コンソール アプリ] を選択し、 [次へ] を選択します。
重要
必ず、C++ バージョンのコンソール アプリ テンプレートを選択します。 [C++] 、 [Windows] 、および [コンソール] のタグと、アイコンの隅に "++" が表示されています。
[新しいプロジェクトを構成します] ダイアログ ボックスで、 [プロジェクト名] 編集ボックスを選択し、新しいプロジェクトに「CalculatorTutorial」という名前を付け、 [作成] を選択します。
空の C++ Windows コンソール アプリケーションが作成されます。 コンソール アプリケーションは 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 でビルドおよび実行する方法を確認できます。
プロジェクトをビルドするには、 [ビルド] メニューの [ソリューションのビルド] を選択します。 [出力] ウィンドウに、ビルド プロセスの結果が表示されます。
コードを実行するには、メニュー バーで [デバッグ] 、 [デバッグなしで開始] の順に選択します。
コンソール ウィンドウが開き、アプリが実行されます。 Visual Studio でコンソール アプリを起動すると、コードが実行され、「このウィンドウを閉じるには、どれかキーを押してください...」 . と表示されるので、出力を確認できます。 おめでとうございます。 Visual Studio で初めての "Hello, world!" コンソール アプリを作成できました。
キーを押してコンソール ウィンドウを閉じ、Visual Studio に戻ります。
これで、変更を加えるたびにアプリをビルドして実行するツールを利用して、コードが期待どおりに機能することを確認できるようになりました。 そうならない場合のデバッグ方法については後で説明します。
コードを編集する
次はこのテンプレートのコードを電卓アプリに変えましょう。
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()
からアクセスできる必要があります。
ファイルを保存するには、Ctrl + S キーを押すか、IDE の上部近くにある [保存] アイコン (メニュー バー下のツール バーのフロッピー ディスク アイコン) を選択します。
アプリケーションを実行するには、Ctrl + F5 キーを押すか、 [デバッグ] メニューに移動して [デバッグなしで開始] を選択します。 コードで指定したテキストを表示するコンソール ウィンドウが出現するのを確認できます。
完了したらコンソール ウィンドウを閉じます。
計算を実行するコードを追加する
いくつかの計算ロジックを追加しましょう。
Calculator クラスを追加するには
[プロジェクト] メニューの [クラスの追加] を選択します。 [クラス名] 編集ボックスに、「Calculator」と入力します。 [OK] をクリックします。 2 つの新しいファイルがプロジェクトに追加されます。 変更したファイルを一度にすべて保存するには、Ctrl + Shift + S キーを押します。 これは [ファイル]>[すべて保存] のキーボード ショートカットです。 [保存] ボタンの横にあるツール バーのボタン [すべて保存] (2 枚のフロッピー ディスクのアイコン) もあります。 一般に、保存時にファイルの漏れがないように、 [すべて保存] を頻繁に実行することをお勧めします。
クラスは、何かを実行するオブジェクトのブループリントのようなものです。 この例では、電卓とそれがどのように動作するかを定義します。
前に使った [クラスの追加] ウィザードでは、クラスと同じ名前の
.h
ファイルと.cpp
ファイルを作成しました。 IDE の横に表示される [ソリューション エクスプローラー] ウィンドウには、プロジェクト ファイルの完全な一覧が表示されます。 このウィンドウが表示されていない場合は、メニュー バーから開くことができます。 [表示]>[ソリューション エクスプローラー] を選択してください。これで、エディターに 3 つのタブが表示されます。
CalculatorTutorial.cpp
、Calculator.h
、およびCalculator.cpp
です。 そのうちのいずれかを誤って閉じた場合は、 [ソリューション エクスプローラー] ウィンドウでダブルクリックして再度開くことができます。ファイルが次のようになるように、
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
クラスを参照する予定です。
- このコードでは、
.cpp
ファイルでCalculate
関数を定義していないため、緑色の波線がCalculate
の下に表示されます。Calculate
をポイントし、表示されるドライバーの下向き矢印をクリックして、[Calculator.cpp
で 'Calculate' の定義を作成] を選びます。ポップアップが表示され、他のファイルで行われたコード変更を確認できます。 コードが
Calculator.cpp
に追加されました。現時点では単に 0.0 が返されます。 これを変えてみましょう。 Esc キーを押してポップアップを閉じます。
エディター ウィンドウで
Calculator.cpp
ファイルに切り替えます。 (.h
ファイルで行ったように)Calculator()
と~Calculator()
セクションを削除し、次のコードをCalculate()
に追加します。#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
クラスのメンバー関数を呼び出すには
それでは、
CalculatorTutorial.cpp
のmain
関数を更新しましょう。// 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
ステートメントが必要です。 - 一部の初期変数
x
、y
、oper
、およびresult
は、それぞれ最初の数値、2 番目の数値、演算子、および最終結果を格納するために宣言されています。 未定義の動作を回避するために、この例のように、何らかの初期値を指定しておくことを常にお勧めします。 Calculator c;
行は、Calculator
クラスのインスタンスとして 'c' というオブジェクトを宣言しています。 このクラス自体は、電卓がどのように機能するかを示す単なるブループリントです。オブジェクトは計算を実行する特定の電卓です。while (true)
ステートメントはループです。()
内の条件を満たしている限り、ループ内のコードは繰り返し実行されます。 条件は単にtrue
と指定されているため、常に true になり、ループは永遠に実行されます。 プログラムを閉じるには、ユーザーは手動でコンソール ウィンドウを閉じる必要があります。 それ以外の場合、プログラムは常に新しい入力を待機します。cin
キーワードは、ユーザーからの入力を受け付けるために使用されます。 コンソール ウィンドウに入力されたテキストの行を処理し、ユーザー入力が必要な仕様に一致すると想定して、列挙された各変数の内側に順番に配置するのであれば、この入力ストリームで十分です。 この行を変更して、異なる種類の入力 (2 つより多くの数値など) を受け入れることができますが、これを処理するにはCalculate()
関数も更新する必要があります。c.Calculate(x, oper, y);
式は、前に定義したCalculate
関数を呼び出し、入力された値を提供します。 次に、関数はresult
に格納された数値を返します。- 最後に、
result
がコンソールに出力されるので、ユーザーには計算結果が表示されます。
- C++ プログラムは常に
コードのビルドとテストの再実行
それでは、もう一度プログラムをテストして、すべてが正しく機能することを確認します。
Ctrl + F5 キーを押してアプリをビルドして起動します。
「
5+5
」と入力し、Enter キーを押します。 結果が 10 であることを確認してください。
アプリをデバッグする
ユーザーはコンソール ウィンドウに自由に入力できるので、電卓が一部の入力を想定どおりに処理するようにしましょう。 プログラムを実行するのではなく、代わりにデバッグして、実行内容を詳細に確認することができます。
デバッガーでアプリを実行するには
result = c.Calculate(x, oper, y);
の行にブレークポイントを設定します。 ブレークポイントを設定するには、行の横の、エディター ウィンドウの左端に沿った灰色の縦線をクリックします。 赤い点が表示されます。プログラムをデバッグするときは、常にその行で実行が一時停止されます。 単純なケースではプログラムが動作することが既に大体わかっています。 実行を毎回一時停止させないために、条件付きのブレークポイントを設定しましょう。
ブレークポイントを表す赤丸を右クリックし、 [条件] を選択します。 条件の編集ボックスに「
(y == 0) && (oper == '/')
」と入力します。 終わったら、[閉じる] ボタンを選んでブレークポイントの条件を保存します。これで、ゼロ除算が試行された場合に、ブレークポイントで実行が一時停止されます。
プログラムをデバッグするには、F5 キーを押すか、緑色の矢印アイコンがあるツール バーのボタン [ローカル Windows デバッガー] を選択します。 コンソール アプリで、「5 - 0」のように入力した場合、プログラムは正常に動作し、実行が継続されます。 ただし、「10/0」と入力すると、ブレークポイントで一時停止されます。 演算子と数値の間には任意の数のスペースを入れることもできます。
cin
で、入力を適切に解析できます。
デバッガーの便利なウィンドウ
コードをデバッグするたびに、新しいウィンドウがいくつか表示されることに注意してください。 これらは、デバッグ エクスペリエンスを支援するウィンドウです。 [自動] ウィンドウを見てください。 [自動] ウィンドウには、3 行以上前から現在の行までに使用されている変数の現在の値が表示されます。 その関数のすべての変数を確認するには、 [ローカル] ウィンドウに切り替えます。 このような変数の値をデバッグ中に変更して、プログラムにどのような影響があるかを確認できます。 この例では、そのままにします。
また、コード内の変数をポイントして、実行が一時停止されている現在の値を確認することもできます。 まずエディター ウィンドウをクリックして、フォーカスを切り替えます。
デバッグを続行するには
左側の黄色の矢印は、現在の実行ポイントを示します。 現在の行で
Calculate
を呼び出すため、F11 キーを押して関数の [ステップ イン] を行います。 現在は、Calculate
関数の本体のコードを実行しています。 [ステップ イン] は、標準ライブラリ関数を含め、現在いる行の関数にステップ インするため、注意してください。 標準ライブラリにステップ インしても問題ありませんが、ライブラリ コードではなく自分のコードに注目する方が大事ではないですか。実行ポイントが
Calculate
関数の先頭になったら、F10 キーを押してプログラムの実行内の次の行に移動します。 F10 キーは [ステップ オーバー] とも呼ばれます。 [ステップ オーバー] を使用すると、行の各部分で発生していることを詳しく調べることなく、行から行へ移動できます。 一般に、(Calculate
の本体に移動したときのように) 別の場所から呼び出されているコードを詳しく見るのでない限り、[ステップ イン] ではなく [ステップ オーバー] を使う必要があります。もう一方のファイルの
main()
関数に戻るまで繰り返し F10 キーを押して各行の [ステップ オーバー] を行い、cout
行で停止します。プログラムは期待どおりに動作しているように見えます。最初の数字を受け取り、それを 2 番目の数字で割ります。
cout
行のresult
変数をポイントするか、 [自動] ウィンドウのresult
を確認します。 その値inf
は正しくないので、修正しましょう。cout
行は、result
に格納されている値をそのまま出力するため、F10 キーを使用してもう 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; }
次に F5 キーを一度押します。 ユーザー入力を求めるために一時停止する必要があるまで、プログラムの実行が継続されます。 もう一度「
10 / 0
」と入力します。 今度はより役に立つメッセージが表示されます。 ユーザーはさらに入力を求められ、プログラムは通常どおり実行が継続されます。コンソール ウィンドウには、2 つの行 "10 / 0" と "Result is: inf" の後に、"10 / 0" と "Division by 0 exception" が表示されています。
注意
デバッグ モードでコードを編集すると、コードが古くなる危険性があります。 これは、デバッガーがまだ古いコードを実行していて、まだ変更が反映されていない場合に発生します。 これが発生すると、ユーザーに知らせるダイアログがデバッガーで表示されます。 F5 キーを押して実行中のコードを更新する必要がある場合があります。 具体的には、実行ポイントが関数内にあるときに関数内で変更を行った場合は、関数をステップ アウトしてからステップ インして、更新されたコードを取得する必要があります。 それが何らかの理由でうまくいかず、エラー メッセージが表示される場合は、IDE の上部にあるメニューの下にあるツール バーの赤色の四角をクリックしてデバッグを中止し、F5 キーを押してデバッグを再開します。または、ツール バーの停止ボタンの横にある緑色の [再生] 矢印を選択します。
エディット コンティニュが失敗するもう 1 つの理由は、"...を使用するには、[デバッグ]、[オプション]、[全般] にある [元のバージョンと完全に一致するソース ファイルを必要とする] の設定を有効にする必要があります" というメッセージが表示された場合です。これを解決するには、メイン メニューから [ツール]>[オプション]>[デバッグ]>[全般] を選び、[元のバージョンと完全に一致するソース ファイルを必要とする] チェック ボックスがオンになっていることを確認します。
[実行] と [デバッグ] のショートカットの概要
- 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 リポジトリを作成します。 その方法は次のとおりです。
Visual Studio の右下隅にあるステータス バーで、 [ソース管理に追加] を選択し、 [Git] を選択します。
[Git リポジトリの作成] ダイアログ ボックスで、GitHub にサインインします。
リポジトリ名は、フォルダーの場所に基づいて自動的に設定されます。 既定では、新しいリポジトリはプライベートになります。つまり、アクセスできるのは自分だけです。
ヒント
リポジトリがパブリックかプライベートかに関係なく、コードのバックアップをリモートの GitHub に安全に保存しておくことをお勧めします。 チームで作業していない場合でも、リモート リポジトリを使用すると、コードをご自分のすべてのコンピューターから利用できるようになります。
[作成とプッシュ] を選択します。
リポジトリを作成すると、ステータス バーに状態の詳細が表示されます。
矢印の付いた最初のアイコンには、現在のブランチにある出力/入力方向のコミットの数が表示されます。 このアイコンを使用して、入力方向のコミットをプルしたり、出力方向のコミットをプッシュしたりすることができます。 また、これらのコミットを最初に表示することもできます。 これを行うには、アイコンを選択し、 [View Outgoing/Incoming](出力/入力の表示) を選択します。
鉛筆の 2 番目のアイコンは、コードに対する確定されていない変更の数を示しています。 このアイコンを選択すると、 [Git 変更] ウィンドウにこれらの変更が表示されます。
ご自分のアプリで Git を使用する方法の詳細については、「Visual Studio のバージョン コントロールに関するドキュメント」を参照してください。
完成したアプリ
おめでとうございます! これで、電卓アプリのコードが完成し、ビルドしてデバッグし、リポジトリに追加すること、すべてを Visual Studio で行いました。
次の手順
C++ プログラマーにとってよくある出発点は、コマンド ラインで実行される "Hello, world!" アプリケーションです。 この記事でも、Visual Studio でそれを作ってから、さらに難しい電卓アプリに進みます。
必須コンポーネント
- Visual Studio 2019 と、C++ によるデスクトップ開発ワークロードがコンピューターにインストールおよび実行されている必要があります。 まだインストールされていない場合は、Visual Studio での C++ のインストール サポートに関するページを参照してください。
アプリのプロジェクトを作成する
Visual Studio では、"プロジェクト" を使用してアプリのコードを整理し、"ソリューション" を使用してプロジェクトを整理します。 プロジェクトには、アプリをビルドする場合に使用するすべてのオプション、構成、および規則が含まれています。 また、プロジェクトでは、プロジェクトのすべてのファイルと、外部のファイルとの間のリレーションシップも管理します。 アプリを作成するには、まず、新しいプロジェクトとソリューションを作成します。
Visual Studio のメニューバーで、 [ファイル]>[新規作成]>[プロジェクト] の順に選択します。 [新しいプロジェクト] ウィンドウが開きます。
左側のサイドバーで [Visual C++] が選択されていることを確認します。 中央にある [Windows コンソール アプリケーション] を選択します。
下部にある [名前] 編集ボックスで、新しいプロジェクトに「CalculatorTutorial」と名前を付け、 [OK] を選択します。
空の C++ Windows コンソール アプリケーションが作成されます。 コンソール アプリケーションは 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 でビルドおよび実行する方法を確認できます。
プロジェクトをビルドするには、 [ビルド] メニューの [ソリューションのビルド] を選択します。 [出力] ウィンドウに、ビルド プロセスの結果が表示されます。
コードを実行するには、メニュー バーで [デバッグ] 、 [デバッグなしで開始] の順に選択します。
コンソール ウィンドウが開き、アプリが実行されます。 Visual Studio でコンソール アプリを起動すると、コードが実行され、"続行するには何かキーを押してください . と表示されるので、出力を確認できます。 おめでとうございます。 Visual Studio で初めての "Hello, world!" コンソール アプリを作成できました。
キーを押してコンソール ウィンドウを閉じ、Visual Studio に戻ります。
これで、変更を加えるたびにアプリをビルドして実行するツールを利用して、コードが期待どおりに機能することを確認できるようになりました。 そうならない場合のデバッグ方法については後で説明します。
コードを編集する
次はこのテンプレートのコードを電卓アプリに変えましょう。
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()
からアクセスできる必要があります。
ファイルを保存するには、Ctrl + S キーを押すか、IDE の上部近くにある [保存] アイコン (メニュー バー下のツール バーのフロッピー ディスク アイコン) を選択します。
アプリケーションを実行するには、Ctrl + F5 キーを押すか、 [デバッグ] メニューに移動して [デバッグなしで開始] を選択します。 [このプロジェクトは最新ではありません] というポップアップが表示された場合、 [今後このダイアログを表示しない] を選択してから、 [はい] を選択してアプリケーションをビルドできます。 コードで指定したテキストを表示するコンソール ウィンドウが出現するのを確認できます。
[デバッグ] > [デバッグなしで開始] を示す短いビデオ。 プロジェクトが古いためにビルドするかどうかを確認するダイアログが表示されています。 [今後、このダイアログを表示しない] チェック ボックスがオンになっています。 [はい] を選択してプロジェクトをビルドし、電卓プロジェクトをビルドして、Windows コンソール ウィンドウで起動します。
完了したらコンソール ウィンドウを閉じます。
計算を実行するコードを追加する
いくつかの計算ロジックを追加しましょう。
Calculator クラスを追加するには
[プロジェクト] メニューの [クラスの追加] を選択します。 [クラス名] 編集ボックスに、「Calculator」と入力します。 [OK] をクリックします。 2 つの新しいファイルがプロジェクトに追加されます。 変更したファイルを一度にすべて保存するには、Ctrl + Shift + S キーを押します。 これは [ファイル]>[すべて保存] のキーボード ショートカットです。 [保存] ボタンの横にあるツール バーのボタン [すべて保存] (2 枚のフロッピー ディスクのアイコン) もあります。 一般に、保存時にファイルの漏れがないように、 [すべて保存] を頻繁に実行することをお勧めします。
クラスは、何かを実行するオブジェクトのブループリントのようなものです。 この例では、電卓とそれがどのように動作するかを定義します。
前に使った [クラスの追加] ウィザードでは、クラスと同じ名前の
.h
ファイルと.cpp
ファイルを作成しました。 IDE の横に表示される [ソリューション エクスプローラー] ウィンドウには、プロジェクト ファイルの完全な一覧が表示されます。 このウィンドウが表示されていない場合は、メニュー バーから開くことができます。 [表示]>[ソリューション エクスプローラー] を選択してください。これで、エディターに 3 つのタブが表示されます。
CalculatorTutorial.cpp
、Calculator.h
、およびCalculator.cpp
です。 そのうちのいずれかを誤って閉じた場合は、 [ソリューション エクスプローラー] ウィンドウでダブルクリックして再度開くことができます。ファイルが次のようになるように、
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
クラスを参照する予定です。
- このコードでは、
.cpp
ファイルでCalculate
関数を定義していないため、緑色の波線がCalculate
の下に表示されます。Calculate
をポイントし、表示される電球の下向き矢印をクリックして、[Calculator.cpp
で 'Calculate' の定義を作成] を選びます。 ポップアップが表示され、他のファイルで行われたコード変更を確認できます。 コードがCalculator.cpp
に追加されました。現時点では単に 0.0 が返されます。 これを変えてみましょう。 Esc キーを押してポップアップを閉じます。
エディター ウィンドウで
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 クラスのメンバー関数を呼び出すには
それでは、
CalculatorTutorial.cpp
のmain
関数を更新しましょう。// 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
ステートメントが必要です。 - 一部の初期変数
x
、y
、oper
、およびresult
は、それぞれ最初の数値、2 番目の数値、演算子、および最終結果を格納するために宣言されています。 未定義の動作を回避するために、この例のように、何らかの初期値を指定しておくことを常にお勧めします。 Calculator c;
行は、Calculator
クラスのインスタンスとして 'c' というオブジェクトを宣言しています。 このクラス自体は、電卓がどのように機能するかを示す単なるブループリントです。オブジェクトは計算を実行する特定の電卓です。while (true)
ステートメントはループです。()
内の条件を満たしている限り、ループ内のコードは繰り返し実行されます。 条件は単にtrue
と指定されているため、常に true になり、ループは永遠に実行されます。 プログラムを閉じるには、ユーザーは手動でコンソール ウィンドウを閉じる必要があります。 それ以外の場合、プログラムは常に新しい入力を待機します。cin
キーワードは、ユーザーからの入力を受け付けるために使用されます。 コンソール ウィンドウに入力されたテキストの行を処理し、ユーザー入力が必要な仕様に一致すると想定して、列挙された各変数の内側に順番に配置するのであれば、この入力ストリームで十分です。 この行を変更して、異なる種類の入力 (2 つより多くの数値など) を受け入れることができますが、これを処理するにはCalculate()
関数も更新する必要があります。c.Calculate(x, oper, y);
式は、前に定義したCalculate
関数を呼び出し、入力された値を提供します。 次に、関数はresult
に格納された数値を返します。- 最後に、
result
がコンソールに出力されるので、ユーザーには計算結果が表示されます。
- C++ プログラムは常に
コードのビルドとテストの再実行
それでは、もう一度プログラムをテストして、すべてが正しく機能することを確認します。
Ctrl + F5 キーを押してアプリをビルドして起動します。
「
5+5
」と入力し、Enter キーを押します。 結果が 10 であることを確認してください。
アプリをデバッグする
ユーザーはコンソール ウィンドウに自由に入力できるので、電卓が一部の入力を想定どおりに処理するようにしましょう。 プログラムを実行するのではなく、代わりにデバッグして、実行内容を詳細に確認することができます。
デバッガーでアプリを実行するには
result = c.Calculate(x, oper, y);
の行にブレークポイントを設定します。 ブレークポイントを設定するには、行の横の、エディター ウィンドウの左端に沿った灰色の縦線をクリックします。 赤い点が表示されます。プログラムをデバッグするときは、常にその行で実行が一時停止されます。 単純なケースではプログラムが動作することが既に大体わかっています。 実行を毎回一時停止させないために、条件付きのブレークポイントを設定しましょう。
ブレークポイントを表す赤丸を右クリックし、 [条件] を選択します。 条件の編集ボックスに「
(y == 0) && (oper == '/')
」と入力します。 終わったら、[閉じる] ボタンを選んでブレークポイントの条件を保存します。ブレークポイントの右クリックを示す短いビデオ。 ブレークポイントは、result = c.Calculate ( x, oper, y) というコード行にあります。 [条件...] がドロップダウンで選択されており、ブレークポイント設定ウィンドウが開きます。 [条件式] と [Is true] ドロップダウンの後のテキスト ボックスで、ユーザーは「y == 0 && oper == '/'」と入力し、[閉じる] を選択して条件付きブレークポイントを設定します。
これで、ゼロ除算が試行された場合に、ブレークポイントで実行が一時停止されます。
プログラムをデバッグするには、F5 キーを押すか、緑色の矢印アイコンがあるツール バーのボタン [ローカル Windows デバッガー] を選択します。 コンソール アプリで、「5 - 0」のように入力した場合、プログラムは正常に動作し、実行が継続されます。 ただし、「10/0」と入力すると、ブレークポイントで一時停止されます。 演算子と数値の間には任意の数のスペースを入れることもできます。
cin
で、入力を適切に解析できます。
デバッガーの便利なウィンドウ
コードをデバッグするたびに、新しいウィンドウがいくつか表示されることに注意してください。 これらは、デバッグ エクスペリエンスを支援するウィンドウです。 [自動] ウィンドウを見てください。 [自動] ウィンドウには、3 行以上前から現在の行までに使用されている変数の現在の値が表示されます。
その関数のすべての変数を確認するには、 [ローカル] ウィンドウに切り替えます。 このような変数の値をデバッグ中に変更して、プログラムにどのような影響があるかを確認できます。 この例では、そのままにします。
また、コード内の変数をポイントして、実行が一時停止されている現在の値を確認することもできます。 まずエディター ウィンドウをクリックして、フォーカスを切り替えます。
デバッグを続行するには
左側の黄色の矢印は、現在の実行ポイントを示します。 現在の行で
Calculate
を呼しているので、F11 キーを押してその関数にステップ インし、Calculate
関数の本体に移動します。 [ステップ イン] は、標準ライブラリ関数を含め、現在いる行の関数にステップ インするため、注意してください。 標準ライブラリにステップ インしても問題ありませんが、ライブラリ コードではなく自分のコードに注目する方が大事ではないですか。実行ポイントが
Calculate
関数の先頭になったら、F10 キーを押してプログラムの実行内の次の行に移動します。 F10 キーは [ステップ オーバー] とも呼ばれます。 [ステップ オーバー] を使用すると、行の各部分で発生していることを詳しく調べることなく、行から行へ移動できます。 一般に、(実行してCalculate
の本文に達したので) 別の場所から呼び出されたコードを詳しく掘り下げる場合を除き、 [ステップ イン] ではなく [ステップ オーバー] を使用することをお勧めします。もう一方のファイルの
main()
関数に戻るまで繰り返し F10 キーを押して各行の [ステップ オーバー] を行い、cout
行で停止します。プログラムは期待どおりに動作しているように見えます。最初の数字を受け取り、それを 2 番目の数字で割ります。
cout
行のresult
変数をポイントするか、 [自動] ウィンドウのresult
を確認します。 その値はinf
であり正しくないので、修正しましょう。cout
行は、result
に格納されている値をそのまま出力するため、F10 キーを使用してもう 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; }
次に F5 キーを一度押します。 ユーザー入力を求めるために一時停止する必要があるまで、プログラムの実行が継続されます。 もう一度「
10 / 0
」と入力します。 今度はより役に立つメッセージが表示されます。 ユーザーはさらに入力を求められ、プログラムは通常どおり実行が継続されます。注意
デバッグ モードでコードを編集すると、コードが古くなる危険性があります。 これは、デバッガーがまだ古いコードを実行していて、まだ変更が反映されていない場合に発生します。 このような状況になると、デバッガーによってダイアログがポップアップ表示されます。 F5 キーを押して実行中のコードを更新する必要がある場合があります。 具体的には、実行ポイントが関数内にあるときに関数内で変更を行った場合は、関数をステップ アウトしてからステップ インして、更新されたコードを取得します。 それが何らかの理由でうまくいかず、エラー メッセージが表示される場合は、IDE の上部にあるメニューの下にあるツール バーの赤色の四角をクリックしてデバッグを中止し、F5 キーを押してデバッグを再開します。または、ツール バーの停止ボタンの横にある緑色の [再生] 矢印を選択します。
エディット コンティニュが失敗するもう 1 つの理由は、メイン メニューに移動し、[ツール]>[オプション]>[デバッグ]>[全般] を選んで、[元のバージョンと完全に一致するソース ファイルを必要とする] チェック ボックスがオンになっていることを確認する必要があることです。
[実行] と [デバッグ] のショートカットの概要
- F5 キーを押すと (または [デバッグ]>[デバッグの開始] )、デバッグ セッションがまだアクティブでない場合は開始され、プログラムが実行され、ブレークポイントにヒットするか、ユーザー入力が必要になると停止されます。 ユーザー入力が不要で、ヒットするブレークポイントがない場合、プログラムは終了します。プログラムの実行が完了すると、コンソール ウィンドウは自動的に閉じます。 "Hello World" のようなプログラムを実行する場合は、F5 キーを押す前に Ctrl + F5 キーを押すか、ブレークポイントを設定してウィンドウを開いたままにします。
- Ctrl + F5 キーを押すと (または [デバッグ]>[デバッグなしで開始] )、デバッグ モードに移行せずにアプリケーションを実行します。 これはデバッグよりもわずかに速く、プログラムの実行が完了した後もコンソール ウィンドウは開いたままです。
- F10 キー ( [ステップ オーバー] と呼ばれます) を使用すると、コードを 1 行ずつ繰り返し実行し、コードの実行方法と各実行手順での変数値を視覚化できます。
- F11 キー ( [ステップ イン] と呼ばれます) を使用すると、 [ステップ オーバー] と同様に機能しますが、実行中の行で呼び出される関数にステップ インする点が異なります。 たとえば、実行中の行が関数を呼び出す場合、F11 キーを押すと、ポインターが関数の本文に移動するので、開始した行に戻る前に実行中の関数のコードに従うことができます。 F10 キーを押すと、関数呼び出しがステップ オーバーされ、次の行に移動します。関数呼び出しはまだ行われますが、実行内容を示すためにプログラムは一時停止しません。
アプリを閉じる
- まだ実行中の場合は、電卓アプリのコンソール ウィンドウを閉じます。
おめでとうございます! 電卓アプリのコードを完成し、Visual Studio でビルドしてデバッグしました。