资源描述:
《计科2班户文龙C语言课程设计学生证管理系统》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
郑州科技学院C语言课程设计设计(论文)题目:学生证管理系统所在院:信息工程学院专业班级:13计算机科学与技术2班学生姓爸户文龙学号:201315040指导教师:李瑞霞2014年6月13日
1郑州科技学院课程设计(论文)任务书设计题目:学生证管理系统专业班级:13计算机科学与技术2班学号:201315040姓名:户文龙主要内容设计学生证管理系统,主要包含:输入信息模块、删除信息模块、查找信息模块、插入信息模块,显示信息模块。实现学生证的录入、增加、修改、删除、查询功能。通过菜单选择相应的操作,直观且操作简单。数据的存储选用数据文件方式;编辑平台选用MicrosoftVisualC++6.0。所用到的知识点有:三种基本程序结构,数组,函数,指针,结构体,文件操作和链表。基本要求按照内容要求,设计完整的学生证管理系统。要求调试通过,不存在漏洞,方便用户操作。功能的实现上力求容错能力强且提示信息完备。完成期限:2014年6月13日指导教师签名:评审小组负责人签名:
2摘要C语言是一种计算机程序设计语言。它既有高级语言的特点,又具有汇编语言的特点。它可以作为系统设计语言,编写工作系统应用程序。因此,它的应用范围广泛。C语言在很多方面都可以用,不仅仅是在软件开发上,各类科研都是需要用到C语言的。具体应用比如我是学硬件开发的,单片机以及很多系统都可以用C来开发。C语言发展如此迅速,而且成为最受欢迎的语言之一,主要因为它具有强大的功能。许多著名系统软件,如DBASEIHPLUS、DBASEIV都是由C语言编写的。用C语言加上一些汇编语言子程序,就更能显示C语言的优势了,像PC-DOS、WORDSTAR等就是用这种方法编写的。本程序就是一个信息管理系统,这个程序展现了C语言在信息处理方面的强大功能。能这系统的各种模块,你可以对学生证上面的信息进行正确处理。关键词:学生信息管理系统、学生证管理系统、软件工程
3目录1引言11.1开发背景12设计目的33总体设计43.1设计思想44.2设计基本概念44模块设计75.1主函数76.2输入模块设计85程序调试137.2输入135.4查找145.7显,,、166课程设计总结18参考文献20附录:源代码21
41引言1.1开发背景学生证管理系统,是针对学校人事处的大量业务处理工作而开发的管理软件,是典型的信息管理系统。它是•个教育单位不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关重要,它能够为用户提供充足的信息和快捷的查询手段。能有效的帮助学校和老师掌握学生的情况,为学生提供信息方面的查询。在传统模式下利用人工进行学生信息管理,存在着较多的缺点,如:效率底,保密性差,时间一长将产生大量的文件和数据,更不便于查找,更新,维护等。诸如这些情况,令学校管理者对学生的信息管理带来了很大困难,严重影响了教育工作者的工作效率。随着科学技术的不断提高,计算机科学日渐成熟,使用日趋成熟的计算机技术来代替传统的人工模式,来实现学生信息的现代化管理,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。作为计算机应用的一部分,使用计算机对学生信息进行管理,具有手工管理所无法比拟的优点.例如:检索迅速、查找方便、易修改、可靠性高、存储量大、数据处理快捷、保密性好、寿命长、成低、便于打印等。这些优点能够极大地提高学生信息管理的效率,也是学校的科学化、正规化管理,与世界接轨的重要条件。
51.1可行性分析(1)技术可行性我们已经学习了C语言程序设计。在C语言中利用函数指针等完全可以实现此功能。从理论上说,技术上没有有问题。(2)经济可行性学校为每位同学开放机房,软硬件齐备。所需资料可以免费上网查找或者到图书馆借阅相关书籍进行查询。总体上里来看,基本上都是学生无需投入个人经费。(3)社会可行性学生证管理系统是学校管理非常实用的一款系统,对于老师管理学生,学生自己查阅信息都是非常方便的。该系统为独立开发,在法律方面不会存在侵犯专利权,侵犯版权等问题,完全按照合法的规定履行。
62设计目的加强分析和解决问题的能力。通过这次的课程设计,能加强我们对程序设计的思考、设计、分析、理解和解决问题的能力。对于我们初学者来说,主要是学习成长设计的方法,进行程序设计的基本训练为将来进一步学习打下基础。课程设计不能之掌握概念,还要动手编程、上机调试运行。只有自己动手,才能学的更多。进一步掌握和利用c语言进行程设计的能力;进一步理解和运用结构化程设计的思想和方法;初步掌握开发一个小型实用系统的基本方法;学会调试一个较长程序的基本方法:学会利用流程图或N-S图表示算法;掌握书写程设计开发文档的能力(书写课程设计报告)。
73总体设计1.1设计思想分析整个系统,根据上面的需求分析,可以将这个系统的设计分为如下七大模块:输入数据、删除数据、查找数据、修改数据、插入数据、显示数据和退出。其中主要功能为输入数据、删除数据、查找数据、修改数据、插入数据、显示数据六个模块。3.2设计基本概念(1)系统功能结构图3.1系统功能结构图(2)模块功能描述①输入模块:实现学生基本信息的基本输入如学号,姓名,性别,年龄,专业,年级。
8②删除模块:处理各种可能出现的意外情况如想插入新数据,修改学生信息,删除错误信息等。(4)查找模块:通过学号或姓名查找学生记录。⑤修改模块:通过学号定位修改某学生信息。⑥插入模块:插入学生记录。⑦显示模块:按照学号或者姓名进行查询并显示学生的信息;⑧退出系统:选择操作,退出系统。
9开始图3.2处理流程
104模块设计3.1主函数主函数的设计简洁,只提供加输入、删除、查找、修改、插入、显示等函数的调用和加载功能。其中各功能模块用菜单方式选择。并将main。函数体内的界面选择部分部分语句单独抽出来做一个独立的函数,目的在于系统执行完每部分功能模块后能更方便返回到系统界面。menu。函数从主函数中独立出来后,表面的主函数只是起一个程序开始的作用,其主要功能被独立出来的被调用的menu。函数所取代。menu()函数主要完成菜单的输出和被选择的项目的输入和相应执行函数的调用。并将已经拥有的信息从指定文件中读取到结构体st中,以便执行其他的功能性函数。成功后需要关闭文件。图4.1主函数流程图
11在向指定文件输出学生信息及录入信息前需要将输入的学生证号进行检测,该检测是在结构体中st元素的学号项值比较而得出。如果已经存在的序号拒绝录入,如果还没有输入的学生证号就按提示继续输入学生信息信息。输入成功后显示刚输入的信息并将信息输出到指定文件的末尾。成功后将释放结构体指针;关闭文件并返回到menu()函数继续选择并执行其他操作。图4.2输入流程图
12删除一个给定学号的学生的信息时需要在学号输入后在已经有的学生信息中逐个查找,发现该信息后直接将后一个结构体元素复制个被删除的元素,依次类推,直到倒数第二个元素被复制,这时将结构体的有效元素个数减1便完成该学生信息的删除。在删除成功后需要将被改变的学生信息输出到指定文件。成功之后释放结构体空间,关闭文件并返回到menu()函数继续选择并执行其他操作。删除方式图4.3删除流程图查询的主要方式就是通过学号查询,查询时需要通过输入学号并按学生信息储存逐个核对,如果出现发现相同信息则输出该同学的其他信息,没有发现相同的信息则提示未找到并返回到menu()
13函数继续选择并执行其他操作。该查询也是通过结构体st的元素项的比较得出。运行结束后需要关闭文件并释放结构体指针的空间。查找方式图4.4查找流程图修改一个学生的信息首先要利用学生证号在已经存储的信息中找到该学生的信息并输出该学生的具体信息,再在阅读完信息之后选择所需要修改的信息。修改成功之后需要将已经更改的信息输出到屏幕和指定文件保存。成功之后返回到menu()
14函数继续选择并执行其他操作。其中的信息比较也是通过输入学号和结构体中的学号项逐个比较。图4.5修改流程图
15输入一个学号,在该学号之后插入,查询些学号是否已存在,存在重新输入,不存在输入学生信息。完成后,返回到menu()函数继续选择并执行其他操作。图4.6插入流程图
165.1主菜单123456705程序调试学生管理系统初福信记记记记记主生生生生生生生统3ZZZHH率系::::入除找奥一看出1第查修插显保退罟心息录录录录录请输入你的选择<。*>:图5.1主菜单窗口通过主菜单给人更加直观的操作。3.2输入>泊有学生记录,史叁■(按返回菜单):201315。40专业:计科
17谓输入率生的年龄:2。学生年级范围是11987-2014]:2。13输入学•茶点@返回菜单〉:图5.2输入窗口可以通过学号和学生姓名查找学生证信息,更加人性化。
18学生证信息学号1姓名1性别1专业(__________1年龄1________年级1201315040;户文龙।男i计科!120।2013>1通过学号删除>2通过姓名删除谓选择d2]:l输入存茬的学生学号:201315040=====>删除成功,图5.3删除窗口删除功能提供学号和姓名两种删除模式选择。图5.3为删除过程及删除后通过主菜单选择显示内容。>2通过姓名查找5.4查找=====>1通过学号查找=道选择输入存在的学生学号:20i315040学生证信息二学学„姓名性别专业年龄1年级1E.—EEFfEL।■:201315040户文龙男吕|120:2013!按任何一个健返回Z图5.4查找窗口可以通过学号OR姓名来查找一个学生的信息,并把查找到的学生信息显示出来。
19修改以下学生记录,学生证信息学号姓名性别I专业I年龄年级201315040户文龙;吕:2020132013150412014学.入的的生40s^学5B匕JA入的明图篮户崔入守名别ik.姓性专鱼姓名名的别业瞿专图5.5修改窗口提供学生证信息的修改,输入错误的学生证信息随时可以更改。些修改首先要输入一个存在的学生学号。5.6插入竽生证信息年号I姓名I性别1年业坐HI姓名I性别I令业2O131S0401龙龙1田I计2013150411龙1田1计年级»|2013t'I2014>|「舁逐一;图5.6插入窗口在一个学生记录后插入另一个学生的记录,首先要输入一个学生的学号,用以插入定位。
20学生证信息学号姓名性别1__11专业年龄年级11201315040龙龙田1计20120131201315045龙左男科—302013201315041!।龙11田11计1__________121।________।2014।।图5.7显示窗口显示所有学生的信息。5.8保存学生管理系统詈心息录录录录录由备信记记记记记主生生生生生生生统imxtf入除找改入一强出f第查修插显保退12345670请输入你的选择<。7>:7>记录己保存至磁盘文件.记录总数为:3图5.8保存窗口保存学生记录,会把学生记录保存到C盘下,并存为stu加nt文件。
21学生管理系统詈心息录录录录录中£■£=口己己己己己主生生生生生生生统f入除找改入一看出f第查修插显保退12345670请常入你的选择感谢您的使用?Pi*essanykeytocontinue图5.9退出退出程序,并检测记录有没有保存,若没有保存,则提示是否保存,按丫键保存,N键不保存。
226课程设计总结但是我发现我学到的知识比整整一个学期学到的都多。理论和实践的相结合是学习最有效的方法。在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,一定把以前所学过的知识重新温故。回顾起此次课程设计,至今我仍感慨颇多,的确,从拿到题目到完成整个编程,从理论到实践,在整整一个星期的日子里,可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从本次c语言的实习课让我对c语言的学习又有了更深入的了解,也让我更深刻地领悟到了“实践出真理”这个道理,在上机实践过程中学到的知识远远超过了在课堂上十儿周学到的,学校组织的这次c语言课程设计让我们这些实践知识匮乏的大学生增添了许多社会经验,为我们将来走上工作岗位起了不小的铺垫作用。通过实际操作,学会c语言程序编程的基本步骤、基本方法,开发了自己的逻辑思维能力,培养了分析问题、解决问题的能力。计时在此希望以后应多进行这样的实训,加长设间,培养学生独立思考问题的能力,提高实际操作水平。而提高自己的实际动手能力和独立思考的能力。
23本次课程设计中遇到了很多以前没有遇到过的问题,也曾想要放弃,但看到那些同学都在那认真的写程序,给了我继续的信心。在同学的帮助下,我顺利的结束了本次课程设计,让我知道原来凭借自己努力取得的成功会让自己这么欣慰,也让我知道了友谊和团结的重要性。此次课程设计涉及到的相关基础知识:if-else条件结构、switch选择结构、for循环结构、while循环结构、自定义函数、指针、结构体、文件等。此次课程设计体会:综合实验的难度比较大,要求在掌握C语言知识的基础上,能够编写程序,并且能够根据编译提示修改程序中的错误,调试运行程序,垠终还要检验是否能够实现实验任务中的功能要求。此次课程设计不足:在模块化程序设计方面所学到的知识还很浅薄,比如模块的划分、模块的组建等,今后还要继续努力。
24参考文献[1]《C语言程序设计》谭浩强清华大学出版社2011年6月[2]《VisualC++课程设计案例精编》作者:夏崇错、任海军、余健[3]《实用C语言程序设计教程》李金祥等编中国电力出版社2010[4]《C语言程序设计》王曙燕曹镒科学出版社
25附录:源代码#include"stdio.h"/*标准输入输出函数库*/#include"stdlib.h"/*标准函数库*/#include"string,h"/*字符串函数库*/^defineHEADER1"学生证信息
26
27"#defineHEADER2"'n"#defineHEADER4"\学号|姓名|性别|专业|年龄|年级|
28"ttdefineHEADER3"-I
29"#defineFORMAT"\%-10s|%-9s|%-8s|%-10s|%-6d|%4dl
30〃#defineDATAp->data.num,p->data.name,p->data.sex,p->data.spe,p->data.age,p->data.gradeSdefineEND〃intsaveflag=0;/*是否需要存盘的标志变量*//*定义与学生有关的数据结构*/typedefstructstudent/*标记为student*/(charnum[10];/*学号*/charname[15];/*姓名*/charsex[8];/*性别*/charspe[30];/*专业*/intage;/*年龄*/
31intgrade;/*年级*/);/*定义每条记录或结点的数据结构,标记为:node*/typedefstructnode(structstudentdata;/*数据域*/structnode*next;/*指针域*/}Node,*Link;/*Node为node类型的结构变量,*Link为node类型的指针变量*/voidmenu()/*主菜单*/
32system("cls〃);/*调用DOS命令,i青屏.与clrscrO功能相同*/printf(,z
33
34学生管理系统
35
36〃);printf(***************************_2^******************************
37)Tprintf(,z**1输入学生信息**
38〃);printf('**2删除学生信息**
39");printf(/z**3查找学生记录**
40〃);printf(,z**4修改学生记录**
41〃);printf(,z**5插入学生记录**
42〃);printf(〃**6显示学生记录**
43");printf(,z**7保存学生记录**
44");printf(,z**0退出系统**
45");printfC***
46");voidprintheader()/*格式化输出表头*/(printf(HEADERl);printf(HEADER2);printf(HEADER4);printf(HEADERS);)voidprintdata(Node*pp)/*格式化输出表中数据*/{Node*p;P=PP;printf(FORMAT,DATA);
47voidWrong()/*输出按键错误信息*/(printf("
48
49
50
51
52***********错误:输入有错!请按任意键继续**********
53'');getchar();)voidNofind()/*输出未查找此学生的信息*/(printf("
54=====〉没有找到这本学生!
55");)voidDisp(Link1)/*显示单链表1中存储的学生记录,内容为student结构中定义的内容*/(Node*p;p=l-〉next;/*1存储的是单链表中头结点的指针,该头结点没有存储学生信息,指针域指向的后继结点才有学生信息*/if(!p)/*p=NULL,NUll在stdlib中定义为0*/printf("
56=====>没有学生记录!
57");getchar();return;)printf("
58
59");printheader();/*输出表格头部*/while(p)/*逐条输出链表中存储的学生信息*/{printdata(p);p=p->next;/*移动直下一个结点*/printf(HEADER3);)getchar();getchar();}**
60作用:用于定位链表中符合要求的节点,并返回指向该节点的指针参数:findmess口保存要查找的具体内容;nameornum□保存按什么查找;在单链表1中查找;**/Node*Locate(Link1,charfindmess[],charnameornum[])(Node*r;if(strcmp(nameornum,"num")==0)/*按学号查询*/(r=l->next;while(r)(if(strcmp(r->data.num,findmess)==0)/*若找到findmess值的学号*/returnr;r=r->next;elseif(strcmp(nameornum,"name")==O)/*按姓名查询*/(r=l->next;while(r){if(strcmp(r->data.name,findmess)==0)/*若找至(jfindmess值的学生名*/returnr;r=r->next;))return0;/*若未找到,返回一个空指针*/}/*输入字符串,并进行长度验证(长度Gens)*/voidstringinput(char*t,intlens,char*notice)(
61charn[255];do{printf(notice);/*显示提示信息*/scanf("s",n);/*输入字符串*/if(strlen(n)>lens)printf(/z
62串长超限了!请重新输入。
63");/*进行长度校验,超过lens值重新输入*/}while(strlen(n)>lens);strcpy(t,n);/*将输入的字符串拷贝到字符串t中*/)/*输入年级,1987<=年级<=2014)*/intnumberinput(char*notice)(intt;printf(notice);/*显示提示信息*/do{scanf&t);/*输入年级*/if(t>2014||t<1987)printfC
64年级必须在[1987,2014]之间!请重新输入:");/*进行年级校验*/}while(t>2014||t<1987);returnt;/*增加学生记录*/voidAdd(Link1){Node*p,*r,*s;/*实现添加操作的临时的结构体指针变量*/charch,flag=0,num[10];r=l;s=l->next;system("cls〃);Disp(l);/*先打印出已有的学生信息*/while(r->next!=NULL)r=r->next;/*将指针移至于链表最末尾,准备添加记录*/while(l)/*一次可输入多条记录,直至输入学号为0的记录结束添加操作*/
65(whiled)/*输入学号,保证该学号没有被使用,若输入学号为0,则退出添加记录操作*/(stringinput(num,10,”输入学号(按’0'返回菜单):");/*格式化输入学号并检验*/flag=0;if(strcmp(num,"0")==0)/*输入为0,则退出添加操作,返回主界面*/{return;}s=l->next;while(s)/*查询该学号是否已经存在,若存在则要求重新输入一个未被占用的学号*/{if(strcmp(s->data.num,num)==0)(flag=l;break;)s=s->next;}if(flag=l)/*提示用户是否重新输入*/{getchar();printf(〃====>学号%s已存在,是否重新输入?(y/n):〃,num);scanf&ch);if(ch==,yf||ch==,Y')continue;elsereturn;)else{break;})
66p=(Node*)malloc(sizeof(Node));/*申请内存空间*/if(!p){printfC
67没有申请到内存空间〃);/*如没有申请到,打印提示信息*/return;/*返回主界面*/)strcpy(p->data.num,num);/*将字符串num拷贝到p->data.num中*/stringinput(p->data.name,15,"姓名:”);stringinput(p->data.sex,8,“性别:”);stringinput(p->data.spe,30,〃专业:〃);printf(〃请输入学生的年龄:〃);scanf("%d”,&p->data.age);p->data.grade=numberinput(〃学生年级范围是[1987-2014]:〃);/*输入并检验年级,年级必须在1987-2014之间*/p->next=NULL;/*表明这是链表的尾部结点*/r->next=p;/*将新建的结点加入链表尾部中*/r=p;saveflag=l;return;)voidQur(Link1)/*按学号或姓名,查询学生记录*/(intselect;/*1:按学号查,2:按姓名查,其他:返回主界面(菜单)*/charsearchinput[20];/*保存用户输入的查询内容*/Node*p;if(!l->next)/*若链表为空*/(system("cis");printf("
68=====>没有学生记录!
69");getchar();return;}system(z,cls//);
70printf("
71=====>1通过学号查找=====〉2通过姓名查找
72");printfC请选择[1,2]:");scanf&select);if(select==l)/*按学号查询*/(stringinput(searchinput,10,“输入存在的学生学号:”);p=Locate(1,searchinput,"num");/*在1中查找学号为searchinput值的节点,并返回节点的指针*/if(p)/*若p!=NULL*/{printheader();printdata(p);printf(END);printf("按任何一个键返回”);getchar();elseNofindO;getchar();)elseif(select==2)/*按姓名查询*/(stringinput(searchinput,15,〃输入存在的学生姓名:");p二Locate。,searchinput,z,name/z);if(p)(printheader();printdata(p);printf(END);printf(〃按任何一个键返回”);getchar();)else
73NofindO;getchar();)elseWrong();getchar();)/*删除学生记录:先找到保存该学生记录的节点,然后删除该节点*/voidDel(Link1)(intsei;Node*p,*r;charfindmess[20];if(!l->next){system("cls");printf("
74====>没有学生记录!
75");getchar();return;system("cls");Disp(l);printfC
76=====>1通过学号删除=====>2通过姓名删除
77〃);printfC请选择[1,2]:");scanf("服1",&sel);if(sel=l){stringinput(findmess,10,“输入存在的学生学号:”);p=Locate(1,findmess,"num");if(p)/*p!=NULL*/{r=l;while(r->next!=p)r=r->next;r-〉next=p->next;/*将p所指节点从链表中去除*/free(p);/*释放内存空间*/
78printf("
79=====>删除成功!
80");getchar();saveflag=l;)elseNofind0;getchar();)elseif(sel==2)/*先按姓名查询到该记录所在的节点*/(stringinput(findmess,15,”输入存在的学生姓名”);p=Locate(1,findmess,"name");if(p)(r=l;while(r->next!=p)r=r->next;r->next=p->next;free(p);printf("
81=====>成功删除!
82");getchar();saveflag=l;)elseNofindO;getchar();)elseWrong();getchar();)/*修改学生记录。先按输入的学号查询到该记录,然后提示用户修改学号之外的值,学号不能修改*/
83voidModify(Link1)(Node*p;charfindmess[20];if(!l->next){system(〃cls");printf("
84===>没有学生记录!
85");getchar();return;)system("cls〃);printf("
86修改以下学生记录:〃);Disp⑴;stringinput(findmess,10,〃输入存在的学生学号:");/*输入并检验该学号*/p=Locate(l,findmess,"num");/*查询到该节点*/if(p)/*若p!二NULL,表明已经找到该节点*/(printf(〃学号:%s,
87,z,p->data.num);printf(〃姓名:%s,”,p->data.name);stringinput(p->data.name,15,”输入新的姓名;printf(“性别:%s,”,p->data.sex);stringinput(p->data.sex,8,〃输入新的性别名:”);printf(〃专业:%s,”,p->data.spe);stringinput(p->data.spe,30,〃输入新的专业名:〃);printf(〃学生的年龄:%d,”,p->data.age);printf(〃修改后的学生的年龄:〃);scanf&p->data.age);printf(〃学生的年级:%d,”,p->data.grade);p->data.grade二numberinput(〃修改后的学生的年级:〃);printf("
88=>修改成功!
89");Disp(l);saveflag=1;)
90elseNofind();getchar();}/*插入记录:按学号查询到要插入的节点的位置,然后在该学号之后插入一个新节点。*/voidInsert(Link1)(Linkp,v,newinfo;/*p指向插入位置,newinfo指新插入记录*/charch,num[10],s[10];/*s□保存插入点位置之前的学号,num口保存输入的新记录的学号*/intflag=0;v=l->next;system("cls");Disp(l);while(l){stringinput(s,10,〃请输入一个学号,在该学号之后插入:〃);flag=0;v=l->next;while(v)/*查询该学号是否存在,flag=l表示该学号存在*/(if(strcmp(v->data.num,s)==0){flag=l;break;}v=v->next;if(flag==l)break;/*若学号存在,则进行插入之前的新记录的输入操作*/else{getchar();printf("
91=====>学号%s不存在,请重新输入?(y/n):",s);scanf&ch);if(ch==,y)||ch==,Y'){continue;}else{return;}
92))/*以下新记录的输入操作与Add()相同*/stringinput(num,10,”输入新的学生学号:”);v=l->next;while(v)|if(strcmp(v->data.num,num)==0)(printf(〃===>抱歉,新学号:'%s'不存在!
93〃,num);printheader();printdata(v);printf("
94〃);getchar();return;)v=v->next;}newinfo=(Node*)malloc(sizeof(Node));if(Inewinfo)(printf("
95动态申请内存失败!”);/*如没有申请到,打印提示信息*/return;/*返回主界面*/)strcpy(newinfo->data.num,num);stringinput(newinfo->data.name,15,〃姓名:“);stringinput(newinfo->data.sex,8,〃性另ij:〃);stringinput(newinfo->data.spe,30,“专业:〃);printf("年龄:");scanf("%d”,&newinfo->data.age);newinfo->data.grade=numberinput(“年级范围是[1987-2014];/*输入并检验年级,年级必须在1987-2014之间*/newinfo->next=NULL;
96saveflag=l;/*在main()有对该全局变量的判断,若为1,则进行存盘操作*//*将指针赋值给P,因为1中的头节点的下一个节点才实际保存着学生的记录*/p=l->next;while(l){if(strcmp(p->data.num,s)==0)/*在链表中插入一个节点*/(newinfo->next=p->next;p->next=newinfo;break;)p=p->next;)Disp(l);printf("
97
98");getchar();}/*数据存盘,若用户没有专门进行此操作且对数据有修改,在退出系统时,会提示用户存盘*/voidSave(Link1)FILE*fp;Node*p;intcount=0;fp二fopen(〃c:\\student〃,〃wb〃);/*以只写方式打开二进制文件*/if(fp==NULL)/*打开文件失败*/(printf(〃
99===>打开文件失败!
100");getchar();return;)p=l->next;
101while(p)(if(fwrite(p,sizeof(Node),1,fp)=l)/*每次写一条记录或一个节点信息至文件*/(p=p->next;count++;}else|break;})if(count>0)(getchar();printf(〃
102
103
104
105
106====>记录已保存至磁盘文件,记录总数为:%d
107”,count);getchar();saveflag=O;)else{system(〃cls");printf(〃当前链表是个空表,没有学生记录!
108〃);getchar();fclose(fp);/*关闭此文件*/voidmain()(Link1;/*定义链表*/FILE*fp;/*文件指针*/intselect;/*保存选择结果变量*/charch;/*保存(y,Y,n,N)*/
109intcount=0;/*保存文件中的记录条数(或结点个数)*/Node*p,*r;/*定义记录指针变量*/1=(Node*)malloc(sizeof(Node));if(!l)(printfC
110动态申请内存失败”);/*如没有申请到,打印提示信息*/return;/*返回主界面*/)l->next=NULL;r=l;fp=fopen("C:\\student","ab+");/*以追加方式打开一个二进制文件,可读可写,若此文件不存在,会创建此文件*/if(fp==NULL){printf("
111=====>不能打开文件!
112");exit(0);)while(!feof(fp))(p=(Node*)malloc(sizeof(Node));if(!p)(printf(*动态申请内存失败!
113");/*没有申请成功*/exit(0);/*退出*/if(fread(p,sizeof(Node),1,fp)==l)/*一次从文件中读取一条学生记录*/(p->next=NULL;r->next=p;r=p;/*r指针向后移一个位置*/count++;))
114fclose(fp);/*关闭文件*/printf("
115=====>成功打开文件,记录个数为:%d.
116*,count);menu();while(l)(system("cls");menu();p=r;printf(w
117请输入你的选择(0~7):;/*显示提示信息*/scanf,&select);if(select==0){if(saveflag==l)/*若对链表的数据有修改且未进行存盘操作,则此标志为1*/{getchar();printf("
118=====>修改过的记录已经保存至磁盘了吗?(y/n):");scanf&ch);if(ch==,y'||ch==,Y,)Save(1);)printf("=====>感谢您的使用!");getchar();break;
119switch(select)casecasecasecasecasecasecase*/1:Add(l);break;2:Del(1);break;3:Qur(1);break;4:Modify(1);break;5:Insert(1);break;7:Save(l);break;/*增加学生记录*//*删除学生记录*//*查询学生记录*//*修改学生记录*//*插入学生记录*//*保存学生记录*/6:system(z,cls/z);Disp(l);break;/*显示学生记录default:Wrong()jgetchar();break;数值0-7*//*按键有误,必须为