《高级程序设计技术》课件第1章.ppt

上传人(卖家):momomo 文档编号:8223305 上传时间:2025-01-13 格式:PPT 页数:133 大小:1.38MB
下载 相关 举报
《高级程序设计技术》课件第1章.ppt_第1页
第1页 / 共133页
《高级程序设计技术》课件第1章.ppt_第2页
第2页 / 共133页
《高级程序设计技术》课件第1章.ppt_第3页
第3页 / 共133页
《高级程序设计技术》课件第1章.ppt_第4页
第4页 / 共133页
《高级程序设计技术》课件第1章.ppt_第5页
第5页 / 共133页
点击查看更多>>
资源描述

1、第第1章章 程序设计基础程序设计基础1.1.程序设计语言与语言处理程序 1.2 程序设计的步骤1.3 程序执行过程与编程工具1.4 程序的调试方法1.5 参数传递相关技术1.6 完整的C程序结构1.7 良好的程序风格习题1实验1 1.1 程序设计语言与语言处理程序程序设计语言与语言处理程序1.1.1 程序设计语言程序设计语言为了有效地实现人与计算机之间的通信,人们设计出多种词汇少、语法简单、意义明确的适合于计算机使用的语言,这样的语言被称为计算机语言。计算机语言从狭义的角度看是计算机可以执行的机器语言,从广义角度看是一切用于人与计算机通信的语言,包括程序设计语言,各种专用的或通用的命令语言、查

2、询语言、定义语言等。程序设计语言(programming language)泛指一切用于书写计算机程序的语言,包括汇编语言、机器语言,以及称为高级语言的完全符号形式的、独立于具体计算机的语言。程序设计语言是计算机语言的一个子集。程序设计语言可分为低级语言与高级语言两大类。低级语言是与机器有关的语言,包括机器语言和汇编语言。高级语言是与机器无关的语言。1.机器语言机器语言机器语言是以“0”、“1”二进制代码形式表示的机器基本指令的集合,是计算机硬件唯一可以直接识别的语言。机器语言是最早出现的计算机语言,属于第一代程序设计语言。使用机器语言编写程序十分不便,因为这种语言直观性较差,难阅读、难修改。

3、而且,由于每台计算机的指令系统往往各不相同,因此在一台计算机上执行的程序要想在另一台计算机上执行,必须重新编写程序,造成了重复工作。但是,由于使用的是针对特定型号计算机的语言,故机器语言的运算效率是所有语言中最高的。2.汇编语言汇编语言汇编语言是为了解决机器语言难于理解和记忆的缺点,用易于理解、记忆的名称和符号表示的机器指令。例如,用“ADD”代表加法,“MOV”代表数据传递等。汇编语言比机器语言直观,使程序的编写、纠错和维护变得相对简单了,但其基本上还是一条指令对应一种基本操作,对机器硬件十分依赖,移植性不好。由于汇编语言还是针对特定硬件的一种程序设计语言,因此效率仍十分高,能准确发挥计算机

4、硬件的功能和特长,程序精练而质量高,所以至今仍是一种常用的软件开发工具。不论是机器语言还是汇编语言,都是面向硬件具体操作的,语言对机器的过分依赖要求使用者必须对硬件结构及其工作原理都十分熟悉,这对非计算机专业人员是难以做到的,对于计算机的推广应用是不利的。3.高级语言高级语言高级语言是人们为了解决低级语言的不足而设计的程序设计语言。它是由一些接近于自然语言和数学语言的语句组成的,因此更接近于要解决问题的表示方法,并在一定程度上与机器无关。用高级语言编写程序,易学、易用、易维护。但是由于机器硬件不能直接识别高级语言中的语句,因此高级语言必须通过编译系统编译或解释成低级语言后才能被计算机执行。高级

5、语言不依赖于计算机系统,不同的编译程序可以把相同的高级语言程序编译成不同计算机下有意义的低级语言,这些低级语言是不同的,但它们的意义是一样的,执行的效果也是一样的。高级语言分为面向过程的语言和面向对象的语言,现在面向对象的语言已逐步成为程序设计的主流。用高级语言编程的效率高,但执行速度没有低级语言快。高级语言的设计是很复杂的。因为它必须满足两种不同的需要:一方面它要满足程序设计人员的需要,可以方便、自然地描述现实世界中的问题;另一方面还要能够构造出高效率的翻译程序,能够把语言中的所有内容翻译成高效的机器指令。从20世纪50年代中期第一个实用的高级语言诞生以来,人们曾设计出几百种高级语言,但今天

6、实际使用的通用高级语言也不过数十种。下面介绍几种目前最常用的高级语言。(1)FORTRAN语言。它是使用最早的高级语言。FORTRAN语言从20世纪50年代中期到现在,经过几十年的实践检验,广泛用于科学计算程序的编制,人们称之为用于科学计算的“公式翻译语言”。(2)COBOL语言。它是主要面向商业的通用语言,创始于20世纪50年代末期,使用了十分接近于英语的语句,很容易理解,在事务处理中有着广泛的应用。(3)BASIC语言:它是20世纪60年代初为适应分时系统而研制的一种交互式语言,全称是Beginners All Purpose Symbolic Instruction Code,意为“初学

7、者通用符号指令代码”,是最容易掌握的语言之一。BASIC简化了FORTRAN操作,为无经验的人提供一种简单的编程语言,目前使用仍很广泛。Visual BASIC或QBASIC都属于BASIC语言的发展,不过Visual BASIC.net和传统的BASIC已经有了很大的区别。(4)LOGO语言。1967年美国麻省理工大学为儿童设计了一种LOGO编程语言,用于启发孩子们的学习与思考,于是LOGO成为一种热门的计算机教学语言。(5)Simula 67语言。1967年挪威科学家推出了Simula 67语言。该语言第一次提出类的概念,能够把应用中的概念直接用编程语言描述。该语言由于一些原因没能流行,但

8、它是面向对象编程语言的概念基础。(6)C语言。C语言于1970年由美国贝尔实验室研制成功。由于它表达简洁,控制结构和数据结构完备,具有丰富的运算符和数据类型,移植性强,编译质量高,因此得到了广泛的使用。(7)Pascal语言。它于1971年研制成功,是第一个系统地体现了结构化程序设计概念的高级语言。与BASIC、C等语言相比,Pascal语言更适合科学计算,其运行速度最快,编译能力也最强。其发展从Pascal 5.5、6.0、7.0一直到现在的Delphi、.NET。(8)PROLOG语言。它是1972年诞生于法国,后来在英国得到完善和发展的一种逻辑程序设计语言,广泛应用于人工智能领域。(9)

9、ADA语言。它是美国国防部直接领导下的、1975年开始开发的一种现代模块化语言,便于实现嵌入式应用,已被许多国家选定为军用标准语言。(10)C+语言。20世纪70年代中期,Bjarne Stroustrup在剑桥大学计算机中心工作。他以C为背景,以Simula思想为基础,在1979年开始从事将C改良为带类的C的工作。1983年该语言被正式命名为C+。C+支持C语言语法,但C+并不只是一个C语言的扩展版本。实际上,在C+和C语言之间存在着一个很大的区别,就是面向对象和结构化思想之间的区别。C+是面向对象的程序设计语言,而C语言则是一种标准的结构化语言。C+在标准化之后迅速成为了程序开发的主流语言

10、。(11)Java语言。Java是纯面向对象开发语言,也是目前非常流行的面向对象的程序设计语言之一。Java的最大优点是它的跨平台特性,即借助于运行在不同平台上的Java虚拟机,用Java编写的程序可以在多种不同的操作系统甚至硬件平台上运行,实现“一次编写,处处运行”。Java的语法和C+具有很多相似的地方,因此,如果在学习Java之前就已经对C+比较了解了,可能会感觉比较容易一些。不过C+有一些特性却是Java没有的。(12)C#语言。C#是Microsoft公司设计的下一代面向对象的语言产品。微软给它的定义是:“C#是从C和C+派生出来的一种简单、现代、面向对象和类型安全的编程语言。C#试

11、图结合Visual BASIC的快速开发能力和C+的强大灵活的能力。”C#有很多方面和Java类似。随着可视化技术的发展,出现了Visual BASIC、Visual C+、Delphi、.NET等可视化的开发环境,更加方便了程序员写出更有效率的软件。1.1.2 语言处理程序语言处理程序用高级程序设计语言编写程序,通常要经过编辑、语言处理、装配连接后,才能够在计算机上运行。编辑是指计算机通过编辑程序将人们编写的源程序送入计算机。编辑程序可以使用户方便地修改源程序,包括添加、删除、修改等,直到用户满意为止。语言处理程序是把用一种程序设计语言表示的程序转换为与之等价的另一种程序设计语言表示的程序的

12、处理程序。在计算机软件中经常用到的语言处理程序是把汇编语言或高级语言“翻译”成机器语言的翻译程序。被翻译的程序称为源程序或源代码,经过翻译程序“翻译”出来的结果程序称为目标程序。翻译程序有两种典型的实现途径,分别称为解释方式与编译方式。(1)解释方式。解释方式是按照源程序中语句的执行顺序,逐句翻译并立即予以执行。即由事先放入计算机中的解释程序把汇编语言或高级语言源程序语句逐条翻译成机器语言,翻译一句执行一句,直到程序全部翻译、执行完为止,如图1.1所示。解释方式类似于人类不同语言的口译工作。翻译员(解释程序)拿着外文版的说明书(源程序)在车间现场对操作员作现场指导。对说明书上的语句,翻译员逐条

13、译给操作员听;操作员根据听到的话(他能懂的语言)进行操作。翻译员每翻译一句,操作员就执行该句规定的操作。翻译员翻译完全部说明书,操作员也执行完所需全部操作。由于未保留翻译的结果,因此若需再次操作,仍要由翻译员翻译,操作员操作。图1.1 解释过程示意图(2)编译方式。编译方式先由翻译程序把源程序静态地翻译成目标程序,然后执行并得到结果,如图1.2所示。这种实现途径可以划分为两个明显的阶段:前一阶段称为生成阶段;后一阶段称为连接运行阶段。采用这种途径实现的翻译程序,如果源语言是一种高级语言,目标语言是某一计算机的机器语言或汇编语言,则这种翻译程序称为编译程序。如果源语言是计算机的汇编语言,目标语言

14、是相应计算机的机器语言,则这种翻译程序称为汇编程序。图1.2 编译过程示意图编译方式类似于不同语言的笔译工作。例如,某国的一个作家发表了某个剧本(源程序),我们计划在国内上演。首先必须由懂得该国语言的翻译(编译程序)把该剧本笔译成中文本(目的程序)。翻译工作结束,得到了中文本后,才能交给演出单位(计算机)去演(执行)这个中文本(目标程序)。在后面的演出(执行)阶段,并不需要原来的外文剧本(源程序),也不需要翻译(编译程序)。正像只懂汉语的人与只懂英语的人交谈需要英语翻译,与只懂日语的人交谈就需要日语翻译一样,使用不同的高级语言也需要不同的翻译程序。如果使用BASIC语言,需要在计算机系统中安装

15、BASIC语言的解释程序或编译程序;如果使用C语言,就需要在机器内安装C编译程序。如果机器内没有安装汇编语言或高级语言的翻译程序,计算机是决不能够理解用相应语言编写的程序的。比较而言,在翻译同样一篇外文文章的情况下,逐句翻译比整篇翻译的效率低,但一种语言的翻译程序类型不是由使用者,而是由系统软件的生产者决定的。目标程序只是一个个独立的程序段,还不能直接执行,因为程序中用到的库函数和一些其他资源还没有挂上,所以需要进行连接。连接的作用就是将各个目标程序,包括库函数等整合成一个可执行文件。1.2 程序设计的步骤程序设计的步骤程序设计的基本过程一般由分析问题、抽象数学模型、选择合适算法、编写程序、调

16、试运行程序及整理结果几个阶段构成,如图1.3所示。图1.3 用计算机解决问题的基本过程分析问题:对要解决的问题进行分析,理解题意。抽象数学模型:找出问题的运算操作与变化规律,经归纳,建立数学模型,确定问题的解决方案。选择合适算法:根据特定的数学模型,选择适合用计算机解决问题的算法,可将处理思路用流程图表示出来。(算法描述的主要流程图参见6.1.3节。)编写程序:选择一种程序设计语言,按算法思路编写程序。调试运行程序:调试运行程序,得到执行结果。整理结果:对程序的执行结果进行分析。如果发现错误,找出错误原因,重新调试,并形成试验报告。下面以一个古代的“百钱百鸡”问题为例进一步说明。中国古代数学家

17、张丘建在他的算经中提出了著名的“百钱百鸡问题”:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁、母、雏各几何?1.分析问题分析问题这是一个典型的数值型问题。对于简单的问题,这一步骤通常在脑子里会一闪而过,明白题意后,进行下一步。2.抽象数学模型抽象数学模型对于简单的问题,数学模型也就是我们平时说的数学方程。复杂的问题可能会涉及数据结构等因素。假设要买x只公鸡、y只母鸡、z只小鸡,根据题目的意思可以得到两个方程:x+y+z=100 根据题目的意思,可以确定x和y的取值范围:0 x、y、z100。1003z3y5x1003z3y5x3.确定算法确定算法本题可采用穷举法进行求解。对于

18、变量x、y、z的不同组合,看它们是否满足上面的两个方程。如果满足了,就是问题的一个解;如果不满足,就不是问题的解。采用三重嵌套的循环对变量x、y、z进行组合。4.编写程序编写程序【程序程序1.1】#include main()int x,y,z,j=0;/*j为计数器,记录解的数量*/for(x=0;x=100;x+)/*穷举变量x*/for(y=0;y=100;y+)/*穷举变量y*/for(z=0;z=100;z+)/*穷举变量z*/if(x+y+z=100&5*x+3*y+z/3=100)/*判断是否满足两个方程*/printf(%2d:cock=%2d hen=%2d chicken=

19、%2dn,+j,x,y,z);5.调试运行调试运行1:cock=0 hen=25 chicken=752:cock=3 hen=20 chicken=773:cock=4 hen=18 chicken=784:cock=7 hen=13 chicken=805:cock=8 hen=11 chicken=816:cock=11 hen=6 chicken=837:cock=12 hen=4 chicken=84 6.整理结果整理结果第2、4、6组解中,小鸡的数量不能被3整除。问题到底出在什么地方呢?我们进行进一步分析,将这些解代入方程,可以看到:10067.10067.271855383631

20、1510067.10067.2639353801337510067.10067.25601537720335显然,这三组解不满足数学方程,但由于我们在C语言中进行整型除法时,77/3的结果就是25,80/3的结果就是26,83/3的结果就是27,也就是说,计算机在进行整型数据除法运算时,对于商的小数部分不再进行处理,而是直接截断。所以就造成了在数学上本来不成立的方程,在计算机中成立了。产生这个问题的根本原因,就是我们在分析问题的过程中忽略了一个重要条件,变量z要能够被3整除。为了解决这个问题,应在原来两个方程的基础上增加一个判断条件:z%3=0 因此,得到程序1.2。【程序程序1.2】#inc

21、lude main()int x,y,z,j=0;for(x=0;x=100;x+)for(y=0;y=100;y+)for(z=0;z=100;z+)if(z%3=0&x+y+z=100&5*x+3*y+z/3=100)printf(%2d:cock=%2d hen=%2d chicken=%2dn,+j,x,y,z );运行结果:1:cock=0 hen=25 chicken=752:cock=4 hen=18 chicken=783:cock=8 hen=11 chicken=814:cock=12 hen=4 chicken=84 结果正确。思考:该问题可否有更快的解法?1.3 程序执

22、行过程与编程工具程序执行过程与编程工具1.3.1 C源程序执行过程源程序执行过程一个C源程序从输入到执行需要经过编辑、编译、连接、执行这些步骤。1编辑编辑编辑源程序的作用是建立与修改源程序。编辑的对象是源程序,源程序是以ASCII码的方式输入与存储的。Windows中的记事本以及1.3.2节介绍的编程工具均带有编辑功能。2编译编译所谓编译,就是将编写好的源程序翻译为二进制的目标代码,由相应的编译程序来完成。不同的高级语言需要不同的编译程序。编译以后产生的二进制目标代码一般扩展名为obj,它不能直接运行。3连接连接编译产生的二进制目标代码是对每一个模块直接翻译产生的,需要将各个模块与系统模块相连

23、接,才可以产生后缀为.exe的可执行文件。4执行执行运行可执行文件就可以获得我们所需要的结果。图1.4表示了从输入源程序到产生可执行目标程序的全过程。图1.4 C源程序从编辑到运行的过程1.3.2 C语言编程工具介绍语言编程工具介绍很多初学者将C、Turbo C(简称TC)、Visual C+(简称VC)等的关系搞不清楚,认为TC和VC也是一种编程语言。正确理解是:C是一种编程语言,TC和VC都是C的集成开发环境。集成开发环境(Integerated Development Environment,IDE)是一种集成了代码编辑器、编译器、调试器以及执行等与开发有关的实用工具的软件。由于大部分常

24、用工具都集成在一起了,因此使用IDE来进行开发效率会很高。下面主要介绍C语言的三种集成开发环境。1Turbo CTurbo C(简称TC)是Borland公司开发的DOS下16位 C语言集成开发工具,目前主要有2.0和3.0版本。2.0版本只支持C语言的编译且不支持鼠标操作,还需设置路径;而3.0版本可以支持C/C+两种语言编译,而且还支持鼠标和“/”注释方式,并且在安装好后就可以使用,无需设置。由于TC最初是在DOS环境下使用的,一切都需要用键盘来操作,对目前绝大多数习惯用鼠标的Windows用户来说,很不方便。但TC的编译速度快,代码执行速度高,程序调试也比较方便,界面简单,因此很多高校一

25、般以TC为IDE开发环境讲授C语言。(1)启动TC。双击TC文件夹下的TC.exe(.exe由于设置不同可能不显示),出现如图1.5所示界面。按Esc键后,出现黄色光标闪烁,此时就可以编写程序了。图1.5 TC界面屏幕最上方是程序下拉菜单,下面是程序的编辑区域。在编辑窗口上方,是所编辑程序文件的相关信息。如Line表示正在编辑的行号,Col表示正在编辑的列号,Insert表示正在插入状态下编辑,“C:NONAME.C”表示正在编辑的程序文件名以及存放盘符。特别提示特别提示:在编辑的过程中有时候会不小心按下键盘的Insert键,这会把输入时的插入状态变为改写状态,Insert提示也消失。此时按下

26、一个键后,光标所在位置的原来字符就会被改写为当前按下的字符。若要回到插入状态,只需再次按下Insert键即可。编辑区域的下方是Message窗口,编译程序时,可显示编译的相关信息。按F5键可关闭该窗口。窗口最下方是一些常用快捷键(2)编写程序与保存。编写程序时为了使程序美观、易懂,最好按层次缩进,而不是全部左对齐。在编写程序之前、中间或结束后都可以对程序进行保存。保存程序时选择“File”菜单下的“Save”命令,或按F2键,在弹出的窗口中输入程序存放的路径和程序名称即可,如图1.6所示。图1.6 保存程序特别提示特别提示:很多初学者在编写了十几行甚至更多代码时,程序的名称还是默认名称“NON

27、AME.C”,如果此时电脑出现故障,死机或断电,所编写的代码就会丢失。因此,建议在编写几行代码后即保存程序,之后在编写若干行后,直接按F2键进行快捷保存。另外程序编译和执行前也最好先保存,以免程序运行崩溃而造成代码丢失。(3)编译与连接。“Compile”菜单下的“Compile to OBJ”、“Make EXE file”,“Link EXE file”分别是“编译为目标代码”、“生成可执行文件”、“连接为可执行文件”。以上步骤可按F9键一步完成。此时,程序如果有错误,就会在Message窗口中显示相关错误信息。(4)运行与查看程序结果。选择“Run”菜单下的“Run”,或按Ctrl+F9

28、键运行程序,程序界面闪了一下,此时,程序已经执行完成。选择“Run”菜单下的“User Screen”或按Alt+F5键,可将界面切换到用户界面,以观察程序结果。之后按任意键可回到编辑窗口。特别提示:特别提示:F9键用于编译、连接;Ctrl+F9键用于执行可执行程序,如果按Ctrl+F9键时没有可执行的程序,则其自动生成可执行程序而后再执行,如图1.7所示。在程序最后加入getchar();语句,程序执行完后会自动停留在用户界面下,供用户观察结果,省去了按Alt+F5键的麻烦。图1.7 TC环境下C源程序从编辑到运行的过程在TC下编写C程序的过程总结如下:打开TC。双击TC目录下的TC.exe

29、。编写代码。如果要打开已有的文件,按F3键。保存文件。用File菜单中的Save或Write to保存。编译、连接。直接按F9键,如果没有错误则提示成功;否则会提示出错,调试并修改错误后继续编译、连接 运行、测试。按Ctrl+F9键。看结果。按Alt+F5键。(5)TC使用中常见问题。开始使用TC时,同学们经常会被下面两个编译错误所困扰,Unable to open include file XXX.h Unable to open input file COS.OBJ这些都是因为没有设置好路径引起的。TC一般有两种版本:一种是下载后需要安装的,安装过程中路径已经设置好;另一种是不需要安装的。

30、我们一般使用的是第二种版本,此时,路径的设置就很重要。要正确设置路径,首先需要了解几个路径的含义:Include directories:TC头文件路径。Library directories:TC库文件路径。Output directories:输出文件路径,即obj与exe文件的存放路径。Turbo C directories:TC路径。假设TC文件夹被放在F盘,如图1.8所示。图1.8 TC的假设路径那么,路径的设置应该为:Include directories:F:TCIncludeLibrary directories:F:TCLibOutput directories:Turbo

31、C directories:F:TC如果不设置输出文件路径,那么源程序在编译、连接过程中产生的.obj和.exe文件默认放在TC目录下,这样会使得TC目录下很混乱。因此,建议大家设置该路径。2.Win-TCWin-TC是一个TC Windows平台开发工具。该软件使用TC为内核,提供Windows平台的开发界面,因此也就支持Windows平台下的功能,例如剪切、复制、粘贴和查找替换等,方便了程序修改。Win-TC需要安装,读者可从网上下载,默认安装即可。不过,如果想看到执行结果,就一定要在程序最后加上getch()。另外,Win-TC没有提供程序调试工具,这点极大地限制了其推广使用。图1.9是

32、Win-TC的界面。图1.9 Win-TC界面3.Visual C+Visual C+(以下简称VC)是一个面向对象的可视化开发环境,主要支持C+语言,但也可以运行C程序。VC运行于Windows下,因此习惯了图形界面的用户非常容易接受。VC需要安装,本书以使用比较普遍的Visual C+6.0为例,介绍如何在VC环境下编写C程序。图1.10 启动Visual C+6.0图1.11 Visual C+6.0界面(2)创建文件。选择菜单“File”“New”,在弹出的对话框中选择“File”选项卡,在左边的列表中选择“C+Source File”,同时在右边输入文件的名称以及保存位置,如图1.1

33、2所示。点击“OK”键,在出现的白色区域内编写代码,如图1.13所示。图1.12 给文件起名图1.13 VC程序边界界面在TC环境下,我们虽然使用“stdio.h”文中的printf()和scanf()等函数,但可以不包含“stdio.h”头文件,因为C编译器能找到它们。但在VC环境下,使用任何函数时都必须包含其所在的头文件。另外,在TC环境下,main()函数的返回值类型可以不写(此时默认是int类型),函数体中也可以不出现return语句;但在VC环境下,一个函数如果有返回值,则函数体中一定要有return语句,若函数没有返回值,则必须写上void,这点要求比较严格。(3)编译、连接与运行

34、。选择菜单“Build”“Compile Hello.c”,会弹出一个对话框,如图1.14所示,选择“是(Y)”,如果程序没有错误,则在下方会出现编译成功的提示,如图1.15所示。图1.14 编译时的提示图1.15 编译成功我们知道,编译的结果是生成了目标文件Hello.obj,还不能运行,必须通过连接生成可执行文件Hello.exe之后才能运行。选择菜单“Build”“Build Hello.exe”,会生成可执行文件“Hello.exe”。最后,选择菜单“Build”“!Execute Hello.exe”,执行程序,程序的运行结果会显示出来,如图1.16所示。图1.16 程序运行结果通常

35、我们喜欢将编译、连接一起进行,因此,可以直接选择菜单“Build”“Build Hello.exe”进行连接,中间会自动进行编译。或者按工具栏上的图标(编译)、(连接)、(执行)进行编译、连接与运行。在文件保存路径“C:CTest”下除了生成“Hello.obj”和“Hello.exe”文件之外,还生成如图1.17所示的文件(夹)。图1.17 VC环境下运行C程序生成的文件特别提示:特别提示:作为初学者,我们除了关心.c文件、.obj文件和.exe文件之外,其余的文件可暂时不予关心。其中.obj和.exe文件都在Debug文件夹下。Debug文件夹一般都比较大,因此如果要拷走程序,只需拷贝.c

36、文件,在目标环境下重新生成.obj和.exe文件即可。除了上述的三种C语言编程工具外,还有Boland C也比较常用,感兴趣的读者可以找有关资料去学习。IDE开发环境只是方便了程序的编写、编译、运行和调试,程序设计的核心还是程序设计语言。因此,学好程序设计语言才是根本。作者推荐使用TC 2.0或VC 6.0作为C语言的IDE开发环境。1.4 程序的调试方法程序的调试方法很多初学者在调试完程序的语法错误后,以为大功告成,但执行完程序后,结果却很让人失望。此时,他们往往不知所措,不知道程序什么地方出错了,不知道下一步该怎么修改。下面我们一起来解决这些问题。1.4.1 错误分类错误分类程序中常见的错

37、误有三种:语法错误、运行错误和逻辑错误。语法错误是不符合程序设计语言语法规则的错误,这类错误通常在源程序被编译时就能及时发现(系统提示出错信息),因此比较容易修改。运行错误是程序在运行过程中产生的,比如除数为0错误、数组下标越界错误、空指针或错误指针错误。这类错误有时候会导致程序异常终止,有时候会产生莫名奇妙的结果,一般需要程序员的细心才能发现。逻辑错误是指程序运行后得不到所期望的结果(或正确的结果),也就是说程序并没有按照程序设计者的思路来运行。比如一个最简单例子是:我们的目的是求两个数的和,应该写成C=A+B;,由于书写错误写成了C=A-B;,这就是逻辑错误。逻辑错误是编译程序发现不了的,

38、也是最不容易修改的,一般要用户通过单步跟踪运行过程才能发现。下面列出一些初学者常犯的错误。1.编程功底不牢固编程功底不牢固(1)少加括号。如经常有类似下面的程序出现:for(i=0;in;i+)j=i*i;printf(%d*%d=%dn,i,i,j);该程序的本意是执行一次for循环时执行循环体内的2条语句,但因为缺少括号,使得结果大不一样!(2)忘记加分号。这种错误在编译时就能发现,但一般被指出有错的一行并不会发现错误,此时需要看一下上一行是否漏掉了分号。(3)多加分号。如:int i,k=0;for(i=0;i10;i+);if(i%2=0)k+;最后的if语句本来应在for循环内,现在

39、却在for循环之外了。(4)输入变量时少加&。如:int a,b;scanf(%d%d,a,b);这是不合法的,因为scanf函数的作用是按照a、b在内存的地址将a、b的值存进去,所以要加&。(5)输入字符串时多加了&。如:char str50;scanf(%s,&str);数组名本身就是地址,因此不需要加&。(6)变量输入方式与要求方式不符。如:scanf(%d%d,&a,&b);输入时不能用逗号作两个数据间的分隔符,那么下面的输入方式不合法:3,4 输入数据时,在两个数据之间以一个或多个空格间隔,也可用回车键、跳格键Tab间隔。如对于scanf(%d,%d,&a,&b);在“格式控制”字符

40、串中除了格式说明以外还有其他字符,则在输入数据时应输入与这些字符相同的字符。合法的输入是:3,4 若此时不用逗号而用空格或其他字符是不对的,不合法的输入是:3 4或 3:4 如对于scanf(a=%d,b=%d,&a,&b);输入应如以下形式:a=3,b=4如:scanf(%7.2f,&a);这样写是不合法的,因为输入数据时不能规定精度。(7)字符输入问题。在用“%c”格式输入字符时,“空格字符”和“转义字符”都作为有效字符输入。如:scanf(%c%c%c,&c1,&c2,&c3);如果输入:a b c,则将字符“a”送给c1,字符“”送给c2,字符“b”送给c3,因为%c只要求读入一个字符

41、,不需要用空格作为两个字符的间隔。以下输入合法:abc (将“a”送给c1,“b”送给c2,“c”送给c3)当在一个字符前面输入过其他类型数据时,因为确认输入时用过回车,因此后面的字符输入就会“跳过”,而直接将回车送入该字符。如对于scanf(%s,str);scanf(%c,&c);输入:northwest,则输入结束,原因是将“northwest”送入str,将“n”送入c。这种问题的解决办法是在输入单个字符前加fflush(stdin)函数,清空输入流缓冲区,即scanf(%s,str);fflush(stdin);scanf(%c,&c);(8)字符串输入。字符串输入时,以空格或回车作

42、为结束标志。如对于scanf(%s,name);输入:Wang meili,则name中的值为“wang”,而不是“wang meili”。(9)定义数组时误用变量。如:int n;scanf(%d,&n);int an;数组名后用方括号括起来的是常量表达式,可以包括常量和符号常量,不能是变量即C不允许对数组的大小作动态定义。(10)在定义数组时,将定义的“元素个数”误认为是可使用的最大下标值。如:main()static int a10=1,2,3,4,5,6,7,8,9,10;printf(%d,a10);C语言规定:定义时用a10,表示a数组有10个元素,其下标值由0开始,所以数组元素a

43、10是不存在的。2.书写错误书写错误(1)函数名字书写错误,一般在连接时会提示出错,比较容易修改。(2)变量书写错误,包括大小写错误、漏写或多写字符。如果写错的变量本身没有定义,编译时会提示出错。但如果写错的变量本身已经定义,比如在表达式中用到变量j时误写成了i,那么编译程序是找不出来的,修改这种错误只能靠用户自己细心查找。(3)“=”与“=”的错误。如:if(a=3)printf(the value of a is 3);该语句的本意是判断变量a的值是否等于3,如果等于3,则输入一句话。但写成上述语句之后,无论a是否等于3,都会输出“the value of a is 3”,并且将a的值改为

44、3,因为“=”是赋值而不是判断是否相等。3.括号不完整括号不完整大、小括号经常不成对出现。该错误也很好避免,那就是在需要用到括号的时候,先把一对括号都打出来,然后在中间输入,这样就不会忘记另一半括号了。4.缩进格式缩进格式这本身不是一种错误,但如果编写的程序没有任何格式,则其可读性很差,格式的混乱经常会直接导致逻辑错误。如果正确地运用缩进格式,大部分的错误就会一目了然。1.4.2 调试方法调试方法1.静态查错静态查错静态查错是指不执行程序,仅根据程序和框图对求解过程的描述来发现错误。由于有些错误在运行时很难查出,但在静态查错中却容易发现,比如说前面说到的书写错误,因此,静态查错往往是不可忽视的

45、审查步骤。静态查错一般顺序为先查程序局部,后查程序整体。查局部主要是独立地检查各个子模块的功能是否按照算法要求实现,查整体主要是检查各个局部之间的接口是否吻合,是否缺少某些功能。在静态查错阶段,可以有针对性地检查上面所列举的各类型错误。在这个阶段查出的错误越多,节省的调试时间也就越多。2.动态查错动态查错静态查错能够查出错误,但无法保证查出所有错误,因为这里有一个人为的因素在里面,只要一不小心,就可能漏掉一个错误。因此,我们需要动态查错与之相结合来找出遗漏的错误。与静态查错相对,动态查错是指通过跟踪程序的执行过程,核对输出结果来发现错误。动态查错的技巧可分为两大部分:测试用例的设计和测试的方法

46、。我们主要讲测试方法。动态查错的测试方法可以按照以下两种标准进行分类:(1)按照测试用例的设计依据的不同,可分为黑箱测试法和白箱测试法。只知程序的输入与输出功能,而不知程序的具体结构,通过列举各种不同的可能情况来设计测试用例,通过执行测试用例来发现错误的测试方法叫做黑箱测试法。已知程序的内部结构和流向,根据程序内部逻辑来设计测试用例,通过执行测试用例来发现错误的测试方法叫做白箱测试法。在进行底层模块测试的时候可以使用白箱测试法,通过专门的测试条件和测试数据来考查程序在不同点上的状态是否符合预期的要求。在总体调试的时候则可以使用黑箱测试法,脱离程序内部结构来考察对于不同情况下的测试数据,程序是否

47、能够正确输出。对于中间模块,可以用黑箱,也可以用白箱,或是两者兼用,具体要看适合哪种测试法。一般说来,结构复杂的模块使用黑箱测试法,结构简单的使用白箱测试法。最后要说的是,由于白箱测试法测试用例设计比较困难,所以在时间紧张的情况下,可以一律采用黑箱测试法,这样效率比较高。(2)按照测试顺序的不同,可分为由底向上测试和从顶向下测试。由底向上测试是先测最底层的模块,然后依次向上测试,最后测试主模块。从顶向下测试刚好与之相反,先测主模块,然后按照从顶向下设计的顺序依次测试各个模块。为了加快调试的速度,建议采用从顶向下的测试顺序,只在发现某个模块有错时才进入下一层调试,这样对迅速定位错误也有很大帮助。

48、在运用这些测试方法时,我们要注意哪些问题呢?首先,对自己所编的程序的结构、模块的功能一定要了如指掌。采用从顶向下的测试方法时,经常是一个模块还没有测试完,就转到了下一个模块,因而特别容易忘记和疏漏。如果对程序结构心中没有概念,就很容易被弄糊涂。又如果对模块的功能不是很清楚,则难以判断模块执行结果的对错,从而无法准确确定错误所在。其次,测试需要有条理地进行。坚持使用同一个测试用例直到输出正确为止;在一个模块没有测试完毕时,不要进行下一个模块的测试,除非这个模块是当前模块的子模块且在当前模块的测试中发现这个子模块有错。最后,在每次修改了源代码之后一定要把已经测过的所有测试用例再测一遍,以防产生新的

49、错误。3.跟踪调试跟踪调试跟踪调试通常是一件繁琐的事,它需要足够的耐心和细心。选择哪些变量进行跟踪也是至关重要的,准确的变量选择可以起到事半功倍的效果。一般来说,首先要跟踪的是存放输入数据的变量,尤其对于那些需要对输入数据进行一定处理的程序来说更是如此,输入数据不正确,即使是正确的程序,其输出也会与答案不符合;其次是那些频繁用到的全局变量,这些变量往往贯穿于整个程序中,一旦某处出错,会影响到其他模块的正确性,由此造成定位错误,出错的地方没有测试,正确的地方反而反复测试,因此对于这些全局变量的变化要密切加以关注,不可放过任何错误;再次就是那些循环变量了,跟踪循环变量可以准确地得知程序的执行进度,

50、从时间上把握错误所在;最后是其他的变量,需要根据实际情况加以选择,对使用较多的变量应优先加以跟踪。1.4.3 TC环境下的程序调试环境下的程序调试TC集成开发环境下的程序调试技术包括以下两种:单步跟踪程序的执行(F7键或RunTrace into,F8键或RunStep over);设置断点和观测项。当一个程序的执行结果与预期结果不同时,首先进行静态查错,对错误位置进行人为定位,看看有没有1.4.1节中提到的一些常见错误。当静态查错失效,也就是查不出错误时,就应该进行跟踪调试。(1)直接单步跟踪调试。直接按F7键或F8键,程序便从main函数开始执行。执行的过程中,通过设置观测项(Break/

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 大学
版权提示 | 免责声明

1,本文(《高级程序设计技术》课件第1章.ppt)为本站会员(momomo)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|