1、 淮 海 工 学 院 计算机工程学院 课程设计报告 设计名称: 数据结构课程设计 选题名称: 学生成绩管理系统 系 (院): 计算机工程学院 设计时间: 2013.12.23~2013。1.5 设计地点: 软件工程实验室、教室 指导教师评语: 签名: 年 月 日 数据结构课程设计报告 第 22 页,共 页 1.课程设计目的 1、训练学
2、生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。 2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; 3。提高综合运用所学的理论知识和方法独立分析和解决问题的能力; 4。训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。 2.课程设计任务与要求: 任务 根据教材《数据结构—C语言描述》(耿国华主编)和参考书《数据结构题集(C语言版)》(严蔚敏、吴伟民主编)选择课程设计题目,要求通过设计,在数据结构的逻辑特性和物理表示、
3、数据结构的选择应用、算法的设计及其实现等方面加深对课程基本内容的理解和综合运用。 设计题目从任务书所列选题表中选取,每班每题不得超过2人。 学生自选课题 学生原则上可以结合个人爱好自选课题,要求课题有一定的深度与难度,有一定的算法复杂性,能够巩固数据结构课程所学的知识。学生自选课题需在18周前报课程设计指导教师批准方可生效。 要求: 1、在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编制上机程序和上机调试等若干步骤完成题目,最终写出完整的分析报告。前期准备工作完备与否直接影响到后序上机调试工作的效率.在程序设计阶段应尽量利用已有的
4、标准函数,加大代码的重用率。 2、。设计的题目要求达到一定工作量(300行以上代码),并具有一定的深度和难度。 3、程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释; 4、每位同学需提交可独立运行的程序; 5 、每位同学需独立提交设计报告书(每人一份),要求编排格式统一、规范、内容充实,不少于10页(代码不算); 6、课程设计实践作为培养学生动手能力的一种手段,单独考核。 3.课程设计说明书 一 需求分析 该程序是模拟成绩管理系统,实现对学生成绩的录入,修改,插入,查询,删除,排序,统计等基本功能,本程序有以下规定: 1. 管理员可以进行学生信息的录入
5、包括姓名,学号,班级,性别,各科成绩等信息 2. 管理员和学生都可以进行成绩的查询(通过姓名,学号进行查询) 3. 管理员还可以对学生信息进行管理(修改(整个或者单个记录项进行修改),插入(在已有的信息下进行有顺序的插入),删除(将整个记录删除)),排序(按各科成绩高低进行排序,或者按姓名进行排序,或者是按学号进行排序),统计(各个学科的最高分,最低分,及格率)。 二 概要设计 l 系统用到的抽象数据类型定义: ADT LinearList{ 数据元素:D={ai|ai∈D0,i=1,2,…,n,n≥0,D0为某一数据对象} 关系:S={〈ai,ai+1〉|ai,ai+1∈D
6、0,i=1,2,…,n—1} 基本操作: Locate(L,e) DestroyList(L) ClearList(L) GetData(L,i) InsList(L,i,e) DelList(L,i,&e) }ADT LinearList l 系统中的子程序和功能说明: fprint(StudentList *st) 保存到文件 StudentList *create(StudentList *st,int n) Createseq(StudentList *st)录入学生信息 Amst(StudentList *st, char name[])修改学生信息 In
7、sertst(StudentList *st)插入学生信息 Deletest(StudentList *st,StudentType *e)删除学生信息 Search(StudentList *st,char n[20])学生信息查询系统 Sort(StudentList *st,char sc[20])学生信息排序系统 Jige(StudentList st,char subnum[20]) 统计学科及格率 Bestscore(StudentList st,char subnum[]) 统计学科最高分 Leastscore(StudentList st,char subnum
8、[])统计学科最低分 Menu()主菜单 menu(StudentList *st)小菜单 main()主函数 l 功能实现过程 void Createseq(StudentList *st) 录入学生信息 { 输入学生的个数; 输入学生信息项的个数; 输入学生信息项的表头; for(j=1;j<=len;j++) 输入表头信息; 依次录入学生信息: for(i=1;i<=a;i++) { for(j=1;j〈=学生信息项的个数;j++) 输入学生信息; } 是否保存信息(输入1或者2): 输入选择; if
9、选择为1) 调用保存函数; if(选择为2) 输出未保存; 输出学生信息; } void Amst(StudentList *st, char name[]) 修改学生信息 { for(i=1;i〈=len;i++) { if(输入的修改名字和记录中的学生的名字相同) 找到该学生的位置; } 输入你要修改的该学生记录项; for(j=1;j〈=a;j++) 找到该记录项; 输入修改后的信息; 显示修改的学生的信息; } int Deletest(StudentList *st,StudentType *e) 删除学生
10、信息 { 输入删除的位置; if(删除的位置不在范围内) 输出删除的位置不合法; 找到该位置进行删除; 输出删除后全部学生信息; } int Search(StudentList *st,char n[20]) 查询学生信息 { for(int i=1;i<=st—>length;i++) { for(j=1;j〈=st—>stunum;j++) { if(学生某个信息与记录项相同) 找到该位置; } } 输出查找到的学生的信息; 否则的话输出你
11、查找的学生不存在; } int Sort(StudentList *st,char sc[20]) 对学生信息排序 { for(j=1;j<=st-〉stunum;j++) { 找到要进行排序的那一列; } 进行该列排序;/*冒泡排序*/ 输出排序结果; } void Jige(StudentList st,char subnum[20]) 统计学科及格率 { for(j=1;j〈=st-〉stunum;j++) 找到要统计的成绩的那一列; for(int i=1;i<=n;i++) if(分数
12、大于等于六十) a++; 求出及格率; 输出该学科的及格率; } l 系统程序功能流程图 成绩管理系统 信息管理 信息统计 信息排序 信息查找 信息录入 平均分 最低分 最高分 学号排序 姓名排序 成绩排序 姓名查找 学号查找 基本信息 信息修改 信息插入 信息删除 l 功能实现过程 三 详细设计 void Createseq(StudentList *st) 录入学生信息 { int k; int i; int len; 学生的个数 in
13、t a; 学生信息项的个数 int j; printf("输入学生的个数:”); scanf(”%d”,&len); st—〉length=len; printf(”输入学生信息项的个数:"); scanf(”%d”,&a); st-〉stunum=a; printf(”输入学生信息项的表头:"); for(j=1;j〈=a;j++) { scanf("%s”,&st—>r[0].data[j]); } printf("依次录入学生信息:\n"); fo
14、r(i=1;i<=len;i++) { for(j=1;j〈=a;j++) { scanf(”%s",&st—〉r[i]。data[j]); } } printf("是否保存信息(输入1或者2):”); scanf(”%d",&k); if(k==1) { fprint(st); printf(”保存成功!!”); } if(k==2) printf(”未保存!!"); printf(”输出学生信息:\n"); for(j=1;j〈=a;j++) printf("%s
15、\t”,st—〉r[0].data[j]); printf(”\n"); for(i=1;i〈=len;i++) { for(j=1;j〈=a;j++) printf(”%s\t”,st->r[i].data[j]); printf(”\n"); } } void Amst(StudentList *st, char name[]) 修改学生信息 { int i,j; int len=st—〉length; int a=st—>stunum; int k,p; char str[2
16、0]; 修改的项目 char ne[20]; for(i=1;i<=len;i++) { if(strcmp(st-〉r[i]。data[1],name)==0) p=i; } for(i=0;i〈=len;i++) { for(j=1;j〈=a;j++) printf(”%s\t",st—>r[i]。data[j]); printf("\n"); } printf("输入你要修改的学生信息项目:"); scanf(”%s",&str); for(j=1;j〈=a;j++) {
17、 if(strcmp(st—〉r[0]。data[j],str)==0) k=j; } printf(”\n输入修改信息:"); scanf("%s",&ne); strcpy(st-〉r[p]。data[k],ne); printf(”\n修改的学生信息为:\n"); for(j=1;j〈=a;j++) { printf(”%s\t”,st—〉r[0].data[j]); printf(”%s\t",st-〉r[p]。data[j]); } } int Deletest(StudentList *st,Stude
18、ntType *e) 删除学生信息 { int i; printf(”\n输入你要删除的位置:”); scanf("%d”,&i); if((i<1)||(i〉st->length)) { printf(”删除的位置不合法!!”); return(ERROR); } *e=st—〉r[i]; for(int k=i;k〈=st—〉length;k++) st-〉r[k]=st—>r[k+1]; st—〉length——; for(int p=0;p〈=st-〉length;p++) { for(int j=1;j<=
19、st—〉stunum;j++) { printf("%s\t”,st—〉r[0].data[j]); printf("%s\t",st—〉r[p].data[j]); } printf("\n"); } return(OK); } int Search(StudentList *st,char n[20]) 查找 { int a=0; int r; int k; int j; for(int i=1;i〈=st—〉length;i++) { for(j=1;j〈=st—>stunum;j++)
20、{ if(strcmp(st->r[i]。data[j],n)==0) { k=i; r=j; } } a=1; } if(a==1) { printf(”\n查找的学生信息为:\n"); for(j=1;j〈=st->stunum;j++) printf(”%s\t”,st—〉r[k]。data[j]); } else if(a==0) printf(”你查找的学生不存在!!"); return(OK); } int Sort(StudentList *st,char sc[20])
21、 //冒泡排序 { StudentType x; int j,i; int p; int n; for(j=1;j〈=st->stunum;j++) { if(strcmp(st-〉r[0]。data[j],sc)==0) p=j; } n=st—>length; int change=1; for(i=1;i〈=n-1&&change;i++) { change=0; for(int k=1;k〈=n-i;k++) { if(strcmp(st—〉r[k]。data[p],st->r[k+1].data[p
22、])〉0) { x=st—〉r[k]; st—〉r[k]=st—〉r[k+1]; st-〉r[k+1]=x; change=1; } } } for(i=1;i〈=st—〉length;i++) { for(j=1;j〈=st—>stunum;j++) printf(”%s\t”,st->r[i]。data[j]); printf(”\n”); } return(OK); } void Jige(StudentList st,char subnum[20]) //
23、统计学科及格率 { char b[10]=”60"; double s; int a=0; int p; int n=st。length; for(int j=1;j〈=st.stunum;j++) { if(strcmp(st。r[0]。data[j],subnum)==0) p=j; } for(int i=1;i〈=n;i++) { if(strcmp(st。r[i].data[p],b)>=0) a++; } s=(a*(1.0))/(n*1。0); printf("%s的学科及格率为%f",st。r[0
24、].data[p],s); } 四 设计与调试分析 1。这个程序采用一个结构体:学生信息结构体。采用的是顺序表的存储结构,顺序表的长度表示学生的个数。每个数组里面还有一个二维数组,表示每个学生含有的数据项. 2。由于前期工作考虑的不是很周全,采用了顺序表,这对于实现程序的插入和删除的功能显然效率不是很高 3。由于先前成绩定义成了字符型,所以对于成绩的比大小有些麻烦。我对于字符型转化成数字进行加减不是很清楚,所以在实现统计功能中并没有包括成绩的总分计算以及平均分的计算,这是该系统的漏洞。 五 用户手册 【 使用说明 】 1. 进入学生成绩管理系统主页面 2. 根据身份的不同进入
25、不同的系统界面(如果是管理员则进入含有五个子系统选择的界面,而学生则只可以进入查询学生信息的界面) 3. 如果要录入学生的信息,则选择1,可以人工的控制要输入的学生个数以及每个学生含有的记录项,注意输完了保存进文件 4. 如果要对学生进行管理,就选择2,将进入对学生管理的三项选择界面。如果要修改学生信息,选择1,输入要修改的学生的名字,找到该学生并输入要修改的学生的记录项,进行修改。如果要插入学生信息,选择2,选择插入的位置,当你插入的位置不合法时,会有提示。如果要删除学生信息,输入你要删除的学生的位置,如果没该学生则删除不合法。 5. 如果要查找学生信息,则选择3,输入你要查找的学生的
26、姓名或者学号,如果没有该学生就提示你查找的学生不存在。有该学生就会输出该学生的所以信息. 6. 如果要对学生信息进行排序,就选择4,输入你要进行排序的学生的记录项,它就会将该记录项把学生信息进行升序排列 7. 如果要对学生信息进行统计,就选择5.如果要对学科成绩进行最高分统计,就选择1,然后输入你要统计的学科名,系统会找出该学科的最高分。如果要对学科成绩进行及格率的统计,则选择2,输入你要统计的学科名,系统会算出该学科的及格率。如果要对学科成绩进行最低分统计,则选择3,输入你要统计的学科名,系统会找出该学科的最低分。 8. 如果系统结束,则按6结束. 【 程序中的头文件 】 #inc
27、lude〈stdio。h〉
#include 28、序
6. 查找学生
(1)学号查找
(2)姓名查找
7. 统计
(1) 最高分
(2) 及格率
(3) 最低分
8. 学生查询
七 附录(源程序清单)
#include〈stdio。h〉
#include〈stdlib。h>
#include〈string。h〉
#include〈fstream.h>
#define ERROR 0
#define OK 1
#define MAX_size 20
#define LIST_SIZE 100 //线性表长度
typedef char KeyType;
typedef struct{
Ke 29、yType data[MAX_size][MAX_size];
}StudentType;
typedef struct{
StudentType r[LIST_SIZE+1];
int length;
int stunum;
}StudentList;
FILE *fp;
void Menu()
{
printf(”\n*************************学生成绩管理系统**************************\n”);
printf(”*********************1。录 入 学 生 的 基 本 信 息********* 30、*********\n”);
printf("*************** 2。对 学 生 信 息 进 行 管 理 ************\n”);
printf("******** 3。查 找 学 生 信 息 *********\n”);
printf(”*************** 4。对 学 生 信 息 进 行 排 序 ************\n");
printf(”***************** 5.对 学 生 信 息 进 行 统 计 31、 ***************\n");
printf(”******************* 6.退 出 系 统 ********************\n");
}
void fprint(StudentList *st) //保存到文件
{
int len=st—〉length;
int a=st-〉stunum;
if((fp=fopen(”students_list.txt",”wb"))==NULL)
{
printf("File open error!\n”);
exit(0); 32、
}
for(int i=0;i〈=len;i++)
{
fwrite(&st—〉r[i],sizeof(StudentList),1,fp);
}/*将学生信息写入文件*/
fclose(fp); /*关闭文件*/
printf("\n学生信息已成功保存到文件 students_list.txt 中!\n");
//getchar();
}
StudentList *create(StudentList *st,int n) //读出文件
{
if((fp=fopen("students_li 33、st.txt”,"rb”))==NULL)
{
printf("File open error!\n”);
exit(0);
}
for(int i=0;i<=n;i++)
fread(&st—〉r[i],sizeof(StudentList),1,fp);
fclose(fp);
return st;
}
void Createseq(StudentList *st) //录入学生信息
{
int k;
int i;
int len; // 学生的个数
int a; 34、 //学生信息项的个数
int j;
printf(”输入学生的个数:");
scanf("%d”,&len);
st-〉length=len;
printf("输入学生信息项的个数:”);
scanf(”%d”,&a);
st—〉stunum=a;
printf("输入学生信息项的表头:");
for(j=1;j<=a;j++)
{
scanf(”%s",&st—〉r[0]。data[j]);
}
printf(”依次录入学生信息:\n”);
for(i=1; 35、i<=len;i++)
{
for(j=1;j〈=a;j++)
{
scanf("%s”,&st—〉r[i].data[j]);
}
}
printf("是否保存信息(输入1或者2):”);
scanf(”%d”,&k);
if(k==1)
{
fprint(st);
printf(”保存成功!!”);
}
if(k==2)
printf("未保存!!");
printf("输出学生信息:\n");
for(j=1;j<=a;j++)
printf(”%s\t",st 36、—>r[0].data[j]);
printf("\n”);
for(i=1;i〈=len;i++)
{
for(j=1;j<=a;j++)
printf(”%s\t",st—〉r[i].data[j]);
printf("\n”);
}
}
void Amst(StudentList *st, char name[]) //修改学生信息
{
int i,j;
int len=st—〉length;
int a=st—〉stunum;
int k,p;
char str[20]; 37、 // 修改的项目
char ne[20];
for(i=1;i<=len;i++)
{
if(strcmp(st—>r[i]。data[1],name)==0)
p=i;
}
for(i=0;i〈=len;i++)
{
for(j=1;j〈=a;j++)
printf(”%s\t",st—〉r[i].data[j]);
printf(”\n”);
}
printf(”输入你要修改的学生信息项目:");
scanf(”%s”,&str);
for(j=1;j〈=a;j++)
{
38、 if(strcmp(st—〉r[0]。data[j],str)==0)
k=j;
}
printf(”\n输入修改信息:”);
scanf("%s",&ne);
strcpy(st—〉r[p]。data[k],ne);
printf("\n修改的学生信息为:\n");
for(j=1;j<=a;j++)
{
printf(”%s\t”,st—〉r[0]。data[j]);
printf("%s\t",st->r[p]。data[j]);
}
}
int Insertst(StudentList *st) // 39、插入学生信息
{
int i;
printf("\n输入你要插入的位置:”);
scanf(”%d”,&i);
if((i〈1)||(i>st-〉length+1))
{
printf(”插入的位置不合法!!”);
return(ERROR);
}
if(st—〉length>=LIST_SIZE)
{
printf(”表已满,无法插入");
return(ERROR);
}
for(int k=st-〉length;k>=i;k-—)
st—〉r[k+1]=st—>r[k];
for(int j=1;j〈=st-〉s 40、tunum;j++)
{
printf(”%s”,st->r[0].data[j]);
scanf(”%s",&st—〉r[i]。data[j]);
}
st—〉length++;
for(int p=0;p<=st—>length;p++)
{
for(j=1;j〈=st->stunum;j++)
printf("%s\t",st—〉r[p]。data[j]);
printf(”\n”);
}
fprint(st);
return(OK);
}
int Deletest(StudentList *st,Stu 41、dentType *e)//删除学生信息
{
int i;
printf(”\n输入你要删除的位置:”);
scanf(”%d”,&i);
if((i<1)||(i〉st—>length))
{
printf(”删除的位置不合法!!”);
return(ERROR);
}
*e=st-〉r[i];
for(int k=i;k〈=st—>length;k++)
st—>r[k]=st-〉r[k+1];
st—〉length——;
for(int p=0;p<=st-〉length;p++)
{
for(int j=1;j< 42、st—〉stunum;j++)
{
printf(”%s\t”,st—>r[p]。data[j]);
}
printf("\n");
}
fprint(st);
return(OK);
}
int Search(StudentList *st,char n[20]) //查找
{
int a=0;
int r;
int k;
int j;
for(int i=1;i〈=st—〉length;i++)
{
for(j=1;j<=st—>stunum;j++)
{
if(strcmp(st-〉r[ 43、i]。data[j],n)==0)
{
k=i;
r=j;
a=1;
}
}
}
if(a==1)
{
printf(”\n查找的学生信息为:\n");
for(j=1;j〈=st—>stunum;j++)
printf(”%s\t”,st-〉r[k]。data[j]);
}
else if(a==0)
printf(”你查找的学生不存在!!");
return(OK);
}
int Sort(StudentList *st,char sc[20]) //冒泡排序
{
Student 44、Type x;
int j,i;
int p;
int n;
for(j=1;j〈=st-〉stunum;j++)
{
if(strcmp(st—>r[0].data[j],sc)==0)
p=j;
}
n=st—〉length;
int change=1;
for(i=1;i〈=n-1&&change;i++)
{
change=0;
for(int k=1;k〈=n—i;k++)
{
if(strcmp(st—〉r[k].data[p],st—〉r[k+1]。data[p])>0)
{
x=s 45、t—〉r[k];
st—〉r[k]=st-〉r[k+1];
st-〉r[k+1]=x;
change=1;
}
}
}
for(i=1;i〈=st-〉length;i++)
{
for(j=1;j<=st—〉stunum;j++)
printf("%s\t”,st->r[i].data[j]);
printf(”\n");
}
return(OK);
}
void Jige(StudentList st,char subnum[20]) //统计学科及格率
{
char b[ 46、10]=”60";
double s;
int a=0;
int p;
int n=st.length;
for(int j=1;j〈=st。stunum;j++)
{
if(strcmp(st.r[0]。data[j],subnum)==0)
p=j;
}
for(int i=1;i〈=n;i++)
{
if(strcmp(st。r[i]。data[p],b)〉=0)
a++;
}
s=(a*(1。0))/(n*1。0);
printf("%s的学科及格率为%f”,st.r[0]。data[p],s);
}
vo 47、id Bestscore(StudentList st,char subnum[]) //统计学科最高分
{
int max=1;
int j;
int p;
int n=st。length;
for(j=1;j<=st。stunum;j++)
{
if(strcmp(st。r[0]。data[j],subnum)==0)
p=j;
}
for(int i=1;i<=n;i++)
{
if(strcmp(st.r[i].data[p],st。r[max]。data[p])〉0)
max=i;
}
printf(”%s 48、的学科的最高分为%s”,st.r[0]。data[p],st。r[max]。data[p]);
}
void Leastscore(StudentList st,char subnum[]) //统计学科最低分
{
int min=st。length;
int j;
int p;
int n=st.length;
for(j=1;j〈=st。stunum;j++)
{
if(strcmp(st.r[0].data[j],subnum)==0)
p=j;
}
for(int i=1;i〈=n;i++)
{
if(strcmp(st. 49、r[i]。data[p],st.r[min]。data[p])<0)
min=i;
}
printf("%s的学科的最低分为%s”,st。r[0]。data[p],st。r[min]。data[p]);
}
void menu(StudentList *st)
{
StudentType *x;
x=(StudentType*)malloc(sizeof(StudentType));
int a;
printf("1。修 改 学 生 信 息\n”);
printf("2.插 入 学 生 信 息\n");
printf("3。删 除 学 生 信 息\ 50、n”);
printf(”\n输入序号:\n”);
scanf(”%d”,&a);
switch(a)
{
case 1:
char na[20];
printf(”请输入你要修改的学生的姓名:”);
scanf(”%s”,&na);
Amst(st,na);
break;
case 2:
Insertst(st);
break;
case 3:
Deletest(st,x);
break;
}
}
void main() //主函数
{
int a;
int e;
int






