1.2 C程序的开发

1.2.1 C程序的编写和运行

一般说来,C程序的开发步骤要经过分析、设计、编码、编译、连接、运行、调试等一系列步骤。每个步骤产生的文件类型和具体流程如图1.2所示。

图1.2 编写C语言的步骤

1.程序分析

程序分析主要是明确程序需要什么功能,解决程序需要“做什么”的问题。

2.程序设计

程序设计是在程序分析的基础上,对解决问题的方法、思路或算法进行整理的过程,解决程序“怎么做”的问题。在该阶段,可以借助一些图形化的表达方式进行描述,比如流程图。

3.程序编码

程序编码是指根据C语言程序设计规范将程序设计阶段整理好的思路转换为源文件。C语言源文件的扩展名是.c。程序的编码工作一般在IDE上面进行,也可以在文本编辑器上面进行。

4.程序编译

C语言编译器能够识别C语言代码中的词汇、句子以及各种特定的格式,并将他们转换成计算机能够识别的目标文件,这个过程称为编译(Compile)。目标文件由段组成,扩展名是.obj。通常一个目标文件中至少有两个段。

(1)代码段:该段中所包含的主要是程序的指令。该段一般是可读和可执行的,但一般却不可写。

(2)数据段:主要存放程序中要用到的各种全局变量或静态的数据。一般数据段都是可读、可写、可执行的。

5.程序连接

由编译程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题。例如,某个源文件中的函数可能引用了另一个源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数等。所有的这些问题,都需要经连接程序的处理方能得以解决。

程序连接的主要任务就是将有关的目标文件彼此相连接,也就是将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体,也就是可执行文件。经过程序连接后,C源程序就最终被转换成可执行文件,在Windows操作系统中,可执行文件的扩展名一般是.exe。

6.程序运行

程序运行就是执行程序,看看程序的运行结果是否正确。如果结果不正确就需要对源文件进行重新编辑,然后再次编译、连接和运行。

7.程序调试

(1)程序调试指的是在程序没有语法错误,但运行结果不符合预期时,采用适当的工具或者方法,反复找出程序存在的问题,进行修改,最终使程序符合要求的过程。程序调试是一个程序员必须掌握的技能。程序员调试程序的时候,应对程序的设计思路非常清楚,知道每一段、每一行程序所应起到的作用。调试的基本过程是;先根据程序的运行情况,进行大致的检查;然后分析检查的结果、确定可能出现问题的代码范围,再进行专项检查;再分析检查结果,如此反复,最后确定问题所在并进行修改、运行验证结果。

(2)观察了解程序的问题表现。首先是了解清楚程序运行情况,特别是了解程序的任务、程序的预期表现与程序工作的实际表现。对于经验丰富的程序员可能不用后续检查就能知道问题所在。经验当然重要,但对于初学者而言,掌握正确的调试思路则更加重要,因为初学者很难通过观察程序而发现问题所在。

(3)弄清程序的主要工作流程。在学习过程中设计的程序一般都不太复杂,从总体算法上总是可以划分为几个大的模块(也可称为步骤,可以是一段程序或一个子程序——函数):接收用户的要求和任务(读取相应的参数、输入相应的数据)、对数据进行计算和处理、按格式要求输出相应的结果。对于每一个大的模块,又可以分为许多子模块。

(4)进行大致的检查,确定问题存在的模块。检查的任务,就是查看程序的实际工作状态(屏幕输出是否正确、各变量的值是否正确)与预期的设计是否一致,若不一致,则肯定有问题。对于较长、较复杂的程序,检查时不应从开始一行一行检查,这种方法效率低、不科学,也不易发现问题。正确的方法是:先分大模块检查,确定大模块有无问题,再针对有问题的大模块,检查其内部的工作过程。在检查过程中,用户应根据自己的经验,灵活调整检查策略,提高工作效率,例如可以使用二分法定位故障,也可观察后估计问题位置再进行检查。

(5)检查故障模块,确定问题并解决。对于复杂故障模块内部的运行检查,可以再分子模块(部分)进行分部检查。检查模块的设计是否正确的基本思路是:一步一步运行程序,看程序的运行流程是否如设计期望,看每步程序的运行结果(屏幕输出和相关变量)是否与设计的一致。