C语言课程设计学生考勤系统docx.docx
《C语言课程设计学生考勤系统docx.docx》由会员分享,可在线阅读,更多相关《C语言课程设计学生考勤系统docx.docx(34页珍藏版)》请在冰豆网上搜索。
![C语言课程设计学生考勤系统docx.docx](https://file1.bdocx.com/fileroot1/2023-1/26/6c5b5870-64cc-4d4d-99f9-abf767ce1c01/6c5b5870-64cc-4d4d-99f9-abf767ce1c011.gif)
C语言课程设计学生考勤系统docx
C语言程序设计
课程设计报告
设计题目:
学生考勤系统设计
专业微电子科学与工程
班级微电131
学生赵杨怡
指导教师
年—学期
设计任务:
C语言课程设计任务书10
题目:
学生考勤系统设计
功能:
学生考勤系统应包含各班学生的全部信息。
每个学生是一条记录,包括姓名、性别、学号、日期、节次、出勤情况等信息。
本系统可以模拟考勤过程、记录考勤结果,并能在课程结束后按照设定的考勤评分标准自动给出每个学生的考勤分数。
要求:
1、用C语言实现程序设计;
2、利用结构体进行相关信息处理;
3、系统的各个功能模块要求用函数的形式实现;
4、界面友好(良好的人机交互),程序加必要的注释。
平时成绩:
验收答辩成绩:
设计报告成绩:
总评成绩:
指导教师:
一、总体设计
1•程序的总体设计
◎确定界面,使用户可选择操作项目(录入,修改,查询,评分)。
◎录入功能:
使用结构体,要求用户输入姓名、性别、学号、日期、节次、当前出勤情况等信息,并写入文件。
◎修改功能:
使用户输入学号,姓名其中一项可以修改考勤其信息。
对于修改功能的实现,是先将所有文件内容读入到内存中,然后修改考勤值,最后再重新覆盖写入文件。
◎查询模块:
使用字符串比较函数,利用循环找到对应结构体数组元素,然后输出需要信息。
对于查询功能的实现,同修改,是先将所有文件内容读入到内存中,然后查找到其中某项,最后输出到屏幕。
◎评分模块:
系统根据总的应道考勤数按照百分制,求出每个学
生的分数,并输出到屏幕。
2.数据结构
学生信息用结构体记录,包括姓名(字符数组)、性别(字
符型)、日期(年月日三个字符数组)、节次(整型)、出情况(整型)
3.函数原型声明
VOidmain()//
VOidinput();//
voidChange();//
voidSearCh();//
voidevaluate();//
、详细设计
主函数
录入数据函数
修改数据函数
查询数据函数
计算总评函数
1.main()函数
voidmain()
{
voidinput();//
voidChange();//
voidSearCh();//
voidevaluate();//Charitem;
SyStem("color34");
Printf("
□★◊★□★∖n");
Printf("
•\n");
Printf("
管理系统◊'"');
Printf("
•\n");
Printf("
◊\n");
录入数据函数
修改数据函数
查询数据函数计算总评函数
★◊★□★◊★□★◊★□★◊★
◊学生考勤
◊BY朱胜佳
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':
input();break;
CaSe'2':
Change();break;
CaSe'3':
SearCh();break;
CaSe'4':
evaluate();break;
}//实现功能选择
}
流程图:
2.input()函数
VOidinput()
{
inti,j=0,jx=1;
rr*ιr>4"F/11************************
学生基本信息录入
***************************
**∖n");
if((fp=fopen("date.txt","w"))==NULL)
{
Printf("exit(0);
文件打开失败\n");
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("请输入第%c个学生的当前考勤次数",i+1);
SCanf("%d",&stu[i].kq);
Printf("您输入的信息为姓名%s学号%s性别%c生日%d年%d月%d日\n0重输1确认
",stu[i].name,stu[i].number,stu[i].sex,stu[i].year,stu[i].mOnt
h,stu[i].day);
SCanf("%d",&j);//输入确认
}
j=0;
if(fwrite(&stu[i],sizeof(structStUdent),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();//返回主菜单
}
流程图:
开始
输入jx值选择是否继续
结束
3.Change()函数
VOidChange()
{inti=0,j=0,sway,t,x;
Charname[10],number[10];
{
Printf("文件打开失败\n");exit(0);
}
fclose(fp);
//
关闭文件
Printf("选择查找方式
1按照姓名查找
2
按照学号查找");
SCanf("%d",&sway);
/**********************
按照
姓
名查找开
for(i=0;feof(fp)==0;i++)
StUdent),1,fp);//读取文件内容
fread(&stu[i],sizeof(struct
始
*************************
///
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
数%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是");
ZZ选择是否修改考勤
SCanf("%d",&x);ZZ输入选择变量值
if(x==1){
Printf("请输入新的考勤值");
输入
SCanf("%d",&stu[j-1].kq);ZZ
新的考勤值
if((fp=fopen("date.txt","w"))==NULL)ZZ
以只写方式打开文件
*************************
if(sway==2)
{
Printf("请输入需要修改学生的学号");
ZZPrintf("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
{
Printf("
别%c生日
数%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
if(fwrite(&stu[j],SiZeOf(StruCtStUdent),1,fp)!
=1)printf("文件
写入错误\n");//写入文件
fclose(fp);//关闭文件
}
}
Printf("是否继续修改其他学生考勤0否1是");
SCanf("%d",&x);if(x==1)Change();
}
按照学号查找结束
[**********************
输入SWay值选择查找方式
输入X值选择是否修改考勤
X=1?
4.SearCh()函数
VOidSearChO
{inti=0,j=0,sway,t,x;
Charname[10],number[10];
Printf("
***********************
*************************
**∖n");
if((fp=fopen("date.txt","r"))==NULL)文件内容读入内存
学生信息查询
//将
fread(&stu[i],sizeof(struct
关闭文件
{
Printf("文件打开失败\n");exit(0);
}for(i=0;feof(fp)==0;i++)
StUdent),1,fp);//读取文件内容
fclose(fp);//
Printf("选择查找方式1按照姓名查找2按照学号查找");
SCanf("%d",&sway);
按照学号查找开始
///
*************************
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
{
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].y
ear,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();
}
流程图:
5.
evaluate。
函数
VOidevaluate()
{inti=0,j=0,sway,t,x;floatscore;
Charname[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("选择查找方式
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");
您查找的学生信息如下∖n姓名%s学号%s%d年%d月%d日当前考勤
数%d∖n",stu[j-1].name,stu[j-1].number,stu[j-1].sex,stu[j-1].y
ear,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)evaluate();
}
按照姓名查找结
/**********************
*************************///
按照学号查找开始
*************************
III
if(sway==2)
{
Printf("请输入需要修改学生的学号");
IIPrintf("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
{
Printf("
别%c生日
II查询成功
您查找的学生信息如下∖n
%d年%d月%d日
姓名%s学号%s性当前考勤次
Printf("}
该生当前考勤分数为%5.2f",score);
数%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=(StuIj-1].kq)∕kqcs*100;
Printf("是否继续计算其他学生考勤分数0否1是");
SCanf("%d",&x);if(x==1)evaluate();
}
[**********************
按照学号查找结束
*************************
III
Printf("0返回主菜单∖n");getchar();
a=getchar();
getchar();
if(a=='0')main();
}
流程图:
三、测试及调试(测试方案、存在的问题及解决方法)
测试方案:
按照每个函数功能进行测试,在做完每个函数对其进行测试,主函数测试,先将所有需要的功能模块函数设置为空,每个函数用一个Printf语句来测试主函数。
1.存在问题:
开始将生日定义为字符数组,当用SCanf来输入年月日时,年月
日之间用空格分隔,但在输出时发现年月日出现错误。
分析原因:
用SCanf输入年月日时,系统会把用来分隔的空格当做字符读入。
解决方法:
将年月日定义为整型,这样就可以用SCanf输入,用空格隔开。
2.存在问题2:
在查找数据时,需要先将所有数据读入一个结构体数组,在读
取后未关闭文件,执行查找时查找不到相关信息。
分析原因:
再利用for循环读取全部文件内容后,文件指针将会移至文件末尾,这样再执行查找时就会从文件末尾开始,显然不符合要求,所以会出现错误。
解决方法:
在读取完数据后先关闭文件,在查找时再次打开文件,这时文件指针就会指向文件开头。
3.存在问题3:
再多个使用getchar或者gets输入的时候,会出现直接跳过输入的情况。
分析原因:
在使用getchar或者gets输入的时候,系统会将前一步用来确
认执行的回车当成字符读入,导致跳过该步输入。
解决方法:
再getchar或者gets前面加上getchar()语句,读掉回车,下
面的getchar或者gets就可以正常输入。
四、小结
通过编写该程序,熟悉了C语言的基本语法,选择,循环等结构,深入练习了函数的调用方法,和文件的读写方法,熟悉了结构体的使用,更加深化了面向过程语言思想,和一些基本算法。
通过对程序的后期调试,熟悉了C常见错误,锻炼了思维的严密性,和完备性。
通过对程序的注释和画流程图,形成了一套自己编程的风格,和清晰地思路,使思维更加条理化,清晰化。
附件:
主要源程序代码(需打印)
#include
#include
#include
FlLE*fp;//定义文件
Chara;〃返回选择变量
floatkqcs=0;〃应到考勤次数变量
StrUCtStUdent
{Charname[10];
Charnumber[11];
Charsex;
intyear;
intmonth;
intday;
intkq;
}stu[100];//定义储存学生信息的结构体
数组
主函数开
女台************************************************
voidmain(){
VOidinPut();
//录入数据函数
VOidChange();
〃修改数据函数
voidSearCh();
//查询数据函数
voidevaluate();
//计算总评函数
Charitem;
SyStem("color34");
Printf("
★◊★□★◊★□★◊★□★◊★□
★◊★□★\n");
Printf("
•
•\n");
Printf("
◊学生考勤管
理系统
Printf("
•
•\n");
Printf("
◊BY朱胜佳
◊\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");
***************************
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();
P