教师信息管理系统实验报告书
一、需求分析
1.项目目的与背景分析
目的:教师档案管理信息管理是高等院校师资队伍建设工作的一个重要内容, 它具有信息量大、操作繁琐等特点。随着现代化高校建设的快速发展,档案管理工作量日益增加,传统的手工操作方式无论从质量还是速度上都难以满足新的工作需要。教师信息管理系统,实现对教师档案数据的一系列处理,把办公人员从繁杂的事务性工作中解脱出来,使教师管理工作能实现自动化、信息资源化和管理科学化。
背景:随着学校规模的扩大与政府人才流动机制的变化,学校教师的人数逐渐增加,而其流动率也在逐年增加,以往的手工管理教师信息的方式变得力不从心,已经不能满足学校对教师信息管理的要求。教师的信息管理是学校工作中的一项重要内容,鉴于教师信息管理的自动化和效率一直不高和办学规模的扩大和招教人数的增加,建立一个高效的教师信息管理系统是非常必要的。为加快信息化建设以提高教师工作效率及管理效率为其开发一套教师信息管理系统。
2.问题描述
教师信息包括:职工号、姓名、职称、性别、2门主讲课程(课程名称、开课学期、课程性质(必修或选修)),教学效果综合评分。
试设计一教师信息管理系统,使之能提供以下功能:
教师信息交互功能
教师信息录入和添加功能
教师信息显示和查询功能
按姓名查询
按课程查询
显示全部教师记录
教师信息修改和删除功能
教师信息保存和读入功能
教师信息排序功能
按职工号排序
按教学效果综合评分
退出系统功能
3.具体目标
首先,教师包括很多相同得属性,我们用结构体方法,并用链表的方法进行存储,便于对这些数据进行大量的删除插入操作。
与用户交互的界面我们用printf语句实现,把我们所有的功能模块都一一列举出来,在由我们的设计师进行美化排版,每一个功能模块对应着一个具体的功能。通过switch语句实现不同功能的选择,不同的功能模块用不同的子函数实现。
教师信息显示功能用链表将所有数据按顺序输出,查询功能只要从表头开始不断往下一个结点读取信跟所要查询的信息作比较,直到匹配成功。并把该节点的信息格式化输出,呈现给用户一个列表的样式的数据。
教师信息录入功能是建立动态单链表来实现。达到能够存储下来所输入的数据
教师信息删除功能是通过查找链表中有该信息的结点后将该结点移出链表,即使该结点前一个结点直接指向该结点后面的结点来达到删除信息的目的。
教师信息排序功能是通过交换结点在链表中的位置来实现的,即使得各结点在链表中的位置便是所要得到的排序该信息应在的位置,这样直接顺序输出链表的信息时就能按所要的排序输出了。
二、总体设计
通过菜单的形式,利用switch函数,将程序要实现的功能分为10个模块进行,然后分别对信息的录入,添加,显示,查询,排序,修改,删除,并将信息写入文件,从文件中读取,最后退出系统。
三、详细设计
1.结构体成员参数的意义:
char course_name[10]; //课程名称
char term[30]; //开课学期
char nature[10]; //课程性质
int employee_number; //教师职工号
char name[10]; //教师姓名
char position[10]; //教师职称
char sex; //教师性别
int score //课程综合评分
2.系统中自定义函数介绍
(1)根据系统框架图中对系统的功能模块划分,系统开发中计划编制如下11个自定义函数和1个main()主函数菜单选项 函数名 函数功能
系统中自定义函数简介
菜单选项 | 函数名 | 函数功能 |
---|---|---|
1 | input( ) | 录入教师信息 |
2 | add( ) | 添加教师信息 |
3 | show( ) | 显示教师信息 |
4 | search ( ) | 查询教师信息 |
5 | search_name( ) | 按教师姓名查询 |
6 | search_course( ) | 按教师课程查询 |
7 | sort( ) | 教师信息排序 |
8 | amend( ) | 教师信息修改 |
9 | del( ) | 教师信息删除 |
10 | preserve() | 保存至文件 |
11 | read( ) | 读取指定文件 |
(2)系统中函数之间的调用关系
3.整体功能分析图
采用交互功能显示主菜单,让用户按照功能序号启用各部分功能,然后完成相应操作。
4.程序分析
在本教师信息管理系统中,交互系统给我们呈现出所有的功能,根据用户的选择,我们进行执行相应的模块,满足用户的需要,完成之后就返回主菜单,如果达成用户所有需求后,选择功能列表里面退出模块,即可退出本程序。
main函数的算法说明如下:教师信息管理系统程序启动后,首先显示系统菜单,根据用户输入的数字,系统要进行两次判断:
当用户输入的菜单号不正确时,能够重新输入,直到输入正确号为止;
判断用户选择了哪个功能模块。
(1)系统算法流程图
(2)主函数代码分析
#include <stdio.h>``
int main()
{
int n;
while (1)
{
printf ("\n********欢迎使用本系统,请根据需要进行操作!********\n");
printf("\n ----------------------------主菜单-------------------------\n\n");
printf("1.教师信息录入功能 2.教师信息添加功能\n");
printf("3.教师信息显示功能 4.教师信息查询功能 \n");
printf("5.教师信息排序功能 6.教师信息修改功能 \n");
printf("7.教师信息删除功能 8.保存至文件功能 \n");
printf("9.读入文件功能 10.退出系统\n");
printf("\n--------------------------------------------------------------------------\n\n");
printf("请用户自主选择功能模块,输入整数1-10:\n");
repeat: scanf("%d", &n);
switch (n)
{
case 1: system("cls"); input(); break; // 教师信息录入
case 2: system("cls"); add(); break; // 教师信息添加
case 3: system("cls"); show(); break; // 教师信息显示
case 4: system("cls"); search(); break; // 教师信息查询
case 5: system("cls"); sort(); break; // 教师信息排序
case 6: system("cls"); amend(); break; // 教师信息修改
case 7: system("cls"); del(); break; // 教师信息删除
case 8: system("cls"); preserve(); break; // 保存至文件
case 9:system("cls"); read(); break; // 读取文件
case 10: printf ("谢谢使用,再见!\n"); exit(0);
default: printf("输入错误,请重新输入!\n"); goto repeat; break;
}
}
return 0;
} }
};
}
四、系统实现和结果测试分析
1、交互功能,系统主菜单显示。
2、录入功能,自定义函数input()。
(1)流程图构建
(2)系统功能介绍
录入功能将教师信息录入到该系统,在性别与课程性质增加容错功能,容错功能中采用了字符比较,采用strcmp进行字符串之间比较,采用goto 返回重新输入直至输入正确,定义char型字符型数据时,避免上一输入回车缓存时,占用char型数据的存储位置。加入了屏幕清空函数,在录入完成后进行了代码优化,可根据提示返回主界面。
(3)参考代码分析
void input()
{
printf("---------教师信息录入功能---------\n\n");
int c;
while (1)
{
printf("第%d个老师的信息\n\n", i + 1);
printf("请输入姓名(输入0结束录入):");
scanf("%s", t[i].name);
if (t[i].name[0] == '0')
break;
printf("请输入性别(M为男性,F为女性):");
repeat1:scanf(" %c", &t[i].sex);
if (t[i].sex != 'M' && t[i].sex != 'F') //性别判断容错,用字符比较
{
printf("输入错误,请重新输入\n");
goto repeat1;
}
printf("请输入职称:");
scanf("%s", t[i].position);
printf("请输入工号:");
scanf("%d", &t[i].employee_number);
printf("请输入第一门课程名称:");
scanf("%s", t[i].course_one.course_name);
printf("请输入第一门课程开课学期(例:2019-2020学年第二学期):");
scanf("%s", t[i].course_one.term);
printf("请输入第一门课程性质(必修或选修):");
repeat2:scanf("%s", t[i].course_one.nature);
if (strcmp(t[i].course_one.nature, "必修") != 0 && strcmp(t[i].course_one.nature, "选修") != 0) //课程性质判断容错,用字符串比较
{
printf("输入错误,请重新输入\n");
goto repeat2;
}
printf("请输入第二门课程名称:");
scanf("%s", t[i].course_two.course_name);
printf("请输入第二门课程开课学期(例:2019-2020学年第二学期):");
scanf("%s", t[i].course_two.term);
printf("请输入第二门课程性质(必修或选修):");
repeat3:scanf("%s", t[i].course_two.nature);
if (strcmp(t[i].course_two.nature, "必修") != 0 && strcmp(t[i].course_two.nature, "选修") != 0)
{
printf("输入错误,请重新输入\n");
goto repeat3;
}
printf("请输入课程综合评分:");
scanf("%lf",&t[i].score);
printf("\n您输入的信息为:");
printf("\n%s %c %s %d %s %s %s %s %s %s %.2f\n\n", t[i].name, t[i].sex, t[i].position, t[i].employee_number, t[i].course_one.course_name, t[i].course_one.term, t[i].course_one.nature, t[i].course_two.course_name, &t[i].course_two.term, t[i].course_two.nature,t[i].score);
printf("----------------------------------\n\n");
i++;
}
printf("\n----------------------------------\n\n");
printf("请选择操作!\n");
printf("\n1.返回主界面\n"); //优化返回
repeat:scanf("%d", &c);
if (c == 1)
{
system("cls");
main();
}
else
{
printf("输入错误,请重新输入!\n");
goto repeat;
}}
(4)运行界面展示
3、添加功能,自定义函数add()。
添加功能,将某一教师信息添加到上一次录入的结尾,从结尾处行继续录入,同样判断是否进行下一信息添加,如果不添加,将添加的总人数合并到教师总人数中,在函数使用过程中应注意变量定义,避免与录入的信息发生信息覆盖,造成录入信息丢失。
4、显示功能,自定义函数show()。
(1)流程图构建
(2)系统功能介绍
显示功能,将所有教师的全部记录显示出来,按照表格样式顺序输出,如果未录入和添加老师的信息则提示“没有数据”,完全显示信息之后,可根据提示返回主菜单。
(3)参考代码分析
void show()
{
printf("\n---------教师信息显示功能---------\n\n");
int c, b;
if (i != 0)
{
printf("\n职工号\t姓名\t性别\t职称\t第一门课程名称\t第一门课程开课学期\t第一门课程性质\t第二门课程名称\t第二门课程开课学期\t第二门课程性质\t课程综合评分 \n");
for (c = 0;c < i;c++)
{
printf("\n%d\t%s\t%c\t%s\t%s\t\t%s\t%s\t\t%s\t\t%s\t%s\t\t%.2f\n", t[c].employee_number, t[c].name, t[c].sex, t[c].position, t[c].course_one.course_name, t[c].course_one.term, t[c].course_one.nature, t[c].course_two.course_name, t[c].course_two.term, t[c].course_two.nature,t[c].score);
}
}
else
{
printf("没有数据\n");
}
printf("\n----------------------------------\n\n");
printf("请选择操作!\n");
printf("\n1.返回主界面\n");
repeat:scanf("%d", &b);
if (b == 1)
{
system("cls");
main();
}
else
{
printf("输入错误,请重新输入!\n");
goto repeat;
}
}
(4)运行界面展示
5、查询功能,自定义函数search ( )。
(1)流程图构建
(2)系统功能介绍
查询功能可以指定内容查询,首先定义一个查询数字,判断有无查询的模块,该功能可以跟据教师姓名跟教师课程进行查询,我们通过自己不同的需求,按照不同的功能进行查询,选择相应的查询方式之后,就跳转相应的查询函数进行查询。可以随意选择查询的条件,系统查询偏于自主化,可以随时查询显示跟返回主界面进行其他操作。
(3)参考代码分析
void search()
{
printf("---------教师信息查询功能---------\n\n");
int t, f;
do
{
printf("请选择操作!\n");
printf("\n1.按姓名查询\n2.按所教课程查询\n3.返回主界面\n");
printf("\n----------------------------------\n\n");
repeat:scanf("%d", &t);
if (t >= 1 && t <= 3) //判断是否有该选择模块
{
f = 1;
break;
}
else
{
f = 0;
printf("您输入有误,请重新选择!\n");
goto repeat;
}
}
while (f == 0);
system("cls");
while (f == 1)
{
switch (t)
{
case 1: // 按教师姓名查询
search_name();
break;
case 2: // 按教师课程查询
search_course();
break;
case 3: // 返回主函数
main();
break;
default:
break;
}
system("cls");
}
}
1) 按姓名查询
void search_name()
{
repeat:system("cls");
printf("---------教师信息按姓名查询---------\n\n");
char name[10];
int a, f;
printf("请输入要查找的姓名:\n");
scanf("%s", name);
for (f = 0;f < i;f++)
if (strcmp(name, t[f].name) == 0)
{
printf("\n已找到此人,其记录为:\n");
printf("\n职工号\t姓名\t性别\t职称\t第一门课程名称\t第一门课程开课学期\t第一门课程性质\t第二门课程名称\t第二门课程开课学期\t第二门课程性质\t课程综合评分 \n");
printf("\n%d\t%s\t%c\t%s\t%s\t\t%s\t%s\t\t%s\t\t%s\t%s\t\t%.2f\n", t[f].employee_number, t[f].name, t[f].sex, t[f].position, t[f].course_one.course_name, t[f].course_one.term, t[f].course_one.nature, t[f].course_two.course_name, t[f].course_two.term, t[f].course_two.nature,t[f].score);
break;
}
if (f == i)
printf("\n对不起,查无此人\n");
printf("\n----------------------------------\n\n");
printf("请选择操作!\n");
printf("\n1.返回选择查询方式\n2.重新输入查询内容\n3.返回主界面\n");
repeat1:scanf("%d", &a);
switch (a)
{
case 1: //返回选择查询方式
system("cls");
search();
break;
case 2: //重新输入查询内容
goto repeat;
break;
case 3: //返回主界面
system("cls");
main();
break;
default:
printf("输入错误,请重新输入!\n");
goto repeat1;
break;
}
}
2) 按课程查询
void search_course()
{
repeat:system("cls");
printf("---------教师信息按课程查询---------\n\n");
char course[10];
int a, f, c=0;
printf("请输入要查找的人所教课程:\n");
scanf("%s", course);
for (f = 0;f < i;f++)
if (strcmp(course, t[f].course_one.course_name) == 0 || strcmp(course, t[f].course_two.course_name) == 0)
{
printf("\n已找到此人,其记录为:\n");
printf("\n职工号\t姓名\t性别\t职称\t第一门课程名称\t第一门课程开课学期\t第一门课程性质\t第二门课程名称\t第二门课程开课学期\t第二门课程性质\t课程综合评分 \n");
break;
}
for (f = 0;f < i;f++)
if (strcmp(course, t[f].course_one.course_name) == 0 || strcmp(course, t[f].course_two.course_name) == 0)
{
printf("\n%d\t%s\t%c\t%s\t%s\t\t%s\t%s\t\t%s\t\t%s\t %s\t\t%.2f\n", t[f].employee_number, t[f].name, t[f].sex, t[f].position, t[f].course_one.course_name, t[f].course_one.term, t[f].course_one.nature, t[f].course_two.course_name, t[f].course_two.term, t[f].course_two.nature, t[f].score);
c = 1;
}
if (c != 1)
printf("\n对不起,查无此人\n");
printf("\n----------------------------------\n\n");
printf("请选择操作!\n");
printf("\n1.返回选择查询方式\n2.重新输入查询内容\n3.返回主界面\n");
repeat1:scanf("%d", &a);
switch (a)
{
case 1: //返回选择查询方式
system("cls");
search();
break;
case 2: //重新输入查询内容
goto repeat;
break;
case 3: //返回主界面
system("cls");
main();
break;
default:
printf("输入错误,请重新输入!\n");
goto repeat1;
break;
}
}
(4)运行界面展示
6、排序功能,自定义函数sort( )。
(1)流程图构建
(2)系统功能介绍
排序功能可以实现对教师信息进行整理,我们提供了按照职工号和按照教学效果综合评分两种情况,我们选择相应的序号,对职工号,我们按照从小到大,教学效果综合评分的排序是从低到高。采用冒泡排序法,对排序的条件进行冒泡输出,从而达到排序的功能。
(3)参考代码分析
void sort()
{
printf("---------教师信息排序系统---------\n\n");
int k, f;
do
{
printf("请选择操作!\n");
printf("\n1.按职工号排序\n2.按教学效果综合评分排序\n3.返回主界面\n");
printf("\n----------------------------------\n\n");
scanf("%d", &k);
if (k >= 1 && k <= 3)
{
f = 1;
break;
}
else
{
f = 0;
printf("您输入有误,请重新选择!");
}
} while (f == 0);system("cls");
while (f == 1)
{
switch (k)
{
case 1: //按职工号排序
sort_employee_number();
break;
case 2: //按教学效果综合评分排序
sort_score();
break;
case 3: //返回主界面
system("cls");
main();
break;
default:
break;
}
system("cls");
}
}
(4)运行界面展示
1)按职工号排序
void order_employee_number()
{
printf("---------教师信息按职工号排序---------\n");
printf("\n按职工号排序为(字母由小到大排列):\n");
int t1, j, k ,a;
for (a = 0;a < i - 1;a++)
for (j = 0;j < i - 1 - a;j++)
if (t[j].employee_number >= t[j + 1].employee_number)
{
t1 = t[j].employee_number;
t[j].employee_number = t[j + 1].employee_number;
t[j + 1].employee_number = t1;
}
printf("\n职工号\t姓名\t性别\t职称\t第一门课程名称\t第一门课程开课学期\t第一门课程性质\t第二门课程名称\t第二门课程开课学期\t第二门课程性质\t课程综合评分 \n");
for (j = 0;j < i;j++)
printf("\n%d\t%s\t%c\t%s\t%s\t\t%s\t%s\t\t%s\t\t%s\t%s\t\t%.2f\n", t[j].employee_number, t[j].name, t[j].sex, t[j].position, t[j].course_one.course_name, t[j].course_one.term, t[j].course_one.nature, t[j].course_two.course_name, t[j].course_two.term, t[j].course_two.nature,t[j].score);
printf("\n----------------------------------\n\n");
printf("请选择操作!\n");
printf("\n1.返回重新选择排序方案\n2.返回主菜单\n");
scanf("%d", &k);
switch (k)
{
case 1:
system("cls");
sort();
break;
case 2:
system("cls");
main();
break;
default:
break;
}
system("cls");
}
2)按课程综合排序系统
void order_score()
{
printf("---------教师信息按课程综合排序系统---------\n");
printf("\n按教学效果综合评分排序为(由低到高排列):\n");
int j, k, a;
double t1;
for (a = 0;a < i - 1;a++)
for (j = 0;j < i - 1 - a;j++)
if (t[j].score >= t[j + 1].score)
{
t1 = t[j].score;
t[j].score = t[j + 1].score;
t[j + 1].score = t1;
}
printf("\n职工号\t姓名\t性别\t职称\t第一门课程名称\t第一门课程开课学期\t第一门课程性质\t第二门课程名称\t第二门课程开课学期\t第二门课程性质\t课程综合评分 \n");
for (j = 0;j < i;j++)
printf("\n%d\t%s\t%c\t%s\t%s\t\t%s\t%s\t\t%s\t\t%s\t%s\t\t%.2f\n", t[j].employee_number, t[j].name, t[j].sex, t[j].position, t[j].course_one.course_name, t[j].course_one.term, t[j].course_one.nature, t[j].course_two.course_name, t[j].course_two.term, t[j].course_two.nature,t[j].score);
printf("\n----------------------------------\n\n");
printf("请选择操作!\n");
printf("\n1.返回重新选择排序方案\n2.返回主菜单\n");
scanf("%d", &k);
switch (k)
{
case 1: //返回重新选择排序方案
system("cls");
sort();
break;
case 2: //返回主菜单
system("cls");
main();
break;
default:
break;
}
system("cls");
}
7、修改功能,自定义函数amend( )。
(1)流程图构建
(2)系统功能介绍
修改功能,可以对已经进行录入的教师信息进行修改,先输入要进行修改的教师名字,然后就呈现出该教师的所有信息,然后在选择教师信息中的一项来进行修改,修改之后进行输出。
(3)参考代码分析
void amend()
{
printf("---------教师信息修改功能---------\n");
int f, n = 0, c = 0;
char name1[10];
printf("\n请输入要修改的职工的姓名:");
scanf("%s", name1);
for (f = 0;f <= i;f++)
{
if (strcmp(t[f].name, name1) == 0)
{
printf("\n已找到此人,原始记录为:\n");
printf("\n职工号\t姓名\t性别\t职称\t第一门课程名称\t第一门课程开课学期\t第一门课程性质\t第二门课程名称\t第二门课程开课学期\t第二门课程性质\t课程综合评分 \n");
printf("\n%d\t%s\t%c\t%s\t%s\t\t%s\t%s\t\t%s\t\t%s\t %s\t\t%.2f\n", t[f].employee_number, t[f].name, t[f].sex, t[f].position, t[f].course_one.course_name, t[f].course_one.term, t[f].course_one.nature, t[f].course_two.course_name, t[f].course_two.term, t[f].course_two.nature,t[f].score);
printf("\n----------------------------------\n\n");
printf("请选择操作!\n");
printf("\n1.确实要修改此人信息\n2.不修改\n");
scanf("%d", &n);
break;
}
else
{
printf("\n对不起,查无此人!\n");
printf("\n----------------------------------\n\n");
printf("请选择操作!\n");
printf("\n1.返回重新输入\n2.返回主菜单\n");
scanf("%d", &n);
switch (n)
{
case 1:
system("cls");
amend();
break;
case 2:
system("cls");
main();
break;
default:
break;
}
}
}
if (n == 1)
{
printf("\n----------------------------------\n\n");
printf("\n需要进行修改的选项\n\n1.职工号\n2.姓名\n3.性别\n4.职称\n5.第一门课程名称\n6.第一门课程开课学期\n7.第一门课程性质\n8.第二们课程名称\n9.第二门课程开课学期\n10.第二门课程性质\n11.课程综合评分\n\n");
printf("请输入你想修改的那一项序号:\n");
scanf("%d", &c);
if (c > 11 || c < 1)
printf("\n选择错误,请重新选择!\n");
}
if (n == 2)
{
printf("已取消修改!\n");
printf("\n----------------------------------\n\n");
printf("请选择操作!\n");
printf("\n1.返回重新输入\n2.返回主菜单\n");
scanf("%d", &n);
switch (n)
{
case 1:
system("cls");
amend();
break;
case 2:
system("cls");
main();
break;
default:
break;
}
}
switch (c)
{
case 1:
printf("\n职工号改为: ");
scanf("%d", &t[f].employee_number);
break;
case 2:
printf("姓名改为:");
scanf("%s", t[f].name);
break;
case 3:
printf("性别改为:");
repeat1:scanf("%c", &t[f].sex);
if (t[i].sex != 'M' && t[i].sex != 'F')
{
printf("输入错误,请重新输入\n");
goto repeat1;
}
break;
case 4:
printf("职称改为:");
scanf("%s", t[f].position);
break;
case 5:
printf("第一门课程名称改为:");
scanf("%s", t[f].course_one.course_name);
break;
case 6:
printf("第一门课程开课学期改为:");
scanf("%s", t[f].course_one.term);
break;
case 7:
printf("第一门课程性质改为:");
repeat2:scanf("%s", t[f].course_one.nature);
if (strcmp(t[f].course_one.nature, "必修") != 0 && strcmp(t[f].course_one.nature, "选修") != 0)
{
printf("输入错误,请重新输入\n");
goto repeat2;
}
break;
case 8:
printf("第二门课程名称改为:");
scanf("%s", t[f].course_two.course_name);
break;
case 9:
printf("第二门课程开课学期改为:");
scanf("%s", t[f].course_two.term);
break;
case 10:
printf("第二门课程性质改为:");
repeat3:scanf("%s", t[f].course_two.nature);
if (strcmp(t[f].course_two.nature, "必修") != 0 && strcmp(t[f].course_two.nature, "选修") != 0)
{
printf("输入错误,请重新输入\n");
goto repeat3;
}
break;
case 11:
printf("课程综合评分改为:");
scanf("%lf",&t[f].score);
}
printf("\n----------------------------------\n\n");
printf("\n您修改之后得信息为:\n");
printf("\n职工号\t姓名\t性别\t职称\t第一门课程名称\t第一门课程开课学期\t第一门课程性质\t第二门课程名称\t第二门课程开课学期\t第二门课程性质\t课程综合评分 \n");
printf("\n%d\t%s\t%c\t%s\t%s\t\t%s\t%s\t\t%s\t\t%s\t %s\t\t%.2f\n", t[f].employee_number, t[f].name, t[f].sex, t[f].position, t[f].course_one.course_name, t[f].course_one.term, t[f].course_one.nature, t[f].course_two.course_name, t[f].course_two.term, t[f].course_two.nature,t[f].score);
printf("\n----------------------------------\n\n");
printf("请选择操作!\n");
printf("\n1.返回重新输入\n2.返回主菜单\n");
scanf("%d", &n);
switch (n)
{
case 1:
system("cls");
amend();
break;
case 2:
system("cls");
main();
break;
default:
break;
}
}
(4)运行界面展示
8、删除功能,自定义函数 del( )。
(1)流程图构建
(2)系统功能介绍
删除功能查找某一姓名,职工号存在判断是否确定删除,不存在直接结束。
(3)参考代码分析
void del()
{
printf("---------教师信息删除系统---------\n\n");
int f, a, j, k=1, b;
char name[10];
printf("请输入要查找的姓名:\n");
scanf("%s", name);
for (f = 0;f < i;f++)
{
if (strcmp(name, t[f].name) == 0)
{
printf("\n已找到此人,其记录为:\n");
printf("\n职工号\t姓名\t性别\t职称\t第一门课程名称\t第一门课程开课学期\t第一门课程性质\t第二门课程名称\t第二门课程开课学期\t第二门课程性质\t课程综合评分 \n");
printf("\n%d\t%s\t%c\t%s\t%s\t\t%s\t%s\t\t%s\t\t%s\t %s\t\t%.2f\n", t[f].employee_number, t[f].name, t[f].sex, t[f].position, t[f].course_one.course_name, t[f].course_one.term, t[f].course_one.nature, t[f].course_two.course_name, t[f].course_two.term, t[f].course_two.nature,t[f].score);
break;
}
}
if (f == i)
{
printf("\n对不起,查无此人!\n");
printf("\n----------------------------------\n\n");
printf("请选择操作!\n");
printf("\n1.继续删除,2.返回主界面\n");
repeat3:scanf("%d", &b);
switch (b)
{
case 1:
system("cls");
del();
break;
case 2:
system("cls");
main();
break;
default:
printf("输入错误,请重新输入!\n");
goto repeat3;
break;
}
}
printf("\n----------------------------------\n\n");
printf("请选择操作!\n");
printf("\n1.确实要删除此人信息\n2.不删除\n");
scanf("%d", &a);
if (a == 1)
{
for (j = f;j < i - 1;j++)
{
t[j] = t[j + 1];
}
k = 0;
}
else
{
printf("以取消删除!\n");
printf("\n----------------------------------\n\n");
printf("请选择操作!\n");
printf("\n1.继续删除,2.返回主界面\n");
repeat1:scanf("%d", &b);
switch (b)
{
case 1:
system("cls");
del();
break;
case 2:
system("cls");
main();
break;
default:
printf("输入错误,请重新输入!\n");
goto repeat1;
break;
}
}
if (!k)
{
printf("该成员信息已删除!\n");
i = i - 1;
printf("\n----------------------------------\n\n");
printf("请选择操作!\n");
printf("\n1.继续删除,2.返回主界面\n");
repeat2:scanf("%d", &b);
switch (b)
{
case 1:
system("cls");
del();
break;
case 2:
system("cls");
main();
break;
default:
printf("输入错误,请重新输入!\n");
goto repeat2;
break;
}
}
}
(4)运行界面展示
9、保存至文件功能,自定义函数preserve( )。
(1)流程图构建
(2)系统功能介绍
保存至文件功能,将教师信息保存至文件中。
(3)参考代码分析
void preserve()
{
int b;
printf("---------教师信息保存系统---------\n\n");
FILE* fp;
char fname[20];
int p;
printf("请输入要保存的文件名:");
scanf("%s", fname);
strcat(fname, ".txt");
if ((fp = fopen(fname, "w")) == NULL)
{
printf("不能打开文件,文件保存失败!\n");
return;
}
fprintf(fp, "\n职工号\t姓名\t性别\t职称\t第一门课程名称\t第一门课程开课学期\t\t第一门课程性质\t第二门课程名称\t第二门课程开课学期\t\t第二门课程性质\t课程综合评分 \n");
for (p = 0;p < i;p++)
fprintf(fp, "\n%d\t%s\t%c\t%s\t%s\t\t%s\t%s\t\t%s\t\t%s\t%s\t\t%lf\n", t[p].employee_number, t[p].name, t[p].sex, t[p].position, t[p].course_one.course_name, t[p].course_one.term, t[p].course_one.nature, t[p].course_two.course_name, t[p].course_two.term, t[p].course_two.nature, t[p].score);
printf("文件保存成功!\n");
fclose(fp);
printf("\n----------------------------------\n\n");
printf("请选择操作!\n");
printf("\n1.返回主界面\n2.退出系统\n");
repeat:scanf("%d", &b);
switch (b)
{
case 1:
system("cls");
main();
break;
case 2:
exit(0);
default:
printf("输入错误,请重新输入!\n");
goto repeat;
}
}
10、读取文件功能,自定义函数read( )。
(1)流程图构建
(2)系统功能介绍
读取功能,将文件读入到该系统中,可以读取指定文件内的教师数据,保存到内存中,这里要注意格式要一致,使用指针的学习内容,这里的fscanf要特别注意一下取地址符。
(3)参考代码分析
void read()
{
int b;
FILE* fp;
char fname[10];
int a = 0, flag;
printf("请输入文件名(如:stu.txt):");
scanf("%s", fname);
if ((fp = fopen(fname, "r")) == NULL)
{
printf("不能打开文件,文件读取失败!\n");
return;
}
fscanf(fp, "\n职工号\t姓名\t性别\t职称\t第一门课程名称\t第一门课程开课学期\t\t第一门课程性质\t第二门课程名称\t第二门课程开课学期\t\t第二门课程性质\t课程综合评分 \n");
while (1)
{
flag = fscanf(fp, "\n%d\t%s\t%c\t%s\t%s\t\t%s\t%s\t\t%s\t\t%s\t %s\t\t%lf\n", &t[a].employee_number, t[a].name, &t[a].sex, t[a].position, t[a].course_one.course_name, t[a].course_one.term, t[a].course_one.nature, t[a].course_two.course_name, t[a].course_two.term, t[a].course_two.nature, &t[a].score);
if (flag == EOF)
break;
a++;
}
i = a;
printf("从文件中成功读取%d条记录\n", a);
fclose(fp);
printf("\n----------------------------------\n\n");
printf("请选择操作!\n");
printf("\n1.返回主界面\n2.退出系统\n");
repeat:scanf("%d", &b);
switch (b)
{
case 1:
system("cls");
main();
break;
case 2:
exit(0);
default:
printf("输入错误,请重新输入!\n");
goto repeat;
}
}
想必看到这已经累了,教师信息管理系统的分享就到这了,这是C语言的课程实训所写的内容,还有很多不足,还希望多多指正呀。