1.6 使用C语言的7个步骤

正如您所看到的,C是一种编译性语言。如果您习惯于使用编译性语言,例如Pascal或FORTRAN,您会熟悉建立C程序的基本步骤。然而,如果您的背景是解释性语言(例如BASIC),或面向图形界面的语言(例如Visual Basic),或者您根本没有任何背景,则需要学习如何进行编译。我们很快就会看到这个过程,您会看到该过程直截了当而且容易理解。首先,为了让您对编程有一个概括了解,我们将编写C程序的过程分解为7个步骤(见图1.3)。注意这是理想化的。在实践中,尤其是在较大的项目中,您可能需要做一些反复工作,用后一步骤中所了解到的内容来改进前一个步骤。

阅读 ‧ 电子书库

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

图1.3 编程的7个步骤
1.6.1 第1步:定义程序目标

非常自然地,在开始时,您应对希望程序做什么有一个清晰的想法。考虑程序需要的信息、程序需要进行的计算和操作,以及程序应该向您报告的信息。在这一规划阶段,您应该用一般概念来考虑问题,而不是用一些具体的计算机语言术语来考虑。

1.6.2 第2步:设计程序

在对程序应该完成的事情有了一个概念性的认识后,您就应该决定程序如何完成它,用户界面应该是什么样的,程序应该如何组织,目标用户是谁,您有多长时间来完成这个程序?

您还需要确定在程序中(而且还可能在辅助文件中)如何表示数据,以及用什么方法来处理数据。当您开始学习使用C编程时,选择将是简单的,但当您处理更复杂的情况时,您会发现这些决策需要更多的思考。选择一个好的方式来表示信息通常可以使程序设计和数据处理容易很多。

再说一遍,您应该用一般的概念来考虑问题,而不是考虑具体代码,但您的某些决策可能要取决于语言的一般特征。例如,C编程人员在数据表示方面比Pascal编程人员有更多的选择。

1.6.3 第3步:编写代码

在程序有了清晰的设计后,就可以开始通过编写代码来实现它了。也就是说,将您的程序设计解释为C语言。这里是您真正需要使用C知识的地方。您可以在纸上勾画您的想法,但最终必须将代码输入计算机。这一过程的机制取决于编程环境。我们很快会介绍一些常见环境的细节。一般来说,需要使用文本编辑器来创建一种称为源代码的文件。该文件包含您的程序设计的C实现形式。程序清单1.1显示了C源代码的一个例子。

程序清单1.1 C源代码的例子

阅读 ‧ 电子书库

作为这一步的一部分,您应该给所编写的程序添加文字注释。最简单的方式是使用C的注释工具向源代码中加入解释。第2章“C语言概述”会更详细地解释有关在代码中添加注释方面的内容。

1.6.4 第4步:编译

下一个步骤是编译源代码。同样,编译细节也取决于编程环境,下面很快就会看到一些常见的环境。现在,让我们先对要做的事情有一个一般性的了解。

前面讲过,编译器是一个程序,其工作是将源代码转换为可执行代码。可执行代码是用计算机的本机语言或机器语言表示的代码。这种语言是由数字代码表示的详细指令组成。正如前面所介绍的,不同计算机具有不同的机器语言,C编译器用来将C语言转换成特定的机器语言。C编译器还从C的库中向最终程序加入代码。库中包含着许多标准例程供您使用,例如printf ()和scanf ()。(更准确地说,是一个被称为链接器(linker)的程序将库例程引入的,但在多数系统上,编译器为您运行链接器。)最后的结果是,形成一个包含计算机可以理解的代码并且您能够运行的可执行文件。

编译器还检查您的程序是否为有效的C语言程序。如果编译器发现错误,就将错误报告给您,而且不生成可执行文件。理解特定编译器的报错信息是您将要学习的另一种技能。

1.6.5 第5步:运行程序

传统上讲,可执行文件是您可以运行的一个程序。在很多公用环境(包括MS-DOS、UNIX和Linux控制台)中,要想运行某程序,只需要键入相应的可执行文件名即可。在其他环境下,例如VAX上的VMS,可能需要一个运行命令或一些其他机制。例如为Windows和Macintosh环境提供的集成开发环境(IDE)使您能够通过选择菜单中的选项或按下特殊键来编辑并执行您的C程序。所产生的程序还可以通过点击或双击文件名或图标直接从操作系统运行。

1.6.6 第6步:测试和调试程序

程序可以运行是一个好的迹象,但有可能它运行得不正确。因此,您应该进行检查,看程序是否在做要做的事情。您可能会发现一些程序有错误,在计算机行话中称之为bug。调试(Debugging)就是要发现并修正程序错误。学习中自然会犯错误,看起来编程中似乎也会犯错误,所以在将所学知识应用到编程中时,最好准备好时时想到自己很容易犯错误。当您成为本领更强、技艺更精湛的程序员时,您的错误也会变得更严重而且不易察觉。

您犯错误的机会很多。您可能会犯一个基本设计错误,可能会错误地实现了好的想法,可能会忽略了将程序搞得一团糟的意想不到的输入,可能会错误地使用C,可能会犯打字错误,也可能会将圆括号放在了错误的位置,如此等等。您还会发现自己可能犯更多的错误。

幸运的是,这并不是不可救药的情况,虽然可能会有好多次您认为已毫无办法了。编译器可以找出多种错误,而且您可以做一些事情来帮助自己追踪编译器所未能找出的错误。本书将在您的学习过程中提出调试建议。

1.6.7 第7步:维护和修改程序

在为自己或为别人创建程序时,该程序可能会有更广泛的应用。如果是这样,您可能会发现需要对其进行更改。或许会存在一个较小的bug,仅在有人输入以Zz开头的名字时该错误才显现出来,也可能您想到在程序中可以用更好的方式来完成某些事。您可以添加一个高明的新功能。您可以改编该程序使其可以在别的计算机系统上运行。如果对程序作了清楚的文字注释并采取良好的设计做法,则所有这些任务都会大大简化。

1.6.8 总结

编程工作通常不像上面讲述的过程那样是一条线。有时您必须在不同步骤间来回反复。例如,当您编写代码时,可能发现您的计划是不切实际的。您可能会看到一种更好的实现方式,或者在看到程序的运行后,让您有了改变该设计的想法。对您的编程工作加以记录有助于在各阶段之间反复改动。

很多学习者往往会忽视第1步和第2步(定义程序目标和设计该程序)而直接到第3步(编写程序)。您编写的第1个程序非常简单,可以在头脑中想象到整个过程。如果犯了错误,也容易找到。随着程序变得更长更复杂,头脑中的想象就开始无能为力了,而且错误也将变得难以发现。最终,那些忽略计划步骤的人会浪费大量时间并带来混乱和挫折,因为他们编写出了难看、功能不正常而且艰深难懂的程序。工作越大越复杂,需要的计划工作量就越大。

这里有一句忠告,那就是应该养成在编写代码前先进行规划的习惯。使用古老而可敬的笔记技术来大略记下程序的目标,并勾勒出设计概貌。如果您这样做了,最终会节省时间并感到满意。