2013-5面向对象课程设计实习指导书介绍_第1页
2013-5面向对象课程设计实习指导书介绍_第2页
2013-5面向对象课程设计实习指导书介绍_第3页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、中国地质犬学(武汉)信息工程学院信息工程系面向对象课程设计实习指导书(下)使用班级: 指导老师:1. 课程设计目的1、使学生对所学面向对象程序设计理论知识进行一次综合性复习;2、培养学生对实际问题的分析能力;3、培养学生独立编程、开发软件的动手能力;4、培养学生规范的编程习惯;5、培养学生撰写课程设计报告的能力。6、培养学生熟练掌握 VC+调试技能;7、培养学生规范的编程习惯;& 培养学生团队协作精神;9、培养学生撰写课程设计报告的能力;10、掌握MFC开发(主要包括视图、对话框等)11、熟练的文件操作能力12、接触一定的 Windows API2. 课程设计要求为了能更好地达到课程设

2、计的目的,要求学生:1、每次上机前充分做好准备工作,查阅资料,预习相关内容,对课程设计内容进行方案的预 设计,编制出源程序代码。“C+3、 程序代码的编制应按照C+编码规范的要求进行,具体可参考指导书中【附件二】 编码规范”。程序的界面全部采用 MFC的函数实现。4、按题目要求独立完成课程设计,不旷课、不迟到、不早退、遵守机房规定、爱护机房设备。5、实习时间:建议 32学时6、实习成果提交时间: 建议实习结束后,2周内提交内容:纸质报告和光盘(以班级为单位刻盘,盘内含每人代码及电子文档报告)要求:课程设计结束后,按照指导书中【附件一】的要求撰写出课程设计报告(要求用A4纸打印,报告格式的电子文

3、档由指导教师提供)。3. 课程设计题目MFC的程序,出于精益求精的考虑,可以做的非常复杂。如果不对范围进行较清晰的界定,可 能会远远超出课程设计的要求范围,因此本次课程设计采取逐步推进的方法来进行,以便学习曲 线尽量平滑,降低 MFC和C+啲学习难度,增强学生的成就感,提升学生的学习兴趣。3.1橡皮筋画线程序,要求:3.1.1 基本要求利用鼠标在视图上绘制线,能够设置线的颜色和宽度;能够用鼠标拾取绘制的某条线,被选中的线能够高亮显示,并且弹出对话框,输入线的 属性保存起来;高阶要求能够将绘制的线数据保存在Lin e.dat文本文件中;打开线数据文件Lin e.dat ,可以显示出文件里面的线图

4、形。可选功能文字能够在视图任意地方点击鼠标后输入。提示:可以使用STL中的容器来管理数据。3.2学生学籍成绩管理系统学生的信息包括:姓名、学号、性别、班级、院系;学生的成绩信息包括英语、数学、程序 设计及体育成绩等各门课的成绩;定义如下类,并建立一个文本文件Stude nt.dat ,用于存储学生、课程与成绩的相关信息。文件格式自己定义。学生类CStudent (姓名、学号、性别、班级、院系);课程类CLessen(课程名称、课程开设时间 );成绩类CGrade(学号、课程名称、成绩)要求实现如下功能:在对话框上能够添加、删除、编辑和查询课程信息;在对话框上能够添加、删除、编辑和查询学生信息学

5、生信息;在对话框上能够增加、删除、编辑和查询学生的选课信息; 在对话框上能够录入和编辑学生某门课的考试成绩;在对话框上能够按照学生姓名查询学生的选课信息和选课成绩,并统计出其总成绩、平 均成绩,计算出该学生的成绩的标准差;显示全班的学生成绩排名。 统计出各班的平均成绩,并进行排名。_ 1 n平均分:X =_二xin i#| n标准差:S = J2无(Xi -X)2,n y3.3编辑器做一个单文档的程序,能够进行读取两个文本文件的内容,并将其内容用图形的方式显示出来。 两个文本文件内容:在Point1.txt文件中,记录了点的坐标信息,如下如所示:WOT12 3 4 5 6TDOTYPEBZXY

6、376875210SCQ. WJBDS83271. 79779592. 438376905526SCQ,WJBDS/J06401883267, 91779592. 43853475420SCQ.QTKJI/J064214/DP183664.88879284. 6026520319JGQ,JFJ/#01398/YSD0182846.48779723.419534782S5SCQ.QTR JI/J064214/DP00383616. 8137923L 92853478685SCQ.QTRJ1/T064214/DP00583690. 35979243. 600图3-1 point文件内谷第一列是点的

7、行号,没有什么特别意义,就是累加的顺序;第二列是一个点的ID,具有唯一性。即没有ID相同的两个点。第三列是点的类型, 不同的类型表示不同的点。比如10可能是一个小黑点,26是一个空心圆表示的点,20是一个小三角形等。第四列是点的名字,是一个字符串。最后两列是点的坐标,注意是浮点型的笛卡尔坐标(方向是上、右),并非vc中的缺省的坐标系(方向是下、右)。Lin 1.txt文件中,记录了线的连接关系(没有曲线,只有折线段),如下图所示:UritLtxt -记事本文件旧铜向曜式(5®W(V)科帥(H)IDOFNTPNTTALPNT1 3664433376633137690552 158227

8、25652033 7806624182075347864 780663418192534784图3-2 lin文件中的内容第一列是线的序号,没有实际意义,一行表示一条线。第二列是线的ID,有唯一性,即每个线的ID不同第三列和第四列是这个线的两个端点的ID( ID对应point.txt中的ID0)3.3.1 基本要求:用程序读取两个文本文件,将数据读入内存,用相应的数据结构保存到内存。 将所有数据都在一个视图显示出来。建议:1. 注意点的坐标为浮点类型,需要进行坐标的变换2. 这一阶段,不用考虑图形参数,不用考虑图形的操作,只需要显示出来即可3. 建议自己做两个简单的文件,手工录入几条整数型的坐

9、标,用缺省坐标系先实现,然后再考虑本题浮点和笛卡尔坐标的问题4. 本题主要考察视图显示、坐标、更新窗口知识点高阶要求:/图形参数可以选择后变化(包括点的形状、大小;线的颜色,粗细、线型等)。支持视图的放大、缩小、复位(即一屏显示所有的数据)等可选要求可以鼠标选中点,对点进行移动,移动后,点上连着的线要能够联动。移动点的过程中(即还没有确定最终移动的位置的时候),要有虚线显示点和线移动的效果,移动到最终位置的时候,虚线消失,老的实线根据新坐标重绘。3.4科研文献管理系统对科研文献的管理有很多专业工具,大部分需要上网,和word、PDF等进行联动使用。但是对于个人用户本地积累的论文、书籍、学习笔记

10、等进行整体管理的软件比较少。本课题考虑研制一个单机版本(不用提供互联网方面的注册、登陆之类的功能)的文献管理系统,对科研文献、书籍、学习笔记等进行有效管理。假设管理系统安装在 c盘下,目录为c:NoteManager 。3.4.1 基本功能将物理上在一个文件夹中的文件,用多个逻辑文件夹显示。文献管理有一个重要的功能就是对论文进行分类管理。Win dows文件夹的管理是物理的,分类起来有时候很纠结。所有人都有感受:老爸来学校和我还有寝室兄弟们的合影,应该放在“家庭” 文件夹还是“学校”文件夹呢?或者神经网络解决工作调度问题方面的文章,是放在“智能计算” 文件夹还是“应用论文”的文件夹呢?所以科研

11、文献管理系统考虑将所有的pdf论文均放在一个文件夹,假设为 c:NoteMa nager'paper 。在c:NoteManager 存放一个files.txt文件,记录每个 pdf的属性,类似如下数据:文件名 分类1分类2 分类3作者1作者2作者3年份 页码1.pdf智能计算 综合制图GPS王大 刘二 张三2013 100-103出版社 地球科学2.pdfO O O O O O O O O O O O O O OOOOOOOOOOOOO O O O O O O O O O O O O O O O O O O O O O O O在文献管理系统中,制作一个导航树,能够根据每个 夹显示该文

12、件,如下图:pdf论文的自定义属性,用不同的文件图3-3文献管理系统的文件逻辑目录显示效果中总是会显示 1.pdf ,如上图所示,无论选择gps、智能计算、还是综合制图,右侧的listctrl而实际上,1.pdf物理上只有一份,存放在 c:NoteManager'paper 。另外,还需要一个 con te nt.txt 文件,保存目前的目录。示意效果如下:无-记事本GPSGPS国产GPS欧洲GPS美国GPS其他(日本等)看能计負智能计算遗传算法智能计算人工神经网络智能计算元胞自动机 综合制图综合制图基于圆I综合制图基4Agen t此阶段目标,需要组织论文类对其进行管理,并对其进行分类

13、数据组织; 此阶段目标,需要组织目录类对其进行管理,并对其进行分类数据组织; 需要进行文件操作;需要制作导航树和列表框;建议:1. 采用一个dialog对话框来制作2. 文件、目录等数据可以手工录入准备好,不必做功能录入相关数据。即本阶段要求仅仅能够展示就可以了。3. 这部分考察的主要是 MFC界面编程能力,因此主要精力放在界面设计和开发上面。台匕、冃匕高阶要求1能够增加pdf文件,并选择文件的分类。能够删除文件(从某个目录删除或者整体删除)够修改文件从属的分类。能够修改分类的结构,包括新增分类(含子分类)、删除分类、修改分类名称。界面右边的listctrl,要求显示论文的名称、作者、出版社等

14、信息建议:1. 本部分考察的内容既包括 C+类的设计功底,也考察C+程序和界面如何结合起来的能力。2. 在设计功能的时候,需要详细思考类的设计问题。另外,还需要考虑程序的逻辑的严谨性。比如在删除某个分类的时候,该分类的论文怎么处理?高阶要求2为文件编辑其备注信息,以便选中文件的时候,显示该pdf论文的相关信息,如下图所示:日a notemanagera智能计算二鎌合制图备注信息。O同时需要能够编辑、修改某个文件的备注信息 建议采用一个edit框,可换行,来处理备注信息。高阶要求3建立作者信息管理功能,要求能够录入作者、作者相关信息(可以是所属学校、email什么的) 能够在增加论文的功能的设置

15、作者,由前面的输入变为在已有类型中选择用一个导航树显示作者。目录可以自己设计,可以根据作者、国际什么的来分类显示。可选要求1界面功能可以做一点提升,左右的窗口大小可以拖放的方式改变大小和对话框布局; 备注信息和文件列表可以上下拖动文件列表的listctrl 可以排序可选要求2双击listctrl中的文件,能够打开该pdf文件可以讲一些类的代码用动态链接库实现完整设计系统功能,配置必要的toolbar、状态栏、菜单、右键菜单五、成绩评定及评分标准指导老师按优秀、良好、中等、及格、不及格五档提交成绩。成绩构成:(1)现场出勤、提问、调试、运行结果展示:50%(2) 程序代码质量:20%(3) 设计

16、报告:30%其他说明:在实现的过程中可根据自己的实际情况增加软件的实用性。实用性强的软件可酌情加分。附件一、课程设计报告格式课程设计报告封面:面向对象程序设计课程设计报告学 号:班级序号:姓 名:指导老师:成 绩:中国地质大学(武汉)信息工程学院信息工程系20XX年X月实习题目一 (V小二,黑体,居中 )【需求规格说明】( 五号,宋体 ,具体内容:题号及题目、问题描述、问题分析。)【算法设计】(1)设计思想:( 五号,宋体 ,具体内容:主要的算法思想。)(2)设计表示:(五号,宋体 ,具体内容:子模块(过程或函数)的规格说明、关系图(描述类与类之间 的关系图、各功能模块之间的关系图等)。)【调

17、试报告】( 五号,宋体 ,具体内容:问题是如何解决的,改进设想。)【附录】( 五号,宋体 ,具体内容:源程序清单(必须有必要的注释)、测试数据及运行结果。)实习题目二总结( 五号,宋体 ,具体内容:通过本次课程设计, 谈谈你的体会和感想以及对本课程设计的意 见和建议。)附件二、C+编码规范1、文件组织(1)文件结构A、版权和版本的声明版权和版本的声明位于头文件和定义文件的开头(参见例1),主要内容有: 版权信息。 文件名称,标识符,摘要。 当前版本号,作者/修改者,完成日期。 版本历史信息。/Copyright (c) 2002-2005,中国地质大学/ All rights reserved

18、./文件名称:输入文件名,如filename.h/文件标识:见配置管理计划书摘要:简要描述本文件的内容/当前版本:1.1作者:输入作者(或修改者)名字/完成日期:2002年7月20日/取代版本:1.0/原作者:输入原作者(或修改者)名字/完成日期:2002年5月10日例1版权和版本的声明B、头文件的结构头文件由三部分内容组成: 头文件开头处的版权和版本声明(参见例1)。 预处理块。 函数和类结构声明等。假设定义文件的名称为box.h,定义文件的结构参见例2。/版权和版本声明见例 1此处省略。#i nclude"graphicS/h 引用头文件/全局函数的声明void Function

19、1( );5/类的声明class CBoxpublic:long GetSize();private:long m_lWidth;;例2 C+/C定义文件的结构【规则1】防止头文件内容被重复包含为了防止头文件内容被重复包含,所有头文件必须用ifndef/define/endif结构产生预处理块。例如:对于文件 mystring.h,其文件内容应按照如下方式编写(例3):#ifndef MYSTRING_H#define MYSTRING_H#include <math.h>/引用标准库的头文件#include“ myheader/h引用非标准库的头文件void Function1(

20、);/全局函数声明class Box/类结构声明;#endif例3文件的内容定义【规则2】引用信息顺序标准的头文件要放在前面,而且按照字母顺序排列。标准头文件和自己的头文件之间应该用 空行分隔。【规则3】用#include vfilename.h格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。【规则4】用#include “filename.h "格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。【建议1】头文件中只存放 声明”而不存放 定义”在C+语法中,类的成员函数可以在声明的同时被定义,并且自动成为内联函数,如果从提 高性能角度考虑是可取。除此之外的选择

21、,建议将成员函数的定义与声明分开,不论该函数体有 多么小。【建议2】不提倡使用全局变量,尽量不要在头文件中出现象extern int value这类声明。C、头文件的作用 通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户 提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心 接口怎么实现的,编译器会从库中提取相应的代码。 头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明 不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。(2)目录结构如果一个软件的头文件数目比较多(如超过十个)

22、,通常应将头文件和定义文件分别保存于不同的目录,以便于维护。例如,可将头文件保存于in elude目录,将定义文件保存于 source目录(可 以是多级目录)。如果某些头文件是私有的,它不会被用户的程序直接引用,则没有必要公开其声明”。为了加强信息隐藏,这些私有的头文件可以和定义文件存放于同一个目录。【规则5】统一目录结构项目开始时,规定好项目相关文件在磁盘上的存储目录结构。2、命名规则比较著名的命名规则当推Microsoft公司的匈牙利”法,该命名规则的主要思想是在变量和函数名中加入前缀以增进人们对程序的理解”。例如所有的字符变量均以ch为前缀,若是指针变量则追加前缀p,如果一个变量由ppc

23、h开头,则表明它是指向字符指针的指针。在程序体中应基本遵循匈牙利命名规则。(1)总则【规则6】标识符应当直观且可以拼读,可望文知意,不必进行解码”。标识符应该采用英文单词或其组合,便于记忆和阅读,切忌使用汉语拼音来命名。【规则7】标识符长度应当尽量符合“mil-length && max- information "原则。单字符的名字也是有用的,常见如 i, j, k, m, n, x, y, z等,它们通常可用作函数内的局 部变量。【规则8】程序中不要出现仅靠大小写区分的相似的标识符。例如:int x, X; /变量x与X容易混淆void foo(int x);/

24、函数 foo 与 FOO 容易混淆void FOO(float x);【规则9】命名规则尽量与所采用的操作系统或开发工具的风格保持一致。例如 Windows应用程序的标识符通常采用大小写"混排的方式,如 AddChild。而Unix应用程序的标识符通常采用小写加下划线”的方式,如add_child。别把这两类风格混在一起用。【建议3】尽量避免名字中出现数字编号,如Vari,Var2等,除非逻辑上的确需要编号。【建议4】尽量使用公认的无异义的缩写,缩写一般不超过4个字母。例如:HTMLHypertext Markup Lan guageURLUniform Resource Locat

25、orcmdcomma ndin itin itialize,尽管两者的作用域不同而不【规则10】程序中不要出现标识符完全相同的局部变量和全局变量 会发生语法错误,但会使人误解。【规则11】变量的名字应当使用 名词”或者 形容词+名词”例如:floatvalue;floatoldValue;floatn ewValue;【规则12】函数的名字应当使用 动词”或者“动词+名词”(动宾词组)。类的成员函数省掉表示 对象本身的“名词”。例如:DrawBox();/全局函数box->Draw();/类的成员函数【规则13】用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。例如:intmin

26、V alue;intmaxValue;intSetValue();intGetValue();(2)文件【规则14】通用文件命名规则类名.cpp例:DI_Co nst.h+_GlobalDef.h 例:DI_GlobalDef.h 类的声明文件(.h)和实现文件(.cpp):类名.h 常量定义文件:项目名称缩写(大写)+_Const.h 全局变量、函数声明文件:项目名称缩写(大写) 错误代码定义文件:项目名称缩写(大写)+_ErrorDef.h例:DI_ErrorDef.h(3)变量【规则15】变量名由范围前缀+类型前缀+限定词组成。【规则16】变量和参数用小写字母开头的单词组合而成。例如:B

27、OOL flag;int drawMode;【规则17】变量的范围前缀全局变量加上 g_ (表示global) 例如:int g_howManyPeople; / 全局变量 int g_howMuchMoney; / 全局变量静态变量加上s_例如:void In it()static int s_initValue;/ 静态变量 局部变量范围前缀为空【规则18】变量的类型前缀类型名称表示付号范例整型nm_n TotalNum长整型lg_lOpe nDate无符号整型uuMsgID无符号长整型dwdwCardNo字符chchChar布尔量bm_bOK浮点数fm_fPrice双精度浮dg_dRat

28、e字符数组szm_szPath指针ppProgress字节指针pbm_pbSe ndData无符号指针pvg_pvParam字符指针lpszlpszNameStr整型指针IpnIpn SysDoomType文件指针fpm_fpFile结构体ststMyStruct【规则佃】方法参数名使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名字。 例如:void setTopic (Stri ng strTopic)this.strTopic = strTopic;【建议5】循环变量可以用i, j, k做循环变量,用 p,q做位移变量。【规则20】常量名全用大写,用下划线分割单词例如:con

29、 st i nt MAX = 100;con st i nt MAX_LENGTH = 100;(4)自定义类型【规则21】类名必须由大写字母开头的单词或缩写组成,只用英文字母,禁用数字、下划线等符号。【规则22】typedef定义的类型利用typedef创建类型名为以“S加单词或缩写组成,只用英文字母。【规则23】枚举类型枚举类型名以“ E加单词或缩写组成,只用英文字母。枚举类型的成员遵循常量命名约定,使 用大写字母和下划线,名称要有含义。【规则24】结构(struct)和联合(union)结构(struct)和联合(union)名同类名。(5)函数【规则25】用正确的反义词组命名具有互斥意

30、义的变量或相反动作的函数等。【规则26】函数的名字应当使用动词”或者 动词+名词”(动宾词组)。【规则27】类方法名必须用一个小写字母的动词开头,后面的单词用大写字母。例如:getName(),setHTML()【建议6】方法名前缀根据需要使用get/set存取属性值,is/has/should存取布尔值。推荐使用下列方法前缀,按下列组合配对使用:add/remove , create/destroy, old/new , in sert/delete, in creme nt/decreme nt, start/stop, begin/end , first/last, up/down ,

31、next/previous, min/max , open/close, show/hide3、注释(1)总则【规则28】程序可以有两种 注释:代 码注释(implementation comments)和文档注释(documentation comments)。代码注释主要删除注释 (注释掉目前不需要的代码)和说明注释(对代码进行说明),文档注释是指专门用来形成文档用的注释。【规则29】注释是 Why而不是 What。程序中的注释不可喧宾夺主,注释的花样要少。【规则30】边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。【规则31】注释的位置应与被描

32、述的代码相邻,可以放在代码的上方或右方,不可放在下方。【规则32】当代码比较长,特别是有多重嵌套时,应当在一些段落的结束处加注释,便于阅读。【规则33】修正bug之后,要加上描述修改状况的注释。(2)文档注释【规则34】文档注释文档注释用/*/标识,它对代码的使用说明进行描述,每一个文档注释被放进/*/分隔符,每一个类、接口、构造函数,方法和成员变量拥有一个注释,这样的注释应该出现在相 应的声明前。例如:/* Example类提供如下的功能*/class Example 类和接口的文档注释(/*)的第一行不应该缩进,以后的文档注释每行都应有一个空格的缩 进(给垂直排列的星号)。成员函数(包括构

33、造函数),第一行文档注释前有一个Tab缩进,后续的行有一个Tab外加一个空格的缩进。对于那些不适于文档注释的类、接口、变量、方法的信息, 用代码注释进行说明,而不应该在类的文档注释中。文档注释不应该放在方法或构造函数的定义体内。(3)源程序文件【规则35】源程序文件文档注释每个源程序文件的开头都需要文档注释(参见例1),主要内容有: 版权声明:版权声明内容为 Copyright Beijing China Tech international Software, Inc. All Rights Reserved. o 文件名称:本文件的名称。 开发者姓名:填写最初编写此代码的人。 创建日期:本

34、文件的创建日期。 功能目的:简要描述本文件中代码的功能。 修改历史(修改日期、修改人、修改编号、修改内容)。其中修改历史可以多次出现,任何对本文件的修改必须增加一条修改历史。(4)类【规则36】类注释每个类的必须有文档注释,其中至少要包括:功能、版本、最后修改时间、作者、修改历史 (修改日期、修改人、修改编号、修改内容)等,其中修改历史可以多次出现,任何对本类的修 改必须增加一条修改历史,此外可以根据需要添加其它相关信息或链接。类注释必须在类的声明 之前。例例如:*类<code>String</code>圭寸装了有关字符串的操作,这些操作包括*单个字符定位、串比较、查找

35、、提取子串、大写/小写转换等* author Lee Boynton* author Arthur van Hof* version 1.130, 02/09/01*/class String(5)函数【规则37】函数注释所有函数(包括类自定义类型的成员函数)必须有文档注释。注释在其定义之前,按如下方 式书写:*判断一字符串是否为数字* param sNum 字符串* return true=是数字false=不是数字*/boolea n isNumber(Stri ng sNum)【规则38】构造函数注释要标明此函数为构造函数。如果有多个构造函数,用递增的方式书写,参数多的写在后 面,如有多

36、组构造函数,每组分别用递增的方式写,并且每一个都要有详细的注释。(6)变量【规则39】变量的注释变量注释出现在变量声明或自定义数据类型成员声明的前一行,用以描述对应变量的作用和 含义,变量注释一般占一行。下列变量必须有注释: 自定义类型的成员 全局变量 其它重要的局部变量注释必须按如下方式书写:*包计数器*/int iPackets;(7)语句【建议7】代码注释风格代码注释用/*/和标识。程序可以有四种风格的代码注释:块注释、单行注释、后缘注释(trailing )、行尾注释(end-of-line)。块注释。块注释常用来提供文件、方法、数据结构、算法的说明。块注释可以被用在每个文 件的开头和

37、每个方法的起始,它们也可以被用在其他地方,比如在方法内部等。块注释在函数或 方法的内部应该和它们描述的代码具有同样的缩进格式。块注释之前应该有一个空行。单行注释。短的注释可以出现在单行,和它后面的代码使用同样的缩进。单行注释前应该有 一个空行。后缘注释(trailing、和行尾注释(end-of-line )。非常短的注释可以出现在和它说明的代码的同 一行中,但应该和被说明的代码相隔足够远。如果在一个代码块中出现了多于一个的短注释,它 们应该有相同的缩进。【规则40】语句块结束注释 函数定义的结束必须加如下内容的注释:/end of函数名。若程序文件中能够明确指出函数结束的不需加此注释。 对于

38、包含代码行较多的条件语句,每个条件处理语句块的结束必须加如下内容的注释: /end of此语句块的条件。 对于包含代码行较多的循环语句,循环语句块的结束必须如下内容的注释:/end of循环条件。4、程序的版式(1)空白符A、空行【规则41】在每个类声明之后、每个函数定义结束之后都要加空行。【规则42】在一个函数体内,逻辑上密切相关的语句之间不加空行,其它地方应加空行分隔。B、空格【规则43】在if、for、while等关键字之后应留一个空格再跟左括号,以突出关键字。【规则44】函数名之后不要留空格,紧跟左括号(以与关键字区别。【规则45】,向前紧跟,紧跟处不留空格。【规则46】之后要留空格,

39、如 Functions y, z)。如果不是一行的结束符号,其后要留空格,如 for (initialization; condition; update) 。【规则47】赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“ =”“ +=”“>=”“ <=” “ +” “ * ” “ '、 “ &&'、 “|卜” “ <<” “八等二元操作符的前后应当加空格。【规则48】一元操作符如 “! ” “、 “ +” -”、 “&'(地址运算符)与其作用的操作数之间不加空格。【规则49】 操作符“口等“.、->”

40、前后不加空格。C、对齐【规则50】相互匹配的和应独占一行并且位于同一列,同时与引用它们的语句左对齐。 【规则51】 之内的代码块在新行右边一个Tab处左对齐。(2)表达式A、运算符的优先级【建议8】建议对于除+, *等优先级非常明显的运算符之外, 全部使用括号确定表达式的操作顺序。B、复合表达式【规则52】不要有多用途的复合表达式。C、逻辑表达式布尔变量与零值比较【规则53】布尔变量与零值比较不可将布尔变量直接与 TRUE、FALSE或者1、0进行比较。应写为:bool bFlag;if (bFlag) / 表示 flag 为真 if (!bFlag) / 表示 flag 为假其它的用法都属于

41、不良风格,整型变量与零值比较【规则54】应当将整型变量用“=或!=”直接与0比较。例如:if (flag =TRUE)if (flag =1 )if (flag =FALSE)if (flag =0)假设整型变量的名字为value,它与零值比较的标准 if语句如下:if (value = 0) if (value != 0)不可模仿布尔变量的风格而写成:if (value) /会让人误解 value是布尔变量 if (!value)浮点变量与零值比较【规则55】不可将浮点变量用“='或!= ”与任何数字比较。千万要留意,无论是 float还是double类型的变量,都有精度限制。所以一

42、定要避免将浮点变 量用“=或“=”与数字比较,应该设法转化成“>=或 “<=形式。假设浮点变量的名字为x,应当将if (x = 0.0)/隐含错误的比较转化为if (x>=-EPSINON) && (x<=EPSINON)其中EPSINON是允许的误差(即精度)。指针变量与零值比较【规则56】应当将指针变量用“='或!= ”与NULL比较,而不应采用if(p)或者if(!p)的形式。指针变量的零值是空”(记为NULL )。尽管NULL的值与0相同,但是两者意义不同。假设指针变量的名字为 p,它与零值比较的标准if语句如下:if (p = NULL

43、) II p与NULL显式比较,强调 p是指针变量 if (p != NULL)不要写成if (p = 0) II容易让人误解p是整型变量if (p != 0)或者if (p)II容易让人误解p是布尔变量if (!p)(3) 基本语句A、代码行【规则57】一行代码只做一件事情,如只定义一个重要变量,或只写一条语句。【规则58】if、for、while、do等语句自占一行,执行语句不得在同一行上。不论执行语句有多少都要加。【规则59】尽可能在定义变量的同时初始化该变量(就近原则) 。【建议9】在使用之前才定义变量。【建议10】不提倡使用全局变量不提倡使用全局变量,尽量不要在头文件中出现象exte

44、rn int value这类声明。【建议11】调试信息不要用cout到处打印调试信息,统一使用带开关的调试类打印调试信息。B、长行拆分【规则60】代码行最大长度为 80个字符。【规则61】超长的语句应该在一个逗号后,或者一个操作符前折行,操作符放在新行之首(以便 突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。C、修饰符的位置【规则62】应当将修饰符 *和&紧靠变量名。(4)条件语句【建议12】程序中有时会遇到 if/else/return的组合,建议将如下风格的程序:if (con diti on)return x;return y;改写为if (con diti

45、on)return x;elsereturn y;或者改写成更加简练的retur n (con diti on ? x : y);【规则63】switch语句中必须有 default分支。例如:switch (i)case 1:; break;case 2:;break;default : break;【规则64】每个case语句的结尾不要忘了加 break,否则将导致多个分支重叠(除非有意使多个 分支重叠)。(5) 循环语句【规则65】在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。女口:下面例4(b)的效率比例4(a)的高。for

46、(row=0; row<100; row+)for ( col=0; col<5; col+ )sum = sum + arowcol;for (col=0; col<5; col+ )for (row=0; row<100; row+)sum = sum + arowcol;例4 (a)低效率:长循环在最外层例4 (b)高效率:长循环在最内层【规则66】如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。女口:例5(a)的程序比例5(b)多执行了 N-1次逻辑判断。并且由于前者老要进行逻辑判断,打断了循环流水线”作业,使得编译器不能对循环进行优化

47、处理,降低了效率。如果N非常大,最好采用例5(b)的写法,可以提高效率。如果N非常小,两者效率差别并不明显,采用例 5(a)的写法比较好,因为程序更加简洁。for (i=0; i<N; i+)if (con diti on)if (con diti on)for (i=0; i<N; i+)DoSomethi ng();DoSomethi ng();elseDoOtherthi ng();elsefor (i=0; i<N; i+)DoOtherthi ng();例5(a)效率低但程序简洁例5(b)效率高但程序不简洁【规则67】不可在for循环体内修改循环变量,防止for循环

48、失去控制。半开半闭区间”写法。【建议13】建议for语句的循环控制变量的取值采用女口:例6(a)中x值属于半开半闭区间 “0 =< x < N 起点到终点的间隔为 N,循环次数为N。 例6(b)中的x值属于闭区间“0 =< x <= N1”,起点到终点的间隔为 N-1,循环次数为N。相比之下, 例6(a)的写法更加直观,尽管两者的功能是相同的。for (int x=0; x<N; x+)for (int x=0; x<=N-1; x+)例6(a)循环变量属于半开半闭区间例6(b)循环变量属于闭区间(6)常量【规则68】静态变量使用时使用类名 ::变量名的方法

49、来调用。【规则69】尽量使用含义直观的常量来表示那些将在程序中多次出现的数字或字符串。【规则70】在C+程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量,const有类型的检查而宏没有。【规则71】常量定义的位置。需要对外公开的常量放在头文件中,不需要对外公开的常量放在定义文件的头部。为便于管理,可以把不同模块的常量集中存放在一个公共的头文件中。【规则72】常量意义要明确。如果某一常量与其它常量密切相关,应在定义中包含这种关系,而 不应给出一些孤立的值。例如:con st float RADIUS = 100;const float DIAMETER = RADIUS

50、* 2; / 不要写成 DIAMETER = 200;(7)类中的常量有时我们希望某些常量只在类中有效。由于#define定义的宏常量是全局的,不能达到目的,于是想当然地觉得应该用const修饰数据成员来实现。const数据成员的确是存在的,但其含义却不是我们所期望的。con st数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的,因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。不能在类声明中初始化con st数据成员。以下用法是错误的,因为类的对象未被创建时,编译器不知道SIZE的值是什么。class Aonstint SIZE = 100;错误,企图在类声明

51、中初始化co nst数据成员int arraySIZE; / 错误,未知的 SIZE;const数据成员的初始化只能在类构造函数的初始化表中进行。例如:class A.A(int size);/ 构造函数const int SIZE ;A:A(int size) : SIZE(size) /构造函数的初始化表A a(100);/ 对象 a 的 SIZE 值为 100A b(200);/ 对象 b 的 SIZE 值为 200怎样才能建立在整个类中都恒定的常量呢?别指望const数据成员了,应该用类中的枚举常量来实现。例如:class A.enum SIZE1 = 100, SIZE2 = 200

52、; /枚举常量int array1SIZE1;int array2SIZE2;枚举常量不会占用对象的存储空间,它们在编译时被全部求值。枚举常量的缺点是:它的隐 含数据类型是整数,其最大值有限,且不能表示浮点数(如Pl=3.14159 )。(8)函数A、参数【规则73】参数的书写要完整,在函数定义的地方,不要只写参数的类型而省略参数名字,如果 函数没有参数,则用void填充。例如:void SetValue(int width, int height); / 良好的风格void SetValue( in t, i nt);不良的风格float GetValue(void);/ 良好的风格floa

53、t GetValue();/ 不良的风格【规则74】参数命名要恰当,顺序要合理,一般地,应将目的参数放在前面,源参数放在后面。例如编写字符串拷贝函数StringCopy,它有两个参数。如果把参数名字起为strl和str2,例如:void Stri ngCopy(char *str1, char *str2);那么我们很难搞清楚究竟是把str1拷贝到str2中,还是刚好倒过来。可以把参数名字起得更有意义,如叫 strSource和strDestination,这样从名字上就可以看出应该把strSource拷贝到strDestination。还有一个问题,这两个参数哪一个该在前哪一个该在后?参数的顺序要遵循程序员的习惯。 一般地,应将目的参数放在前面,源参数放在后面。如果将函数声明为:void Strin gCopy(char *strSource, char *strDest in atio n);别人在使用时可能会不假思索地写成如下形式:char str20;StringCopy(str,“ Hello World/ 参数顺序颠倒【规则75】指针入参如参数是指针,且仅作输入用,则应在类型前加con st,以防止该指针在函数体内被意外修改。例如:void StringCopy(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论