学生考勤管理系统
程序员文章站
2024-01-21 11:03:16
...
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_STYLE_SIZE 100//最大存储数量
typedef struct _STU
{
int year;//日期 年-月-日
int mon;
int day;
int begin;//第几节课 begin-end
int end;
char name[20];//学生姓名
char class_name[20];//课程名
char style[20];//缺课类型
}STU;
int menu()
{
int chioce;//记录选择
system("cls");//清屏
printf("1:录入记录\n");
printf("2:修改记录\n");
printf("3:查询记录\n");
printf("4:统计某天情况\n");
printf("5:显示所有信息\n");
printf("6:删除记录\n");
printf("0:退出\n");
scanf("%d",&chioce);
while(chioce<0||chioce>6)//确保选择范围正确
{
printf("输入错误,重新输入!\n");
scanf("%d",&chioce);
}
return chioce;//选择结果返回给主函数
}
//对日期
//排序思想 先按年份排 如果年份相同 按月份排 如果年月相同 按日排
//如果年月日都相同 按缺课排
void Sort_Time(STU stu[],int NUM)
{
int i,j;
STU temp;
for(i=0;i<NUM;i++)
{
for(j=i+1;j<NUM;j++)
{
if(stu[i].year>stu[j].year)
{
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
if(stu[i].year==stu[j].year)
{
if(stu[i].mon>stu[j].mon)
{
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
}
if(stu[i].year==stu[j].year&&stu[i].mon==stu[j].mon)
{
if(stu[i].day>stu[j].day)
{
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
}
if(stu[i].year==stu[j].year&&stu[i].mon==stu[j].mon&&stu[i].day==stu[j].day)
{
if(stu[i].begin>stu[j].begin)
{
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
}
}
}
}
int Input_New_Stu(STU stu[],int NUM)
{
char temp[20];//记录选择
int i,flag=1;
system("cls");//清屏
printf("请输入日期(year-mon-day)\n");
fflush(stdin);
scanf("%d-%d-%d",&stu[NUM].year,&stu[NUM].mon,&stu[NUM].day);
printf("请输入第几节课(begin-end)\n");
fflush(stdin);
scanf("%s",temp);//因为可以输入5-6或者单独5这样 所以需要自己判断输入的是什么
stu[NUM].begin=0;//初始化0
stu[NUM].end=0;
for(i=0;temp[i]!='\0';i++)
{
if(flag&&temp[i]!='-')//flag=1说明第一个数字还没有完成
{
stu[NUM].begin=stu[NUM].begin*10 +(temp[i]-'0');
}
if(temp[i]=='-')//说明第一个数字完成
{
flag=0;
}
if(flag==0&&temp[i]!='-')//第一个数字完成
{
stu[NUM].end=stu[NUM].end*10 +(temp[i]-'0');
}
}
printf("请输入课程名\n");
fflush(stdin);
scanf("%s",&stu[NUM].class_name);
printf("请输入学生姓名\n");
fflush(stdin);
scanf("%s",&stu[NUM].name);
printf("请输入缺课类型(迟到、早退、请假、旷课)\n");
fflush(stdin);
scanf("%s",&stu[NUM].style);
printf("确认添加(Y/N)?\n");
fflush(stdin);
scanf("%s",temp);
if(!strcmp(temp,"Y")||!strcmp(temp,"y"))//判断是否按Y
{
printf("添加成功\n");
system("pause");
return NUM+1;
}
printf("已取消添加\n");//其它键取消添加
system("pause");
return NUM;
}
//显示信息 NUM代表显示个数 stu代表开始显示位置
void Display_Stu_Info(STU stu[],int NUM)
{
int i;
if(NUM==0)//如果为0则不显示信息
{
printf("无旷课信息!\n");
return ;
}
for(i=0;i<NUM;i++)
{
printf("%4d-%02d-%-12d",stu[i].year,stu[i].mon,stu[i].day);
if(stu[i].end==0)
{
printf("%-20d",stu[i].begin);
}
else
{
printf("%2d-%-17d",stu[i].begin,stu[i].end);
}
printf("%-20s",stu[i].class_name);
printf("%-20s",stu[i].name);
printf("%-20s\n",stu[i].style);
}
}
void Serach_Stu_Info(STU stu[],int NUM)
{
char temp[20];
int i,flag=1;
system("cls");
printf("请输入要查询的学生姓名:");
scanf("%s",temp);
for(i=0;i<NUM;i++)
{
if(!strcmp(temp,stu[i].name))
{
if(flag)
{
printf("%-20s%-20s%-20s%-20s%-20s\n","日期","第几节课","课程名","学生姓名","缺课类型");
}
Display_Stu_Info(stu+i,1);
flag=0;
}
}
if(flag)
{
printf("该学生无缺课信息!\n");
}
system("pause");
}
int Del_Stu_Info(STU stu[],int NUM)
{
int i,j,flag=1;
char temp[20];
system("cls");
if(NUM==0)
{
printf("无信息!\n");
system("pause");
return NUM;
}
printf("%-20s%-20s%-20s%-20s%-20s\n","日期","第几节课","课程名","学生姓名","缺课类型");
for(i=0;i<NUM;i++)
{
printf("编号:%d\n",i+1);
Display_Stu_Info(stu+i,1);
}
printf("请输入要删除的编号:");
scanf("%d",&flag);
while(flag<=0||flag>NUM)
{
printf("编号错误,请重新输入\n");
scanf("%d",&flag);
}
printf("确认删除(Y/N)?\n");
fflush(stdin);
scanf("%s",temp);
if(!strcmp(temp,"Y")||!strcmp(temp,"y"))//判断是否按Y
{
for(j=flag-1;j<NUM;j++)//把要删除的用后面的数据覆盖
{
stu[j]=stu[j+1];//前面用后面的覆盖
}
printf("删除成功\n");
system("pause");
return NUM-1;//减去一个
}
printf("已取消删除\n");//其它键取消添加
system("pause");
return NUM;//没有删除
}
void Sort_Total(STU stu[],int NUM)
{
int i,j;
int count1,count2;
STU temp;
for(i=0;i<NUM;i++)
{
for(j=i+1;j<NUM;j++)
{
if(stu[j].year==stu[i].year&&stu[j].mon==stu[i].mon&&stu[j].day==stu[i].day)//对同一天进行排序
{
if(stu[i].end==0)//如果end是0 说明只缺一节课
{
count1=1;
}
else
{
count1=stu[i].end-stu[i].begin;//否则缺课是end-begin+1
}
if(stu[j].end==0)
{
count2=1;
}
else
{
count2=stu[j].end-stu[j].begin;
}
if(count1<count2)//根据缺课节数
{
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
if(count1==count2)//如果缺课一样 根据名字排序
{
if(strcmp(stu[i].name,stu[j].name)>0)
{
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
}
}
}
}
}
void Total_Stu_Info(STU stu[],int NUM)
{
int year,mon,day,i,flag=1;
system("cls");
printf("请输入要查询的日期(year-mon-day):");
scanf("%d-%d-%d",&year,&mon,&day);
for(i=0;i<NUM;i++)
{
if(year==stu[i].year&&mon==stu[i].mon&&day==stu[i].day)//如果符合查询日期
{
if(flag)//只输出一次 然后flag就是0
{
printf("%-20s%-20s\n","姓名","缺课数");
}
flag=0;
printf("%-20s",stu[i].name);
if(stu[i].end==0)
{
printf("%-20d\n",1);
}
else
{
printf("%-20d\n",stu[i].end-stu[i].begin+1);
}
}
}
if(flag)//一次都没输出 flag还是1
{
printf("该日期无缺课记录!\n");
}
system("pause");
}
void Modify_Stu_Info(STU stu[],int NUM)//修改信息
{
int i,j,flag=1;
char temp[20];
STU swap;//临时变量 用于交换
system("cls");
if(NUM==0)
{
printf("无缺课信息!\n");
system("pause");
return ;
}
printf("%-20s%-20s%-20s%-20s%-20s\n","日期","第几节课","课程名","学生姓名","缺课类型");
for(i=0;i<NUM;i++)
{
printf("编号:%d\n",i+1);
Display_Stu_Info(stu+i,1);
}//显示所有信息
printf("请输入要修改的编号:");
scanf("%d",&j);
while(j<=0||j>NUM)
{
printf("编号错误,请重新输入\n");
scanf("%d",&j);
}//选择要修改的编号
printf("请输入日期(year-mon-day)\n");
fflush(stdin);
scanf("%d-%d-%d",&swap.year,&swap.mon,&swap.day);
printf("请输入第几节课(begin-end)\n");
fflush(stdin);
scanf("%s",temp);
swap.begin=0;
swap.end=0;
for(i=0;temp[i]!='\0';i++)
{
if(flag&&temp[i]!='-')
{
swap.begin=swap.begin*10 +(temp[i]-'0');
}
if(temp[i]=='-')
{
flag=0;
}
if(flag==0&&temp[i]!='-')
{
swap.end=swap.end*10 +(temp[i]-'0');
}
}
printf("请输入课程名\n");
fflush(stdin);
scanf("%s",&swap.class_name);
printf("请输入学生姓名\n");
fflush(stdin);
scanf("%s",&swap.name);
printf("请输入缺课类型(迟到、早退、请假、旷课)\n");
fflush(stdin);
scanf("%s",&swap.style);
printf("确认修改(Y/N)?\n");
fflush(stdin);
scanf("%s",temp);
if(!strcmp(temp,"Y")||!strcmp(temp,"y"))//判断是否按Y
{
stu[j-1]=swap;
printf("修改成功\n");
system("pause");
return ;
}
printf("已取消修改\n");//其它键取消添加
system("pause");
}
//保存文件
void Save_Stu_Info(STU stu[],int NUM)
{
FILE* fp=fopen("Stu_Info.txt","w");//保存学生信息
if(fp==NULL)
{return ;}
fwrite(&stu[0],MAX_STYLE_SIZE,sizeof(STU),fp);
fclose(fp);
fp=fopen("NUM_Info.txt","w");//保存学生数量
if(fp==NULL)
{return ;}
fprintf(fp,"%d",NUM);
fclose(fp);
}
void Load_Stu_Info(STU stu[],int* n)//读取文件
{
FILE* fp=fopen("Stu_Info.txt","r");//读取学生信息
if(fp==NULL)
{return ;}
fread(&stu[0],MAX_STYLE_SIZE,sizeof(STU),fp);
fclose(fp);
fp=fopen("NUM_Info.txt","r");//读取学生数量
if(fp==NULL)
{return ;}
fscanf(fp,"%d",n);
fclose(fp);
}
int main()
{
STU stu[MAX_STYLE_SIZE];//定义结构体数组
int NUM=0,chioce;//记录选择以及数量
system("mode con: cols=120 lines=35");//改变控制台大小
Load_Stu_Info(stu,&NUM);//读取文件
do
{
chioce=menu();//获取选择
switch(chioce)
{
case 1:
NUM=Input_New_Stu(stu,NUM);//添加
Save_Stu_Info(stu,NUM);//保存
break;
case 2:
Modify_Stu_Info(stu,NUM);//修改
Save_Stu_Info(stu,NUM);//保存
break;
case 3:
Sort_Time(stu,NUM);//对时间排序
Serach_Stu_Info(stu,NUM);//查找
break;
case 4:
Sort_Total(stu,NUM);//对缺课次数姓名排序
Total_Stu_Info(stu,NUM);//统计
break;
case 5:
system("cls");
printf("%-20s%-20s%-20s%-20s%-20s\n","日期","第几节课","课程名","学生姓名","缺课类型");
Display_Stu_Info(stu,NUM);//显示
system("pause");//暂停
break;
case 6:
NUM=Del_Stu_Info(stu,NUM);//删除
Save_Stu_Info(stu,NUM);//保存
break;
}
}while(chioce!=0);
return 0;
}
上一篇: Mysql索引详解