《结构化程序设计综合训练精选PPT.ppt》由会员分享,可在线阅读,更多相关《结构化程序设计综合训练精选PPT.ppt(73页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、结构化程序设计综合训练第1页,此课件共73页哦一、本课程的教学目的o结构化程序设计和面向对象程序设计是程序设计的两种典型的思想和方法。目前高校开设的程序设计课程也基本据此划分为两大系列。o本课程以C语言为工具,通过布置一些程序,进行结构化程序化设计的综合训练,该课程是计算机专业的一门实验课,通过该课程的学习,o达到以下目的:第2页,此课件共73页哦课程目的课程目的o1在软件工程生命周期开发方法的指导下,在软件工程生命周期开发方法的指导下,深入理解和真正掌握自顶向下、逐步求精的深入理解和真正掌握自顶向下、逐步求精的结构化程序设计方法;结构化程序设计方法;o2.掌握良好的程序设计编码风格;掌握良好
2、的程序设计编码风格;o3学习常用的算法设计的技术;学习常用的算法设计的技术;o4进一步提高学生的程序调试能力;进一步提高学生的程序调试能力;o5提高学生的程序编程兴趣。提高学生的程序编程兴趣。第3页,此课件共73页哦二、教材:o本课程是实践性课程,主要以实验为主。本课程是实践性课程,主要以实验为主。第4页,此课件共73页哦三、课时的安排序号内 容讲授(学时)实验1结构化程序方法的开发流程1.52管理系统的开发0.53.53游戏程序的开发0.53.54筛选的算法设计技术0.53.55归纳的算法设计技术0.53.56分治的算法设计技术0.53.57最优的算法设计技术0.53.58综合程序开发0.5
3、49总结2合计725第5页,此课件共73页哦四、其它说明n从三个方面考核每个实验的成绩:功能完成情从三个方面考核每个实验的成绩:功能完成情况、实验报告以及程序风格、界面设计以及操况、实验报告以及程序风格、界面设计以及操作方便性。作方便性。第6页,此课件共73页哦结构化开发方法o在60年代计算机发展初期,程序设计是少数聪明人干的事。他们的智力与技能超群,编写的程序既能控制弱智的计算机,又能让别人看不懂、不会用。那个时期编程就跟捏泥巴一样随心所欲,人们就在这种美滋滋的感觉下热情地编程,结果产生了一堆问题:程序质量低下,错误频出,进度延误,费用剧增。这些问题导致了“软件危机”。第7页,此课件共73页
4、哦结构化开发方法o在1968年,一群程序员、计算机科学家与工业界人士聚集一起共商对策。通过借鉴传统工业的成功做法,他们主张通过工程化的方法开发软件来解决软件危机,并冠以“软件工程”这一术语。o软件工程主要讲述软件开发的道理,基本上是软件实践者的成功经验和失败教训的总结。第8页,此课件共73页哦结构化开发方法o结构化开发方法是一种设计程序的技术,采用自顶向下逐步求精的设计方法和单入口单出口的顺序、选择和循环三种基本控制结构。它提出的原则可归纳为32字:“自顶向下,逐步细化;清晰第一,效率第二;书写规范,缩进格式;基本结构,组合而成。”第9页,此课件共73页哦1、结构化开发方法o软件有自己的“生命
5、周期”。一个软件从定义、开发、使用和维护,直到最终被废弃,要经历一个漫长的时期,通常把软件经历的这个漫长的时期成为生命周期。第10页,此课件共73页哦1、结构化开发方法o软件工程的开发方法就是从时间角度对复杂的软件问题进行分解,把软件漫长的生命周期依次分为若干个阶段,每个阶段有独立的任务,然后逐步完成每个阶段的任务。前一个阶段任务的完成是进行后一个阶段工作的前提和基础,而后一个阶段任务的完成通常是前一个阶段提出的解法更进一步具体化,增加了更多的实现细节。第11页,此课件共73页哦1、结构化开发方法o在每一个阶段结束之前都必须进行正式严格的技术审查和管理复审,若审查通不过,则必须进行必要的返工,
6、返工后还要进行审查。审查的一个主要标志就是每个阶段都应该提交与所开发的软件完全一致的高质量的文档资料,文档不仅是前后阶段的通信工具,而且是软件交付使用后进行维护的依据。第12页,此课件共73页哦1、结构化开发方法o采用结构化的开发方法,使软件开发的全过程以一种有条不紊的方式进行,保证了软件的质量,特别是提高了软件的可维护性。第13页,此课件共73页哦2、结构化方法的开发流程o在结构化开发中,编码只是软件开发的一个很小的阶段,而且是处在实现阶段。o结构化的开发流程可以用如图的瀑布模型来模拟:第14页,此课件共73页哦瀑布模型第15页,此课件共73页哦软件生命周期各阶段的主要任务 o问题定义:问题
7、定义:“要解决的问题是什么”。o问题定义阶段是整个过程中占用时间最少的阶段。第16页,此课件共73页哦软件生命周期各阶段的主要任务o可行性研究:从经济、技术、法律等方面分析确定系统是否值得开发,及时建议停止项目开发,避免人力、物力、时间的浪费,并进行方案选择。o可行性研究的目的不是解决问题,而是确定问题是否值得去解决。o可行性研究包括四个方面的研究:l经济可行性l技术可行性l法律可行性l方案的选择第17页,此课件共73页哦软件生命周期各阶段的主要任务o需求分析:准确回答“系统必须做什么”这个问。通常用数据流图、数据字典和简明算法描述表示系统的逻辑模型。o需求分析阶段的任务不是具体的解决客户的问
8、题o防止系统的设计与用户的实际需求不相符的后果。第18页,此课件共73页哦软件生命周期各阶段的主要任务o概要设计概要设计:确定系统设计方案,软件的体系结构。确定软件由哪些模块组成以及这些模块之间的相互关系。第19页,此课件共73页哦软件生命周期各阶段的主要任务o详细设计:描述应该如何具体地实现系统。详细设计每个模块,确定实现模块所需要的算法和数据结构。第20页,此课件共73页哦软件生命周期各阶段的主要任务o软件实现阶段软件实现阶段:进行程序设计(编码)和模:进行程序设计(编码)和模块测试。块测试。第21页,此课件共73页哦软件生命周期各阶段的主要任务o综合测试阶段综合测试阶段:测试的目的是以最
9、小的代价(耗费最少时间和最少工作量)发现尽可能多的不同类型的错误。通过各种类型的测试,通过各种类型的测试,查出软件设计中的错误并改正,确保软件质查出软件设计中的错误并改正,确保软件质量;还要在用户的参与下进行验收,才可交量;还要在用户的参与下进行验收,才可交付使用。付使用。第22页,此课件共73页哦软件生命周期各阶段的主要任务o大量的资料统计表明,软件开发组织将30%40%的工作量花在测试上。而那些高可靠性、高安全性软件的测试所花的时间更是其它开发步骤总和的3到5倍。第23页,此课件共73页哦软件生命周期各阶段的主要任务o真正实施测试之前要制定测试方案,测试方案包括预定要测试的功能,应该输入的
10、测试数据和预期的结果。第24页,此课件共73页哦软件生命周期各阶段的主要任务o测试和调试常常被说成是一个回事,实际上是测试阶段的不同任务。调试即排错,是在已经知道程序有问题时要做的事情。测试则是在认为程序能工作的情况下,为发现问题而进行的一整套确定的系统化的实验。第25页,此课件共73页哦软件生命周期各阶段的主要任务o软件运行、维护软件运行、维护:程序的运行与维护是整个程序开发流程的最后一步。编写程序的目的就是为了应用,在程序运行的早期,用户可能会发现在测试阶段没有发现的错误,需要修改。而随着时间的推移,原有程序可能已满足不了需要,这是就需要对程序进行修改甚至升级。每次维护的要求及修改步骤都应
11、每次维护的要求及修改步骤都应详细准确地记录下来,作为文档保存。详细准确地记录下来,作为文档保存。第26页,此课件共73页哦常用设计工具o介绍三种常用的图形方式的设计工具。第27页,此课件共73页哦层次图层次图o用来描述软件的层次结构,图中的一个矩形框代表一个模块,方框之间的连线表示调用关系。层次图很适合在自顶向下设计软件的过程中使用。第28页,此课件共73页哦第29页,此课件共73页哦程序流程图程序流程图o是历史最悠久使用最广泛的描述软件设计的方法。它的主要优点是对控制流程的描述很直观,便于初学者掌握。第30页,此课件共73页哦第31页,此课件共73页哦盒图盒图o是一种很好的支持结构化程序设计
12、思想的图形工具,也称为N-S图。第32页,此课件共73页哦顺序结构顺序结构块块1块块2块块3块块4条件条件T F块块1块块2选择结构选择结构Case I=1,2,3T块块1块块2多分支选择结构多分支选择结构F块块3块块当条件成立时当条件成立时当型循环当型循环块块直到条件成立时直到条件成立时直到型循环直到型循环第33页,此课件共73页哦伪代码o图形工具表示设计比较直观,但画起来比较费劲,所以描述设计还可以使用伪代码这个常用的语言工具。o伪代码是一种“混合”语言,它使用一种语言通常是某种自然语言的词汇,同时却使用某种结构化程序设计的语法。第34页,此课件共73页哦伪代码if 九点以前 do私人事务
13、;else 9点到18点 工作else 下班;第35页,此课件共73页哦编码应注意的问题第36页,此课件共73页哦全局变量o 全局变量的作用增加了函数间数据联系的渠道。但是全局变量使函数的通用性降低了,因为函数在执行时要依赖于其所在的全局变量。如果将一个函数移到另一个文件中,还要将有关的全局变量以及其值一起移过去。但若该全局变量与其它文件的全局变量同名时,就会出现问题,降低了程序的可靠性和通用性。第37页,此课件共73页哦全局变量o另外使用全局变量过多,会降低程序的清晰性,人们往往难以清楚地判断出每个瞬间每个全局变量的值。在各个函数执行时都可能改变全局变量的值,程序容易出错。o对于大型程序,模
14、块多,常常由不同的人来完成不同的模块,如果全局变量随意使用,更容易出现问题,造成程序的混乱。因此,更应该限制使用全局变量。第38页,此课件共73页哦变量的名字o名字应具有足够的说明性,以便使读者能够记住它们是干什么的。给每个全局变量声明附一个简短的注释也是非常有帮助的。第39页,此课件共73页哦变量的名字o按常规方式使用的局部变量可采用极短的名字,如用i、j作为循环变量,p、q作为指针,s、t表示字符串等。第40页,此课件共73页哦变量的名字o现实中存在许多命名约定或者本地习惯。常见的如:指针采用以ptr结尾的变量名;全局变量用大写开头或者g_开头做变量名;常量用完全由大写拼写的变量名等。命名
15、约定能使代码更易理解。第41页,此课件共73页哦表达式和语句o同样,我们也应该以尽可能一目了然的形式写好表达式和语句。第42页,此课件共73页哦采用缩进程序结构,是使程序呈现出结构清晰的最省力的方法。比较:n=0;for(n+;n100;fieldn+=0);或for(n+;n100;fieldn+=0);for(n=1;n 100;n+)fieldn=0;第43页,此课件共73页哦使用表达式的自然形式使用表达式的自然形式。否定运算的条件表达式比较难理解,比较:if(!(block_id=unblocks)if(block_id=actblks)|(block_idunblocks)第44页,
16、此课件共73页哦分解复杂的表达式分解复杂的表达式。C有很丰富的表达式语法结构和很丰富的运算符,因此应该避免将一大堆东西塞进一个结构中。比较:*xp+=(x=2*k (n-m)?ck+1:dk-);if(2*k=A&(c)=Z)o但如果它在下面的上下文中使用:while(isupper(c=getchar()o那么,每当遇到一个大于等于A的字符,程序就会丢掉它,而下一个字符将被读入并去与Z做比较。因此,上面的实现是错误。第47页,此课件共73页哦宏宏o除了这个问题外,由于宏是通过文本替换方式实现的,如果忘记给宏的体和参数加上括号,将产生错误。如:#define square(x)(x)*(x)1
17、/square(x)o正确的宏应该是:#define square(x)(x)*(x)o所以建议:除了定义符号常量外,最好避免使用宏。第48页,此课件共73页哦注释o注释是帮助读者阅读程序的一种手段,它们澄清情况,不是添乱。o注释要注意:o对函数要进行注释:包括部分参数。o对一些需要看大量代码的才能够确定这部分代码的功能,需要进行注释o不要琐谈明显的东西。o注释不要与代码矛盾。如果注释的长度超过代码本身,可能就说明这个代码应该修改了。第49页,此课件共73页哦C语言中常见的错误o忽略了“=”与“=”的区别。oif(a=3)then o但C语言中,“=”是赋值运算符,“=”是关系运算符。如:oi
18、f(a=3)a=b;第50页,此课件共73页哦C语言中常见的错误o忘记加分号。o分号是C语句中不可缺少的一部分,语句末尾必须有分号。oa=1ob=2oif(a%3=0);oI+;第51页,此课件共73页哦C语言中常见的错误o输入变量时忘记加地址运算符“&”。oint a,b;oscanf(%d%d,a,b);o这是不合法的。Scanf函数的作用是:按照a、b在内存的地址将a、b的值存进去。“&a”指a在内存中的地址。第52页,此课件共73页哦C语言中常见的错误oswitch语句中漏写break语句。o例如:根据考试成绩的等级打印出百分制数段。oswitch(grade)o case A:pri
19、ntf(85100n;ocase B:printf(7084n;ocase C:printf(6069n;ocase D:printf(<60n;odefault:printf(errorn;)第53页,此课件共73页哦C语言中常见的错误o定义数组时误用变量。oint n;oscanf(%d,&n);oint an;第54页,此课件共73页哦C语言中常见的错误o在定义数组时,将定义的“元素个数”误认为是可使的最大下标值。omain()ostatic int a10=1,2,3,4,5,6,7,8,9,10;oprintf(%d,a10);o 第55页,此课件共73页哦常见的内存错误未初始
20、化的指针 void f2(int datum)int*p2;*p2=datum;.第56页,此课件共73页哦常见的内存错误错误的内存释放 void f3()char*p;p=malloc(10);.free(p);.free(p);第57页,此课件共73页哦常见的内存错误 void f8()struct x*xp;xp=(struct x*)malloc(sizeof(struct x);.free(xp);.return xp.第58页,此课件共73页哦常见的内存错误试图修改常量intmain(intargc,char*argv)char*p=abcd;*p=1;return 0;第59页,
21、此课件共73页哦常见的内存错误误解传值与传引用#include#include void get_str(char*p)p=malloc(sizeof(abcd);strcpy(p,abcd);return;int main(int argc,char*argv)char*p=NULL;get_str(p);printf(p=%pn,p);return 0;第60页,此课件共73页哦常见的内存错误char*get_str(void)char*str=abcd;returnstr;intmain(intargc,char*argv)char*p=get_str();printf(%sn,p);r
22、eturn 0;第61页,此课件共73页哦测试题o1、头文件中的 ifndef/define/endif 干什么用?o2、#include 和#include “filename.h”有什么区别?o3、请写出 float x 与“零值”比较的 if 语句。o4、请写出 char *p 与“零值”比较的 if 语句:第62页,此课件共73页哦测试题请简述以下两个for循环的优缺点 for(i=0;iN;i+)if(condition)DoSomething();else DoOtherthing();if(condition)for(i=0;iN;i+)DoSomething();else fo
23、r(i=0;iN;i+)DoOtherthing();第63页,此课件共73页哦测试题 void GetMemory2(char*p,int num)*p=(char*)malloc(num);void Test(void)char*str=NULL;GetMemory(&str,100);strcpy(str,hello);printf(str);第64页,此课件共73页哦测试题void Test(void)char*str=(char*)malloc(100);strcpy(str,“hello”);free(str);if(str!=NULL)strcpy(str,“world”);pr
24、intf(str);第65页,此课件共73页哦测试题char str=“Hello”;char *p=str;int n=10;请计算sizeof(str)=sizeof(p)=sizeof(n)=第66页,此课件共73页哦测试题void Func(char str100)请计算 sizeof(str)=void*p=malloc(100);请计算sizeof(p)=第67页,此课件共73页哦测试题void change(int*data1,int*data2)int*temp;temp=data1;data1=data2;data2=temp;printf(change:data1=%d,d
25、ata2=%dn,*data1,*data2);return;int main(void)int x=25,y=87;change(&x,&y);printf(main:x=%d,y=%dn,x,y);/x,y未得到交换第68页,此课件共73页哦实例:从大到小o例:要求用筛选法求100 以内的素数(筛选法为:从2到100中去掉2,3,9,10的倍数,剩下的就是100以内的素数)。第69页,此课件共73页哦步骤一:建立2到100的数组A,其中Ai=i;_1建立2到10的素数表B,其中存放2到10以内的素数;_ _2 Ai=i 是B 中的任一数的倍数,则剔除Ai;_ _3输出A 中所没有被剔除的数
26、;_4第70页,此课件共73页哦步骤二:前述框架中每一个加工语句都可进一步细化成一个循环语句。/*建立2到100的数组A,其中Ai=i*/_1 for(i=2;i =100;i+)Ai=i;/*建立2到10的素数表B,其中存放2到10以内的素数*/_2 B1=2;B2=3;B3=5;B4=7;/*若Ai=i 是B 中的任一数的倍数,则剔除Ai*/_3 第71页,此课件共73页哦步骤二:前述框架中每一个加工语句都可进一步细化成一个循环语句。for(j=1;j =4;j+)检查A 所有的数能否被Bj整除,并将能被整除的数从A 中剔除;_3.1/*输出A 中所有没有被剔除的数*/_4 for(i=2;i =100;i+)若Ai没有被剔除,则输出之;_4.1第72页,此课件共73页哦步骤三:将3.1,4.1进一步细化形成程序。第73页,此课件共73页哦