教师信息管理系统设计
建议用结构体数组存储,或动态分配量内存。
1) 系统以菜单方式工作
2) 录入人事档案信息:工号、姓名、性别、年龄、职务、职称、政治面貌、
最高学历、任职时间、人员类别。其中,人员编号唯一,不能重复。
3) 添加、删除功能:能根据学院人事的变动情况,添加删除记录。
4) 查询功能:能根据工号和姓名进行查询。
5) 编辑功能:根据查询对相应的记录进行修改。
6) 统计功能:能根据多种参数进行人员的统计(在职人数、党员人数、女
工人数、高学历高职称人数(硕士学位以上或者副教授以上)),统计要 求同时显示被统计者的信息。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LED sizeof(WORKER)
typedef struct teacher { //教师信息链表
int code; //工号
char name[20]; //姓名
char sex[10]; //性别
int age; //年龄
char duty[20]; //职务
char job_title[20]; //职称
char politics_status[20]; //政治面貌
char qualification[20]; //最高学历
int job_time; //入职时间
char category[20]; //人员类别
struct teacher *next;
} WORKER;
int count = 0; //员工人数
void menu1() { //主菜单
printf("欢迎使用教师信息管理系统!\n");
printf("1-->录入教师信息\n");
printf("2-->添加、删除信息\n");
printf("3-->查询信息\n");
printf("4-->编辑信息\n");
printf("5-->统计信息\n");
printf("6-->退出系统\n");
}
void menu2() { //编辑信息菜单
printf("1-->工号\n");
printf("2-->姓名\n");
printf("3-->性别\n");
printf("4-->年龄\n");
printf("5-->职务\n");
printf("6-->职称\n");
printf("7-->政治面貌\n");
printf("8-->最高学历\n");
printf("9-->入职时间\n");
printf("10-->人员类别\n");
}
void menu3() {
printf("1-->统计在职人数\n");
printf("2-->统计党员人数\n");
printf("3-->统计女工人数\n");
printf("4-->统计高学历高职称人数\n");
}
void menu4() {
printf("1-->按照年龄排序输出\n");
printf("2-->按照任职时间排序输出\n");
}
int judge_code(WORKER *head, int code) { //判断想要修改工号是否已经存在
int result;
WORKER *p;
p = head;
while (p->code != code && p->next != NULL)
p = p->next;
if (p->code == code)
result = 0;
else
result = 1;
return result;
}
int judge_name(WORKER *head, char *name) { //判断此教师是否存在
int result;
WORKER *p;
p = head;
while (strcmp(p->name, name) != 0 && p->next != NULL)
p = p->next;
if (strcmp(p->name, name) == 0)
result = 1;
else
result = 0;
return result;
}
WORKER *create() { //创建链表
WORKER *head, *p1, *p2;
head = NULL;
p2 = p1 = (WORKER *)malloc(LED);
printf("工号 姓名 性别 年龄 职务 职称 政治面貌 最高学历 入职时间 人员类别 \n");
scanf("%d%s%s%d%s%s%s%s%d%s",
&p1->code,
p1->name,
p1->sex,
&p1->age,
p1->duty,
p1->job_title,
p1->politics_status,
p1->qualification,
&p1->job_time,
p1->category);
while (p1->code != 0) {
count++;
if (count == 1)
head = p1;
else
p2->next = p1;
p2 = p1;
p1 = (WORKER *)malloc(LED);
scanf("%d", &p1->code);
if (p1->code != 0) {
scanf("%s%s%d%s%s%s%s%d%s",
p1->name,
p1->sex,
&p1->age,
p1->duty,
p1->job_title,
p1->politics_status,
p1->qualification,
&p1->job_time,
p1->category);
} else
break;
}
p2->next = NULL;
return head;
}
WORKER *add(WORKER *head, WORKER *p1) { //插入链表 信息
WORKER *p, *p2;
p = head;
if (head == NULL) {
head = p1;
p1->next = NULL;
} else
while (p1->code > p->code && p->next != NULL) {
p2 = p;
p = p->next;
}
if (p1->code <= p->code) {
if (head == p)
head = p1;
else
p2->next = p1;
p1->next = p;
} else {
p->next = p1;
p1->next = NULL;
}
count++;
return head;
}
WORKER *del(WORKER *head, int code) { //删除链表信息
WORKER *p1, *p2;
p1 = head;
while (p1->code != code && p1->next != NULL) {
p2 = p1;
p1 = p1->next;
}
if (p1->code == code) {
if (head == p1)
head = p1->next;
else
p2->next = p1->next;
count--;
} else
printf("不存在此教师信息!\n");
return head;
}
WORKER * query_code(WORKER *head, int code) { //根据查询链表信息
WORKER *p1;
p1 = head;
while (p1->code != code && p1->next != NULL) {
p1 = p1->next;
}
if (p1->code == code) {
printf("工号 姓名 性别 年龄 职务 职称 政治面貌 最高学历 入职时间 人员类别 \n");
printf("%d%s%s%d%s%s%s%s%d%s\n",
p1->code,
p1->name,
p1->sex,
p1->age,
p1->duty,
p1->job_title,
p1->politics_status,
p1->qualification,
p1->job_time,
p1->category);
printf("教师信息展示完毕!\n");
} else {
printf("无此教师信息!\n");
}
return head;
}
WORKER * query_name(WORKER *head, char *name) { //根据名字查询链表信息
WORKER *p1;
p1 = head;
while (strcmp(p1->name, name) != 0 && p1->next != NULL) {
p1 = p1->next;
}
if (strcmp(p1->name, name) == 0) {
printf("工号 姓名 性别 年龄 职务 职称 政治面貌 最高学历 入职时间 人员类别 \n");
printf("%d%s%s%d%s%s%s%s%d%s\n",
p1->code,
p1->name,
p1->sex,
p1->age,
p1->duty,
p1->job_title,
p1->politics_status,
p1->qualification,
p1->job_time,
p1->category);
printf("教师信息展示完毕!\n");
} else {
printf("无此教师信息!\n");
}
return head;
}
WORKER *change_code(WORKER *head, char *name) { //修改工号
WORKER *p;
p = head;
while (strcmp(p->name, name) != 0 && p->next != NULL)
p = p->next;
if (strcmp(p->name, name) == 0) {
printf("请输入修改后的新工号:");
int new_code;
scanf("%d", &new_code);
if (judge_code(head, new_code)) {
p->code = new_code;
printf("修改成功!\n");
} else
printf("此工号已存在!\n");
} else
printf("不存在此教师信息!\n");
return head;
}
WORKER *change_name(WORKER *head, char *name) { //修改名字
WORKER *p;
p = head;
while (strcmp(p->name, name) != 0 && p->next != NULL)
p = p->next;
if (strcmp(p->name, name) == 0) {
printf("请输入修改后的新姓名:");
char new_name[20];
scanf("%s", new_name);
strcpy(p->name, new_name);
printf("修改成功!\n");
} else
printf("不存在此教师信息!\n");
return head;
}
WORKER *change_sex(WORKER *head, char *name) { //修改性别
WORKER *p;
p = head;
while (strcmp(p->name, name) != 0 && p->next != NULL)
p = p->next;
if (strcmp(p->name, name) == 0) {
printf("请输入修改后的新性别:");
char new_sex[10];
scanf("%s", new_sex);
strcpy(p->sex, new_sex);
printf("修改成功!\n");
} else
printf("不存在此教师信息!\n");
return head;
}
WORKER *change_age(WORKER *head, char *name) { //修改年龄
WORKER *p;
p = head;
while (strcmp(p->name, name) != 0 && p->next != NULL)
p = p->next;
if (strcmp(p->name, name) == 0) {
printf("请输入修改后的新年龄:");
int new_age;
scanf("%d", &new_age);
p->age = new_age;
printf("修改成功!\n");
} else
printf("不存在此教师信息!\n");
return head;
}
WORKER *change_duty(WORKER *head, char *name) { //修改职务
WORKER *p;
p = head;
while (strcmp(p->name, name) != 0 && p->next != NULL)
p = p->next;
if (strcmp(p->name, name) == 0) {
printf("请输入修改后的新职务:");
char new_duty[20];
scanf("%s", new_duty);
strcpy(p->duty, new_duty);
printf("修改成功!\n");
} else
printf("不存在此教师信息!\n");
return head;
}
WORKER *change_job_title(WORKER *head, char *name) { //修改职称
WORKER *p;
p = head;
while (strcmp(p->name, name) != 0 && p->next != NULL)
p = p->next;
if (strcmp(p->name, name) == 0) {
printf("请输入修改后的新职称:");
char new_job_title[20];
scanf("%s", new_job_title);
strcpy(p->job_title, new_job_title);
printf("修改成功!\n");
} else
printf("不存在此教师信息!\n");
return head;
}
WORKER *change_politics_status(WORKER *head, char *name) { //修改政治面貌
WORKER *p;
p = head;
while (strcmp(p->name, name) != 0 && p->next != NULL)
p = p->next;
if (strcmp(p->name, name) == 0) {
printf("请输入修改后的新政治面貌:");
char new_politics_status[20];
scanf("%s", new_politics_status);
strcpy(p->politics_status, new_politics_status);
printf("修改成功!\n");
} else
printf("不存在此教师信息!\n");
return head;
}
WORKER *change_qualification(WORKER *head, char *name) { //修改最高学历
WORKER *p;
p = head;
while (strcmp(p->name, name) != 0 && p->next != NULL)
p = p->next;
if (strcmp(p->name, name) == 0) {
printf("请输入修改后的新的最高学历:");
char new_qualification[20];
scanf("%s", new_qualification);
strcpy(p->qualification, new_qualification);
printf("修改成功!\n");
} else
printf("不存在此教师信息!\n");
return head;
}
WORKER *change_job_time(WORKER *head, char *name) { //修改入职时间
WORKER *p;
p = head;
while (strcmp(p->name, name) != 0 && p->next != NULL)
p = p->next;
if (strcmp(p->name, name) == 0) {
printf("请输入修改后的新入职时间:");
int job_time;
scanf("%d", &job_time);
p->job_time = job_time;
printf("修改成功!\n");
} else
printf("不存在此教师信息!\n");
return head;
}
WORKER *change_category(WORKER *head, char *name) { //修改人员类别
WORKER *p;
p = head;
while (strcmp(p->name, name) != 0 && p->next != NULL)
p = p->next;
if (strcmp(p->name, name) == 0) {
printf("请输入修改后的新人员类别:");
char new_category[20];
scanf("%s", new_category);
strcpy(p->category, new_category);
printf("修改成功!\n");
} else
printf("不存在此教师信息!\n");
return head;
}
WORKER *change(WORKER *head) { //编辑功能
printf("请输入你要修改教师的姓名:");
char name[20];
scanf("%s", name);
if (judge_name(head, name)) {
menu2();
printf("请输入你要修改信息的编号:");
int choice;
scanf("%d", &choice);
if (choice >= 1 && choice <= 10)
switch (choice) {
case 1:
head = change_code(head, name);
break;
case 2:
head = change_name(head, name);
break;
case 3:
head = change_sex(head, name);
break;
case 4:
head = change_age(head, name);
break;
case 5:
head = change_duty(head, name);
break;
case 6:
head = change_job_title(head, name);
break;
case 7:
head = change_politics_status(head, name);
break;
case 8:
head = change_qualification(head, name);
break;
case 9:
head = change_job_time(head, name);
break;
case 10:
head = change_category(head, name);
break;
} else
printf("输入操作编号错误!\n");
} else
printf("无此教师信息!\n");
return head;
}
void statistic_working(WORKER *head) { //统计在职员工
WORKER *p = head;
char category[20] = "在职员工";
while (p != NULL) {
if (strcmp(p->category, category) == 0) {
printf("工号 姓名 性别 年龄 职务 职称 政治面貌 最高学历 入职时间 人员类别 \n");
printf("%d %s %s %d %s %s %s %s %d %s\n",
p->code,
p->name,
p->sex,
p->age,
p->duty,
p->job_title,
p->politics_status,
p->qualification,
p->job_time,
p->category);
}
p = p->next;
}
}
void statisitc_party(WORKER *head) { //统计党员-
WORKER *p = head;
char politics_status[20] = "党员";
while (p != NULL) {
if (strcmp(p->politics_status, politics_status) == 0) {
printf("工号 姓名 性别 年龄 职务 职称 政治面貌 最高学历 入职时间 人员类别 \n");
printf("%d %s %s %d %s %s %s %s %d %s\n",
p->code,
p->name,
p->sex,
p->age,
p->duty,
p->job_title,
p->politics_status,
p->qualification,
p->job_time,
p->category);
}
p = p->next;
}
}
void statistic_women(WORKER *head) { //统计女工
WORKER *p = head;
char sex[10] = "女";
while (p != NULL) {
if (strcmp(p->sex, sex) == 0) {
printf("工号 姓名 性别 年龄 职务 职称 政治面貌 最高学历 入职时间 人员类别 \n");
printf("%d %s %s %d %s %s %s %s %d %s\n",
p->code,
p->name,
p->sex,
p->age,
p->duty,
p->job_title,
p->politics_status,
p->qualification,
p->job_time,
p->category);
}
p = p->next;
}
}
void statistic_highqual(WORKER *head) { //统计高学历
WORKER *p = head;
char qualification_1[20] = "硕士学位";
char qualification_2[20] = "副教授";
while (p != NULL) {
if (strcmp(p->qualification, qualification_1) == 0 || strcmp(p->qualification, qualification_2) == 0) {
printf("工号 姓名 性别 年龄 职务 职称 政治面貌 最高学历 入职时间 人员类别 \n");
printf("%d %s %s %d %s %s %s %s %d %s\n",
p->code,
p->name,
p->sex,
p->age,
p->duty,
p->job_title,
p->politics_status,
p->qualification,
p->job_time,
p->category);
}
p = p->next;
}
}
void statistic(WORKER *head) { //统计功能
menu3();
int choice;
printf("请输入你的操作编号:");
scanf("%d", &choice);
if (choice >= 1 && choice <= 4)
switch (choice) {
case 1:
statistic_working(head);
break;
case 2:
statisitc_party(head);
break;
case 3:
statistic_women(head);
break;
case 4:
statistic_highqual(head);
break;
} else
printf("输入操作编号错误!\n");
}
int main() { //主函数
for (int i = 1; i; i++) {
int choice;
WORKER *head;
menu1();
printf("请输入你的操作编号:");
scanf("%d", &choice);
if (choice >= 1 && choice <= 5) {
switch (choice) {
case 1:
head = create();
printf("教师信息录入完毕\n");
break;
case 2:
printf("1-->添加信息\n");
printf("2-->删除信息\n");
printf("请输入你的操作编号:");
int n;
scanf("%d", &n);
if (n == 1 || n == 2)
switch (n) {
case 1:
WORKER *p1;
p1 = (WORKER *)malloc(LED);
printf("请录入要添加的教师信息\n");
printf("工号 姓名 性别 年龄 职务 职称 政治面貌 最高学历 入职时间 人员类别 \n");
scanf("%d", &p1->code);
scanf("%s%s%d%s%s%s%s%d%s",
p1->name,
p1->sex,
&p1->age,
p1->duty,
p1->job_title,
p1->politics_status,
p1->qualification,
&p1->job_time,
p1->category);
head = add(head, p1);
printf("添加教师信息完毕!\n");
break;
case 2:
int code;
printf("请输入想要删除教师的编号:");
scanf("%d", &code);
head = del(head, code);
printf("删除教师信息完毕!\n");
break;
} else
printf("输入操作编号错误!\n");
break;
case 3:
int choice;
printf("1-->根据工号查询\n");
printf("2-->根据姓名查询\n");
printf("请输入你的操作编号:");
scanf("%d", &choice);
if (choice == 1 || choice == 2) {
switch (choice) {
case 1:
int code;
printf("请输入你想要查询教师的工号\n");
scanf("%d", &code);
head = query_code(head, code);
break;
case 2:
char name[20];
printf("请输入你要查询教师的姓名\n");
scanf("%s", name);
head = query_name(head, name);
break;
}
} else
printf("输入操作编号错误!\n");
break;
case 4:
head = change(head);
break;
case 5:
statistic(head);
break;
}
} else if (choice < 1 || choice > 6)
printf("输入操作编号错误!\n");
else
break;
}
return 0;
}