教师信息管理系统(C语言课程
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
)
课程设计任务书
计算机科学与技术 专业 2010 年级 一 班 陈金利
一、 设计题目
教师信息管理系统设计
二、 主要内容
教师信息包括教师号、姓名、性别、年龄、学历、职称、工资、住址、电话等(教师号不重复)。试设计一教师信息管理系统,使之能提供以下功能:
(1)系统以菜单方式工作
(2)教师信息录入功能,,输入
)教师信息删除功能 (3
(4)教师信息浏览功能 ,,输出
(5)查询和排序功能:(至少一种查询方式) ,,算法
按教师号查询
按职称查询等
三、 具体要求
围绕课程设计的目的和意义,基本要求如下:
1、认真阅读《C语言课程设计》指导书,明确课程设计的目的、意义和要求;
2、快速总结C程序设计语言的精髓,如:函数的概念、函数的设计和函数的调用;
1
3、快速熟悉Tuber C 或C++的上机环境。能熟练进行高级编辑操作(特别是字块操作);熟悉步进式、断点跟踪的程序调试方法,提高工作效率。
4、根据“课程设计题目”,采用结构化的程序设计思想,确定系统的总体设计
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
、确"定时间进度。如果是多人共一题,则要首先完成小组内的人员分工及安排,不允许重题现象。
5(学习并了解良好的程序设计风格。按质、按量、并按时间完成课程设计的任务。
6(提供可运行的课程设计系统,参加上机面试答辩。
本次课程设计的重点是:学会设计并编写函数,掌握好各函数之间的调用关系;利用文件操作函数,建立数据库并完成对数据库的各种操作;掌握几种典型算法的应用(如:冒泡法、选择排序法和折半查找法)。同时锻炼学生根据题目进行分析、设计、编码、调试程序和书写必要文档的综合处理能力,从实践中学习并体会程序设计的结构化思想和设计方法。
四、 进度安排
依照教学
计划
项目进度计划表范例计划下载计划下载计划下载课程教学计划下载
,课程设计时间为3周。按照软件工程的思想,软件系统的分析设计至关重要,并要充分重视书写“文档”。避免甚至杜绝“拿到题目就编码”的现象。建议将时间分为三个阶段:
第一阶段,根据题目要求,拿出系统的总体设计方案:即构思各程序模块的算法,并画出相应的N-S图,同时编写相应的文档;
第二阶段,根据N-S图编写程序代码并单独调试,再将调试通过的各个子模块进行集成调试;
第三阶段,归纳文档资料,按要求填写在《课程设计说明书》上,并参加答辩。
2
三个阶段时间分配的大概比例是: 35:45:20。 五、 完成后应上交的材料
1(课程设计的题目、系统的总功能和各子模块的功能;
2(题目的设计思想(或算法)简述;
(主要程序的框图(要求用N-S图); 3
4(源程序代码(要求在关键的位置有注释,从而增加程序的可读性);
5(课程设计的总结报告,主要包括以下内容:
(1)课程设计中遇到的主要问题和解决方法;
(2)你的创新和得意之处;
3)设计中存在的不足及改进的设想; (
(4)本次课程设计的感想和
心得体会
决胜全面小康心得体会学党史心得下载党史学习心得下载军训心得免费下载党史学习心得下载
。
以上完成的源程序及相关文档,填写在《课程设计说明书》上,要求干净整洁,符合课程设计的要求和规范。
六、 总评成绩
指导教师 签名日期 年 月 日
系 主 任 审核日期 年 月 日
3
目录
工贸企业有限空间作业目录特种设备作业人员作业种类与目录特种设备作业人员目录1类医疗器械目录高值医用耗材参考目录
一(题目设计思想简述???????????????????????????????????????5 二(程序的N—S图??????????????????????????????????????????7
2.1总程序的N—S图?????????????????????????????????????7
2.2各子函数的N—S图???????????????????????????????????7
2.2.1教师信息录入函数???????????????????????????????????8
2.2.2教师信息浏览函数???????????????????????????????????8
2.2.3教师信息删除函数???????????????????????????????????9
2.2.4教师信息查询函数???????????????????????????????????9
2.2.5教师信息排序函数??????????????????????????????????10 三(源程序代码?????????????????????????????????????????????11 四(程序运行效果图????????????????????????????????????????33
4.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你的创新和得意之处?????????????????????????????????37
5.3设计中存在的不足及改进的设想???????????????????????37
5.4本次课程设计的感想和心得体会???????????????????????38
4
一(题目设计思想简述
主函数
菜单栏函数 识别口令的函数
录入查询删除浏览教师退 教师教师教师教师信息出 信息信息信息信息排序系 的函的函的函的函的函统 数 数 数 数 数 如上图所示,该教师信息管理系统主要是一个以动态链表的应用为基础来实现对教师信息的录入,查询,删除等功能。 定义教师结构体如下:
struct teacher
{
long num;//教师号
char name[20];//姓名
char sex[5];//性别
int age;//年龄
char edu[20];//学历
char title[20];//职称
long wage;//工资
char addr[100]; //地址
char telep[15];//电话
struct teacher *next;
5
}*head=NULL;
主函数只进行口令函数和菜单栏函数的调用,主要工作通过菜单函数实现。
口令为123456。
菜单栏函数通过用switch语句实现不同功能的选择,不同的功能用不同的子函数实现。
录入教师信息通过建立动态单链表来实现。
浏览教师信息则通过将链表所有数据顺序输出来实现。
查询功能只要从链表头开始不断往下一个结点读取信息跟所要查 找的信息比较,直到读取到的信息跟所要查找的信息相同或链表尾为止,并把此结点的信息输出。
删除教师信息的函数是通过查找链表中有该信息的结点后将该结点移出链表,即使该结点前一个结点直接指向该结点后面的结点来达到删除信息的目的。
排序函数是通过交换结点在链表中的位置来实现的,即使得各结点在链表中的位置便是所要得到的排序该信息应在的位置,这样直接顺序输出链表的信息时就能按所要的排序输出了。
6
二(程序的N—S图
2.1总程序的N—S图
i=0
当i<3
输入口令a
a=123456? F T
假 退出循环 i=i+1
T i=3? F
口令输入所选择的功能b 3次 当b<1或b>6 输入 错误 重新输入所要选择的功能b
, T b=1, F 退出
教师T b=2, F 系统
信息教师T b=3, F 录入信息教师T b=4, F 功 能 浏览 信息教师T b=5? F 功 能 删除信息 教师退出系功 能 查询 信息统 功 能 排序
功 能
说明:各功能都是通过调用子函数来实现的。
2.2各子函数的N—S图
子函数主要包括教师信息录入,教师信息浏览,教师信息删除,教师信息查询和教师信息排序等5个。在退出系统时调用了一个保存信息到文件中的函数,该函数只是简单的应用了文件的读写功能,在
7
此不写出其N—S图。
2.2.1教师信息录入函数
p1=(struct teacher *)malloc(LEN)
输入一个教师号p1->num
T 教师号为0, F
T 链表头为空, F
Headp3=head
=p1 当p3->next不为空
p3=p3->next
p3->next=p1
当教师号不为0
输入教师的姓名,性别,年龄,学历,职称,月薪,住址,
电话
n=n+1
n T 第一个录入, F
head=p1 p2->next=p1
p2=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教师信息浏览函数
8
p=head
T 链表头为空, F
显示“还输出p所指向的位置中的教师的所有信息
未录入 p=p->next 过信息”
直到p为空
说明:实际程序中在链表头为空是提供了可以浏览之前保存在文件中的信息的功能,当选择该功能时就调用了一个读取文件的函数。该函数只是对文件读写的简单应用,详细请看后面第三部分代码,这里不写出其N-S图。
2.2.3教师信息删除的函数
T 链表头为空, F
输出输入要删除教师信息的教师号i
“ 还p1=head 未 录
入 过 当i!=p1->num
教 师T p1->next为空, F 信 息”
退出p2=p1
循环 p1=p1->next
T i!=p1->num? F
输出“已录入T p1为链表头, F
的教师信息 head=p1->next p2->next=p1->next 中没有该教
师号” n=n-1
2.2.4教师信息查询的函数
在查询方面程序为用户提供了4种不同方式的查询,每一种方式的查询为一个子函数,此时也是采用一个菜单栏函数进行选择查询方式并调用该种方式的函数。菜单栏函数跟主程序菜单栏的算法一样,
9
此处只给出查询函数的N—S图。
j=0
T 链表头为空, F
输出“还未录入程序”并退出函数
输入要查找的教师信息的对应方法的对应数据i
p=head
当p非空时
T i跟p中对应信息不等, F
输出p所指向的位置的教师的所有信息
j=j+1
p=p->next
T j不为0, F
输出“已录入的信息中不存在符合i的信息的教师
说明:该N—S图是对应姓名,教师号,职称,年龄四种查找方式的函数的。当选择教师号查找时,输入i的即为教师号,与i做比较的为p中的教师号,选择其他查找方式时类似。
2.2.5教师信息排序函数
排序也跟查询一样给出多种排序方式并采用菜单栏函数,此处也只给出排序函数的N—S图。
T 链表头不为空, F
输出“还未录入过教师信息”并退出函数
T 第二个结点为空, F
p1=head
p2=head->next
10
i=1
当i小于n时
j=0
当j小于n-i时
p1中的对应信息小过p2的,
T F
p3=p1 T p1为链表头, F
head=p2 p3->next=p2
p1=p2 p4=p2->next
p2->next=p1
p1->next=p4 p2=p2-
>next p3=p2
p2=p4
p1=head
p2=p1->next
调用教师信息浏览函数
说明:p1,p2指向的结点用来比较,p3,p4是用来记录结点的,当选用的排序方式不同,p1,p2用来比较的信息为所选方式的信息。
11
三(源程序代码
#include
#include #include #include #define LEN sizeof(struct teacher)//宏定义结构体字节数
int n=0;
struct teacher//定义结构体
{
long num;//教师号
char name[20];//姓名
char sex[5];//性别
int age;//年龄
char edu[20];//学历
char title[20];//职称
long wage;//工资
char addr[100];//地址
char telep[15];//电话
struct teacher *next;//指向下一个结点 }*head=NULL;
void key()//口令检查的函数
{
int i;
long a;
for(i=0;i<3;i++)
12
{
printf("请输入口令(还可输入%d次):\n",3-i);
scanf("%ld",&a);
if(a==123456)//检查口令是否正确
{
printf("欢迎进入系统\n");
break;
}
else printf("口令错误\n");
}
if(i==3)//判断可以输入口令的次数是否用完
{
printf("可使用的口令输入次数已用完,将自动退出~\n");
exit(0);
}
}
void save()//把数据存入文件的函数
{
FILE *fp;
int i;
char filename[20];
struct teacher *p;
printf("\n 是否把此次登录系统录入和修改后的教师信
息保存到文件中\n");
printf(" 1:【是】
13
0:【否】\n请选择:");
scanf("%d",&i);
while((i!=0)&&(i!=1))//判断输入的选择是否有效
{
printf("选择无效,请重新输入正确选项:");
scanf("%d",&i);
}
if(i==1)//判断是否选择了要保存
{
printf("\n请输入要保存数据的文件名:");
scanf("%s",filename);
if((fp=fopen(filename,"wb"))==NULL)
{
printf("\n无法打开文件\n");
exit(0);
}
for(p=head;p!=NULL;p=p->next)
if(fwrite(p,sizeof(struct teacher),1,fp)!=1)
printf("\n此处数据有误\n");
fclose(fp);
}
exit(0);
}
void read()//从文件读出数据的函数
{
14
struct teacher teach[299],temp;
int i=0;
FILE *fp;
char filename[20];
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);//将位置指针移到文件的开头
if(fread(&teach[i],sizeof(struct teacher),1,fp)==1)/*判断文件开头读入的数据是否为空*/
{
printf("\n存有的教师信息如下:\n");
while(teach[i].num!=temp.num)//进行循环读取文件
{
printf("教师号:%ld,姓名:%s,性别:%s,年龄:%d,学历:%s,",teach[i].num,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);
15
i=i+1;
fread(&teach[i],sizeof(struct teacher),1,fp);/*从文件中读入数据存储到结构体变量teach【i】中*/
}
输出文件中的最后一个信息 //
printf("教师号:%ld,姓名:%s,性别:%s,年龄:%d,学历:%s,",teach[i].num,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
{
16
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);
17
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,电
18
话:%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()//删除教师信息的函数
19
{
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要减一
20
}
//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;inum>p2->num)/*比较相邻两个结点中教师
号大小*/
{//当p1的教师号大时则对调两个结点的位置
if(p1==head) head=p2;
21
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()//按月薪排序的函数,算法跟按教师号排序的一样 {
22
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;iwage>p2->wage)
{
if(p1==head) head=p2;
else p3->next=p2;
p4=p2->next;
p2->next=p1;
p1->next=p4;
p3=p2;
p2=p4;
}
23
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)
{
24
p1=head;
p2=head->next;
for(i=1;iage>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;
25
}
}
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;
}
26
}
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()//按姓名查找的函数
27
{
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()//按职称查找的函数,算法与按姓名查找的一样 {
28
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)
{
pr:%s,年龄:%d,学intf("教师号:%ld,姓名:%s,性别
历:%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;
29
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:【按职称查询】
30
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:
31
【退出系统】\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();
}
32
四(程序运行效果图
4.1登陆界面
4.2菜单栏
33
4.3录入功能
4.4浏览功能
34
4.5删除功能
4.6查询功能
35
4.7排序功能
36
五(总结报告
5.1课程设计中遇到的主要问题和解决方法
在这次的C语言课程设计的编程中,由于以前对链表和文件这两部分的内容了解过少,因此在编程中涉及到这两方面的内容时,照成了很大的阻碍,最主要是在对链表的结点进行交换,对文件某些特殊的读写不清楚。而且由于第一次接触这类比较复杂一点的题目,在循环方面的应用有所不足,这也是一个问题。
在遇到这些问题时,对于每一个问题在实在无思路时,我首先会查阅相关的书籍,像文件中末尾读起的方法,在通过查看C语言的书后我才知道原来有专门的库函数可以用;在查阅完书籍确定该了解的基本内容已了解之后,自己再重新思考算法,然后不断的在VC++中调试,根据它的提示修正错误,直到编译无错且运行的结果正确为止。
5.2你的创新和得意之处
这个教师信息管理系统不仅按要求可以让用户自己选择要实现录入,浏览,查找,删除,排序中的任一种功能,而且在退出系统时为用户提供能是否要保存该次的信息到文件中的选择。且在浏览中当检查到用户该次登录还未录入过信息时,提供了是否要查看以前保存的文件的功能。
5.3设计中存在的不足及改进的设想
在设计过程中,由于对C语言的理解不够透彻,特别是链表和文件方面边查书边调试才写出来的,所以导致程序在一定程度上的不严密,例如浏览其他文件的信息只有在检测到该次登录还未录入过信息时才会提供用户选择之类的。当然,最主要的原因是由于第一次接触这种较复杂点的题目,在算法的设计上不好,才导致程序过于冗长不严谨的。程序在查找和排序时其实可以不用每种方式都写一个函数的,
37
这样程序就不会显得过于冗长。而且系统提供功能选择方面也可以再调整的更完善。
5.4本次课程设计的感想和心得体会
从拿到题目到完成的三周时间里,我了解到了原来在C语言的方面的应用我所存在的不足,更掌握了很多之前不懂的知识。在此次的课程设计中,刚接触到题目时我就发觉了一个被我遗忘了的严重问题,那就是编程的能力只有通过不断敲写代码才能保持和提高的。由于过长时间没有写过代码的缘故,在拿到以前已经编过的简单题目时我也得查找书籍才最终编写完成,这重新提醒了我在编程方面实践的重要。
由于第一次拿到设计一个系统这样比较复杂的题目,尽管最后设计出来的系统很简单,当中间我所遇到的问题还是很多,甚至比学C语言时做过的所有题目遇到的还多。因此在编程时我几乎又把C语言的整本书重新看了一遍,有了更深刻的认识。另外,在这次的编写中,我了解到了以前所未了解的一个很重要的地方,就是设计算法的能力。因为以前所接触的题目都比较简单,所以没有专门想过设计算法,跟没有意识到其重要性,这次的题目让我明白了要编写出一个好的程序,设计一个好的算法是非常必要的。由于开始我在设计算法方面的意识不足,导致这次写出来的代码很累赘很繁琐,这时非常不好的。另外,我发现细节的注意不管是多熟悉编程了都很必要的,即使到最后快完成的时候我也会犯下缺函数的括号,语句缺冒号之类的小错误。
虽然这次完成题目的结果不太好,但能够自己独立完成还是带给了我很大的喜悦。这次课程设计使我意识到自己的多处不足,让我有机会去改进,为以后的编程之路打好基础,以后我还会自己多些找题目来实践,以提高我的能力。
38