数据结构课程设计报告(附源代码)-学生管理系统(共27页).doc
精选优质文档-倾情为你奉上课程设计报告(一)一 报告题目:学生管理系统二 实验目的:1. 熟悉线性链表,掌握线性链表的基本操作;2. 练习求线性表中指定结点元素及修改指定结点的元素、求指定结点的前驱/后继元素、删除指定结点的元素、在指点节点位置插入元素等。3. 通过文件保存和读取文件来提升文件操作的能力;4. C语言编程能力的提升训练。三 实验环境:C语言编程,VC+6.0编程工具实现。四 软件系统结构1.总体架构/层次:学生管理系统(汉化版)学生管理功能数据存取处理录入新学生信息/插入新学生数据查找学生信息删除学生信息修改学生信息显示全部学生信息将学生信息存入文件(录入)从文件读取学生数据(装入)2.各功能的实现流程图:函数1:录入功能实现流程图开始输入新学生信息按学号非降序插入到链表中完成函数4:删除功能实现流程图开始输入要修改的学生学号按学号查找该学生找到了该学生信息?修改是完成?Y/N“不用修改”否返回主菜单YN函数2:查找功能实现流程图开始输入学生查找学号按学号查找学生找到记录?是完成查找?Y/N显示该学生信息Y返回主菜单N否函数3:删除功能实现流程图开始输入要删除学生的学号查找该学生链表中存在?是删除该学生信息删除完毕?Y/NYN返回主菜单否函数5:显示功能实现流程图开始链表是否为空?否输出“无记录”显示函数输出全部记录返回主菜单是函数6:文件装入功能实现流程图开始输入文件名打开文件成功?按非降序插入链表是输出“打开文件失败”输出“装入成功”返回主菜单否函数7:文件保存功能实现流程图开始输入文件名打开文件成功?是写入文件输出“存入成功”输出“打开文件失败”返回主菜单否函数8:退出菜单功能实现流程图开始确定退出吗?Y/NYt=0/*t=1是菜单执行条件*/退出N返回主菜单结束五 软件功能设计:本软件是要编写一个学生管理系统,一个学生有很多相关数据,包括学号、姓名、性别、年龄、家庭住址、练习电话,因此我们利用线性链表的知识来编写程序,这是因为线性链表有很多优良的特点,因此该程序是对线性链表的应用练习。本软件利用线性链表的特点,结合文件相关函数的运用,它能够实现以下功能:1. 用结点的数据域存放学生的学号、姓名、性别、年龄、家庭住址、练习电话;2. 利用结点的指针域访问某个结点的前驱或者后继;3. 录入新学生信息并按非降序插入到链表中;4. 查找给定学号的结点学生信息;5. 删除给定学号的结点学生信息;6. 修改给定学号的结点学生信息;7. 显示全部结点的学生信息;8. 将链表中的学生信息全部存入文件;9. 将已存在的学生信息文件中的学生信息按学号非降序插入到当前链表中;六.源程序代码:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<windows.h>#define NAMELEN 15#define ADDRLEN 10#define TELLEN 15#define OVERFLOW 0#define ERROR 0#define FALSE 0#define OK 1#define TRUE 1struct stud long num;char nameNAMELEN+1;char sex;int age;char AddrADDRLEN+1;long rxsj;char lxfsTELLEN+1;typedef stud ElemType;/链表结点元素为结构体FILE *fp;typedef struct LNodeElemType data;LNode *next; *LinkList;/typedef LNode *;int InitList(LinkList &L) /操作结果:构造一个空的线性表LL=(LinkList )malloc(sizeof(LinkList);/产生头结点,并使L指向头结点if(!L)/存储分配失败exit(OVERFLOW);L->next=NULL;/ 指针域为空return OK; int ListTraverse(LinkList L,void(*vi)(ElemType)/条件:线性表已存在 /操作结果:一次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败 LinkList p=L->next; while(p) vi(p->data); p=p->next; printf("n"); return OK;void InsertAscend(LinkList L,ElemType e) /按学号非降序插入 LinkList q=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;void ReadIn(stud &e)/由键盘输入结点信息 int a=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("格式不对,重输入:"); else if(e.sex='m'|e.sex='f')a=0; ; printf("年龄:"); scanf("%d",&e.age); printf("家庭住址(<=%d个字符):",ADDRLEN); scanf("%s",e.Addr); printf("入学时间(格式如):"); scanf("%ld",&e.rxsj); printf("联系方式:"); scanf("%s",e.lxfs); getchar(); void Print(stud e)/显示记录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");void WriteToFile(stud e)/装入文件函数/将结点信息写入fp指定的文件 fwrite(&e,sizeof(stud),1,fp);int ReadFromFile(stud &e)/由fp指定的文件读取结点信息到e int i; i=fread(&e,sizeof(stud),1,fp); if(i=1)/读取文件成功 printf("ok"); return OK; else return ERROR;int FindFromNum(LinkList L,long num,LinkList &p,LinkList &q) /查找表中学号为num的结点,如找到,q指向此结点,p指向q的前驱 /并返回TURE,否则返回ERROR p=L; while(p) q=p->next; if(q&&q->data.num>num) break;else if(q&&q->data.num=num) return TRUE;else p=q; return FALSE; int DeleteElem(LinkList L,long num) /删除表中学号为num的元素,并返回TURE;如无此元素,则返回FALSE LinkList p,q; if(FindFromNum(L,num,p,q)/找到此结点,且q指向该结点,p指向该结点的前驱 p->next=q->next; free(q); return TRUE; else return FALSE; void Modify(ElemType &e) char s50; printf(" 学号 姓名 性别年龄 家庭住址入学时间 联系方式n"); Print(e); printf("请输入新信息,不需要修改的直接按enter键保持原信息:nn"); 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=s0; 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);/修改完毕 void main() int i,t=1; long num; char s,filename13; ElemType e; LinkList T,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("nn"); printf("请选择操作数字:"); scanf("%d",&i); getchar(); switch(i) case 1: ReadIn(e); InsertAscend(T,e);printf("nn");break;case 2: 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("nn"); printf("完成查找?Y/N n");scanf("%s",&s);if(s='Y'|s='y')i=0; break; case 3: 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("nn"); break;case 4:i=1; while(i) printf("请输入要修改的学生的学号:"); scanf("%ld",&num); getchar(); if(!FindFromNum(T,num,p,q) printf("没有这个学生,不用修改nn"); 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("nn"); break;case 5:if(T->next=NULL)printf("无记录!"); elseprintf("学号 姓名 性别 年龄 家庭住址 入学时间 联系方式n"); ListTraverse(T,Print); break; case 6: printf("请输入文件名:"); scanf("%s",filename); getchar(); if(fopen(filename,"rb")=NULL) printf("打开文件失败!n"); else while(ReadFromFile(e) InsertAscend(T,e); printf("装入成功!n"); fclose(fp); break;case 7: printf("请输入文件名:"); scanf("%s", filename); getchar(); if(fp=fopen(filename,"wb")=NULL) printf("打开文件失败!nn"); else ListTraverse(T,WriteToFile); printf("存入成功!n"); fclose(fp); break;case 8: printf("确定退出吗?Y/N n"); scanf("%s",&s); if(s='Y'|s='y')t=0; else if(s='N'|s='n')void main(); break;default: system("CLS"); printf("没有这个功能,请重新选择!"); printf("nn"); void main(); 六 实验结果与分析:1. 录入功能:该功能实现良好,操作也较简单,程序运行时每一步都会有提示,如“请输入入学时间(格式如)”、“请输入性别(m:男 f:女)”等,所以实现很方便。如果要改进,可以设置录入学生个数控制。以下是一些截图:2. 查找功能:该功能实现良好,只需输入学号即可查找学生信息,但是只能利用学号查询,这是本功能的不足之处,也是改进的地方,可以增加利用姓名、家庭地址、电话号码查找等,运行时如图示:3. 删除功能:该功能分为两步,第一步:查找;第二步:删除。因此结果也就有两种,一种:没有要删除的记录,提示“没有记录,不用删除”;另一种就是删除掉查找到的学生的所有信息并提示“删除成功”。该功能实现良好,但是也有改进的地方,比如:不能利用姓名来删除,可以实现无论是输入学号还是姓名,查找到后软件先显示该学生记录,由用户确认删除后再删除,这点还没有做到,有待改进。下图为截图:4. 修改功能:该功能比较完善,先要输入你要修改的学生的学号,查找到后输入信息等待用户确认,而且提示你不用修改的项可以按enter键保留,需要修改的则输入新数据即可,所以操作方便;若没查找到则提示你 “没有这个学生,不用修改”。然后会提示你继续修改还是返回,只需做出“Y/N”的选择即可。若选Y则退出,选择N则继续输入学号修改直至修改完成。自我觉得这个功能蛮不错的了,设计的还可以,至于改进的地方嘛,暂时还没想到。以下是运行时的截图:5. 显示功能:显示功能相对前几个功能实现起来简单,所以没花费多大功夫来编写,但是为了视觉感受更好,或者说美观,显示时学号、姓名、性别、年龄、入学时间、家庭住址和联系电话的显示间隔得恰当。我觉得这个功能改进的地方不多,如要改进也就是一些细节,没有更多算法或者方法的改进。以下是该功能运行时的软件截图:6. 装入功能:本功能是对打开文件的应用,功能实现良好,操作时在链表不为空的前提下输入文件名,若存在该文件,则将文件中的学生信息按照学生学号非降序插入到当前链表中;若是没有该命名的文件或者文件打不开,则输出“打开文件失败”。本功能的最大缺点是只能在当前链表不是空表的情况下(即有学生信息时)才能把文件中学生信息按学号非降序插入到链表中;如果链表为空则不能,程序会结束。所以该功能需要改进,那就是使当前链表为空的时候也能直接从文件中读出数据,放入链表中。以下分别是上述两种情况下的运行截图: 7. 保存功能:该功能实现良好,保存没有任何问题。操作时也是先输入文件名,如果能打开/创建文件,则进行保存并输出“保存成功”;相反,如果打不开文件或者创建文件失败,则输出“打开文件失败”。具体功能运行时的图样如下:8. 退出功能:该功能实现完善,改进空间不大。操作时,只要在提示确定是否退出时选择Y或N即可,Y即退出;N则返回主菜单;具体运行时截图如下:八 实验总结该程序设计大概花费我大约4周的时间,设计过程中遇到了很多棘手的问题,但是通过上网查资料,上图书馆看书、查阅资料等途径这些问题全部解决了。虽然该程序不是完美的,但是它能充分实现课程设计要求的功能,所以个人认为还是不错的。首先,通过该次课程设计,我对线性表有了更深入的认识,对线性链表的操作有了更熟练的掌握,包括对线性链表的创建、链表中删除结点、插入结点、链表元素按非降序排序、求结点前驱、求结点后继等。此外,对于C语言编程,之前文件操作相关部分一直是我的薄弱环节,这次课程设计是对C语言中文件操作的一次复习和应用,个人感觉现在对文件的操作能力有所提升。除此之外,该次课程设计由于时间相对充裕,所以我对软件中细节比如界面美观度、操作的方便程度还是多花了些功夫,虽然说不是全部功能都界面良好、操作方便,但至少部分是这样的。其次,完成该课程设计的过程也是一个让我坚定专心致志做事的信念的过程,同时也是一个不断发现错误、纠正错误的过程。正是这样的一个过程,也才使我明白到底相关知识怎么用才对,同样可以达到目标的算法那种更简洁,实现更快。在整个过程中有时候感觉找不出错误,很着急甚至于很失望,但是毕竟还得做出来,所以就得锻炼自己静下心来,慢慢思考。每当一个新的思路出现,或者查到新的算法的时候感觉很值得,努力的结果得到回报。所以我一直用一位成功人士的语录“专注使我们更成功!”来激励自己。第三,通过自己看书,到网上搜索相关资料,到图书馆查资料等都能够提升个人学习的能力。对此,我深有感触,不懂的问题就得问,问同学,问老师,或者自己去查,但不能蒙混过关,需要用到的自己没学过的知识也得查。关于程序中修改功能我问过同学、老师,后来老师的解答使我一下明白了自己的错误之处,所以询问和查找是非常重要的。通过询问、查找、浏览、学习就能掌握额外的知识,使其完全变为自己所拥有的知识,这样在以后的学习和人生道路上也就很轻松地运用了。当然,此次课设也暴露了我自己在编程方面的诸多不足之处。大概有以下一些方面。1 出现错误时不从根源处找错误,比如起初在我设计过程中,运行删除功能后查找时就死循环,我一直在查找函数部分找错误,其实是链表初始化的时候就有些不完善,导致了删除后再查找时的错误。2 对文件的运用还需练习,文件部分的操作容易出错。比如,运行保存文件功能时,系统提示我不能保持文件,空间不足,后面发现真正原因是打开文件方式不对。3 缺乏改进的新思路,在以后的学习中还得继续改进。最后,对该次课设还有一点小建议,那就是希望能在最后进行小组讨论学习,将每个人的课设进行互相交换修改意见,学习别人的新算法或新思路。老师也可以给出指导。 (报告完)专心-专注-专业