数据结构课程设计总结 (1)

《程序设计与数据结构》

综合课程设计论文

题    目:程序设计与数据结构综合课程设计 

专    业:       计算机科学与技术           

班    级:         N计科12-1F             

姓    名:       

学    号:         

指导老师:      

一、课程认识

数据结构课程主要是研究非数值计算的程序设计问题中所出现的计算机操作对象以及它们之间的关系和操作的学科。数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。

学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。通过此次课程设计主要达到以下目的:

u 了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;

u 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;

u 提高综合运用所学的理论知识和方法独立分析和解决问题的能力;

u 训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。

u 训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。

二、问题描述及分析

1、问题描述

设计一个一元多项式程序,并完成多项式的加法、减法、以及乘法的运算。如A(x)=15+6x+9x7+3x18    B(x)=4x+5x6+16x7  求 A+B  A*B

2、问题分析

①.在数学上,一个一元多项式Pn(x)可按升幂写成:Pn(x)=a 0+a1 x+a2 x^2 +…+an x^n-1 .它由n+1个系数惟一确定,因此,在计算机里,它可用一个线性表P来表示:Pn=(a0,a1,a2,…,an)每一项的指数i隐含在其系数ai的序号里。设m

②由于一元多项式的建立、运算等操作经常要插入或者删除元素,所以考虑使用链式存储结构(带头结点的链表)作为数据结构,以减少移动元素的次数,减少空间复杂度和空间复杂度。

③减法运算可以转化为加法运算,因此可以大大地简化程序。

④乘法运算可以多次调用加法函数实现。 

 三、数据结构描述

1、数据结构选择

本程序讨论的是利用线性链表的基本操作来实现一元多项式的运算。

2、数据结构与多项式的结合

在数学中,每个单项式都具有系数和指数,当系数为0时,该项就失去了意义,在计算机内要表示一个多项式,至少以下数据信息:系数信息、指数信息和指向下一个单项式的指针。通过指针,我们就可以把多个单项式连接起来,形式一个多项式,需要说明的是从广义的角度讲,单项式也是一个多项式。

3、数据结构的特点及结点表示

线性链表的另一个特点是插入或删除结点是不必移动其他结点,而仅需调整指针的指向关系以适应新的数据关系,从而大大简化了创建、插入和删除的工作。

基于以上的分析,我们定义多项式的数据结构为如下结构体形式:

struct node

{

       float coef;             //系数

           int expn;           //指数

          struct node *next;       //指针指向下一个结点

};

四、主要算法流程描述(个人负责部分)

        如图4-1为主函数流程图

 

图5-1为加法算法的流程图

数据结构课程设计总结 (1)

图6-1为减法算法的流程图

图7-1为输出算法的流程图

 

五、使用说明

该程序在VC++6.0中调试通过,没有错误和警告,运行结果经过检验为正确。以下即为该程序运行结果效果图。图中采用的是计算多项式3x^+2x^7+4x^2+1和x^4+5x^3+6x^5的输入方式和加减乘除四种运算结果进行的演示:

1、输入并建立多项式链表

2、加、减、乘、除运算

  

 3、使用条件及方法

        条件:请在Microsoft (R) Developer Studio VC++6.0 开发环境下运行。

         方法:将“Add”、 “Copy” 、 “CreatePolyn” 、“Divide” 、“login”

、“Multiply” 、“Print” 、“ReArrange” 、“struct node” 、“Substraction”包含在同一文件夹下面,运行“login”,然后根据提示,输入链表每一个结点的系数和指数值,然后选择加减乘除这四个运算的任意一个,得到结果。

         4、注意事项

           1、在输入多项式每一个结点时,系数定义为浮点型,指数定义为整型,用户输入的时候,应该注意,系数输入浮点和整型都可以,而指数为整型,若输入为浮点型,则会产生误差。

             2、用户在输入选择某一个算法时,应该按照界面上的提示说明进行输入,若超出提示范围,则会提示让用户重新输入。

             3、用户在包含文件的时候,请注意每一项文件的完整性。缺失则会导致运行错误。 

六、调试分析说明

 调试过程中出现的问题和处理方式:

1、      在编写加法函数时,比较p->expn,q->expn 的时候,应该编写下面程序来使问题简化。

int compare(int a,int b)

{

        if(a

          return -1;

        else

          if(a==b)

               return 0;

             else

               return 1; }

2、     在编写减法程序的时候,应该注意调用加法程序,只需要在后面的链表系数全部乘以(-1),使得减法程序变得十分简洁。

struct node *Subtraction(struct node *p,struct node *q)

{

         struct node *headq=q,*head;

         q=q->next;

         while(q)

         {

           q->coef=q->coef*(-1);

           q=q->next;

          }

            head=AddPolyn(p,headq);

            return head;   

}

3、在编写”print” 函数时,由于多项式是由单项式相加,所以在输出的时候printf("X^%d+",p->expn);每一次都会输出+号,所以在最后的时候需要 printf(“\b”);来删除最后的+号,但是由于用户可能输入A或者B是0,所以最后都没有+,但是原来程序已经把最后一个字符通过“\b”删除了,所以设定了一个标志符,判断如果为0,则多输出一个0,来解决了这个问题。

七、特色和改进思想

一、特色:我们组在成功完成一元多项式的加法、减法、和乘法之后,又成功地解决了一元多项式的除法问题,使得对一元多项式的四项基本运算都可以通过本程序来解决。并且在编写“Divide”函数时,都是通过调用前面已有的算法,使得程序很简洁,便于移植。

二、改进思想

1、我们组在编写CreatePolyn(),创建链表的时候,在考虑到输入时候X的指数可能不是按照顺序来输入的,所以采用了全部输入完成后经过对链表的排序来使其有序,经过陈老师的指导后,我们实现了“边输入、边排序”这一思想,即在输入的时候就对每一项进行插入排序。使得程序的算法思想变得更加先进,节省了时间复杂度和空间复杂度。

 2、在由每个人完成个自的模块后进行融合的时候,发现许多工具函数都是可以相互调用的,之后我们规定了各种函数调用的标准,使得整体程序变得简洁。

 3、在编写”print” 函数时,由于后面会多输出一个+号,所以在查找参考书之后,通过printf(“\b”);,使得这个问题巧妙的解决了。

八、课程设计总结

本次的数据结构课程设计针对具体的实际项目来进行需求分析,测试计划,概要设计,详细设计,测试分析等具体的步骤流程走下来,从中我收获了很多

经过一周的课程设计,有很多的心得体会。首先,在编写函数之前要充分利用图书资源和网络资源;其次,应该更详细的考虑实际情况,才能使程序更切合实际,更具有实用性;更多的我想应该是组员之间的合作精神吧!

通过这次课程设计练习,使我更深刻地理解了数据结构重要存储结构的的精髓-----线性链表的使用。完成整个程序设计有,对线性链表的使用掌握的更加熟练。

同时通过直接对链表的各种插入、查找、排序等操作,加深了对数据结构的理解和认识。并在完成课程设计的过程作主动查阅了相关资料,学到了不少课本上没有的技术知识。

经过这次课程设计,我深刻认识到算法在程序设计中的重要性,一个完整的程序总是由若干个函数构成的,这些相应的函数体现了算法的基本思想。

通过此次课程设计,我了解了编写应用软件的一般步骤,获得了很多宝贵的经验。特别是怎样将理论与实践相结合,把书本上的的内容应用到我们做的程序上。怎样使各个子模块实施其详细功能,特别是各个子模块之间的接口,一定要相当清晰达到相互协调的作用。其次我熟悉了数据结构的知识学会了很多关于程序设计的经验和技巧,明白了程序设计的使用性和通用性事程序生存周期长短的关键,学会了程序调试的一般方法。重要的是通过本次程序设计,我逐步具备了走向程序员的基本素质。知道如何在困难重重时一步一步细心发现问题,解决问题。知道了在软件设计中对界面和功能如何平衡,如何达到相对完美。

编程是一件枯燥乏味工作,但是只要认真专研,我们会从中学到很多在课本上学不到或者无法在课堂上掌握的知识,同时也能从中感受到编程的乐趣。兴趣是可以培养的,只要坚持下去,面对困难我们总能够找到解决问题的方法。

计算多项式的加、减、乘法还有除法的运算-----该程序虽然不是很大,这次还是由几位同学合作才完成这一任务。通过小组的分工与合作,使我充分认识到在项目团队开发过程中合作的重要性,也更加理解了沟通协作能力在软件开发行业中的重要性。获得的实践经验对以后从事开发软件工作中得到了许多重要的经验。

另外也需要提出的是在这次程序设计的过程中,非常感谢陈利民老师对我们的耐心指导。老师在教学过程中表现出来的对学术专研一丝不苟的精神让我非常有收获。同样也是老师的严格要求才使得小组成员能够顺利的完成任务。

九、附录

参考资料列表

1、            数据结构(C语言版)/严蔚敏,吴伟民编著。----清华大学出版社,2007

http://www.tup.com.cn

2、   数据结构题集/史嘉权 编著。 -------清华大学出版社,2008

 

第二篇:数据结构课程设计指导书1

《数据结构》课程设计指导书

计算机与通信学院                 

一.目的

通过本课程设计,使学生更加系统地理解和掌握数据结构的基本概念;使学生能自如地根据实际要求,设计相应的数据结构,并运用C语言实现所设计的算法,编写较大型的程序,分析和解决实际应用问题,为后续其它专业课程的学习和应用打下良好基础。

二.题目

设计选题范围如下(如需选择其他范围题目需经指导老师同意):

1.  学生成绩管理系统(必须用链表实现)

2.  简易客房管理系统(必须用链表实现)

3.  其他类型管理系统的题目(必须用链表实现)

①人事档案管理系统

②图书管理系统

③进销存货物管理系统

④职工工资管理系统

⑤通讯录管理系统

4.  表达式的求值(栈和队列的应用)

5.  交通咨询系统设计(图结构)

6.  哈夫曼编/译码器(树)

7.  航班信息的查询与检索(查找和排序)

8.  稀疏矩阵的压缩与还原

9.  纸牌游戏

三.任务完成形式

1. 完整的软件系统

       

最终必须向指导老师提交完整的程序源代码(.c和.cpp以及.h为后缀的文件)、数据文件以及使用说明文件等。源代码文件要特别注意编程规范、代码风格,关键代码需有合理的注释,不含任何无用代码;数据文件内要求有一定数量的“真实”数据(如对于记录文件,需要有5条以上记录); 使用说明文件的第一行,需要给出设计者的学号、姓名,后面为其它说明。

2. 课程设计报告(详细要求请参考模板)

课程设计报告总体上主要包括以下几个部分:

1)封面

2)目录

3)课程设计报告正文

4)使用说明

5)参考文献

四.总体要求

1.  每道题目的程序代码总量不少于300(其中不包括自动生成代码),有合理注释。

2.  课程设计报告正文字数不少于5000,概念清楚、叙述正确、内容完整、书写规范。

3.  独立完成课程设计,不得抄袭他人。

4.  功能正确、有一定实用性。

5.  尽可能大量使用各种C或C++语言程序设计技术,尤其在以下几个方面:

指针及其运算、结构、指针数组、数组指针、字符数组与字符串、内存空间动态申请与释放、文件访问与操作、合理的常量与全局变量及函数接口变量定义、数据输入与数据格式检查、数据类型转换、错误处理、工程设计技术(整个系统由一个工程文件、若干个程序文件、若干头文件、甚至库文件等组成)。

程序界面不做较高要求,但要考虑到用户使用的方便,有较好的交互界面。

6.  可以使用VC编译环境开发程序,但不允许使用现成的数据库如access,SQL Server等完成上面的课程设计题目,否则成绩评定为不及格

7.  设计时适当考虑程序的可维护性与可扩充性。

8.  提倡积极交流与讨论(同学间、bbs站点)、善于查阅资料、分析与借鉴他人编写的软件。

9.  认真自觉以个人为单位完成自己的任务,代码和课设报告均严禁雷同,否则成绩为不及格。验收时查看代码,并提出若干个跟程序代码有关的问题,并把问题回答情况计入总评成绩。

   

五.工作阶段与考核方法

大体上可分成五个阶段:

        1.资料查阅准备阶段

2.分析设计阶段

3.编程调试阶段

4.课程设计报告书写阶段

5.验收阶段(答辩):根据设计报告与演示答辩和验收来评分。(每位同学逐个过关)

 考核方法:

        只有程序验收通过后,才能按以下方法核定本次课程设计的总成绩,因未能独立完成设计(尤其是抄袭)或概念不清的同学,总成绩将核定为不及格。总成绩由以下几个部分决定:

1.  考勤、纪律、实验室卫生(根据设计出勤情况、遵守纪律和服从管理情况、以及设计态度等因素评定;如有严重纪律问题,可按学校有关规定直接评为不及格;)

2.  工作量(代码量、功能多少、难度)

3.  关键技术

4.  实用性、创新

5.  代码书写规范性

6.  程序界面、新技术引用

7.  课程设计报告(叙述、书写规范、字数)

8.  动手能力、分析问题解决问题能力

     

六.任务具体要求

1、学生成绩管理系统(必须用链表实现)

问题描述:该系统实现对若干个大学生的学习成绩进行管理。至少包括以下信息:

学号、姓名、科目、成绩,学期。学期取值范围可为1-8。

功能要求:

1.使用中文菜单;

2. 将学生信息保存在文本文档中,具体对学生信息进行插入删除查询操作时,将保存在文本文档中的学生信息提取出来,保存在链表中,然后再对链表进行操作,所有操作完成,或者在相应的命令后,再将学生信息保存到文本文档中。

3.具有数据输入功能;

4.具有数据删除功能;

5.具有多种查询(如按学号查询、按姓名查询、按成绩查询等)及输出功能;

6.其它功能(如各种统计)

说明:功能各方面越完善越好

2、简易客房管理系统(必须用链表实现)

问题描述:该系统能简单实现对客栈的住宿情况进行管理。至少包括以下信息:

房号、房型、单价(每床)、已住人数;

住客姓名、性别、年龄、身份、身份证号码,房号,床号,入住日期、入住时间、离店日期、离店时间。

这些信息应存放在两个文件中,分别是客房信息文件、住客信息文件。“房型”可取值1-8,分别表示单人间、双人间…..

功能要求:

1.具有建立数据库(客房信息文件、住客信息文件)功能;

2.具有数据输入功能;

3.具有数据修改功能

4.具有数据删除功能;

5.能查询一些基本信息(如按房号查询、按姓名查询等);

6.具有多种统计功能(要求有一定的实用性)

(如某客房当前有那些空床、某住客应付多少费用、某天住店总人数和总收入等)

3、其他类型管理系统(必须用链表实现)

①人事档案管理系统

②图书管理系统

③进销存货物管理系统

④职工工资管理系统

⑤通讯录管理系统

基本要求:

1.上述类型的管理系统题目需要自己作相关的需求分析,设计并完成相应的功能,完成的系统必须具有一定的实用功能。

2.设计良好的数据结构,代码编写时不允许运用现有的数据库管理系统,具体功能应通过对文件的读写操作实现。

4、栈和队列的应用:表达式的求值  

表达式求值要求: 

例如,输入25*(12-27/3)+2*5=

则程序运行后输出25*(12-27/3)+2*5=85。

表达式计算是实现程序设计逻辑语言的基本问题之一,也是栈和队列应用的一个典型的例

子。该设计是先通过栈将中缀表达式转换为后缀表达式,在转换过程中又用到了队列的操作。而在得到后缀表达式之后,又用到队列的操作对生成的后缀表达式进行计算。在整个设计的实现过程中,用到的都是栈和队列的概念。    

设计要求:

以字符序列的形式从终端输入语法正确的、不含变量的算术表达式(整数和实数都要考虑),利用给定的算符优先关系,实现对算术四则混合运算表达式的求值,并演示在求值过程中运算符栈、操作数栈、输入字符和主要操作的变化过程。

5.交通咨询系统设计

设计要求与分析:设计一个交通咨询系统,能让旅客咨询从任一个城市顶点到另一个城市顶点之间的最短路径(里程)、最低花费或最少时间等问题。对于不同咨询要求,可输入城市间的路程、所需时间或所需费用。

    该设计共分三个部分:一是建立交通网络图的存储结构;二是解决单源最短路径问题;三是实现两个城市顶点之间的最短路径问题。

6、二叉树的应用-哈夫曼编/译码器(电文的编码和译码)

哈夫曼编码/译码器

问题描述:设计一个哈夫曼编码/译码系统,对字符串进行编码/译码

基本要求:

(1)从键盘输入字符串,以回车结束;

(2)根据字符串中字符出现的概率进行哈夫曼编码;

(3)并输出编码结果和编码表;

(4)根据编码结果和编码表还原字符串;

(5)输出编码过程中构造的哈夫曼树。

内容:理解二叉树的基本概念,并在读懂下面详细描述的算法的情况下,编写一个有关二叉树的简单应用程序-电文的编码和译码

具体实验题目和功能要求如下:

(1)电文编码:假如有一份电文中共使用5个字符:a、b、c、d、e,它们的出现频率依次为4、7、5、2、9,试画出对应的哈夫曼树(请按左子树根结点的权小于等于右子树根结点的权的次序构造),并求出每个字符的哈夫曼编码

其中:得到的哈夫曼树和哈夫曼编码如下。

图1

要求自己编程实现若从键盘输入若干字符,同时并输入它们各自出现的频率,最后能计算并在屏幕上显示出每个字符的代码。

(2)电文译码:给出一段二进制代码的电文,要求根据前面构造的huffman树进行译码。在前面编码的基础上,键盘输入一段电文,则能在屏幕上显示出自动翻译好的电文。比如根据图1显示的哈夫曼树,键盘输入电文如下:1011010,屏幕上能显示自动翻译的结果为bed

说明事项:

1.通过上面的描述本课程设计题目包括(1)电文的编码(2)电文的译码,要求必须用哈夫曼树实现。

2. 界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。并要明确,只有在使用哈夫曼树进行编码的前提下,才有可能进行译码。

3.考虑将此程序设计完善,比如可以将编码后的字符代码保存到文件中,将需要翻译的代码保存到另一个文件中,最后把自动翻译后的结果也保存到文本文档中等等。

在这个程序中,首先要构造一棵哈夫曼树,然后才能根据这棵哈夫曼树构造编码。

因此,步骤一:构造哈夫曼树

步骤二:根据哈夫曼树为每个字符编码

步骤三:根据步骤二中构造好的哈夫曼树进行译码

提示:

具体算法见后面的有关哈夫曼树的基础知识介绍

部分代码(仅供参考)如下:

const int N=5;//叶子结点数目

const int TREENODENUM=2*N-1;//结点总数

//huffman树结点的结构

typedef char dataType;

typedef struct

{

       float weight;

       dataType data;

       int lchild,rchild,parent;

      

}huffmanTreeNode;

//哈夫曼编码的结构

typedef struct 

{

       char bits[N];//详细的编码,不过是反的,要从cnt开始读

       int cnt;//记录这个字符数由几位bit表示的

       dataType data;//编码要表示的字母

}codeType;

有关哈夫曼树的基础知识介绍

(1)哈夫曼树的定义

哈夫曼树:设有个权值,构造一棵有个叶子结点的二叉树,每个叶子结点的权值为,则最小的二叉树叫哈夫曼树

其中:为权值

为结点到根到路径长度

为叶子结点数

(2)构造Huffman树的方法——Huffman算法

构造Huffman树步骤如下:

①根据给定的n个权值{w1,w2,……wn},构造n棵只有根结点的二叉树,令其权值为wj

②在森林中选取两棵根结点权值最小的树作左右子树,构造一棵新的二叉树,置新二叉树根结点权值为其左右子树根结点权值之和

③在森林中删除这两棵树,同时将新得到的二叉树加入森林中

④重复上述两步,直到只含一棵树为止,这棵树即哈夫曼树

例如:

第一步:n棵只有根结点的二叉树,每个结点有相应代表的符号和权值

第二步:从中挑出权值最小的合并生成一棵新的树,置新生成的二叉树的根结点

第三步:不断重复第二步,直到只有一个根结点

第四步:最后完成一棵huffman树

哈夫曼树结点的存储结构

(3)哈夫曼树应用(哈夫曼编码)

哈夫曼树中没有度为1的结点,称为严格的二叉树。

哈夫曼编码:数据通信用的二进制编码

思想:根据字符出现频率编码,使电文总长最短

编码:根据字符出现频率构造哈夫曼树,然后将树中结点引向其左孩子的分支标“0”,引向其右孩子的分支标“1”;每个字符的编码即为从根到每个叶子到路径上得到到0、1序列

例如:

要传输到字符集D={C,A,S,T,;}

字符出现频率w={2,4,2,3,3}

得到的哈夫曼树和哈夫曼编码为

(4)Huffman编码算法的基本思想

从叶子tree[i]出发,利用双亲地址找到双亲结点tree[p],再利用tree[p]的lchild和rchild指针域判断tree[i]是tree[p]的左孩子还是右孩子,然后决定分配代码是“0”还是“1”,然后以tree[p]为出发点继续向上回溯,直到根结点为止

(5)Huffman译码算法的基本思想

从Huffman树根开始,从待译码电文中逐位取码。若编码是“0”,则向左走;若编码是“1”,则向右走,一旦到达叶子结点,则译出一个字符;再重新从根出发,直到电文结束

7.航班信息的查询与检索(查找和排序的应用)

设计要求:该设计是要求对飞机航班信息进行排序和查找。可按航班的航班号、起点站、终点站、起飞时间以及到达时间等信息进行查询。

8、 稀疏矩阵的压缩与还原

根据以下描述编写一个程序,使其能完成对稀疏矩阵的压缩与还原,即给定稀疏矩阵可以压缩存储一个三元组,并且能根据这个三元组能还原这个稀疏矩阵。

一个矩阵含有非零元素比较少,而零元素相对较多,这样的矩阵称为稀疏矩阵,对稀疏矩阵的存储我们不用完全的二维数组来存储,可以用一个三元组,即任意一个稀疏矩阵可以用一个只有三列的二维数组来存放,如

   

其 Compress[][3]这个称为三元组,他是一个含有多行的只有三列的矩阵,其中第0行数据分别表示该稀疏矩阵的行数,列数和非零元素个数。以后每行表示一个非零元素的行数,列数和非零元素值,如:第3行中的2,4,4代表稀疏矩阵中的非零元素4在第2行,第4列,其值是4。

稀疏矩阵的操作

基本功能要求:

(1)稀疏矩阵采用三元组表示,求两个具有相同行列数的稀疏矩阵A和B的相加矩阵C,并输出C。

(2)求出A的转置矩阵D,输出D。

9、纸牌游戏

任务:编号为1-52张牌,正面向上,从第2张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌;然后,从第3张开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌;然后…从第4张开始,以4为基数,是4的倍数的牌翻一次, 直到最后一张牌;...再依次5的倍数的牌翻一次,6的,7的 直到 以52为基数的翻过,输出:这时正面向上的牌有哪些?

请设计程序实现该游戏。

附录一:编程规范

随着软件产品的功能增加和版本的提高,代码越来越复杂,源文件也越来越多,对于软件开发人员来说,除了保证程序运行的正确性和提高代码的运行效率之外,规范风格的编码会对软件的升级、修改、维护带来极大的方便性,也保证程序员不会陷入“代码泥潭”中无法自拔。开发一个成熟的软件产品,除了有详细丰富的开发文档之外,必须在编写代码的时候就有条不紊,细致严谨。

以下的编码规范包含了程序排版、注释、命名、可读性、变量、程序效率、质量保证、代码编译、代码测试和版本控制等注意事项。

一、排版:

1.关键词和操作符之间加适当的空格。

2.相对独立的程序块与块之间加空行

3.较长的语句、表达式等要分成多行书写。

4.划分出的新行要进行适应的缩进,使排版整齐,语句可读。

5.长表达式要在低优先级操作符处划分新行,操作符放在新行之首。

6.循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分。

7.若函数或过程中的参数较长,则要进行适当的划分。

8.不允许把多个短语句写在一行中,即一行只写一条语句。

9.函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格。

10.C或C++语言是用大括号‘{’和‘}’界定一段程序块的,编写程序块时‘{’和‘}’

各独占一行并且位于同一列,同时与引用它们的语句左对齐。在函数体的开始、类的定义、结构的定义、枚举的定义以及if、for、do、while、switch、case语句中的程序都要采用如上的缩进方式。

二、注释

1.注释要简单明了。

2.边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。

3.在必要的地方注释,注释量要适中。注释的内容要清楚、明了,含义准确,防止注释二义性。保持注释与其描述的代码相邻,即注释的就近原则。

4.对代码的注释应放在其上方相邻位置,不可放在下面。

5.对数据结构的注释应放在其上方相邻位置,不可放在下面;对结构中的每个域的注释应放在此域的右方;同一结构中不同域的注释要对齐。

6.变量、常量的注释应放在其上方相邻位置或右方。

7.全局变量要有较详细的注释,包括对其功能、取值范围、哪些函数或过程存取它以及存取时注意事项等的说明。

8.在每个源文件的头部要有必要的注释信息,包括:文件名;版本号;作者;生成日期;模块功能描述(如功能、主要算法、内部各部分之间的关系、该文件与其它文件关系等);主要函数或过程清单及本文件历史修改记录等。

9.在每个函数或过程的前面要有必要的注释信息,包括:函数或过程名称;功能描述;输入、输出及返回值说明;调用关系及被调用关系说明等。

三、命名

1.较短的单词可通过去掉“元音”形成缩写;

2.较长的单词可取单词的头几发符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。

3.使用匈牙利表示法

四、可读性

1.避免使用不易理解的数字,用有意义的标识来替代。

2.不要使用难懂的技巧性很高的语句。

3.源程序中关系较为紧密的代码应尽可能相邻。

五、变量

1.去掉没必要的公共变量。

2.构造仅有一个模块或函数可以修改、创建,而其余有关模块或函数只访问的公共变量,防止多个不同模块或函数都可以修改、创建同一公共变量的现象。

3.仔细定义并明确公共变量的含义、作用、取值范围及公共变量间的关系。

4.明确公共变量与操作此公共变量的函数或过程的关系,如访问、修改及创建等。

5.当向公共变量传递数据时,要十分小心,防止赋与不合理的值或越界等现象发生。

6.防止局部变量与公共变量同名。

7.仔细设计结构中元素的布局与排列顺序,使结构容易理解、节省占用空间,并减少引起误用现象。

8.结构的设计要尽量考虑向前兼容和以后的版本升级,并为某些未来可能的应用保留余地(如预留一些空间等)。

9.留心具体语言及编译器处理不同数据类型的原则及有关细节。

10.严禁使用未经初始化的变量。声明变量的同时对变量进行初始化。

11.编程时,要注意数据类型的强制转换。

六、函数、过程

1.函数的规模尽量限制在200行以内。

2.一个函数最好仅完成一件功能。

3.为简单功能编写函数。

4.函数的功能应该是可以预测的,也就是只要输入数据相同就应产生同样的输出。

5.尽量不要编写依赖于其他函数内部实现的函数。

6.避免设计多参数函数,不使用的参数从接口中去掉。

7.用注释详细说明每个参数的作用、取值范围及参数间的关系。

8.检查函数所有参数输入的有效性。

9.检查函数所有非参数输入的有效性,如数据文件、公共变量等。

10.函数名应准确描述函数的功能。

11.避免使用无意义或含义不清的动词为函数命名

12.函数的返回值要清楚、明了,让使用者不容易忽视错误情况。

13.明确函数功能,精确(而不是近似)地实现函数设计。

14.减少函数本身或函数间的递归调用。

15.编写可重入函数时,若使用全局变量,则应通过关中断、信号量(即P、V操作)等手段对其加以保护。

七、可测性

1.在编写代码之前,应预先设计好程序调试与测试的方法和手段,并设计好各种调测开关及相应测试代码如打印函数等。

2.在进行集成测试/系统联调之前,要构造好测试环境、测试项目及测试用例,同时仔细分析并优化测试用例,以提高测试效率。

八、程序效率

1.编程时要经常注意代码的效率。

2.在保证软件系统的正确性、稳定性、可读性及可测性的前提下,提高代码效率。

3.不能一味地追求代码效率,而对软件的正确性、稳定性、可读性及可测性造成影响。

4.编程时,要随时留心代码效率;优化代码时,要考虑周全。

5.要仔细地构造或直接用汇编编写调用频繁或性能要求极高的函数。

6.通过对系统数据结构划分与组织的改进,以及对程序算法的优化来提高空间效率。

7.在多重循环中,应将最忙的循环放在最内层。

8.尽量减少循环嵌套层次。

9.避免循环体内含判断语句,应将循环语句置于判断语句的代码块之中。

10.尽量用乘法或其它方法代替除法,特别是浮点运算中的除法。

九、质量保证

1.在软件设计过程中构筑软件质量。 代码质量保证优先原则

  (1)正确性,指程序要实现设计要求的功能。

  (2)稳定性、安全性,指程序稳定、可靠、安全。

  (3)可测试性,指程序要具有良好的可测试性。

  (4)规范/可读性,指程序书写风格、命名规则等要符合规范。

  (5)全局效率,指软件系统的整体效率。

  (6)局部效率,指某个模块/子模块/函数的本身效率。

  (7)个人表达方式/个人方便性,指个人编程习惯。

2.只引用属于自己的存贮空间。

3.防止引用已经释放的内存空间。

4.过程/函数中分配的内存,在过程/函数退出之前要释放。

5.过程/函数中申请的(为打开文件而使用的)文件句柄,在过程/函数退出前要关闭。

6.防止内存操作越界。

7.时刻注意表达式是否会上溢、下溢。

8.认真处理程序所能遇到的各种出错情况。

9.系统运行之初,要初始化有关变量及运行环境,防止未经初始化的变量被引用。

10.系统运行之初,要对加载到系统中的数据进行一致性检查。

11.严禁随意更改其它模块或系统的有关设置和配置。

12.不能随意改变与其它模块的接口。

13.充分了解系统的接口之后,再使用系统提供的功能。

14.要时刻注意易混淆的操作符。当编完程序后,应从头至尾检查一遍这些操作符。

15.不使用与硬件或操作系统关系很大的语句,而使用建议的标准语句。

16.建议:使用第三方提供的软件开发工具包或控件时,要注意以下几点:

 (1)充分了解应用接口、使用环境及使用时注意事项。

   (2)不能过分相信其正确性。

  (3)除非必要,不要使用不熟悉的第三方工具包与控件。

十、代码编译

1.编写代码时要注意随时保存,并定期备份,防止由于断电、硬盘损坏等原因造成代码丢失。

2.同一项目组内,最好使用相同的编辑器,并使用相同的设置选项。

3.合理地设计软件系统目录,方便开发人员使用。

4.打开编译器的所有告警开关对程序进行编译。

5.在同一项目组或产品组中,要统一编译开关选项。

6.使用工具软件(如Visual SourceSafe)对代码版本进行维护。

十一、代码测试、维护

1.单元测试要求至少达到语句覆盖。

2.单元测试开始要跟踪每一条语句,并观察数据流及变量的变化。

3.清理、整理或优化后的代码要经过审查及测试。

4.代码版本升级要经过严格测试。

相关推荐