顺序表结构的学生信息管理系统.docx
- 文档编号:29643230
- 上传时间:2023-07-25
- 格式:DOCX
- 页数:40
- 大小:248.72KB
顺序表结构的学生信息管理系统.docx
《顺序表结构的学生信息管理系统.docx》由会员分享,可在线阅读,更多相关《顺序表结构的学生信息管理系统.docx(40页珍藏版)》请在冰豆网上搜索。
顺序表结构的学生信息管理系统
海南大学
《数据结构》课程设计
题目:
学生信息管理系统
学号:
20142835320016
姓名:
侯孟禹
年级:
2014级
学院:
应用科技学院
系别:
工学部
专业:
物联网工程
指导教师:
梁建慧
完成日期:
2016年6月10日
中文摘要
学生信息管理系统是人们日常生活中经常要用到的管理工具,它以文件的方式保存用户录入的数据,并提供查询功能供用户查询和使用学生信息管理系统。
本次设计的学生信息管理系统,支持基本的录入、删除、查找、修改和文件读写等功能。
此学生信息管理系统基于结构化程序设计思想和所使用的C语言开发环境与开发工具,并运用“软件工程”和“数据结构”中的有关概念和方法,针对具体设计题目和要求,分析功能要求,划分功能模块,用链表结构设计功能模块函数,以菜单方式调用相应功能模块来实现信息和数据处理。
关键词:
学生管理系统;顺序表
Englishabstract
StudentinformationmanagementsystemisoftenusedinPeople'sDailylifemanagementtool,itsavestheuserinputdataintheformofdocuments,andprovidethequeryfunctionfortheuseofuserqueriesandstudentinformationmanagementsystem.Thedesignofstudentinformationmanagementsystem,supportbasicinput,delete,search,modify,andreadandwritefiles,andotherfunctions.ThestudentinformationmanagementsystembasedonstructuredprogrammingideasandtheuseofClanguagedevelopmentenvironmentanddevelopmenttools,andusingthe"softwareengineering"and"datastructure"oftherelevantconceptsandmethods,inviewofthespecificdesignquestionsandrequirements,analysisoffunctionalrequirements,thedivisionoffunctionmodules,withchaintablestructuredesign,functionmodulefunction,tocallthecorrespondingfunctionmodulemenuwaytoimplementtheinformationanddataprocessing
Keywords:
studentmanagementsystem;sequencelistt
方案分析
经过对程序设计题目的分析可知,学生信息基本属性包括学号、姓名、性别、住址、联系电话。
整个程序的设计实现大致分为多个模块,每一个模块对应一个函数。
在这些函数当中需要具有如下功能,学生信息的录与删除、查找和修改学生信息、按学号排序函数等。
读取文件函数对其它函数的实现起辅助作用,主函数及菜单函数控制程序的整体运行。
在数据关系上,我采用了顺序表的方案,顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。
线性表采用顺序存储的方式存储就称之为顺序表。
顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。
本系统中以数组为存储体,每一个数组元素为一个包含学生所有信息的结构体,这在技术上与法律法规上都具有可行性。
程序设计
输入输出模块
信息的录入
/*******************************************************************/
intinput(Sqlist*q){
inti,j;
printf("输入所要录入个数:
");
scanf("%d",&i);
for(j=q->length;jlength;j++){
printf("学号:
");
scanf("%d",&(q->elem[j].number));
printf("姓名:
");
scanf("%s",&(q->elem[j].name));
printf("性别:
");
scanf("%s",&(q->elem[j].sex));
printf("地址:
");
scanf("%s",&(q->elem[j].adress));
printf("电话号码:
");
scanf("%s",&(q->elem[j].tlnumber));
}
q->length=q->length+i;
returnOK;
}
/*******************************************************************/
此函数功能:
学生信息的录入
函数构思:
用户输入需要录入的学生信息的个数i。
通过for语句控制输入函数的循环次数从而达到多次对学生信息的录入。
录入的循环需要考虑到顺序表原来的长度和录入后顺序表的长度。
函数返回值为OK或者ERROR,返回OK表示操作成功,返回ERROR表示操作失败。
信息的遍历
/******************************************************************/
inttraverse(Sqlist*q){
inti,j=q->length;
if(!
q->elem)returnERROR;
for(i=0;i printf("学号: %d",q->elem[i].number); printf("姓名: %s",q->elem[i].name); printf("性别: %s",q->elem[i].sex); printf("地址: %s",q->elem[i].adress); printf("电话号码: %s\n",q->elem[i].tlnumber); printf("\n"); } returnOK; } /*******************************************************************/ 函数功能: 对所有学生信息的遍历 函数构思: 首先判断顺序表是否为空,为空则返回ERROR,操作失败。 由于已知表长length,所以可以通过for循环语句,length为循环控制条件,依次输出顺序表中的学生信息。 信息的查询 /*******************************************************************/ intseek(Sqlist*q){//查找函数 inte,i=0,j=q->length; intchoose; chars[10]; printf("1: 学号查询2: 姓名查询\n"); printf("请输入操作: "); scanf("%d",&choose);//分为学号查找和姓名查找 switch(choose){ case1: { printf("输入所要查询的学号: "); scanf("%d",&e); while(q->elem[i].number! =e){ i++; if(i==j){ printf("没有该学生信息! \n"); returnERROR; } } printf("学号: %d",q->elem[i].number); printf("姓名: %s",q->elem[i].name); printf("性别: %s",q->elem[i].sex); printf("地址: %s",q->elem[i].adress); printf("电话号码: %s\n",q->elem[i].tlnumber); returnOK; } case2: { printf("输入所要查询的姓名: "); scanf("%s",s); while(strcmp(q->elem[i].name,s)){ i++; if(i==j){ printf("没有该学生信息! \n"); returnERROR; } } printf("学号: %d",q->elem[i].number); printf("姓名: %s",q->elem[i].name); printf("性别: %s",q->elem[i].sex); printf("地址: %sn",q->elem[i].adress); printf("电话号码: %s\n",q->elem[i].tlnumber); returnOK; } } returnOK; } /*******************************************************************/ 函数功能: 学生信息的查询 函数构思: 对学生信息的查询分为学号查询和姓名查询。 这样做的好处为,当我们只知道学生学号与姓名其中一个信息的时候就可以方便的查询到学生的全部信息。 函数体首先提示用户选择查询方式,并通过switch()语句判断用户想要通过什么方式查询信息。 学号查询所使用的是简单的数字的比较,判断学号是否相同,从而达到查找的目的。 如果学号相同,则输出该学生的全部信息。 否,则提示用户没有找到该学生的信息。 姓名查找则是通过字符串比较函数strcmp(),比较用户输入的字符串与数据库中的字符串是否有相同。 若有,则输出该学生全部信息。 否,则提示用户没有找到该学生的信息。 管理模块 信息的删除 /*******************************************************************/ intqdelete(Sqlist*q){//删除函数 inte,i=0,j=q->length,k; printf("输入所要删除的学号: "); scanf("%d",&e); while(q->elem[i].number! =e){ i++; if(i==j){ printf("没有该学生信息! \n"); returnERROR; } } printf("学号: %d",q->elem[i].number); printf("姓名: %s",q->elem[i].name); printf("性别: %s",q->elem[i].sex); printf("地址: %s",q->elem[i].adress); printf("电话号码: %s\n",q->elem[i].tlnumber); k=j-i-1; while(k--){ q->elem[i]=q->elem[i+1]; i++; } (q->length)--; returnOK; } /*******************************************************************/ 函数功能: 学生信息的删除 函数构思: 想要删除学生信息,首先需要找到该学生所在线性表的位置。 函数通过比较学生学号的方式找到学生信息在顺序表中的位置。 然后将该学生的信息输出。 线性表中的删除就是简单的后面的数组信息覆盖前面的数组信息。 所以只要控制好删除位置后面的数组元素前移的次数就可以达到对学生信息的删除。 这里循环控制通过while语句,k为顺序表长度减去删除位置再减一,i控制数组元素。 最后,顺序表长度减一,返回OK,表示函数操作成功。 信息的修改 /*******************************************************************/ intalter(Sqlist*q){ inte,i=0,j=q->length,choose,c; chars[10],n[10]; printf("1: 按学号查找并修改2: 按姓名查找并修改\n"); printf("请输入操作: "); scanf("%d",&choose); switch(choose){//选择需要修改的信息 case1: { printf("输入所要查找的学号: "); scanf("%d",&e); while(q->elem[i].number! =e){ i++; if(i==j){ printf("没有该学生信息! \n"); returnERROR; } } printf("学号: %d",q->elem[i].number); printf("姓名: %s",q->elem[i].name); printf("性别: %s",q->elem[i].sex); printf("地址: %s",q->elem[i].adress); printf("电话号码: %s\n",q->elem[i].tlnumber); break; } case2: { printf("输入所要查找的姓名: "); scanf("%s",s); while(strcmp(q->elem[i].name,s)){ i++; if(i==j){ printf("没有该学生信息! \n"); returnERROR; } } printf("学号: %d",q->elem[i].number); printf("姓名: %s",q->elem[i].name); printf("性别: %s",q->elem[i].sex); printf("地址: %s",q->elem[i].adress); printf("电话号码: %s\n",q->elem[i].tlnumber); break; } } printf("1: 修改学号2: 修改姓名3: 修改性别4: 修改地址5: 修改电话号码\n"); printf("请输入操作: "); scanf("%d",&c); switch(c){ case1: { printf("输入新的学号: "); scanf("%d",&(q->elem[i].number)); returnOK; } case2: { printf("输入新姓名: "); scanf("%s",n); strcpy(q->elem[i].name,n); returnOK; } case3: { printf("输入性别: "); scanf("%s",n); strcpy(q->elem[i].sex,n); returnOK; } case4: { printf("输入新地址: "); scanf("%s",n); strcpy(q->elem[i].adress,n); returnOK; } case5: { printf("输入新的电话号码: "); scanf("%s",n); strcpy(q->elem[i].tlnumber,n); returnOK; } } returnOK; } /*******************************************************************/ 函数功能: 修改学生信息 函数构思: 同样,想要修改学生信息首先需要找到该学生的信息所在的位置。 学生信息位置的查找跟上述学生信息查询函数的方式相同。 为学号查找与姓名查找。 查找到学生信息后,提示用户需要修改的项目,分别为学号、姓名、性别、地址以及电话号码。 通过seitch语句判断用户输入的数以知晓用户想要修改哪一项。 提示以后输入新的数据并将旧的数据覆盖。 最后返回OK跳出函数,学生信息修改完成。 信息的排序 /*******************************************************************/ intRanklist(Sqlist*q){//按学号大小排序(从小到大) inti,j; intl=q->length; Studentt; for(i=0;i for(j=i+1;j if((q->elem[i].number)>(q->elem[j].number)){ t=q->elem[i]; q->elem[i]=q->elem[j]; q->elem[j]=t; } returnOK; } /******************************************************************/ 函数功能: 按学生信息中学号的大小对学生进行排序 函数构思: 此函数的的整体构思为冒泡排序法。 冒泡排序法相对简单,而且易操作。 冒泡排序算法的运作如下: (从后往前) 比较相邻的元素。 如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。 在这一点,最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 时间复杂度 若文件的初始状态是正序的,一趟扫描即可完成排序。 所需的关键字比较次数 和记录移动次数 均达到最小值: , 。 所以,冒泡排序最好的时间复杂度为 。 若初始文件是反序的,需要进行 趟排序。 每趟排序要进行 次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。 在这种情况下,比较和移动次数均达到最大值: 冒泡排序的最坏时间复杂度为 。 文件操作模块 数据写入文件 /*******************************************************************/ intsave(Sqlist*q){//存盘函数 intl=q->length,i; FILE*fp; if((fp=fopen("student.txt","w"))==NULL) returnERROR; for(i=0;i fprintf(fp,"%d%s%s%s%s\n",q->elem[i].number,q->elem[i].name,q->elem[i].sex,q->elem[i].adress,q->elem[i].tlnumber); fclose(fp); returnOK; } /*******************************************************************/ 函数功能: 将学生信息保存至文件中 函数构思: 对文件读写之前应该打开该文件,在使用结束后应该关闭该文件。 打开和关闭是形象的说法,好像打开大门才能进房子一样,门关上就不能进入一样。 实际上,所谓的打开就是指为文件建立相应的信息区和文件缓存区。 C语言中用标准输入输出函数fopen来实现打开文件。 fopen("student.txt","w")其中student.txt为文件名,w为只写,表是为了输出数据,打开一个文本文件。 在使用一个函数后应该关闭它,以防止它在被误用。 关闭就是撤销文件信息区和文件缓存区,使文件指针变量不在指向文件,此后不能在通过该指针对原来语气相联系的文件进行读写操作,除非在此打开它,是该知足重新指向该文件。 数据读出文件 /*******************************************************************/ intopen(Sqlist*q){//读盘函数 FILE*fp; inti=0,number_; charname_[20],sex_[10],adress_[20],tlnumber_[20]; if((fp=fopen("student.txt","r"))==NULL) returnERROR; q->elem=(Student*)malloc(sizeof(Student[MAXSIZE])); if(! q->elem)returnERROR; q->length=0; while(! feof(fp)){ fscanf(fp,"%d%s%s%s%s\n",&number_,name_,sex_,adress_,tlnumber_); q->elem[i].number=number_; strcpy(q->elem[i].name,name_); strcpy(q->elem[i].sex,sex_); strcpy(q->elem[i].adress,adress_); strcpy(q->elem[i].tlnumber,tlnumber_); i++; } q->length=i; fclose(fp); returnOK; } /*******************************************************************/ 函数功能: 将文件中的数据读到内存中 函数构思: 函数的读出也需要打开文件与关闭文件。 然后分配新的存储空间给将要读出的数据,通过fscanf函数将文件中的数据读出。 测试 打开元素数据并遍历 新学生信息的录
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 顺序 结构 学生 信息管理 系统