好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

学籍信息记录薄.doc

31页
  • 卖家[上传人]:kms****20
  • 文档编号:40641510
  • 上传时间:2018-05-26
  • 文档格式:DOC
  • 文档大小:432.50KB
  • / 31 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 程序设计报告HUNAN UNIVERSITY程序设计训练报 告 学生姓名 易伟浪 殷婷婷 学生学号 20110704115 20110704106 专业班级 测控技术与仪器一班 指导老师 洪跃山 2012 年 7 月 4 日一. 需求分析随着计算机技术的日益发达,计算机软件功能已涉入生活的诸多方面其中对学生籍贯信息的管理就是其中的一个小小的方面利用计算机软件来管理学生籍贯信息能够克服传统的文档管理的不足通过计算机实现学生籍贯信息管理薄具有存储信息量大,方便查询,修改,添加,删除,浏览等传统纸质文档不具备的良好功能二. 程序功能说明 1.功能分析说明图:录入学生籍贯信息查询学生籍贯信息浏览学生籍贯信息修改学生籍贯信息删除学生籍贯信息按学号查询主菜单按姓名查询学生籍贯信息记录薄2.各项功能说明:a.主菜单:用于显示系统主模块信息,供用户选择b.录入学生籍贯信息:用来将员工信息输入到计算机中,并保存到数据文件中,此模块还具有添加学生籍贯信息的功能c.查询学生籍贯信息:可按学号和姓名查找学生籍贯信息。

      d.浏览学生籍贯信息:将系统中已有学生籍贯信息全部列出e.修改学生籍贯信息:根据学号进行查询,修改指定字段内容f.删除学生籍贯信息:删除指定学号的学生籍贯信息 以上模块可由用户选择执行,另外,当用户运行此程序时,必须判断学生信息是否曾经保存过若学生籍贯信息事先未保存,必须先进行学生籍贯信息的录入三. 软件基本操作 先打开源程序,编译,运行然后根据提示输入相关内容具体如下:1. 若学生籍贯信息已存在(即data.dat文件被创建,且不为空),输入Y或y,进入主界面若学生籍贯信息已存在则按其他键,进入主界面如图所示(主界面):2. 输入要选择的项目(选择1),进入界面(按照提示进行输入):a. 若学籍信息已保存过,则输入的信息添加到文件中b. 若学学籍信息未保存过,输入的信息组成链表首次存到文件中c. 若不再继续添加,则输入其他键,此时程序会将调用print()函数将文件中信息显示出来再输入除n或N的其他键,保存刚输入的内容d. 最后保存完毕时,输入任意键返回主界面e. 若输入相同的学号,程序会报错,输入时即使不按学号顺序输入,该程序最终也会按学号从小到大排序3. 输入2时:程序会调用print()函数将文件中保存信息读出来。

      再按任意键返回主界面如图所示:4. 输入3时,则进入查询界面如图: a. 若选择1,则按学号查询输入要查询的学号如图: b. 若选择2,则按姓名查询输入要查询的姓名如图: 查询完毕时,按任意键返回主界面5. 输入4时,进入删除操作,输入要删除的学号,则会删除对应的信息如图:按任意键返回主界面重新浏览籍贯信息如图:28号钟汉良已被删除6. 输入5时,进行学籍信息修改,输入要修改的原始学号,进入修改界面如图:a. 输入1,修改学号如图操作: b. 输入2,修改姓名如图操作: c. 输入3,修改性别如图操作: d. 输入4,修改地址如图操作: 输入y或Y,可继续修改7.输入6,退出系统四.软件设计详细内容1.采用的主要数据类型和目录: #include#include#include#include#includestruct student{ int num; //学号 char name[20]; char sex[5]; char address[20]; struct student *next;};2.main()函数: main()函数中,主要是判断文件是否保存过。

      并调用menu()函数其代码为:void main(){ char flag0; struct student *p1; printf("~~~曾几何时,学籍信息是否保存过?“是”输入Y或y,“否”按任意键\n"); fflush(stdin); scanf("%c",&flag0); if(flag0=='Y'||flag0=='y') p1=readdata(); else p1=create_list(); menu(p1); getch();}该函数通过if语句输入不同的头指针,若文件以保存过,则调用readdata()函数从文件中建立链表,返回头指针若文件未保存过,这通过调用create_list()返回头指针,该指针指向的内容未初始化,其内容保存从第二个节点开始3.create_list()函数 用来创建链表的头指针,不过该指针指向的节点无学生籍贯信息记录,仅用来记录链表的头节点位置其源代码为:struct student *create_list(){ struct student* head; head=(struct student*)malloc(sizeof(struct student)); head->next=NULL; return head;}4.menu()函数: 该函数通过参数传入头指针,主要是界面的显示以及多个函数的调用,其流程图如下:1234输入选项6籍贯信息浏览籍贯信息查询籍贯信息录入输入错误籍贯信息修改籍贯信息删除退出系统开始结束5主界面其他 其源代码为: void menu(struct student *head){ int choice; char flag2='Y'; for(;;) { printf(" ___________________________________________\n"); printf(" | | | |\n"); printf(" | | ~~学生籍贯信息记录薄~~ | |\n"); printf(" | |__________________________________| |\n"); printf(" | |\n"); printf(" | 1.学生籍贯信息录入 |\n"); printf(" | |\n"); printf(" | 2.学生籍贯信息浏览 |\n"); printf(" | |\n"); printf(" | 3.学生籍贯信息查询 |\n"); printf(" | |\n"); printf(" | 4.学生籍贯信息删除 |\n"); printf(" | |\n"); printf(" | 5.学生籍贯信息修改 |\n"); printf(" | |\n"); printf(" | 6.退出系统 |\n"); printf(" |_________________________________________|\n"); printf("\n美女帅哥们,请输入要选择的项目\n"); scanf("%d",&choice); switch(choice) { case 1: input(head); printf("亲~~~按任意键返回主界面\n"); getch(); break; case 2: print(head); printf("亲~~~按任意键返回主界面\n"); getch(); break; case 3: search(head); printf("亲~~~按任意键返回主界面\n"); getch(); break; case 4: deletelist(head); printf("亲~~~按任意键返回主界面\n"); getch(); break; case 5: while(flag2=='Y'||flag2=='y') { change(head); printf("是否继续修改“是”(Y或y)\n"); fflush(stdin); scanf("%c",&flag2); } printf("亲~~~按任意键返回主界面\n"); getch(); break; case 6: exit(0); default: printf("输入错误,请重新输入\n"); } }}5.savadata()函数: 该函数用来保存录入,修改,添加,删除后的信息。

      将信息保存到data.dat文件中,用户再次运行此程序时,就不必再次输入信息具体代码如下:void savadata(struct student *head){ struct student *p=head->next; FILE *f; if((f=fopen("data.dat","wb"))==NULL) { printf("打开文件出错!"); return; } while(p) { fwrite(p,sizeof(struct student),1,f); p=p->next; } fclose(f);}该函数中,以只写方式读写,写入的时候是按数据项写入,即:一次写入一个struct student类型的数据将链表写入文件中时,一次写入一个节点先让指针指在第二个节点(第一个节点实际无任何内容),写入第二个节点,然后指针继续往后移,直到指针指向空为止6.readdata()函数: 该函数用来将data.dat(信息事先以录入)文件中的数据读出来,返回头指针,供后续模块进行浏览,查询,编辑具体代码如下: struct student *readdata(){ struct student *head,*p,*s; FILE *fp; head=create_list(); p=head; while(p->next!=NULL) { p=p->next; } if((fp=fopen("data.dat","rb"))==NULL) { printf("打开文件出错!\n"); return NULL; } while(!feof(fp)) { s=(struct student*)malloc(sizeof(struct student)); fread(s,sizeof(struct student),1,fp); if(feof(fp)) break; if(s==NULL) { printf("错误\n"); break; } p->next=s; p=s; s->next=NULL; } fclose(fp); return head;}该函数中先以调用create_list()函数创建无有用信息的struct student类型的数据,并返回指向它的指针,作为链表的头指针。

      7. input()函数:该函数具有首次录入,再次添加的功能,并调用savadata()函数将信息保存到data.dat文件中再次添加时调用readdata()函数将文件中的信息读出来结束接入第一个含信息节点向链表中添加节点(其链表中的节点顺序按照学生学号从小到大排列)保存开始输入头指针 判断是否为链表?否是 是否 继续添加信息?是否 是否保存?是否其大致流程图为:其源代码为:void input(struct student* head){ struct student *p,*s,*q; char flag='Y',flag1; int num1; p=head; while(p->next!=NULL) { p=p->next; } if(head->next==NULL) { s=(struct student*)malloc(sizeof(struct student)); printf("请输入学号\n"); fflush(stdin); scanf("%d",&s->num); num1=s->num; printf("请输入姓名\n"); fflush(stdin); gets(s->name); printf("请输入性别\n"); fflush(stdin); gets(s->sex); printf("请输入地址\n"); fflush(stdin); gets(s->address); p->next=s; s->next=NULL; } while(flag=='Y'||flag=='y') { printf("是否继续添加“是”(y或Y)“否”(任意键)\n"); fflush(stdin); scanf("%c",&flag); if(flag=='Y'||flag=='y') { s=(struct student*)malloc(sizeof(struct student)); printf("请输入学号\n"); fflush(stdin); scanf("%d",&s->num); num1=s->num; p=head->next; while(p!=NULL) { if(p->num==num1) { printf("你个小傻瓜,居然输入相同的学号,快点重新输入\n"); printf("请输入学号\n"); fflush(stdin); scanf("%d",&s->num); num1=s->num; } p=p->next; } p=head->next; printf("请输入姓名\n"); fflush(stdin); gets(s->name); printf("请输入性别\n"); fflush(stdin); gets(s->sex); printf("请输入地址\n"); fflush(stdin); gets(s->address); if(s->numnum) { head->next=s; s->next=p; } else { while(p->next!=NULL) { if(s->numnext->num&&s->num>p->num) { q=p->next; p->next=s; s->next=q; } p=p->next; } if(s->num>p->num) { p->next=s; s->next=NULL; } } } else break; } print(head); printf("是否保存所输入的数据\n"); printf("如果\"否\"请输入n或N,\"是\"输入任意符号\n"); fflush(stdin); scanf("%c",&flag1); if((flag1!='N')&&(flag1!='n')) savadata(head);}该函数会将学号从小到大接成链表,并存到文件中。

      8. print()函数:该函数作用为将链表中的全部信息向屏幕输出其源代码为:void print(struct student *head){ struct student *p; if(head==NULL||head->next==NULL) { printf("\n-----------没有学生籍贯信息记录---------------------\n"); return; } p=head; printf("学号\t姓名\t性别\t地址\n"); while(p->next!=NULL) { p=p->next; printf("%-8d%-8s%-8s%-8s\n",p->num,p->name,p->sex,p->address); }}当输出链表信息到屏幕上时,该函数一次输入一个节点信息,然后指针移到下一个节点位置,利用循环语句循环输入节点信息,知道指针为空9. deletelist()函数:该函数作用为通过学号检索删除链表中的节点(相应学籍信息),并将删除后剩下的信息保存到文件中其源代码为: void deletelist(struct student *head){ struct student *p=head->next,*s=head; int Num; printf("请输入要删除的学号\n"); fflush(stdin); scanf("%d",&Num); while(p!=NULL) { if(p->num==Num) { s->next=p->next; free(p); printf("------太碉了,居然删除成功--------\n"); break; } s=p; p=p->next; } savadata(head); if(s==NULL) printf("你输入的学号不存在\n");}该函数主要通过循环语句来实现其删除的功能的,首先让指针指向第一个含学籍信息的节点,判断学号是否与要删除的学号相同,如果相同则删除该节点信息,跳出循环,若不同,则指针往后移动,直到其学号相等或指针直到链表结尾处为止。

      10. search()函数:该函数作用为提供学号和姓名的检索,并显示出检索的内容其大致流程图为:显示主界面输入错误按学号查询按姓名查询显示查询后的信息显示查询后的信息开始 输入要选择的查询方式 12其他输入学号输入姓名结束其源代码为:void search(struct student *head){ int x,n; struct student *p; char temp[20]; p=head; if(head==NULL||head->next==NULL) { printf("-----------学生学籍信息为空-----------------\n"); return; } printf(" ___________________________________________\n"); printf(" | | | |\n"); printf(" | | 查询方式 | |\n"); printf(" | |________________________________| |\n"); printf(" | |\n"); printf(" | 1.按学号查询 |\n"); printf(" | |\n"); printf(" | 2.按姓名查询 |\n"); printf(" |_________________________________________|\n"); printf(" 请选择查询方式\n"); scanf("%d",&x); switch(x) { case 1: printf("请输入要查询的学号\n"); fflush(stdin); scanf("%d",&n); printf("学号\t姓名\t性别\t地址\n"); while(p->next!=NULL) { p=p->next; if(p->num==n) printf("%-8d%-8s%-8s%-8s\n",p->num,p->name,p->sex,p->address); if(p->next==NULL) printf("查询完毕!\n"); } break; case 2: printf("请输入要查询的学生姓名\n"); fflush(stdin); scanf("%s",temp); printf("学号\t姓名\t性别\t地址\n"); while(p->next!=NULL) { p=p->next; if(strcmp(p->name,temp)==0) { printf("%-8d%-8s%-8s%-8s\n",p->num,p->name,p->sex,p->address); } if(p->next==NULL) printf("查询完毕!\n"); } break; default: printf("------------输入错误,请重新输入---------------\n"); } return;}11. change()函数:该函数主要功能是对学籍信息的修改,对学号,姓名,地址,性别的修改。

      通过修改前的学号检索来进行修改该函数允许修改后的学号与其其他学生的学号相同(为了避免2个同学学号均搞错不能修改的问题)由于版面问题,其大致流程图见下一页:显示修改前的信息和修改界面开始 输入修改前 的学号学号是否 存在?否是输入所选择的修改项目1 输入正确的学号 输入正确的姓名输入正确的性别输入正确的地址 输出错误 提示语输出错误提示语结束234其他其源代码为:void change(struct student *head){ int choice,NUM; struct student *p; p=head->next; printf("请输入要修改的学生的学号\n"); fflush(stdin); scanf("%d",&NUM); while(p->num!=NUM) { p=p->next; if(p==NULL) break; } if(p!=NULL) { printf("修改前的信息为\n"); printf("学号\t姓名\t性别\t地址\n"); printf("%-8d%-8s%-8s%-8s\n",p->num,p->name,p->sex,p->address); printf("_____________________\n"); printf("| |\n"); printf("| 1.学号 |\n"); printf("|-------------------|\n"); printf("| 2.姓名 |\n"); printf("|-------------------|\n"); printf("| 3.性别 |\n"); printf("|-------------------|\n"); printf("| 4.地址 |\n"); printf("|___________________|\n"); printf("\n请输入要修改的内容\n"); fflush(stdin); scanf("%d",&choice); switch(choice) { case 1: printf("请输入正确的学号\n"); fflush(stdin); scanf("%d",&p->num); break; case 2: printf("亲爱的,请输入要修改的姓名\n"); fflush(stdin); scanf("%s",p->name); break; case 3: printf("Hello,请输入性别\n"); fflush(stdin); scanf("%s",p->sex); break; case 4: printf("帅哥哥,请输入地址!速度要快哦!\n"); fflush(stdin); scanf("%s",p->address); break; default: printf("你太可怜了!输入竟然错误\n"); } printf("修改后的信息为\n"); printf("学号\t姓名\t性别\t地址\n"); printf("%-8d%-8s%-8s%-8s\n",p->num,p->name,p->sex,p->address); savadata(head); } else printf("你太差了吧!鄙视你!居然输入错误的学号\n");五.设计体会 对于本次课程设计,感慨颇多。

      的确,从拿到题目到完成整个编程,从理论到实践,其间,我们学到了很多的东西,不仅巩固以前所学过的知识,还学会了团结合作的重要性通过这次程序设计,我们懂得了理论与实践相结合起来是很重要的,只有把所学的理论知识和实践相结合起来,才能真正提高自己的实际动手能力,才能真正为社会服务在设计过程中,难免会遇到各种各样的问题,因此查找资料,双方协商,双方的合作与分工就显得尤为重要总之,在此次的程序设计中我们收获良多,可以说是一个小小的成就吧!六.附录 1.每人完成的主要工作: 本程序设计是由易伟浪与殷婷婷同学共同完成其中易完成的主要是creat_list()函数,input()函数,deletelist()函数,readdata()函数,savadata()函数的编写以及此文档的四、五部分殷完成的主要是menu()函数,print()函数,search()函数,change()函数的编写以及此文档一二三部分的编写2.参考文献: 《C语言程序设计教程》李丽娟版,人们邮电出版社; 《C语言从入门到精通》2。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.