前言
刚学完C语言,仍是菜鸟一枚。有些不好的地方不要介意啊!!!(咳咳,不能介意○( ^皿^)っ``)
一、具体功能
1.1维护教师信息。
(1)增加教师信息
(2)修改教师信息
(3)删除教师信息
1.2查询教师信息。
(1)按教师编号查询
(2)按姓名查询
(3)按工作时间查询
1.3统计教师信息
(1)统计某年参加工作的教师总数及教师基本情况按部门统计总数并显示数据
1.4对教师信息排序
(1)按部门、教师姓名的拼音顺序排序并显示排序结果
(2)按教师编号排序并显示排序结果
二、总体设计
二、代码
源代码:
话不多说,直接上代码(ヾ(≧▽≦*)o):#include<stdio.h>
#include<string.h>
#include <windows.h>
#include<stdlib.h>
#define N 300 //最大总人数
#define BUMEN 7 //部门总数
struct Teacher //定义结构体
{
int Num; //编号 -------教师号
char Name[25]; //姓名
char Sex[20]; //性别
int Age; //年龄
char dianhua[12]; //电话
int money; //工资
char zhicheng[25]; //职称
int time; //工作时间
char bumen[50]; //所属部门
}Tc[N]; //定义教师结构体数组名
#define LEN sizeof(struct Teacher) //结构体占的字节数
int renshu = 0; //全局变量_总人数
void hello();
void caidan();
void jieshu();
void weihu();
void zengjia();
void xiugao();
void shangchu();
void tongji();
void chaxun();
void chaxun_1();
void chaxun_2();
void chaxun_3();
void paixu();
void paixu_1();
void paixu_2();
void save_load();
void save();
void load();
int main()
{
int n; //操作选择
system ("title 教师信息管理系统"); //改变标题
hello(); //开始界面
while(1)
{
system("cls");//清屏
caidan(); //菜单界面
scanf("%d", &n); //输入选择
system("cls"); //清除菜单,展示选择的内容
switch(n)
{
case 0:
save(); //退出系统时保存文件
jieshu(); //退出画面
case 1:
weihu(); //维护(增加、修改、删除)
break;
case 2:
tongji(); //统计(根据部门名进行分类)
break;
case 3:
chaxun(); //查询(姓名、教师号、工作时间)
break;
case 4:
paixu(); //排序(教师号、部门名姓名)
break;
case 9:
save_load(); //文件读写
break;
default: //输入错误时
printf("\n\n\n\n\t请输入正确的选项!!!\n");
system("pause");
}
}
return 0;
}
void hello() //开始
{
printf("时间:");
system("date/t");
printf("☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆\n\n");
printf("\n欢迎来到教师信息管理系统\n\n");
printf("☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆\n\n");
system("pause");
}
void caidan() // 主菜单
{
printf("时间:");
system("date/t");
printf(" ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆\n");
printf(" ☆********************************************************************★\n");
printf(" ★ 教师信息管理系统 ☆\n");
printf(" ☆ ★\n");
printf(" ★ 1、维护教师信息 2、统计教师信息 ☆\n");
printf(" ☆ ★\n");
printf(" ★ 3、查询教师信息 4、排序并查看教师信息 ☆\n");
printf(" ☆ ★\n");
printf(" ★ ---------------------------------------------- ☆\n");
printf(" ☆ 0、退出系统 9、文件保存与读取 ★\n");
printf(" ★ ☆\n");
printf(" ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆\n");
printf("请选择您的操作:");
}
void weihu() //维护教师信息_菜单
{
int m; //操作选择
while(1)
{
system("cls"); //完成一次操作后清屏
printf("时间:");
system("date/t");
printf(" ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆\n");
printf(" ☆********************************************************************★\n");
printf(" ★ ***************维护教师信息*************** ☆\n");
printf(" ☆ ★\n");
printf(" ★ 1、增加教师信息 ☆\n");
printf(" ☆ 2、修改教师信息 ★\n");
printf(" ★ 3、删除教师信息 ☆\n");
printf(" ☆ ★\n");
printf(" ★ ---------------------------------------------- ☆\n");
printf(" ☆ 0、返回上一菜单 ★\n");
printf(" ★ ☆\n");
printf(" ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆\n");
printf("请输入您的选择:");
scanf("%d", &m);
switch (m)
{
case 0:
return; //返回上一菜单
case 1:
zengjia();
break;
case 2:
xiugao();
break;
case 3:
shangchu();
break;
default:
printf("\n请输入正确选项!!!\n");
system("pause"); //输入错误,冻结屏幕
}
}
}
void zengjia() // 增加教师信息
{
int i, n; // n:新增人数
printf("请输入新增人数:");
scanf("%d", &n);
if(n == 0)
return;
for(i=renshu; i<renshu + n; i++)
{
printf("----------------------------------------------------------------------------------------------------\n");
printf("请输入教师 %d的\n教师号 姓名 性别 年龄 电话 工资 职称 所属部门 工作时间:(空格分隔)\n",i+1);
scanf("%d%s%s%d%s%d%s%s%d", &Tc[i].Num, Tc[i].Name, Tc[i].Sex, &Tc[i].Age, Tc[i].dianhua, &Tc[i].money, Tc[i].zhicheng, Tc[i].bumen, &Tc[i].time);
}
renshu += n; //总人数 == 原本人数 + 新增人数
printf("\n--------------------------------☆输入结束,返回上一菜单☆--------------------------------------\n");
system("pause"); //操作结束,冻结屏幕
}
void xiugao() // 修改教师信息
{
int i, n, t; // t:判断输入教师号是否正确
while(1)
{
printf("请输入需要修改的教师号(输入0结束修改):");
scanf("%d", &n);
t = 0; //每次修改教师信息时 t = 0,
if(n == 0)
break;
for(i=0; i<renshu; i++)
{
if(n == Tc[i].Num)
{
printf("您要修改的教师信息为:\n");
printf("教师号 姓名 性别 年龄 电话 工资 职称 所属部门 工作时间\n");
printf("%5d%9s%5s%5d%13s%10d%9s%9s%9d\n", Tc[i].Num, Tc[i].Name, Tc[i].Sex, Tc[i].Age, Tc[i].dianhua, Tc[i].money, Tc[i].zhicheng, Tc[i].bumen, Tc[i].time);
t = 1; //存在该教师,t = 1
printf("请输入修改后的信息:\n");
printf("请输入教师 %d的\n教师号 姓名 性别 年龄 电话 工资 职称 所属部门 工作时间:(空格分隔)\n",i+1);
scanf("%d%s%s%d%s%d%s%s%d", &Tc[i].Num, Tc[i].Name, Tc[i].Sex, &Tc[i].Age, Tc[i].dianhua, &Tc[i].money, Tc[i].zhicheng, Tc[i].bumen, &Tc[i].time);
}
}
if(t == 0) // 若t == 0, 表示不存在该教师号
printf("""\n★!!!该教师号为空!!! ★\n");
}
}
void shangchu() //删除教师信息
{
int i, n, m, t; // t: 判断输入教师号是否正确
while(1)
{
printf("请输入需要删除的教师号(输入0结束删除):");
scanf("%d", &n);
t = 0;
if(n == 0)
break;
for(i=0; i<renshu; i++)
if(n == Tc[i].Num)
{
printf("您要删除的教师信息为:\n");
printf("教师号 姓名 性别 年龄 电话 工资 职称 所属部门 工作时间\n");
printf("%5d%9s%5s%5d%13s%10d%9s%9s%9d\n", Tc[i].Num, Tc[i].Name, Tc[i].Sex, Tc[i].Age, Tc[i].dianhua, Tc[i].money, Tc[i].zhicheng, Tc[i].bumen, Tc[i].time);
t = 1;
q1: printf("是否确认删除?\n1、确认删除 2、取消删除\n");
scanf("%d", &m);
if(m == 2)
continue; //取消删除,跳过该教师,继续循环
else if(m == 1)
{
Tc[i] = Tc[renshu-1]; //用最后一名教师的信息覆盖
renshu--; //确认删除,总人数 - 1,放弃最后一条重复的教师信息
}
else
{
printf("请正确输入选项:\n");
goto q1; //输入有误,“goto q1”重新确认是否删除
}
if(t == 0)
printf("""\n★!!!该教师号为空!!! ★\n");
}
}
}
void tongji() //对教师信息进行统计
{
int i, j;
char bu[BUMEN][11] = {"办公室", "实验室", "图书室", "宿舍", "美术室" ,"音乐室", "教务处"}; //以部门分类(该二维数组必须将所有部门包括在内)
for(j=0; j<BUMEN; j++)
{
printf("部门:%s\n", bu[j]);
for(i=0; i<renshu; i++)
{
if(strcmp(bu[j], Tc[i].bumen) == 0) //若该教师部门与之相同,输出该教师信息
{
printf("教师号 姓名 性别 年龄 电话 工资 职称 所属部门 工作时间 \n");
printf("%5d%9s%5s%5d%13s%10d%9s%9s%9d\n", Tc[i].Num, Tc[i].Name, Tc[i].Sex, Tc[i].Age, Tc[i].dianhua, Tc[i].money, Tc[i].zhicheng, Tc[i].bumen, Tc[i].time);
}
}
printf("----------------------------------------------------------------------------------------------------\n"); //分割线
}
system("pause"); //操作完成,冻结屏幕
}
void chaxun()
{
int n;
while(1)
{
system("cls");
printf("时间:");
system("date/t");
printf(" ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆\n");
printf(" ☆********************************************************************★\n");
printf(" ★ *******************查 询******************** ☆\n");
printf(" ☆ ★\n");
printf(" ★ 1.按教师号查询 ☆\n");
printf(" ☆ ★\n");
printf(" ★ 2.按姓名查询 ☆\n");
printf(" ☆ ★\n");
printf(" ★ 3.按工作时间查询 ☆\n");
printf(" ☆ ★\n");
printf(" ★ ---------------------------------------------- ☆\n");
printf(" ☆ 0、返回上一菜单 ★\n");
printf(" ★ ☆\n");
printf(" ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆\n");
printf("请输入您的选择:");
scanf("%d", &n);
switch (n)
{
case 0:
return;
case 1:
chaxun_1();
break;
case 2:
chaxun_2();
break;
case 3:
chaxun_3();
break;
default:
printf("请正确输入!!!");
system("pause");
}
}
}
void chaxun_1()
{
int i, hao, b=0;
while(1)
{
printf("请输入查询的教师号(输入0退出):");
scanf("%d",&hao);
if(hao == 0)
return; //输入0, 退出
printf("---------------------------------------查询结果:---------------------------------------------------\n") ;
for (i=0; i<renshu; i++)
{
if(Tc[i].Num==hao)
{
b=1;
printf("教师号 姓名 性别 年龄 电话 工资 职称 所属部门 工作时间\n");
printf("%5d%9s%5s%5d%13s%10d%9s%9s%9d\n", Tc[i].Num, Tc[i].Name, Tc[i].Sex, Tc[i].Age, Tc[i].dianhua, Tc[i].money, Tc[i].zhicheng, Tc[i].bumen, Tc[i].time);
}
}
if(b==0)
printf("\n ★无匹配教师!! ★\n");
}
}
void chaxun_2() //按条件查询信息--------- 2.按姓名查询
{
int i, t = 0;
char b[20];
printf("请输入查询的教师姓名:");
scanf("%s", &b);
printf("---------------------------------------查询结果:---------------------------------------------------\n") ;
for (i=0;i<renshu;i++)
{
if(strcmp(Tc[i].Name,b)==0)
{
t = 1;
printf("教师号 姓名 性别 年龄 电话 工资 职称 所属部门 工作时间\n");
printf("%5d%9s%5s%5d%13s%10d%9s%9s%9d\n", Tc[i].Num, Tc[i].Name, Tc[i].Sex, Tc[i].Age, Tc[i].dianhua, Tc[i].money, Tc[i].zhicheng, Tc[i].bumen, Tc[i].time);
}
}
if(t == 0)
printf("\n ★无匹配教师!! ★\n");
system("pause");
}
void chaxun_3()
{
int i, time, b=0;
printf("请输入查询教师工作时间:");
scanf("%d",&time);
printf("---------------------------------------查询结果:---------------------------------------------------\n") ;
for (i=0; i<renshu; i++)
{
if(Tc[i].time == time)
{
b=1;
printf("教师号 姓名 性别 年龄 电话 工资 职称 所属部门 工作时间\n");
printf("%5d%9s%5s%5d%13s%10d%9s%9s%9d\n", Tc[i].Num, Tc[i].Name, Tc[i].Sex, Tc[i].Age, Tc[i].dianhua, Tc[i].money, Tc[i].zhicheng, Tc[i].bumen, Tc[i].time);
}
}
if(b==0)
printf("\n ★无匹配教师!! ★\n");
system("pause");
}
void save_load() //文件保存和读取
{
int m;
printf("时间:");
system("date/t");
printf(" ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆\n");
printf(" ☆********************************************************************★\n");
printf(" ★ *****************文件读写***************** ☆\n");
printf(" ☆ ★\n");
printf(" ★ 1、从文件中读取信息 ☆\n");
printf(" ☆ ★\n");
printf(" ★ 2、保存信息到文件 ☆\n");
printf(" ☆ ★\n");
printf(" ★ ---------------------------------------------- ☆\n");
printf(" ☆ 0、返回上一菜单 ★\n");
printf(" ★ ☆\n");
printf(" ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆\n");
printf("请输入您的选择:");
scanf("%d", &m);
switch(m)
{
case 1:
load();
break;
case 2:
save();
break;
case 0:
return;
}
}
void save() //文件保存
{
FILE *fp; //定义文件指针
int i;
if((fp=fopen("Tc.txt","w"))==NULL) // 打开文件,没有文件自动创建,‘w’为只写 模式
{
printf("文件打开错误!\n"); //检查文件打开状态,打开不成功则提示
exit(0);
}
for(i=0;i<renshu;i++)
fwrite(&Tc[i],sizeof(struct Teacher),1,fp); //将结构体Tc数据写到文件中
fclose(fp); //关闭文件
printf("\n ★数据保存成功 ★ \n\n ");
system("pause");
}
void load()
{ // 读入函数 磁盘信息读入到内存
FILE *fp; //定义文件指针
int i;
if((fp=fopen("Tc.txt","r"))==NULL) // 打开文件,,‘r’为只读
{
printf("文件打开错误!\n"); //检查文件打开状态,打开不成功则提示
exit(0);
}
for(i=0;!feof(fp);i++)
fread(&Tc[i],sizeof(struct Teacher),1,fp); //将文件数据写到结构体Tc[]中
fclose(fp); //关闭文件
renshu=i-1;
printf("\n ★数据读取成功 ★ \n\n ");
system("pause");
}
void paixu()
{
int m;
while(1)
{
system("cls"); //清空屏幕
printf("时间:");
system("date/t");
printf(" ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆\n");
printf(" ☆********************************************************************★\n");
printf(" ★ *********************排 序****************** ☆\n");
printf(" ☆ ★\n");
printf(" ★ 1、按部门、教师名字的拼音排序 ☆\n");
printf(" ☆ ★\n");
printf(" ★ 2、按教师编号排序 ☆\n");
printf(" ☆ ★\n");
printf(" ★ ---------------------------------------------- ☆\n");
printf(" ☆ 0、返回上一菜单 ★\n");
printf(" ★ ☆\n");
printf(" ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆\n");
printf("请输入您的选择:");
scanf("%d", &m);
switch(m)
{
case 1:
paixu_1();
break;
case 2:
paixu_2();
break;
case 0:
return;
}
}
}
void paixu_1() //按条件排序---------1.按部门、教师名字的拼音顺序排序
{
int i, j;
struct Teacher t;
for(i=0; i<renshu-1; i++)
for(j=0; j<renshu-1-i; j++)
if(strcmp(Tc[j].bumen, Tc[j+1].bumen) > 0)
{
t=Tc[j];
Tc[j]=Tc[j+1];
Tc[j+1]=t;
}
for(i=0; i<renshu-1; i++)
for(j=0; j<renshu-1-i; j++)
if(strcmp(Tc[j].Name, Tc[j+1].Name) > 0)
{
t=Tc[j];
Tc[j]=Tc[j+1];
Tc[j+1]=t;
}
printf("按部门、教师名字的拼音顺序排序(总人数:%d):\n", renshu);
for(i=0; i<renshu; i++)
{
printf("----------------------------------------------------------------------------------------------------\n");
printf("教师号 姓名 性别 年龄 电话 工资 职称 所属部门 工作时间\n");
printf("%5d%9s%5s%5d%13s%10d%9s%9s%9d\n", Tc[i].Num, Tc[i].Name, Tc[i].Sex, Tc[i].Age, Tc[i].dianhua, Tc[i].money, Tc[i].zhicheng, Tc[i].bumen, Tc[i].time);
}
system("pause");
}
void paixu_2() //按条件排序---------2.按教师号排序
{
int i, j;
struct Teacher t;
for(i=0; i<renshu-1; i++) //冒泡排序法
for(j=0; j<renshu-1-i; j++)
if(Tc[j].Num > Tc[j+1].Num)
{
t=Tc[j];
Tc[j]=Tc[j+1];
Tc[j+1]=t;
}
printf("按教师号排序(总人数:%d):\n", renshu);
for(i=0; i<renshu; i++) //输出排序结果
{
printf("----------------------------------------------------------------------------------------------------\n");
printf("教师号 姓名 性别 年龄 电话 工资 职称 所属部门 工作时间\n");
printf("%5d%9s%5s%5d%13s%10d%9s%9s%9d\n", Tc[i].Num, Tc[i].Name, Tc[i].Sex, Tc[i].Age, Tc[i].dianhua, Tc[i].money, Tc[i].zhicheng, Tc[i].bumen, Tc[i].time);
}
system("pause");
}
void jieshu() //结束界面
{ system("cls");
printf("\n\n\n");
printf("时间:");
system("date/t");
printf("\n★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★\n\n");
puts("\n");
puts(" ┃ ┃");
puts(" ┃ ┃");
puts(" ┃ 感谢访问教师信息管理系统!欢迎下次再来! ┃");
puts(" ┃ ┃");
puts(" ┃ ┃");
puts(" ┃ ┃");
puts(" ┃ ┃");
printf("\n★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★\n\n");
printf("\n系统将在3秒后关闭\n");
Sleep(3000); //3秒后关闭
exit(0);
}
还有一些不足:
1.因为我本来是想用链表做的,不过做链表的时候一直出现BUG,只好退一步,用数组来存放教师信息了。
2.汉字拼音排序的实在是没有找到具体的资料,时间也比较短,就用的字符串的比较方式来排序了。
3.可能还有一些其他的错误没有被我发现(手动狗头)<( ̄▽ ̄)/