完整word版C语言课程设计学生考勤系统方案Word格式.docx
《完整word版C语言课程设计学生考勤系统方案Word格式.docx》由会员分享,可在线阅读,更多相关《完整word版C语言课程设计学生考勤系统方案Word格式.docx(45页珍藏版)》请在冰点文库上搜索。
系统根据总的应道考勤数按照百分制,求出每个学
生的分数,并输出到屏幕。
2.数据结构
学生信息用结构体记录,包括姓名(字符数组)、性别(字
符型)、日期(年月日三个字符数组)、节次(整型)、出情况(整型)
3.函数原型声明
voidmain()//主函数
voidinput();
//录入数据函数
voidchange();
//修改数据函数
voidsearch();
//查询数据函数
voidevaluate。
;
//计算总评函数
、详细设计
1.main()函数
voidmain()
{
//
voidchange();
//voidevaluate();
//charitem;
system("
color34"
);
printf("
□★◊★□★\n"
printf("
•\n"
管理系统
◊\n"
录入数据函数
修改数据函数
查询数据函数计算总评函数
★◊★□★◊★□★◊★□★◊★
◊学生考勤
◊BY朱胜佳
printf("
•
★◊★□★◊★□★◊★
□★◊★□★◊★□★\n"
•
◊
1.
学生信息及
考勤情况录入
2.
考勤情况修改
3.
考勤情况查询
◎
◎\n"
4.
学生考勤总
评分数查询
★◊★□★◊★□★◊★
//用户界面
\n"
请选择您需要的操作\n"
scanf("
%c"
&
item);
switch(item)
case'
1'
:
input();
break;
case2:
change();
case3:
search();
4'
evaluate();
}//实现功能选择
}
流程图:
2.input()函数
voidinput()
inti,j=O,jx=1;
•************************
学生基本信息录入
**\n"
***************************
if((fp=fopen("
date.txt"
"
w"
))==NULL){
文件打开失败\n"
exit(0);
for(i=0;
jx==1;
i++)//输入信息循环
{for(;
j==0;
)//输入确认循环
getchar();
请输入第%4个学生的姓名"
i+1);
gets(stu[i].name);
请输入第%4个学生的学号"
gets(stu[i].number);
请输入第%d个学生的性别(男:
m女:
f)"
stu[i].sex=getchar();
请输入第%4个学生的生日(格式:
年月日)"
scanf("
%d%d%d"
stu[i].year,&
stu[i].month,&
stu[i].day);
请输入第%(个学生的当前考勤次数"
%d"
&
stu[i].kq);
您输入的信息为姓名%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);
j);
//输入确认
j=0;
if(fwrite(&
stu[i],sizeof(structstudent),1,fp)!
=1)
文件写入错误\n"
//写入文件
是否继续输入下一个学生信息0终止1
继续\n"
jx);
//继续输入
选择
fclose(fp);
0返回主菜单\n"
a=getchar();
if(a=='
0'
)main();
//返回主菜单
0=>
j
Y
j=0?
N
8
输入j值选择是否确认
输入jx值选择是否继续
/输入i+1个学生信
i+1=>
i
写入文件
1=>
jx
开始
打开文件
结束
3.change。
函数
voidchange()
{inti=0,j=0,sway,t,x;
charname[10],number[10];
**********************
jz改**************************\n"
if((fp=fopen("
r"
))==NULL)
件内容读入内存
学生考勤修
//将文
exit(0);
feof(fp)==0;
i++)
fread(&
stu[i],sizeof(struct
student),1,fp);
//读取文件内容
选择查找方式
sway);
[**********************
//
1按照姓名查找2
按照姓
关闭文件按照学号查找"
名查找开
III
*************************
if(sway==1)
请输入需要修改学生的姓名"
IIprintf("
i=%d"
i);
%s"
name);
for(j=0;
t!
=0;
j++)
t=strcmp(stu[j].name,name);
if(j==i)
t=0;
未找到您所查询的数据,请重新输入\n"
if(j<
i)II查询成功
您查找的学生信息如下\n姓名%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);
是否修改该生考勤信息0否1
//选择是否修改考勤
x);
//输入选择变量值
if(x==1)
请输入新的考勤值"
scanf("
stu[j-1].kq);
新的考勤值
))==NULL)//
以只写方式打开文件
文件打开失败\n"
j<
i;
stu[j],sizeof(structstudent),1,fp)!
=1)printf("
写入错误\n"
//关闭文件
是否继续修改其他学生考勤0否1是"
if(x==1)change();
按照姓名查找
按照学号查找
%s性
勤次
是"
输入
文件
if(sway==2)
请输入需要修改学生的学号"
IIprintf("
number);
t=strcmp(stu[j].number,number);
if(j==i){
if(jvi)//查询成功
您查找的学生信息如下\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);
是否修改该生考勤信息0否1是"
//输入
}for(j=0;
j++)if(fwrite(&
stu[j],sizeof(structstudent),1,fp)!
=1)printf("
文件
写入错误\n"
按照学号查找结束
O返回主菜单\n"
getchar();
O'
)main();
输入sway值选择查找方式
4.search。
voidsearch()
***********************
文件内容读入内存
学生信息查询
//将
i++)fread(&
选择查找方式1按照姓名查找2按照学号查找"
********************
按照姓名查找开始
if(j==i){
未找到您所查询的数据,请重新输入\n"
您查找的学生信息如下\n姓名%s学号%s
%c生日%d年%d月%d日当前考勤
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);
是否继续查询其他学生信息0否1是"
if(x==1)search();
照姓名查找
按照学号查找开
性
次
束
始
stu[j-1].name,stu[j-1].number,stu[j-1].sex,stu[j-1].y
按照学号查找结束
Sway=1?
Sway=2?
输入要查
找的姓名
查找姓名
1
F
查找学号
输入要查找
的学号
输出该生信息
5.evaluate。
voidevaluate()
floatscore;
************************
if(kqcs==0)
请输入应到考勤总数
%f"
kqcs);
读入内存
学生考勤分数计算
//请输入应到考勤总数
//将文件内容
/**********************
*************************///
//printf("
for(j=0;
}if(j<
i)
{printf("
别%c生日
//查询成功
您查找的学生信息如下\n
%d年%d月%d日
姓名%s学号%s性当前考勤次
该生当前考勤分数为%5.2f"
score);
score=(stu[j-1].kq)/kqcs*100;
是否继续计算其他学生考勤分数0否1是"
if(x==1)evaluate。
;
按照姓名查找结束
///
按照学号查找开始
查询成功
\n姓名%s学号%s性
日当前考勤次
您查找的学生信息如下
%c生日%d年%d月%d
该生当前考勤分数为%5.2f"
if(x==1)evaluate。
输入应到考勤
次数kqcs值
输入要查找的学号
输入要查找的姓名
将文件内容全部读入结构
计算考勤分数
三、测试及调试(测试方案、存在的问题及解决方法)
测试方案:
按照每个函数功能进行测试,在做完每个函数对其进行
测试,主函数测试,先将所有需要的功能模块函数设置为空,每个函数用一个printf语句来测试主函数。
1.存在问题:
开始将生日定义为字符数组,当用scanf来输入年月日时,年月
日之间用空格分隔,但在输出时发现年月日出现错误。
分析原因:
用scanf输入年月日时,系统会把用来分隔的空格当做字符读入。
解决方法:
将年月日定义为整型,这样就可以用scanf输入,用空格隔开。
2.存在问题2:
在查找数据时,需要先将所有数据读入一个结构体数组,在读
取后未关闭文件,执行查找时查找不到相关信息。
再利用for循环读取全部文件内容后,文件指针将会移至文件末尾,这样再执行查找时就会从文件末尾开始,显然不符合要求,所以会出现错误。
在读取完数据后先关闭文件,在查找时再次打开文件,这时文件指针就会指向文件开头。
3.存在问题3:
再多个使用getchar或者gets输入的时候,会出现直接跳过输入的情况。
在使用getchar或者gets输入的时候,系统会将前一步用来确认执行的回车当成字符读入,导致跳过该步输入。
再getchar或者gets前面加上getchar()语句,读掉回车,下
面的getchar或者gets就可以正常输入。
四、小结
通过编写该程序,熟悉了C语