diff --git a/main.c b/main.c index cff913b..99885c4 100644 --- a/main.c +++ b/main.c @@ -17,19 +17,19 @@ typedef struct AbRecord{ int Type; //缺课类型:迟到,早退,旷课,请假 struct AbRecord *next; //指向下一个节点的指针 }Record; -int LEN = sizeof(struct AbRecord); //结构体大小 - -void AddStu(Record *head); //录入学生缺课信息 -void ChangeStu(Record *head); //修改学生缺课信息 -void LookupStu(Record *head); //查找某个学生缺课记录 -void CountStuRecord(Record suit[100], int m); //统计某段时间旷课的学生 -void CountClassRecord(Record suit[100], int m); //统计某段时间有学生旷课的课程 -void gotoxy(int x, int y); //设置光标 -void ShowRecord(Record *p); //显示记录 -Record* Fread(); //将文件信息写进链表 -void Fwrite(Record* head); //将链表写入文件 -void SuitTime(Record *head, char ch); //符合条件时间段的记录 +int LEN = sizeof(struct AbRecord); //结构体大小 +void AddStu(Record *head); //录入学生缺课信息 +void ChangeStu(Record *head); //修改学生缺课信息 +void LookupStu(Record *head); //查找某个学生缺课记录 +void DeleteStu(Record *head); +void CountStuRecord(Record suit[100], int m); //统计某段时间旷课的学生 +void CountClassRecord(Record suit[100], int m); //统计某段时间有学生旷课的课程 +void gotoxy(int x, int y); //设置光标 +void ShowRecord(Record *p); //显示记录 +Record* Fread(); //将文件信息写进链表 +void Fwrite(Record* head); //将链表写入文件 +void SuitTime(Record *head, char ch); //符合条件时间段的记录 int main() { //创建相关文件 @@ -47,14 +47,15 @@ int main() printf("\t\t\t\t\t --------【1】录入缺课信息-----------\n\n"); printf("\t\t\t\t\t --------【2】修改缺课信息-----------\n\n"); printf("\t\t\t\t\t --------【3】查询缺课记录-----------\n\n"); - printf("\t\t\t\t\t --------【4】学生缺课情况-----------\n\n"); - printf("\t\t\t\t\t --------【5】课程缺课情况-----------\n\n"); + printf("\t\t\t\t\t --------【4】删除缺课记录-----------\n\n"); + printf("\t\t\t\t\t --------【5】学生缺课情况-----------\n\n"); + printf("\t\t\t\t\t --------【6】课程缺课情况-----------\n\n"); printf("\t\t\t\t\t --------【0】退出系统----------------\n\n"); printf("\t\t\t\t\t■--------考--勤--管--理--系--统---------■\n\n\n"); printf("\t\t\t\t\t\t\t【 】"); //获取用户选择 - gotoxy(_X+24, _Y+16); + gotoxy(_X+24, _Y+18); fflush(stdin); char ch = getch(); @@ -72,17 +73,21 @@ int main() case '3' : LookupStu(head); break; - case '4': - SuitTime(head, ch); + case '4' : + DeleteStu(head); break; case '5': SuitTime(head, ch); break; + case '6': + SuitTime(head, ch); + break; } } return 0; } -void gotoxy(int x, int y) //设置光标 +//设置光标 +void gotoxy(int x, int y) { HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); COORD pos; @@ -90,12 +95,57 @@ void gotoxy(int x, int y) // pos.Y = y; SetConsoleCursorPosition(handle, pos); } +//将文件数据写入链表 +Record* Fread() +{ + Record *head =NULL, *last, *p; + + FILE *fa; + if((fa = fopen("record.txt", "r")) == NULL) + printf("创建文件失败"); + while(!feof(fa)) + { + if((p = (Record*)malloc(LEN)) == NULL) + printf("申请内存出错!"); + + if(fread(p, LEN, 1, fa) == 1) + { + if(head == NULL) + { + head = p; + last = p; + } + else{ + last->next = p; + last = p; + last->next = NULL; + } + } + } + fclose(fa); + return head; +} +//数据存盘 +void Fwrite(Record* head) +{ + Record *p; + + FILE *fb; + if((fb = fopen("record.txt", "w")) == NULL) + printf("创建文件失败"); + for(p=head; p; p=p->next) + { + if(fwrite(p, LEN, 1, fb) != 1) + printf("写入文件错误!"); + } + fclose(fb); +} //录入学生缺课记录 void AddStu(Record *head) { while(1) { - char ch1; //确认是否继续循环 + char ch1; //确认是否继续循环 system("cls"); printf("\n\t\t\t\t\t\t录入学生缺课信息"); printf("\n\n\n\t\t\t\t学生姓名:"); @@ -112,14 +162,40 @@ void AddStu(Record *head) printf("\n\n\t\t\t\t 【 】"); printf("\n\n\t\t\t\t【0】取消录入返回菜单 【其他键】确认录入"); - //输入缺课信息 + //************************************输入缺课信息*************************** Record *p = (Record*)malloc(LEN), *q = head; //增加一个新节点 - gotoxy(_X+7, _Y-1); scanf("%s", p->StuName); - gotoxy(_X+7, _Y+2); scanf("%d", &p->Y); - gotoxy(_X+16, _Y+2); scanf("%d", &p->M); - gotoxy(_X+24, _Y+2); scanf("%d", &p->D); - gotoxy(_X+7, _Y+5); scanf("%s", p->LNum); - gotoxy(_X+7, _Y+8); scanf("%s", p->LName); + gotoxy(_X+7, _Y-1); scanf("%s", p->StuName); //姓名 + gotoxy(_X+7, _Y+2); scanf("%d", &p->Y); //年 + while(1) + { + gotoxy(_X+16, _Y+2); scanf("%d", &p->M); //月 + if(p->M>0 && p->M<13) + { + printf("\t\t\t\t\t\t\t\t\t\t\t "); + break; + } + else{ + printf("\t\t\t\t\t\t\t\t\t\t\t月份输入有误!"); + gotoxy(_X+16, _Y+2); printf(" "); + } + } + while(1) + { + gotoxy(_X+24, _Y+2); scanf("%d", &p->D); //日 + if(p->D>0 && p->D<32) + { + printf("\t\t\t\t\t\t\t\t\t\t\t "); + break; + } + else + { + printf("\t\t\t\t\t\t\t\t\t\t\t日份输入有误!"); + gotoxy(_X+24, _Y+2); printf(" "); + } + + } + gotoxy(_X+7, _Y+5); scanf("%s", p->LNum); //课程节次 + gotoxy(_X+7, _Y+8); scanf("%s", p->LName); //课程名称 while(1) { gotoxy(_X+14, _Y+11); char typee = getch(); //选择缺课类型 @@ -144,16 +220,16 @@ void AddStu(Record *head) q = q->next; } q->next = p; - q=p; //接上新节点 + q=p; //接上新节点 q->next = NULL; } - Fwrite(head); - system("cls"); - ShowRecord(p); - printf("\n\t\t\t\t信息录入成功........【1】继续录入信息 任意键返回菜单"); - gotoxy(_X+18, _Y+16); ch1 = getch(); + Fwrite(head); + system("cls"); + ShowRecord(p); + printf("\n\t\t\t\t信息录入成功........【1】继续录入信息 任意键返回菜单"); + gotoxy(_X+18, _Y+16); ch1 = getch(); } - if(ch1 != '1') + if(ch1 != '1') //确认是否继续循环 return; } } @@ -196,7 +272,8 @@ void ChangeStu(Record *head) printf("\n\n\t【1】学生姓名 【2】缺课日期 【3】缺课节次 【4】科目名称 【5】缺课类型 【0】返回菜单"); gotoxy(_X+18, _Y+13); char ch = getch(); //选择修改的项目 gotoxy(_X+18, _Y+13); printf("%c", ch); - //输入修改的信息 + + //*********************输入修改的信息********************* switch(ch) { @@ -248,8 +325,8 @@ void ChangeStu(Record *head) } } } - else{ - printf("该学生有%d条缺课记录", num); + else{ //无该学生的记录 + printf("\n\t\t\t\t\t该学生有%d条缺课记录", num); printf("\n\n\t\t\t\t【任意键】并返回菜单........ "); getch(); } @@ -284,51 +361,6 @@ void ShowRecord(Record *p) printf("\n\t\t\t\t\t  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄"); return; } -//将文件数据写入链表 -Record* Fread() -{ - Record *head =NULL, *last, *p; - - FILE *fa; - if((fa = fopen("record.txt", "r")) == NULL) - printf("创建文件失败"); - while(!feof(fa)) - { - if((p = (Record*)malloc(LEN)) == NULL) - printf("申请内存出错!"); - - if(fread(p, LEN, 1, fa) == 1) - { - if(head == NULL) - { - head = p; - last = p; - } - else{ - last->next = p; - last = p; - last->next = NULL; - } - } - } - fclose(fa); - return head; -} -//数据存盘 -void Fwrite(Record* head) -{ - Record *p; - - FILE *fb; - if((fb = fopen("record.txt", "w")) == NULL) - printf("创建文件失败"); - for(p=head; p; p=p->next) - { - if(fwrite(p, LEN, 1, fb) != 1) - printf("写入文件错误!"); - } - fclose(fb); -} //查询学生记录 void LookupStu(Record *head) { @@ -336,7 +368,7 @@ void LookupStu(Record *head) { char stuName[25]; system("cls"); - printf("\n\t\t\t\t\t\t修改学生缺课信息"); + printf("\n\t\t\t\t\t\t查询学生缺课信息"); printf("\n\n\t\t\t\t输入学生姓名:"); printf("\n\t\t\t\t\t  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄"); gotoxy(_X+11, _Y-2); scanf("%s", stuName); @@ -347,8 +379,8 @@ void LookupStu(Record *head) { if(strcmp(q->StuName, stuName) == 0) { - key =1; - printf("\n\t\t\t\t*********************************************************************"); + key++; + printf("\n\t\t\t\t***************************第%d条****************************", key); ShowRecord(q); } } @@ -362,6 +394,76 @@ void LookupStu(Record *head) return; } } +//删除学生记录 +void DeleteStu(Record *head) +{ + char ch1; //确认是否删除 + char stuName[25]; + system("cls"); + printf("\n\t\t\t\t\t\t修改学生缺课信息"); + printf("\n\n\t\t\t\t输入学生姓名:"); + printf("\n\t\t\t\t\t  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄"); + gotoxy(_X+11, _Y-2); scanf("%s", stuName); + + Record *q, *p; + int num=0, count=0; //该学生缺课记录有多少条 + + for(q=head; q; q=q->next) + if(strcmp(q->StuName, stuName) == 0) + { + num++; + printf("\n\t\t\t\t******************第%d条******************", num); //找到记录并输出 + ShowRecord(q); + } + if(num>0) + { + printf("\n\t\t\t\t输入您要修改该学生缺课条次:"); + char No = getch(); + for(q=head; q; q = q->next) //查找目标人名 + { + if(strcmp(q->StuName, stuName) == 0) + { + count++; + if(count == No-'0') //找到该节点 + { + system("cls"); + ShowRecord(q); + printf("\n\t\t\t\t【0】取消并返回菜单 ,其它键确认删除........"); + ch1 = getch(); + if(q == head) //要删除节点在头 + { + printf("*******************头"); + head = q->next; + free(q); + break; + } + if(q->next == NULL) //要删除节点在尾 + { + printf("***************尾巴"); + p->next =NULL; + free(q); + break; + } + p->next = q->next; + free(q); + break; + } + } + p = q; + } + if(ch1!='0') + { + Fwrite(head); //保存修改后链表到文件 + printf("\n\t\t\t\t删除成功! 任意键返回.........."); + getch(); + } + } + else{ + printf("\n\t\t\t\t\t该学生有%d条缺课记录", num); //没找到要删除的信息 + printf("\n\n\t\t\t\t【任意键】并返回菜单........ "); + getch(); + } +} //统计某段时间旷课的学生, void SuitTime(Record *head, char ch) { @@ -408,9 +510,9 @@ void SuitTime(Record *head, char ch) } } } - if(ch == '4') - CountStuRecord(suit, m); if(ch == '5') + CountStuRecord(suit, m); + if(ch == '6') CountClassRecord(suit, m); } //按照学生旷课次数排序