CProgram实验报告Word文档下载推荐.docx
- 文档编号:17836462
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:74
- 大小:395.33KB
CProgram实验报告Word文档下载推荐.docx
《CProgram实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《CProgram实验报告Word文档下载推荐.docx(74页珍藏版)》请在冰豆网上搜索。
对于非数值型的问题,通常也需要从众多的方法中选择一种合适的方法。
1.1.2结构特性的设计
结构特性设计得好坏,直接影响到程序设计的效率,乃至程序执行的效率。
结构特性的设计主要包括控制结构和数据结构的设计。
1.控制结构
一个程序的功能不仅取决于所选用的操作,而且还决定于操作之间的执行顺序,即程序的控制结构。
程序的控制结构实际给出了程序的框架,决定了程序中各操作的执行顺序。
2.数据结构
数据结构是指互相有关联的数据元素的集合。
数据结构又分为数据的逻辑结构和数据的存储结构。
数据的逻辑结构是指数据元素之间抽象化的相互关系,即数据的逻辑关系。
数据的存储结构是数据的逻辑结构在计算机中的存储方式。
1.1.3 算法的设计
算法是指为在有限步内解决一个具体问题而规定的意义明确的解题步骤的有限集合。
概括地说,算法是指解题方案的准确而完整的描述。
从程序来说,也可以说算法是一个有限条指令的集合,这些指令确定了解决某一特定类型问题的运算序列
算法不同于一般的计算公式。
作为算法应具有以下一些基本特征。
(1)可行性
算法的可行性包括两个方面;
一是算法中的每一个步骤必须是能实现的。
例如,在算法中,不允许出现分母为零的情况,在实数范围内不能求一个负数的平方根等;
二是算法执行的结果要能达到预期的目的。
(2)确定性
算法的确定性是指算法中的每一个步骤都必须有明确的定义,不允许有模棱两可的解释,也不允许有多义性。
(3)有穷性
算法的有穷性是指算法必须能在有限的时间内做完,即算法必须能在执行有限个步骤之后终止。
算法的有穷性还应包括合理的执行时间的含义。
因此如果一个算法需要执行千万年,显然失去了实用价值。
(4)有足够的原始数据
一个算法是否有效,还取决于为算法所提供的数据是否足够。
综上所述,所谓算法是一个过程,这一过程有一组严谨地定义运算顺序的规则,并且每一个规则都是有效的且是明确的,此顺序将在有限的次数下终止。
1.1.4流程的描述
程序设计的过程,实际上就是确定解决问题的详细步骤,而这个步骤通常称为流程。
在程序设计过程中,根据不同的设计阶段以及具体要求,可以使用不同的描述流程的工具。
常用的流程描述工具有以下几种。
1.自然语言
自然语言是人们在日常生活、工作、学习中通用的语言,一般不需专门的学习和训练就能理解用这种语言所表达的意思。
但用自然语言描述程序(或算法)的流程时,一般要求直接而简练,尽量减少语言上的修饰。
例如,为了描述计算并输z=y/x的流程,可以用自然语言描述如下:
(1)输入x,y。
(2)判断x是否为0:
若x=0,则输出错误信息;
否则计算y/x→z,且输出z。
2.算法描述语言
为了说明程序的流程,还可以用用户专门规定的某种语言描述,这种语言通常称为算法描述语言。
算法描述语言一般介于自然语言与程序设计语言之间,它具有自然语言灵活的特点,同时又接近与程序设计语言的描述。
但必须指出,用算法描述语言所描述的程序,一般不能直接作为程序来使用,最后还需转换成用某种程序设计语言所描述的程序。
算法描述语言与程序设计语言最大的区别就在于,算法描述语言比较自由,不像程序设计语言那样受语法的约束,只要描述得人们能理解就行,而不必考虑计算机处理时所要遵循的规定或其它一些细节。
例如,对于计算z=y/x这个例子,其处理的流程可以描述如下:
INPUTx,y
IF(x=0)THEN
OUTPUT“ERROR”
ELSE
{z=y/x
OUTPUTz
}
3.流程图
人们在程序设计的实践过程中,还总结出一套用图形来描述问题的处理过程,使流程更直观,易被一般人所接受。
用图形描述处理流程的工具称为流程图。
目前用得比较普遍的是N-S图,有时就称为结构化流程图。
4.编程
某种程序设计语言编写的程序本质上也是问题处理方案的描述,并且是最终的描述。
但在一般的程序设计过程中,不提倡一开始就编写程序,特别是对于大型的程序。
程序是程序设计的最终产品,需要经过每一步的细致加工才能得到,如果企图一开始就编写出程序,往往会舍得其反,达不到预想的结果。
下面是用C语言编写的计算z=y/x的程序:
#include“stdio.h”
main()
{floatx,y,z;
printf(“inputx,y:
”);
scanf(“%f,%f”,&
x,&
y);
if(x==0)printf(“error!
=0\n”);
else
(z=y/x;
printf(“z=%f\n”,z);
}
1.1.5调试与运行
最后编写出的程序还需进行测试和调试,只有经过调试后的程序才能正式运行。
所谓测试,是指通过一些典型例子,尽可能多地发现程序中的错误。
因此,测试的目的是为了发现程序中的错误,而不是为了证明程序正确。
所谓调试,是指找出程序中错误的具体位置,并改正错误。
由此可以看出,测试与调试往往是交错进行的,通过测试发现程序的错误,通过调试进一步找出错误的位置并改正错误。
这个过程需要重复多次。
1.2程序设计的基本方法
1.2.1结构化设计
结构化程序设计要求把程序的结构限制为顺序、选择和循环三种基本结构,以便提高程序的可读性。
这种结构化程序具有以下两个特点:
(1)以控制结构为单位,只有一个入口和一个出口,各单位之间的接口比较简单,每个单位也容易被人们所理解。
(2)缩小了程序的静态结构与动态执行之间的差异,使人们能方便、正确地理解程序的功能。
下面简要介绍三种基本控制结构的形式。
1.顺序结构
如图1.2(a)为传统流程图,1.2(b)为N-S图
图1.2(a)图1.2(b)
上图虚线框内是顺序结构。
其中A和B两框是顺序执行的。
即在执行完A框所指定的操作后,必须接着执行B框所指定的操作,它是最简单的一种基本结构。
2.选择结构(选取结构或分支结构)
如图1.3(a)为传统流程图,1.3(b)为N-S图
图1.3(a)图1.3(b)
上图虚框内是一个选择结构,此结构中必包含一个判断框。
根据给定的条件P是否成立而选择执行A框或B框。
请注意,无论P条件是否成立,只能执行A框或B框之一,不可能既执行A框又执行B框。
A框或B框中可以有一个是空的,即不执行任何操作。
3.循环结构
又称重复结构,即反复执行某一部分的操作,有两种循环结构:
当型和直到
(1)当型循环结构
如图1.4(a)为传统流程图,1.4(b)为N-S图。
图1.4(a)图1.4(b)
当给定的条件P1成立时,执行A框操作,执行完A后,再判断条件P是否成立,若仍然成立,再执行A框,如此反复执行至P1不成立结束循环。
(2)直到型循环
如图1.5(a)为传统流程图,1.5(b)为N-S图。
不成立
成立
图1.5(a)图1.5(a)
先执行A框,然后判断给定的条件P2是否成立,若P2条件不成立,则执行A,然后再对P2条件作判断,若P2条件仍不成立,又执行A,如此反复直到P2条件成立则结束循环。
1.2.2模块化设计
模块化设计是指把一个大程序按人们能理解的大小规模进行理解。
由于经过分解后的各模块比较小,因此容易实现,也容易调试。
在进行模块化程序设计时,应重点考虑以下两个问题:
按什么原则划分模块?
如何组织好各模块之间的联系?
(1)按功能划分模块
划分模块的基本原则是使每个模块都易于理解。
而按照人类思维的特点,按功能来划分模块最为自然。
按功能划分模块时,要求各模块的功能尽量单一,各模块之间的联系尽量少。
这样的模块其可读性和可理解性都比较好;
各模块间的接口关系比较简单;
当要修改某一功能时只涉及一个模块;
其它应用程序可以充分利用已有的一些模块。
(2)按层次组织模块
在按层次组织模块时,一般上层模块只指出“做什么”,只有在最底层的模块才精确地描述“怎么做”。
例如,在图1.6所示的层次结构中,主模块只需要指出总任务就可以了,而模块1、模块2与模块3分别指出各自的子任务,模块4、模块5与模块6才精确描述“怎么做”。
图1.6
1.2.3自顶向下、逐步细化的设计过程
自顶向下、逐步细化的设计过程,包括以下两个方面:
将一个复杂问题的解法分解和细化成由若干模块组成的层次结构;
将一个模块的功能逐步分解细化为一系列的处理步骤,直到某种程序设计语言的语句或某种机器指令。
自顶向下、逐步细化的设计过程具有以下两个优点:
(1)符合人们解决复杂问题的普遍规律,可以显著提高程序设计的效率;
(2)用先全局后局部、先整体后细节、先抽象后具体的方法设计出的程序具有清晰的层次结构,容易阅读和理解。
1.3程序设计语言
人们要利用计算机解决实际问题,一般首先要编制程序。
程序设计语言就是用户用来编写程序的语言,它是人与计算机之间交换信息的工具。
程序设计语言是软件系统的重要组成部分,而相应的的各种语言处理程序属于系统软件。
程序设计语言一般分为机器语言、汇编语言和高级语言三类。
1.3.1机器语言
机器语言是最底层的计算机语言。
用机器语言编写的程序,计算机硬件可以直接识别。
在用机器语言编写的程序中,每一条机器指令都是二进制形式的指令代码。
对于不同的计算机硬件,其机器语言是不同的,因此,针对一种计算机所编写的机器语言程序不能在另一种计算机上运行。
由于机器语言程序是直接针对计算机硬件的,因此它的执行效率比较高,能充分发挥计算机的速度性能。
但是,用机器语言编写程序的难度比较大,容易出错,而且程序的直观性比较差,也不容易移植。
1.3.2汇编语言
为了便于理解与记忆,人们采用能帮助记忆的英文缩写符号(称为指令助记符)来代替机器语言指令代码中的操作码,用地址符号来代替地址码。
用指令助记符及地址符号书写的指令称为汇编指令,而用汇编指令编写的程序称为汇编语言源程序。
由于汇编语言采用了助记符,因此,它比机器语言直观。
容易理解和记忆。
用汇编语言编写的程序也比机器语言程序易读、易检查、易修改。
但是,计算机不能直接识别它,必须由一种专门的翻译程序将汇编语言源程序翻译成机器语言程序后,计算机才能识别并执行,这种翻译的过程称为“汇编”,负责翻译的程序称为汇编程序。
1.3.3高级语言
机器语言和汇编语言都是面想机器的语言,一般称为低级语言。
低级语言对机器的依赖性太大,用它们开发的程序通用性很差,从20世纪50年代中期开始逐步发展了面向问题的程序设计语言,称为高级语言。
用高级语言编写程序要比低级语言容易得多,并大大简化了程序的编制和调试,使编程效率得到大幅度的提高。
高级语言的显著特点是独立于具体的计算机硬件,通用性和可移植性好。
必须指出,用任何一种高级语言编写的程序(称为源程序)都要通过编译程序翻译成机器语言程序(称为目标程序)后计算机才能执行,或者通过解释程序边解释边执行。
1.4程序设计的风格
程序设计的最终产品是程序,但仅设计和编制出一个运行结果正确的程序是不够的,还应养成良好的程序设计风格。
作为一个称职的程序员,应该记住以下两个最基本的出发点:
你编制的程序主要是给别人看的;
你编制的程序主要是为以后看的。
良好的程序设计风格,是在程序设计的全过程中逐步养成的,它主要表现在以下四个方面:
设计的风格;
语言运用的风格;
程序文本的风格;
输入/输出的风格。
1.5程序的调试
程序调试是一项复杂而又细致的工作,它要求程序调试者既要善于观察和思考,又要善于总结和积累经验。
通过程序调试这一环节,可进一步提高程序设计能力。
因此,对于初学者来说,切不可只注重设计出程序,而不重视程序调试这一重要环节。
1.5.1调试前的准备
1.熟悉程序运行环境
任何一种程序设计语言总是在一定的硬件和软件环境下进行编辑、编译、连接和运行的,而程序的调试运行效率往往与对这些环境的熟悉程度有着直接的关系。
因此,在调试运行程序前,应该熟悉程序的编辑、编译、连接和运行的操作过程。
2.在程序设计过程中要为程序调试作好准备
程序调试在整个程序设计过程中占很大的比重,因此,在程序设计一开始就应该考虑到程序调试的一些措施,为程序调试创造必要的条件。
主要体现在以下几个方面。
(1)采用模块化、结构化设计方法设计程序。
(2)编写程序时要为调试提供足够的灵活性。
程序设计虽然是针对实际问题的,但也要充分考虑到调试程序时可能出现的情况,编写程序时要为调试中临时修改、选择输入数据的形式和个数、改变输出形式等情况提供灵活性。
(3)根据程序调试的需要,选择并安排适当的中间结果输出和必要的“断点”。
为判断程序执行过程是否正常,以及观察程序执行的路径与中间结果的变化情况,应该在程序的适当位置输出必要的中间结果,通过中间结果可以观察程序的执行情况。
(4)精心准备供调试用的数据。
调试用的数据应该具有典型性和代表性。
1.5.2程序的静态检查
所谓静态检查,是指在程序编写好以后,先不上机调试,而是由人工对程序进行仔细的检查,检查程序中的语法规则和逻辑结构是否正确,同时也包括对书写笔误的检查。
1.语法规则的检查
语法规则的检查主要包括以下两个方面。
(1)语句正确性的检查
检查每个语句的书写是否正确;
检查形体相近的字符是否写错;
检查调用模块的实参与被调用模块的形参其个数、数据类型是否对应;
检查程序使用的标识符是否正确。
(2)语法正确性的检查
检查是否所有的变量都已定义;
检查语句的顺序是否正确;
检查复合语句的括号是否漏掉,括号是否匹配等。
2.逻辑结构的检查
如果程序的逻辑结构不正确,则在编译时要出错;
或者即使编译连接都通过了,但在运行时会出错或运行结果不正确。
对程序逻辑结果的检查主要包括以下几个方面:
检查程序中各变量的初值是否正确;
检查分支选择结构或循环结构中的条件是否正确;
检查循环结构中的循环次数是否正确,循环体中是否有改变循环条件的语句;
检查各结构之间的嵌套关系是否正确;
检查程序中的所有表达式是否正确,表达式中的括号是否配对等。
1.5.3程序的动态调试
动态调试即上机调试,它是程序调试的最后一步。
由于上机调试程序时的情况千差万别,错误是各种各样的,因此,调试过程比较复杂,问题也比较多。
下面分别介绍在程序编译连接与运行过程中的调试。
1.编译过程中的调试
编译程序在对源程序进行编译的过程中,要对语法进行检查,如果发现源程序中有语法错误,就会显示出错信息,指出语法错误的类型和发现错误的位置。
程序调试者可以根据这些对错误的提示信息,找到程序中的错误之处,并作相应修改。
但必须注意,有时编译程序给出许多出错信息,但并不表示程序中真的有许多错误,有可能是由于一个错误所造成的。
2.连接过程中的调试
一个程序编译通过后,还需要进行连接。
在连接过程中,要涉及到各模块之间以及各模块与系统之间的一些关系。
连接过程中常见的错误是外部调用有错,此时,系统会指出外部调用中出错的模块名。
有时会指出找不到某个库函数,此时要检查程序中是否漏掉了包含命令或函数名有错。
3.运行过程中的调试
运行过程中的错误可以归纳为以下两种情况。
(1)运行过程中给出错误信息
在这种情况下,调试者首先要仔细分析出错信息的内容,分清错误的性质,找出程序中的错误并修改之。
(2)运行过程不正常或运行结果不正确
运行过程不正常有各种各样的表现,如,程序运行不能正常结束,即通常所说的“死机”。
造成这种现象的原因,往往是循环结构有错,或者是系统程序被破坏。
4.常用的调试语句
在程序的动态调试过程中,除了对出错信息进行分析和判断,从而找出程序中的错误以外,还可以在程序中插入一些调试语句,根据调试语句执行的情况来寻找程序中的错误。
常用的调试语句有以下三种。
(1)回声打印
这种打印语句的作用是检查数据的输入或传送是否正确。
具体做法是:
在输入语句后设置一个输出语句,输出刚输入的数据,看其输入是否正确;
或者在调用语句之前以及被调用模块的入口处设置打印语句,检查调用中数据传递是否正确。
(2)选择打印
在一些可疑点插入打印语句,以得到有关的变量值或一些中间结果。
这对于排除一些可疑点,确定出错位置是很有帮助的。
(3)跟踪打印
这种打印语句的作用类似于调试工具中的跟踪功能,主要是为调试者提供程序执行的路径。
例如,在循环结构中设置打印语句,可以反映出循环的执行情况;
在分支结构中对每个分支设置不同的打印语句,能使调试者了解程序执行的路径。
第2章实验指导
2.1上机实验总的目的和要求
2.1.1上机实验目的
学习C语言程序设计课程必须重视实践环节。
即独立编写出程序,独立上机调试程序。
必须保证有足够的上机实验时间。
上机实验的目的,绝不仅是为了验证教材和讲课的内容或者验证自己所编的程序正确与否。
学习程序设计,上机实验的目的为:
1、加深对讲授内容的理解,尤其是一些语法规定,光靠课堂讲授,既枯燥无味又难以记住,但它们都很重要。
通过多次上机,就能自然地、熟练地掌握。
通过上机来掌握语法规则是行之有效的方法。
2、熟悉所用的计算机系统的操作方法,也就是了解和熟悉C语言程序开发的环境。
一个程序必须在一定的外部环境下才能运行,所谓"
环境"
,就是指所用的计算机系统的硬件和软件条件。
使用者应该了解为了运行一个C程序,需要哪些必要的外部条件(例如硬件配置、软件配置),可以利用哪些系统的功能来帮助自己开发程序。
每一种计算机系统的功能和操作方法不完全相同,但只要熟练掌握一、二种计算机系统的使用,再遇到其它的系统时便会触类旁通,很快地学会。
3、学会上机调试程序。
也就是善于发现程序中的错误,并且能很快地排除这些错误,使程序能正确运行。
经验丰富的人,当编译时出现"
出错信息"
时,能很快地判断出错误所在,并改正之。
而缺乏经验的人即使在明确的出错提示下也往往找不出错误而求救于别人。
计算机技术是实践性很强的技术,要求从事这一领域的人不仅能了解和熟悉有关理论和方法,还要求自己动手实现。
对程序设计来说,要求会编程序并上机调试通过。
因此调试程序本身是程序设计课程的一个重要的内容和基本要求,应给予充分的重视。
调试程序的经验固然可以借鉴他人的现成经验,但更重要的是通过自己的直接实践来累积,而且有些经验是只能"
会意"
难以"
言传"
。
别人的经验有能代替自己的经验,调试程序的能力是每个程序设计人员应当掌握的一项基本功。
因此,在实验时千万不要在程序通过后就认为万事大吉、完成任务了,而应当在已通过的程序基础上作一些改动(例如修改一些参数、增加程序一些功能、改变输入数据的方法等卜再进行编译、连接和运行。
甚至于"
自设障碍"
,即把正确的程序改为有错的(例如用scanf函数输入变量时,漏写"
&
"
符号:
使数组下标出界;
使整数溢出等),观察和分析所出现的情况。
这样的学习才会有真正的收获,是灵活主动地学习而不是固板被动的学习
2.1.2上机实验前的准备工作
在上机实验前应事先做好准备工作,以提高上机实验的效率,准备工作至少应包括如下五个方面:
1、了解所用的计算机系统的性能和使用方法(包括C编译系统)
2、复习和掌握与本实验有关的教学内容
3、准备好上机所需的程序。
程序应书写整齐,并经人工检查无误后才能上机,以提高上机效率。
初学者切忌不编程序或抄别人程序去上机,应从一开始就养成严谨的科学作风。
4、对运行中可能出现的问题应事先作出估计;
对程序中自己有疑问的地方,应作上记号,以便上机时给予注意。
5、准备好调试和运行时所需的数据。
2.1.3上机实验的步骤
一个C源程序编写完成后,就可以进入输入、编译连接与运行的过程。
1.源程序的输入
用户编写好的C源程序只有输入进行计算机经处理后才能运行。
因此,上机运行程序的第一步是输入源程序、建立源文件。
2.编译
编译通过后,即生成相应的目标程序,它是由计算机能识别的机器代码所组成的。
3.连接
所谓连接,是指将编译生成的目标程序文件与被调用函数的目标模块进行连接,最后生成一个计算机真正能执行的可执行文件。
在连接的过程中,也要进行查错,主要是检查调用、各模块之间的联系以及存储空间等方面的错误。
如果发现有连接错误,则要对源程序进行编辑修改,然后重新进行编译和连接。
4.运行
源程序经过文件的编辑、编译和连接过程,并且无错误发生,最后生成可执行文件后,就可以运行该可执行文件,得到所需要的结果。
必须指出,编译连接过程虽然能发现源程序中的大部分语法等错误,但不能发现程序中的全部错误,特别是不能发现逻辑错误(应该实现的功能未实现)。
在这种情况下,还需要对源程序进行编辑修改,然后再进行编译连接,直到运行结果正确为止。
上机过程出现的问题,除了系统的问题外,一般应自己独立处理,不要轻易举手问老师,尤其对“出错信息“,应善于自己分析判断。
这是学习调试程序的良好机会,上机实验一般应包括以下几个步骤:
1、调出C编译系统,进入C工作环境(如TurboC集成环境)
2、输入自己编好的程序(默认扩展名.C,应采用正确的指法击键)
3、检查一遍已输入的程序是否有错(包括输入时打错的和编程中的错误),如发现有错,则及时改正。
4、进行编译(按F9键),生成目标文件(扩展名为.OBJ)与可执行文件(扩展名为.EXE)。
若在编译和连接过程中发现错误,屏幕上会出现“出错信息“,根据提示找到出错位置和原因,加以改正,再进行编译……直到顺利通过编译和连接为止。
5、运行程序,并分析运行结果是否合理和正确。
如果在这一步中发现有错误,则要重新调用编辑程序对源程序进行编辑修改,再进行编译、连接与运行,直到没有错误为止。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CProgram 实验 报告