1.1 程序设计的基本概念
1.1.1 程序和程序设计语言
什么是程序?怎样设计程序?这往往是计算机语言初学者首先遇到的问题。有人以为计算机是“万能”的,只要把任务告诉计算机,计算机就会自动完成一切,并给出正确结果。这其实是一种误解,要让计算机按照人的意志来完成某项任务,首先要制订该项任务的解决方案,再将其分解成计算机能够识别并可以执行的基本操作指令,把这些指令按一定的规则组织排列起来存放于计算机内存储器中,当给出执行命令后,计算机按照规定的流程依次执行存放在内存储器中的指令,最终完成所要实现的目标。人们把这种计算机能够识别并可以执行的指令序列称为程序。也就是说,程序是人与计算机进行“交流”的工具,它用我们常说的程序设计语言来描述。
程序设计语言是计算机能够理解和识别的语言。它通过一定的方式向计算机传送操作指令,从而使计算机能够按照人们的意愿进行各种操作处理。任何一种程序设计语言都有一定的使用规则,通常称为语法规则。要学习程序设计语言,必须注意学习它的语法规则,就像学习汉语要学习汉语语法一样。而学习程序设计语言的目的就是为了设计计算机程序。
程序设计语言的种类很多,大体上经过了由低级语言到高级语言的发展过程,目前广泛使用的有C、C++、Java、Visual BASIC、Visual FoxPro等高级语言,这些高级语言采用的都是接近于人们熟悉的数学语言和自然语言的表达形式,使人们的学习和使用更加容易和方便。我们把由高级语言编写的程序称为源程序。显而易见,用高级语言编写的源程序,计算机不能直接识别并执行,因为计算机只能识别和执行二进制形式的指令或数据,因此,必须有一个工具先将源程序转换成计算机能够识别的二进制形式的程序,我们把这种二进制形式表示的程序称为目标程序,而承担转换的工具称为语言处理程序。每一种程序设计语言都有与它对应的语言处理程序,语言处理程序对源程序的处理方式有编译方式和解释方式两种,相应的转换工具分别称为编译程序和解释程序。编译方式是指将源程序输入到计算机中后,用相应的编译程序将整个源程序转换成目标程序,然后再通过装配连接程序形成可执行程序,最后运行可执行程序得到结果。目标程序和可执行程序都是以文件的方式存放在磁盘上的,再次运行该程序,只需直接运行可执行程序,不必重新编译和连接。解释方式是指将源程序输入到计算机中后,用相应的解释程序将其逐条解释,边解释边执行,得到结果,而不保存解释后的机器代码,下次运行该程序时还要重新解释执行。采用编译方式,程序的运行速度快,效率高。因此,在目前常用的高级语言中除 BASIC 语言采用解释方式外,大部分高级语言都采用编译方式。
1.1.2 程序设计
对于初学者来说,往往把程序设计简单地理解为只是编写一个程序,这是不全面的。程序设计是指利用计算机解决问题的全过程,它包含多方面的内容,而编写程序只是其中的一部分。利用计算机解决实际问题,通常先要对问题的性质与要求进行深入分析并确定求解问题的数学模型或方法,然后考虑数据的组织方式和算法,并用某一种程序设计语言编写程序,最后调试程序,使之运行后能产生预期的结果,这个过程称为程序设计。程序设计的基本目标是实现算法和对初始数据进行处理,从而完成对问题的求解。
有些初学者,在没有把所要解决的问题分析清楚之前就急于编写程序,结果编程思路紊乱,很难得到预期的效果。因此,为了用计算机解决一个实际问题,作为设计人员,从拿到任务到得出正确结果,往往要经过以下6个设计阶段。
① 分析问题。即分析问题需求,也就是弄清楚该问题有哪些已知数据,程序运行需要输入什么数据,需要输出什么结果,需要进行哪些处理,等等。
② 确定处理方案。如果是数学问题,就要根据该问题的数学解法,考虑所用到的数学公式或相关函数;如果是工程问题,就要先建立该问题的数学模型,把工程问题转化成数学问题,以便用计算机解决。对同一个问题可以用不同的方案来处理,不同的方案决定了不同的处理步骤,效率也有所不同。
③ 确定操作步骤。根据选定的处理方案,具体列出让计算机如何进行操作的步骤。这种规定的操作步骤称为算法,而这些操作步骤之间的执行顺序就是控制结构。通常使用流程图来描述算法,把算法思想表达清楚,比较简单的问题可直接进入编写程序阶段。
④ 根据操作步骤编写源程序。用计算机语言编写的操作步骤就是计算机程序。
⑤ 运行调试程序。将计算机程序输入计算机中,经过编译、连接和运行,如果程序是正确的,应该能得到预期的结果。如果得不到正确的结果,应检查程序是否有错误,改正后再试运行,直到得出正确的结果为止。
⑥ 整理输出结果,写出相关文档。
图1.1所示为程序设计的一般过程。
图1.1 程序设计的一般过程
图1.1中,前两个步骤类似于人们解决问题的一般过程,即分析问题,然后确定一种处理方案。后4步则是程序设计的环节,其中最关键的是第③步“确定操作步骤”,或称算法设计。只要算法是正确的,编写程序就不会太困难。对于一个具体问题,编程者应该具备设计算法和正确使用已有算法的能力。