




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
结构化程序设计综合训练第一页,共七十三页,2022年,8月28日一、本课程的教学目的结构化程序设计和面向对象程序设计是程序设计的两种典型的思想和方法。目前高校开设的程序设计课程也基本据此划分为两大系列。本课程以C语言为工具,通过布置一些程序,进行结构化程序化设计的综合训练,该课程是计算机专业的一门实验课,通过该课程的学习,达到以下目的:第二页,共七十三页,2022年,8月28日课程目的1.在软件工程生命周期开发方法的指导下,深入理解和真正掌握自顶向下、逐步求精的结构化程序设计方法;2.掌握良好的程序设计编码风格;3.学习常用的算法设计的技术;4.进一步提高学生的程序调试能力;5.提高学生的程序编程兴趣。第三页,共七十三页,2022年,8月28日二、教材:本课程是实践性课程,主要以实验为主。第四页,共七十三页,2022年,8月28日三、课时的安排序号内容讲授(学时)实验1结构化程序方法的开发流程1.52管理系统的开发0.53.53游戏程序的开发0.53.54筛选的算法设计技术0.53.55归纳的算法设计技术0.53.56分治的算法设计技术0.53.57最优的算法设计技术0.53.58综合程序开发0.549总结2合计725第五页,共七十三页,2022年,8月28日四、其它说明从三个方面考核每个实验的成绩:功能完成情况、实验报告以及程序风格、界面设计以及操作方便性。第六页,共七十三页,2022年,8月28日结构化开发方法在60年代计算机发展初期,程序设计是少数聪明人干的事。他们的智力与技能超群,编写的程序既能控制弱智的计算机,又能让别人看不懂、不会用。那个时期编程就跟捏泥巴一样随心所欲,人们就在这种美滋滋的感觉下热情地编程,结果产生了一堆问题:程序质量低下,错误频出,进度延误,费用剧增……。这些问题导致了“软件危机”。第七页,共七十三页,2022年,8月28日结构化开发方法在1968年,一群程序员、计算机科学家与工业界人士聚集一起共商对策。通过借鉴传统工业的成功做法,他们主张通过工程化的方法开发软件来解决软件危机,并冠以“软件工程”这一术语。软件工程主要讲述软件开发的道理,基本上是软件实践者的成功经验和失败教训的总结。第八页,共七十三页,2022年,8月28日结构化开发方法结构化开发方法是一种设计程序的技术,采用自顶向下逐步求精的设计方法和单入口单出口的顺序、选择和循环三种基本控制结构。它提出的原则可归纳为32字:“自顶向下,逐步细化;清晰第一,效率第二;书写规范,缩进格式;基本结构,组合而成。”第九页,共七十三页,2022年,8月28日1、结构化开发方法软件有自己的“生命周期”。一个软件从定义、开发、使用和维护,直到最终被废弃,要经历一个漫长的时期,通常把软件经历的这个漫长的时期成为生命周期。第十页,共七十三页,2022年,8月28日1、结构化开发方法软件工程的开发方法就是从时间角度对复杂的软件问题进行分解,把软件漫长的生命周期依次分为若干个阶段,每个阶段有独立的任务,然后逐步完成每个阶段的任务。前一个阶段任务的完成是进行后一个阶段工作的前提和基础,而后一个阶段任务的完成通常是前一个阶段提出的解法更进一步具体化,增加了更多的实现细节。第十一页,共七十三页,2022年,8月28日1、结构化开发方法在每一个阶段结束之前都必须进行正式严格的技术审查和管理复审,若审查通不过,则必须进行必要的返工,返工后还要进行审查。审查的一个主要标志就是每个阶段都应该提交与所开发的软件完全一致的高质量的文档资料,文档不仅是前后阶段的通信工具,而且是软件交付使用后进行维护的依据。第十二页,共七十三页,2022年,8月28日1、结构化开发方法采用结构化的开发方法,使软件开发的全过程以一种有条不紊的方式进行,保证了软件的质量,特别是提高了软件的可维护性。第十三页,共七十三页,2022年,8月28日2、结构化方法的开发流程在结构化开发中,编码只是软件开发的一个很小的阶段,而且是处在实现阶段。结构化的开发流程可以用如图的瀑布模型来模拟:第十四页,共七十三页,2022年,8月28日瀑布模型第十五页,共七十三页,2022年,8月28日软件生命周期各阶段的主要任务问题定义:
“要解决的问题是什么”。问题定义阶段是整个过程中占用时间最少的阶段。第十六页,共七十三页,2022年,8月28日软件生命周期各阶段的主要任务可行性研究:从经济、技术、法律等方面分析确定系统是否值得开发,及时建议停止项目开发,避免人力、物力、时间的浪费,并进行方案选择。可行性研究的目的不是解决问题,而是确定问题是否值得去解决。可行性研究包括四个方面的研究:经济可行性技术可行性法律可行性方案的选择第十七页,共七十三页,2022年,8月28日软件生命周期各阶段的主要任务需求分析:准确回答“系统必须做什么”这个问。通常用数据流图、数据字典和简明算法描述表示系统的逻辑模型。需求分析阶段的任务不是具体的解决客户的问题防止系统的设计与用户的实际需求不相符的后果。第十八页,共七十三页,2022年,8月28日软件生命周期各阶段的主要任务概要设计:确定系统设计方案,软件的体系结构。确定软件由哪些模块组成以及这些模块之间的相互关系。第十九页,共七十三页,2022年,8月28日软件生命周期各阶段的主要任务详细设计:描述应该如何具体地实现系统。详细设计每个模块,确定实现模块所需要的算法和数据结构。第二十页,共七十三页,2022年,8月28日软件生命周期各阶段的主要任务软件实现阶段:进行程序设计(编码)和模块测试。第二十一页,共七十三页,2022年,8月28日软件生命周期各阶段的主要任务综合测试阶段:测试的目的是以最小的代价(耗费最少时间和最少工作量)发现尽可能多的不同类型的错误。通过各种类型的测试,查出软件设计中的错误并改正,确保软件质量;还要在用户的参与下进行验收,才可交付使用。第二十二页,共七十三页,2022年,8月28日软件生命周期各阶段的主要任务大量的资料统计表明,软件开发组织将30%~40%的工作量花在测试上。而那些高可靠性、高安全性软件的测试所花的时间更是其它开发步骤总和的3到5倍。第二十三页,共七十三页,2022年,8月28日软件生命周期各阶段的主要任务真正实施测试之前要制定测试方案,测试方案包括预定要测试的功能,应该输入的测试数据和预期的结果。第二十四页,共七十三页,2022年,8月28日软件生命周期各阶段的主要任务测试和调试常常被说成是一个回事,实际上是测试阶段的不同任务。调试即排错,是在已经知道程序有问题时要做的事情。测试则是在认为程序能工作的情况下,为发现问题而进行的一整套确定的系统化的实验。第二十五页,共七十三页,2022年,8月28日软件生命周期各阶段的主要任务软件运行、维护:程序的运行与维护是整个程序开发流程的最后一步。编写程序的目的就是为了应用,在程序运行的早期,用户可能会发现在测试阶段没有发现的错误,需要修改。而随着时间的推移,原有程序可能已满足不了需要,这是就需要对程序进行修改甚至升级。每次维护的要求及修改步骤都应详细准确地记录下来,作为文档保存。第二十六页,共七十三页,2022年,8月28日常用设计工具介绍三种常用的图形方式的设计工具。第二十七页,共七十三页,2022年,8月28日层次图用来描述软件的层次结构,图中的一个矩形框代表一个模块,方框之间的连线表示调用关系。层次图很适合在自顶向下设计软件的过程中使用。第二十八页,共七十三页,2022年,8月28日第二十九页,共七十三页,2022年,8月28日程序流程图是历史最悠久使用最广泛的描述软件设计的方法。它的主要优点是对控制流程的描述很直观,便于初学者掌握。第三十页,共七十三页,2022年,8月28日第三十一页,共七十三页,2022年,8月28日盒图是一种很好的支持结构化程序设计思想的图形工具,也称为N-S图。第三十二页,共七十三页,2022年,8月28日顺序结构块1块2块3块4条件TF块1块2选择结构CaseI=1,2,3T块1块2多分支选择结构F块3块当条件成立时当型循环块直到条件成立时直到型循环第三十三页,共七十三页,2022年,8月28日伪代码图形工具表示设计比较直观,但画起来比较费劲,所以描述设计还可以使用伪代码这个常用的语言工具。伪代码是一种“混合”语言,它使用一种语言——通常是某种自然语言的词汇,同时却使用某种结构化程序设计的语法。第三十四页,共七十三页,2022年,8月28日伪代码if九点以前do私人事务;else9点到18点工作else下班;第三十五页,共七十三页,2022年,8月28日编码应注意的问题第三十六页,共七十三页,2022年,8月28日全局变量全局变量的作用增加了函数间数据联系的渠道。但是全局变量使函数的通用性降低了,因为函数在执行时要依赖于其所在的全局变量。如果将一个函数移到另一个文件中,还要将有关的全局变量以及其值一起移过去。但若该全局变量与其它文件的全局变量同名时,就会出现问题,降低了程序的可靠性和通用性。第三十七页,共七十三页,2022年,8月28日全局变量另外使用全局变量过多,会降低程序的清晰性,人们往往难以清楚地判断出每个瞬间每个全局变量的值。在各个函数执行时都可能改变全局变量的值,程序容易出错。对于大型程序,模块多,常常由不同的人来完成不同的模块,如果全局变量随意使用,更容易出现问题,造成程序的混乱。因此,更应该限制使用全局变量。第三十八页,共七十三页,2022年,8月28日变量的名字名字应具有足够的说明性,以便使读者能够记住它们是干什么的。给每个全局变量声明附一个简短的注释也是非常有帮助的。第三十九页,共七十三页,2022年,8月28日变量的名字按常规方式使用的局部变量可采用极短的名字,如用i、j作为循环变量,p、q作为指针,s、t表示字符串等。第四十页,共七十三页,2022年,8月28日变量的名字现实中存在许多命名约定或者本地习惯。常见的如:指针采用以ptr结尾的变量名;全局变量用大写开头或者g_开头做变量名;常量用完全由大写拼写的变量名等。命名约定能使代码更易理解。第四十一页,共七十三页,2022年,8月28日表达式和语句同样,我们也应该以尽可能一目了然的形式写好表达式和语句。第四十二页,共七十三页,2022年,8月28日采用缩进程序结构,是使程序呈现出结构清晰的最省力的方法。比较:n=0;for(n++;n<100;field[n++]=’\0’);或for(n++;n<100;field[n++]=’\0’);for(n=1;n<100;n++)field[n]=’\0’;第四十三页,共七十三页,2022年,8月28日使用表达式的自然形式。否定运算的条件表达式比较难理解,比较:if(!(block_id<actblks)||!(block_id>=unblocks))…
if((block_id>=actblks)||(block_id<unblocks))…
第四十四页,共七十三页,2022年,8月28日分解复杂的表达式。C有很丰富的表达式语法结构和很丰富的运算符,因此应该避免将一大堆东西塞进一个结构中。比较:*xp+=(x=2*k<(n-m)?c[k+1]:d[k--]));if(2*k<(n-m))x=c[k+1];elsex=d[k--];*xp+=x;第四十五页,共七十三页,2022年,8月28日当心副作用。像++这一类运算符具有副作用,它们除了返回一个值外,还将隐含地改变变量的值。这类表达式有时用起来很方便,但有时也会成为问题,因为变量的取值操作和更新操作可能不是同时发生。第四十六页,共七十三页,2022年,8月28日宏#defineisupper(c)((c)>=’A’&&(c)<=’Z’)但如果它在下面的上下文中使用:while(isupper(c=getchar()))…那么,每当遇到一个大于等于A的字符,程序就会丢掉它,而下一个字符将被读入并去与Z做比较。因此,上面的实现是错误。第四十七页,共七十三页,2022年,8月28日宏除了这个问题外,由于宏是通过文本替换方式实现的,如果忘记给宏的体和参数加上括号,将产生错误。如:#definesquare(x)(x)*(x)…1/square(x)正确的宏应该是:#definesquare(x)((x)*(x))所以建议:除了定义符号常量外,最好避免使用宏。第四十八页,共七十三页,2022年,8月28日注释注释是帮助读者阅读程序的一种手段,它们澄清情况,不是添乱。注释要注意:对函数要进行注释:包括部分参数。对一些需要看大量代码的才能够确定这部分代码的功能,需要进行注释不要琐谈明显的东西。注释不要与代码矛盾。如果注释的长度超过代码本身,可能就说明这个代码应该修改了。第四十九页,共七十三页,2022年,8月28日C语言中常见的错误忽略了“=”与“==”的区别。if(a=3)then…但C语言中,“=”是赋值运算符,“==”是关系运算符。如:if(a==3)a=b;第五十页,共七十三页,2022年,8月28日C语言中常见的错误忘记加分号。分号是C语句中不可缺少的一部分,语句末尾必须有分号。a=1b=2if(a%3==0);I++;第五十一页,共七十三页,2022年,8月28日C语言中常见的错误输入变量时忘记加地址运算符“&”。inta,b;scanf("%d%d",a,b);这是不合法的。Scanf函数的作用是:按照a、b在内存的地址将a、b的值存进去。“&a”指a在内存中的地址。第五十二页,共七十三页,2022年,8月28日C语言中常见的错误switch语句中漏写break语句。例如:根据考试成绩的等级打印出百分制数段。switch(grade){case'A':printf("85~100\n";case'B':printf("70~84\n";case'C':printf("60~69\n";case'D':printf("<60\n";default:printf("error\n";)}第五十三页,共七十三页,2022年,8月28日C语言中常见的错误定义数组时误用变量。intn;scanf("%d",&n);inta[n];第五十四页,共七十三页,2022年,8月28日C语言中常见的错误在定义数组时,将定义的“元素个数”误认为是可使的最大下标值。main(){staticinta[10]={1,2,3,4,5,6,7,8,9,10};printf("%d",a[10]);}第五十五页,共七十三页,2022年,8月28日常见的内存错误未初始化的指针voidf2(intdatum){int*p2;
*p2=datum;...}第五十六页,共七十三页,2022年,8月28日常见的内存错误错误的内存释放voidf3(){char*p;p=malloc(10);...free(p);...free(p);}第五十七页,共七十三页,2022年,8月28日常见的内存错误voidf8(){structx*xp;xp=(structx*)malloc(sizeof(structx));..free(xp);...returnxp.}第五十八页,共七十三页,2022年,8月28日常见的内存错误试图修改常量intmain(intargc,char*argv[]){char*p="abcd";
*p='1';
return0;}第五十九页,共七十三页,2022年,8月28日常见的内存错误误解传值与传引用#include<stdlib.h>#include<stdio.h>
voidget_str(char*p){p=malloc(sizeof("abcd"));strcpy(p,"abcd");
return;}
intmain(intargc,char*argv[]){char*p=NULL;get_str(p);printf("p=%p\n",p);return0;}第六十页,共七十三页,2022年,8月28日常见的内存错误char*get_str(void){char*str={"abcd"};
returnstr;}intmain(intargc,char*argv[]){char*p=get_str();printf("%s\n",p);
return0;}第六十一页,共七十三页,2022年,8月28日测试题1、头文件中的ifndef/define/endif干什么用?2、#include<filename.h>和#include“filename.h”有什么区别?3、请写出floatx与“零值”比较的if语句。4、
请写出char*p与“零值”比较的if语句:第六十二页,共七十三页,2022年,8月28日测试题请简述以下两个for循环的优缺点for(i=0;i<N;i++){if(condition)DoSomething();elseDoOtherthing();}if(condition){for(i=0;i<N;i++)DoSomething();}else{for(i=0;i<N;i++)DoOtherthing();}第六十三页,共七十三页,2022年,8月28日测试题voidGetMemory2(char**p,intnum){*p=(char*)malloc(num);}voidTest(void){char*str=NULL;GetMemory(&str,100);strcpy(str,"hello"); printf(str); }第六十四页,共七十三页,2022年,8月28日测试题voidTest(void){char*str=(char*)malloc(100); strcpy(str,“hello”); free(str); if(str!=NULL) { strcpy(str,“world”); printf(str);}}第六十五页,共七十三页,2022年,8月28日测试题charstr[]=“Hello”; char*p=str;intn=10;请计算sizeof(str)=
sizeof(p)=
sizeof(n)=第六十六页,共七十三页,2022年,8月28日测试题voidFunc(charstr[100]){请计算sizeof(str)=}void*p=malloc(100);请计算sizeof(p)=第六十七页,共七十三页,2022年,8月28日测试题voidchange(int*data1,int*data2){int*temp;temp=data1;data1=data2;data2=temp;printf("change:data1=%d,data2=%d\n",*data1,*data2);return;}intmain(void){intx=25,y=87;change(&x,&y);p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 实验学校课题申报书
- 课题幼儿申报书怎么写
- 声乐表演创新课题申报书
- 化学品研发项目合同范例
- 课题申报书研究价值部分
- 农村荒山转租合同范本
- 农田承包流转合同范本
- 公司文员聘用合同范本
- 人造草坪回收合同范本
- 医学脊柱外科课题申报书
- GB/T 39935-2021塑料制品薄膜和片材抗粘连性的测定
- GB 16899-2011自动扶梯和自动人行道的制造与安装安全规范
- 高中信息技术《人工智能》优质教学课件
- 2023年南平建阳市工会系统招聘考试笔试题库及答案解析
- 2022标准方法验证报告(安检)
- 学术论文写作与规范课件
- 口腔诊所药品管理制度
- 中医子午流注十二时辰养生法
- 养老院风险管控手册
- 标准田字格带拼音模板空白A4直接打印
- 小学语文 部编版 六年级下册 第二单元 习作《写作品梗概》
评论
0/150
提交评论