在我们编写和执行第一个 C++ 程序之前,我们需要更详细地了解 C++ 程序是如何开发的。下面的图形概述了一种简单的方法:
第 1 步:定义要解决的问题
这是定义程序做“什么”的步骤,你可以在这一步弄清楚你打算解决的问题。提出你要使用编程解决什么问题可能是最简单的一步,也可能是最难的一步。但从概念上讲,这应该是最简单的,你所需要的只是一个可以明确定义的想法,并且你已经为下一步做好了准备。
以下是一些示例:
- 我想写一个程序,允许我输入许多数字,然后计算平均值。
- 我想编写一个程序,生成一个2D 迷宫,让用户在其中行走。如果用户到达终点,他们就赢了。
- 我想编写一个程序,读取股票价格文件并预测股票是上涨还是下跌。
第 2 步:确定你要如何解决问题
这是定义程序“如何”做的步骤,你可以在这一步确定如何解决步骤 1 中提出的问题。这也是软件开发中最容易被忽视的步骤。问题的症结在于,解决问题的方法有很多种,但是,这些解决方案中有些是好的,有些是不好的。很多时候,程序员会有一个想法,坐下来,然后立即开始编写解决方案。这样子产生的解决方案通常都是不好的。
通常,好的解决方案具有以下特征:
- 它们很简单(不会过于复杂或令人困惑)。
- 它们有据可查(尤其是围绕所做的任何假设或限制)。
- 它们以模块化方式构建,因此可以在以后重复使用或更改其中的一部分,而不会影响程序的其他部分。
- 它们很强大,可以在发生意外情况时恢复或提供有用的错误消息。
当你坐下来立即开始编码时,你通常会想“我想做<某事>”,所以你实施了让你最快到达那里的解决方案。这可能导致程序脆弱、难以更改或扩展,或者存在大量 bug(技术缺陷)。
顺便说一句...
早在 1870 年代,托马斯·爱迪生(Thomas Edison)就首次使用了 bug 一词!然而,该术语在 1940 年代流行起来,当时工程师发现一只飞蛾卡在早期计算机的硬件中,导致短路。报告错误的日志和飞蛾现在都是史密森尼美国历史博物馆的一部分。可以在这里进行查看。
各种研究表明,在复杂的软件系统上,程序员实际上只有 10-40% 的时间花在编写初始程序上。另外 60-90% 用于维护,这可能包括调试(删除错误)、更新以应对环境变化(例如在新的操作系统版本上运行)、增强(微小更改以提高可用性或功能)或内部改进(以提高可靠性或可维护性)1.
因此,值得你花时间在前期(在你开始编码之前)思考解决问题的最佳方法,你做出了哪些假设,以及如何规划未来的情况,以便为自己节省大量的时间和麻烦。
在以后的课程中,我们还会再讨论如何有效地设计问题的解决方案。
第 3 步:编写程序
为了编写程序,我们需要两件事:首先,我们需要一种编程语言的知识 — 这就是本教程的目的!其次,我们需要一个文本编辑器来编写和保存我们编写的程序。我们使用 C++ 指令编写的程序称为源代码(通常缩写为代码)。可以使用任何你想要的文本编辑器编写程序,即使是像 Windows 的记事本或 Unix 的 vi 或 pico 这样简单的东西。
在基础的文本编辑器中输入的程序如下所示:
#include <iostream> int main() { std::cout << "Here is some text."; return 0; }
但是,我们强烈建议你使用专为编程而设计的编辑器(称为代码编辑器)。如果你还没有,请不要担心。我们稍后将介绍如何安装代码编辑器。
专为编码而设计的典型编辑器具有一些使编程变得更加容易的功能,包括:
- 行号。当编译器给我们一个错误时,行号很有用,因为典型的编译器错误会告诉你:一些错误代码/消息,第 64 行。如果编辑器没有显示行号的功能,查找第 64 行可能会非常麻烦。
- 语法高亮显示和着色。语法高亮显示和着色会更改程序各个部分的颜色,以便更轻松地识别程序的不同组件。
- 一种明确的固定宽度字体(通常称为“等宽字体”)。非编程字体通常很难区分数字 0 和字母 O,或者难以区分数字 1、字母 l(小写 L)和字母 I(大写 i)。一个好的编程字体将确保这些符号在视觉上是有区别的,以确保不会意外地使用一个符号来代替另一个符号。默认情况下,所有代码编辑器应该都启用了这个功能,但标准文本编辑器可能没有。使用固定宽度的字体(所有符号的宽度都相同)可以更轻松地正确设置代码格式和对齐。
下面是具有行号、语法高亮显示和固定宽度字体的 C++ 程序示例:
请注意,这比未高亮显示的版本更容易理解。我们在本教程中展示的源代码将同时具有行号和语法高亮显示,以使该代码更易于理解。
提示
Coding Font 有一个简洁的工具,可让你比较不同的编码字体,看看你最喜欢哪些字体。
对于高级读者
由于源代码是使用 ASCII 字符编写的,因此编程语言使用一定数量的 ASCII 艺术来表示数学概念。例如,≠
不是 ASCII 字符集的一部分,因此编程语言通常将!=
用于表示数学不等式。
一些编程字体,如 Fira Code,使用连字将这种“艺术”转换回单个字符。例如,Fira Code 将把!=
显示为≠
(使用与双字符版本相同的宽度)。有些人觉得这更容易阅读,而另一些人则更喜欢使用底层字符。
你编写的程序通常会被命名为something.cpp
,其中something
将替换为你为程序选择的名称(例如计算器、hi-lo 等)。.cpp
扩展名是告诉编译器(和你)这是一个包含 C++ 指令的 C++ 源代码文件。请注意,有些人使用扩展名.cc
(或者.cxx
)而不是.cpp
,但我们建议你使用.cpp
。
最佳实践
将代码文件命名为something.cpp
,其中something
是你选择的名称,.cpp
是指示文件是 C++ 源文件的扩展名。
另请注意,许多复杂的 C++ 程序具有多个.cpp 文件。尽管你最初要创建的大多数程序只有一个.cpp 文件,但可以编写具有数十个或数百个.cpp 文件的单个程序。
一旦我们编写了程序,接下来的步骤是将源代码转换为我们可以运行的东西,然后看看它是否有效!我们将在下一课中讨论这些(步骤 4-7)。