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

下载本文档

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

文档简介

1、课程设计任务书计算机科学与技术专业 2010年级 一 班 陈金利一、设计题目教师信息管理系统设计二、主要内容教师信息包括教师号、姓名、性别、年龄、学历、职称、工资、住址、电话等(教师号不重复)。试设计一教师信息管理系统,使之能 提供以下功能:(1) 系统以菜单方式工作(2) 教师信息录入功能输入(3) 教师信息删除功能(4) 教师信息浏览功能 输出(5) 查询和排序功能:(至少一种查询方式) 算法 按教师号查询按职称查询等三、具体要求围绕课程设计的目的和意义,基本要求如下:1、 认真阅读c 语言课程设计指导书,明确课程设计的目的、 意义和要求;2、 快速总结 c 程序设计语言的精髓,如:函数的

2、概念、函数的设 计和函数的调用;3、 快速熟悉 tuber c 或 c+的上机环境。能熟练进行高级编辑操 作(特别是字块操作);熟悉步进式、断点跟踪的程序调试方法,提高 工作效率。4、 根据“课程设计题目”,采用结构化的程序设计思想,确定系 统的总体设计方案、确 定时间进度。如果是多人共一题,则要首先完 成小组内的人员分工及安排,不允许重题现象。3 学习并了解良好的程序设计风格。按质、按量、并按时间完成 课程设计的任务。4 提供可运行的课程设计系统,参加上机面试答辩。本次课程设计的重点是:学会设计并编写函数,掌握好各函数之 间的调用关系;利用文件操作函数,建立数据库并完成对数据库的各 种操作;

3、掌握几种典型算法的应用(如:冒泡法、选择排序法和折半 查找法)。同时锻炼学生根据题目进行分析、设计、编码、调试程序和 书写必要文档的综合处理能力,从实践中学习并体会程序设计的结构 化思想和设计方法。四、进度安排依照教学计划,课程设计时间为 3 周。按照软件工程的思想,软件 系统的分析设计至关重要,并要充分重视书写“文档”。避免甚至杜绝 “拿到题目就编码”的现象。建议将时间分为三个阶段:第一阶段,根据题目要求,拿出系统的总体设计方案:即构思各 程序模块的算法,并画出相应的 n-s 图,同时编写相应的文档;第二阶段,根据 n-s 图编写程序代码并单独调试,再将调试通过 的各个子模块进行集成调试;第

4、三阶段,归纳文档资料,按要求填写在课程设计说明书上, 并参加答辩。三个阶段时间分配的大概比例是: 35:45:20。五、完成后应上交的材料1 课程设计的题目、系统的总功能和各子模块的功能;2 题目的设计思想(或算法)简述;3 主要程序的框图(要求用 n-s 图);4 源程序代码(要求在关键的位置有注释,从而增加程序的可读性);5课程设计的总结报告,主要包括以下内容:(1) 课程设计中遇到的主要问题和解决方法;(2) 你的创新和得意之处;(3) 设计中存在的不足及改进的设想;(4) 本次课程设计的感想和心得体会。以上完成的源程序及相关文档,填写在课程设计说明书上, 要求干净整洁,符合课程设计的要

5、求和规范。六、总评成绩指导教师系 主 任签名日期审核日期年年月月日日目录一题目设计思想简述5 二程序的 ns 图72.1 总程序的 ns 图7 2.2 各子函数的 ns 图7 2.2.1 教师信息录入函数8 2.2.2 教师信息浏览函数8 2.2.3 教师信息删除函数9 2.2.4 教师信息查询函数9 2.2.5 教师信息排序函数10三源程序代码11 四程序运行效果图334.1 登陆界面33 4.2 菜单栏33 4.3 录入功能34 4.4 浏览功能34 4.5 删除功能35 4.6 查询功能35 4.7 排序功能36五总结报告 37 5.1 课程设计中遇到的主要问题和解决方法37 5.2 你

6、的创新和得意之处37 5.3 设计中存在的不足及改进的设想37 5.4 本次课程设计的感想和心得体会38一题目设计思想简述主函数识别口令的函数菜单栏函数录 入教 师信 息的 函数查 询教 师信 息的 函数删 除教 师信 息的 函数浏 览教 师信 息的 函数教 师信 息排 序的 函数退出系统如上图所示,该教师信息管理系统主要是一个以动态链表的应用 为基础来实现对教师信息的录入,查询,删除等功能。定义教师结构体如下:struct teacherlong num;/教师号char name20;/ 姓名char sex5;/性别int age;/年龄char edu20;/学历char title2

7、0;/职称long wage;/工资char addr100; / 地址char telep15;/电话struct teacher *next;*head=null;主函数只进行口令函数和菜单栏函数的调用,主要工作通过菜单函 数实现。口令为 123456。菜单栏函数通过用 switch 语句实现不同功能的选择,不同的功能用 不同的子函数实现。录入教师信息通过建立动态单链表来实现。浏览教师信息则通过将链表所有数据顺序输出来实现。查询功能只要从链表头开始不断往下一个结点读取信息跟所要查 找的信息比较,直到读取到的信息跟所要查找的信息相同或链表尾为 止,并把此结点的信息输出。删除教师信息的函数是通

8、过查找链表中有该信息的结点后将该结 点移出链表,即使该结点前一个结点直接指向该结点后面的结点来达 到删除信息的目的。排序函数是通过交换结点在链表中的位置来实现的,即使得各结 点在链表中的位置便是所要得到的排序该信息应在的位置,这样直接 顺序输出链表的信息时就能按所要的排序输出了。二程序的 ns 图2.1 总程序的 ns 图i=0当 i3输入口令 at a=123456? f退出循环i=i+1t i=3?f口 令3 次输 入错误,退 出输入所选择的功能 b 当 b6重新输入所要选择的功能 b t b=1?f系统教师t b=2?f信录功息入能教信浏功师息览能t b=3? f 教 师 t b=4?

9、f信 息教 师 t b=5? f 删 除信 息功 能 教 师 退 出 系 查 询信 息 统功 能排 序功能说明:各功能都是通过调用子函数来实现的。2.2 各子函数的 ns 图子函数主要包括教师信息录入,教师信息浏览,教师信息删除, 教师信息查询和教师信息排序等 5 个。在退出系统时调用了一个保存 信息到文件中的函数,该函数只是简单的应用了文件的读写功能,在此不写出其 ns 图。2.2.1 教师信息录入函数p1=(struct teacher *)malloc(len) 输入一个教师号 p1-numt教师号为 0?ft链表头为空?fhead=p1当教师号不为 0p3=head当 p3-next

10、不为空p3=p3-nextp3-next=p1输入教师的姓名,性别,年龄,学历,职称,月薪,住址, 电话n=n+1t第一个录入?fhead=p1p2-next=p1p2=p1p1=(struct teacher *)malloc(len)输入一个教师号 p1-nump2-next=null说明:p1=(struct teacher *)malloc(len)中 len 是在程序开头的宏 定义(#define len sizeof(struct teacher)。其中 n 为全局变量,用来统 计链表的结点数,以下出现的 n 都是同一个。2.2.2 教师信息浏览函数p=headt链表头为空?f显示

11、“还未 录 入过信息”输出 p 所指向的位置中的教师的所有信息p=p-next直到 p 为空说明:实际程序中在链表头为空是提供了可以浏览之前保存在文 件中的信息的功能,当选择该功能时就调用了一个读取文件的函数。 该函数只是对文件读写的简单应用,详细请看后面第三部分代码,这 里不写出其 n-s 图。2.2.3 教师信息删除的函数t链表头为空?f输 出“ 还未 录入 过教 师信 息”输入要删除教师信息的教师号 i p1=head当 i!=p1-numt p1-next 为空?退 出p2=p1循环p1=p1-nextft i!=p1-num? f输出“已录入 的 教 师 信 息 中 没 有 该 教

12、师号”t p1 为链表头?head=p1-next p2-next=p1-nextn=n-1f2.2.4 教师信息查询的函数在查询方面程序为用户提供了 4 种不同方式的查询,每一种方式 的查询为一个子函数,此时也是采用一个菜单栏函数进行选择查询方 式并调用该种方式的函数。菜单栏函数跟主程序菜单栏的算法一样,此处只给出查询函数的 ns 图。j=0t链表头为空?f输出“还未录入程序”并退出函数输入要查找的教师信息的对应方法的对应数据 ip=head当 p 非空时t i 跟 p 中对应信息不等?输出 p 所指向的位置的教师的所有信息 j=j+1p=p-nextt j 不为 0?输出“已录入的信息中不

13、存在符合 i 的信息的教师ff说明:该 ns 图是对应姓名,教师号,职称,年龄四种查找方式 的函数的。当选择教师号查找时,输入 i 的即为教师号,与 i 做比较的 为 p 中的教师号,选择其他查找方式时类似。2.2.5 教师信息排序函数排序也跟查询一样给出多种排序方式并采用菜单栏函数,此处也只 给出排序函数的 ns 图。tt链表头不为空?输出“还未录入过教师信息”并退出函数 第二个结点为空?p1=headp2=head-nextffi=1当 i 小于 n 时j=0当 j 小于 n-i 时p1 中的对应信息小过 p2 的? tfp3=p1 t p1 为链表头?fhead=p2p3-next=p2

14、p1=p2p2=p2-nextp4=p2-nextp2-next=p1p1-next=p4p3=p2p2=p4p1=headp2=p1-next调用教师信息浏览函数说明: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 s

15、ex5;/性别int age;/年龄char edu20;/学历char title20;/职称long wage;/工资char addr100;/ 地址char telep15;/电话struct teacher *next;/指向下一个结点 *head=null;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

16、teach299,temp;int i=0;file *fp;char filename20;printf(n 请输入存有教师信息的文件名:); scanf(%s,filename);if(fp=fopen(filename,rb)=null)printf(n 无法打开文件 n);exit(0);fseek(fp,-sizeof(struct teacher),2);/*将位置指针从文件末尾后退 一个结构体的字节数*/fread(&temp,sizeof(struct teacher),1,fp);/*从所指向的文件中读 出数据存储到结构体变量 temp 中*/fseek(fp,0,0);/将

17、位置指针移到文件的开头 if(fread(&teachi,sizeof(struct teacher),1,fp)=1)/*判断文件开头读入的数据是否为空*/printf(n 存有的教师信息如下:n);while(teachi.num!=temp.num)/进行循环读取文件printf(教师号:%ld,姓名:%s,性别:%s,年龄:%d,学历:%s,teachi.num,,teachi.sex,teachi.age,);printf(职称:%sn月薪:%ld,住址:%s,电话:%sn,teachi.title,teachi.wage,teachi.ad

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

19、lse printf(该文件中无教师信息n);/文件为空时输出此处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

20、=head;/p3 用来记录链表的尾部 while(p3-next!=null)/*若 p3 不是链表尾则将 p3 指向下一个结点*/p3=p3-next;p3-next=p1;/将最后一个结点指向 p1while(p1-num!=0)/判断用户是否结束录入功能/录入该教师号的教师对应的信息printf(姓名: );scanf(%s,p1-name);printf(性别:);scanf(%s,p1-sex);printf(年龄:);scanf(%d,&p1-age);printf(学历:);scanf(%s,p1-edu);printf(职称:);scanf(%s,p1-title);prin

21、tf(月薪:);scanf(%ld,&p1-wage);printf(住址:);scanf(%s,p1-addr);printf(电话:);scanf(%s,p1-telep);n=n+1;/给统计录入的教师数 n 加一/*判断是否为第一个录入的信息,是则将链表头指向 p1,否则将 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);

22、p2-next=null;/将最后一个结点指向空void print()/输出教师信息的函数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-sex,p-age,p-edu,p-title);printf(月薪:%ld,住址:%s,电话:%sn,p-wage,p-addr,p-telep);p=p-next;/将下一个结点的首地址赋给 p while(p!=nu

23、ll);/到链表尾时结束循环else/链表为空时执行以下部分printf(n 你此次登录系统还没有录入教师信息,可进行以 下操作: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) exit(0);/退出系统void del()/删除教师

24、信息的函数struct teacher *p1,*p2;long i;if(head=null)/判断链表是否为空printf(n 还未录入过教师信息 n);/链表为空时输出 return;printf(请输入要删除教师信息的教师号:);scanf(%ld,&i);p1=head;while(i!=p1-num)/直到 p1 指向的结点是要删除的信息位置 if(p1-next=null) break;/p1 的下个结点为空则退出循环 p2=p1;/p2 用来记录 p1 的前一个结点p1=p1-next;/p1 指向下一个结点if(i=p1-num)/判断 p1 是否为要删除的信息if(p1=h

25、ead) head=p1-next;/* 若 p1 为头结点则将头指针指 向 p1 的下一个结点*/else p2-next=p1-next;/*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(hea

26、d=null)printf(n 还未录入过教师信息n);return;if(head-next!=null) /判断是否只有一个信息/用冒泡法排序p1=head;/p1 记录用来比较的两个结点中的前面一个 p2=head-next;/p2 记录比较的两个结点中的后面个 for(i=1;in;i+)/实现 n-1 趟比较的外循环for(j=0;jnump2-num)/*比较相邻两个结点中教师号大小*/当 p1 的教师号大时则对调两个结点的位置 if(p1=head) head=p2;else p3-next=p2;/*p1 为头结点时则将头指针指向 p2,否则就将 p2 连接到用来记录 p1 前

27、一个结点的 p3 的后面*/p4=p2-next;/p4 用来记录 p2 后面的结点 p2-next=p1;/p1 的结点换到原来 p2 的位置 p1-next=p4;/原来 p2 后面的结点连接到 p1 p3=p2;/p3 记录下 p2 的位置p2=p4;/p2 指向原来位置的下一个结点else/*p1 中教师号没有打过 p2 中教师号,则将 p1,p2 都指向它们各自位置的下一个结点*/p3=p1;/记录 p1 后移一位后它前个结点的位置 p1=p2;p2=p2-next;p1=head;/p1 指向链表头,开始下一趟外循环的准备 p2=p1-next;/p2 指向链表第二个结点print

28、f(n 按教师号排序后的教师信息如下: n);print();/调用教师信息浏览函数void sort2()/按月薪排序的函数,算法跟按教师号排序的一样struct teacher *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;jwagep2-wage)if(p1=head) head=p2;else p3-next=p2;p4=p2-next;p2-next=p1;p1-next=p

29、4;p3=p2;p2=p4;elsep3=p1;p1=p2;p2=p2-next;p1=head;p2=p1-next;printf(n 按月薪排序后的教师信息如下:n);print();void sort3()/按年龄排序的函数,算法跟按教师号排序的一样 struct teacher *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=

30、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 choose1()/选择排序方式的函数int i;printf(printf( 1:【按教师号排序】【按年龄排序】n);printf( 3:【按月薪排序】n); printf(请选择:);scanf(%d,&i);while(i3)排序方式n);2:printf(选择无效,请重新输入正确选项:);

31、scanf(%d,&i);switch(i)case 1:sort1();break;case 2:sort3();break;case 3:sort2();break;void search1()/按教师号查找的函数struct teacher *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

32、=i)printf(教师号:%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);return;printf(已录入的教师信息中不存在该教师号 n); void search2()/按姓名查找的函数struct teacher *p;char i20;/ 记录用户输入的想要删除的姓名int j=0;/j 用来记录找到了多少个信息if(head=null)printf(n 还未录入过教师信息 n);re

33、turn;printf(请输入要查找的信息的教师姓名:); scanf(%s,i);for(p=head;p!=null;p=p-next)if(strcmp(p-name,i)=0)/比较 p 指向的结点中的姓名跟 i 的是否一致,是则输出printf(教师号:%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;/每输出一个教师的信息则 j 加一if(j=0) printf(已录入的教

34、师信息中不存在该姓名的教师 n); void search3()/按职称查找的函数,算法与按姓名查找的一样 struct teacher *p;char i20;int j=0;if(head=null)printf(n 还未录入过教师信息 n);return;printf(请输入要查找的信息的教师职称:); scanf(%s,i);for(p=head;p!=null;p=p-next)if(strcmp(p-title,i)=0)printf(教师号:%ld,姓名:%s,性别:%s,年龄:%d,学历:%s,职称:%sn,p-num,p-name,p-sex,p-age,p-edu,p-ti

35、tle);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(head=null)printf(n 还未录入过教师信息 n);return;printf(请输入要查找的信息的教师年龄:);scanf(%d,&i);for(p=head;p!=null;p=p-next)if(p-age=i)printf(教师号:%ld,姓名:

36、%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 choose2()/选择查找方式的函数int i;printf(printf( 1: 【按教师号查询】2:【按姓名查询】n);printf( 3: 【按职称查询】查询方式n);4:【按年龄查询】n);printf(请选择:);scanf(%d,&i);while(i

37、4)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(菜单n);printf( 1:【教师信息录入】 【教师信息输出】n);printf( 3:【教师信息删除】 【查询个人信息】n);printf( 5:【排序】2:4:6:【退出系统】n);printf(请选择: );scanf(%d,&i);while(i6

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

评论

0/150

提交评论