程序设计实验报告学生考勤系统.docx
《程序设计实验报告学生考勤系统.docx》由会员分享,可在线阅读,更多相关《程序设计实验报告学生考勤系统.docx(20页珍藏版)》请在冰豆网上搜索。
程序设计实验报告学生考勤系统
C语言程序设计
课程报告
所在学院
计算机科学学院
所在班级
计算机科学与技术1班
小组成员
XX(组长)
(41212008)
XXX(副组长)
(41212007)
XXX(组员)
(41212006)
XXX(组员)
(41212005)
指导老师
XXX
XXXX大学
XXXX年X月X日
学生考勤系统(实验总结报告)
题目:
学生考勤系统设计
功能:
学生考勤系统应包含各班学生的全部信息。
每个学生是一条记录,包括姓名、性别、学号、出勤情况等。
本系统可模拟考勤过程,记录考勤结果,并能够在课程结束后按照设定的考勤评分标准自动给出每个学生的考勤分数。
分步实施:
1、初步完成总体设计,搭好框架,确定人机对话界面,确定函数个数;
2、建立一个文件,将每条记录信息写入文件中并能显示于屏幕上
3、完成上述添加(出勤情况)、查找(学号,姓名,性别等)、修改等功能。
4、进一步要求:
自动给出每个学生的考勤分数
要求:
1、用C语言实现程序设计;
2、利用结构体数组实现信息的数据结构设计;
3、系统的各个功能模块要求用函数的形式实现;
4、界面友好(良好的人机交互),程序加必要的注释。
数据类型
//数据类型定义
structstu_check//定义学生基本信息数据结构类型
{
charnam[10];//存放学生姓名
charnum[10];//存放学生学号
charsex[6];//存放学生性别
charche_now[5];//存放学生签到状态
floatche_add;//存放学生出勤次数
floatche_sult;//存放学生出勤成绩
floatstand;//签到标准次数
};
全局变量声明
intNUM;//定义一个NUM代表学生总数;
charcla[100];/*定义一个字符数组存放文件名*/
FILE*file;//定义一个文件指针file;
structstu_checkst_infor[100];//定义一个stu_check类型的结构体数组;
程序的总体设计(算法)
函数算法设计
主系统函数:
intmain(void)//工程主函数;
{
begin//开始
fun_intro();//执行fun_into()函数;
PAUSE;
ensure()
PAUSE;
stu_system();//执行stu_system()函数;
PAUSE;//暂停;
return0;//工程主函数执行完后返回0值;
end//结束;
}
流程图
voidstu_system(void)//系统主函数;
{
begin//开始;
system(cls);//清屏;
sys_menu();//执行sys_menu()函数;
print(执行:
);//输出“执行:
”;
input(opt);//输入opt的值;
switch//多分支执行;
{
opt=1sign_in();//当opt的值为1时,进入签到界面;
opt=2stu_find();//当opt的值为2时,进入查询界面;
opt=3stu_rev();//当opt的值为3时,进入修改界面;
opt=4quit_sys();//当opt的值为4时,退出系统;
defaultprint(出错\n请重新选择\n);stu_system();//当opt的值不满足以上时,输出“出错”换行,输出“请重新选择”,换行,回到首页;
}
end//结束;
}
流程图
voidsign_in(void)//学生签到服务函数;
{
begin//开始;
system(cls);//清屏;
stu_open(“r”);//以“读”的方式打开文件;
st_infor[NUM];//含有“NUM”个元素的结构体数组;
print(请输入您的学号:
);//输出……;
input(number);//输入“number”的值;
i<-0;//把0赋给i;
while(i{
fread(st_infor[i],file);//打开file文件,将文件内容传递给结构体变量;
i=i+1;//i加1;
}
i<-0;//同上;
while(i{
if(st_infor[i].num=number)//当成立时,执行下面语句;
{
if(st_infor[i].che_now=“未签到“)//同上;
{
st_infor[i].che_now<-“签到“;//将”签到“赋给“check_now”;
st_infor[i].che_add=st_infor[i].che_add+1;//“check_add加1;print(签到成功);//同上;
}
else//当if不成立时,执行下面语句;
print(您已签到);//同上;
}
i=i+1;//同上;
}
keepf();//保存“file”文件;
jump_sys(sign_in);//向其他功能跳转;
end//结束;
}
流程图
voidstu_find(void)//学生考勤信息查询函数;
{
begin//开始;
system(cls);//清屏;
print(请选择\n);//
lace(80);//
print(\t\t\t\t1、打开学生信息列表\n);//
print(\t\t\t\t2、按姓名查找\n);//
print(\t\t\t\t3、按学号查找\n);//
lace(80);//
print(执行:
);//
input(opt);//
switch//
{
opt=1stu_list();//执行stu_list()函数;
opt=2find_nam();//
opt=3find_num();//
defaultprint(出错\n);stu_find();//输出“出错”,执行stu_find()函数;
}
end//结束;
}
流程图
voidstu_rev(void)//学生信息修改函数;
{
begin//
system(cls);//清屏;
if(se_cod())//如果密码正确,执行修改操作;
print(密码正确\n);
else//如果密码错误,返回到首页;
{
print(密码错误\n);
print(返回到首页\n);
stu_system();
}
print(请选择\n);
lace(n);
print(\t\t\t\t1、修改学号\n);
print(\t\t\t\t2、修改性别\n);
print(\t\t\t\t3、修改签到记录\n);
print(\t\t\t\t4、新建学生出勤信息\n);
lace(n);
print(执行:
);
input(opt);
switch
{
opt=1rev_num();
opt=2rev_sex();
opt=3rev_nam();
opt=3nstu_infor();
defaultprint(出错\n);print(返回上一页\n);stu_rev();
}
end//
}
流程图
voidquit_sys(void)//退出考勤系统函数;
{
begin//
st_infor[NUM];//
if(se_cod())
{
print(密码正确,允许退出系统);/*只能以管理员的身份执行退出操作*/
PAUSE;
}
else
{
print(密码错误,禁止退出);
print(请返回到首页);
PAUSE;
stu_system();
}
stu_open(“r”);//
i<-0;//
while(i{
fread(st_infor[i],file);//
i=i+1;//
}
i<-0;//
while(i{
st_infor[i].che_now<-“未签到”;//把”未签到”赋给”che_now”;
st_infor[i].che_sult<-(st_infor[i].che.add/st_infor[i].stand)*100;//用签到次数与标准次数的比值的100倍来表示总分数;
st_infor[i].stand=stand+1;//stand加1;
i=i+1;//
}
keepf();//保存file文件;
exit;//退出系统;
end//
}
流程图
主函数源代码
intmain(void)/*工程主函数*/
{
fun_intro();/*执行fun_into()函数*/
system("PAUSE");/*暂停*/
ensure();
system("PAUSE");
system(“cls”);
stu_system();/*执行stu_system()函数*/
system("PAUSE");/*暂停*/
return(0);/*工程主函数执行完后返回0值*/
}
效果图
介绍系统功能:
voidstu_system(void)/*系统主函数*/
{
intopt;
system(“cls”);
sys_menu();/*执行sys_menu()函数*/
printf("执行:
");/*输出“执行:
”*/
scanf("%i",&opt);/*输入opt的值*/
switch(opt)/*多分支执行*/
{
case1:
sign_in();break;/*当opt的值为1时,进入签到界面*/
case2:
stu_find();break;/*当opt的值为2时,进入查询界面*/
case3:
stu_rev();break;/*当opt的值为3时,进入修改界面*/
case4:
quit_sys();break;/*当opt的值为4时,退出系统*/
default:
printf("出错\n请重新选择\n");stu_system();/*当opt的值不满足以上时,输出“出错”换行,输出“请重新选择”,换行,回到首页*/
}
}
主界面:
voidsign_in(void)/*学生签到服务函数*/
{
inti;
charnumber[10];
system(“cls”);
stu_open("r");/*以“读”的方式打开文件*/
printf("(请输入您的学号:
");
scanf("%s",number);/*输入“number”的值*/
for(i=0;i{
fread(&st_infor[i],sizeof(structstu_check),1,file);/*打开file文件,将文件内容传递给结构体变量*/
}
for(i=0;i{
if(!
strcmp(st_infor[i].num,number))
{
if(!
strcmp(st_infor[i].che_now,"未签到"))
{
strcpy(st_infor[i].che_now,"签到");/*将"签到"赋给“check_now”*/
st_infor[i].che_add++;/*“check_add加1*/
printf("签到成功\n");
}
else
{
printf("您已签到\n");
}
}
}
keepf();/*保存“file”文件*/
jump_sys(sign_in);/*向其他功能跳转*/
}
签到界面:
voidstu_find(void)/*学生考勤信息查询函数*/
{
intopt;
system(“cls”);
lace(80);
printf("请选择\n");
printf("\t\t\t\t1、打开学生信息列表\n");
printf("\t\t\t\t2、按姓名查找\n");
printf("\t\t\t\t3、按学号查找\n");
lace(80);
printf("执行:
");
scanf("%i",&opt);
switch(opt)
{
case1:
stu_list();break;/*执行stu_list()函数*/
case2:
find_nam();break;
case3:
find_num();break;
default:
printf("出错\n");stu_find();/*输出“出错”,执行stu_find()函数*/
}
}
查询界面:
信息列表:
voidstu_rev(void)/*学生信息修改函数*/
{
intopt;
system(“cls”);
if(se_cod())/*如果密码正确,执行修改操作*/
{
printf("密码正确\n");
}
else/*如果密码错误,返回到首页*/
{
printf("密码错误\n");
printf("返回到首页\n");
stu_system();
}
printf("请选择\n");
lace(80);
printf("\t\t\t\t1、修改学号\n");
printf("\t\t\t\t2、修改性别\n");
printf("\t\t\t\t3、修改签到记录\n");
printf("\t\t\t\t4、新建学生出勤信息\n");
lace(80);
printf("执行:
");
scanf("%i",&opt);
switch(opt)
{
case1:
rev_num();break;
case2:
rev_sex();break;
case3:
rev_sig();break;
case4:
nstu_infor();break;
default:
printf("出错\n");printf("返回上一页\n");stu_rev();
}
}
修改界面:
修改学号:
voidquit_sys(void)/*退出考勤系统函数*/
{
inti;
if(se_cod())
{
printf("密码正确,允许退出系统\n");/*只能以管理员的身份执行退出操作*/
system("PAUSE");
}
else
{
printf("密码错误,禁止退出\n");
printf("请返回到首页\n");
system("PAUSE");
stu_system();
}
stu_open("r");
for(i=0;i{
fread(&st_infor[i],sizeof(structstu_check),1,file);
}
for(i=0;i{
strcpy(st_infor[i].che_now,"未签到");/*把”未签到”赋给”che_now”*/
//st_infor[i].che_add=8;
st_infor[i].che_sult=(float)((st_infor[i].che_add/st_infor[i].stand)*100.0);/*用签到次数与标准次数的比值的100倍来表示总分数*/
st_infor[i].stand++;/*stand加1*/
}
keepf();/*保存file文件*/
exit(0);/*退出系统*/
}
退出界面:
测试情况及调试中问题与解决方案
1、函数声明问题
编译时出现函数未被声明或定义的错误
解决方法
对于在不同文件中的函数,当调用某函数时,首先需要进行外部函数声明;对于在同文件中的函数,如果被调用函数在主调用函数之后定义,则需进行函数声明。
2、全局变量与局部变量
用C实现算法时,需要选用不同的作用域的变量,两种变量的声明与使用问题
解决方法
全局变量在文件最开始声明,可以被以后定义的所有函数使用,而局部变量仅限于在函数体内使用,离开函数,则失去意义。
3、调试中出现的语法错误
在编辑源代码时,出现语法错误
解决方法
错误原因用两种:
其一,由于疏忽大意而编写错误,遗漏或误加词语;
其二,对于C语法没有掌握;针对这两种错误原因解决方法有:
1、在根据算法编写源代码时,要充分理解算法的含义,再结合C的语法规则选择合适的语句,2、编写代码时需仔细认真。
4、编译与链接
编译时无错误,链接时出错
解决方法
错误原因是主调函数调用的函数进行了声明,却没有进行定义,因此编译时没有错误提示,但是,链接时由于找不到所声明的函数,所以会报错。
因此只需对被调用函数进行定义即可。
5、运行中
测试时有时出现程序出错
解决方法
编译与链接时,编译器没有显示错误并不表示程序是正常的,因此需要自己在其中寻找错误,一般情况,在运行时出现错误大多是算法有错误,因此出现这种情况需重新审视算法的设计。
小结
引用著名计算机科学家沃思的公式:
数据结构+算法=程序。
算法是程序的灵魂,数据是躯体。