0
点赞
收藏
分享

微信扫一扫

用链表编写教师信息管理系统

乐百川 2022-01-09 阅读 75

教师信息管理系统设计

建议用结构体数组存储,或动态分配量内存。

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;
}

举报

相关推荐

0 条评论