
将课程信息、教师信息分别用结构体数组进行存储
//存储课程信息
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
#include
#include
#include
#include //存储课程信息
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';elsecid = 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;
}
上一篇:关于情感的句子