教师信息管理系统

发布时间:2020-04-03 22:05:14   来源:文档文库   
字号:

课程设计任务书

计算机科学与技术 专业 年级

一、 设计题目

教师信息管理系统设计

二、 主要内容

教师信息包括教师号、姓名、性别、年龄、学历、职称、工资、住址、电话等(教师号不重复)。试设计一教师信息管理系统,使之能提供以下功能:

(1)系统以菜单方式工作

(2)教师信息录入功能--输入

(3)教师信息删除功能

(4)教师信息浏览功能 --输出

(5)查询和排序功能:(至少一种查询方式) --算法

按教师号查询

按职称查询等

三、 具体要求

围绕课程设计的目的和意义,基本要求如下:

1、认真阅读《C语言课程设计》指导书,明确课程设计的目的、意义和要求;

2、快速总结C程序设计语言的精髓,如:函数的概念、函数的设计和函数的调用;

3、快速熟悉Tuber C 或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.题目设计思想简述

如上图所示,该教师信息管理系统主要是一个以动态链表的应用为基础来实现对教师信息的录入,查询,删除等功能。

定义教师结构体如下:

struct teacher

{

long num;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(struct teacher),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);

}

else 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 //链表不为空则将链表尾指向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;

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

{

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);//退出系统

}

}

void del()//删除教师信息的函数

{

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==head) 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(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;

else p3->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();//调用教师信息浏览函数

}

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;i

{

for(j=0;j

{

if(p1->wage>p2->wage)

{

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按月薪排序后的教师信息如下:\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;i

{

for(j=0;j

{

if(p1->age>p2->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按年龄排序后的教师信息如下:\n");

print();

}

void choose1()//选择排序方式的函数

{

int i;

printf(" 排序方式\n");

printf(" 1:【按教师号排序】 2:【按年龄排序】\n");

printf(" 3:【按月薪排序】\n");

printf("请选择:");

scanf("%d",&i);

while((i<1)||(i>3))

{

printf("选择无效,请重新输入正确选项:");

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==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");

}

void search2()//按姓名查找的函数

{

struct teacher *p;

char i[20];//记录用户输入的想要删除的姓名

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的是否一致,是则输出

{

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");

}

void search3()//按职称查找的函数,算法与按姓名查找的一样

{

struct teacher *p;

char i[20];

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,职称:%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");

}

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,姓名:%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");

}

void choose2()//选择查找方式的函数

{

int i;

printf(" 查询方式\n");

printf(" 1:【按教师号查询】 2:【按姓名查询】\n");

printf(" 3:【按职称查询】 4:【按年龄查询】\n");

printf("请选择:");

scanf("%d",&i);

while((i<1)||(i>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:【教师信息录入】 2:【教师信息输出】\n");

printf(" 3:【教师信息删除】 4:【查询个人信息】\n");

printf(" 5:【排序】 6:【退出系统】\n");

printf("请选择: ");

scanf("%d",&i);

while((i<1)||(i>6))

{

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();

}

2.程序运行效果图

登陆界面

菜单栏

录入功能

浏览功能

删除功能

查询功能

排序功能

3.总结报告

课程设计中遇到的主要问题和解决方法

在这次的C语言课程设计的编程中,由于以前对链表和文件这两部分的内容了解过少,因此在编程中涉及到这两方面的内容时,照成了很大的阻碍,最主要是在对链表的结点进行交换,对文件某些特殊的读写不清楚。而且由于第一次接触这类比较复杂一点的题目,在循环方面的应用有所不足,这也是一个问题。

在遇到这些问题时,对于每一个问题在实在无思路时,我首先会查阅相关的书籍,像文件中末尾读起的方法,在通过查看C语言的书后我才知道原来有专门的库函数可以用;在查阅完书籍确定该了解的基本内容已了解之后,自己再重新思考算法,然后不断的在VC++中调试,根据它的提示修正错误,直到编译无错且运行的结果正确为止。

你的创新和得意之处

这个教师信息管理系统不仅按要求可以让用户自己选择要实现录入,浏览,查找,删除,排序中的任一种功能,而且在退出系统时为用户提供能是否要保存该次的信息到文件中的选择。且在浏览中当检查到用户该次登录还未录入过信息时,提供了是否要查看以前保存的文件的功能。

设计中存在的不足及改进的设想

在设计过程中,由于对C语言的理解不够透彻,特别是链表和文件方面边查书边调试才写出来的,所以导致程序在一定程度上的不严密,例如浏览其他文件的信息只有在检测到该次登录还未录入过信息时才会提供用户选择之类的。当然,最主要的原因是由于第一次接触这种较复杂点的题目,在算法的设计上不好,才导致程序过于冗长不严谨的。程序在查找和排序时其实可以不用每种方式都写一个函数的,这样程序就不会显得过于冗长。而且系统提供功能选择方面也可以再调整的更完善。

本次课程设计的感想和心得体会

从拿到题目到完成的三周时间里,我了解到了原来在C语言的方面的应用我所存在的不足,更掌握了很多之前不懂的知识。在此次的课程设计中,刚接触到题目时我就发觉了一个被我遗忘了的严重问题,那就是编程的能力只有通过不断敲写代码才能保持和提高的。由于过长时间没有写过代码的缘故,在拿到以前已经编过的简单题目时我也得查找书籍才最终编写完成,这重新提醒了我在编程方面实践的重要。

由于第一次拿到设计一个系统这样比较复杂的题目,尽管最后设计出来的系统很简单,当中间我所遇到的问题还是很多,甚至比学C语言时做过的所有题目遇到的还多。因此在编程时我几乎又把C语言的整本书重新看了一遍,有了更深刻的认识。另外,在这次的编写中,我了解到了以前所未了解的一个很重要的地方,就是设计算法的能力。因为以前所接触的题目都比较简单,所以没有专门想过设计算法,跟没有意识到其重要性,这次的题目让我明白了要编写出一个好的程序,设计一个好的算法是非常必要的。由于开始我在设计算法方面的意识不足,导致这次写出来的代码很累赘很繁琐,这时非常不好的。另外,我发现细节的注意不管是多熟悉编程了都很必要的,即使到最后快完成的时候我也会犯下缺函数的括号,语句缺冒号之类的小错误。

虽然这次完成题目的结果不太好,但能够自己独立完成还是带给了我很大的喜悦。这次课程设计使我意识到自己的多处不足,让我有机会去改进,为以后的编程之路打好基础,以后我还会自己多些找题目来实践,以提高我的能力。

本文来源:https://www.2haoxitong.net/k/doc/a5a1b388842458fb770bf78a6529647d2628346a.html

《教师信息管理系统.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式