数据结构课程设计报告学生作业完成情况管理系统.docx
- 文档编号:16778824
- 上传时间:2023-07-17
- 格式:DOCX
- 页数:34
- 大小:367.50KB
数据结构课程设计报告学生作业完成情况管理系统.docx
《数据结构课程设计报告学生作业完成情况管理系统.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告学生作业完成情况管理系统.docx(34页珍藏版)》请在冰点文库上搜索。
数据结构课程设计报告学生作业完成情况管理系统
2.概要设计……………………………………………………………………………………………2
2.1学生作业完成情况管理系统………………………………………………………2
2.1.1程序设计说明……………………………………………………………………2
2.1.2数据结构类型……………………………………………………………………4
2.2图的建立及存储…………………………………………………………………………4
2.2.1程序设计说明……………………………………………………………………4
2.2.2数据结构类型……………………………………………………………………4
3.1算法流程图…………………………………………………………………………………5
3.1.1学生作业完成情况管理系统………………………………………………5
3.1.2图的建立及存储…………………………………………………………………6
4.2图的建立及存储…………………………………………………………………………30
1.需求分析
(一)学生作业完成情况管理系统
假设某门课程一学期要留10次作业,每次老师要进行批改,给出分数后还要进行登记。
学期期末要根据每次作业的成绩计算出最终的平时成绩(满分100)。
该程序应该具有下列功能:
(1)输入信息;
(2)输出信息;
(3)给定条件,修改、删除相应信息;
(4)按条件统计。
(二)图的建立及存储
建立图的存储结构(图的类型可以是有向图、无向图),能够输入图的顶点和边的信息,并存储到相应存储结构中,而后输出图的邻接矩阵。
应用环境设定给定某类图的顶点和边的相关信息,要求输出该图的邻接矩阵。
用户界面命令行界面,用户选择所要建立的图的类型,输入相关顶点和边的信息,然后输出该图的邻接矩阵。
输入方式首先输入所要建立的图形类型的代码,然后输入顶点vexnum和边的数量arcnum,再输入顶点信息,边的2个端点v1和v2,如果建立的是网则还要输入权值w。
输出方式输出的是一个邻接矩阵,采用for循环嵌套,输出该图的邻接矩阵。
数据存储方式全部在内存存放,不使用硬盘上的文件或其他数据源,程序执行过程中和结束后不保存数据。
程序功能:
1.输入图的类型;
2.输入相应的图的顶点和边的相关信息;
3.得到图的邻接矩阵。
2.概要设计
2.1学生作业完成情况管理系统
2.1.1程序设计说明
程序整体分为登录部分、获得数据部分、数据处理及处理信息反馈部分、数据导出保存部分,如下结构图1、2所示:
图1
图2
该程序具有下列功能:
(1)输入信息;
(2)输出信息;
(3)给定条件,修改、删除相应信息;
(4)按条件统计。
2.1.2数据结构类型
typedefstructstudent//学生信息链表
{
charname[10];
intschoolnumber;
intclassnumber;
floatscore[10];
structstudent*next;
}stu,*stupt;
stuptst=NULL;//学生信息的头指针
stuptqt=NULL;//学生信息的尾指针
FILE*fp;//文件指针
2.2图的建立及存储
2.2.1程序设计说明
本程序通过输入有向图与无向图的顶点、边、权值等信息,存储至用数组建立的邻接矩阵,并输出该邻接矩阵图。
2.2.2数据结构类型
基本操作:
typedefenum
{
DG,UDG
}GraphKind;//有向图,无向图
typedefstructArcCell
{
VrTypeadj;//顶点关系类型。
对无权图,用1或0表示相邻否;对带权图,则为权值类型。
InfoType*info;//该弧相关信息的指针
}ArcCell,AdjMatrix[20][20];
typedefstruct
{
VertexTypevertex[20];//顶点向量
AdjMatrixarcs;//邻接矩阵
intvexnum,arcnum;//图的当前顶点数和弧(边)数
GraphKindkind;//图的种类标志
}MGraph;
CreateGraph(MGraph&G)
初始条件:
图G未创建。
操作结果:
创建一个图G。
CreateUDG(MGraph&G);
初始条件:
无向图G未创建。
操作结果:
创建一个无向图并求出其邻接矩阵。
CreateDG(MGraph&G);
初始条件:
有向图G未创建。
操作结果:
创建一个有向图并求出其邻接矩阵。
DDisplay(MGraphG)
。
初始条件:
图G已创建。
操作结果:
输出图G的邻接矩阵。
3.详细设计
3.1算法及流程图
3.1.1学生作业完成情况管理系统
程序算法:
手动输入学生信息:
voidinpu(stuptp)
{
intn;
intm=0;
intflag;
while(m<10)//成绩初始化为0
{
p->score[m]=0;
m++;
}
printf("请输入:
姓名:
");
scanf("%s",p->name);
clear();
printf("请输入:
学号:
");
scanf("%d",&p->schoolnumber);
clear();
printf("请输入:
班级(如:
101):
");
scanf("%d",&p->classnumber);
clear();
do
{
printf("请输入:
第几次作业(1~10):
");
scanf("%d",&n);
clear();
printf("请输入:
该次作业成绩:
");
scanf("%f",&p->score[n-1]);
clear();//清空缓冲区
printf("是否继续输入该生成绩,退出请按q,其他键继续:
");
flag=getchar();
clear();//清空缓冲区堆积
}
while(flag!
='q');
}
从文件中导入学生信息:
voidread&st,FILE*fp)
{
charflag,flag_1;
char[90];
printf("如导入前有过手动输入,请先导出至文件后再进行导入,否则输入部分的数据将丢失!
\n");
printf("任意键继续,退出请按q:
");
flag_1=getchar();//等待接收一个字符
clear();
if(flag_1=='q')
{
return;
}
lab_2:
printf("请选择:
a.程序默认路径导入(之前导出时需要是默认导出)b.自定义导入路径(请确保导入路径合法):
");
flag=getchar();
clear();
if(flag=='b')
{
printf("请输入导入路径(请确保导入路径合法!
)(如c:
.\\student_homework_infor.txt):
");
scanf("%s",);
clear();
if(access()==1)//确定文件或文件夹的访问权限即检查文件的存取方式,如果存取方式有效,则返回0,否则返回1
{
printf("路径不合法或文件不存在,请重新选择!
\n");
gotolab_2;
}
fp=fopen(,"rb");
if(fp==NULL)
{
printf("打开%s文件失败,请返回主菜单重试!
\n",);
return;
}
else
(st,fp);//导入文件
fclose(fp);
}
elseif(flag=='a')
{
fp=fopen("student_homework_infor.txt","r");
if(access("student_homework_infor.txt",0)==1)
{
printf("文件不存在!
\n");
}
if(fp==NULL)
{
printf("打开程序所在目录下的student_homework_infor.txt文件失败,请返回上层菜单重试!
\n");
return;
}
else
(st,fp);
fclose(fp);
}
else
{
printf("非法输入!
程序将返回上层菜单...\n");
}
}
查询某学生作业完成情况:
voidsearch_1(stupt&st,intsnum)
{
stuptp,q;
if(st==NULL)
{
printf("未建立学生信息表,请返回上层菜单输入或导入所有学生的信息\n");
return;
}
else
{
p=st;
q=p->next;
}
if(p->schoolnumber==snum)
{
printf_score(p);//查找成功输出并返回上级函数
return;
}
while(q!
=NULL)
{
if(q->schoolnumber==snum)
{
printf_score(q);//查找成功输出并返回上级函数
return;
}
q=q->next;//下一个
}
printf("查询失败,该学号学生信息不存在\n");
}
查询某班级所有学生成绩:
voidsearch_2(stuptst,intclnum)
{
stuptp,q;
intf=0;
if(st==NULL)
{
printf("未建立学生信息表,请返回主菜单输入所有学生的信息\n");
return;
}
else
{
p=st;
q=p->next;
}
printf("班级姓名学号成绩1成绩2成绩3成绩4成绩5成绩6成绩7成绩8成绩9成绩10\n");
printf("──────────────────────────────────────\n");
if(p->classnumber==clnum)
{
printf_infor(p);
f++;
}//查找成功输出
while(q!
=NULL)
{
if(q->classnumber==clnum)
{
printf_infor(q);
f++;
}//查找成功输出
q=q->next;//下一个
}
if(f==0)
{
printf("没有该班级学生信息\n");
}
}
修改学生信息:
voidchange(stupt&p)
{
chara;
printf_help_2();
while((a=getchar())!
='0')
{
clear();
printf("班级姓名学号成绩1成绩2成绩3成绩4成绩5成绩6成绩7成绩8成绩9成绩10\n");
printf("──────────────────────────────────────\n");
printf_infor(p);
switch(a)
{
case'1':
{
printf("您选择了:
1.修改姓名\n");
change_name(p);
break;
}
case'2':
{
printf("您选择了:
2.修改班级\n");
change_class(p);
break;
}
case'3':
{
printf("您选择了:
3.修改成绩\n");
change_score(p);
break;
}
default:
{
printf("非法输入,请重新选择!
\n");
break;
}
}
printf_help_2();
}
if(a=='0')
{
clear();
printf("您选择了:
0.返回\n");
}
}
删除学生信息:
voiddelete_pt(stupt&st,intsnum)
{
stuptp,q;
if(st==NULL)
{
printf("未建立学生信息表,请返回主菜单输入或导入所有学生的信息\n");
return;
}
else
{
p=st;
q=p->next;
}
if(p->schoolnumber==snum)
{
st=q;//查找成功删除并返回上级函数
printf("班级姓名学号成绩1成绩2成绩3成绩4成绩5成绩6成绩7成绩8成绩9成绩10\n");
printf("──────────────────────────────────────\n");
printf_infor(p);
free(p);
printf("上面信息删除成功!
\n");
return;
}
while(q!
=NULL)
{
if(q->schoolnumber==snum)
{
p->next=q->next;//查找,成功删除并返回上级函数
printf("班级姓名学号成绩1成绩2成绩3成绩4成绩5成绩6成绩7成绩8成绩9成绩10\n");
printf("──────────────────────────────────────\n");
printf_infor(q);
free(q);
printf("上面信息删除成功!
\n");
return;
}
else//下一个
{
p=q;
q=p->next;
}
}
printf("删除失败,该学号学生信息不存在\n");
}
显示各项统计数据:
voidstatistics_result(stupt&st)//统计结果
{
charflag;
printf_help_3();
while((flag=getchar())!
='0')
{
clear();
switch(flag)
{
case'1':
{
printf("您选择了:
1.按学号查看学生平均成绩\n");
snum_check_aver(st);
break;
}
case'2':
{
printf("您选择了:
2.按班级查看学生平均成绩\n");
cnum_check_aver(st);
break;
}
case'3':
{
printf("您选择了:
3.查看学生平均成绩降序序列\n");
descending_order_check(st);
break;
}
default:
{
printf("非法输入,请重新选择!
\n");
clear();
break;
}
}
printf_help_3();
}
if(flag=='0')
{
printf("您选择了:
0.返回主菜单\n");
clear();
Printf_help_1();
}
}
导出信息至文件:
voidcreat_files(stuptst,FILE*&fp)
{
charflag;
char[90];
lab_1:
printf("请选择:
a.默认路径保存(为当前目录下的student_homework_infor.txt)b.自定义保存路径:
");
flag=getchar();
clear();//清除缓存中的回车
if(flag=='b')
{
printf("请输入文件名及保存路径(如c:
student_homework_infor.txt):
");
scanf("%s",);
clear();
if(access()==1)
{
printf("路径不合法,请重新输入!
\n");
gotolab_1;
}
fp=fopen(,"ab+");
if(fp==NULL)
{
printf("创建文件至%s失败,请返回主菜单重试!
\n",);
return;
}
else(st,fp);
fclose(fp);
}
elseif(flag=='a')
{
fp=fopen(".\\student_homework_infor.txt","a");
if(fp==NULL)
{
printf("创建文件至程序所在目录下的student_homework_infor.txt文件失败,请返回主菜单重试!
");
return;
}
else(st,fp);
fclose(fp);
}
else
{
printf("非法输入!
程序将返回主菜单...\n");
}
}
学生作业完成情况管理程序流程概图
3.1.2图的建立及存储
邻接矩阵表示法:
设G=(V,E)是一个图,其中V={V1,V2,V3…,Vn}。
G的邻接矩阵是一个具有下述性质的n阶方阵:
若(Vi,Vj)∈E或者
图5-2中有向图G1和无向图G2的邻接矩阵分别为M1和M2:
M1=┌0101┐
│1010│
│1001│
└0000┘
M2=┌0111┐
│1010│
│1101│
└1010┘
注意无向图的邻接是一个对称矩阵,例如M2。
用邻接矩阵表示法来表示一个具有n个顶点的图时,除了用邻接矩阵中的n*n个元素存储顶点间相邻关系外,往往还需要另设一个向量存储n个顶点的信息。
因此其类型定义如下:
VertexTypevertex[MAX_VERTEX_NUM];//顶点向量
AdjMatrixarcs;//邻接矩阵
intvexnum,arcnum;//图的当前顶点数和弧(边)数
GraphKindkind;//图的种类标志
若图中每个顶点只含一个编号i(1≤i≤vnum),则只需一个二维数组表示图的邻接矩阵。
此时存储结构可简单说明如下:
typeadjmatrix=array[1..vnum,1..vnum]ofadj;
利用邻接矩阵很容易判定任意两个顶点之间是否有边(或弧)相联,并容易求得各个顶点的度。
对于无向图,顶点Vi的度是邻接矩阵中第i行元素之和,即
n
D(Vi)=∑A[i,j]
j=1
对于有向图,顶点Vi的出度OD(Vi)为邻接矩阵第i行元素之和,顶点Vi的入度ID(Vi)为第i列元素之和。
即
n n
OD(Vi)=∑A[i,j],ID(Vi)=∑A[j,i])
j=1 j=1
用邻接矩阵也可以表示带权图,只要令
Wij,若(Vi,Vj)∈或者
A[i,j]={
0,否则
1、无向图邻接矩阵的建立算法如下:
procedurebuild-graph;{建立无向图的邻接矩阵}
begin
fori:
=1tondoread(G.vertex[i]);{读入n个顶点的信息}
fori:
=1tondo
forj:
=1toedo
G.arcs[i][j]=0;
{将邻接矩阵的每个元素初始化成0}
fork:
=1toedo{e为边的数目}
[read(i,j,w){读入边和权}G.arcs[i][j]:
=w]
G.arcs[i][j]=G.arcs[i][i]{置对称弧}
end;
该算法的执行时间是O(n+n2+e),其中消耗在邻接矩阵初始化操作上的时间是O(n2),而e 2、有向图邻接矩阵的建立算法如下: procedurebuild-graph;{建立有向图的邻接矩阵} begin fori: =1tondoread(G.vertex[i]);{读入n个顶点的信息} fori: =1tondo forj: =1toedo G.arcs[i][j]=0; {将邻接矩阵的每个元素初始化成0} fork: =1toedo{e为边的数目} [read(i,j,w){读入边和权}G.arcs[i][j]: =w] G.arcs[i][j]=G.arcs[i][i]{置对称弧} end; 该算法的执行时间是O(n+n2+e),其中消耗在邻接矩阵初始化操作上的时间是O(n2),而e 1)头文件: #include #include #include #include #include 程序算法: 输出邻接矩阵: voidDisplay(MGraphG) { //输出图的邻接矩阵 inti,j; printf("该图的邻接矩阵为: \n"); for(i=0;i { for(j=0;j { printf("%5d",G.arcs[
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告 学生 作业 完成 情况 管理 系统