




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验一一、 课题任务设计一个“学生基本信息管理系统”。主要实现学生基本信息的录入、插入、修改、删除、查询等基本功能。学生信息包括学生的学号、姓名、性别、年龄、家庭地址、电话等信息,具体功能如下:l 获取学生基本信息。可以从文件中读取基本信息,也可直接录入。l 查询学生基本信息。输入学生学号或姓名等信息后,显示学生的所有信息。l 添加学生基本信息。在学生基本信息表的指定位置添加学生基本信息。(由于本实验按照“学生学号非降序顺序”的储存顺序,故不需要在指定位置添加学生信息即可实现对学生信息的储存)l 修改学生基本信息。在学生基本信息表中,修改指定学生的基本信息。l 删除学生基本信息。在学生基本信息表中,删除指定学生的基本信息。l 保存文件。当学生基本信息表发生添加、修改、删除等变化后,都要对最终结果进行保存。本实验采用链表对学生基本信息进行存储,使用链表的基本算法实现学生基本信息的各项管理功能。二、 概要1. 函数说明本程序包含12个函数:主函数main();链表初始化函数:InitList();遍历函数:ListTraverse();输入函数:ReadIn();插入函数:InsertAscend();写入文件函数:WriteToFile();读入文件函数:ReadFromFile();打印函数:Print();学号查找函数:FindFromNum();姓名查找函数:FindFromName();删除元素函数:DeleteElem();修改函数:Modify().2. 抽象数据类型的定义本实验对链表的操作涉及到如下抽象数据类型:ADT List 数据对象:D = ai | ai ElemSet, i=1,n,n0 数据关系:R1 = | ai-1,ai D, i=2, ,n 基本操作: InitList (&L) 操作结果:构造一个空的线性表L。ListTraverse(L,visit()初始条件:线性表L已存在。操作结果:依次对L的每个数据元素调用函数visit()。一旦visit()失败,则操作失败。DeleteElem(L,e)初始条件:线性表L存在且非空。操作结果:通过查找,删除L中值为e的元素。FindFromList(L,e,&p,&q)初始条件:线性表L存在且非空。操作结果:查找L中值为e的元素,查找成功,则返回TRUE,否则返回FALSE。WriteToFile(e)初始条件:e包含所需信息。操作结果:将信息写入指定文件。ReadFromFile(e)初始条件:文件已存在。操作结果:从指定的文件读取信息到e。InsertAscend(L, e)初始条件:线性表L已存在。操作结果:将e按照非降序插入L。ADT List3. 主程序流程本实验的主程序流程如下:输入初始学生信息从文件读入学生信息添加新的学生信息查询学生信息修改学生信息删除学生信息显示所有学生信息将所有学生信息存入文件操作结束主程序数据类型定义链表初始化主菜单4. 调用说明本实验将头文件、函数文件、主程序写入一个cpp文件,不存在多文件之间的相互调用。各程序模块之间的调用关系如下:三、 详细设计1. 学生信息结构类型定义:struct studchar nameNAMELEN;long long num;char sex;int age;char tel20;char addressADDRESSLEN;typedef struct stud ElemType;2. 链表结点定义:struct LNodeElemType data;LNode *next;typedef struct LNode *LinkList;3. 实现命令选择的算法:通过分支结构实现不同命令(菜单)的设置,用户可选择不同的命令而进行相应的操作。4. 实现录入学生初始信息算法:先将录入的学生信息保存在结构数组中,再将其按照非降序插入到链表中,具体算法如下:(k=0)scanf(%s,);/读入姓名scanf(%ld,&studentk.num);/读入学号scanf(%*c%c,&studentk.sex);/读入性别scanf(%d,&studentk.age);/读入年龄scanf(%s,studentk.tel);/读入电话scanf(%s,studentk.address);/读入家庭住址InsertAscend(T,studentk+);/将所录入信息插入到链表5. 实现插入学生信息算法:通过调用ReadIn()函数和InsertAscend()函数分别实现信息的输入以及信息的插入,具体算法如下:ReadIn(e);InsertAscend(T,e);6. 实现查找学生信息的算法:本算法是通过学生姓名或者学号索引从而查找学生所有信息,具体是先通过调用FindFromName()或FindFromNum()函数对学生姓名和学号进行查找,若查找成功则调用Print()函数输出对应的学生信息。7. 实现学生信息修改算法:本算法和查找算法类似,也是先通过调用FindFromName()或FindFromNum()两个函数查询到学生信息,然后再调用修改函数Modify()实现对学生信息的修改,如果学生学号发生改动,则再次调用插入函数InsertAscend()将学生信息插入到链表中。8. 实现学生信息删除算法:本算法主要通过调用删除元素函数DeleteElem()实现对学生信息的删除操作。9. 实现显示所有学生信息算法:本算法主要通过调用遍历函数ListTraverse()函数实现对所有学生信息的遍历,然后再嵌套调用Print()函数实现对学生信息的输出,具体算法如下:ListTraverse(T,Print);10. 实现文件的读取算法:本算法是通过文件的基本操作来实现,具体如下;/文件读取操作printf(请输入文件名: );scanf(%s,filename);if(fp=fopen(filename,rb)=NULL)printf(打开文件失败!n);elsewhile(ReadFromFile(e)InsertAscend(T,e);fclose(fp);/文件保存操作printf(请输入文件名: );scanf(%s,filename);if(fp=fopen(filename,wb)=NULL)printf(打开文件失败!n);elseListTraverse(T,WriteToFile);fclose(fp);四、 调试分析本实验在调试中遇到的主要问题如下:1. 刚开始,采用vs2012编译器来写程序,写完之后在程序运行过程中发现从来没有见过的错误,调不出黑框,而且在请教他人以及在网上搜索教程之后仍无法debug,从而导致初期调试失败。之后换了另一个编译器,才发现是原来编译器的出现了链接错误。在纠正了一些小错误之后,终于可以调试。2. 首先遇到的问题便是实现命令“1”。先是尝试将读入的学生信息直接插入链表,发现与命令“3”可能会有重复,在查阅资料后,采用了结构数组的储存形式,尝试先将学生信息储存到结构数组中,然后将其插入链表,此算法容易实现。问题的关键在于用什么样的方式控制输入的结束以及输入的格式,在进行了采用循环、eof结束符等等尝试之后,才探索出其实连用scanf即可实现。解决了这个问题,剩下的问题就基本好解决了,因为所有的命令都死建立在命令“1”上的。3. 关于链表的操作有基本的格式,因此在实现命令“3”“4”“5”“6”“7”“8”“9”没有出现太大的困难。4. 另一个棘手的问题便是关于文件的操作和处理。之前对文件的接触较少,因此在文件操作这方面一直是短板,好在查阅资料之后,能够实现了基本的文件操作,也符合了实验要求,达到了实验目的。五、 测试结果初始界面:命令“1”可以每次录入1个学生信息并将其保存:命令“3”添加新的学生信息并将其保存:命令“4”实现通过姓名对学生信息的查询:命令“5”实现通过学号对学生信息的查询:命令“6”实现通过姓名对学生信息的修改:(可用命令“10”实时查看当前学生信息)命令“7”实现通过学号对学生信息的修改:命令“8”实现通过姓名对学生信息的删除:命令“9”实现通过学号对学生信息的删除:命令“10”实现显示所有学生信息功能:命令“11”实现对学生信息的保存,文件将会被保存在当前工程目录下:命令“2”实现对已保存学生信息文件的读取:至此,本实验所有功能都实现。六、 附录本实验源代码如下:#include#include#include#include#include#include#include#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define NAMELEN 20#define STUDNUM 1000#define ADDRESSLEN 30using namespace std;typedef int Status;/定义节点信息struct studchar nameNAMELEN;long long num;char sex;int age;char tel20;char addressADDRESSLEN;typedef struct stud ElemType;/线性表的单链表存储结构struct LNodeElemType data;LNode *next;typedef struct LNode *LinkList; /另一种定义LinkList的方法FILE *fp;/文件操作Status InitList(LinkList &L) /* 操作结果:构造一个空的线性表L */L=(LinkList)malloc(sizeof(LNode); /* 产生头结点,并使L指向此头结点 */if(!L) /* 存储分配失败 */exit(OVERFLOW);L-next=NULL; /* 指针域为空 */return OK;Status ListTraverse(LinkList L,void(*vi)(ElemType)/* vi的形参类型为ElemType*/ /* 初始条件:线性表L已存在。操作结果:依次对L的每个数据元素调用函数vi() */LinkList p=L-next;while(p)vi(p-data);p=p-next;printf(n);return OK;void ReadIn(struct stud &e) /* 由键盘输入结点信息 */printf(请输入姓名: );scanf(%s,);printf(请输入学号: );scanf(%lld,&e.num);printf(请输入性别(m:男 f:女): );scanf(%*c%c,&e.sex);printf(请输入年龄: );scanf(%d,&e.age);printf(请输入电话: );scanf(%s,e.tel);printf(请输入家庭住址;);scanf(%s,e.address);void InsertAscend(LinkList L,ElemType e)/按学号非降序插入LinkList q=L,p=L-next;while(p&e.nump-data.num)q=p;p=p-next;q-next=(LinkList)malloc(sizeof(LNode);q-next-data=e;q-next-next=p;void WriteToFile(struct stud e) /* 将结点信息写入fp指定的文件 */fwrite(&e,sizeof(stud),1,fp);Status ReadFromFile(stud &e) /* 由fp指定的文件读取结点信息到e */int i;i=fread(&e,sizeof(stud),1,fp);if(i=1) /* 读取文件成功 */return OK;elsereturn ERROR;void Print(stud e) /* 打印记录e的内容 */printf( %s %6lld,,e.num);if(e.sex=m)printf( 男);elseprintf( 女);printf(%5d %-4s,e.age,e.tel);printf(%15sn,e.address);Status FindFromNum(LinkList L,long long num,LinkList &p,LinkList &q)/根据学号查找学生信息p=L;while(p)q=p-next;if(q&q-data.numnum)break;if(q&q-data.num=num)return TRUE;p=q;return FALSE;Status FindFromName(LinkList L,char name,LinkList &p,LinkList &q)/根据姓名查找学生信息p=L;while(p)q=p-next;if(q&!strcmp(,name)return TRUE;p=q;return FALSE;Status DeleteElem(LinkList L,long long num)/通过学号删除学生信息LinkList p,q;if(FindFromNum(L,num,p,q)p-next=q-next;free(q);return TRUE;return FALSE;Status DeleteElem(LinkList L,char name)/通过姓名删除学生信息LinkList p,q;if(FindFromName(L,name,p,q)p-next=q-next;free(q);return TRUE;return FALSE;void Modify(ElemType &e) /* 修改结点内容,并按学号将结点非降序插入链表L */ char s80; Print(e); /* 显示原内容 */ printf(请输入待修改项的内容,不修改的项按回车键保持原值:n); printf(请输入姓名: ); gets(s); if(strlen(s) strcpy(,s); printf(请输入学号: ); gets(s); if(strlen(s) e.num=atol(s); printf(请输入性别(m:男 f:女): ); gets(s); if(strlen(s) e.sex=s0; printf(请输入年龄: ); gets(s); if(strlen(s) e.age=atoi(s); printf(请输入电话: ); gets(s); if(strlen(s) strcpy(e.tel,s); printf(请输入家庭住址:); gets(s); if(strlen(s) strcpy(e.address,s); /* 修改完毕 */ int main()/主函数struct stud studentSTUDNUM;/定义结构数组,保存初始学生信息int i,j,k=0,flag=1;/flag作为标识long long num;char filename20,nameNAMELEN;ElemType e;LinkList T,p,q;/定义链表TInitList(T);初始化链表while(flag)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(9: 通过学生学号删除学生信息n);printf(10: 显示所有学生信息n);printf(11: 将所有学生信息存入文件n);printf(12: 操作结束n);printf(请选择操作命令:);scanf(%d,&i);printf(n);switch(i)case 1: printf(请依次输入姓名、学号、性别、年龄、电话、家庭住址:(学号不超过9位数)n); scanf(%s,); scanf(%lld,&studentk.num); scanf(%*c%c,&studentk.sex); scanf(%d,&studentk.age); scanf(%s,studentk.tel); scanf(%s,studentk.address);/依次读入学生信息InsertAscend(T,studentk+);/将学生信息插入链表printf(n); break;case 2:printf(请输入文件名: );scanf(%s,filename);if(fp=fopen(filename,rb)=NULL)printf(打开文件失败!n);/打开文件elsewhile(ReadFromFile(e)InsertAscend(T,e);fclose(fp);printf(n);break;case 3:printf(请输入以下信息:n);ReadIn(e);InsertAscend(T,e);printf(n);break;case 4:printf(请输入要查找的学生姓名: );scanf(%s,name);if(!FindFromName(T,name,p,q)printf(没有姓名为%s的学生信息n,name);elsePrint(q-data);printf(n);break;case 5:printf(请输入要查找的学生学号: );scanf(%lld,&num);if(!FindFromNum(T,num,p,q)printf(没有学号为%lld的学生信息n,num);elsePrint(q-data);printf(n);break;case 6:printf(请输入要修改的学生姓名:);scanf(%s%*c,name);if(!FindFromName(T,name,p,q)printf(没有姓名为%s的学生信息n,name);elsenum=q-data
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 设计师方案管理办法
- 自营交易室管理办法
- 舞蹈兴趣班管理办法
- 贷款重组相关管理办法
- 装载机安全管理办法
- 三库管理平台管理办法
- bt项目资金管理办法
- 上市公司证券管理办法
- 营销管理办法如何制定
- 管理办法试行啥意思
- 实习生劳务合作合同6篇
- 2025《义务教育信息科技课程标准(2022年版)》测试题库及答案(共4套)
- 环境监测业务流程
- 房屋提前移交免责协议书5篇
- (完整版)小学1-6年级英语单词(人教版)
- DB36-T 954-2024 低产低效林改造技术规程
- 《环境保护法》知识参考试题库200题(含答案)
- 食堂食材配送采购投标方案(技术标)
- 交通安全防御性驾驶
- 护理情景模拟演练脚本
- 征信异议申诉合同(2篇)
评论
0/150
提交评论