学委作业管理系统
问题描述:
为了方便学委发布作业信息和记录收作业的情况,设计一个学委作业管理系统。要求可以记录作业的基本信息(作业编号,课程名称,作业次数,作业内容,布置时间,提交截止时间,备注……),记录每个同学的作业提交情况(班级,学号,作业编号,提交时间,备注……)。管理员可以管理班级、角色(学委和学生),学委可以管理作业和作业提交情况,学生可以查看作业和自己的作业提交情况。
基本功能要求:
系统中的作业列表、作业提交情况列表、学生列表等都必须采用所学过的一种数据结构(链表、栈、队列、树等)存储,不能全部只使用数组。所有功能的操作是对数据结构(数组或链表等)中的数据进行操作。
每一个功能模块需要划分多个子模块,使用各自不同的结构体来储存不同的信息,实现信息的添加、删除、查询、修改、排序等操作。其他信息根据功能需求可以自行设计。
(1)管理员对班级和班级学生的增删改查功能,管理员设置角色(学委/学生),每个班只有一个学委。
(2)学委和学生的登录功能,需要输入正确的密码登录。
(3)学委对作业的增删改,查询所有作业列表,按时间范围查询作业,按课程查询作业,按时间的升序或降序排列显示。
(4)学委对作业提交情况的增删改,查询学生的所有作业提交列表,按时间范围查询作业提交列表,按课程查询作业提交情况,查询某同学的作业提交情况,按时间、提交次数等的升序或降序排列显示。
(5)学生查看作业,学生查看本人的作业提交情况。
扩展功能要求:
(1)统计各课程的作业提交情况,统计各学生的作业提交情况。
运行文件对各种信息进行合理的保存和读取。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define ADMIN_PASSWORD "123456"//学委密码
typedef struct HomeWork
{
int no;//作业编号
char cname[20];//课程名
char data[100];//作业内容
int time[3];//布置作业时间 年月日
int dline[3];//截止时间 年月日
char more[100];//备注
}HomeWork;
typedef struct Record
{
char num[10];//班级
char no[20];//学号
int homeworkno;//作业编号
char cname[20];//课程名
int time[3];//提交时间
char more[100];//备注
}Record;
typedef struct Stu
{
char no[20];//学号
char num[10];//班级
char name[20];//姓名
char password[20];//密码
}Stu;
typedef struct List
{
struct Stu stu;
struct List* next;
}List;
int Login_Menu()
{
int choice;
system("cls");
printf("1:学生登录\n");
printf("2:学委登录\n");
printf("0:退出\n");
printf("请输入选择:");
scanf("%d",&choice);
return choice;
}
List* Load_Student_File()
{
List* head,* p;
Stu temp;
FILE* fp = fopen("student.data","r+");
head = (List*)malloc(sizeof(List));
head->next=NULL;
if(!fp) return head;//返回头指针
while(fread(&temp,sizeof(Stu),1,fp))
{
p=(List*)malloc(sizeof(List));
p->stu=temp;
p->next=head->next;
head->next=p;
}
fclose(fp);
return head;
}
void Save_Student_File(List* head)
{
List* p=head->next;
FILE* fp = fopen("student.data","w+");
if(fp==NULL)return ;
while(p)
{
fwrite(&p->stu,sizeof(Stu),1,fp);
p=p->next;
}
fclose(fp);
}
void Del_List(List* head)
{
List* p=head->next,*q;
while(p)
{
q=p;
p=p->next;
free(q);
}
}
int Load_Work_File(HomeWork work[])
{
int n=0;
FILE* fp=fopen("HomeWork.data","r+");
if(fp==NULL)return 0;
while(fread(&work[n],sizeof(HomeWork),1,fp))
{
n++;
}
fclose(fp);
return n;
}
void Save_Work_File(HomeWork work[],int n)
{
int i=0;
FILE* fp=fopen("HomeWork.data","w+");
if(fp==NULL)return ;
for(i=0;i<n;i++)
{
fwrite(&work[i],sizeof(HomeWork),1,fp);
}
fclose(fp);
}
void Print_HomeWork(HomeWork work[],int n)
{
int i;
system("cls");
printf("%-10s%-20s%-30s%-10s %-10s %-10s\n","作业编号","课程名","内容","布置时间","截止时间","备注");
for(i=0;i<n;i++)
{
printf("%-10d%-20s%-30s",work[i].no,work[i].cname,work[i].data);
printf("%-4d%-2d%-4d %-4d%-2d%-4d %-10s\n",work[i].time[0],work[i].time[1],work[i].time[2],work[i].dline[0],work[i].dline[1],work[i].dline[2],work[i].more);
}
system("pause");
}
void Save_Record_File(Record rec[],int n)
{
int i=0;
FILE* fp=fopen("Record.data","w+");
if(fp==NULL)return ;
for(i=0;i<n;i++)
{
fwrite(&rec[i],sizeof(Record),1,fp);
}
fclose(fp);
}
int Load_Record_File(Record rec[])
{
int n=0;
FILE* fp=fopen("Record.data","r+");
if(fp==NULL)return 0;
while(fread(&rec[n],sizeof(Record),1,fp))
{
n++;
}
fclose(fp);
return n;
}
void Print_Record(Record work[],int n)
{
int i;
system("cls");
printf("%-10s%-20s%-20s%-20s%-10s%-10s\n","班级","学号","作业编号","课程名","提交时间","备注");
for(i=0;i<n;i++)
{
printf("%-10s%-20s%-20d%-20s",work[i].num,work[i].no,work[i].homeworkno,work[i].cname);
printf("%-4d%-2d%-4d%-10s\n",work[i].time[0],work[i].time[1],work[i].time[2],work[i].more);
}
system("pause");
}
void Print_Record_Stu(Record work[],int n,Stu stu)
{
int i;
system("cls");
printf("%-10s%-20s%-20s%-20s%-10s%-10s\n","班级","学号","作业编号","课程名","提交时间","备注");
for(i=0;i<n;i++)
{
if(!strcmp(work[i].no,stu.no))
{
printf("%-10s%-20s%-20d%-20s",work[i].num,work[i].no,work[i].homeworkno,work[i].cname);
printf("%-4d%-2d%-4d%-10s\n",work[i].time[0],work[i].time[1],work[i].time[2],work[i].more);
}
}
system("pause");
}
void Student_Menu(Stu stu)
{
int choice;
HomeWork work[100];
Record rec[100];
int num=Load_Work_File(work);
int num2=Load_Record_File(rec);
do
{
system("cls");
printf("1:查看作业\n");
printf("2:查看提交记录\n");
printf("0:返回\n");
printf("请输入选择:");
scanf("%d",&choice);
switch(choice)
{
case 1:
Print_HomeWork(work,num);
break;
case 2:
Print_Record_Stu(rec,num2,stu);
break;
}
}while(choice!=0);
}
void Login_Student()
{
char no[100];
char pass[100];
List* head = Load_Student_File();
List* p;
system("cls");
printf("请输入学号:");
scanf("%s",no);
printf("请输入密码:");
scanf("%s",pass);
p=head->next;
while(p)
{
if(!strcmp(p->stu.no,no) && !strcmp(p->stu.password,pass))
{
printf("登录成功!\n");
system("pause");
Student_Menu(p->stu);
return;
}
p=p->next;
}
printf("学号或密码错误!登录失败!\n");
system("pause");
Del_List(head);
}
List* Add_Student(List* head)
{
Stu temp;
List* p;
system("cls");
printf("请输入学生姓名:");
scanf("%s",temp.name);
printf("请输入学生学号:");
scanf("%s",temp.no);
printf("请输入学生班级:");
scanf("%s",temp.num);
printf("请输入学生密码:");
scanf("%s",temp.password);
p=(List*)malloc(sizeof(List));
p->stu=temp;
p->next=head->next;
head->next=p;
return head;
}
void Find_Student(List* head)
{
char no[100];
List* p=head->next;
system("cls");
printf("请输入要查询的学号:");
scanf("%s",no);
while(p)
{
if(!strcmp(p->stu.no,no))
{
printf("%-20s%-20s%-20s%-20s\n","学号","姓名","班级","密码");
printf("%-20s%-20s%-20s%-20s\n",p->stu.no,p->stu.name,p->stu.num,p->stu.password);
system("pause");
return;
}
p=p->next;
}
printf("无该学号信息!\n");
system("pause");
}
void Modify_Student(List* head)
{
char no[100];
List* p=head->next;
system("cls");
printf("请输入要修改的学号:");
scanf("%s",no);
while(p)
{
if(!strcmp(p->stu.no,no))
{
printf("%-20s%-20s%-20s%-20s\n","学号","姓名","班级","密码");
printf("%-20s%-20s%-20s%-20s\n",p->stu.no,p->stu.name,p->stu.num,p->stu.password);
printf("请输入学生姓名:");
scanf("%s",p->stu.name);
printf("请输入学生学号:");
scanf("%s",p->stu.no);
printf("请输入学生班级:");
scanf("%s",p->stu.num);
printf("请输入学生密码:");
scanf("%s",p->stu.password);
printf("修改成功!\n");
system("pause");
return;
}
p=p->next;
}
printf("无该学号信息!\n");
system("pause");
}
List* Del_Student(List* head)
{
char no[100];
List* p=head->next,*q;
system("cls");
printf("请输入要删除的学号:");
scanf("%s",no);
while(p)
{
if(!strcmp(p->stu.no,no))
{
printf("%-20s%-20s%-20s%-20s\n","学号","姓名","班级","密码");
printf("%-20s%-20s%-20s%-20s\n",p->stu.no,p->stu.name,p->stu.num,p->stu.password);
if(p==head->next)
{
head->next=p->next;
free(p);
}
else
{
q->next=p->next;
free(p);
}
printf("删除成功!\n");
system("pause");
return head;
}
q=p;
p=p->next;
}
printf("无该学号信息!\n");
system("pause");
return head;
}
void Manage_Student_Menu()
{
int choice;
List* head = Load_Student_File();
do
{
system("cls");
printf("1:新增学生\n");
printf("2:删除学生\n");
printf("3:修改信息\n");
printf("4:查询信息\n");
printf("0:返回\n");
printf("请输入选择:");
scanf("%d",&choice);
switch(choice)
{
case 1:
head=Add_Student(head);
break;
case 2:
head=Del_Student(head);
break;
case 3:
Modify_Student(head);
break;
case 4:
Find_Student(head);
break;
}
}while(choice!=0);
Save_Student_File(head);
Del_List(head);
}
int Add_HomeWork(HomeWork work[],int n)
{
system("cls");
printf("请输入作业编号:");
scanf("%d",&work[n].no);
printf("请输入课程名称:");
scanf("%s",work[n].cname);
printf("请输入作业内容:");
scanf("%s",&work[n].data);
printf("请输入布置时间:");
scanf("%d%d%d",&work[n].time[0],&work[n].time[1],&work[n].time[2]);
printf("请输入截止时间:");
scanf("%d%d%d",&work[n].dline[0],&work[n].dline[1],&work[n].dline[2]);
printf("请输入备注:");
scanf("%s",work[n].more);
printf("新增作业成功!\n");
system("pause");
return n+1;
}
int Del_HomeWork(HomeWork work[],int n)
{
int no,i,j;
system("cls");
printf("请输入要删除的作业号:");
scanf("%d",&no);
for(i=0;i<n;i++)
{
if(work[i].no==no)
{
printf("%-10s%-20s%-30s%-10s %-10s %-10s\n","作业编号","课程名","内容","布置时间","截止时间","备注");
printf("%-10d%-20s%-30s",work[i].no,work[i].cname,work[i].data);
printf("%-4d%-2d%-4d %-4d%-2d%-4d %-10s\n",work[i].time[0],work[i].time[1],work[i].time[2],work[i].dline[0],work[i].dline[1],work[i].dline[2],work[i].more);
for(j=i;j<n;j++)
{
work[i]=work[i+1];
}
printf("删除成功!\n");
system("pasue");
return n-1;
}
}
printf("无该作业号!\n");
system("pause");
return n;
}
void Modify_HomeWork(HomeWork work[],int n)
{
int no,i;
system("cls");
printf("请输入要修改的作业号:");
scanf("%d",&no);
for(i=0;i<n;i++)
{
if(work[i].no==no)
{
printf("%-10s%-20s%-30s%-10s %-10s %-10s\n","作业编号","课程名","内容","布置时间","截止时间","备注");
printf("%-10d%-20s%-30s",work[i].no,work[i].cname,work[i].data);
printf("%-4d%-2d%-4d %-4d%-2d%-4d %-10s\n",work[i].time[0],work[i].time[1],work[i].time[2],work[i].dline[0],work[i].dline[1],work[i].dline[2],work[i].more);
printf("请输入作业编号:");
scanf("%d",&work[i].no);
printf("请输入课程名称:");
scanf("%s",work[i].cname);
printf("请输入作业内容:");
scanf("%s",&work[i].data);
printf("请输入布置时间:");
scanf("%d%d%d",&work[i].time[0],&work[i].time[1],&work[i].time[2]);
printf("请输入截止时间:");
scanf("%d%d%d",&work[i].dline[0],&work[i].dline[1],&work[i].dline[2]);
printf("请输入备注:");
scanf("%s",work[i].more);
printf("修改成功!\n");
system("pasue");
return ;
}
}
printf("无该作业号!\n");
system("pause");
}
void Serach_HomeWork_CName(HomeWork work[],int n)
{
int i,flag=0;;
char name[100];
system("cls");
printf("请输入要查询的课程名:");
scanf("%s",name);
for(i=0;i<n;i++)
{
if(!strcmp(work[i].cname,name))
{
if(!flag)
printf("%-10s%-20s%-30s%-10s %-10s %-10s\n","作业编号","课程名","内容","布置时间","截止时间","备注");
printf("%-10d%-20s%-30s",work[i].no,work[i].cname,work[i].data);
printf("%-4d%-2d%-4d %-4d%-2d%-4d %-10s\n",work[i].time[0],work[i].time[1],work[i].time[2],work[i].dline[0],work[i].dline[1],work[i].dline[2],work[i].more);
flag=1;
}
}
if(!flag)
printf("无该课程作业!\n");
system("pause");
}
void Serach_HomeWork_Time(HomeWork work[],int n)
{
int i,flag=0;;
int time[3];
int min,max,temp;
system("cls");
printf("请输入要查询的起始时间:");
scanf("%d%d%d",&time[0],&time[1],&time[2]);
min = time[0]*10000+time[1]*100+time[2];
printf("请输入要查询的截止时间:");
scanf("%d%d%d",&time[0],&time[1],&time[2]);
max = time[0]*10000+time[1]*100+time[2];
for(i=0;i<n;i++)
{
temp=work[i].time[0]*10000+work[i].time[1]*100+work[i].time[2];
if(temp>=min && temp<=max)
{
if(!flag)
printf("%-10s%-20s%-30s%-10s %-10s %-10s\n","作业编号","课程名","内容","布置时间","截止时间","备注");
printf("%-10d%-20s%-30s",work[i].no,work[i].cname,work[i].data);
printf("%-4d%-2d%-4d %-4d%-2d%-4d %-10s\n",work[i].time[0],work[i].time[1],work[i].time[2],work[i].dline[0],work[i].dline[1],work[i].dline[2],work[i].more);
flag=1;
}
}
if(!flag)
printf("无该课程作业!\n");
system("pause");
}
void Manage_Work_Menu()
{
int choice;
HomeWork work[100];
int num=Load_Work_File(work);
do
{
system("cls");
printf("1:新增作业\n");
printf("2:删除作业\n");
printf("3:修改作业\n");
printf("4:显示作业\n");
printf("5:按时间查询\n");
printf("6:按课程查询\n");
printf("0:返回\n");
printf("请输入选择:");
scanf("%d",&choice);
switch(choice)
{
case 1:
num=Add_HomeWork(work,num);
break;
case 2:
num=Del_HomeWork(work,num);
break;
case 3:
Modify_HomeWork(work,num);
break;
case 4:
Print_HomeWork(work,num);
break;
case 5:
Serach_HomeWork_Time(work,num);
break;
case 6:
Serach_HomeWork_CName(work,num);
break;
}
}while(choice!=0);
Save_Work_File(work,num);
}
int Add_Record(Record work[],int n)
{
system("cls");
printf("请输入班级:");
scanf("%s",work[n].num);
printf("请输入学号:");
scanf("%s",work[n].no);
printf("请输入作业编号:");
scanf("%d",&work[n].homeworkno);
printf("请输入课程名:");
scanf("%s",work[n].cname);
printf("请输入提交时间:");
scanf("%d%d%d",&work[n].time[0],&work[n].time[1],&work[n].time[2]);
printf("请输入备注:");
scanf("%s",work[n].more);
printf("新增提交记录成功!\n");
system("pause");
return n+1;
}
int Del_Record(Record work[],int n)
{
int no,i,j;
char sno[100];
system("cls");
printf("请输入要删除的作业编号:");
scanf("%d",&no);
printf("请输入要删除的学生学号:");
scanf("%s",sno);
for(i=0;i<n;i++)
{
if(work[i].homeworkno==no && !strcmp(work[i].no,sno))
{
printf("%-10s%-20s%-20s%-20s%-10s%-10s\n","班级","学号","作业编号","课程名","提交时间","备注");
printf("%-10s%-20s%-20d%-20s",work[i].num,work[i].no,work[i].homeworkno,work[i].cname);
printf("%-4d%-2d%-4d%-10s\n",work[i].time[0],work[i].time[1],work[i].time[2],work[i].more);
for(j=i;j<n;j++)
{
work[i]=work[i+1];
}
printf("删除成功!\n");
system("pasue");
return n-1;
}
}
printf("无该提交记录!\n");
system("pause");
return n;
}
void Modify_Record(Record work[],int n)
{
int no,i;
char sno[100];
system("cls");
printf("请输入要修改的作业编号:");
scanf("%d",&no);
printf("请输入要修改的学生学号:");
scanf("%s",sno);
for(i=0;i<n;i++)
{
if(work[i].homeworkno==no && !strcmp(work[i].no,sno))
{
printf("%-10s%-20s%-20s%-20s%-10s%-10s\n","班级","学号","作业编号","课程名","提交时间","备注");
printf("%-10s%-20s%-20d%-20s",work[i].num,work[i].no,work[i].homeworkno,work[i].cname);
printf("%-4d%-2d%-4d%-10s\n",work[i].time[0],work[i].time[1],work[i].time[2],work[i].more);
printf("请输入班级:");
scanf("%d",&work[i].num);
printf("请输入学号:");
scanf("%s",work[i].no);
printf("请输入作业编号:");
scanf("%d",&work[i].homeworkno);
printf("请输入课程名:");
scanf("%s",work[i].cname);
printf("请输入提交时间:");
scanf("%d%d%d",&work[i].time[0],&work[i].time[1],&work[i].time[2]);
printf("请输入备注:");
scanf("%s",work[i].more);
printf("修改成功!\n");
system("pasue");
return ;
}
}
printf("无该提交记录!\n");
system("pause");
}
void Serach_Record_CName(Record work[],int n)
{
int i,flag=0;;
char name[100];
system("cls");
printf("请输入要查询的课程名:");
scanf("%s",name);
for(i=0;i<n;i++)
{
if(!strcmp(work[i].cname,name))
{
if(!flag)
printf("%-10s%-20s%-20s%-20s%-10s%-10s\n","班级","学号","作业编号","课程名","提交时间","备注");
printf("%-10s%-20s%-20d%-20s",work[i].num,work[i].no,work[i].homeworkno,work[i].cname);
printf("%-4d%-2d%-4d%-10s\n",work[i].time[0],work[i].time[1],work[i].time[2],work[i].more);
flag=1;
}
}
if(!flag)
printf("无该课程作业!\n");
system("pause");
}
void Serach_Record_Time(Record work[],int n)
{
int i,flag=0;;
int time[3];
int min,max,temp;
system("cls");
printf("请输入要查询的起始时间:");
scanf("%d%d%d",&time[0],&time[1],&time[2]);
min = time[0]*10000+time[1]*100+time[2];
printf("请输入要查询的截止时间:");
scanf("%d%d%d",&time[0],&time[1],&time[2]);
max = time[0]*10000+time[1]*100+time[2];
for(i=0;i<n;i++)
{
temp=work[i].time[0]*10000+work[i].time[1]*100+work[i].time[2];
if(temp>=min && temp<=max)
{
if(!flag)
printf("%-10s%-20s%-20s%-20s%-10s%-10s\n","班级","学号","作业编号","课程名","提交时间","备注");
printf("%-10s%-20s%-20d%-20s",work[i].num,work[i].no,work[i].homeworkno,work[i].cname);
printf("%-4d%-2d%-4d%-10s\n",work[i].time[0],work[i].time[1],work[i].time[2],work[i].more);
flag=1;
}
}
if(!flag)
printf("无该课程作业!\n");
system("pause");
}
void Serach_Record_Student(Record work[],int n)
{
int i,flag=0;;
char no[100];
system("cls");
printf("请输入要查询的学号:");
scanf("%s",no);
for(i=0;i<n;i++)
{
if(!strcmp(work[i].no,no))
{
if(!flag)
printf("%-10s%-20s%-20s%-20s%-10s%-10s\n","班级","学号","作业编号","课程名","提交时间","备注");
printf("%-10s%-20s%-20d%-20s",work[i].num,work[i].no,work[i].homeworkno,work[i].cname);
printf("%-4d%-2d%-4d%-10s\n",work[i].time[0],work[i].time[1],work[i].time[2],work[i].more);
flag=1;
}
}
if(!flag)
printf("无该课程作业!\n");
system("pause");
}
void Manage_Record_Menu()
{
int choice;
Record rec[100];
int num=Load_Record_File(rec);
do
{
system("cls");
printf("1:新增提交记录\n");
printf("2:删除提交记录\n");
printf("3:修改提交记录\n");
printf("4:显示提交记录\n");
printf("5:按时间查询\n");
printf("6:按课程查询\n");
printf("7:按学生查询\n");
printf("0:返回\n");
printf("请输入选择:");
scanf("%d",&choice);
switch(choice)
{
case 1:
num=Add_Record(rec,num);
break;
case 2:
num=Del_Record(rec,num);
break;
case 3:
Modify_Record(rec,num);
break;
case 4:
Print_Record(rec,num);
break;
case 5:
Serach_Record_Time(rec,num);
break;
case 6:
Serach_Record_CName(rec,num);
break;
case 7:
Serach_Record_Student(rec,num);
break;
}
}while(choice!=0);
Save_Record_File(rec,num);
}
void Admin_Menu()
{
int choice;
do
{
system("cls");
printf("1:学生管理\n");
printf("2:作业管理\n");
printf("3:提交情况管理\n");
printf("0:返回\n");
printf("请输入选择:");
scanf("%d",&choice);
switch(choice)
{
case 1:
Manage_Student_Menu();
break;
case 2:
Manage_Work_Menu();
break;
case 3:
Manage_Record_Menu();
break;
}
}while(choice!=0);
}
void Login_Admin()
{
char pass[100];
system("cls");
printf("请输入密码:");
scanf("%s",pass);
if(!strcmp(ADMIN_PASSWORD,pass))
{
printf("登录成功!\n");
system("pause");
Admin_Menu();
return;
}
printf("密码错误!登录失败!\n");
system("pause");
}
int main()
{
int choice;
do
{
choice=Login_Menu();
switch(choice)
{
case 1:
Login_Student();
break;
case 2:
Login_Admin();
break;
}
}while(choice!=0);
return 0;
}