教师信息管理系统(C语言课程设计)_第1页
教师信息管理系统(C语言课程设计)_第2页
教师信息管理系统(C语言课程设计)_第3页
教师信息管理系统(C语言课程设计)_第4页
教师信息管理系统(C语言课程设计)_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算机科学与技术 专业 年级 班供以下功能:民小字()号1、认真阅读C语言课程设计指导书,明确课程设计的目的、意义和要求;2、快速总结 C 程序设计语言的精髓,如:函数的概念、函数的设计和函数的调用;、快速熟悉 TuberC 或 C+的上机环境。能熟练进行高级编辑操工作效率。4的总体设计方案、确定时间进度。如果是多人共一题,则要首先完成小组内的人员分工及安排,不允许重题现象。5学习并了解良好的程序设计风格。按质、按量、并按时间完成课程设计的任务。6提供可运行的课程设计系统,参加上机面试答辩。本次课程设计的重点是:学会设计并编写函数,掌握好各函数之间的调用关系;利用文件操作函数,建立数据库并完成

2、对数据库的各种操作;掌握几种典型算法的应用(如:冒泡法、选择排序法和折半书写必要文档的综合处理能力,从实践中学习并体会程序设计的结构化思想和设计方法。四、进度安排依照教学计划,课程设计时间为 3周。按照软件工程的思想,软件页脚内容民小字()号“拿到题目就编码”的现象。建议将时间分为三个阶段:第一阶段,根据题目要求,拿出系统的总体设计方案:即构思各程序模块的算法,并画出相应的 N-S图,同时编写相应的文档;第二阶段,根据 N-S 图编写程序代码并单独调试,再将调试通过的各个子模块进行集成调试;第三阶段,归纳文档资料,按要求填写在课程设计说明书上,并参加答辩。三个阶段时间分配的大概比例是: :45

3、:20。五、完成后应上交的材料1课程设计的题目、系统的总功能和各子模块的功能;2题目的设计思想(或算法)简述;主要程序的框图(要求用 N-S4源程序代码(要求在关键的位置有注释,从而增加程序的可读5课程设计的总结报告,主要包括以下内容:(1)课程设计中遇到的主要问题和解决方法;(2)你的创新和得意之处;()设计中存在的不足及改进的设想;(4)本次课程设计的感想和心得体会。页脚内容民小字()号以上完成的源程序及相关文档,填写在课程设计说明书上,要求干净整洁,符合课程设计的要求和规范。六、总评成绩指导教师系 主 任签名日期年年月月日日审核日期目录一题目设计思想简述5二程序的 S 图72.1 总程序

4、的 S 图72.2 各子函数的 S 图72.2.1 教师信息录入函数82.2.2 教师信息浏览函数82.2.3 教师信息删除函数92.2.4 教师信息查询函数92.2.5 教师信息排序函数10三源程序代码11四程序运行效果图33页脚内容民小字()号4.1 登陆界面334.2 菜单栏334.3 录入功能344.4 浏览功能344.5 删除功能354.6 查询功能354.7 排序功能36五总结报告375.1 5.2 你的创新和得意之处75.3 设计中存在的不足及改进的设想75.4 本次课程设计的感想和心得体会8一题目设计思想简述查询教师信息的函数删除教师信息的函数浏览教师信息的函数教师信息排序的函

5、数退出系统教 师信 息的 函数如上图所示,该教师信息管理系统主要是一个以动态链表的应用为基础来实现对教师信息的录入,查询,删除等功能。页脚内容民小字()号定义教师结构体如下:struct teacherlong num;/教师号char name20;/姓名char sex5;/性别int age;/年龄char edu20;/学历char title20;/职称long wage;/工资char addr100; /地址char telep15;/电话struct teacher *next;*head=NULL;数实现。口令为 123456。菜单栏函数通过用 switch不同的子函数实现。

6、录入教师信息通过建立动态单链表来实现。浏览教师信息则通过将链表所有数据顺序输出来实现。查询功能只要从链表头开始不断往下一个结点读取信息跟所要查找的信息比较,直到读取到的信息跟所要查找的信息相同或链表尾为止,并把此结点的信息输出。删除教师信息的函数是通过查找链表中有该信息的结点后将该结页脚内容民小字()号点移出链表,即使该结点前一个结点直接指向该结点后面的结点来达到删除信息的目的。排序函数是通过交换结点在链表中的位置来实现的,即使得各结点在链表中的位置便是所要得到的排序该信息应在的位置,这样直接顺序输出链表的信息时就能按所要的排序输出了。二程序的 S图2.1 总程序的 S 图TF退出循环Ti=3

7、?FTFb=2?F教 师 T b=3?信 息FF录 入功 能教 师 T b=4?民小字()号b=5?F教 师 退 出 系信 息 统排 序功 能说明:各功能都是通过调用子函数来实现的。2.2 各子函数的 S图子函数主要包括教师信息录入,教师信息浏览,教师信息删除,教师信息查询和教师信息排序等 5 个。在退出系统时调用了一个保存信息到文件中的函数,该函数只是简单的应用了文件的读写功能,在此不写出其 S 图。2.2.1 教师信息录入函数p1=(struct teacher *)malloc(LEN)输入一个教师号 p1-numTFT 链表头为空?FHead=p1p3=head当 p3-next 不为

8、空输入教师的姓名,性别,年龄,学历,职称,月薪,住址,电话TFp2=p1页脚内容p1=(struct teacher *)malloc(LEN)输入一个教师号 p1-num民小字()号p2-next=NULL说明:p1=(struct teacher *)malloc(LEN)中 LEN是在程序开头的宏定义(#define LEN sizeof(struct teacher)。其中 n 为全局变量,用来统计链表的结点数,以下出现的 n 都是同一个。2.2.2 教师信息浏览函数p=headTF输出 p 所指向的位置中的教师的所有信息直到 p 为空说明:实际程序中在链表头为空是提供了可以浏览之前保

9、存在文件中的信息的功能,当选择该功能时就调用了一个读取文件的函数。该函数只是对文件读写的简单应用,详细请看后面第三部分代码,这里不写出其 N-S 图。2.2.3 教师信息删除的函数TF输入要删除教师信息的教师号 ip1=headTFp2=p1Ti!=p1-num?FFhead=p1-next p2-next=p1-next中没有该教师号”n=n-1民小字()号2.2.4 教师信息查询的函数在查询方面程序为用户提供了 4 种不同方式的查询,每一种方式的查询为一个子函数,此时也是采j=0一个菜单栏函数进行选择查询方式并调用该种方式的函数。菜单栏函数跟主程序菜单栏的算法一样,此处只给出查询函数的 S

10、 图。TFp=headTi跟p中对应信息不等?输出 p 所指向的位置的教师的所有信息FTj 不为 0?输出“已录入的信息中不存在符合 i 的信息的教师F说明:该S 图是对应姓名,教师号,职称,年龄四种查找方式的函数的。当选择教师号查找时,输入i 的即为教师号,与i 做比较的为 p 中的教师号,选择其他查找方式时类似。2.2.5 教师信息排序函数T链表头不为空?F民小字()号给出排序函数的 S 图。输出“还未录入过教师信息”并退出函数T第二个结点为空?p1=headFp2=head-nexti=1当 i 小于 n 时j=0TFTFhead=p2p1=headp2=p1-next调用教师信息浏览函

11、数页脚内容民小字()号三源程序代码#include #include #include #include #define LEN sizeof(struct teacher)/宏定义结构体字节数int n=0;struct teacher/定义结构体long num;/教师号char name20;/姓名char sex5;/性别int age;/年龄char edu20;/学历char title20;/职称long wage;/工资char addr100;/地址char telep15;/电话页脚内容民小字()号struct teacher *next;/指向下一个结点*head=NUL

12、L;void key()/口令检查的函数int i;long a;for(i=0;inext)if(fwrite(p,sizeof(struct teacher),1,fp)!=1)页脚内容民小字()号printf(n此处数据有误n);fclose(fp);exit(0);void read()/从文件读出数据的函数struct teacher teach299,temp;int i=0;FILE *fp;char filename20;printf(n请输入存有教师信息的文件名:);scanf(%s,filename);if(fp=fopen(filename,rb)=NULL)printf

13、(n无法打开文件n);exit(0);fseek(fp,-sizeof(struct teacher),2);/*将位置指针从文件末尾后退一个结构体的字节数*/fread(&temp,sizeof(struct teacher),1,fp);/*从所指向的文件中读出数据存储到结构体变量 temp 中*/fseek(fp,0,0);/将位置指针移到文件的开头if(fread(&teachi,sizeof(struct teacher),1,fp)=1)/*判断文件开头读入的数据是否为空*/页脚内容民小字()号printf(n存有的教师信息如下:n);while(teachi.num!=temp.

14、num)/进行循环读取文件教师号:%ld,姓名:%s,性别:%s,年龄:%d,学历:%s,teachi.num,,teachi.sex,teachi.age,);职称:%sn月薪:%ld,住址:%s,电话:%sn,teachi.title,teachi.wage,teachi.addr,teachi.telep);i=i+1;fread(&teachi,sizeof(struct teacher),1,fp);/*从文件中读入数据存储到结构体变量 【i】中*/输出文件中的最后一个信息printf(教师号:%ld,姓名:%s,性别:%s,年龄:%d,学历

15、:%s,teachi.num,,teachi.sex,teachi.age,);printf(职称:%sn月薪:%ld,住址:%s,电话:%sn,teachi.title,teachi.wage,teachi.addr,teachi.telep);fclose(fp);else printf(该文件中无教师信息文件为空时输出此处void creat()/录入教师信息的函数struct teacher *p1,*p2,*p3;p1=p2=(struct teacher *)malloc(LEN);/*申请一个结构体字节数的空间用来存储一个教师的信息*/页

16、脚内容民小字()号printf(请输入一位教师的教师号(结束录入请输入 0);scanf(%ld,&p1-num);if(p1-num!=0)/判断用户是要结束录入还是要存储信息if(head=NULL) head=p1;/*判断链表是否为空,是则将链表头指向 p1*/else /链表不为空则将链表尾指向 p1p3=head;/p3用来记录链表的尾部while(p3-next!=NULL)/*若p3不是链表尾则将p3指向下一个结点*/p3=p3-next;p3-next=p1;/将最后一个结点指向 p1while(p1-num!=0)/判断用户是否结束录入功能/录入该教师号的教师对应的信息pr

17、intf(姓名: );scanf(%s,p1-name);printf(性别:);scanf(%s,p1-sex);printf(年龄:);scanf(%d,&p1-age);printf(学历:);scanf(%s,p1-edu);printf(职称:);页脚内容民小字()号scanf(%s,p1-title);printf(月薪:);scanf(%ld,&p1-wage);printf(住址:);scanf(%s,p1-addr);printf(电话:);scanf(%s,p1-telep);n=n+1;/给统计录入的教师数 n 加一/*判断是否为第一个录入的信息,是则将链表头指向 p1,

18、否则将p2 指向 p1*/if(n=1) head=p1;else p2-next=p1;p2=p1;/p2 用来记录链表的最后一个结点p1=(struct teacher *)malloc(LEN);/重新申请空间printf(请输入一位教师的教师号结束录入请输入 0): );scanf(%ld,&p1-num);p2-next=NULL;/将最后一个结点指向空void print()/输出教师信息的函数struct teacher *p;int i;p=head;if(head!=NULL)/判断链表是否为空页脚内容民小字()号printf(n这%d位教师的信息为:n,n);do教师号:%

19、ld,姓名:%s,性别:%s,年龄:%d,学历:%s,职称:%sn,p-num,p-name,p-sex,p-age,p-edu,p-title);printf( 月薪:%ld,住址:%s,电话:%sn,p-wage,p-addr,p-telep);p=p-next;/将下一个结点的首地址赋给pwhile(p!=NULL);/到链表尾时结束循环else/链表为空时执行以下部分printf(n你此次登录系统还没有录入教师信息,可进行以下操作:n);printf(1:【浏览以前保存在文件中的教师信息】3:【退出系统】2:【开始录入教师信息】n);printf(4:【返回菜单】n);printf(请

20、选择:);scanf(%d,&i);while(i4)选择无效,请重新输入正确选项:);scanf(%d,&i);页脚内容民小字()号if(i=1) read();/调用从文件读取数据的函数if(i=2) creat();/调用录入信息的函数if(i=3) exit(0);/退出系统void del()/删除教师信息的函数struct teacher *p1,*p2;long i;if(head=NULL)/判断链表是否为空printf(n还未录入过教师信息链表为空时输出return;printf(请输入要删除教师信息的教师号:);scanf(%ld,&i);p1=head;while(i!=

21、p1-num)/直到 p1 指向的结点是要删除的信息位置if(p1-next=NULL) break;/p1 的下个结点为空则退出循环p2=p1;/p2 用来记录 p1 的前一个结点p1=p1-next;/p1 指向下一个结点if(i=p1-num)/判断 p1 是否为要删除的信息页脚内容民小字()号if(p1=head) head=p1-next;/*若 p1 为头结点则将头指针指向 p1 的下一个结点*/else p2-next=p1-next;/*p1非头结点则将p1后面的结点连接到 p1 前一个结点的后面*/printf(n已删除教师号为%ld 的教师信息n,i);n=n-1;/记录教

22、师数的 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-next!=NULL) /判断是否只有一个信息/用冒泡法排序p1=head;/p1记录用来比较的两个结点中的前面一个p2=head-next;/p2记录比较的两个结点中的后面个for(i=1;in;i+)/实现 n-1

23、趟比较的外循环页脚内容民小字()号for(j=0;jnump2-num)/*比较相邻两个结点中教师号大小*/当 p1 的教师号大时则对调两个结点的位置if(p1=head) head=p2;else p3-next=p2;/*p1为头结点时则将头指针指向 p2,否则就将 p2 连接到用来记录 p1 前一个结点的 p3 的后面*/p4=p2-next;/p4 用来记录p2 后面的结点p2-next=p1;/p1 的结点换到原来 p2 的位置p1-next=p4;/原来 p2 后面的结点连接到 p1p3=p2;/p3 记录下 p2 的位置p2=p4;/p2 指向原来位置的下一个结点else/*p1

24、中教师号没有打过 p2 中教师号,则将p1,p2 都指向它们各自位置的下一个结点*/p3=p1;/记录 p1 后移一位后它前个结点的位置p1=p2;p2=p2-next;p1=head;/p1指向链表头,开始下一趟外循环的准备p2=p1-next;/p2 指向链表第二个结点页脚内容民小字()号printf(n按教师号排序后的教师信息如下:n);print();/调用教师信息浏览函数void sort2()/按月薪排序的函数,算法跟按教师号排序的一样struct teacher *p1,*p2,*p3,*p4;int i,j;if(head=NULL)printf(n还未录入过教师信息n);re

25、turn;if(head-next!=NULL)p1=head;p2=head-next;for(i=1;in;i+)for(j=0;jwagep2-wage)if(p1=head) head=p2;页脚内容民小字()号else p3-next=p2;p4=p2-next;p2-next=p1;p1-next=p4;p3=p2;p2=p4;elsep3=p1;p1=p2;p2=p2-next;p1=head;p2=p1-next;printf(n按月薪排序后的教师信息如下:n);print();void sort3()/按年龄排序的函数,算法跟按教师号排序的一样struct teacher *

26、p1,*p2,*p3,*p4;int i,j;页脚内容民小字()号if(head=NULL)printf(n还未录入过教师信息n);return;if(head-next!=NULL)p1=head;p2=head-next;for(i=1;in;i+)for(j=0;jagep2-age)if(p1=head) head=p2;else p3-next=p2;p4=p2-next;p2-next=p1;p1-next=p4;p3=p2;p2=p4;else页脚内容民小字()号p3=p1;p1=p2;p2=p2-next;p1=head;p2=p1-next;printf(n按年龄排序后的教师

27、信息如下:n);print();void choose1()/选择排序方式的函数int i;printf(排序方式n);2:printf(【按年龄排序】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

28、*p;long i;/存储用户输入的想要删除的教师号if(head=NULL)printf(n还未录入过教师信息n);return;printf(请输入要查找的教师信息的教师号:);scanf(%ld,&i);for(p=head;p!=NULL;p=p-next)/p 顺序指向结点与 i 比较,找出有i 的数据的结点并输出if(p-num=i)教师号:%ld,姓名:%s,性别:%s,年龄:%d,学历:%s,职称:%sn,p-num,p-name,p-sex,p-age,p-edu,p-title);页脚内容民小字()号printf(月薪:%ld,住址:%s,电话:%sn,p-wage,p-a

29、ddr,p-telep);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-next)if(strcmp(p-name,i)=0)/比较 p 指向的结点中的姓名跟 i 的是否一致,是则输出教师号:%ld,姓名:

30、%s,性别:%s,年龄:%d,学历:%s,职称:%sn,p-num,p-name,p-sex,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;pri

31、ntf(请输入要查找的信息的教师职称:);scanf(%s,i);for(p=head;p!=NULL;p=p-next)if(strcmp(p-title,i)=0)教师号:%ld,姓名:%s,性别:%s,年龄:%d,学历:%s,职称:%sn,p-num,p-name,p-sex,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()/按年龄查找的函数,算法与按教师号查找的一

32、样struct teacher *p;int i,j=0;if(head=NULL)printf(n还未录入过教师信息n);return;printf(请输入要查找的信息的教师年龄:);scanf(%d,&i);for(p=head;p!=NULL;p=p-next)if(p-age=i)教师号:%ld,姓名:%s,性别:%s,年龄:%d,学历:%s,职称:%sn,p-num,p-name,p-sex,p-age,p-edu,p-title);printf(月薪:%ld,住址:%s,电话:%sn,p-wage,p-addr,p-telep);j=j+1;if(j=0) printf(已录入的教

33、师信息中不存在该年龄的教师n);页脚内容民小字()号void choose2()/选择查找方式的函数int i;printf(查询方式n);printf(2:【按姓名查询】n);printf(1:【按教师号查询】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;

34、void menu()/菜单栏函数页脚内容民小字()号int i;printf(菜单n);printf(: 教师信息录入】: 教师信息删除】: 排序】2:4:6:【教师信息输出】n);printf(【查询个人信息】n);printf(【退出系统】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:c

35、hoose1();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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论