第一篇:代码注释格式
////////////////////////////////////////////////////////////////////////// //函数名称: WriteFile //函数功能: 向加密锁创建文件,并且向文件中写入数据,注意写入的数据不宜过大,最好少于2k为最佳 //参数说明: fileSize: 文件的大小,以字节为单位 // fileID: 文件在加密锁中的ID, // fileName: 文件在加密锁中的名字 // fileContent: 文件内容
//返 回 值: 如果写入文件成功,则返回true,如果写入文件失败,则返回false.//作 者: luyao ///////////////////////////////////////////////////////////////
第二篇:JAVA代码注释规范
JAVA代码注释规范
一、规范存在的意义
1.好的注释规范可以让人一眼看明白这是干什么的,特别是对于我们这种行业;共同合作完成一个项目需要分工明确,所以也需要有明了的注释规范。
2.正确的应用注释规范可以增加代码的可读性、理解性。3.好的代码规范可以提高团队的开发效率,从而节省时间。4.长期的坚持代码规范可以让程序员养成一个良好的习惯,甚至锻炼出思维。
二、命名规范
1.一般概念
1)尽量使用完整的英文描述。2)采用相对好理解的术语。
3)采用骆驼命名的规范使名字增加可读性。4)尽量少用缩写提高可读性。5)避免名字过长。
6)避免使用类似的名字。7)避免使用特殊符号。2.主要的运用
1)类(class)的命名
2)接口(interface)的命名 +方法(method)的命名 3)参数(param)的命名
三、注释规范
1.一般概念
1)注释应该增加代码的清晰度 2)保持代码的整洁
3)在写代码之前或同时注意写上注释
4)注释出为什么做这件事,做这件事的结果 2.注释那些部分
1)java文件:版权信息、创建时间、创建人 2)类:目的、所完成功能、版权信息、创建人 3)方法:参数含义、返回值 4)属性:字段描述
5)接口:目的、创建人、版本号、创建时间
四、代码格式规范
1.单行注释://注释内容,一般与代码后空4-8格,注释必须对齐 2.块状注释:/*注释内容*/,一般是注释从以/*开始,以*/结束中的所有内容。3.文档注释:/**......*/所以注释文 档必须书写在类、域、构造函数、方法,以及字段(field)定义之前.注释文档由两部分组成——描述、块标记。4.javadoc注释标签
@author 对类的说明 标明开发该类模块的作者
@version 对类的说明 标明该类模块的版本
@see 对类、属性、方法的说明 参考转向,也就是相关主题
@param 对方法的说明 对方法中某参数的说明
@return 对方法的说明 对方法返回值的说明
@exception 对方法的说明 对方法可能抛出的异常进行说明
五、java注释具体实现
1.源文件注释
/** *文件名 *创建人 *创建时间 *修改人 *描述 *版本号 */ 2.类注释
/** *对此类的描述信息 *创建人 *版本号 *创建时间 */ 3.方法的注释
/** *方法的用处 *该方法的参数列 *该方法返回的值 */ 4.属性的注释
/** *字段的描述 */ 5.接口注释
/** *对此接口的描述 *创建人 *创建时间 *版本号 */ 6.构造方法注释
/** *描述该构造方法的用处 *该构造方法的参数列 *参数的类型 */
六、Jsp代码格式规范
1.多行注释:,一般是注释从以结束中的所有内容。
2.文本注释:<%--内容--%>,主要是对该页面的一些描述,目的、创建人、创建时间、版本号、文件名、备注、修改人等.例如: <%---创建人-创建时间-版本号-文件名-备注-修改人--%> 3.伪劣标签注释:<% java语句块 %> 例如: <% JAVA代码块 %> 4.单行注释://注释内容,一般与代码后空4-8格,注释必须对齐
七、JS代码格式规范
1.文本注释:/** 注释内容 **/,主要是对该页面的一些描述,目的、创建人、创建时间、版本号、文件名、备注、修改人等.也可以用于注释代码块。例如: /** *创建人 *创建时间 *版本号 *文件名 *备注 *修改人 **/
2.文本注释:/** 内容 */ ,主要是对该页面的一些描述,目的、创建人、创建时间、版本号、文件名、备注、修改人等.也可以用于注释代码块。例如: /** *创建人 *创建时间 *版本号 *文件名 *备注 *修改人 */ 3.单行注释: //注释内容,一般与代码后空4-8格,注释必须对齐 4.多行注释: /* 注释内容 */,一般是注释从以/* 开始,以*/结束中的所有内容。
八、JS注释具体实现 1.文件注释
/** *对此文件的描述信息 *创建人 *版本号 *创建时间 */ 2.方法的注释
/** *方法的用处 *该方法的参数列 *该方法返回的值 */ 3.模块的注释
/** *模块名称
*模块的用处
*/
第三篇:数据结构课设(完整代码可直接运行)附注释
#include
ERROR
0//定义字符常量error #define
OK
1//定义字符常量OK #define INFINITY
INT_MAX//INT_MAX是系统库中定义的无穷大常量,即2个字节所能表示的最大数
#define MAX_VERTEX_NUM
21//定义图、网的最大定点数为21 #define STACK_INIT_SIZE
100//定义栈的容量
#define STACKINCREAMENT
10//定义栈的每次增长量 #define MAX_INT 10000 //无穷大 typedef int AdjType;typedef struct{ int pi[MAX_VERTEX_NUM];//存放v到vi的一条最短路径 int end;}PathType;typedef char VType;//设顶点为字符类型
typedef enum{DG,UDG,DN,UDN}GraphKind;//定义图、网的枚举常量
/*················· 邻接矩阵····················*/ typedef struct ArcCell {
int
adj;
//弧的权值
//infotype
*info;}ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedef struct{
char vexs[MAX_VERTEX_NUM];//存储顶点的数组
AdjMatrix arcs;//存储邻接矩阵的二维数组
int
vexnum,arcnum;//顶点数和弧数
GraphKind kind;//链接矩阵的类型
}MGraph;
/*················· 邻接表····················*/ typedef struct ArcNode{
int
adjvex;//与首节点关联的顶点
int
quan;//该顶点的权值
struct ArcNode
*nextarc;//指向下一个节点的指针
}ArcNode,*AList;typedef struct VNode {
char
data;//链表的各顶点
AList
firstarc;//链表的首节点 }VNode,AdjList[MAX_VERTEX_NUM];typedef struct{
AdjList
vertices;//存储链接表的各顶点
int
vexnum,arcnum;//顶点书和弧数
GraphKind
kind;//链接表的类型 }ALGraph;
/*················· 队列····················*/ typedef struct QNode{ char
data;//队列中元素数据
struct QNode
*next;//指向下一元素的指针 }QNode,*QueuePre;typedef struct{ QueuePre
front;//队首指针
QueuePre
rear;//队尾指针 }LinkQueue;
/*················· 栈····················*/ typedef struct { int
*base;//栈底指针
int
*top;//栈首指针
int
stacksize;//栈的大小 }SqStack;
/*················· 求最小生成树中的辅助数组··········*/ typedef struct { char
adjvex;//最小生成树的节点
int
lowcost;//到该节点的最小权值开销 }closedges[MAX_VERTEX_NUM];
int option;
//图的类型标识符 int visited[MAX_VERTEX_NUM];
//顶点访问标记数组 int indegree[MAX_VERTEX_NUM];//顶点入度记录数组 int ve[MAX_VERTEX_NUM];
//顶点权值记录数组
/*················· 链接矩阵类型设置··········*/ int SetGraphKind(MGraph &G,int option){
switch(option){
case 1: G.kind=DG;break;
case 2: G.kind=UDG;break;
case 3: G.kind=DN;break;
case 4: G.kind=UDN;break;
default: return ERROR;
}
return OK;}
/*················· 邻接表类型设置··········*/ int SetGraphKind(ALGraph &G,int option){
switch(option){
case 1: G.kind=DG;break;
case 2: G.kind=UDG;break;
case 3: G.kind=DN;break;
case 4: G.kind=UDN;break;
default: return ERROR;
}
return OK;}
/*················· 邻接矩阵顶点定位 ·················将顶点V代入,查询顶点存储数组,返回其数组下标 ··········*/ int LocateVex(MGraph G,char v){
int m;
for(m=1;m<=G.vexnum;m++){
if(G.vexs[m]==v)return m;
}
printf(“您输入的顶点不存在”);
return ERROR;}
/*················· 邻接表顶点定位 ·················将顶点V代入,查询顶点存储数组,返回其数组下标 ··········*/ int LocateVex(ALGraph G,char v){
int m;
for(m=1;m<=G.vexnum;m++){
if(G.vertices[m].data==v)return m;
}
printf(“您输入的顶点不存在”);
return ERROR;
}
/*················· 队列创建··········*/ int InitQueue(LinkQueue &Q){ Q.front=Q.rear=(QueuePre)malloc(sizeof(QNode));//申请存储空间,队首队尾指向同一位置
if(!Q.front)return ERROR;Q.front->next=NULL;return OK;}
/*················· 元素入队··········*/ int EnQueue(LinkQueue &Q,int e){ QueuePre p;p=(QueuePre)malloc(sizeof(QNode));if(!p)return OK;p->data=e;p->next=NULL;Q.rear->next=p;Q.rear=p;return OK;}
/*················· 元素出队··········*/ int DeQueue(LinkQueue &Q,int &e){ QueuePre p;if(Q.front==Q.rear)return ERROR;p=Q.front->next;e=p->data;Q.front->next=p->next;if(Q.rear==p)Q.rear=Q.front;free(p);return OK;}
/*················· 判断队列是否为空··········*/ int QueueEmpty(LinkQueue Q){ if(Q.front==Q.rear)
return OK;return ERROR;}
/*················· 栈的创建··········*/ int InitStack(SqStack &S){ S.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));if(!S.base)return ERROR;S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;}
/*················· //元素入栈··········*/ int Push(SqStack &S,int e){ if(S.top-S.base>=S.stacksize){
S.base=(int*)realloc(S.base,(S.stacksize+STACKINCREAMENT)*sizeof(int));
if(!S.base)return ERROR;
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREAMENT;} *S.top++=e;return OK;}
/*················· 元素出栈··········*/ int Pop(SqStack &S,int &e){ if(S.top==S.base)return ERROR;
e=*--S.top;return OK;}
/*················· 判断栈是否为空··········*/ int StackEmpty(SqStack S){ if(S.top==S.base)return OK;return ERROR;}
/*················· 创建邻接矩阵··········*/ int CreatGraph(MGraph &G){
int i,j,k,w;char x,y;
if(!SetGraphKind(G,option)){printf(“对图类型的设置失败”);return ERROR;}//设置链接矩阵类型
printf(“邻接矩阵:请输入定点的个数、弧的个数:”);
scanf(“%d %d”,&G.vexnum,&G.arcnum);
if(G.vexnum>20){
printf(“您输入的顶点个数超过最大值”);
return ERROR;
}//if
printf(“请输入%d个顶点n”,G.vexnum);
for(i=1;i<=G.vexnum;++i){//输入矩阵的各顶点
fflush(stdin);//清除缓存,略过
scanf(“%c”,&G.vexs[i]);
}//for
if(G.kind==DG||G.kind==UDG){//1.有向图和无向图的矩阵创建
for(i=1;i<=G.vexnum;i++)//矩阵初始化
for(j=1;j<=G.vexnum;j++)
G.arcs[i][j].adj=0;
if(G.kind==DG){//2.有向图
printf(“请输入有向图的两个相邻的顶点
for(k=1;k<=G.arcnum;k++){//循环输入
fflush(stdin);
scanf(“%c%c”,&x,&y);//输入矩阵中弧关联的两顶点
i=LocateVex(G,x);j=LocateVex(G,y);//将两顶点转换成顶点存储数组的下标
G.arcs[i][j].adj=1;
}//for
}//2.if
else{//2.无向图
printf(“请输入无向图的两个相邻的顶点(x,y):n”);
for(k=1;k<=G.arcnum;k++){fflush(stdin);
scanf(“%c%c”,&x,&y);
i=LocateVex(G,x);j=LocateVex(G,y);
G.arcs[i][j].adj=1;G.arcs[j][i].adj=G.arcs[i][j].adj;//反向关联两顶点
}//for
}//2.else
}//1.if
else{//1.有向网和无向网
for(i=1;i<=G.vexnum;i++)
for(j=1;j<=G.vexnum;j++)
G.arcs[i][j].adj=INT_MAX;//矩阵初始化
if(G.kind==DN){ //3.有向网
printf(“请输入有向网的两个相邻的顶点
for(k=1;k<=G.arcnum;k++){fflush(stdin);
scanf(“%c%c %d”,&x,&y,&w);
i=LocateVex(G,x);j=LocateVex(G,y);
G.arcs[i][j].adj=w;
}//for
}//3.if
else{//3
printf(“请输入无向网的两个相邻的顶点(x,y)以及相应的权值w:n”);
for(k=1;k<=G.arcnum;k++){fflush(stdin);
scanf(“%c%c %d”,&x,&y,&w);
i=LocateVex(G,x);j=LocateVex(G,y);
G.arcs[i][j].adj=w;G.arcs[j][i].adj=G.arcs[i][j].adj;//逆向关联
}//for
}//3.else
}
return OK;}
/*··············在邻接表中插入节点··· ··········*/ int setList(int x,int y,ALGraph &G,int key[]){
int i,j,m,n;AList p,q;
m=LocateVex(G,x);//获取节点x对应的数组下标
n=LocateVex(G,y);
p=G.vertices[m].firstarc;//获取第m个链表的首节点
q=(AList)malloc(sizeof(ArcNode));//申请节点空间
if(!q)return ERROR;
q->nextarc=NULL;
q->adjvex=n;
while(key[m]&&p->nextarc){//key存储着该链表的长度,当其不为零时在首节点后插入新节点
p=p->nextarc;
key[m]++;//链表长度加1
}
if(!key[m]){G.vertices[m].firstarc=q;key[m]++;}//当链表长度为零时,新节点为首节点
else p->nextarc=q;
return 1;}
/*················· 创建邻接表··········*/ int CreatAList(ALGraph &G){ int i,j,m,n,key[MAX_VERTEX_NUM];char x,y,w;AList p,q;SetGraphKind(G,option);printf(“邻接表:请输入顶点的个数和弧的个数:”);scanf(“%d %d”,&G.vexnum ,&G.arcnum);if(G.vexnum>20){
printf(“您输入的顶点个数超过最大值”);
return ERROR;
} printf(“请输入个顶点:n”);for(i=1;i<=G.vexnum;i++){
fflush(stdin);
scanf(“%c”,&G.vertices[i].data);
G.vertices[i].firstarc=NULL;
key[i]=0;} if(G.kind==DG){//有向图
printf(“请输入弧(如AB,其中AB与BA是不同的弧):n”);
for(j=1;j<=G.arcnum;j++){
fflush(stdin);
scanf(“%c%c”,&x,&y);//输入弧的两顶点
m=LocateVex(G,x);//将两顶点转换成数组下标
n=LocateVex(G,y);
p=G.vertices[m].firstarc;//获取第m个链表的首节点,及以第m个顶点为首节点的链表
q=(AList)malloc(sizeof(ArcNode));//申请节点存储空间
if(!q)return ERROR;
q->nextarc=NULL;
q->adjvex=n;
while(key[m]&&p->nextarc){//链表长度不为零,且下一个节点存在时,在首节点后插入新节点
p=p->nextarc;
key[m]++;
}
if(!key[m]){G.vertices[m].firstarc=q;key[m]++;}//链表长度为零时,新节点为首节点
else p->nextarc=q;
} } if(G.kind==UDG){
printf(“请输入弧(如AB,其中AB与BA是不同的弧):n”);
for(j=1;j<=G.arcnum;j++){
fflush(stdin);
scanf(“%c%c”,&x,&y);
setList(x,y,G,key);
setList(y,x,G,key);
} }
if(G.kind==DN){
printf(“请输入依次输入弧以及这条弧的权值(如AB 8,其中AB与BA是不同的弧):n”);
for(j=1;j<=G.arcnum;j++){
fflush(stdin);
scanf(“%c%c %d”,&x,&y,&w);
m=LocateVex(G,x);
n=LocateVex(G,y);
p=G.vertices[m].firstarc;
q=(AList)malloc(sizeof(ArcNode));
if(!q)return ERROR;
q->nextarc=NULL;
q->quan=w;
q->adjvex=n;
while(key[m]&&p->nextarc){
p=p->nextarc;
key[m]++;
}
if(!key[m]){G.vertices[m].firstarc=q;key[m]++;}
else p->nextarc=q;
} } if(G.kind==UDN){
printf(“无向网请输入依次输入弧以及这条弧的权值(如AB 8,其中AB与BA是不同的弧):n”);
for(j=1;j<=G.arcnum;j++){
fflush(stdin);
scanf(“%c%c %d”,&x,&y,&w);
m=LocateVex(G,x);
n=LocateVex(G,y);
p=G.vertices[m].firstarc;
q=(AList)malloc(sizeof(ArcNode));
if(!q)return ERROR;
q->nextarc=NULL;
q->quan=w;
q->adjvex=n;
while(key[m]&&p->nextarc){
p=p->nextarc;
key[m]++;
}
if(!key[m]){G.vertices[m].firstarc=q;key[m]++;}
else p->nextarc=q;
int temp;
temp=m;
m=n;
n=temp;
p=G.vertices[m].firstarc;
q=(AList)malloc(sizeof(ArcNode));
if(!q)return ERROR;
q->nextarc=NULL;
q->quan=w;
q->adjvex=n;
while(key[m]&&p->nextarc){
p=p->nextarc;
key[m]++;
}
if(!key[m]){G.vertices[m].firstarc=q;key[m]++;}
else p->nextarc=q;
} } return OK;}
/*················· 判断以第v个顶点为首节点的链表是否存在··········*/ int FirstAdjVex(ALGraph G,int v){ if(G.vertices[v].firstarc)
} return G.vertices[v].firstarc->adjvex;//存在则返回首节点 return 0;/*················· 获取以第v个顶点为首节点的链表中的节点w的子节点··········*/ int NextAdjVex(ALGraph G,int v,int w){ AList s;s=G.vertices[v].firstarc;//获取链表的首节点v while(s->adjvex!=w)//当节点不是w时,指针后移直到找到节点w或到达最后一个节点
s=s->nextarc;if(s->nextarc)//跳出循环后,节点不为空,则表明找到了节点w,否则表示已至链表最后一个节点
return s->nextarc->adjvex;return 0;}
/*················· 遍历节点v的叶子节点··········*/ void DFS(ALGraph G,int v){ int w;visited[v]=1;printf(“%c ”,G.vertices[v]);//输出第v个顶点,并标记为已访问
for(w=FirstAdjVex(G,v);w>=1;w=NextAdjVex(G,v,w)){//遍历第v个顶点的子节点,并递归遍历子节点的子节点
if(!visited[w])DFS(G,w);
} }
/*················· 图的深度优先遍历··········*/ void DFSTraverse(ALGraph G){ int v;visited[0]=1;//数组的存储是从1开始的,数组【0】不使用
for(v=1;v<=G.vexnum;v++)visited[v]=0;//初始化各顶点的访问状态为未访问
for(v=1;v<=G.vexnum;v++)
if(!visited[v])DFS(G,v);//从第一个顶点开始遍历 }
/*················· 图的广度优先遍历··········*/ void BFSTraverse(ALGraph G){ int v,w,u;LinkQueue Q;for(v=1;v<=G.vexnum;v++)visited[v]=0;//初始化各顶点为未访问
visited[0]=1;//数组的存储是从1开始的,数组【0】不使用
InitQueue(Q);//创建队列
for(v=1;v<=G.vexnum;v++)//从第一个顶点开始遍历
if(!visited[v]){
visited[v]=1;
printf(“%c ”,G.vertices[v]);
EnQueue(Q,v);//将该顶点标记为已访问,输出,并加入到队列中
while(!QueueEmpty(Q)){//遍历队列中顶点的所有子节点
DeQueue(Q,u);//获取队首的顶点,赋值给U
for(w=FirstAdjVex(G,u);w>=1;w=NextAdjVex(G,u,w)){//遍历顶点U所有未访问的子节点
if(!visited[w]){
visited[w]=1;
printf(“%c ”,G.vertices[w]);
EnQueue(Q,w);//将子节点加入队列,以便遍历子节点的子节点
}//if
else break;
}//for
}//while }//if }
/*················· 计算各顶点入度··········*/ void FindInDegree(ALGraph G,int in[]){ int i,j,k;AList p;for(k=1;k<=G.vexnum;k++)in[k]=0;//初始化各顶点入度为0 for(i=1;i<=G.vexnum;i++){
p=G.vertices[i].firstarc;//获取个链表的首节点
while(p){//遍历链表的子节点
j=p->adjvex;//获取子节点
in[j]++;//子节点的入度加1
in[i]++;
p=p->nextarc;//指向下一子节点
} } }
/*················· 拓扑排序(打印输出)··········*/ int TopologicalSort(ALGraph G){ int i,k,count;AList p;SqStack S;
FindInDegree(G,indegree);//计算各顶点入度 InitStack(S);//创建栈 for(i=1;i<=G.vexnum;i++)
if(!indegree[i])Push(S,i);//寻找入度为0的点,并加入到栈中 count=0;//输出的顶点个数
if(StackEmpty(S))printf(“此有向图不符合条件!”);while(!StackEmpty(S)){
Pop(S,i);//从栈中取出顶点开始输出
printf(“%c ”,G.vertices[i].data);
++count;//输出的顶点个数加1
for(p=G.vertices[i].firstarc;p;p=p->nextarc){//将顶点i的子节点的入度减1
k=p->adjvex;
if(!(--indegree[k]))Push(S,k);//如子节点的入度减为0,则入栈
}
}
if(count<=G.vexnum)return ERROR;
else return OK;}
/*················· 求最小生成树··········*/ int Minimum(MGraph G,closedges m){ int i,j,min=INFINITY;for(i=1;i<=G.vexnum;i++){//从待选的可达集合中选取一条代价最小的边
if(m[i].lowcost){//到顶点i可达时执行,即到顶点的权值不为0
if(m[i].lowcost min=m[i].lowcost; j=i; } } } return j;} /*················· 最小生成树(普里姆算法实现)··········*/ void MinSpanTree_PRIM(MGraph G,char u){ int i,j,k;closedges closedge; k=LocateVex(G,u);//获取初始顶点对应的数组下标 for(j=1;j<=G.vexnum;j++)//初始化辅助数组,计算从初始顶点到各顶点的最小代价 if(j!=k){ } closedge[j].adjvex=u;//u是已连通的顶点,表示该顶点J是同那个顶点连在一起 closedge[j].lowcost=G.arcs[k][j].adj; closedge[k].lowcost=0;//顶点k到自身的最小代价设为0,即该顶点已加入最小生成树中 for(i=2;i<=G.vexnum;i++){ k=Minimum(G,closedge);//获取最小代价边连通的顶点 printf(“%c%c ”,closedge[k].adjvex,G.vexs[k]);//输出最小生成树的弧 closedge[k].lowcost=0;//该顶点已加入最小生成树中 for(j=1;j<=G.vexnum;j++)//将顶点k代入重新计算到待连通顶点的最小代价 if(G.arcs[k][j].adj closedge[j].adjvex=G.vexs[k]; closedge[j].lowcost=G.arcs[k][j].adj; } } } /*················· 对链表进行拓扑排序,并存储在栈中··········*/ int TopologicalOrder(ALGraph G,SqStack &T){ int i,j,k,count;SqStack S; AList p;FindInDegree(G,indegree);InitStack(S); for(i=1;i<=G.vexnum;i++)if(!indegree[i])Push(S,i);InitStack(T);count=1;for(i=1;i<=G.vexnum;i++)ve[i]=0;//初始化到达各顶点的总权值花销为0 while(!StackEmpty(S)){ Pop(S,j);Push(T,j);++count; for(p=G.vertices[j].firstarc;p;p=p->nextarc){ k=p->adjvex; if(--indegree[k]==0)Push(S,k); if(ve[j]+p->quan>ve[k])ve[k]=ve[j]+p->quan;//顶点J的子节点K的总权值=顶点j的权值花销+弧的权值,即该顶点的最早发生时间 } } if(count<=G.vexnum)return ERROR;else return OK;} /*················· 关键路径 int j 指向顶点的数组下标 int k 被指向顶点的数组下标标 int ee 最早发生时间 int el 最晚发生时间 int dut 事件持续时间 char tag 关键路径标识符,*表示该弧为关键路径 SqStack T 堆 Alist p 链表的节点 int v1[MAX_VERTEX_NUM] 顶点权值记录数组,及该顶点的最早发生时间 ··········*/ int CriticalPath(ALGraph G){ int i,j,k,ee,el,dut,v1[MAX_VERTEX_NUM];SqStack T;AList p;char tag;int str[10];int count=0;//声明一个数组来存放关键路径的各个节点,count表示当前数组使用长度,也可理解为下一节点的存放位置 if(!TopologicalOrder(G,T))return ERROR;//按拓扑排序将各顶点依次入栈 for(i=1;i<=G.vexnum;i++){//初始化各顶点的权值为最后一个顶点的总权值花销,即工程的总时间花销 v1[i]=ve[G.vexnum];} while(!StackEmpty(T))//按拓扑顺序出栈,分别计算各顶点的最晚发生时间 for(Pop(T,j),p=G.vertices[j].firstarc;p;p=p->nextarc){ k=p->adjvex;dut=p->quan; if(v1[k]-dut } for(j=1;j<=G.vexnum;j++)//循环代入所有顶点,遍历其子节点,根据弧的权值,得到最早发生时间和最晚发生时间,并判断该弧是否为关键路径 for(p=G.vertices[j].firstarc;p;p=p->nextarc){ k=p->adjvex;dut=p->quan; ee=ve[j];el=v1[k]-dut; tag=(ee==el)?'*':' '; printf(“%d %d %d %d %d %cn”,j,k,dut,ee,el,tag); } /* 下面为非必需代码,功能为输出关键路径*/ if(count==0)//存储关键路径的第一个节点(第一个链接表的首节点—— str[count++]=j;if(tag=='*')//如果该弧为关键路径,则将该弧的被指向顶点存储到str中 { str[count++]=k;} for(int n=0;n printf(“%d”,str[n]); printf(“->”); } return OK;} //求关键路径 //Dijkstra算法 //求G(用邻接矩阵表示)中源点v到其他各顶点最短路径,n为G中顶点数 void Dijkstra(MGraph * G,PathType path[],int dist[],int v,int n){ int i,j,count,s[MAX_VERTEX_NUM],max,u;//s[n]用来标志源点到某顶点的最短路径是否求出 for(i=1;i<=n;i++){//1.初始化 s[i]=0;if(G->arcs[v][i].adj!=INFINITY)dist[i]=G->arcs[v][i].adj;else dist[i]=MAX_INT;//v到其他顶点的权为当前最短路径,送dist[i] path[i].pi[0]=v;path[i].end=0;} dist[v]=0;s[v]=1;//源点到源点本身的最短路径求出 count=1; while(count<=n-1){//求n-1条最短路径 max=MAX_INT;// MAX_INT为无穷大值,需要实际情况设置 for(j=1;j<=n;j++){//2.找当前最短路径长度 if(s[j]==0&&dist[j] if(max==MAX_INT)break;//最短路径求完(不足n-1)条,跳出while循环 s[u]=1;//表示V到Vu最短路径求出 path[u].end++;path[u].pi[path[u].end]=u;for(j=1;j<=n;j++){//3.u求出后,修改dist和path向量,执行完后返回2,知道跳出循环 if(s[j]==0&&dist[j]>dist[u]+G->arcs[u][j].adj&&G->arcs[u][j].adj!=INFINITY){ dist[j]=dist[u]+G->arcs[u][j].adj;path[j]=path[u];} } count++;} } /*················· 有向图的功能操作界面··········*/ void DG_(MGraph G1,ALGraph G2){ int i,j,k,m,key;AList s;char x,y; for(k=0;;){ key=0;system(“cls”);//清空显示 printf(“**************************n”); printf(“你选择了对有向图的基本操作及应用:n1创建邻接矩阵n2创建邻接表n3拓扑结构n4退出n”); printf(“**************************n”); printf(“请选择:”); scanf(“%d”,&m); switch(m){ case 1: CreatGraph(G1);printf(“有向图的邻接矩阵:n”); for(i=1;i<=G1.vexnum;i++){//输出邻接矩阵 for(j=1;j<=G1.vexnum;j++){ printf(“ %d”,G1.arcs[i][j].adj); } printf(“n”); }break; case 2: CreatAList(G2);printf(“有向图的邻接表:n”); for(i=1;i<=G2.vexnum;i++){//输出链接表 printf(“%c:”,G2.vertices[i]); s=G2.vertices[i].firstarc; while(s){ j=s->adjvex;fflush(stdin); printf(“<%c ”,G2.vertices[i]); printf(“%c> ”,G2.vertices[j]); s=s->nextarc; } printf(“n”); }break; case 3:printf(“有向图的拓扑排序:n”);TopologicalSort(G2);break;case 4:key=1;break;} printf(“n”); if(key)break;//跳出循环,返回上一层 system(“pause”);//暂停程序执行,直到监听到操作 } printf(“nn”);} //DG /*················· 有向网的功能操作界面··········*/ void DN_(MGraph G1,ALGraph G2){ int i,j,k,m,key;AList s; for(k=0;;){ key=0; system(“cls”); printf(“**************************n”); printf(“你选择了对有向网的基本操作及应用:n1创建邻接矩阵n2创建邻接表n3关键路径n4最短路径n5退出n”); printf(“**************************n”); printf(“请选择:”); scanf(“%d”,&m); switch(m){ case 1: CreatGraph(G1);printf(“有向网的邻接矩阵:n”); for(i=1;i<=G1.vexnum;i++){ for(j=1;j<=G1.vexnum;j++){ if(G1.arcs[i][j].adj==INT_MAX)printf(“ ∞”); else printf(“ %d”,G1.arcs[i][j].adj); } printf(“n”); }break; case 2: CreatAList(G2);printf(“有向网的邻接表:n”); for(i=1;i<=G2.vexnum;i++){ printf(“%c:”,G2.vertices[i]); s=G2.vertices[i].firstarc; while(s){ j=s->adjvex;fflush(stdin); printf(“<%c ”,G2.vertices[i]); printf(“%c> ”,G2.vertices[j]); printf(“ %d ”,s->quan); s=s->nextarc; } printf(“n”); }break; case 3: printf(“有向网关键路径:n”);CriticalPath(G2);break; case 4: {int i,j,v,count=0;//v为起点,n为顶点个数 char c; PathType path[MAX_VERTEX_NUM];//v到各顶点的最短路径向量 int dist[MAX_VERTEX_NUM];//v到各顶点最短路径长度向量 printf(“请输入最短路径起点:”); fflush(stdin); scanf(“%c”,&c); v=LocateVex(G1,c); Dijkstra(&G1,path,dist,v,G1.vexnum); for(i=1;i<=G1.vexnum;i++){ if(dist[i]!=0&&dist[i]!=MAX_INT) { printf(“%c到%c的最短路径:”,G1.vexs[v],G1.vexs[i]); for(j=0;j<=path[i].end;j++){ printf(“%c ”,G1.vexs[path[i].pi[j]]); } printf(“n”); printf(“最短路径长度:%d”,dist[i]);//输出为MAX_INT则表示两点间无路径 printf(“n”); } else count++; } if(count==G1.vexnum)printf(“该顶点无出度!”); break;} case 5:key=1;break; }printf(“n”); if(key)break;system(“pause”);} printf(“nn”);} //DN /*················· 无向图的功能操作界面··········*/ void UDG_(MGraph G1,ALGraph G2){ int i,j,k,m,key;AList s; for(k=0;;){ key=0; system(“cls”); printf(“**************************n”); printf(“你选择了对无向图的基本操作及应用:n1创建邻接矩阵n2创建邻接表n3深度遍历n4广度遍历n5退出n”); printf(“**************************n”); printf(“请选择:”); scanf(“%d”,&m); switch(m){ case 1:CreatGraph(G1);printf(“无向图的邻接矩阵:n”); for(i=1;i<=G1.vexnum;i++){ for(j=1;j<=G1.vexnum;j++){ printf(“ %d”,G1.arcs[i][j].adj); } printf(“n”); }break; case 2: CreatAList(G2);printf(“无向图的邻接表:n”); for(i=1;i<=G2.vexnum;i++){ printf(“%c:”,G2.vertices[i]); s=G2.vertices[i].firstarc; while(s){ j=s->adjvex;fflush(stdin); printf(“(%c ”,G2.vertices[i]); printf(“%c)”,G2.vertices[j]); s=s->nextarc; } printf(“n”); }break; case 3: printf(“无向图的深度优先遍历:n”);DFSTraverse(G2);printf(“n”);break; case 4: printf(“无向图的广度优先遍历:n”);BFSTraverse(G2);break; case 5: key=1;break; }printf(“n”); if(key)break; system(“pause”);} printf(“nn”);} //UDG /*················· 无向网的功能操作界面··········*/ void UDN_(MGraph G1,ALGraph G2){ int i,j,m,k,key;AList s;char u; for(k=0;;){ key=0; system(“cls”); printf(“**********************************n”); printf(“你选择了对无向网的基本操作及应用:n1创建邻接矩阵n2创建邻接表n3最小生成树n4退出n”); printf(“**********************************n”); printf(“请选择:”); scanf(“%d”,&m); switch(m){ case 1: CreatGraph(G1);printf(“无向网的邻接矩阵:n”); for(i=1;i<=G1.vexnum;i++){ for(j=1;j<=G1.vexnum;j++){ if(G1.arcs[i][j].adj==INT_MAX)printf(“ ∞”); else printf(“ %d”,G1.arcs[i][j].adj); } printf(“n”); }break; case 2: CreatAList(G2);printf(“无向网的邻接表:n”); for(i=1;i<=G2.vexnum;i++){ printf(“%c:”,G2.vertices[i]); s=G2.vertices[i].firstarc; while(s){ j=s->adjvex;fflush(stdin); printf(“(%c ”,G2.vertices[i]); printf(“%c)”,G2.vertices[j]); printf(“ %d ”,s->quan); s=s->nextarc; } printf(“n”); }break; case 3: printf(“请输入第一个顶点:”); fflush(stdin); scanf(“%c”,&u); printf(“无向网的最小生成树:n”); MinSpanTree_PRIM(G1,u);break; case 4: key=1;break; }printf(“n”); if(key)break; system(“pause”);} printf(“nn”);} //UDN /*················· 首界面··········*/ void main(){ MGraph G1; ALGraph G2;int i,n;for(i=0;;){ n=0; system(“cls”); printf(“n”); printf(“**************图的基本操作及应用***************n1:有向图的基本操作及应用n2:无向图的基本操作及应用n3:有向网的基本操作及应用n4:无向网的基本操作及应用n5: 退出n”); printf(“********************************n”); printf(“请选择:”); scanf(“%d”,&option); printf(“nn”); switch(option){ case 1: DG_(G1,G2);break; case 2: UDG_(G1,G2);break; case 3: DN_(G1,G2);break; case 4: UDN_(G1,G2);break; case 5: n=1;break; default: printf(“你输入的编码有误!”);break; } if(n)break; printf(“nn”);} } 一、中文专著、学位论文、学术报告 序号、作者.文献题名.版本.出版地:出版者,出版年:起止页码。例如: 1、刘少奇.论共产党员的修养.修订2版.北京:人民出版社,1962:50。 2、张三.物权立法的本土资源研究.<博士论文>.北京:中国人民大学,2008:27-28。 二、中文期刊文章 序号、作者.文献题名.刊名,年,卷(期):起止页码。 例如: 3、李国海.论反垄断法制裁手段及其范围.中南大学学报(社会科学版),2005(2):193-198。 三、中文专著及论文集中的析出文献 序号、析出文献主要责任者.析出文献题名.载:原文献主要责任者.原文献题名.版本.出版地:出版者,出版年:析出文献起止页码 例如: 4、张光斗.也谈21世纪高等工程教育的改革.见:林功实.立足国内培养跨世纪研究生.北京:北京理工大学出版社,1996:105~110。 四、电子文献 序号、主要责任者.电子文献题名.电子文献的出处或可获得地址,发表或更新日期/引用日期(任选)。 5、王明亮.关于中国学术期刊标准化数据库系统工程的进展.http://,1998-10-04 五、外文文献 所引用语种通常注释体例。例如: 6、Scholkopf B, Smola,A.Learning with Kernels.Cambridge: MIT Press, 2002 注释格式如下: 引自期刊: ① 作者 : 《题名》,《刊名》,××××年第 ×期,第 × 页 引自专著: ② 作者 : 《书名》,出版者及×××× 年版,第 × 页 引自报纸: ③ 作者 : 《题名》,《报纸名》年-月-日(版次)参考文献著录格式如下: 引自期刊:[ 1] 作者(所有作者全列—下同).题名[ J].刊名 , 出刊年 ,卷(期): 起止页码.引自专著:[2] 作者.书名[ M].版次(初版不写).译者(指译著, 所有译者全列).出版地 : 出版者 , 出版年.页码.引自报纸:[3] 作者.题名[ N].报纸名 , 年-月-日(版次).引自论文集:[4] 作者.题名[ A].见 : 论文集编者.文集名[ C].出版地 : 出版者 , 出版年 部门代码 总经理:GMD 行政人事部:AD 技术部:TD 发展部:RDD 宣传部:PD 策划部:SD 工程部:ED 造价部:EC 财务部:ACD 投融资部:FD 战略计划部:SPD 招标合约部:BCD 审计部:ADD 招商部:MD 研究院:RI 物业部:PD 后勤部:LD 资源管理部:RD第四篇:注释格式
第五篇:部门代码