教师信息管理系统C语言课程设计.docx
《教师信息管理系统C语言课程设计.docx》由会员分享,可在线阅读,更多相关《教师信息管理系统C语言课程设计.docx(23页珍藏版)》请在冰豆网上搜索。
![教师信息管理系统C语言课程设计.docx](https://file1.bdocx.com/fileroot1/2023-7/25/53cfa775-638c-4f80-b8b0-c8f0caa152c3/53cfa775-638c-4f80-b8b0-c8f0caa152c31.gif)
教师信息管理系统C语言课程设计
课程设计任务书
计算机科学与技术专业年级班
一、设计题目
教师信息管理系统设计
二、主要内容
教师信息包括教师号、姓名、性别、年龄、学历、职称、工资、住址、电话等(教师号不重复)。
试设计一教师信息管理系统,使之能提供以下功能:
(1)系统以菜单方式工作
(2)教师信息录入功能--输入
(3)教师信息删除功能
(4)教师信息浏览功能--输出
(5)查询和排序功能:
(至少一种查询方式)--算法
按教师号查询
按职称查询等
三、具体要求
围绕课程设计的目的和意义,基本要求如下:
1、认真阅读《C语言课程设计》指导书,明确课程设计的目的、意义和要求;
2、快速总结C程序设计语言的精髓,如:
函数的概念、函数的设计和函数的调用;
3、快速熟悉TuberC或C++的上机环境。
能熟练进行高级编辑操作(特别是字块操作);熟悉步进式、断点跟踪的程序调试方法,提高工作效率。
4、根据“课程设计题目”,采用结构化的程序设计思想,确定系统的总体设计方案、确"定时间进度。
如果是多人共一题,则要首先完成小组内的人员分工及安排,不允许重题现象。
5.学习并了解良好的程序设计风格。
按质、按量、并按时间完成课程设计的任务。
6.提供可运行的课程设计系统,参加上机面试答辩。
本次课程设计的重点是:
学会设计并编写函数,掌握好各函数之间的调用关系;利用文件操作函数,建立数据库并完成对数据库的各种操作;掌握几种典型算法的应用(如:
冒泡法、选择排序法和折半查找法)。
同时锻炼学生根据题目进行分析、设计、编码、调试程序和书写必要文档的综合处理能力,从实践中学习并体会程序设计的结构化思想和设计方法。
四、进度安排
依照教学计划,课程设计时间为3周。
按照软件工程的思想,软件系统的分析设计至关重要,并要充分重视书写“文档”。
避免甚至杜绝“拿到题目就编码”的现象。
建议将时间分为三个阶段:
第一阶段,根据题目要求,拿出系统的总体设计方案:
即构思各程序模块的算法,并画出相应的N-S图,同时编写相应的文档;
第二阶段,根据N-S图编写程序代码并单独调试,再将调试通过的各个子模块进行集成调试;
第三阶段,归纳文档资料,按要求填写在《课程设计说明书》上,并参加答辩。
三个阶段时间分配的大概比例是:
35:
45:
20。
五、完成后应上交的材料
1.课程设计的题目、系统的总功能和各子模块的功能;
2.题目的设计思想(或算法)简述;
3.主要程序的框图(要求用N-S图);
4.源程序代码(要求在关键的位置有注释,从而增加程序的可读性);
5.课程设计的总结报告,主要包括以下内容:
(1)课程设计中遇到的主要问题和解决方法;
(2)你的创新和得意之处;
(3)设计中存在的不足及改进的设想;
(4)本次课程设计的感想和心得体会。
以上完成的源程序及相关文档,填写在《课程设计说明书》上,要求干净整洁,符合课程设计的要求和规范。
六、总评成绩
指导教师签名日期年月日
系主任审核日期年月日
1.题目设计思想简述·······································5
2.程序的N—S图··········································7
总程序的N—S图·····································7
各子函数的N—S图···································7
···································8
···································8
···································9
···································9
··································10
3.源程序代码·············································11
4.程序运行效果图········································33
登陆界面···········································33
菜单栏·············································33
录入功能···········································34
浏览功能···········································34
删除功能···········································35
查询功能···········································35
排序功能···········································36
5.总结报告··············································37
课程设计中遇到的主要问题和解决方法·················37
你的创新和得意之处·································37
设计中存在的不足及改进的设想·······················37
本次课程设计的感想和心得体会·······················38
1.
题目设计思想简述
如上图所示,该教师信息管理系统主要是一个以动态链表的应用为基础来实现对教师信息的录入,查询,删除等功能。
定义教师结构体如下:
structteacher
{
longnum;um!
=um,teach[i].name,teach[i].sex,teach[i].age,teach[i].edu);
printf("职称:
%s\n月薪:
%ld,住址:
%s,电话:
%s\n",teach[i].title,teach[i].wage,teach[i].addr,teach[i].telep);
i=i+1;
fread(&teach[i],sizeof(structteacher),1,fp);/*从文件中读入数据存储到结构体变量teach【i】中*/
}
um,teach[i].name,teach[i].sex,teach[i].age,teach[i].edu);
printf("职称:
%s\n月薪:
%ld,住址:
%s,电话:
%s\n",teach[i].title,teach[i].wage,teach[i].addr,teach[i].telep);
fclose(fp);
}
elseprintf("该文件中无教师信息\n");//文件为空时输出此处
}
voidcreat()//录入教师信息的函数
{
structteacher*p1,*p2,*p3;
p1=p2=(structteacher*)malloc(LEN);/*申请一个结构体字节数的空间用来存储一个教师的信息*/
printf("请输入一位教师的教师号(结束录入请输入0):
");
scanf("%ld",&p1->num);
if(p1->num!
=0)//判断用户是要结束录入还是要存储信息
if(head==NULL)head=p1;/*判断链表是否为空,是则将链表头指向p1*/
else//链表不为空则将链表尾指向p1
{
p3=head;//p3用来记录链表的尾部
while(p3->next!
=NULL)/*若p3不是链表尾则将p3指向下一个结点*/
p3=p3->next;
p3->next=p1;//将最后一个结点指向p1
}
while(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);
printf("月薪:
");
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;
elsep2->next=p1;
p2=p1;//p2用来记录链表的最后一个结点
p1=(structteacher*)malloc(LEN);//重新申请空间
printf("请输入一位教师的教师号(结束录入请输入0):
");
scanf("%ld",&p1->num);
}
p2->next=NULL;//将最后一个结点指向空
}
voidprint()//输出教师信息的函数
{
structteacher*p;
inti;
p=head;
if(head!
=NULL)//判断链表是否为空
{
printf("\n这%d位教师的信息为:
\n",n);
do
{
printf("教师号:
%ld,姓名:
%s,性别:
%s,年龄:
%d,学历:
%s,职称:
%s\n",p->num,p->name,p->sex,p->age,p->edu,p->title);
printf("月薪:
%ld,住址:
%s,电话:
%s\n",p->wage,p->addr,p->telep);
p=p->next;//将下一个结点的首地址赋给p
}while(p!
=NULL);//到链表尾时结束循环
}
else//链表为空时执行以下部分
{
printf("\n你此次登录系统还没有录入教师信息,可进行以下操作:
\n");
printf("1:
【浏览以前保存在文件中的教师信息】2:
【开始录入教师信息】\n");
printf("3:
【退出系统】4:
【返回菜单】\n");
printf("请选择:
");
scanf("%d",&i);
while((i<1)&&(i>4))
{
printf("选择无效,请重新输入正确选项:
");
scanf("%d",&i);
}
if(i==1)read();//调用从文件读取数据的函数
if(i==2)creat();//调用录入信息的函数
if(i==3)exit(0);//退出系统
}
}
voiddel()//删除教师信息的函数
{
structteacher*p1,*p2;
longi;
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==head)head=p1->next;/*若p1为头结点则将头指针指向p1的下一个结点*/
elsep2->next=p1->next;/*p1非头结点则将p1后面的结点连接到p1前一个结点的后面*/
printf("\n已删除教师号为%ld的教师信息\n",i);
n=n-1;//记录教师数的n要减一
}
//p1不是要删除的信息则表示要删除的信息不再链表中
elseprintf("\n已录入的教师信息中没有教师号为%ld的\n",i);
return;
}
voidsort1()//按教师号进行排序的函数
{
structteacher*p1,*p2,*p3,*p4;
inti,j;
if(head==NULL)
{printf("\n还未录入过教师信息\n");
return;
}
if(head->next!
=NULL)//判断是否只有一个信息
{//用冒泡法排序
p1=head;//p1记录用来比较的两个结点中的前面一个
p2=head->next;//p2记录比较的两个结点中的后面个
for(i=1;i{
for(j=0;j{
if(p1->num>p2->num)/*比较相邻两个结点中教师号大小*/
{//当p1的教师号大时则对调两个结点的位置
if(p1==head)head=p2;
elsep3->next=p2;/*p1为头结点时则将头指针指向p2,否则就将p2连接到用来记录p1前一个结点的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指向链表第二个结点
}
}
printf("\n按教师号排序后的教师信息如下:
\n");
print();//调用教师信息浏览函数
}
voidsort2()//按月薪排序的函数,算法跟按教师号排序的一样
{
structteacher*p1,*p2,*p3,*p4;
inti,j;
if(head==NULL)
{
printf("\n还未录入过教师信息\n");
return;
}
if(head->next!
=NULL)
{
p1=head;
p2=head->next;
for(i=1;i{
for(j=0;j{
if(p1->wage>p2->wage)
{
if(p1==head)head=p2;
elsep3->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按月薪排序后的教师信息如下:
\n");
print();
}
voidsort3()//按年龄排序的函数,算法跟按教师号排序的一样
{
structteacher*p1,*p2,*p3,*p4;
inti,j;
if(head==NULL)
{
printf("\n还未录入过教师信息\n");
return;
}
if(head->next!
=NULL)
{
p1=head;
p2=head->next;
for(i=1;i{
for(j=0;j{
if(p1->age>p2->age)
{
if(p1==head)head=p2;
elsep3->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按年龄排序后的教师信息如下:
\n");
print();
}
voidchoose1()//选择排序方式的函数
{
inti;
printf("排序方式\n");
printf("1:
【按教师号排序】2:
【按年龄排序】\n");
printf("3:
【按月薪排序】\n");
printf("请选择:
");
scanf("%d",&i);
while((i<1)||(i>3))
{
printf("选择无效,请重新输入正确选项:
");
scanf("%d",&i);
}
switch(i)
{
case1:
sort1();break;
case2:
sort3();break;
case3:
sort2();break;
}
}
voidsearch1()//按教师号查找的函数
{
structteacher*p;
longi;//存储用户输入的想要删除的教师号
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)
{
printf("教师号:
%ld,姓名:
%s,性别:
%s,年龄:
%d,学历:
%s,职称:
%s\n",p->num,p->name,p->sex,p->age,p->edu,p->title);
printf("月薪:
%ld,住址:
%s,电话:
%s\n",p->wage,p->addr,p->telep);
return;
}
printf("已录入的教师信息中不存在该教师号\n");
}
voidsearch2()//按姓名查找的函数
{
structteacher*p;
chari[20];//记录用户输入的想要删除的姓名
intj=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的是否一致,是则输出
{
printf("教师号:
%ld,姓名:
%s,性别:
%s,年龄:
%d,学历:
%s,职称:
%s\n",p->num,p->name,p->sex,p->age,p->edu,p->title);
printf("月薪:
%ld,住址:
%s,电话:
%s\n",p->wage,p->addr,p->telep);
j=j+1;//每输出一个教师的信息则j加一
}
if(j==0)printf("已录入的教师信息中不存在该姓名的教师\n");
}
voidsearch3()//按职称查找的函数,算法与按姓名查找的一样
{
structteacher*p;
chari[20];
intj=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,职称:
%s\n",p->num,p->name,p->sex,p->age,p->edu,p->title);
printf("月薪:
%ld,住址:
%s,电话:
%s\n",p->wage,p->addr,p->telep);
j=j+1;
}
if(j==0)printf("已录入的教师信息中不存在该职称的教师\n");
}
voidsearch4()//按年龄查找的函数,算法与按教师号查找的一样
{
structteacher*p;
inti,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,姓名:
%s,性别:
%s,年龄:
%d,学历:
%s,职称:
%s\n",p->num,p->name,p->sex,p->age,p->edu,p->title);
printf("月薪:
%ld,住址:
%s,电话:
%s\n",p->wage,p->addr,p->telep);
j=j+1;
}
if(j==0)printf("已录入的教师信息中不存在该年龄的教师\n");
}
voidchoose2()//选择查找方式的函数
{
inti;
printf("查