教师工作量管理系统思路(链表应用)

news2024/11/18 13:05:45

教师工作量管理系统思路(链表应用)

文章目录

  • 教师工作量管理系统思路(链表应用)
      • 题目描述:
      • 初始信息
      • 菜单部分
      • 数据结构
      • 功能实现
        • 查询历史信息
        • 从键盘录入信息
        • 信息删除和修改
        • 工作量计算
          • 如何存储到工作量信息链表中?
          • 工作量信息计算
      • 文件导入和输出

题目描述:

请添加图片描述

初始信息

将课程信息、教师信息分别用结构体数组进行存储

//存储课程信息
struct Course {
	int id;//课程编号
	int TheoryCHour;//理论学时
	int ExperiCHour;//实验学时
	char name[20];//课程名称
}cr[4];
//存储教师信息
struct Teacher {
	int id;//教师号
	char name[20];//姓名
	char sex[10];//性别
	char prof[20];//职称
}tr[5];

由于只有4门课程和5名教师,所以设置初始化函数来存储初始信息

void InitTeacherInfo() {//教师信息初始化
	tr[0].id = 1001;
	strcpy(tr[0].name, "艾雪");
	strcpy(tr[0].sex, "女");
	strcpy(tr[0].prof, "副教授");

	tr[1].id = 1002;
	strcpy(tr[1].name, "张三");
	strcpy(tr[1].sex, "男");
	strcpy(tr[1].prof, "讲师");
	tr[2].id = 1003;
	strcpy(tr[2].name, "罗翔");
	strcpy(tr[2].sex, "男");
	strcpy(tr[2].prof, "教授");
	tr[3].id = 1004;
	strcpy(tr[3].name, "李四");
	strcpy(tr[3].sex, "男");
	strcpy(tr[3].prof, "副教授");
	tr[4].id = 1005;
	strcpy(tr[4].name, "王梅");
	strcpy(tr[4].sex, "女");
	strcpy(tr[4].prof, "助教");
}

void InitCourseInfo() {//课程信息初始化
	cr[0].id = 5001;
	cr[0].TheoryCHour = 28;
	cr[0].ExperiCHour = 8;
	strcpy(cr[0].name, "数据结构");
	cr[1].id = 5002;
	cr[1].TheoryCHour = 24;
	cr[1].ExperiCHour = 4;
	strcpy(cr[1].name, "单片机");
	cr[2].id = 5003;
	cr[2].TheoryCHour = 30;
	cr[2].ExperiCHour = 8;
	strcpy(cr[2].name, "c语言程序设计");
	cr[3].id = 5004;
	cr[3].TheoryCHour = 26;
	cr[3].ExperiCHour = 4;
	strcpy(cr[3].name, "数据库系统");
}

菜单部分

通过参数decide传入不同的值来打印角标在不同的位置,为了实现角标移动效果,在run()函数中调用语句

system("cls");

来进行清屏处理

当键盘读取到w或↑时,对decide值进行减处理,反之加处理,当decide值越界时进行重置

void printMenu1(int decide) {
	system("cls");
	printf("\n\n\n\n\n   -------------------------------\n");
	switch (decide) {
	case 1:
		printf("       >1.从文件导入授课信息\n");
		printf("        2.授课信息录入\n");
		printf("        3.授课信息删除\n");
		printf("        4.授课教师修改\n");
		printf("        5.工作量计算\n");
		printf("        6.查询授课历史\n");
		printf("        7.授课信息导出到文件\n");
		printf("        8.退出\n");
		break;
	case 2:
		printf("        1.从文件导入授课信息\n");
		printf("       >2.授课信息录入\n");
		printf("        3.授课信息删除\n");
		printf("        4.授课教师修改\n");
		printf("        5.工作量计算\n");
		printf("        6.查询授课历史\n");
		printf("        7.授课信息导出到文件\n");
		printf("        8.退出\n");
		break;
	case 3:
		printf("        1.从文件导入授课信息\n");
		printf("        2.授课信息录入\n");
		printf("       >3.授课信息删除\n");
		printf("        4.授课教师修改\n");
		printf("        5.工作量计算\n");
		printf("        6.查询授课历史\n");
		printf("        7.授课信息导出到文件\n");
		printf("        8.退出\n");
		break;
	case 4:
		printf("        1.从文件导入授课信息\n");
		printf("        2.授课信息录入\n");
		printf("        3.授课信息删除\n");
		printf("       >4.授课教师修改\n");
		printf("        5.工作量计算\n");
		printf("        6.查询授课历史\n");
		printf("        7.授课信息导出到文件\n");
		printf("        8.退出\n");
		break;
	case 5:
		printf("        1.从文件导入授课信息\n");
		printf("        2.授课信息录入\n");
		printf("        3.授课信息删除\n");
		printf("        4.授课教师修改\n");
		printf("       >5.工作量计算\n");
		printf("        6.查询授课历史\n");
		printf("        7.授课信息导出到文件\n");
		printf("        8.退出\n");
		break;
	case 6:
		printf("        1.从文件导入授课信息\n");
		printf("        2.授课信息录入\n");
		printf("        3.授课信息删除\n");
		printf("        4.授课教师修改\n");
		printf("        5.工作量计算\n");
		printf("       >6.查询授课历史\n");
		printf("        7.授课信息导出到文件\n");
		printf("        8.退出\n");
		break;
	case 7:
		printf("        1.从文件导入授课信息\n");
		printf("        2.授课信息录入\n");
		printf("        3.授课信息删除\n");
		printf("        4.授课教师修改\n");
		printf("        5.工作量计算\n");
		printf("        6.查询授课历史\n");
		printf("       >7.授课信息导出到文件\n");
		printf("        8.退出\n");
		break;
	case 8:
		printf("        1.从文件导入授课信息\n");
		printf("        2.授课信息录入\n");
		printf("        3.授课信息删除\n");
		printf("        4.授课教师修改\n");
		printf("        5.工作量计算\n");
		printf("        6.查询授课历史\n");
		printf("        7.授课信息导出到文件\n");
		printf("       >8.退出\n");
		break;
	}
	printf("   -------------------------------\n");
	printf("   ----按w s或↑↓选择菜单选项 ---\n");
}

数据结构

将教师授课信息及工作量信息用链表进行存储。在run函数中创建头节点。当信息增加时在链表尾部进行节点增加。信息修改只需遍历链表找到对应信息位置从而修改其值即可。删除信息同理需遍历链表找到对应信息位置删除节点,使被删除节点的前驱和后继相连。

//链表定义
typedef struct Workload {
	int TheoryCHour;//课时
	int ExperiCHour;//课时
	int ClassNum;//班级数
	char term[10];
	struct Workload* next;
}Workload, * WorkList;
//存储教师授课信息
typedef struct Node {
	int tId;//教师号
	int cId;//课程编号
	char term[10];//学期
	struct Node* next;
}Node, * LinkList;

节点增加

//节点增加
void ListAdd(LinkList L, int tid, int cid, char str[]) {
	int j;
	LinkList p, s;
	p = L;
	while (p->next) {
		p = p->next;
	}
	s = (LinkList)malloc(sizeof(Node));
	s->cId = cid;
	s->tId = tid;
	strcpy(s->term, str);
	p->next = s;
	s->next = NULL;
}

链表遍历

//遍历
void TraverseList(LinkList L) {
	LinkList p, q;
	p = L->next;
	printf("教师授课历史\n\n\n");
	while (p) {
		printf("%d %d %s\n", p->cId, p->tId, p->term);
		p = p->next;
	}
	printf("\n\n\n");
}

功能实现

查询历史信息

即遍历链表输出所有授课信息,直接调用遍历函数即可

void InfoShow(LinkList L) {
	TraverseList(L);
}

从键盘录入信息

输入题目要求的教师编号,课程编号和上课学期存储到相应变量,存储成功后调用节点增加函数即可实现存储信息

void InfoInput(LinkList L) {
	int cid, tid;
	char str[10];
	printf("     信息录入:\n");
	printf("     请输入教师编号:\n");
	printf("     ");
	scanf("%d", &tid);
	printf("     请输入课程编号:\n");
	printf("     ");
	scanf("%d", &cid);
	printf("     请输入上课学期:\n");
	printf("     ");
	scanf("%s", str);
	ListAdd(L, tid, cid, str);//节点增加函数
	printf("信息录入成功!\n");
}

信息删除和修改

输入课程编号和上课学期通过遍历链表查找信息,若未找到,打印“未查到该授课信息”退出函数,若找到在对应节点位置进行信息的修改和删除。

void InfoDelete(LinkList L) {
	int cid;
	int flag = 0;
	char str[10];
	printf("     信息删除:\n");
	printf("     请输入课程编号:\n");
	printf("     ");
	scanf("%d", &cid);
	printf("     请输入上课学期:\n");
	printf("     ");
	scanf("%s", str);
	LinkList p, q;
	p = L;
	while (p->next) {
		if (p->next->cId == cid && !strcmp(p->next->term, str)) {
			flag = 1;
			break;
		}
		p = p->next;
	}
	if (!flag) {
		printf("未查到该授课信息\n");
		return;
	}
	q = p->next;
	p->next = q->next;
	free(q);//回收资源
	printf("信息删除成功!\n");
}

void InfoAlter(LinkList L) {
	int cid, tid;
	int flag = 0;
	char str[10];
	printf("     信息修改:\n");
	printf("     请输入课程编号:\n");
	printf("     ");
	scanf("%d", &cid);
	printf("     请输入上课学期:\n");
	printf("     ");
	scanf("%s", str);
	LinkList p;
	p = L;
	while (p->next) {
		if (p->next->cId == cid && !strcmp(p->next->term, str)) {
			flag = 1;
			break;
		}
		p = p->next;
	}
	if (!flag) {
		printf("未查到该授课信息\n");
		return;
	}
	p = p->next;
	printf("     当前授课信息为:\n");
	printf("     %d %d %s\n", p->cId, p->tId, p->term);
	printf("     是否修改?(y/n)\n     ");//询问是否修改
	char s;
	getchar();//吸收回车
	scanf("%c", &s);
	if (s == 'y' || s == 'Y') {
		printf("     请输入教师编号:\n");
		printf("     ");
		scanf("%d", &tid);
		printf("     请输入课程编号:\n");
		printf("     ");
		scanf("%d", &cid);
		printf("     请输入上课学期:\n");
		printf("     ");
		scanf("%s", str);
		p->tId = tid;
		p->cId = cid;
		strcpy(p->term, str);
		printf("信息修改成功!\n");
	}
	else {
		return;
	}
}

工作量计算

是这里最复杂的一个函数,需要对两个链表进行操作。首先用户输入教师编号,并传参给函数,然后遍历教师信息查到后打印。接着遍历授课信息链表查找含有该教师编号的节点,一旦找到便存储到工作量信息链表中。

如何存储到工作量信息链表中?

这里假设A教师有5次授课信息在授课信息链表中,其中1学期2次,2学期2次,3学期一次。由于工作量的计算是按照学期划分的,因此采用如下存储方式:

当第一次在授课信息链表中找到含有该教师编号的节点,直接存储到工作量信息链表中。

从第二次找到该教师编号的节点起,都遍历一次工作量信息链表,若有学期相同的节点,则不创建新节点存储工作量信息,而是和上一次存储的工作量信息进行叠加,班级数加一。

若遍历工作量信息链表后没有学期相同的节点,则再创建新节点存储。

工作量信息计算

遍历工作量信息链表,对于每一个节点的课时,班级数来分类计算结果并输出。

void WorkCalcul(LinkList L, int tid) {
	int i, flag = 0, j;
	LinkList p;
	WorkList w, s, tp;
	w = (WorkList)malloc(sizeof(Workload));
	w->next = NULL;
	s = w;
	p = L->next;
	for (i = 0; i < 5; i++) {
		if (tr[i].id == tid) {
			flag = 1;
			break;
		}
	}
	if (!flag) {
		printf("教师信息不存在:\n");
		return;
	}

	printf("教师信息:\n");
	printf("编号:%d\n", tr[i].id);
	printf("姓名:%s\n", tr[i].name);
	printf("性别:%s\n", tr[i].sex);
	printf("职称:%s\n", tr[i].prof);
	while (p) {
		if (p->tId == tid) {
			s = w;
			while (s->next) {
				if (!strcmp(s->next->term, p->term)) {
					for (i = 0; i < 4; i++) {
						if (cr[i].id == p->cId) {
							s->next->ExperiCHour += cr[i].ExperiCHour;
							s->next->TheoryCHour += cr[i].TheoryCHour;
						}
					}
					s->next->ClassNum++;
					break;
				}
				s = s->next;
			}
			if (!s->next) {
				tp = (WorkList)malloc(sizeof(Workload));
				tp->ClassNum = 1;
				strcpy(tp->term, p->term);
				for (i = 0; i < 4; i++) {
					if (cr[i].id == p->cId) {
						tp->ExperiCHour = cr[i].ExperiCHour;
						tp->TheoryCHour = cr[i].TheoryCHour;
					}
				}
				tp->next = NULL;
				s->next = tp;
			}
		}
		p = p->next;
	}
	printf("教师工作量:\n");
	s = w->next;
	while (s) {
		printf("学期:%s ", s->term);
		if (s->ClassNum <= 2) {
			printf("工作量:%.2f\n", (s->ExperiCHour + s->TheoryCHour) * 1.5);
		}
		else if (s->ClassNum == 3) {
			printf("工作量:%.2f\n", (s->ExperiCHour + s->TheoryCHour) * 2);
		}
		else {
			printf("工作量:%.2f\n", (s->ExperiCHour + s->TheoryCHour) * 2.5);
		}
		s = s->next;
	}
}

文件导入和输出

使用文件读取和写入操作,写入时直接将信息打印在txt文本中,读取时,先读取文本中字符串,再对字符串进行分解,分离出字符串中的int类型变量和字符串变量。这里注意不同的集成开发环境的编码方式不同,若和txt文本不是同一种编码方式则会出现乱码情况。

完整代码

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <conio.h>
#include <string.h>

//存储课程信息
struct Course {
	int id;//课程编号
	int TheoryCHour;//课时
	int ExperiCHour;//课时
	char name[20];//课程名称
}cr[4];
//存储教师信息
struct Teacher {
	int id;//教师号
	char name[20];//姓名
	char sex[10];//性别
	char prof[20];//职称
}tr[5];
//存储每学期工作量
typedef struct Workload {
	int TheoryCHour;//课时
	int ExperiCHour;//课时
	int ClassNum;
	char term[10];
	struct Workload* next;
}Workload, * WorkList;
//存储教师授课信息
typedef struct Node {
	int tId;//教师号
	int cId;//课程编号
	char term[10];
	struct Node* next;
}Node, * LinkList;
//节点增加
void ListAdd(LinkList L, int tid, int cid, char str[]) {
	int j;
	LinkList p, s;
	p = L;
	while (p->next) {
		p = p->next;
	}
	s = (LinkList)malloc(sizeof(Node));
	s->cId = cid;
	s->tId = tid;
	strcpy(s->term, str);
	p->next = s;
	s->next = NULL;
}
//遍历
void TraverseList(LinkList L) {
	LinkList p, q;
	p = L->next;
	printf("教师授课历史\n\n\n");
	while (p) {
		printf("%d %d %s\n", p->cId, p->tId, p->term);
		p = p->next;
	}
	printf("\n\n\n");
}

//1.从文件导入教师的授课信息
//教师编号 课程编号 上课学期
//
//7.能将授课信息导出到文件
//
//
//

void InitTeacherInfo() {
	tr[0].id = 1001;
	strcpy(tr[0].name, "艾雪");
	strcpy(tr[0].sex, "女");
	strcpy(tr[0].prof, "副教授");

	tr[1].id = 1002;
	strcpy(tr[1].name, "张三");
	strcpy(tr[1].sex, "男");
	strcpy(tr[1].prof, "讲师");
	tr[2].id = 1003;
	strcpy(tr[2].name, "罗翔");
	strcpy(tr[2].sex, "男");
	strcpy(tr[2].prof, "教授");
	tr[3].id = 1004;
	strcpy(tr[3].name, "李四");
	strcpy(tr[3].sex, "男");
	strcpy(tr[3].prof, "副教授");
	tr[4].id = 1005;
	strcpy(tr[4].name, "王梅");
	strcpy(tr[4].sex, "女");
	strcpy(tr[4].prof, "助教");
}

void InitCourseInfo() {
	cr[0].id = 5001;
	cr[0].TheoryCHour = 28;
	cr[0].ExperiCHour = 8;
	strcpy(cr[0].name, "数据结构");
	cr[1].id = 5002;
	cr[1].TheoryCHour = 24;
	cr[1].ExperiCHour = 4;
	strcpy(cr[1].name, "单片机");
	cr[2].id = 5003;
	cr[2].TheoryCHour = 30;
	cr[2].ExperiCHour = 8;
	strcpy(cr[2].name, "c语言程序设计");
	cr[3].id = 5004;
	cr[3].TheoryCHour = 26;
	cr[3].ExperiCHour = 4;
	strcpy(cr[3].name, "数据库系统");
}

void printMenu1(int decide) {
	system("cls");
	printf("\n\n\n\n\n   -------------------------------\n");
	switch (decide) {
	case 1:
		printf("       >1.从文件导入授课信息\n");
		printf("        2.授课信息录入\n");
		printf("        3.授课信息删除\n");
		printf("        4.授课教师修改\n");
		printf("        5.工作量计算\n");
		printf("        6.查询授课历史\n");
		printf("        7.授课信息导出到文件\n");
		printf("        8.退出\n");
		break;
	case 2:
		printf("        1.从文件导入授课信息\n");
		printf("       >2.授课信息录入\n");
		printf("        3.授课信息删除\n");
		printf("        4.授课教师修改\n");
		printf("        5.工作量计算\n");
		printf("        6.查询授课历史\n");
		printf("        7.授课信息导出到文件\n");
		printf("        8.退出\n");
		break;
	case 3:
		printf("        1.从文件导入授课信息\n");
		printf("        2.授课信息录入\n");
		printf("       >3.授课信息删除\n");
		printf("        4.授课教师修改\n");
		printf("        5.工作量计算\n");
		printf("        6.查询授课历史\n");
		printf("        7.授课信息导出到文件\n");
		printf("        8.退出\n");
		break;
	case 4:
		printf("        1.从文件导入授课信息\n");
		printf("        2.授课信息录入\n");
		printf("        3.授课信息删除\n");
		printf("       >4.授课教师修改\n");
		printf("        5.工作量计算\n");
		printf("        6.查询授课历史\n");
		printf("        7.授课信息导出到文件\n");
		printf("        8.退出\n");
		break;
	case 5:
		printf("        1.从文件导入授课信息\n");
		printf("        2.授课信息录入\n");
		printf("        3.授课信息删除\n");
		printf("        4.授课教师修改\n");
		printf("       >5.工作量计算\n");
		printf("        6.查询授课历史\n");
		printf("        7.授课信息导出到文件\n");
		printf("        8.退出\n");
		break;
	case 6:
		printf("        1.从文件导入授课信息\n");
		printf("        2.授课信息录入\n");
		printf("        3.授课信息删除\n");
		printf("        4.授课教师修改\n");
		printf("        5.工作量计算\n");
		printf("       >6.查询授课历史\n");
		printf("        7.授课信息导出到文件\n");
		printf("        8.退出\n");
		break;
	case 7:
		printf("        1.从文件导入授课信息\n");
		printf("        2.授课信息录入\n");
		printf("        3.授课信息删除\n");
		printf("        4.授课教师修改\n");
		printf("        5.工作量计算\n");
		printf("        6.查询授课历史\n");
		printf("       >7.授课信息导出到文件\n");
		printf("        8.退出\n");
		break;
	case 8:
		printf("        1.从文件导入授课信息\n");
		printf("        2.授课信息录入\n");
		printf("        3.授课信息删除\n");
		printf("        4.授课教师修改\n");
		printf("        5.工作量计算\n");
		printf("        6.查询授课历史\n");
		printf("        7.授课信息导出到文件\n");
		printf("       >8.退出\n");
		break;
	}
	printf("   -------------------------------\n");
	printf("   ----按w s或↑↓选择菜单选项 ---\n");
}

void InfoInput(LinkList L) {
	int cid, tid;
	char str[10];
	printf("     信息录入:\n");
	printf("     请输入教师编号:\n");
	printf("     ");
	scanf("%d", &tid);
	printf("     请输入课程编号:\n");
	printf("     ");
	scanf("%d", &cid);
	printf("     请输入上课学期:\n");
	printf("     ");
	scanf("%s", str);
	ListAdd(L, tid, cid, str);
	printf("信息录入成功!\n");
}

void InfoDelete(LinkList L) {
	int cid;
	int flag = 0;
	char str[10];
	printf("     信息删除:\n");
	printf("     请输入课程编号:\n");
	printf("     ");
	scanf("%d", &cid);
	printf("     请输入上课学期:\n");
	printf("     ");
	scanf("%s", str);
	LinkList p, q;
	p = L;
	while (p->next) {
		if (p->next->cId == cid && !strcmp(p->next->term, str)) {
			flag = 1;
			break;
		}
		p = p->next;
	}
	if (!flag) {
		printf("未查到该授课信息\n");
		return;
	}
	q = p->next;
	p->next = q->next;
	free(q);//回收资源
	printf("信息删除成功!\n");
}

void InfoAlter(LinkList L) {
	int cid, tid;
	int flag = 0;
	char str[10];
	printf("     信息修改:\n");
	printf("     请输入课程编号:\n");
	printf("     ");
	scanf("%d", &cid);
	printf("     请输入上课学期:\n");
	printf("     ");
	scanf("%s", str);
	LinkList p;
	p = L;
	while (p->next) {
		if (p->next->cId == cid && !strcmp(p->next->term, str)) {
			flag = 1;
			break;
		}
		p = p->next;
	}
	if (!flag) {
		printf("未查到该授课信息\n");
		return;
	}
	p = p->next;
	printf("     当前授课信息为:\n");
	printf("     %d %d %s\n", p->cId, p->tId, p->term);
	printf("     是否修改?(y/n)\n     ");
	char s;
	getchar();//吸收回车
	scanf("%c", &s);
	if (s == 'y' || s == 'Y') {
		printf("     请输入教师编号:\n");
		printf("     ");
		scanf("%d", &tid);
		printf("     请输入课程编号:\n");
		printf("     ");
		scanf("%d", &cid);
		printf("     请输入上课学期:\n");
		printf("     ");
		scanf("%s", str);
		p->tId = tid;
		p->cId = cid;
		strcpy(p->term, str);
		printf("信息修改成功!\n");
	}
	else {
		return;
	}
}

void InfoShow(LinkList L) {
	TraverseList(L);
}

void WorkCalcul(LinkList L, int tid) {
	int i, flag = 0, j;
	LinkList p;
	WorkList w, s, tp;
	w = (WorkList)malloc(sizeof(Workload));
	w->next = NULL;
	s = w;
	p = L->next;
	for (i = 0; i < 5; i++) {
		if (tr[i].id == tid) {
			flag = 1;
			break;
		}
	}
	if (!flag) {
		printf("教师信息不存在:\n");
		return;
	}

	printf("教师信息:\n");
	printf("编号:%d\n", tr[i].id);
	printf("姓名:%s\n", tr[i].name);
	printf("性别:%s\n", tr[i].sex);
	printf("职称:%s\n", tr[i].prof);
	while (p) {
		if (p->tId == tid) {
			s = w;
			while (s->next) {
				if (!strcmp(s->next->term, p->term)) {
					for (i = 0; i < 4; i++) {
						if (cr[i].id == p->cId) {
							s->next->ExperiCHour += cr[i].ExperiCHour;
							s->next->TheoryCHour += cr[i].TheoryCHour;
						}
					}
					s->next->ClassNum++;
					break;
				}
				s = s->next;
			}
			if (!s->next) {
				tp = (WorkList)malloc(sizeof(Workload));
				tp->ClassNum = 1;
				strcpy(tp->term, p->term);
				for (i = 0; i < 4; i++) {
					if (cr[i].id == p->cId) {
						tp->ExperiCHour = cr[i].ExperiCHour;
						tp->TheoryCHour = cr[i].TheoryCHour;
					}
				}
				tp->next = NULL;
				s->next = tp;
			}
		}
		p = p->next;
	}
	printf("教师工作量:\n");
	s = w->next;
	while (s) {
		printf("学期:%s ", s->term);
		if (s->ClassNum <= 2) {
			printf("工作量:%.2f\n", (s->ExperiCHour + s->TheoryCHour) * 1.5);
		}
		else if (s->ClassNum == 3) {
			printf("工作量:%.2f\n", (s->ExperiCHour + s->TheoryCHour) * 2);
		}
		else {
			printf("工作量:%.2f\n", (s->ExperiCHour + s->TheoryCHour) * 2.5);
		}
		s = s->next;
	}
}

void run() {
	char keyIn;
	int decide = 1;
	LinkList L;
	L = (LinkList)malloc(sizeof(Node));
	L->next = NULL;
begin:
	printMenu1(decide);
	while (1) {
		keyIn = _getch();
		if (keyIn == 13) {
			break;//回车检测
		}
		switch (keyIn)
		{
		case 'w':
		case 'W':
		case 72:
			decide--;
			break;
		case 's':
		case 'S':
		case 80:
			decide++;
			break;
		default:
			break;
		}
		if (decide > 8) {
			decide = 1;
		}
		else if (decide < 1) {
			decide = 8;
		}
		printMenu1(decide);
	}
	if (decide == 1) {//1.从文件导入授课信息
		system("cls");
		int tid = 0, cid = 0;
        int flag = 0;
        char term[10];

        FILE* p;
        char ch;
        char str[10005];//用来存储txt文件中的字符串
        int i, num[256] = { 0 };
        if ((p = fopen("D:\\test.txt", "r")) == NULL)  //以只读的方式打开test。
        {
            printf("ERROR");
        }
        int k = 0;
        for (; ch != '\n';)
        {
            ch = fgetc(p);   //ch得到p所指文件中的每一个字符
            if (ch != 32) {
                str[k] = ch;
                k++;
            }
            else {
                int j = 0;
                for (j = 0; str[j] != '\0'; j++) {
                    if (!flag)
                        tid = tid * 10 + str[j] - '0';
                    else
                        cid = cid * 10 + str[j] - '0';
                }
                k = 0;
                flag = 1;
            }
        }
        strcpy(term, str);
        printf("\n%d %d %s\n", tid, cid, str);
        ListAdd(L, tid, cid, str);
        printf("从文件录入信息录入成功!\n");
        fclose(p);	//关闭文件
		printf("按任意键返回上一级");
		getch();
		goto begin;
	}
	else if (decide == 2) {//2.授课信息录入
		system("cls");
		InfoInput(L);
		printf("按任意键返回上一级");
		getch();
		system("cls");
		goto begin;
	}
	else if (decide == 3) {//3.授课信息删除
		system("cls");
		InfoDelete(L);
		printf("按任意键返回上一级");
		getch();
		goto begin;
	}
	else if (decide == 4) {//4.授课教师修改
		system("cls");
		InfoAlter(L);
		printf("按任意键返回上一级");
		getch();
		goto begin;
	}
	else if (decide == 5) {//5.工作量计算
		system("cls");
		int id;
		printf("请输入教师编号:\n");
		scanf("%d", &id);
		WorkCalcul(L, id);
		printf("按任意键返回上一级");
		getch();
		goto begin;
	}
	else if (decide == 6) {//6.查询授课历史
		system("cls");
		InfoShow(L);
		printf("按任意键返回上一级");
		getch();
		goto begin;
	}
	else if (decide == 7) {//7.授课信息导出到文件
		system("cls");
		FILE* f;
		f = fopen("D:\\info.txt", "w");//导入文件路径
		if (f != NULL)
		{
			LinkList p, q;
			p = L->next;
			fputs("教师授课信息:\n", f);
			while (p) {
				fprintf(f, "%d %d %s\n", p->cId, p->tId, p->term);
				p = p->next;
			}
			fclose(f);
			f = NULL;
		}
		printf("授课信息已导出到文件D:\\info.txt\n");
		printf("按任意键返回上一级");
		getch();
		goto begin;
	}
	else if (decide == 8) {//退出
		system("cls");
		printf("\n\n\n\n\n   -------------------------------\n");
		printf("\n\n\n\n               Bye~\n\n\n\n\n");
		printf("   -------------------------------\n\n\n\n\n\n");
	}


}

int main() {
	InitTeacherInfo();//教师信息初始化
	InitCourseInfo();//课程信息初始化
	run();

	return 0;
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/11307.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Bootstrap响应式轮播效果网页(1+X Web前端开发中级 例题)

文章目录 &#x1f4c4;题目要求 &#x1f9e9;说明 &#x1f9e9;效果图 &#x1f4bb;HTML代码 &#x1f3af;实现效果 &#x1f4f0;完整答案 &#x1f4c4;题目要求 阅读下列说明、效果图和HTML代码&#xff0c;进行静态网页开发&#xff0c;填写&#xff08;1&…

springboot12总结篇(9 10 11)

1.视图解析 以重定向为例 如果返回字符串 则会调用视图解析器thymeleafResolver判断返回值为普通字符串&#xff0c;返回thymeleafView调用其render方法&#xff0c;拼接直接访问 2.异常处理 404 ControllerAdvie 处理异常类 ExceptionHandler ControllerAdvie 处理异常类…

适配器模式

思考适配器模式 适配器模式通过转换已有的接口&#xff0c;达成目标需要的接口 适配器模式还可以将多种差异化接口适配成同一接口做统一输出 1.适配器模式的本质 适配器模式的本质是:转换匹配,复用功能。 适配器通过转换调用已有的实现&#xff0c;从而能把已有的实现匹配成需要…

【Spring】——4、使用@Scope注解设置组件的作用域

&#x1f4eb;作者简介&#xff1a;zhz小白 公众号&#xff1a;小白的Java进阶之路 专业技能&#xff1a; 1、Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理 2、熟悉Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理&#xff0c;具备⼀定的线…

VCED:学习Jina的简单操作

文章目录VCED:学习Jina的简单操作在pycharm里连接docker环境几个简单的jina demoimagetextvideoVCED:学习Jina的简单操作 在pycharm里连接docker环境 在pycharm里找到docker环境 New一个环境 在docker里进入terminal&#xff0c;找到python 位置 成功得到decker环境 运行jina…

004_步进电机实验

步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。本章主要从步进电机的结构、工作原理、电机参数分别介绍&#xff0c;最后通过实验来实现步进电机运动的简单控制。本章所要实现的功能是&#xff1a;通过 ULN2003 驱动模块控制 28BYJ48 步进电机运行方向及速度&…

bugku-web-社工-初步收集

题目首页 社工又有杂项的存在 打开题目 小时候可能特感兴趣的网站 目录扫描一下 dirsearch 得到一个管理员后台登录网站 但是需要密码 再回到起始页面 存在一个下载点 可以操作 下载得到一个压缩包 解压打开 是一个小插件 尝试登录 同时 打开wireshark进行流量截取…

Nacos安装指南

Nacos安装指南 1.Windows安装 开发阶段采用单机安装即可。 1.1.下载安装包 在Nacos的GitHub页面&#xff0c;提供有下载链接&#xff0c;可以下载编译好的Nacos服务端或者源代码&#xff1a; GitHub主页&#xff1a;https://github.com/alibaba/nacos GitHub的Release下载…

Monaco Editor教程(十六):缩略图minimap的配置详解

背景 缩略图 (Minimap) 是一种常见的用于快速预览和探索的工具&#xff0c;可作为导航辅助用户探索大规模图。 在大文件的阅读和编辑中&#xff0c;能够起到很好的导航作用&#xff0c;并且缩略图能够显示文件结构的大致轮廓&#xff0c;使开发人员能够快速知道对应的编辑位置…

WordPress重新安装的几种方法(2022年新版教程)

我们在建网站的过程中&#xff0c;可能出于某些原因会把网站重装&#xff0c;例如网站中病毒了、网站做的不满意&#xff0c;重头开始。本文会给大家分享一下2022年可行的重装WordPress网站方法。 1 重装WordPress的方法 方法一&#xff1a;重置数据库 方法二&#xff1a;宝塔面…

【MySQL】MySQL基础、详细总结

数据库Mysql 内容管理数据库基础什么是DB、DBMS、DBS、DBA&#xff1f;什么是元组、码、候选码、主、外码&#xff08;键&#xff09;、&#xff08;非&#xff09;主属性&#xff1f;主、外码的区别&#xff1f;为什么不推荐使用外码和级联 &#xff1f;【分布式高并发】什么是…

Servlet规范之部署描述符

Deployment Descriptor 文章是对 JSR-000340 JavaTM Servlet 3.1 Final Release的Java™ Servlet规范的翻译&#xff0c;尚未校准 文章目录Deployment Descriptor部署描述符元素部署描述符的处理规则部署描述符部署描述符示意图web-app元素description Elementdisplay-name Ele…

从零开始学前端:json对象,冒泡排序 --- 今天你学习了吗?(JS:Day15)

从零开始学前端&#xff1a;程序猿小白也可以完全掌握&#xff01;—今天你学习了吗&#xff1f;&#xff08;JS&#xff09; 复习&#xff1a;从零开始学前端&#xff1a;字符串、数组的方法 — 今天你学习了吗&#xff1f;&#xff08;JS&#xff1a;Day12/13/14&#xff09…

范式建模维度建模 及结合BW的一些理解

用了几年BW了&#xff0c;时不时会想&#xff0c;BW为什么要这么设计啊&#xff0c;有时候用的可真麻烦&#xff0c;最近研究了下两种常见的建模理论&#xff0c;有了自己的一点感悟&#xff0c;我们从头开始,有很多资料是从大佬那里摘录的&#xff0c;就不一一列举了 一、范式…

DOPA-PEG-azide,Dopamine-PEG-N3,多巴胺PEG叠氮用于点击化学

多巴胺-聚乙二醇-叠氮&#xff08;DOPA-PEG-azide&#xff0c;Dopamine-PEG-N3&#xff09;该试剂具有更好的水溶性&#xff0c;它所属分类为Azide PEG Dopamine PEG。 peg试剂的分子量均可定制&#xff0c;有&#xff1a;2k、5k、3.4k、10k、20k、1k 。其质量控制为95%&#…

基于Matlab模拟用于天气观测的极化雷达回波(附源码)

目录 一、雷达定义 二、天线方向图 四、雷达脉冲合成 五、天气雷达力矩估计 六、仿真结果 6.1反射率 6.2 径向速度 6.3 频谱宽度 6.4 差分反射率 6.5 相关系数 6.6 差分相位 七、总结 八、程序 本示例展示了如何模拟满足天气观测要求的极化多普勒雷达回波。雷达在天…

柯桥增值税留抵如何退税?

今年&#xff0c;国家税务总局出台了“增值税期末留底退税”政策&#xff0c;这无疑对一些现金流缺乏的企业又是一重大利好呀&#xff01; 那么问题来了&#xff0c;咱们会计该如何操作领回这一部分钱呢&#xff1f; 接下来跟着豆哥一块儿操作退税吧~ 政策解读 重点提醒&…

驱动——LED灯循环闪烁

使用结构体形式对寄存器地址进行映射&#xff0c;实现3盏LED灯的循环点亮 1、创建LED灯点亮所需要的GPIO寄存器的结构体&#xff0c;并对寄存器地址进行宏定义 2、①通过ioremap函数将物理地址映射为虚拟地址 void* ioremap(phys_addr_t offset, size_t size) 函数功能&…

Mysql主从复制出现connecting

主从同步时出现Slave_IO_Running&#xff1a;Connecting首先解决Slave_IO_Running和Slave_SQL_Running是no的问题&#xff0c;原因是一台虚拟机是由另一台虚拟机复制过来的&#xff0c;就会导致uuid是一样的&#xff0c;需要先修改server的uuid&#xff0c;具体请查阅相关资料。…

【FME实战教程】001:FME2020中文安装图文教程(附安装包下载)

文章目录1. 安装license2. 安装FME Desktop3. 安装中文语言4. FME软件下载地址1. 安装license 打开软件安装包中的fme-flexnet-win-x64.msi&#xff0c;如下图所示&#xff1a; 点击Next。 点击Next。 单击install。 点击finish&#xff0c;完成。 &#xff08;1&#xff09;修…