大学生成绩管理系统课程设计程序代码.docx
《大学生成绩管理系统课程设计程序代码.docx》由会员分享,可在线阅读,更多相关《大学生成绩管理系统课程设计程序代码.docx(30页珍藏版)》请在冰点文库上搜索。
![大学生成绩管理系统课程设计程序代码.docx](https://file1.bingdoc.com/fileroot1/2023-5/25/0703cbea-e1f3-4efc-8fd7-d32889c08b05/0703cbea-e1f3-4efc-8fd7-d32889c08b051.gif)
大学生成绩管理系统课程设计程序代码
大学生成绩管理系统
程序代码说明书
导言
1.1目的
该文档的目的是描述大学生成绩管理系统项目的编码规范和对代码的说明,其主要内容包括:
编码规范;命名规范;注释规范;语句规范;声明规范;;代码说明。
本文档的预期的读者是:
开发人员;项目管理人员;质量保证人员。
1.2范围
该文档定义了本项目的代码编写规范,以及部分代码描述和所有代码的说明。
1.3缩写说明
无
1.4术语定义
无
1.5引用标准
[1]《计算机软件产品开发文件编制指南》(GB8567-88)
[2]《信息技术软件生存期过程》(GB/T8566-1995)
1.6参考资料
《软件工程案例教程》作者:
韩万江机械工业出版社
2.编码格式规范
2.1缩进排版
4个空格作为缩进排版的一个单位。
2.2行长度
尽量避免一行的长度超过80个字符,用于文档中的例子应该使用更短的行长,长度一般不超过70个字符。
2.3断行规则:
当一个表达式无法容纳在一行内时,可以依据如下一般规则断开:
●在一个逗号后面断开
●在一个操作符前面断开
●宁可选择较高级别(higher-level)的断开,而非较低级别(lower-level)的断开(见下面的例子)
●新的一行应该与上一行同一级别表达式的开头处对齐
●如果以上规则导致你的代码混乱或者使你的代码都堆挤在右边,那就代之以缩进8个空格
if语句的换行通常使用8个空格的规则,因为常规缩进(4个空格)会使语句体看起来比较费劲。
2.4空行
空行将逻辑相关的代码段分隔开,以提高可读性。
下列情况应该总是使用两个空行:
●一个源文件的两个片段(section)之间
●类声明和接口声明之间
下列情况应该总是使用一个空行:
●两个方法之间
●方法内的局部变量和方法的第一条语句之间
●块注释或单行注释之前
●一个方法内的两个逻辑段之间,用以提高可读性
3.命名规范
命名规范使程序更易读,从而更易于理解。
它们也可以提供一些有关标识符功能的信息,以助于理解代码。
3.1包(Packages)
一个唯一包名的前缀总是全部小写的ASCII字母并且是一个顶级域名,通常是com,edu,gov,mil,net,org,或1981年ISO3166标准所指定的标识国家的英文双字符代码。
包名的后续部分根据不同机构各自内部的命名规范而不尽相同。
这类命名规范可能以特定目录名的组成来区分部门(department),项目(project),机器(machine),或注册名(loginnames)。
3.2类(Classes)
类名是个一名词,采用大小写混合的方式,每个单词的首字母大写。
尽量使你的类名简洁而富于描述。
使用完整单词,避免缩写词(除非该缩写词被更广泛使用,像URL,HTML)。
3.3接口(Interfaces)
大小写规则与类名相似。
3.4方法(Methods)
方法名是一个动词,采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写。
3.5变量(Variables)
采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写。
变量名不应以下划线或美元符号开头,尽管这在语法上是允许的。
变量名应简短且富于描述。
变量名的选用应该易于记忆,即,能够指出其用途。
尽量避免单个字符的变量名,除非是一次性的临时变量。
临时变量通常被取名为i,j,k,m和n,它们一般用于整型;c,d,e,它们一般用于字符型。
3.6实例变量(InstanceVariables)
大小写规则和变量名相似,除了前面需要一个下划线,如:
int_studentId.
3.7常量(Constants)
类常量和ANSI常量的声明,应该全部大写,单词间用下划线隔开。
4.声明规范
4.1每行声明变量的数量
一行一个声明,因为这样以利于写注释。
4.2初始化
尽量在声明局部变量的同时初始化。
唯一不这么做的理由是变量的初始值依赖于某些先前发生的计算。
4.3布局
只在代码块的开始处声明变量。
(一个块是指任何被包含在大括号"{"和"}"中间的代码。
)不要在首次用到该变量时才声明之。
这会把注意力不集中的程序员搞糊涂,同时会妨碍代码在该作用域内的可移植性。
4.4类和接口的声明
当编写类和接口是,应该遵守以下格式规则:
●在方法名与其参数列表之前的左括号"("间不要有空格
●左大括号"{"位于声明语句同行的末尾
●右大括号"}"另起一行,与相应的声明语句对齐,除非是一个空语句,"}"应紧跟在"{"之后
●方法与方法之间以空行分隔
5.语句规范
5.1简单语句
每行至多包含一条语句。
5.2复合语句
复合语句是包含在大括号中的语句序列,形如"{语句}"。
遵循原则如下:
●被括其中的语句应该较之复合语句缩进一个层次
●左大括号"{"应位于复合语句起始行的行尾;右大括号"}"应另起一行并与复合语句首行对齐。
●大括号可以被用于所有语句,包括单个语句,只要这些语句是诸如if-else或for控制结构的一部分。
这样便于添加语句而无需担心由于忘了加括号而引入bug。
6.注释规范
注释应被用来给出代码的总括,并提供代码自身没有提供的附加信息。
注释应该仅包含与阅读和理解
在注释里,对设计决策中重要的或者不是显而易见的地方进行说明是可以的,但应避免提供代码中己清晰表达出来的重复信息。
6.1注释的方法
程序可以有四种实现注释的风格:
块注释、单行注释、尾端注释和行末注释。
①块注释
块注释通常用于提供对文件,方法,数据结构和算法的描述。
块注释被置于每个文件的开始处以及每个方法之前。
它们也可以被用于其他地方,比如方法内部。
在功能和方法内部的块注释应该和它们所描述的代码具有一样的缩进格式。
块注释之首应该有一个空行,用于把块注释和代码分割开来。
注意顶层(top-level)的类和接口是不缩进的,而其成员是缩进的。
描述类和接口的文档注释的第一行(/**)不需缩进;随后的文档注释每行都缩进1格(使星号纵向对齐)。
成员,包括构造函数在内,其文档注释的第一行缩进4格,随后每行都缩进5格。
②单行注释
短注释可以显示在一行内,并与其后的代码具有一样的缩进层级。
如果一个注释不能在一行内写完,就该采用块注释(参见"块注释")。
单行注释之前应该有一个空行。
③尾端注释
极短的注释可以与它们所要描述的代码位于同一行,但是应该有足够的空白来分开代码和注释。
若有多个短注释出现于大段代码中,它们应该具有相同的缩进。
④行末注释
注释界定符"//",可以注释掉整行或者一行中的一部分。
它一般不用于连续多行的注释文本;然而,它可以用来注释掉连续多行的代码段。
6.2开头注释
所有的源文件都应该在开头有一个注释,其中列出类名、版本信息、日期、作者以及版权声明。
7.代码说明
#include"stdio.h"/*I/O函数*/
#include"stdlib.h"/*其它说明*/
#include"string.h"/*字符串函数*/
#include"conio.h"/*屏幕操作函数*/
#include"mem.h"/*内存操作函数*/
#include"ctype.h"/*字符操作函数*/
#include"alloc.h"/*动态地址分配函数*/
#defineN3/*定义常数*/
typedefstructz1/*定义数据结构*/
{
charno[11];
charname[15];
intscore[N];
floatsum;
floataverage;
intorder;
structz1*next;
}STUDENT;
/*以下是函数原型*/
STUDENT*init();/*初始化函数*/
STUDENT*create();/*创建链表*/
STUDENT*delete(STUDENT*h);/*删除记录*/
voidprint(STUDENT*h);/*显示所有记录*/
voidsearch(STUDENT*h);/*查找*/
voidsave(STUDENT*h);/*保存*/
STUDENT*load();/*读入记录*/
voidcomputer(STUDENT*h);/*计算总分和均分*/
STUDENT*insert(STUDENT*h);/*插入记录*/
voidappend();/*追加记录*/
voidcopy();/*复制文件*/
STUDENT*sort(STUDENT*h);/*排序*/
STUDENT*index(STUDENT*h);/*索引*/
voidtotal(STUDENT*h);/*分类合计*/
intmenu_select();/*菜单函数*/
/******主函数开始*******/
main()
{
inti;
STUDENT*head;/*链表定义头指针*/
head=init();/*初始化链表*/
clrscr();/*清屏*/
for(;;)/*无限循环*/
{
switch(menu_select())/*调用主菜单函数,返回值整数作开关语句的条件*/
{/*值不同,执行的函数不同,break不能省略*/
case0:
head=init();break;/*执行初始化*/
case1:
head=create();break;/*创建链表*/
case2:
head=delete(head);break;/*删除记录*/
case3:
print(head);break;/*显示全部记录*/
case4:
search(head);break;/*查找记录*/
case5:
save(head);break;/*保存文件*/
case6:
head=load();break;/*读文件*/
case7:
computer(head);break;/*计算总分和均分*/
case8:
head=insert(head);break;/*插入记录*/
case9:
copy();break;/*复制文件*/
case10:
head=sort(head);break;/*排序*/
case11:
append();break;/*追加记录*/
case12:
head=index(head);break;/*索引*/
case13:
total(head);break;/*分类合计*/
case14:
exit(0);/*如菜单返回值为14程序结束*/
}
}
}
/*菜单函数,返回值为整数*/
menu_select()
{
char*menu[]={"***************MENU***************",/*定义菜单字符串数组*/
"0.initlist",/*初始化*/
"1.Enterlist",/*输入记录*/
"2.Deletearecordfromlist",/*从表中删除记录*/
"3.printlist",/*显示单链表中所有记录*/
"4.Searchrecordonname",/*按照姓名查找记录*/
"5.Savethefile",/*将单链表中记录保存到文件中*/
"6.Loadthefile",/*从文件中读入记录*/
"7.computethescore",/*计算所有学生的总分和均分*/
"8.insertrecordtolist",/*插入记录到表中*/
"9.copythefiletonewfile",/*复制文件*/
"10.sorttomakenewfile",/*排序*/
"11.appendrecordtofile",/*追加记录到文件中*/
"12.indexonnomber",/*索引*/
"13.totalonnomber",/*分类合计*/
"14.Quit"};/*退出*/
chars[3];/*以字符形式保存选择号*/
intc,i;/*定义整形变量*/
gotoxy(1,25);/*移动光标*/
printf("pressanykeyentermenu......\n");/*压任一键进入主菜单*/
getch();/*输入任一键*/
clrscr();/*清屏幕*/
gotoxy(1,1);/*移动光标*/
textcolor(YELLOW);/*设置文本显示颜色为黄色*/
textbackground(BLUE);/*设置背景颜色为蓝色*/
gotoxy(10,2);/*移动光标*/
putch(0xc9);/*输出左上角边框┏*/
for(i=1;i<44;i++)
putch(0xcd);/*输出上边框水平线*/
putch(0xbb);/*输出右上角边框┓*/
for(i=3;i<20;i++)
{
gotoxy(10,i);putch(0xba);/*输出左垂直线*/
gotoxy(54,i);putch(0xba);
}/*输出右垂直线*/
gotoxy(10,20);putch(0xc8);/*输出左上角边框┗*/
for(i=1;i<44;i++)
putch(0xcd);/*输出下边框水平线*/
putch(0xbc);/*输出右下角边框┛*/
window(11,3,53,19);/*制作显示菜单的窗口,大小根据菜单条数设计*/
clrscr();/*清屏*/
for(i=0;i<16;i++)/*输出主菜单数组*/
{
gotoxy(10,i+1);
cprintf("%s",menu[i]);
}
textbackground(BLACK);/*设置背景颜色为黑色*/
window(1,1,80,25);/*恢复原窗口大小*/
gotoxy(10,21);/*移动光标*/
do{
printf("\nEnteryouchoice(0~14):
");/*在菜单窗口外显示提示信息*/
scanf("%s",s);/*输入选择项*/
c=atoi(s);/*将输入的字符串转化为整形数*/
}while(c<0||c>14);/*选择项不在0~14之间重输*/
returnc;/*返回选择项,主程序根据该数调用相应的函数*/
}
STUDENT*init()
{
returnNULL;
}
/*创建链表*/
STUDENT*create()
{
inti;ints;
STUDENT*h=NULL,*info;/*STUDENT指向结构体的指针*/
for(;;)
{
info=(STUDENT*)malloc(sizeof(STUDENT));/*申请空间*/
if(!
info)/*如果指针info为空*/
{
printf("\noutofmemory");/*输出内存溢出*/
returnNULL;/*返回空指针*/
}
inputs("enterno:
",info->no,11);/*输入学号并校验*/
if(info->no[0]=='@')break;/*如果学号首字符为@则结束输入*/
inputs("entername:
",info->name,15);/*输入姓名,并进行校验*/
printf("pleaseinput%dscore\n",N);/*提示开始输入成绩*/
s=0;/*计算每个学生的总分,初值为0*/
for(i=0;i{
do{
printf("score%d:
",i+1);/*提示输入第几门课程*/
scanf("%d",&info->score[i]);/*输入成绩*/
if(info->score[i]>100||info->score[i]<0)/*确保成绩在0~100之间*/
printf("baddata,repeatinput\n");/*出错提示信息*/
}while(info->score[i]>100||info->score[i]<0);
s=s+info->score[i];/*累加各门课程成绩*/
}
info->sum=s;/*将总分保存*/
info->average=(float)s/N;/*求出平均值*/
info->order=0;/*未排序前此值为0*/
info->next=h;/*将头结点做为新输入结点的后继结点*/
h=info;/*新输入结点为新的头结点*/
}
return(h);/*返回头指针*/
}
/*输入字符串,并进行长度验证*/
inputs(char*prompt,char*s,intcount)
{
charp[255];
do{
printf(prompt);/*允鞠提示信息*/
scanf("%s",p);/*输入字符串*/
if(strlen(p)>count)printf("\ntoolong!
\n");/*进行长度校验,超过count值重输入*/
}while(strlen(p)>count);
strcpy(s,p);/*将输入的字符串拷贝到字符串s中*/
}
/*输出链表中结点信息*/
voidprint(STUDENT*h)
{
inti=0;/*统计记录条数*/
STUDENT*p;/*移动指针*/
clrscr();/*清屏*/
p=h;/*初值为头指针*/
printf("\n\n\n****************************STUDENT********************************\n");
printf("|rec|nO|name|sc1|sc2|sc3|sum|ave|order|\n");
printf("|---|----------|---------------|----|----|----|--------|-------|-----|\n");
while(p!
=NULL)
{
i++;
printf("|%3d|%-10s|%-15s|%4d|%4d|%4d|%4.2f|%4.2f|%3d|\n",i,p->no,p->name,p->score[0],p->score[1],
p->score[2],p->sum,p->average,p->order);
p=p->next;
}
printf("**********************************end*********************************\n");
}
/*删除记录*/
STUDENT*delete(STUDENT*h)
{
STUDENT*p,*q;/*p为查找到要删除的结点指针,q为其前驱指针*/
chars[11];/*存放学号*/
clrscr();/*清屏*/
printf("pleasedeletedno\n");/*显示提示信息*/
scanf("%s",s);/*输入要删除记录的学号*/
q=p=h;/*给q和p赋初值头指针*/
while(strcmp(p->no,s)&&p!
=NULL)/*当记录的学号不是要找的,或指针不为空时*/
{
q=p;/*将p指针值赋给q作为p的前驱指针*/
p=p->next;/*将p指针指向下一条记录*/
}
if(p==NULL)/*如果p为空,说明链表中没有该结点*/
printf("\nlistno%sstudent\n",s);
else/*p不为空,显示找到的记录信息*/
{
printf("*****************************havefound***************************\n");
printf("|no|name|sc1|sc2|sc3|sum|ave|order|\n");
printf("|----------|---------------|----|----|----|--------|-------|-----|\n");
printf("|%-10s|%-15s|%4d|%4d|%4d|%4.2f|%4.2f|%3d|\n",p->no,
p->name,p->score[0],p->score[1],p->score[2],p->sum,
p->average,p->order);
printf("********************************end*******************************\n");
getch();/*压任一键后,开始删除*/
if(p==h)/*如果p==h,说明被删结点是头结点*/
h=p->next;/*修改头指针指向下一条记录*/
else
q->next=p->next;/*不是头指针,将p的后继结点作为q的后继结点*/
free(p);/*释放p所指结点空间*/
printf("\nhavedeletedNo%sstudent\n",s);
printf("Don'tforgetsave\n");/*提示删除后不要忘记保存文件*/
}
return(h);/*返回头指针*/
}
/*查找记录*/
voidsearch(STUDENT/*当记录的姓名不是要找的,或指针不为空时*/
{p=p->next;/*移动指针,指向下一结点*/
if(p==NULL)/*如果指针为空*/
printf("\nlistno%sstudent\n",s);/*显示没有该学生*/
else/*显示找到的记录信息*/
{
printf(