版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、-. z课程设计任务书 计算机科学与技术 专业年级班设计题目教师信息管理系统设计主要容教师信息包括教师号、性别、年龄、学历、职称、工资、住址、等教师号不重复。试设计一教师信息管理系统,使之能提供以下功能:1系统以菜单方式工作2教师信息录入功能输入3教师信息删除功能4教师信息浏览功能输出5查询和排序功能:(至少一种查询方式) 算法 按教师号查询 按职称查询等具体要求 围绕课程设计的目的和意义,根本要求如下: 1、认真阅读C语言课程设计指导书,明确课程设计的目的、意义和要求; 2、快速总结C程序设计语言的精华,如:函数的概念、函数的设计和函数的调用;快速熟悉Tuber C 或C+的上机环境。能熟练
2、进展高级编辑操作特别是字块操作;熟悉步进式、断点跟踪的程序调试方法,提高工作效率。 4、根据课程设计题目,采用构造化的程序设计思想,确定系统的总体设计方案、确定时间进度。如果是多人共一题,则要首先完成小组的人员分工及安排,不允许重题现象。 5学习并了解良好的程序设计风格。按质、按量、并按时间完成课程设计的任务。 6提供可运行的课程设计系统,参加上机面试辩论。本次课程设计的重点是:学会设计并编写函数,掌握好各函数之间的调用关系;利用文件操作函数,建立数据库并完成对数据库的各种操作;掌握几种典型算法的应用如:冒泡法、选择排序法和折半查找法。同时锻炼学生根据题目进展分析、设计、编码、调试程序和书写必
3、要文档的综合处理能力,从实践中学习并体会程序设计的构造化思想和设计方法。进度安排 依照教学方案,课程设计时间为3周。按照软件工程的思想,软件系统的分析设计至关重要,并要充分重视书写文档。防止甚至杜绝拿到题目就编码的现象。建议将时间分为三个阶段:第一阶段,根据题目要求,拿出系统的总体设计方案:即构思各程序模块的算法,并画出相应的N-S图,同时编写相应的文档;第二阶段,根据N-S图编写程序代码并单独调试,再将调试通过的各个子模块进展集成调试;第三阶段,归纳文档资料,按要求填写在课程设计说明书上,并参加辩论。三个阶段时间分配的大概比例是: 35:45:20。完成后应上交的材料1课程设计的题目、系统的
4、总功能和各子模块的功能;2题目的设计思想或算法简述;3主要程序的框图要求用N-S图;4源程序代码要求在关键的位置有注释,从而增加程序的可读性;5课程设计的总结报告,主要包括以下容:1课程设计中遇到的主要问题和解决方法;2你的创新和得意之处;3设计中存在的缺乏及改良的设想;4本次课程设计的感想和心得体会。 以上完成的源程序及相关文档,填写在课程设计说明书上,要求干净整洁,符合课程设计的要求和规。总评成绩 指导教师签名日期年月日 系 主 任审核日期年月 日目录题目设计思想简述5程序的NS图72.1总程序的NS图72.2各子函数的NS图72.2.1教师信息录入函数82.2.2教师信息浏览函数82.2
5、.3教师信息删除函数92.2.4教师信息查询函数92.2.5教师信息排序函数10源程序代码11程序运行效果图334.1登陆界面334.2菜单栏334.3录入功能344.4浏览功能344.5删除功能354.6查询功能354.7排序功能36总结报告375.1课程设计中遇到的主要问题和解决方法375.2你的创新和得意之处375.3设计中存在的缺乏及改良的设想375.4本次课程设计的感想和心得体会38主函数题目设计思想简述退 出 系 统教师信息排序的函数浏览教师信息的函数删除教师信息的函数查询教师信息的函数录入教师信息的函数 菜单栏函数识别口令的函数如上图所示,该教师信息管理系统主要是一个以动态链表的
6、应用为根底来实现对教师信息的录入,查询,删除等功能。定义教师构造体如下:struct teacherlong num;/教师号char name20;/char se*5;/性别int age;/年龄char edu20;/学历char title20;/职称long wage;/工资char addr100; /地址char telep15;/struct teacher *ne*t;*head=NULL;主函数只进展口令函数和菜单栏函数的调用,主要工作通过菜单函数实现。口令为123456。菜单栏函数通过用switch语句实现不同功能的选择,不同的功能用不同的子函数实现。录入教师信息通过建立
7、动态单链表来实现。浏览教师信息则通过将链表所有数据顺序输出来实现。查询功能只要从链表头开场不断往下一个结点读取信息跟所要查 找的信息比拟,直到读取到的信息跟所要查找的信息一样或链表尾为止,并把此结点的信息输出。删除教师信息的函数是通过查找链表中有该信息的结点后将该结点移出链表,即使该结点前一个结点直接指向该结点后面的结点来到达删除信息的目的。 排序函数是通过交换结点在链表中的位置来实现的,即使得各结点在链表中的位置便是所要得到的排序该信息应在的位置,这样直接顺序输出链表的信息时就能按所要的排序输出了。程序的NS图2.1总程序的NS图i=0输入口令a 当i3 当b6 T a=123456 F 假
8、i=i+1退出循环口令3次输入错误 , 退出系统教师信息录入功 能教师信息浏览功 能教师信息删除功 能T b=4? F T b=3? FT b=2? F T b=1? F重新输入所要选择的功能b输入所选择的功能bT i=3 F 教师信息查询功 能T b=5 F退出系统教师信息排序功 能说明:各功能都是通过调用子函数来实现的。2.2各子函数的NS图子函数主要包括教师信息录入,教师信息浏览,教师信息删除,教师信息查询和教师信息排序等5个。在退出系统时调用了一个保存信息到文件中的函数,该函数只是简单的应用了文件的读写功能,在此不写出其NS图。2.2.1教师信息录入函数p1=(struct teach
9、er *)malloc(LEN)输入一个教师号p1-numn=n+1n输入教师的*,性别,年龄,学历,职称,月薪,住址, T 第一个录入? F 当教师号不为0p3=p3-ne*tHead=p1p3-ne*t=p1 当p3-ne*t不为空p3=headT 链表头为空? FT 教师号为0? Fhead=p1p2-ne*t=p1p2=p1p1=(struct teacher *)malloc(LEN)输入一个教师号p1-nump2-ne*t=NULL说明:p1=(struct teacher *)malloc(LEN)中LEN是在程序开头的宏定义#define LEN sizeof(struct t
10、eacher)。其中n为全局变量,用来统计链表的结点数,以下出现的n都是同一个。2.2.2教师信息浏览函数p=headT 链表头为空? F 直到p为空输出p所指向的位置中的教师的所有信息显示还未录入过信息p=p-ne*t说明:实际程序中在链表头为空是提供了可以浏览之前保存在文件中的信息的功能,中选择该功能时就调用了一个读取文件的函数。该函数只是对文件读写的简单应用,详细请看后面第三局部代码,这里不写出其N-S图。T 链表头为空? F2.2.3教师信息删除的函数输出 还未 录入 过教 师信 息 当i!=p1-num输出已录入的教师信息中没有该教师号T p1为链表头? F n=n-1head=p1
11、-ne*tp2-ne*t=p1-ne*tT i!=p1-num F 退出循环p1=p1-ne*tp2=p1T p1-ne*t为空? Fp1=head输入要删除教师信息的教师号i2.2.4教师信息查询的函数在查询方面程序为用户提供了4种不同方式的查询,每一种方式的查询为一个子函数,此时也是采用一个菜单栏函数进展选择查询方式并调用该种方式的函数。菜单栏函数跟主程序菜单栏的算法一样,j=0 此处只给出查询函数的NS图。T 链表头为空? F输出还未录入程序并退出函数 当p非空时输出已录入的信息中不存在符合i的信息的教师T j不为0? Fp=p-ne*tj=j+1输出p所指向的位置的教师的所有信息T i
12、跟p中对应信息不等? Fp=head输入要查找的教师信息的对应方法的对应数据i说明:该NS图是对应,教师号,职称,年龄四种查找方式的函数的。中选择教师号查找时,输入i的即为教师号,与i做比拟的为p中的教师号,选择其他查找方式时类似。2.2.5教师信息排序函数T 链表头不为空? F排序也跟查询一样给出多种排序方式并采用菜单栏函数,此处也只给出排序函数的NS图。p2=head-ne*tp1=headT 第二个结点为空? F输出还未录入过教师信息并退出函数调用教师信息浏览函数 当i小于n时 当j小于n-i时p2=p1-ne*tp1=headp2=p2-ne*tp1=p2p3=p1p2=p4p3=p2
13、p1-ne*t=p4p2-ne*t=p1p4=p2-ne*tp3-ne*t=p2head=p2T p1为链表头? F p1中的对应信息小过p2的? T F j=0i=1说明:p1,p2指向的结点用来比拟,p3,p4是用来记录结点的,中选用的排序方式不同,p1,p2用来比拟的信息为所选方式的信息。源程序代码#include #include #include #include #define LEN sizeof(struct teacher)/宏定义构造体字节数int n=0;struct teacher/定义构造体long num;/教师号char name20;/char se*5;/性别
14、int age;/年龄char edu20;/学历char title20;/职称long wage;/工资char addr100;/地址 char telep15;/struct teacher *ne*t;/指向下一个结点*head=NULL;void key()/口令检查的函数int i;long a;for(i=0;ine*t) if(fwrite(p,sizeof(struct teacher),1,fp)!=1) printf(n此处数据有误n);fclose(fp);e*it(0);void read()/从文件读出数据的函数struct teacher teach299,te
15、mp;int i=0;FILE *fp;char filename20;printf(n请输入存有教师信息的文件名:);scanf(%s,filename); if(fp=fopen(filename,rb)=NULL)printf(n无法翻开文件n);e*it(0);fseek(fp,-sizeof(struct teacher),2);/*将位置指针从文件末尾后退一个构造体的字节数*/fread(&temp,sizeof(struct teacher),1,fp);/*从所指向的文件中读出数据存储到构造体变量temp中*/fseek(fp,0,0);/将位置指针移到文件的开头if(frea
16、d(&teachi,sizeof(struct teacher),1,fp)=1)/*判断文件开头读入的数据是否为空*/printf(n存有的教师信息如下:n);while(teachi.num!=temp.num)/进展循环读取文件printf(教师号:%ld,:%s,性别:%s,年龄:%d,学历:%s,teachi.num,,teachi.se*,teachi.age,); printf(职称:%sn 月薪:%ld,住址:%s,:%sn,teachi.title,teachi.wage,teachi.addr,teachi.telep); i=i+
17、1; fread(&teachi,sizeof(struct teacher),1,fp);/*从文件中读入数据存储到构造体变量teach【i】中*/输出文件中的最后一个信息 printf(教师号:%ld,:%s,性别:%s,年龄:%d,学历:%s,teachi.num,,teachi.se*,teachi.age,); printf(职称:%sn 月薪:%ld,住址:%s,:%sn,teachi.title,teachi.wage,teachi.addr,teachi.telep); fclose(fp);else printf(该文件中无教师信息n
18、);/文件为空时输出此处void creat()/录入教师信息的函数struct teacher *p1,*p2,*p3;p1=p2=(struct teacher *)malloc(LEN);/*申请一个构造体字节数的空间用来存储一个教师的信息*/printf(请输入一位教师的教师号完毕录入请输入0:);scanf(%ld,&p1-num);if(p1-num!=0)/判断用户是要完毕录入还是要存储信息if(head=NULL) head=p1;/*判断链表是否为空,是则将链表头指向p1*/else /链表不为空则将链表尾指向p1p3=head;/p3用来记录链表的尾部while(p3-ne
19、*t!=NULL)/*假设p3不是链表尾则将p3指向 下一个结点*/p3=p3-ne*t;p3-ne*t=p1;/将最后一个结点指向p1while(p1-num!=0)/判断用户是否完毕录入功能/录入该教师号的教师对应的信息printf(: );scanf(%s,p1-name);printf(性别:);scanf(%s,p1-se*);printf(年龄:);scanf(%d,&p1-age);printf(学历:);scanf(%s,p1-edu);printf(职称:);scanf(%s,p1-title);printf(月薪:);scanf(%ld,&p1-wage);printf(住
20、址:);scanf(%s,p1-addr);printf(:);scanf(%s,p1-telep);n=n+1;/给统计录入的教师数n加一/*判断是否为第一个录入的信息,是则将链表头指向p1,否则将p2指向p1*/ if(n=1) head=p1; else p2-ne*t=p1;p2=p1;/p2用来记录链表的最后一个结点p1=(struct teacher *)malloc(LEN);/重新申请空间printf(请输入一位教师的教师号(完毕录入请输入0): );scanf(%ld,&p1-num);p2-ne*t=NULL;/将最后一个结点指向空void print()/输出教师信息的函
21、数struct teacher *p;int i;p=head;if(head!=NULL)/判断链表是否为空 printf(n这%d位教师的信息为:n,n);doprintf(教师号:%ld,:%s,性别:%s,年龄:%d,学历:%s,职称:%sn,p-num,p-name,p-se*,p-age,p-edu,p-title);printf( 月薪:%ld,住址:%s,:%sn,p-wage,p-addr,p-telep);p=p-ne*t;/将下一个结点的首地址赋给pwhile(p!=NULL);/到链表尾时完毕循环else/链表为空时执行以下局部printf(n你此次登录系统还没有录入教
22、师信息,可进展以下操作:n);printf( 1:【浏览以前保存在文件中的教师信息】 2:【开场录入教师信息】n);printf( 3:【退出系统】 4:【返回菜单】n);printf(请选择:);scanf(%d,&i);while(i4)printf(选择无效,请重新输入正确选项:);scanf(%d,&i);if(i=1) read();/调用从文件读取数据的函数 if(i=2) creat();/调用录入信息的函数if(i=3) e*it(0);/退出系统void del()/删除教师信息的函数struct teacher *p1,*p2;long i;if(head=NULL)/判断
23、链表是否为空printf(n还未录入过教师信息n);/链表为空时输出return;printf(请输入要删除教师信息的教师号:);scanf(%ld,&i);p1=head;while(i!=p1-num)/直到p1指向的结点是要删除的信息位置if(p1-ne*t=NULL) break;/p1的下个结点为空则退出循环p2=p1;/p2用来记录p1的前一个结点p1=p1-ne*t;/p1指向下一个结点if(i=p1-num)/判断p1是否为要删除的信息if(p1=head) head=p1-ne*t;/*假设p1为头结点则将头指针指向p1的下一个结点*/else p2-ne*t=p1-ne*t
24、;/*p1非头结点则将p1后面的结点连接到p1前一个结点的后面*/printf(n已删除教师号为%ld的教师信息n,i);n=n-1;/记录教师数的n要减一/p1不是要删除的信息则表示要删除的信息不再链表中else printf(n已录入的教师信息中没有教师号为%ld的n,i);return;void sort1()/按教师号进展排序的函数struct teacher *p1,*p2,*p3,*p4;int i,j;if(head=NULL)printf(n还未录入过教师信息n);return;if(head-ne*t!=NULL) /判断是否只有一个信息/用冒泡法排序p1=head;/p1记
25、录用来比拟的两个结点中的前面一个 p2=head-ne*t;/p2记录比拟的两个结点中的后面个 for(i=1;in;i+)/实现n-1趟比拟的外循环 for(j=0;jnump2-num)/*比拟相邻两个结点中教师号大小*/当p1的教师号大时则对调两个结点的位置if(p1=head) head=p2;else p3-ne*t=p2;/*p1为头结点时则将头指针指向p2,否则就将p2连接到用来记录p1前一个结点的p3的后面*/p4=p2-ne*t;/p4用来记录p2后面的结点p2-ne*t=p1;/p1的结点换到原来p2的位置p1-ne*t=p4;/原来p2后面的结点连接到p1p3=p2;/p
26、3记录下p2的位置p2=p4;/p2指向原来位置的下一个结点else/*p1中教师号没有打过p2中教师号,则将p1,p2都指向它们各自位置的下一个结点*/p3=p1;/记录p1后移一位后它前个结点的位置p1=p2;p2=p2-ne*t;p1=head;/p1指向链表头,开场下一趟外循环的准备p2=p1-ne*t;/p2指向链表第二个结点printf(n按教师号排序后的教师信息如下:n);print();/调用教师信息浏览函数void sort2()/按月薪排序的函数,算法跟按教师号排序的一样struct teacher *p1,*p2,*p3,*p4;int i,j;if(head=NULL)
27、printf(n还未录入过教师信息n);return;if(head-ne*t!=NULL) p1=head; p2=head-ne*t; for(i=1;in;i+) for(j=0;jwagep2-wage)if(p1=head) head=p2;else p3-ne*t=p2;p4=p2-ne*t;p2-ne*t=p1;p1-ne*t=p4;p3=p2;p2=p4;elsep3=p1;p1=p2;p2=p2-ne*t;p1=head;p2=p1-ne*t;printf(n按月薪排序后的教师信息如下:n);print();void sort3()/按年龄排序的函数,算法跟按教师号排序的一样
28、struct teacher *p1,*p2,*p3,*p4;int i,j; if(head=NULL)printf(n还未录入过教师信息n);return;if(head-ne*t!=NULL) p1=head; p2=head-ne*t; for(i=1;in;i+) for(j=0;jagep2-age)if(p1=head) head=p2;else p3-ne*t=p2;p4=p2-ne*t;p2-ne*t=p1;p1-ne*t=p4;p3=p2;p2=p4;elsep3=p1;p1=p2;p2=p2-ne*t;p1=head;p2=p1-ne*t;printf(n按年龄排序后的教
29、师信息如下:n);print();void choose1()/选择排序方式的函数int i;printf( 排序方式n);printf( 1:【按教师号排序】 2:【按年龄排序】n);printf( 3:【按月薪排序】n);printf(请选择:);scanf(%d,&i); while(i3)printf(选择无效,请重新输入正确选项:);scanf(%d,&i);switch(i) case 1:sort1();break; case 2:sort3();break; case 3:sort2();break;void search1()/按教师号查找的函数struct teacher
30、*p;long i;/存储用户输入的想要删除的教师号if(head=NULL)printf(n还未录入过教师信息n);return;printf(请输入要查找的教师信息的教师号:); scanf(%ld,&i);for(p=head;p!=NULL;p=p-ne*t) /p顺序指向结点与i比拟,找出有i的数据的结点并输出if(p-num=i) printf(教师号:%ld,:%s,性别:%s,年龄:%d,学历:%s,职称:%sn,p-num,p-name,p-se*,p-age,p-edu,p-title);printf( 月薪:%ld,住址:%s,:%sn,p-wage,p-addr,p-t
31、elep);return;printf(已录入的教师信息中不存在该教师号n);void search2()/按查找的函数struct teacher *p;char i20;/记录用户输入的想要删除的int j=0;/j用来记录找到了多少个信息if(head=NULL)printf(n还未录入过教师信息n);return;printf(请输入要查找的信息的教师:); scanf(%s,i);for(p=head;p!=NULL;p=p-ne*t)if(strcmp(p-name,i)=0)/比拟p指向的结点中的跟i的是否一致,是则输出 printf(教师号:%ld,:%s,性别:%s,年龄:%
32、d,学历:%s,职称:%sn,p-num,p-name,p-se*,p-age,p-edu,p-title);printf( 月薪:%ld,住址:%s,:%sn,p-wage,p-addr,p-telep);j=j+1;/每输出一个教师的信息则j加一if(j=0) printf(已录入的教师信息中不存在该的教师n);void search3()/按职称查找的函数,算法与按查找的一样struct teacher *p;char i20;int j=0;if(head=NULL)printf(n还未录入过教师信息n);return;printf(请输入要查找的信息的教师职称:); scanf(%s
33、,i);for(p=head;p!=NULL;p=p-ne*t)if(strcmp(p-title,i)=0) printf(教师号:%ld,:%s,性别:%s,年龄:%d,学历:%s,职称:%sn,p-num,p-name,p-se*,p-age,p-edu,p-title);printf( 月薪:%ld,住址:%s,:%sn,p-wage,p-addr,p-telep); j=j+1;if(j=0) printf(已录入的教师信息中不存在该职称的教师n);void search4()/按年龄查找的函数,算法与按教师号查找的一样struct teacher *p;int i,j=0;if(h
34、ead=NULL)printf(n还未录入过教师信息n);return;printf(请输入要查找的信息的教师年龄:); scanf(%d,&i);for(p=head;p!=NULL;p=p-ne*t)if(p-age=i)printf(教师号:%ld,:%s,性别:%s,年龄:%d,学历:%s,职称:%sn,p-num,p-name,p-se*,p-age,p-edu,p-title);printf( 月薪:%ld,住址:%s,:%sn,p-wage,p-addr,p-telep); j=j+1;if(j=0) printf(已录入的教师信息中不存在该年龄的教师n);void choose
35、2()/选择查找方式的函数int i;printf( 查询方式n);printf( 1:【按教师号查询】 2:【按查询】n);printf( 3:【按职称查询】 4:【按年龄查询】n);printf(请选择:);scanf(%d,&i);while(i4)printf(选择无效,请重新输入正确选项:);scanf(%d,&i);switch(i) case 1:search1();break; case 2:search2();break; case 3:search3();break;case 4:search4();break;void menu()/菜单栏函数int i;printf(
36、菜单n);printf( 1:【教师信息录入】 2:【教师信息输出】n);printf( 3:【教师信息删除】 4:【查询个人信息】n);printf( 5:【排序】 6:【退出系统】n);printf(请选择: );scanf(%d,&i);while(i6)printf(选择无效,请重新输入正确选项:);scanf(%d,&i);switch(i) case 1:creat();break; case 2:print();break; case 3:del();break; case 4:choose2();break; case 5:choose1();break; case 6:save();menu();void main()/主函数key();menu();程序运行效果图4.1登陆界面 4.2菜单栏4.3录入功能4.4浏览功能4.5删除功能4.6查询功能4.7排序功能总结报告5.1课程设计中遇到的主要问题和解决方法在这次的C语言课程设计的编程中,由于以前对链表和文件这两局部的容了解过少,因此在编程中涉及到这两方面的容时,照成了很大的阻
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 ISO/IEC 18046-5:2025 EN Information technology - Radio frequency identification device performance test methods - Part 5: Test methods for the environmental characteristics
- 2024食品工厂代加工冷链配送服务合同范本3篇
- 2024版无人机遥感监测服务合同
- 2025年度水库鱼塘智能化养殖技术承包合同4篇
- 出资协议书范本
- 2024版铝锭批发销售协议样本一
- 2025年度生态环保打井承包合同标准范本4篇
- 2025年度智慧家居产品销售与售后服务合同3篇
- 2025年度住宅小区墙面公共艺术创作租赁合同标的协议4篇
- 2025年度牙科专业人才培养与承包服务合同范本4篇
- DL-T1848-2018220kV和110kV变压器中性点过电压保护技术规范
- DZ∕T 0213-2020 矿产地质勘查规范 石灰岩、水泥配料类(正式版)
- 食品销售业务员合同
- (中考试题)2024年浙江省绍兴市中考数学真题试卷解析版
- 国有企业内部审计实施方案
- 部编版语文一年级下册全册大单元整体作业设计
- 减速机的培训课件
- 六西格玛-DMAIC-报告
- 老年人护理风险管理
- 蒸压加气混凝土制品课件
- 《根号2有多大》课件
评论
0/150
提交评论