sunpongber

用 C++ 创建控制台计算器

先来一段程序

// CalculatorTutorial.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>

int main()
{
    std::cout << "Hello World!\n";
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

这是一段简单的C++程序,包含了基本的程序结构,用于输出字符串“Hello World”到控制台
下面从语法角度逐部分分析这段C++程序代码
1.注释部分

// CalculatorTutorial.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

语法说明:
// 是C++中的单行注释符号,后面跟的内容是给开发者阅读的说明文字,不会被编译器执行。
这里的第一行注释说明了文件名(CalculatorTutorial.cpp)以及程序的入口点是main函数。
连续的//表示空行注释,通常用于分隔代码或提高可读性。
作用:
注释不影响程序运行,仅用于记录代码的用途或说明,便于开发者理解代码。
这里的注释表明这是一个教学示例程序(可能是计算器教程的一部分)。
2.预处理器指令

#include <iostream>

语法说明:
#include是C++的预处理器指令,用于在编译之前将指定的头文件内容包含到程序中。
<iostream>是C++标准库的头文件,提供了输入输出功能,比如std::cout(用于输出)和std::cin(用于输入)。
尖括号< >表示引用标准库头文件,而不是项目中的本地文件。
作用:
<iostream>头文件定义了标准输入输出流对象,允许程序与控制台进行交互。
这里的#include <iostream>是为了使用std::cout输出文本。
3.主函数定义

int main()

语法说明:
int是返回值类型,表示main函数返回一个整数值(通常用于表示程序的执行状态,0表示成功)。
main是C++程序的入口函数,程序运行时会从这里开始执行。
()表示main函数不接受任何参数,(C++也支持另一种形式int main(int argc, char* argv[])用于接收命令行参数,但这里未使用)。
函数体由大括号{ }包裹,包含实际的执行代码。
作用:
main函数是程序的起点,编译器会从这里开始执行代码。
返回值int通常在程序结束时返回给操作系统(本例中未显示返回,默认返回0)。
4.函数体内的输出语句

std::cout << "Hello World!\n";

语法说明:
std::cout是标准库中定义的输出流对象,位于std,命名空间,用于向控制台输出数据。
std::是命名空间前缀,表示使用标准库中的cout对象(避免与用户自定义的同名对象冲突)。
<<是输出运算符,将右侧的数据(这里是字符串"Hello World!")发送到std::cout。
"Hello World!"是一个字符串字面量,用双引号""包裹,表示要输出的文本内容。
\n是转义字符,表示换行符,输出后光标会移到下一行。
语句末尾的;是C++语句的结束标志,每条语句必须以分号结尾。
作用:
这行代码将字符串"Hello World!"输出到控制台,并输出后换行。
这是C++中最简单的输出示例,常用于初学者测试程序运行。
5.后续注释部分

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

语法说明:
这些是多行注释,仍然使用 // 符号,每行独立注释。
内容是关于如何在开发环境中运行和调试程序的说明,针对的是使用Visual Studio的开发者。
这些注释不影响程序运行,仅提供开发环境的实用提示。
作用:
提供运行和调试程序的快捷键(如 Ctrl + F5 表示不调试运行,F5 表示调试运行)。
介绍Visual Studio中解决方案资源管理器、团队资源管理器等工具的使用方法。
指导开发者如何管理项目文件和打开现有项目(.sln 文件是Visual Studio的解决方案文件)。

总结
这段代码是一个标准的C++入门程序,语法结构清晰,包含以下关键元素:
1.注释:用于说明代码用途和开发环境操作。
2.预处理器指令 #include :引入输入输出功能。
3.主函数 int main():程序的入口点。
4.输出语句 std::cout << "Hello World!\n";:向控制台输出文本并换行。
从语法角度看,这段代码完全符合C++标准,结构简单,适合初学者理解C++程序的基本组成。它使用了标准库的命名空间(std)、输出流(cout)和基本的字符串操作,展示了C++程序的最小执行单元。

第二段程序

// 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

了解代码:
1.该#include语句在其他文件中引入代码。有时,你可能会看到用尖括号括住的文件名,例如<iostream>。尖括号指示编译器先在标准系统目录中查找iostream头文件,如果未找到,则查找特定于项目的目录。其他时候,你可能会看到文件名被引号括起来,例如"someHeader.h"。引号指示编译器跳过在标准系统目录中查找,而只查找特定于项目的目录。
2.该using namespace std;命令告诉编译器预期C++标准库中的代码将用于此文件。如果没有此行,库中的每个关键字必须前面有std::表示其范围。例如,如果没有该行,每个对cout的引用都会写为std::cout。添加了该using语句,以便方便地访问另一个命名空间中的代码。
3.关键字cout用于在C++中输出到标准输出。运算符<<告知编译器将其右侧的任何内容发送到标准输出。
4.关键字endl类似于Enter键;它将行结束并将光标移动到下一行。最好将\n放在""所包含的字符串中以执行相同的操作,因为endl始终会刷新缓冲区,这可能会损害程序的性能。但是,由于这是一个非常小的应用,因此改用endl
5.所有C++语句都必须以分号结尾,并且所有C++应用程序必须包含一个main()函数。此函数是程序在启动时运行的内容。必须可从main()中访问所有代码才能使用。

添加代码以执行一些数学运算
类就像是用来定义对象功能的蓝图。在这种情况下,我们将定义一个计算器类来包含数学逻辑。
项目->添加类->类名“Calculator”,“添加类”向导创建.h和.cpp具有与类同名的文件。
在Calculator.h中写入以下代码

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

了解代码:
1.此代码声明一个名为Calculate的新函数,该函数处理Calculate加法、减法、乘法和除法的运算。
2.C++代码组织到标头(.h)文件和源文件(.cpp)文件中。其他一些文件扩展名由各种编辑器支持,但是这些是需要了解的主要文件扩展名。函数和变量通常声明,即在头文件中指定名称和类型,并在源文件中实现或给定定义。若要访问另一个文件中定义的代码,可以使用#include "filename.h"该文件的名称,该文件filename.h的名称声明要使用的变量或函数。
3.最好根据代码的作用将代码组织到不同的文件中,以便以后可以轻松找到所需的代码。在我们的案例中,我们将Calculator类与包含main()函数的文件单独定义,但计划在Calculator中引用main()类。

绿色波浪线会出现在Calculate下方,因为虽然函数Calculate已声明,但未定义。将鼠标悬停在Calculate,点击螺丝刀图标上的向下箭头,然后选择Calculator.cpp中创建“Calculate”的定义。

切换到Calculator.cpp编辑器窗口中的文件。将Calculator::Calculate(double x, char oper, double y)的内容替换为:\

#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;
    }
}

了解代码:
1.该函数Calculate采用数字、运算符和第二个数字。然后它会对两个数字执行请求的操作。
2.该switch语句检查提供的运算符,并执行与该之对应的事例。default:情况是为用户键入的运算符未被任何上述case语句处理时的后备方案。最好以更优雅的方式处理无效的用户输入,请参考以下程序:

#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 y != 0 ? x / y : throw std::runtime_error("Division by zero");
        default: throw std::runtime_error("Invalid operator");
    }
}

3.关键字double表示支持小数的数字类型。这种类型的数字成为浮点数,表示double具有额外精度的浮点数。这样,计算器就可以处理十进制数学和整数数学。由于Calculate代码开头(这表示函数的返回类型),因此必须始终返回双精度浮点数double,这就是我们在默认情况下返回0.0的原因。
4.该文件.h声明函数原型,该原型告知编译器需要哪些参数,以及从中预期返回的类型。.cpp该文件包含函数的所有实现详细信息。

如果此时再次编译并运行代码,它会在询问要执行那种操作后立即退出。因此,修改main函数以执行多个计算。

#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;
}


/*
#include <iostream>
#include "Calculator.h"
using namespace std;

int main() {
	Calculator calc;
	double x, y;
	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;
	cin >> x >> oper >> y;
	cout << "Result: " << calc.Calculate(x, oper, y) << endl;
	return 0;
}
*/

了解代码:
1.由于C++程序始终从函数开始main(),因此我们需要从该函数调用其它代码,因此需要一个#include语句才能使该代码对函数main()可见。
2.变量x、y变量operresult声明分别存储第一个数字、第二个数字、运算符和最终结果。最好给他们一些初始值以避免未定义的行为,这就是此处执行的操作。
3.该Calculator c;行声明一个c名为类实例Calculator的对象。类本身只是计算器工作原理的蓝图;该对象是执行数学运算的特定计算器。
4.该while (true)语句是一个循环。只要循环中的条件()为true,循环中的代码将反复执行。由于条件只是列为ture条件,因此始终为true,因此循环将永远运行。若要关闭程序,用户必须手动关闭控制台窗口,否则,程序将始终等待新输入。
5.关键字cin接受来自用户的输入。输入流足够智能,可以处理控制台窗口中输入的文本行,并按顺序将其放置在列出的每个变量中。
6.表达式c.Calculate(x, oper, y);调用Calculate前面定义的函数,并提供输入的输入值和请求的作。然后,该函数返回一个存储在result中的数字。
7.最后,result打印到控制台,用户会看到计算结果。

再次生成并测试代码

调试应用
由于用户可以自由地在控制台窗口中键入任何内容,因此请确保计算器处理意外输入。我们来调试程序,而不是运行程序,以便我们可以检查它正在执行分步作的内容。
在调试器中运行应用
1.在行CalcuatorTutorial.cpp中设置断点:result = c.Calculate(x, oper, y);若要设置断点,请单击编辑器窗口左边缘的灰色垂直栏中的线条旁边,以便出现红点。
现在,当我们调试程序时,执行将暂停在该行。 我们已经大致了解了该计划适用于简单情况。 由于我们不想在每次调用Calculate()时暂停执行,因此让我们设置断点条件。
2.右键单击表示断点的红点,然后选择“条件”。在条件的编辑框中,输入(y==0)&&(oper=='/')。选择“关闭”按钮以保存断点条件。
3.若要调试程序,请按 F5,或选择具有绿色箭头图标的本地Windows调试器调试器工具栏按钮。 在控制台应用中,如果输入类似于“5-0”的内容,程序的行为正常并持续运行。但是,如果键入“10/0”,它会在断点处暂停。可以在运算符和数字之间放置任意数量的空格:cin足够智能,可以适当地分析输入。

调试器中的有用窗口
调试代码时,会出现一些新窗口。查看“自动”窗口,显示变量的当前值,这些变量在当前行之前和前面至少使用了三行。如果未看到“自动”窗口,从主菜单中选择“调试>Windows>自动”。
若要查看该函数中的所有变量,请切换到“局部变量”窗口。由于这是一个小函数,因此“自动”和“局部变量”窗口显示相同的变量。但是,你可以在调试时修改“局部变量”窗口中这些变量的值,以查看它们对程序的影响。在这种情况下,我们不干涉它们。通过选择“自动”窗口底部的“局部变量”或从主菜单中选择“调试>>”,打开“局部变量”窗口。
还可以将鼠标悬停在代码中的变量上,以查看当前暂停执行时的当前值。首先单击编辑器窗口,确保编辑器窗口处于焦点。

继续调试
左侧的黄色箭头显示当前执行点。当前行调用Calculate,因此按F11单步进入函数。现在,你正在函数正文Calculate中执行代码。请谨慎使用步入功能,因为它会步入您所在行上的任何函数,包括标准库函数。可以探索标准库,但你可能更有兴趣专注于你自己的代码而不是库代码。
现在,执行点位于函数的Calculate开头,请按F10移动到程序执行中的下一行。F10也称为步过。可以使用单步跳过逐行执行,而无需深入了解行中每个部分发生的情况的详细信息。一般情况下,应使用“单步跳过”而不是“单步执行”,除非你想深入查看从其他地方调用的代码(正如你为到达Calculate的主体所做的)。
继续使用F10单步跳过每行,知道返回到另一个文件中的main()函数,并在cout行停下。

程序正在执行预期功能:它取第一个数字,并将其除以第二个数字。在cout行上,将鼠标悬停在result变量上,或在result窗口中查看。其值为inf,它看起来不对。
我们来修复它。该cout行输出存储result的任何值,因此使用F10再向前一行时,控制台窗口会显示:Result of 1/0 is: inf
此结果是由于除以零未定义,因此程序无法为请求的运算提供数值答案。

修复“除以零”错误
让我们更优雅地处理零除问题,以便用户更容易理解问题。
CalculatorTutorial.cpp中进行以下更改。由于调试器功能称为“编辑并继续”,你可以让程序在编辑时保持运行状态。在cin >> x >> oper >> y;后添加一个if语句,检查是否除以零,如果发生这种情况,则向用户输出消息。否则,结果将被打印。

#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 << "Math error: 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一次。程序执行将继续,知道必须暂停才能请求用户输入。再次输入1/0。现在,打印了一条更有用的消息。程序请求用户提供更多输入,程序继续正常运行。

备注
在调试模式下编辑代码时,有代码变得陈旧的风险。当调试器仍在运行旧代码,但尚未使用更为对其进行更新时,将发生这种情况。调试器会显示一个对话框,告知你合适发生这种情况。有时,可能需要按F5刷新正在执行的代码。具体而言,如果在执行点位于函数内部时对函数内部进行了更改,则需先退出该函数,然后再进入该函数,已更新执行的代码。如果这不起作用,并且看到错误消息,可以通过单击IDE顶部菜单下的工具栏中的红色方框来停止调试,然后通过输入F5或选择工具栏上停止按钮旁边的绿色“播放”箭头来重新开始调试。
编辑并继续可能失败的另一个原因是,如果看到一条消息,指出"在调试选项-常规下,需要启用'源文件必须与原始版本完全匹配’..."若要解决此问题,请在主菜单>>选项>调试>常规,并确保选中>"。

了解“运行”和“调试”快捷方式
F5或调试>启动调试,将启动一个调试会话(如果尚未处于活动状态),并运行程序,知道命中断点或程序需要用户输入。如果不需要用户输入,并且没有可用的断点可供命中,程序将终止,当程序完成运行时,控制台窗口将自行关闭。如果程序输出到控制台,请使用Ctrl+F5或设置断点,然后按F5使窗口保持打开状态。
Ctrl+F5或调试>无调试启动,运行程序而进入调试模式,这比调试要快一些,程序完成执行后控制台窗口将保持打开状态。
F10,也成为“步过”,允许你逐行执行代码,并直观地观察代码的运行方式以及每个执行步骤中的变量值。
F11(成为“步入”)的工作方式类似于“单步执行”,只是它进入执行行中调用的任何函数。例如,如果正在执行的行调用函数,请按F11将指针移到函数的正文中,以便可以按照函数的代码运行,然后再返回到开始的行。按F10跳过函数调用,直接移到下一行;函数调用仍然会执行,但程序不会暂停来展示执行过程。

关闭应用
如果仍在运行,请关闭控制台窗口已停止计算器应用。

添加Git源代码管理
创建应用后,可能需要将其添加到 Git 存储库。 我们已经为您考虑了。 借助 Visual Studio,可以使用可直接从 IDE 使用的 Git 工具轻松完成此过程。
提示
Git是最常用的新式版本控制系统,因此无论你是专业开发人员还是学习如何编写代码,Git 都可以非常有用。如果你不熟悉Git,https://git-scm.com/网站是一个很好的起点。在那里,可以找到备忘单、热门在线书籍和Git基本信息视频。

若要将代码与Git相关联,首先创建代码所在的新Git存储库。 操作方法如下:
1.在Visual Studio右下角的状态栏中,选择“添加到源代码管理”,然后选择“Git”。
2.在“创建 Git存储库”对话框中,登录到GitHub。
存储库名称根据文件夹位置自动填充。 默认情况下,新存储库是专用的,这意味着你是唯一可以访问它的人。
提示
无论存储库是公共的还是专用的,最好有一个安全存储在GitHub上的代码的远程备份。即使你未与团队合作,远程存储库也会让你从任何计算机获得代码。
3.选择“创建并推送”。
创建存储库后,状态详细信息将显示在状态栏中。
带有箭头的第一个图标显示当前分支中的传出/传入提交数。可以使用此图标来拉取任何传入提交或推送任何传出提交。还可以选择先查看这些提交。为此,请选择图标,然后选择“查看传出/传入”。
第二个带有铅笔的图标显示代码未提交的更改数。可以选择此图标,在Git更改窗口中查看这些更改。
若要详细了解如何将Git与应用配合使用,请参阅Visual Studio版本控制文档

完成的应用
祝贺!你完成了计算器应用的代码,生成并调试了它,并将其添加到存储库,全部在Visual Studio中。

后续步骤
详细了解 Visual Studio for C++

原始资料地址:
用 C++ 创建控制台计算器
如有侵权联系删除 仅供学习交流使用