程序设计规范报告.docx
《程序设计规范报告.docx》由会员分享,可在线阅读,更多相关《程序设计规范报告.docx(13页珍藏版)》请在冰点文库上搜索。
程序设计规范报告
程序设计规范报告
学院:
信息科学与工程学院
专业:
计算机科学与技术(软件外包)
班级:
计软1304
学号:
20131214
学生姓名:
一、程序设计规范及其示例
1.符号命名规则
符号名包括模块名、常量名、标号名、子程序名等。
这些名字应该能反映它所代表的实际东西,具有一定的意义,使其能够见名知义,有助于对程序功能的理解。
命名采用匈牙利命名法。
规则如下:
(1)所有宏定义、枚举常数和const变量,用大写字母命名。
在复合词里用下划线隔开每个词。
(2)复合词中每个单词的第一个字母大写。
(3)类、类型定义和枚举型名的第一个字母大写。
(4)函数名是复合词的,第一个词采用全部小写,随后每个单词采用第一个字母大写,其它字母小写方式;如果是单个词的,采用全部小写方式。
(5)循环变量可采用i,j,k等,不受上述规则限制。
(6)类的成员变量应采用m_开头。
(7)全局变量词头为g_。
(8)临时变量词头为tmp_。
(9)对结构体内的变量命名,遵循变量的具体含义命名原则
(10)用小写字母的前缀表示变量的类型,前缀的下一个字母用大写。
例:
编写一个简单的图书借阅程序。
structbook
{
charbooknum[20];//编号
charbookname[20];//书名
charpress[20];//出版社
charpresstime[20];//时间
charisborrow[2];//是否被借阅
};
2.名字的长度一般不要过长或过短。
过长的名字会增加工作量,使程序逻辑流程变得模糊;过短的名字无法表达符号的实际意义。
约定长度范围:
3-31。
dypedefstructstudent
{
charsno[10];
charsname[30];
intsage;
structstudent*next;
}stu; //重命名为stu,减少工作量
3.程序注释
3.1程序注释是程序员与日后的程序读者之间通信的重要手段之一,注释分为文件注释、函数注释和功能注释。
3.2正规程序的注释应注意:
——注释行的数量占到整个源程序的1/3到1/2。
3.3文件注释位于整个源程序的最开始部分,注释后空两行开始程序正文。
它包括:
——程序标题。
——目的、功能说明。
——文件作者、最后修改日期等说明。
/*************************************************************** 文件名:
** 创建人:
** 日 期:
** 修改人:
** 日 期:
** 描 述:
** 版 本:
*************************************************************/
4.函数编写应尽可能短小精悍,一般不超过两屏,以便于调试和理解。
5.语句结构
为保证语句结构的清晰和程序的可读性,在编写软件程序时应注意以下几个方面的问题:
——在一行内只写一条语句,并采用空格、空行和移行保证清楚的视觉效果。
——每一个嵌套的函数块,使用一个TAB缩进(可以设定为4个空格),大括号必须放在条件语句的下一行,单独成一行,便于匹对。
错误:
1.if(n==1||n==2)
return1;
2.if(n==1||n==2){
return1;
}
正确的:
if(n==1||n==2)
{
return1;
}
6.程序编写首先应考虑清晰性,不要刻意追求技巧性而使得程序难以理解。
除非对效率有特殊要求,编写程序要作到清晰第一,效率第二。
voidmax(int*x)
{
inti,j,t;
for(j=0;j<9;j++)
{
for(i=0;i<9-j;i++)
if(x[i]{
t=x[i];
x[i]=x[i+1];
x[i+1]=t;
}
}
}
语句嵌套不要超过五层。
7.尽量用公共过程或子程序去代替重复的功能代码段。
要注意,这个代码应具有一个独立的功能,不要只因代码形式一样便将其抽出组成一个公共过程或子程序。
voidmain()
{
intsu;
input(s);
su=max(s);
printf("%s%0.f\n",s[su].name,s[su].sco);
}
intinput(structstu[])
{
for(inti=0;i{
printf("输入人员信息包括学号、姓名、成绩\n");
scanf("%d%s%f",&s[i].num,s[i].name,&s[i].sco);
}
return0;
}
8.使用括号清晰地表达算术表达式和逻辑表达式的运算顺序。
如将x=a*b/c*d写成x=(a*b/c)*d可避免阅读者误解为x=(a*b)/(c*d)。
9.文件之中不得存在无规则的空行,比如说连续十个空行。
一般来讲函数与函数之间的空行为2-3行;在函数体内部,在逻辑上独立的两个函数块可适当空行,一般为1-2行。
10.避免采用过于复杂的条件测试。
二、实用程序设计示例
fun.h
#ifndefFUN_H
#defineFUN_H
structstu
{
charsno[10];
charsname[30];
intsage;
structstu*next;
};
#defineLENsizeof(structstu)
structstu*creat(void);
voidlist(structstu*head);
structstu*del(structstu*head,char*sno);
structstu*insert(structstu*head);
#endif
main.c
#include
#include
#include
#include"fun.h"
intmain()
{
structstu*head=NULL;
charsno[10];
charch='y';
head=creat();//建立链表
list(head);//输出链表
printf("进行结点的删除:
\n");
while(ch=='y')
{
printf("输入要删除的学生的学号\n");
scanf("%s",&sno);
getchar();
head=del(head,sno);
printf("继续删除其他学生的信息请输入'y':
");
ch=getchar();
getchar();
}
printf("删除后的学生的信息\n");
list(head);//链表输出
ch='y';
printf("进行结点插入操作\n");
while(ch=='y')
{
head=insert(head);
printf("继续插入学生信息请输入'y':
\n");
ch=getchar();
getchar();
}
printf("插入后学生的信息\n");
list(head);
return0;
}
creat.c
#include
#include
#include
#include"fun.h"
structstu*creat(void)//链表的建立
{
structstu*head=NULL,*p1,*p2;
inti=1;
charsno[10];
printf("输入第一个学生的学号,回车结束:
\n");
while(gets(sno)!
=NULL&&sno[0]!
='\0')//输入学号,如果学号不为空且输入不为回车
{
p1=(structstu*)malloc(LEN);//开辟一个新单元
strcpy(p1->sno,sno);
printf("输入名字:
\n");
gets(p1->sname);//输入名字
printf("输入年龄:
\n");
scanf("%d",&p1->sage);//输入年龄
p1->next=NULL;
if(head==NULL)
{
head=p1;
}
else
{
p2->next=p1;
}
p2=p1;//使p2指向刚才p1指向的结点
while(getchar()!
='\n');
i++;//用i记录输入的个数
printf("输入第%d个学生的学号,回车结束:
\n",i);
}
returnhead;
}
del.c
#include
#include
#include
#include"fun.h"
structstu*del(structstu*head,char*sno)//链表的删除
{
structstu*p1,*p2=NULL;
if(head==NULL)
printf("此链表为空\n");
else
{
p1=head;//指向第一个结点
while((strcmp(sno,p1->sno)!
=0)&&(p1->next!
=NULL))
{
p2=p1;
p1=p1->next;
}
if(strcmp(sno,p1->sno)==0)//找到结点,删除它
{
if(p1==head)
head=p1->next;
else
p2->next=p1->next;
free(p1);
printf("结点已经删除!
\n");
}
else
printf("链表中不存在该结点\n");
}
returnhead;
}
insert.c
#include
#include
#include
#include"fun.h"
structstu*insert(structstu*head)
{
intsno1;
structstu*p0,*p1,*p2;
p0=(structstu*)malloc(LEN);
p0->next=NULL;
printf("输入学号名字和年龄:
\n");
scanf("%s%s%d",&p0->sno,&p0->sname,&p0->sage);
getchar();
if(head==NULL)
head=p0;
else
{
p1=head;//使p1指向第一个结点
sno1=strcmp(p0->sno,p1->sno);//比较两个字符串的大小
while((sno1>0)&&(p1->next!
=NULL))
{
p2=p1;//使p2指向刚才p1指向的结点
p1=p1->next;//p1后移一个结点
}
if(sno1<=0)
{
if(head==p1)//插到原来第一个结点之前
{
head=p0;
}
else
p2->next=p0;//插到p2指向的结点之后
p0->next=p1;
}
else
p1->next=p0;
}
returnhead;
}
list.c
#include
#include
#include
#include"fun.h"
voidlist(structstu*head)//链表输出
{
structstu*p;
if(head==NULL)//原来的链表是空表
{
printf("itisNULL!
\n");
}
else
{
p=head;
printf("链表的信息为:
\n");
while(p!
=NULL)
{
printf("%s,%s,%d\n",p->sno,p->sname,p->sage);
p=p->next;//后移一个结点
}
}
}
三、总结
规范化程序设计的优点:
1、易维护
采用面向对象思想设计的结构,可读性高,由于继承的存在,即使改变需求,那么维护也只是在局部模块,所以维护起来是非常方便和较低成本的。
2、质量高
在设计时,可重用现有的,在以前的项目的领域中已被测试过的类使系统满足业务需求并具有较高的质量。
3、效率高
在软件开发时,根据设计的需要对现实世界的事物进行抽象,产生类。
使用这样的方法解决问题,接近于日常生活和自然的思考方式,势必提高软件开发的效率和质量。
4、易扩展
由于继承、封装、多态的特性,自然设计出高内聚、低耦合的系统结构,使得系统更灵活、更容易扩展,而且成本较低。