资源描述
C语言课程设计任务学生考勤系统
81
2020年4月19日
资料内容仅供参考,如有不当或者侵权,请联系本人改正或者删除。
C语言程序设计
课程设计报告
设计题目: 学生考勤管理系统设计
院系: 生命科技学院
班级: 农学122
姓名: 刘玉柱
学号: 201 4203
河南科技学院
年 冬季 学期
设计任务: C语言课程设计任务书10
题目: 学生考勤系统设计
功能: 学生考勤系统应包含各班学生的全部信息。每个学生是一条记录, 包括姓名、 性别、 学号、 日期、 节次、 出勤情况等信息。本系统能够模拟考勤过程、 记录考勤结果, 并能在课程结束后按照设定的考勤评分标准自动给出每个学生的考勤分数。
要求: 1、 用C语言实现程序设计;
2、 利用结构体进行相关信息处理;
3、 系统的各个功能模块要求用函数的形式实现;
4、 界面友好( 良好的人机交互) , 程序加必要的注释。
平时成绩:
验收答辩成绩:
设计报告成绩:
总评成绩:
指导教师:
一、 总体设计
1.程序的总体设计
◎确定界面, 使用户可选择操作项目( 录入, 修改, 查询, 评分,界面美化) 。
◎录入功能: 使用结构体, 要求用户输入姓名、 性别、 学号、 日期、 节次、 当前出勤情况等信息, 并写入文件。
◎修改功能: 使用户输入学号, 姓名其中一项能够修改考勤其信息。对于修改功能的实现, 是先将所有文件内容读入到内存中, 然后修改考勤值, 最后再重新覆盖写入文件。
◎查询模块: 使用字符串比较函数, 利用循环找到对应结构体数组元素, 然后输出需要信息。对于查询功能的实现, 同修改, 是先将所有文件内容读入到内存中, 然后查找到其中某项, 最后输出到屏幕。
◎评分模块: 系统根据总的应道考勤数按照百分制, 求出每个学生的分数, 并输出到屏幕。
◎界面设置模块: 系统提供背景及前景颜色选项, 用户经过选择能够自由调节界面颜色。
2. 数据结构
学生信息用结构体记录, 包括姓名( 字符数组) 、 性别( 字符型) 、 日期( 年月日三个字符数组) 、 节次( 整型) 、 出情况( 整型) 。
3. 函数原型声明
void main() //主函数
void record(); //录入数据函数
void amend(); //修改数据函数
void search(); //查询数据函数
void goal(); //计算总评函数
void look(); //界面设置函数
二、 详细设计
1.main( )函数
void main()
{
void record(); //录入数据函数
void amend(); //修改数据函数
void search(); //查询数据函数
void goal(); //计算总评函数
viod kook(); //界面设置函数
char item;
printf(" ※※※※※※※※※※※※※※※※※※※※※\n");
printf(" ※ ※\n");
printf(" ※ 学 生 考 勤 管 理 系 统 ※\n");
printf(" ※ ※\n");
printf(" ※ 刘玉柱 河南科技学院 农学122 ※\n");
printf(" ※ ※\n");
printf(" ※※※※※※※※※※※※※※※※※※※※\n");
printf(" ※ ※\n");
printf(" ※ 1.学生信息及考勤情况录入 ※\n");
printf(" ※ ※\n");
printf(" ※ 2.学生信息及考勤情况修改 ※\n");
printf(" ※ ※\n");
printf(" ※ 3.学生信息及考勤情况查询 ※\n");
printf(" ※ ※\n");
printf(" ※ 4.学生考勤总评分数查询 ※\n");
printf(" ※ ※\n");
printf(" ※※※※※※※※※※※※※※※※※※※※※\n"); //用户界面设置
printf("\n");
printf(" 请选择您需要的操作\n");
scanf("%c",&item);
switch(item)
{
case '1': record();break;
case '2': amend();break;
case '3': search();break;
case '4': goal();break;
case ‘5’;look();break;
} //实现功能选择
}
流程图:
开 始
4
5
Look()
1
break
goal()
search()
amend()
record()
3
2
switch(item) switch(item)switch(item)
输出界面
结束
2. record() 函数
void record()
{
int i,j=0,jx=1;
printf(" ************************学 生 基 本 信 息 录 入*****************************\n");
if((fp=fopen("date.txt","w"))==NULL)
{
printf("文件打开失败\n");
exit(0);
}
for(i=0;jx==1;i++) //输入信息循环
{ for(;j==0;) //输入确认循环
{
getchar();
printf("请输入第%d个学生的姓名 ",i+1);
gets(stu[i].name);
printf("请输入第%d个学生的学号 ",i+1);
gets(stu[i].number);
printf("请输入第%d个学生的性别(男:m 女:f) ",i+1);
stu[i].sex=getchar();
printf("请输入第%d个学生的生日(格式:年 月 日) ",i+1);
scanf("%d%d%d",&stu[i].year,&stu[i].month,&stu[i].day);
printf("请输入第%d个学生的当前考勤次数 ",i+1);
scanf("%d",&stu[i].kq);
printf("您输入的信息为 姓名 %s 学号 %s 性别 %c 生日 %d年%d月%d日\n 0 重输 1 确认",stu[i].name,stu[i].number,stu[i].sex,stu[i].year,stu[i].month,stu[i].day);
scanf("%d",&j); //输入确认
}
j=0;
if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1) printf("文件写入错误\n"); //写入文件
printf(" 是否继续输入下一个学生信息 0 终止 1 继续\n");
scanf("%d",&jx); //继续输入选择
}
fclose(fp);
printf("0 返回主菜单\n");
getchar();
a=getchar();
getchar();
if(a=='0') main(); //返回主菜单
}
流程图:
开始
0=>j
打开文件
1=>jx
0=>i
jx=1?
Y
j=0?
Y
输入i+1个学生信息生信息
N
输入j值选择是否确认
写入文件
i+1=>i
输入jx值选择是否继续
结束
3. amend()函数
void amend()
{ int i=0,j=0,sway,t,x;
char name[10],number[10];
printf(" **********************学 生 考 勤 修 改**************************\n");
if((fp=fopen("date.txt","r"))==NULL) //将文件内容读入内存
{
printf("文件打开失败\n");
exit(0);
}
for(i=0;feof(fp)==0;i++) fread(&stu[i],sizeof(struct student),1,fp); //读取文件内容
fclose(fp); //关闭文件
printf("选择查找方式 1 按照姓名查找 2 按照学号查找");
scanf("%d",&sway);
/**********************按照姓名查找开始*************************///
if(sway==1)
{
printf("请输入需要修改学生的姓名 ");
// printf("i=%d",i);
scanf("%s",name);
for(j=0;t!=0;j++)
{
t=strcmp(stu[j].name,name);
if(j==i)
{
t=0;
printf("未找到您所查询的数据,请重新输入\n");
}
}
if(j<i) //查询成功
{
printf("您查找的学生信息如下\n 姓名 %s 学号 %s 性别 %c 生日 %d年%d月%d日 当前考勤次数 %d\n",stu[j-1].name,stu[j-1].number,stu[j-1].sex,stu[j-1].year,stu[j-1].month,stu[j-1].day,stu[j-1].kq);
printf("是否修改该生考勤信息 0 否 1 是"); //选择是否修改考勤
scanf("%d",&x); //输入选择变量值
if(x==1)
{
printf("请输入新的考勤值 ");
scanf("%d",&stu[j-1].kq); //输入新的考勤值
if((fp=fopen("date.txt","w"))==NULL) //以只写方式打开文件
{
printf("文件打开失败\n");
exit(0);
}
for(j=0;j<i;j++) if(fwrite(&stu[j],sizeof(struct student),1,fp)!=1) printf("文件写入错误\n"); //写入文件
fclose(fp); //关闭文件
}
}
printf("是否继续修改其它学生考勤 0 否 1 是");
scanf("%d",&x);
if(x==1) amend();
}
/**********************按照姓名查找结束*************************///
/**********************按照学号查找开始*************************///
if(sway==2)
{
printf("请输入需要修改学生的学号 ");
// printf("i=%d",i);
scanf("%s",number);
for(j=0;t!=0;j++)
{
t=strcmp(stu[j].number,number);
if(j==i)
{
t=0;
printf("未找到您所查询的数据,请重新输入\n");
}
}
if(j<i) //查询成功
{
printf("您查找的学生信息如下\n 姓名 %s 学号 %s 性别 %c 生日 %d年%d月%d日 当前考勤次数 %d\n",stu[j-1].name,stu[j-1].number,stu[j-1].sex,stu[j-1].year,stu[j-1].month,stu[j-1].day,stu[j-1].kq);
printf("是否修改该生考勤信息 0 否 1 是"); //选择是否修改考勤
scanf("%d",&x); //输入选择变量值
if(x==1)
{
printf("请输入新的考勤值 ");
scanf("%d",&stu[j-1].kq); //输入新的考勤值
if((fp=fopen("date.txt","w"))==NULL) //以只写方式打开文件
{
printf("文件打开失败\n");
exit(0);
}
for(j=0;j<i;j++) if(fwrite(&stu[j],sizeof(struct student),1,fp)!=1) printf("文件写入错误\n"); //写入文件
fclose(fp); //关闭文件
}
}
printf("是否继续修改其它学生考勤 0 否 1 是");
scanf("%d",&x);
if(x==1) amend();
}
/**********************按照学号查找结束*************************///
printf("0 返回主菜单\n");
getchar();
a=getchar();
getchar();
if(a=='0') main();
}
开始
打开文件
将文件内容全部读入结构体数组
输入sway值选择查找方式
Sway=1?
N
Sway=2?
Y
输入要查找的学号
输入要查找的姓名
N
查找学号
查找姓名
输入X值选择是否修改考勤
X=1?
Y
输入新的考勤值
写入文件
结束
4. search()函数
void search()
{ int i=0,j=0,sway,t,x;
char name[10],number[10];
printf(" ***********************学 生 信 息 查 询***************************\n");
if((fp=fopen("date.txt","r"))==NULL) //将文件内容读入内存
{
printf("文件打开失败\n");
exit(0);
}
for(i=0;feof(fp)==0;i++) fread(&stu[i],sizeof(struct student),1,fp); //读取文件内容
fclose(fp); //关闭文件
printf("选择查找方式 1 按照姓名查找 2 按照学号查找");
scanf("%d",&sway);
/**********************按照姓名查找开始*************************///
if(sway==1)
{
printf("请输入需要修改学生的姓名 ");
// printf("i=%d",i);
scanf("%s",name);
for(j=0;t!=0;j++)
{
t=strcmp(stu[j].name,name);
if(j==i)
{
t=0;
printf("未找到您所查询的数据,请重新输入\n");
}
}
if(j<i) //查询成功
{
printf("您查找的学生信息如下\n 姓名 %s 学号 %s 性别 %c 生日 %d年%d月%d日 当前考勤次数 %d\n",stu[j-1].name,stu[j-1].number,stu[j-1].sex,stu[j-1].year,stu[j-1].month,stu[j-1].day,stu[j-1].kq);
}
printf("是否继续查询其它学生信息 0 否 1 是");
scanf("%d",&x);
if(x==1) search();
}
/**********************按照姓名查找结束*************************///
/**********************按照学号查找开始*************************///
if(sway==2)
{
printf("请输入需要修改学生的学号 ");
// printf("i=%d",i);
scanf("%s",number);
for(j=0;t!=0;j++)
{
t=strcmp(stu[j].number,number);
if(j==i)
{
t=0;
printf("未找到您所查询的数据,请重新输入\n");
}
}
if(j<i) //查询成功
{
printf("您查找的学生信息如下\n 姓名 %s 学号 %s 性别 %c 生日 %d年%d月%d日 当前考勤次数 %d\n",stu[j-1].name,stu[j-1].number,stu[j-1].sex,stu[j-1].year,stu[j-1].month,stu[j-1].day,stu[j-1].kq);
}
printf("是否继续查询其它学生信息 0 否 1 是");
scanf("%d",&x);
if(x==1) search();
}
/**********************按照学号查找结束*************************///
printf("0 返回主菜单\n");
getchar();
a=getchar();
getchar();
if(a=='0') main();
}
流程图:
开始
打开文件
将文件内容全部读入结构体数组
输入sway值选择查找方式
Sway=1?
N
Sway=2?
Y
输入要查找的学号
输入要查找的姓名
查找学号
查找姓名
输出该生信息
5. goal()函数
void goal()
{ int i=0,j=0,sway,t,x;
float score;
char name[10],number[10];
printf(" ***********************学 生 考 勤 分 数 计 算**************************\n");
if(kqcs==0)
{
printf("请输入应到考勤总数 "); //请输入应到考勤总数
scanf("%f",&kqcs);
}
if((fp=fopen("date.txt","r"))==NULL) //将文件内容读入内存
{
printf("文件打开失败\n");
exit(0);
}
for(i=0;feof(fp)==0;i++) fread(&stu[i],sizeof(struct student),1,fp); //读取文件内容
fclose(fp); //关闭文件
printf("选择查找方式 1 按照姓名查找 2 按照学号查找");
scanf("%d",&sway);
/**********************按照姓名查找开始*************************///
if(sway==1)
{
printf("请输入需要修改学生的姓名 ");
// printf("i=%d",i);
scanf("%s",name);
for(j=0;t!=0;j++)
{
t=strcmp(stu[j].name,name);
if(j==i)
{
t=0;
printf("未找到您所查询的数据,请重新输入\n");
}
}
if(j<i) //查询成功
{
printf("您查找的学生信息如下\n 姓名 %s 学号 %s 性别 %c 生日 %d年%d月%d日 当前考勤次数 %d\n",stu[j-1].name,stu[j-1].number,stu[j-1].sex,stu[j-1].year,stu[j-1].month,stu[j-1].day,stu[j-1].kq);
score=(stu[j-1].kq)/kqcs*100;
printf("该生当前考勤分数为 %5.2f",score);
}
printf("是否继续计算其它学生考勤分数 0 否 1 是");
scanf("%d",&x);
if(x==1) goal();
}
/**********************按照姓名查找结束*************************///
/**********************按照学号查找开始*************************///
if(sway==2)
{
printf("请输入需要修改学生的学号 ");
// printf("i=%d",i);
scanf("%s",number);
for(j=0;t!=0;j++)
{
t=strcmp(stu[j].number,number);
if(j==i)
{
t=0;
printf("未找到您所查询的数据,请重新输入\n");
}
}
if(j<i) //查询成功
{
printf("您查找的学生信息如下\n 姓名 %s 学号 %s 性别 %c 生日 %d年%d月%d日 当前考勤次数 %d\n",stu[j-1].name,stu[j-1].number,stu[j-1].sex,stu[j-1].year,stu[j-1].month,stu[j-1].day,stu[j-1].kq);
score=(stu[j-1].kq)/kqcs*100;
printf("该生当前考勤分数为 %5.2f",score);
}
printf("是否继续计算其它学生考勤分数 0 否 1 是");
scanf("%d",&x);
if(x==1) goal();
}
/**********************按照学号查找结束*************************///
printf("0 返回主菜单\n");
getchar();
a=getchar();
getchar();
if(a=='0') main();
}
流程图:
开始
输入应到考勤次数kqcs值
打开文件
将文件内容全部读入结构体数组
输入sway值选择查找方式
Sway=1?
Y
N
Sway=2?
输入要查找的学号
输入要查找的姓名
查找学号
查找姓名
输出该生信息
计算考勤分数
输出考勤分数
结束
Look()函数:
void look()
{
int i,j;
printf("背景颜色: 0: 黑、 1: 蓝、 2: 绿、 3: 湖蓝色、 4: 红、 5: 紫、 6: 黄、 7: 白");
scanf("%d",&i);
switch(i)
{
case 0:
{
printf("前景颜色: 0: 黑、 1: 蓝、 2: 绿、 3: 湖蓝色、 4: 红、 5: 紫、 6: 黄、 7: 白");
scanf("%d",&j);
switch(j)
{
case 0:
printf("输入无效! 背景和前景颜色相同! \n");
break;
case 1:
system("color 01");
break;
case 2:
system("color 02");
break;
case 3:
system("color 03");
break;
case 4:
system("color 04");
break;
case 5:
system("color 05");
break;
case 6:
system("color 06");
break;
case 7:
system("color 07");
break;
}
break;
}
case 1:
{
printf("前景颜色: 0: 黑、 1: 蓝、 2: 绿、 3: 湖蓝色、 4: 红、 5: 紫、 6: 黄、 7: 白");
scanf("%d",&j);
switch(j)
{
case 0:
system("color 10");
break;
case 1:
printf("输入无效! 背景和前景颜色相同! \n");
break;
case 2:
system("color 12");
break;
case 3:
system("color 13");
break;
case 4:
system("color 14");
break;
case 5:
system("color 15");
break;
case 6:
system("color 16");
break;
case 7:
system("color 17");
break;
}
break;
}
case 2:
{
printf("前景颜色: 0: 黑、 1: 蓝、 2: 绿、 3: 湖蓝色、 4: 红、 5: 紫、 6: 黄、 7: 白");
scanf("%d",&j);
switch(j)
{
case 0:
system("color 20");
break;
case 1:
system("color 21");
break;
case 2:
printf("输入无效! 背景和前景颜色相同! \n");
break;
case 3:
system("color 23");
break;
case 4:
system("color 24");
break;
case 5:
system("color 25");
break;
case 6:
system("color 26");
break;
case 7:
system("color 27");
break;
}
break;
}
case 3:
{
printf("前景颜色: 0: 黑、 1: 蓝、 2: 绿、 3: 湖蓝色、 4: 红、 5: 紫、 6: 黄、 7: 白");
scanf("%d",&j);
switch(j)
{
case 0:
system("color 30");
break;
case 1:
system("color 31");
break;
case 2:
system("color 32");
break;
case 3:
printf("输入无效! 背景和前景颜色相同! \n");
break;
case 4:
system("color 34");
break;
case 5:
system("color 35");
break;
case 6:
system("color 36");
break;
case 7:
system("color 37");
break;
}
break;
}
case 4:
{
printf("前景颜色: 0: 黑、 1: 蓝、 2: 绿、 3: 湖蓝色、 4: 红、 5: 紫、 6: 黄、 7: 白");
scanf("%d",&j);
switch(j)
{
case 0:
system("color 40");
break;
case 1:
system("color 41");
break;
case 2:
system("color 42");
break;
case 3:
system("color 43");
break;
case 4:
printf("输入无效! 背景和前景颜色相同! \n");
break;
case 5:
system("color 45");
break;
case 6:
system("color 46");
break;
case 7:
system("color 47");
break;
}
break;
}
case 5:
{
printf("前景颜色: 0: 黑、 1: 蓝、 2: 绿、 3: 湖蓝色、 4: 红、 5: 紫、 6: 黄、 7: 白");
scanf("%d",&j);
switch(j)
{
case 0:
system("color 50");
break
展开阅读全文