项目要求:
学生考勤系统
功能:学生考勤系统应包含各班学生的全部信息。每个学生是一条记录,包括姓名、性别、学号、出勤情况等。本系统可模拟考勤过程,记录考勤结果,并能够在课程结束后按照设定的考勤评分标准自动给出每个学生的考勤分数。
分步实施:
(1)初步完成总体设计,搭好框架,确定人机对话界面,确定函数个数;
(2)最低要求:建立一个文件,包括同一个班的10个学生的必要信息,能对文件进 行补充、修订、删除。
采用结构体数组读入读出文件(二进制形式写进data.txt文件)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
const int N = 1010;
const int LEN = 20;
const int CLAstunumber = 10;//每个班CLAstunumber人
typedef struct
{
char attdate[LEN];//日期
int atts;//出勤情况 0缺勤 1出勤
}attdent;
typedef struct
{
char stname[LEN];
char sex[LEN];
int stnumber;
int core;
attdent stattdent[N];//最多纪录N个日期的考勤情况
}studentinf;
int cnt;//记录日期数组用到哪里
studentinf students[CLAstunumber];
void menu()
{
printf("========================================================\n");
printf("0.学生信息录入\n");
printf("1.开始考勤\n");
printf("2.修改学生考勤纪录\n");
printf("3.生成并查看学生考勤分数\n");
printf("4.读取数据\n");
printf("5.保存数据\n");
printf("6.退出\n");
printf("========================================================\n");
}
void studentinput()
{
//录入操作
for(int i = 0 ; i < CLAstunumber; i ++)
{
printf("----------------------------------------\n");
printf("请输入学生姓名: |\n");
studentinf student1;
scanf("%s",student1.stname);
printf("请输入学生性别: |\n");
scanf("%s",student1.sex);
printf("请输入学生学号: |\n");
scanf("%d",&student1.stnumber);
student1.core = 0;
//(student1.stattdent[N]).attdate[LEN] = '0';
students[i] = student1;
printf("----------------------------------------\n");
}
}
void attcheck()
{
//考勤操作
for(int i = 0;i < CLAstunumber ; i ++)
{
students[i];
printf("------------------------------\n");
printf("姓名:%s\n",students[i].stname);
printf("性别:%s\n",students[i].sex);
printf("学号:%d\n",students[i].stnumber);
printf("请输入时间:XXXX/XX/XX\n");
scanf("%s",(students[i].stattdent[cnt]).attdate);
printf("请输入该学生出勤情况:(0表示缺勤,1表示出勤)\n");
scanf("%d",&(students[i].stattdent[cnt]).atts);
cnt ++;
printf("------------------------------\n");
}
}
void changeinf()
{
//遍历修改
char fname[LEN];
char fdate[LEN];
printf("----------------------------------\n");
printf("请输入学生姓名:\n");
scanf("%s",fname);
int stand1;//退出第一层for标准
for(int i = 0;i < CLAstunumber; i ++)
{
if(!strcmp(fname,students[i].stname))
{
printf("学生姓名:%s\n",students[i].stname);
printf("请输入时间:(XXXX/XX/XX)\n");
scanf("%s",fdate);
for(int j = 0;j < cnt ; j ++)
{
if(!strcmp(fdate,(students[i].stattdent[j]).attdate))
printf("学生:%s",fname);
printf("考勤时间:%s\n",fdate);
printf("出勤情况:%d\n",(students[i].stattdent[j]).atts);
printf("请输入修改后的出勤情况:\n");
scanf("%d",&(students[i].stattdent[j]).atts);
printf("修改成功!\n");
stand1 = 1;
break;
}
if(stand1 == 1) break;
}
}
printf("----------------------------------\n");
}
void checkcore()
{
//生成考勤分数 = 出勤次数即分数
for(int i = 0;i < CLAstunumber; i++)
{
printf("----------------------------\n");
printf("学生姓名:%s\n",students[i].stname);
printf("学生性别:%s\n",students[i].sex);
printf("学生学号:%d\n",students[i].stnumber);
//计算分数
students[i].core = 0;
for(int j = 0;j < cnt ; j ++)
{
students[i].core += (students[i].stattdent[j]).atts;
}
printf("考勤分数:%d\n",students[i].core);
printf("----------------------------\n");
}
}
void readdata()
{
FILE *fp = NULL;
fp = fopen("data.txt","rb");
//读出
int i = 0;
while(!feof(fp))
{
fread(&students[i],sizeof(studentinf),1,fp);
i ++;
}
i --;
cnt = i;
fclose(fp);
printf("读取成功!\n");
}
void savedata()
{
FILE *fp = NULL;
fp = fopen("data.txt","wb");
//写入
for(int i = 0;i < CLAstunumber ; i ++)
{
fwrite(&students[i],sizeof(studentinf),1,fp);
}
fclose(fp);
printf("保存成功!\n");
}
int main()
{
menu();
int op;
while(1)
{
scanf("%d",&op);
if(op == 0)
{
system("cls");
studentinput();
menu();
}
else if(op == 1)
{
system("cls");
attcheck();
menu();
}
else if(op == 2)
{
changeinf();
menu();
}
else if(op == 3)
{
system("cls");
checkcore();
menu();
}
else if(op == 4)
{
system("cls");
readdata();
menu();
}
else if(op == 5)
{
system("cls");
savedata();
menu();
}
else if(op == 6)
{
break;
}
else printf("input error!\n");
}
}