|
|
#include<stdio.h>
|
|
|
#include<string.h>
|
|
|
#include<stdlib.h>
|
|
|
#define SIZE 50
|
|
|
FILE *fp;//定义文件
|
|
|
int n,m=0;//定义全局变量
|
|
|
struct student //定义学生缺课信息结构体
|
|
|
{
|
|
|
char name[100];
|
|
|
int number;
|
|
|
char course[20];
|
|
|
int di;
|
|
|
int time;
|
|
|
int chidao;
|
|
|
int zaotui;
|
|
|
int qingjia;
|
|
|
int kuangke;
|
|
|
}stu[SIZE];
|
|
|
struct kuangke//定义旷课结构体1(学生姓名,旷课次数)
|
|
|
{
|
|
|
char name[20];
|
|
|
int number;
|
|
|
}kuangke[SIZE];
|
|
|
struct kuangke2//定义旷课结构体2(课程名称,旷课次数)
|
|
|
{
|
|
|
char name[20];
|
|
|
int number;
|
|
|
}kuangke2[SIZE];
|
|
|
|
|
|
struct kuangke temp;//旷课信息交换1
|
|
|
struct kuangke2 temp2;//旷课信息交换2
|
|
|
void tongji1printf()//统计方法1排序函数
|
|
|
{
|
|
|
int i,j;
|
|
|
printf("统计后的结果为;\n");
|
|
|
printf("旷课学生姓名 旷课次数\n");
|
|
|
for(i=0;i<=m;i++)
|
|
|
{
|
|
|
for(j=i+1;j<=m+1;j++)
|
|
|
{
|
|
|
if(kuangke[i].number<kuangke[j].number)
|
|
|
{
|
|
|
temp=kuangke[i];
|
|
|
kuangke[i]=kuangke[j];
|
|
|
kuangke[j]=temp;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
for(i=0;i<=m;i++)
|
|
|
printf("%s %d \n",kuangke[i].name,kuangke[i].number);
|
|
|
}
|
|
|
|
|
|
void tongji2printf()//统计方法2排序函数
|
|
|
{
|
|
|
int i,j,k;
|
|
|
printf("请输入课程门数\n");
|
|
|
scanf("%d",&k);
|
|
|
for(i=0;i<k;i++)
|
|
|
{
|
|
|
printf("请输入第%d门课程的名称;\n",i+1);
|
|
|
scanf("%s",kuangke2[i].name);
|
|
|
}
|
|
|
for(j=0;j<k;j++)
|
|
|
{
|
|
|
for(i=0;i<=m;i++)
|
|
|
{
|
|
|
if(strcmp(kuangke2[j].name,kuangke[i].name)==0)
|
|
|
{
|
|
|
kuangke2[j].number=kuangke2[j].number+kuangke[i].number;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
}
|
|
|
for(i=0;i<k;i++)
|
|
|
for(j=i+1;j<k+1;j++)
|
|
|
{
|
|
|
if(kuangke2[i].number<kuangke2[j].number)
|
|
|
{
|
|
|
temp2=kuangke2[i];
|
|
|
kuangke2[i]=kuangke2[j];
|
|
|
kuangke2[j]=temp2;
|
|
|
}
|
|
|
|
|
|
}
|
|
|
printf("统计后的结果\n");
|
|
|
for(j=0;j<k;j++)
|
|
|
{
|
|
|
printf(" 课程名称 旷课人次\n");
|
|
|
printf(" %s %d \n",kuangke2[j].name,kuangke2[j].number);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
void save()//写入文件函数
|
|
|
{
|
|
|
FILE *fp;
|
|
|
int j;
|
|
|
if((fp=fopen("study","wb"))==NULL)//打开文件
|
|
|
{
|
|
|
printf("文件打开失败\n");
|
|
|
exit(0);
|
|
|
}
|
|
|
for(j=0;j<SIZE;j++)
|
|
|
{
|
|
|
if(fwrite(&stu[j],sizeof(struct student),1,fp)!=1)//写入文件
|
|
|
printf("文件写入失败\n");
|
|
|
}
|
|
|
fclose(fp); //关闭文件
|
|
|
}
|
|
|
|
|
|
void load()//读出文件函数
|
|
|
{
|
|
|
FILE *fp;
|
|
|
int j;
|
|
|
if((fp=fopen("study","rb"))==NULL)//打开文件
|
|
|
{
|
|
|
printf("文件打开失败\n");
|
|
|
exit(0);
|
|
|
}
|
|
|
for(j=0;feof(fp)==0;j++)
|
|
|
{
|
|
|
fread(&stu[j],sizeof(struct student),1,fp);//读出文件
|
|
|
|
|
|
}
|
|
|
fclose(fp);
|
|
|
}
|
|
|
void tongji1()//统计某段时间内,旷课学生姓名及旷课次数,按旷课次数由多到少排序
|
|
|
{
|
|
|
int time1,time2;
|
|
|
int i,flag=0,k;
|
|
|
printf("请输入起始时间和终止时间\n");
|
|
|
scanf("%d %d",&time1,&time2);
|
|
|
load();
|
|
|
for(i=0,k=0;i<SIZE;i++)
|
|
|
{
|
|
|
if(stu[i].time>=time1&&stu[i].time<=time2)
|
|
|
{
|
|
|
if(stu[i].kuangke>0)
|
|
|
{
|
|
|
strcpy(kuangke[k].name,stu[i].name);
|
|
|
kuangke[k].number=stu[i].kuangke;
|
|
|
m=k;//m记录旷课总人次
|
|
|
k++;
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
flag++;
|
|
|
}
|
|
|
if(flag==SIZE)
|
|
|
printf("输入信息有误\n");
|
|
|
else
|
|
|
tongji1printf();
|
|
|
}
|
|
|
|
|
|
|
|
|
void tongji2()//统计某段时间内,有学生旷课的课程及旷课人次,按旷课人次由多到少排序;
|
|
|
|
|
|
{
|
|
|
int time1,time2;
|
|
|
int i,flag=0,k;
|
|
|
printf("请输入起始时间和终止时间\n");
|
|
|
scanf("%d %d",&time1,&time2);
|
|
|
load();
|
|
|
for(i=0,k=0;i<SIZE;i++)
|
|
|
{
|
|
|
if(stu[i].time>=time1&&stu[i].time<=time2)
|
|
|
{
|
|
|
if(stu[i].kuangke>0)
|
|
|
{
|
|
|
strcpy(kuangke[k].name,stu[i].course);
|
|
|
kuangke[k].number=stu[i].kuangke;
|
|
|
m=k;//m记录旷课总人次
|
|
|
k++;
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
flag++;
|
|
|
}
|
|
|
if(flag==SIZE)
|
|
|
printf("输入信息有误\n");
|
|
|
else
|
|
|
tongji2printf();
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void create()//录入学生缺课记录函数
|
|
|
{
|
|
|
void save();
|
|
|
int i,n;
|
|
|
printf("开始录入学生缺课记录\n");
|
|
|
printf("请输入学生总人数\n");
|
|
|
scanf("%d",&n);
|
|
|
for(i=0;i<n;i++)
|
|
|
{
|
|
|
printf("请输入第%d个学生的缺课信息\n",i+1);
|
|
|
printf("姓名 学号 课程名称 第几节课 缺课日期 迟到次数 早退次数 请假次数 旷课次数\n");
|
|
|
scanf("%s %d %s %d %d %d %d %d %d",stu[i].name,&stu[i].number,stu[i].course,&stu[i].di,&stu[i].time,&stu[i].chidao,&stu[i].zaotui,&stu[i].qingjia,&stu[i].kuangke);
|
|
|
}
|
|
|
save();
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void xiugai()//修改函数
|
|
|
{
|
|
|
void save();
|
|
|
void load();
|
|
|
int i,k,flag=0;
|
|
|
int number;
|
|
|
load();
|
|
|
printf("以防学生出现重名现象造成的不必要麻烦\n");
|
|
|
printf("请输入需要修改信息的学生学号\n");
|
|
|
scanf("%d",&number);
|
|
|
for(i=0;i<SIZE;i++)
|
|
|
{
|
|
|
if(number==stu[i].number)
|
|
|
{
|
|
|
printf("该学生的缺课信息\n");
|
|
|
printf("姓名 学号 课程名称 第几节课 缺课日期 迟到次数 早退次数 请假次数 旷课次数\n");
|
|
|
printf("%s %d %s %d %d %d %d %d %d\n",stu[i].name,stu[i].number,stu[i].course,stu[i].di,stu[i].time,stu[i].chidao,stu[i].zaotui,stu[i].qingjia,stu[i].kuangke);
|
|
|
do
|
|
|
{
|
|
|
printf("请选择需要修改的项目\n");
|
|
|
printf("1.课程名称 2.第几节课 3.缺课日期 4.迟到次数\n");
|
|
|
printf("5.早退次数 6.请假次数 7.旷课次数 8.退出\n");
|
|
|
scanf("%d",&k);
|
|
|
printf("请输入修改信息\n");
|
|
|
switch(k)
|
|
|
{
|
|
|
case 1:scanf("%s",stu[i].course);break;
|
|
|
case 2:scanf("%d",&stu[i].di);break;
|
|
|
case 3:scanf("%d",&stu[i].time);break;
|
|
|
case 4:scanf("%d",&stu[i].chidao);break;
|
|
|
case 5:scanf("%d",&stu[i].zaotui);break;
|
|
|
case 6:scanf("%d",&stu[i].qingjia);break;
|
|
|
case 7:scanf("%d",&stu[i].kuangke);break;
|
|
|
case 8: break;
|
|
|
default:printf("无该菜单选项,请重新输入\n\n");
|
|
|
}
|
|
|
}while(k!=8);
|
|
|
printf("%d号学生修改后的信息为:\n",number);
|
|
|
printf("姓名 学号 课程名称 第几节课 缺课日期 迟到次数 早退次数 请假次数 旷课次数\n");
|
|
|
printf("%s %d %s %d %d %d %d %d %d\n",stu[i].name,stu[i].number,stu[i].course,stu[i].di,stu[i].time,stu[i].chidao,stu[i].zaotui,stu[i].qingjia,stu[i].kuangke);
|
|
|
save();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
void chaxun()//查询函数
|
|
|
{
|
|
|
void load();
|
|
|
int i,flag=0,number,item;
|
|
|
char name[20];
|
|
|
load();
|
|
|
do
|
|
|
{
|
|
|
printf("请输入查询方式\n");
|
|
|
printf("1.学号查询 2.姓名查询 3.退出\n");
|
|
|
scanf("%d",&item);
|
|
|
|
|
|
|
|
|
if(item==1)
|
|
|
{
|
|
|
printf("请输入学生学号:");
|
|
|
scanf("%d",&number);
|
|
|
for(i=0;i<SIZE;i++)
|
|
|
{
|
|
|
if(number==stu[i].number)
|
|
|
{
|
|
|
printf("姓名 学号 课程名称 第几节课 缺课日期 迟到次数 早退次数 请假次数 旷课次数\n");
|
|
|
printf("%s %d %s %d %d %d %d %d %d\n",stu[i].name,stu[i].number,stu[i].course,stu[i].di,stu[i].time,stu[i].chidao,stu[i].zaotui,stu[i].qingjia,stu[i].kuangke);
|
|
|
}
|
|
|
else
|
|
|
flag++;
|
|
|
}
|
|
|
if(flag==SIZE)
|
|
|
printf("输入信息有误\n");
|
|
|
}
|
|
|
else if(item==2)
|
|
|
{
|
|
|
printf("请输入学生姓名\n");
|
|
|
scanf("%s",name);
|
|
|
for(i=0;i<SIZE;i++)
|
|
|
{
|
|
|
if(strcmp(name,stu[i].name)==0)
|
|
|
{
|
|
|
printf("姓名 学号 课程名称 第几节课 缺课日期 迟到次数 早退次数 请假次数 旷课次数\n");
|
|
|
printf("%s %d %s %d %d %d %d %d %d\n",stu[i].name,stu[i].number,stu[i].course,stu[i].di,stu[i].time,stu[i].chidao,stu[i].zaotui,stu[i].qingjia,stu[i].kuangke);
|
|
|
}
|
|
|
else
|
|
|
flag++;
|
|
|
}
|
|
|
if(flag==SIZE)
|
|
|
printf("输入信息有误\n");
|
|
|
else if(item==3)
|
|
|
break;
|
|
|
}
|
|
|
else
|
|
|
printf("请输入正确的查询方式\n");
|
|
|
}while(item!=3);
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int main()
|
|
|
{
|
|
|
|
|
|
int x;
|
|
|
do
|
|
|
{
|
|
|
printf("\n");
|
|
|
printf("\n");
|
|
|
printf("\n");
|
|
|
printf("########################\n");
|
|
|
printf("# 学生考勤系统 #\n");
|
|
|
printf("# 欢迎您 #\n");
|
|
|
printf("########################\n");
|
|
|
printf("\n");
|
|
|
printf("\n");
|
|
|
printf("\n");
|
|
|
printf("\n");
|
|
|
printf("################################\n");
|
|
|
printf("#录入信息输入时间是请以月日格式#\n");
|
|
|
printf("#例如:11月1日以1101形式输入 #\n");
|
|
|
printf("#请选择所需功能,输入对应数字:#\n");
|
|
|
printf("# 1.录入学生的缺课记录 #\n");
|
|
|
printf("# 2.修改某个学生的缺课记录 #\n");
|
|
|
printf("# 3.查询某个学生的缺课情况 #\n");
|
|
|
printf("# 4.旷课学生姓名及旷课次数 #\n");
|
|
|
printf("# 5.有学生旷课课程及旷课人次 #\n");
|
|
|
printf("# 6.退出系统 #\n");
|
|
|
scanf("%d",&x);
|
|
|
switch(x)
|
|
|
{
|
|
|
case 1:create();break;
|
|
|
case 2:xiugai();break;
|
|
|
case 3:chaxun();break;
|
|
|
case 4:tongji1();break;
|
|
|
case 5:tongji2();break;
|
|
|
case 6:break;
|
|
|
default:printf("***输入有误,请重输:\n");
|
|
|
}
|
|
|
|
|
|
} while (x != 6);
|
|
|
}
|
|
|
|