高校教师管理系统
用的C语言写的所以代码有点长
代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define N 1000
#define AN "-----------------------菜单------------------------\n"
#define CC "*****************************************************************************\n"
#define SS "-----------------------------------------------------------------------------\n"
#define KK "*** ***\n"
#define GG "*** 高校教师管理系统 ***\n"
typedef struct data
{
int year;
int month;
int day;
}DATA;
typedef struct teacher
{
char num[20];
char name[10];
char sex[5];
DATA birth;
DATA jobtime; //参加工作时间
int pay; //工资
char college[20]; //学院
char post[10]; //职位
char degree[10]; //学位
}TEA;
void read(TEA a[]);
void menu();
void write(TEA a[]);
void Sort(TEA a[]);
void add(TEA a[]);
void Delete(TEA a[]);
void change(TEA a[]);
void display(TEA a[]);
void Searchbyid(TEA a[]);
void statistics(TEA a[]);
int len=0,q;
int main()
{
TEA tea[N];
read(tea);
FILE *ep;
int select;
//以下输出为宏定义系统标题
printf(CC);
printf(CC);
printf(KK);
printf(KK);
printf(GG);
printf(KK);
printf(KK);
printf(CC);
printf(CC);
printf("请退出系统时务必根据系统提示按0退出系统!!!!\n");
while(1)
{
menu();
printf("请选择服务:");
while(1)
{
q=scanf("%d",&select);
if(q==1) break;
getchar();
printf("输入有误,请重新输入:\n");
}
switch(select)
{
case 1:
add(tea);
break;
case 2:
Delete(tea);
break;
case 3:
display(tea);
break;
case 4:
change(tea);
break;
case 5:
Searchbyid(tea);
break;
case 6:
statistics(tea);
break;
case 0:
if((ep=fopen("计数器.txt","w"))==NULL) //判断文件是否成功打开
{
printf("Failure to open 计数器.txt!\n");
exit(0);
}
fprintf(ep,"%d",len);
fclose(ep);
printf("谢谢使用!!!\n");
printf("如果您在使用方面有什么问题或者建议可以到我们的官网咨询或提一些建议!!!!\n");
exit(0);
default:printf("输入的数据有误,请重新输入\n");
}
}
}
void menu()
{
printf(AN);
printf("***************************************************\n");
printf("\t1.创建添加信息\t|\t2.删除教师信息\n\n");
printf("\t3.显示教师信息\t|\t4.修改教师信息\n\n");
printf("\t5.查询信息\t|\t6.统计数据\n\n");
printf("\t0.退出系统\n\n");
printf("***************************************************\n");
}
void Sort(TEA a[]) //排序
{
int i,j;
TEA t;
for(i=0;i<len-1;i++)
{
for(j=i+1;j<len;j++)
{
if(strcmp(a[i].name,a[j].name)>0)
{
t=a[j];
a[j]=a[i];
a[i]=t;
}
}
}
}
void read(TEA a[])
{
int i;
char ch[100],b[100];
FILE *fp,*ep;
if((fp=fopen("信息.txt","a+"))==NULL) //判断文件是否成功打开
{
printf("Failure to open 信息.txt!\n");
exit(0);
}
if((ep=fopen("计数器.txt","a+"))==NULL) //判断文件是否成功打开
{
printf("Failure to open 计数器.txt!\n");
exit(0);
}
ch[0]=fgetc(ep);
ch[1]='\0';
if(ch[0]==EOF)
{
printf("文件为空\n");
}
else
{
printf("文件不为空\n");
fscanf(ep,"%s",b);
strcat(ch,b);
for(i=0;ch[i]!='\0';i++)
{
len*=10;
len+=ch[i]-48;
}
}
printf("系统已保存教师信息人数:%d\n",len);
for(i=0;i<len;i++)
{
fscanf(fp,"%s",a[i].num);
fscanf(fp,"%s",a[i].name);
fscanf(fp,"%s",a[i].sex);
fscanf(fp,"%d %d %d",&a[i].birth.year,&a[i].birth.month,&a[i].birth.day);
fscanf(fp,"%d %d %d",&a[i].jobtime.year,&a[i].jobtime.month,&a[i].jobtime.day);
fscanf(fp,"%d",&a[i].pay);
fscanf(fp,"%s",a[i].college);
fscanf(fp,"%s",a[i].post);
fscanf(fp,"%s",a[i].degree);
}
fclose(ep);
fclose(fp);
}
void write(TEA a[]) //写入文件
{
int i;
FILE *fp;
if((fp=fopen("信息.txt","w+"))==NULL) //判断文件是否成功打开
{
printf("Failure to open 信息.txt!\n");
exit(0);
}
for(i=0;i<len;i++) //写入文件
{//%8s|%7s|%s|%4d %2d %2d| %4d %2d %2d |%6d|%12s|%6s|%4s\n
fprintf(fp,"%8s\t%7s\t%s\t%4d %2d %2d\t%4d %2d %2d\t%6d\t%12s\t%6s\t%4s\n\n",a[i].num, a[i].name, a[i].sex,a[i].birth.year,a[i].birth.month,a[i].birth.day,a[i].jobtime.year,a[i].jobtime.month,a[i].jobtime.day,a[i].pay,a[i].college,a[i].post,a[i].degree);
}
fclose(fp);
}
void add(TEA a[])
{
int i;
int select=1;
printf("是否进行输入数据 1.是 0.退出:");
while(1)
{
q=scanf("%d",&select);
if(q==1) break;
getchar();
printf("输入有误,请重新输入:\n");
}
for(i=len;1;i++)
{
if(!select)
break;
printf("请输入教师编号:");
getchar();
scanf("%s",a[i].num);
printf("请输入姓名:");
getchar();
gets(a[i].name);
printf("请输入性别:");
scanf("%s",a[i].sex);
printf("请输入出生日期:");
while(1)
{
q=scanf("%d %d %d",&a[i].birth.year,&a[i].birth.month,&a[i].birth.day);
if(q==3) break;
getchar();
printf("输入有误,请重新输入:\n");
}
printf("请输入参加工作时间:");
while(1)
{
q=scanf("%d %d %d",&a[i].jobtime.year,&a[i].jobtime.month,&a[i].jobtime.day);
if(q==3) break;
getchar();
printf("输入有误,请重新输入:\n");
}
printf("请输入工资:");
while(1)
{
q=scanf("%d",&a[i].pay);
if(q==1) break;
getchar();
printf("输入有误,请重新输入:\n");
}
printf("请输入学院:");
scanf("%s",a[i].college);
printf("请输入职称:");
scanf("%s",a[i].post);
printf("请输入学位:");
scanf("%s",a[i].degree);
len++;
printf("是否继续输入数据?0不再输入数据:");
while(1)
{
q=scanf("%d",&select);
if(q==1) break;
getchar();
printf("输入有误,请重新输入:\n");
}
}
Sort(a); //排序
write(a); //写入文件
}
void Delete(TEA a[])
{
char name[10];
int i,h,j,g,k;
while(1)
{
printf("请输入要删除的教师姓名:");
getchar();
gets(name);
k=0;
for (i = 0; i < len; i++)
{
if (strcmp(name,a[i].name)==0)
{
printf(SS);
printf("教师编号| 姓 名 |性 别| 出生日期 |参加工作时间|工 资| 学 院 |职 称|学位\n");
printf(CC);
printf("%8s|%7s|%s|%4d %2d %2d| %4d %2d %2d |%6d|%12s|%6s|%4s\n",
a[i].num, a[i].name, a[i].sex,a[i].birth.year,a[i].birth.month,
a[i].birth.day,a[i].jobtime.year,a[i].jobtime.month,a[i].jobtime.day,
a[i].pay,a[i].college,a[i].post,a[i].degree);
printf(SS);
printf("是否确定要删除该教师的信息如果是按1,否按0:");
while(1)
{
q=scanf("%d",&h);
if(q==1) break;
getchar();
printf("输入有误,请重新输入:\n");
}
if(h)
{
for(j=i+1;j<len;i++,j++)
{
a[i]=a[j];
}
printf("删除成功!\n");
len--;
}
write(a); //写入文件
k++;
}
}
if(!k)
{
printf("该教师信息不存在!!!\n");
}
printf("是否继续进行删除操作(是选1,否选0):");
while(1)
{
q=scanf("%d",&g);
if(q==1) break;
getchar();
printf("输入有误,请重新输入:\n");
}
if(!g)
{
break;
}
}
}
void change(TEA a[])
{
char name[10];
int i,select,g,k;
while(1)
{
printf("请输入要修改的教师姓名:");
getchar();
gets(name);
k=0;
for (i = 0; i < len; i++)
{
if (strcmp(name,a[i].name)==0)
{
printf(SS);
printf("教师编号| 姓 名 |性 别| 出生日期 |参加工作时间|工 资| 学 院 |职 称|学位\n");
printf(CC);
printf("%8s|%7s|%s|%4d %2d %2d| %4d %2d %2d |%6d|%12s|%6s|%4s\n",
a[i].num, a[i].name, a[i].sex,a[i].birth.year,a[i].birth.month,
a[i].birth.day,a[i].jobtime.year,a[i].jobtime.month,a[i].jobtime.day,
a[i].pay,a[i].college,a[i].post,a[i].degree);
printf(SS);
printf(AN);
printf("***************************************************\n");
printf("\t1.教师编号\t|\t2.姓名\n\n");
printf("\t3.性别\t|\t4.出生日期\n\n");
printf("\t5.参加工作时间\t|\t6.工资\n\n");
printf("\t7.学院\t|\t8.职称\n\n");
printf("\t9.学位\t|\t0.取消\n\n");
printf("***************************************************\n");
printf("请选择要修改的选项:");
while(1)
{
q=scanf("%d",&select);
if(q==1) break;
getchar();
printf("输入有误,请重新输入:\n");
}
switch(select)
{
case 1:
printf("请输入新的教师编号:");
scanf("%s",a[i].num);
printf("修改成功!\n");
break;
case 2:
printf("请输入新的教师姓名:");
scanf("%s",a[i].name);
printf("修改成功!\n");
Sort(a);
break;
case 3:
printf("请输入新的教师性别:");
scanf("%s",a[i].sex);
printf("修改成功!\n");
break;
case 4:
printf("请输入新的出生日期:");
while(1)
{
q=scanf("%d %d %d",&a[i].birth.year,&a[i].birth.month,&a[i].birth.day);
if(q==3) break;
getchar();
printf("输入有误,请重新输入:\n");
}
printf("修改成功!\n");
break;
case 5:
printf("请输入新的工作时间:");
while(1)
{
q=scanf("%d %d %d",&a[i].jobtime.year,&a[i].jobtime.month,&a[i].jobtime.day);
if(q==3) break;
getchar();
printf("输入有误,请重新输入:\n");
}
printf("修改成功!\n");
break;
case 6:
printf("请输入新的教师工资:");
while(1)
{
q=scanf("%d",&a[i].pay);
if(q==1) break;
getchar();
printf("输入有误,请重新输入:\n");
}
printf("修改成功!\n");
break;
case 7:
printf("请输入新的教师学院:");
scanf("%s",a[i].college);
printf("修改成功!\n");
break;
case 8:
printf("请输入新的教师职称:");
scanf("%s",a[i].post);
printf("修改成功!\n");
break;
case 9:
printf("请输入新的教师学位:");
scanf("%s",a[i].degree);
printf("修改成功!\n");
break;
case 0:
break;
default:printf("输入错误!!!\n");
}
write(a); //写入文件
k++;
}
}
if(!k)
{
printf("该教师信息不存在!!!\n");
}
printf("是否继续修改(是选1,否选0):");
while(1)
{
q=scanf("%d",&g);
if(q==1) break;
getchar();
printf("输入有误,请重新输入:\n");
}
if(!g)
{
break;
}
}
}
void display(TEA a[])
{
int i;
if(len)
{
printf(SS);
printf("教师编号| 姓 名 |性 别| 出生日期 |参加工作时间|工 资| 学 院 |职 称|学位\n");
printf(CC);
}
for(i=0;i<len;i++)
{
printf("%8s|%7s|%s|%4d %2d %2d| %4d %2d %2d |%6d|%12s|%6s|%4s\n",
a[i].num, a[i].name, a[i].sex,a[i].birth.year,a[i].birth.month,
a[i].birth.day,a[i].jobtime.year,a[i].jobtime.month,a[i].jobtime.day,
a[i].pay,a[i].college,a[i].post,a[i].degree);
}
if(len)
printf(SS);
else
printf("系统中无教师信息!!!\n");
}
void Searchbyid(TEA a[]) //查找
{
char name[10],fname[10];
int i,select,j,g,k;
int op;
char college[20];
char post[10];
DATA jobtime;
while(1)
{
printf(AN);
printf("***************************************************\n");
printf("\t1.按姓名查询\t|\t2.按学院查询\n\n");
printf("\t3.按职称查询\t|\t4.按工作时间查询\n\n");
printf("\t0.取消\n\n");
printf("***************************************************\n");
printf("请选择查询方式:");
while(1)
{
q=scanf("%d",&op);
if(q==1) break;
getchar();
printf("输入有误,请重新输入:\n");
}
k=0;
switch (op)
{
case 1:
printf("请选择:精确查询按:1 ,模糊查询按:2\n");
while(1)
{
q=scanf("%d",&select);
if(q==1) break;
getchar();
printf("输入有误,请重新输入:\n");
}
if(select==1)
{
printf("请输入要查询的教师姓名:");
getchar();
gets(name);
for (i = 0; i < len; i++)
{
if (strcmp(name,a[i].name)==0)
{
printf(SS);
printf("教师编号| 姓 名 |性 别| 出生日期 |参加工作时间|工 资| 学 院 |职 称|学位\n");
printf(CC);
printf("%8s|%7s|%s|%4d %2d %2d| %4d %2d %2d |%6d|%12s|%6s|%4s\n",
a[i].num, a[i].name, a[i].sex,a[i].birth.year,a[i].birth.month,
a[i].birth.day,a[i].jobtime.year,a[i].jobtime.month,a[i].jobtime.day,
a[i].pay,a[i].college,a[i].post,a[i].degree);
printf(SS);
k++;
}
}
}
else
{
printf("请输入要查询的教师的姓:");
//getchar();
scanf("%s",fname);
for (i = 0; i < len; i++)
{
if (strstr(a[i].name,fname)!=NULL)
{
printf(SS);
printf("教师编号| 姓 名 |性 别| 出生日期 |参加工作时间|工 资| 学 院 |职 称|学位\n");
printf(CC);
printf("%8s|%7s|%s|%4d %2d %2d| %4d %2d %2d |%6d|%12s|%6s|%4s\n",
a[i].num, a[i].name, a[i].sex,a[i].birth.year,a[i].birth.month,
a[i].birth.day,a[i].jobtime.year,a[i].jobtime.month,a[i].jobtime.day,
a[i].pay,a[i].college,a[i].post,a[i].degree);
printf(SS);
k++;
}
}
}
break;
case 2:
printf("请输入学院名称:");
//getchar();
scanf("%s",college);
for (i = 0; i < len; i++)
{
if (strcmp(college,a[i].college)==0)
{
printf(SS);
printf("教师编号| 姓 名 |性 别| 出生日期 |参加工作时间|工 资| 学 院 |职 称|学位\n");
printf(CC);
printf("%8s|%7s|%s|%4d %2d %2d| %4d %2d %2d |%6d|%12s|%6s|%4s\n",
a[i].num, a[i].name, a[i].sex,a[i].birth.year,a[i].birth.month,
a[i].birth.day,a[i].jobtime.year,a[i].jobtime.month,a[i].jobtime.day,
a[i].pay,a[i].college,a[i].post,a[i].degree);
printf(SS);
k++;
}
}
break;
case 3:
printf("请输入教师职称:");
//getchar();
scanf("%s",post);
for (i = 0; i < len; i++)
{
if (strcmp(post,a[i].post)==0)
{
printf(SS);
printf("教师编号| 姓 名 |性 别| 出生日期 |参加工作时间|工 资| 学 院 |职 称|学位\n");
printf(CC);
printf("%8s|%7s|%s|%4d %2d %2d| %4d %2d %2d |%6d|%12s|%6s|%4s\n",
a[i].num, a[i].name, a[i].sex,a[i].birth.year,a[i].birth.month,
a[i].birth.day,a[i].jobtime.year,a[i].jobtime.month,a[i].jobtime.day,
a[i].pay,a[i].college,a[i].post,a[i].degree);
printf(SS);
k++;
}
}
break;
case 4:
printf("请输入工作时间:");
while(1)
{
q=scanf("%d %d %d",&jobtime.year,&jobtime.month,&jobtime.day);
if(q==3) break;
getchar();
printf("输入有误,请重新输入:\n");
}
for (i = 0; i < len; i++)
{
if(jobtime.year>a[i].jobtime.year||jobtime.year==a[i].jobtime.year&&jobtime.month>a[i].jobtime.month||jobtime.year==a[i].jobtime.year&&jobtime.month==a[i].jobtime.month&&jobtime.day>a[i].jobtime.day)
{
printf(SS);
printf("教师编号| 姓 名 |性 别| 出生日期 |参加工作时间|工 资| 学 院 |职 称|学位\n");
printf(CC);
printf("%8s|%7s|%s|%4d %2d %2d| %4d %2d %2d |%6d|%12s|%6s|%4s\n",
a[i].num, a[i].name, a[i].sex,a[i].birth.year,a[i].birth.month,
a[i].birth.day,a[i].jobtime.year,a[i].jobtime.month,a[i].jobtime.day,
a[i].pay,a[i].college,a[i].post,a[i].degree);
printf(SS);
k++;
}
}
break;
case 0:
k++;
break;
default:
k++;
printf("输入错误!!!\n");
}
if(!k)
{
printf("无该查询数据!\n");
}
printf("是否继续查询(是选1,否选0):");
while(1)
{
q=scanf("%d",&g);
if(q==1) break;
getchar();
printf("输入有误,请重新输入:\n");
}
if(!g)
{
break;
}
}
}
void statistics(TEA a[])
{
int op,g,i;
int count,sum;
int z1,z2,z3,z4;
double b;
while(1)
{
printf(AN);
printf("***************************************************\n");
printf("\t1.80后出生的教师人数及比例\t|\t2.各职称岗位教师人数和高级职称比例\n\n");
printf("\t3.各学位教师人数及博士比例\t|\t4.计算教师的平均工资输出\n\n");
printf("\t0.取消\n\n");
printf("***************************************************\n");
printf("请选择需要查看的统计方式:");
while(1)
{
q=scanf("%d",&op);
if(q==1) break;
getchar();
printf("输入有误,请重新输入:\n");
}
count=0;
z1=0;
z2=0;
z3=0;
z4=0;
sum=0;
switch (op)
{
case 1:
for(i=0;i<len;i++)
{
if(a[i].birth.year>=1980)
{
count++;
}
}
printf("1980年以后出生的教师的人数为:%d\n",count);
b=(count*1.0)/len;
printf("80后教师占教师总数的比例:%.1f%%\n",b*100);
break;
case 2:
for(i=0;i<len;i++)
{
if(strcmp(a[i].post,"助教")==0)
{
z1++;
}
else if(strcmp(a[i].post,"讲师")==0)
{
z2++;
}
else if(strcmp(a[i].post,"副教授")==0)
{
z3++;
}
else if(strcmp(a[i].post,"教授")==0)
{
z4++;
}
else
{
printf("不明职业:%s\n",a[i].post);
}
}
printf("各职称岗位的教师人数分别为:助教:%d\t讲师:%d\t副教授:%d\t教授:%d\n",z1,z2,z3,z4);
b=((z3+z4)*1.0)/len;
printf("高级职称(包括副教授和教授)的比例:%.1f%%\n",b*100);
break;
case 3:
for(i=0;i<len;i++)
{
if(strcmp(a[i].degree,"学士")==0)
{
z1++;
}
else if(strcmp(a[i].degree,"硕士")==0)
{
z2++;
}
else if(strcmp(a[i].degree,"博士")==0)
{
z3++;
}
else
{
printf("不明学位:%s\n",a[i].degree);
}
}
printf("各各学位的教师人数分别为:学士:%d\t硕士:%d\t博士:%d\n",z1,z2,z3);
b=(z3*1.0)/len;
printf("拥有博士学位的教师占教师总数的比例:%.1f%%\n",b*100);
break;
case 4:
for(i=0;i<len;i++)
{
sum+=a[i].pay;
}
b=(sum*1.0)/len;
printf("教师的平均工资为:%.1f\n",b);
break;
}
printf("是否继续查看(是选1,否选0):");
while(1)
{
q=scanf("%d",&g);
if(q==1) break;
getchar();
printf("输入有误,请重新输入:\n");
}
if(!g)
{
break;
}
}
}
流程图
添加信息函数(void read(TEA a[]))
删除信息函数(void Delete(TEA a[]))
显示信息函数(display(TEA a[]))
查询教师信息信息(void Searchbyid(TEA a[]))
注:没有做出所有函数的流程图
主要函数算法
添加信息函数(void add(TEA a[]))
定义结构体数组;
在数组末尾输入信息,再排序;
调用保存函数,打开文件,保存输入信息。
修改信息函数(void change(TEA a[]))
定义结构体数组;
输入要修改的教师姓名并搜索是否存在该教师信息,若存在就修改 该教师的相关信息;
打开文件,保存修改信息。
删除信息函数(void Delete(TEA a[]))
定义结构体数组;
输入要删除的教师姓名并搜索是否存在该教师信息,若存在就删除 该教师的信息,保存新的信息内容;
显示记录函数(void display(TEA a[]))
检查是否存在教师信息;
若无信息,输出提示信息,返回主函数;若有信息,按顺序依次输 出信息;
查询信息(void Searchbyid(TEA a[]))
选择查询方式(按姓名、学院、职称或工作时间);
按提示输入查询内容:
在数组中寻找相应的信息,并输出相关教师信息。
系统运行图
提示
退出系统要根据系统提示按0退出,这样在下次进入系统时,才可以正常读取出之前保存的数据。
对于系统也做出了一些优化,例如对于输入为%d时输入字符系统会有提示。
当然,如果对于系统有什么建议可以在评论提出来。
谢谢查看!!!