数据结构课程设计报告附源代码学生管理系统.docx
- 文档编号:28415093
- 上传时间:2023-07-13
- 格式:DOCX
- 页数:31
- 大小:465.25KB
数据结构课程设计报告附源代码学生管理系统.docx
《数据结构课程设计报告附源代码学生管理系统.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告附源代码学生管理系统.docx(31页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告附源代码学生管理系统
课程设计报告
(一)
一.报告题目:
学生管理系统
二.实验目的:
1.熟悉线性链表,掌握线性链表的基本操作;
2.练习求线性表中指定结点元素及修改指定结点的元素、求指定结点的前驱/后继元素、删除指定结点的元素、在指点节点位置插入元素等。
3.通过文件保存和读取文件来提升文件操作的能力;
4.C语言编程能力的提升训练。
三.实验环境:
C语言编程,VC++6.0编程工具实现。
四.软件系统结构
1.总体架构/层次:
2.各功能的实现流程图:
函数1:
录入功能实现流程图
函数4:
删除功能实现流程图
函数2:
查找功能实现流程图
函数3:
删除功能实现流程图
函数5:
显示功能实现流程图
函数6:
文件装入功能实现流程图
函数7:
文件保存功能实现流程图
函数8:
退出菜单功能实现流程图
五.软件功能设计:
本软件是要编写一个学生管理系统,一个学生有很多相关数据,包括学号、姓名、性别、年龄、家庭住址、练习电话,因此我们利用线性链表的知识来编写程序,这是因为线性链表有很多优良的特点,因此该程序是对线性链表的应用练习。
本软件利用线性链表的特点,结合文件相关函数的运用,它能够实现以下功能:
1.用结点的数据域存放学生的学号、姓名、性别、年龄、家庭住址、练习电话;
2.利用结点的指针域访问某个结点的前驱或者后继;
3.录入新学生信息并按非降序插入到链表中;
4.查找给定学号的结点学生信息;
5.删除给定学号的结点学生信息;
6.修改给定学号的结点学生信息;
7.显示全部结点的学生信息;
8.将链表中的学生信息全部存入文件;
9.将已存在的学生信息文件中的学生信息按学号非降序插入到当前链表中;
六.源程序代码:
#include
#include
#include
#include
#defineNAMELEN15
#defineADDRLEN10
#defineTELLEN15
#defineOVERFLOW0
#defineERROR0
#defineFALSE0
#defineOK1
#defineTRUE1
structstud
{longnum;
charname[NAMELEN+1];
charsex;
intage;
charAddr[ADDRLEN+1];
longrxsj;
charlxfs[TELLEN+1];
};
typedefstudElemType;//链表结点元素为结构体
FILE*fp;
typedefstructLNode
{
ElemTypedata;
LNode*next;
}*LinkList;
//typedefLNode*;
intInitList(LinkList&L)
{//操作结果:
构造一个空的线性表L
L=(LinkList)malloc(sizeof(LinkList));//产生头结点,并使L指向头结点
if(!
L)//存储分配失败
exit(OVERFLOW);
L->next=NULL;//指针域为空
returnOK;
}
intListTraverse(LinkListL,void(*vi)(ElemType))
{//条件:
线性表已存在
//操作结果:
一次对L的每个数据元素调用函数vi()。
一旦vi()失败,则操作失败
LinkListp=L->next;
while(p)
{
vi(p->data);
p=p->next;
}
printf("\n");
returnOK;
}
voidInsertAscend(LinkListL,ElemTypee)
{//按学号非降序插入
LinkListq=L,p=L->next;
while(p&&e.num>p->data.num)
{
q=p;
p=p->next;
}
q->next=(LinkList)malloc(sizeof(LNode));//插在q后
q->next->data=e;
q->next->next=p;
}
voidReadIn(stud&e)
{//由键盘输入结点信息
inta=1;
printf("学号:
");
scanf("%ld",&e.num);
printf("姓名(<=%d个字符):
",NAMELEN);
scanf("%s",e.name);
while(a)
{printf("性别(m:
男f:
女):
");
scanf("%s",&e.sex);
{if(e.sex!
='m'&&e.sex!
='f')printf("格式不对,重输入:
");
elseif(e.sex=='m'||e.sex=='f')a=0;}
};
printf("年龄:
");
scanf("%d",&e.age);
printf("家庭住址(<=%d个字符):
",ADDRLEN);
scanf("%s",e.Addr);
printf("入学时间(格式如200709):
");
scanf("%ld",&e.rxsj);
printf("联系方式:
");
scanf("%s",e.lxfs);
getchar();
}
voidPrint(stude)
{//显示记录e的内容
printf("%ld%-8s",e.num,e.name);
if(e.sex=='m')
printf("男");
else
printf("女");
printf("%8d",e.age);
printf("%8s",e.Addr);
printf("%5ld",e.rxsj);
printf("%15s",e.lxfs);
printf("\n");
}
voidWriteToFile(stude)//装入文件函数
{//将结点信息写入fp指定的文件
fwrite(&e,sizeof(stud),1,fp);
}
intReadFromFile(stud&e)
{//由fp指定的文件读取结点信息到e
inti;
i=fread(&e,sizeof(stud),1,fp);
if(i==1)//读取文件成功
{printf("ok");
returnOK;
}
else
returnERROR;
}
intFindFromNum(LinkListL,longnum,LinkList&p,LinkList&q)
{//查找表中学号为num的结点,如找到,q指向此结点,p指向q的前驱
//并返回TURE,否则返回ERROR
p=L;
while(p)
{
q=p->next;
if(q&&q->data.num>num)
break;
elseif(q&&q->data.num==num)
returnTRUE;
else{p=q;}
}
returnFALSE;
}
intDeleteElem(LinkListL,longnum)
{//删除表中学号为num的元素,并返回TURE;如无此元素,则返回FALSE
LinkListp,q;
if(FindFromNum(L,num,p,q))//找到此结点,且q指向该结点,p指向该结点的前驱
{
p->next=q->next;
free(q);
returnTRUE;
}
elsereturnFALSE;
}
voidModify(ElemType&e)
{
chars[50];
printf("学号姓名性别 年龄 家庭住址 入学时间 联系方式 \n");
Print(e);
printf("请输入新信息,不需要修改的直接按enter键保持原信息:
\n\n");
printf("请输入学号:
\n");
gets(s);
if(strlen(s))
e.num=atol(s);
printf("请输入姓名(<=%d个字符):
\n",NAMELEN);
gets(s);
if(strlen(s))
strcpy(e.name,s);
printf("请输入年龄:
\n");
gets(s);
if(strlen(s))
e.age=atoi(s);
printf("请输入性别(m:
男f:
女):
\n");
gets(s);
if(strlen(s))
e.sex=s[0];
printf("请输入家庭住址(<=%d个字符):
\n",ADDRLEN);
gets(s);
if(strlen(s))
strcpy(e.Addr,s);
printf("请输入入学时间:
\n");
gets(s);
if(strlen(s))
e.rxsj=atol(s);
printf("请输入联系电话:
\n");
gets(s);
if(strlen(s))
strcpy(e.lxfs,s);//修改完毕
}
voidmain()
{inti,t=1;
longnum;
chars,filename[13];
ElemTypee;
LinkListT,p,q;
InitList(T);
while(t)
{printf("***欢迎使用学生管理系统***\n");
printf("1.录入新纪录(按学号非降序插入到链表中)\n");
printf("2.查找学生(按学号查找)\n");
printf("3.删除学生(输入学号删除)\n");
printf("4.修改学生信息(先找后改)\n");
printf("5.显示全部学生记录\n");
printf("6.将文件中的记录装入链表(按非降序)\n");
printf("7.将链表中的所有记录存入文件\n");
printf("8.退出\n");
printf("\n\n");
printf("请选择操作数字:
");
scanf("%d",&i);
getchar();
switch(i)
{
case1:
ReadIn(e);
InsertAscend(T,e);
printf("\n\n");
break;
case2:
i=1;
while(i)
{printf("请输入要查找的学生学号:
");
scanf("%ld",&num);
getchar();
if(!
FindFromNum(T,num,p,q))
{printf("没有记录");
printf("完成查找?
Y/N\n");
scanf("%s",&s);
if(s=='Y'||s=='y')i=0;
}
else
{printf("学号姓名性别 年龄 家庭住址 入学时间 联系方式 \n");
Print(q->data);
printf("\n\n");
printf("完成查找?
Y/N\n");
scanf("%s",&s);
{if(s=='Y'||s=='y')i=0;}
}
}
break;
case3:
i=1;
while(i)
{printf("请输入要删除学生的学号:
");
scanf("%ld",&num);
getchar();
if(!
FindFromNum(T,num,p,q))
{printf("无此学生不用删除\n");
printf("删除完毕?
Y/N\n");
scanf("%s",&s);
{if(s=='Y'||s=='y')i=0;}
}
else
{DeleteElem(T,num);
printf("已删除!
\n");
printf("删除完毕?
Y/N\n");
scanf("%s",&s);
{if(s=='Y'||s=='y')i=0;}
}
}
printf("\n\n");
break;
case4:
i=1;
while(i)
{printf("请输入要修改的学生的学号:
");
scanf("%ld",&num);
getchar();
if(!
FindFromNum(T,num,p,q))
{printf("没有这个学生,不用修改\n\n");
printf("修改完毕?
Y/N\n");
scanf("%s",&s);
{system("cls");
if(s=='Y'||s=='y')i=0;
}
}
else
{system("cls");
Modify(q->data);
printf("修改完毕?
Y/N\n");
scanf("%s",&s);
{system("cls");
if(s=='Y'||s=='y')i=0;
}
}
}
printf("\n\n");
break;
case5:
if(T->next==NULL)printf("无记录!
");
else{printf("学号 姓名 性别年龄家庭住址入学时间 联系方式 \n");
ListTraverse(T,Print);
}
break;
case6:
printf("请输入文件名:
");
scanf("%s",filename);
getchar();
if((fopen(filename,"rb"))==NULL)
{printf("打开文件失败!
\n");}
else
{while(ReadFromFile(e))
InsertAscend(T,e);
printf("装入成功!
\n");
fclose(fp);
}
break;
case7:
printf("请输入文件名:
");
scanf("%s",filename);
getchar();
if((fp=fopen(filename,"wb"))==NULL)
printf("打开文件失败!
\n\n");
else
{ListTraverse(T,WriteToFile);
printf("存入成功!
\n");
}
fclose(fp);
break;
case8:
printf("确定退出吗?
Y/N\n");
scanf("%s",&s);
{if(s=='Y'||s=='y')t=0;
elseif(s=='N'||s=='n')voidmain();
}break;
default:
system("CLS");
printf("没有这个功能,请重新选择!
");
printf("\n\n");
voidmain();
}
}
}
六.实验结果与分析:
1.录入功能:
该功能实现良好,操作也较简单,程序运行时每一步都会有提示,如“请输入入学时间(格式如200709)”、“请输入性别(m:
男f:
女)”等,所以实现很方便。
如果要改进,可以设置录入学生个数控制。
以下是一些截图:
2.查找功能:
该功能实现良好,只需输入学号即可查找学生信息,但是只能利用学号查询,这是本功能的不足之处,也是改进的地方,可以增加利用姓名、家庭地址、电话号码查找等,运行时如图示:
3.删除功能:
该功能分为两步,第一步:
查找;第二步:
删除。
因此结果也就有两种,一种:
没有要删除的记录,提示“没有记录,不用删除”;另一种就是删除掉查找到的学生的所有信息并提示“删除成功”。
该功能实现良好,但是也有改进的地方,比如:
不能利用姓名来删除,可以实现无论是输入学号还是姓名,查找到后软件先显示该学生记录,由用户确认删除后再删除,这点还没有做到,有待改进。
下图为截图:
4.修改功能:
该功能比较完善,先要输入你要修改的学生的学号,查找到后输入信息等待用户确认,而且提示你不用修改的项可以按enter键保留,需要修改的则输入新数据即可,所以操作方便;若没查找到则提示你“没有这个学生,不用修改”。
然后会提示你继续修改还是返回,只需做出“Y/N”的选择即可。
若选Y则退出,选择N则继续输入学号修改直至修改完成。
自我觉得这个功能蛮不错的了,设计的还可以,至于改进的地方嘛,暂时还没想到。
以下是运行时的截图:
5.显示功能:
显示功能相对前几个功能实现起来简单,所以没花费多大功夫来编写,但是为了视觉感受更好,或者说美观,显示时学号、姓名、性别、年龄、入学时间、家庭住址和联系电话的显示间隔得恰当。
我觉得这个功能改进的地方不多,如要改进也就是一些细节,没有更多算法或者方法的改进。
以下是该功能运行时的软件截图:
6.装入功能:
本功能是对打开文件的应用,功能实现良好,操作时在链表不为空的前提下输入文件名,若存在该文件,则将文件中的学生信息按照学生学号非降序插入到当前链表中;若是没有该命名的文件或者文件打不开,则输出“打开文件失败”。
本功能的最大缺点是只能在当前链表不是空表的情况下(即有学生信息时)才能把文件中学生信息按学号非降序插入到链表中;如果链表为空则不能,程序会结束。
所以该功能需要改进,那就是使当前链表为空的时候也能直接从文件中读出数据,放入链表中。
以下分别是上述两种情况下的运行截图:
7.保存功能:
该功能实现良好,保存没有任何问题。
操作时也是先输入文件名,如果能打开/创建文件,则进行保存并输出“保存成功”;相反,如果打不开文件或者创建文件失败,则输出“打开文件失败”。
具体功能运行时的图样如下:
8.退出功能:
该功能实现完善,改进空间不大。
操作时,只要在提示确定是否退出时选择Y或N即可,Y即退出;N则返回主菜单;
具体运行时截图如下:
八.实验总结
该程序设计大概花费我大约4周的时间,设计过程中遇到了很多棘手的问题,但是通过上网查资料,上图书馆看书、查阅资料等途径这些问题全部解决了。
虽然该程序不是完美的,但是它能充分实现课程设计要求的功能,所以个人认为还是不错的。
首先,通过该次课程设计,我对线性表有了更深入的认识,对线性链表的操作有了更熟练的掌握,包括对线性链表的创建、链表中删除结点、插入结点、链表元素按非降序排序、求结点前驱、求结点后继等。
此外,对于C语言编程,之前文件操作相关部分一直是我的薄弱环节,这次课程设计是对C语言中文件操作的一次复习和应用,个人感觉现在对文件的操作能力有所提升。
除此之外,该次课程设计由于时间相对充裕,所以我对软件中细节比如界面美观度、操作的方便程度还是多花了些功夫,虽然说不是全部功能都界面良好、操作方便,但至少部分是这样的。
其次,完成该课程设计的过程也是一个让我坚定专心致志做事的信念的过程,同时也是一个不断发现错误、纠正错误的过程。
正是这样的一个过程,也才使我明白到底相关知识怎么用才对,同样可以达到目标的算法那种更简洁,实现更快。
在整个过程中有时候感觉找不出错误,很着急甚至于很失望,但是毕竟还得做出来,所以就得锻炼自己静下心来,慢慢思考。
每当一个新的思路出现,或者查到新的算法的时候感觉很值得,努力的结果得到回报。
所以我一直用一位成功人士的语录“专注使我们更成功!
”来激励自己。
第三,通过自己看书,到网上搜索相关资料,到图书馆查资料等都能够提升个人学习的能力。
对此,我深有感触,不懂的问题就得问,问同学,问老师,或者自己去查,但不能蒙混过关,需要用到的自己没学过的知识也得查。
关于程序中修改功能我问过同学、老师,后来老师的解答使我一下明白了自己的错误之处,所以询问和查找是非常重要的。
通过询问、查找、浏览、学习就能掌握额外的知识,使其完全变为自己所拥有的知识,这样在以后的学习和人生道路上也就很轻松地运用了。
当然,此次课设也暴露了我自己在编程方面的诸多不足之处。
大概有以下一些方面。
1.出现错误时不从根源处找错误,比如起初在我设计过程中,运行删除功能后查找时就死循环,我一直在查找函数部分找错误,其实是链表初始化的时候就有些不完善,导致了删除后再查找时的错误。
2.对文件的运用还需练习,文件部分的操作容易出错。
比如,运行保存文件功能时,系统提示我不能保持文件,空间不足,后面发现真正原因是打开文件方式不对。
3.缺乏改进的新思路,在以后的学习中还得继续改进。
最后,对该次课设还有一点小建议,那就是希望能在最后进行小组讨论学习,将每个人的课设进行互相交换修改意见,学习别人的新算法或新思路。
老师也可以给出指导。
(报告完)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告 源代码 学生 管理 系统