C语言课程设计学生考勤系统_第1页
C语言课程设计学生考勤系统_第2页
C语言课程设计学生考勤系统_第3页
C语言课程设计学生考勤系统_第4页
C语言课程设计学生考勤系统_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言程序设计

课程设计报告

设计题目:学生考勤系统设计

专业微电子科学与工程

班级微电⑶

学生赵杨怡

指导教师_________________

.扬扬我//单

年学期

设计任务:C语言课程设计任务书10

题目:学生考勤系统设计

功能:学生考勤系统应包含各班学生的所有信息。每个学生是一条记录,涉

及姓名、性别、学号、日期、节次、出勤情况等信息。本系统可以模拟考勤

过程、记录考勤结果,并能在课程结束后按照设定的考勤评分标准自动给出

每个学生的考勤分数。

规定:1、用c语言实现程序设计;

2.运用结构体进行相关信息解决;

3.系统的各个功能模块规定用函数的形式实现;

4、界面和谐(良好的人机交互),程序加必要的注释。

平时成绩:验收答辩成绩:设计报告成绩:

总评成绩:指导教师:

一、总体设计

1.程序的总体设计

◎拟定界面,使用户可选择操作项目(录入,修改,查询,评分)。

◎录入功能:使用结构体,规定用户输入姓名、性别、学号、日

期、节次、当前出勤情况等信息,并写入文献。

◎修改功能:使用户输入学号,姓名其中一项可以修改考勤

其信息。对于修改功能的实现,是先将所有文献内容读入到内存中,

然后修改考勤值,最后再重新覆盖写入文献。

◎查询模块:使用字符串比较函数,运用循环找到相应

结构体数组元素,然后输出需要信息。对于查询功能的实现,同修改,

是先将所有文献内容读入到内存中,然后查找到其中某项,最后输

出到屏幕。

◎评分模块:系统根据总的应道考勤数按照百分制,求

出每个学生的分数,并输出到屏幕。

2.数据结构

学生信息用结构体记录,涉及姓名(字符数组)、性别(字符型)、

日期(年月日三个字符数组)、节次(整型)、出情况(整型)。

3,函数原型声明

•\n〃);

printfCOBY朱胜佳

◊\n〃);

printfC

•\n〃);

printf(〃★◊★口★◊★口★◊★

□★◊★口★◊★口★\n〃);

printf("

•\n〃);

printf("O1.学生信息及

考勤情况录入◊%〃);

printfC

•\n〃);

printf(〃O2.学生信息及

考勤情况修改◊如〃);

printf("

•\n〃);

printfCO3.学生信息及

考勤情况查询◊'');

printf(〃◎

◎\n〃);

printf(〃4.学生考勤总

评分数查询•"〃);

printfC◊

◊\n〃);

printf("★◊★口★◊★口★◊★

□★◊★□★◊★口★\n〃):〃用户界面

printfCW);

printf("请选择您需要的操作\n");

scanf;

switch(item)

(

case,T:input();break;

case'2':change();break;

case'3':search();break;

case'4':evaluate();break;

)〃实现功能选择

流程图:

2.input()函数

voidinput()

inti,j=0,jx=l;

printf(,z************************学生基本信息录入

\v~«'\

Zj*Z7^Z7X^TX*1XZj%ZTX^TXZTN»|XZ7^ZT%XT%Z7*ZJ>ZTXXT>Z7^Z7X\|

if((fp=fcpen(,zdate.txt","w〃))=二NULL)

printf(〃文献打开失败\n");

exit(0);

)

for(i=0;jx==l;i++)〃输入信息循环

{for(;j==0;)〃输入确认循环

(

getchar();

printf(〃请输入第%d个学生的姓名〃,i+1);

gets(stu[i].name);

printf(〃请输入第%d个学生的学号

gets(stu[i].number);

printf(〃请输入第%d个学生的性别(男:m女:f)〃,计1);

stu[i].sex=getchar();

printf(〃请输入第%d个学生的生日(格式:年月日)

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日\n0重输1确认

〃,stu[i].name,stu[i].number,stu[i].sex,stu[i].year,stufi].mont

h,stu[i].day);

scanf&j);〃输入确认

}

j=0;

if(fwrite(&stu[i],sizeof(structstudent),1,fp)!=1)

printf(〃文献写入错误\n〃);〃写入文献

printfC是否继续输入下一个学生信息0终止1

继续\n〃);

scanf&jx);//继续输入

选择

)

fclose(fp);

printfCO返回主菜单\n〃);

getchar();

a=getchar0:

getchar();

if(a==,O')main();〃返回主菜单

流程图:

:IT必

3.change()函数

voidchangeO

{inti=0,j=0,sway,t,x;

charname[10],number[10];

printf(z/**********************学生考勤修

IW*7^ZJ*Z7XXTXZTXZTS*TXZ7SZJXXTSZTX*TSrTSX7XXJSZT>ZTSZTXX7XZT*ZJSXISZTSZTXZ7VZ7X\II

if((fp=fopen(,zdate.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);

/**********************按照姓名查找开始

vizslz//////

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\n”,stu[j-l].name,stu[j-l].number,stu[j-l].sex,y

ear,stu[j-l].month,stu[j-l].day,kq);

printf(〃是否修改该生考勤信息0否1是〃);

〃选择是否修改考勤

scanf&x);〃输入选择变量值

if(x==l)

(

printf(〃请输入新的考勤值〃);

scanf&stu[j~l].kq);〃输入

新的考勤值

if((fp=fopen("date.txt〃,"w"))==NULL)//

以只写方式打开文献

(

printf("文献打开失败\n〃);

exit(0);

)

for(j=0;j<i;j++)

if(fwrite(&stu[.j],sizeof(structstudent),1,fp)!=1)printf(〃文献

写入错误\n〃);〃写入文献

fclose(fp);//关闭文献

)

}

printf(〃是否继续修改其他学生考勤0否1是〃);

scanf("%d〃,&x);

if(x==l)change();

)

/********************合按照姓名查找结束

/**********************才安照学号查找开始

7/*2*7,///

*7*✓TX^T>Z7**7^*TX///

if(sway==2)

printf(〃请输入需要修改学生的学号〃);

//printf("i二%d",i);

scanf(z/%s,z,number);

for(j=O;t!=O;j++)

{

t=strcmp(stu[j].number,number);

{

t=0;

printf(〃未找到您所查询的数据,请重新输入\n〃);

)

)

if(j<i)〃查询成功

(

printf(〃您查找的学生信息如下\n姓名%s学号%s性

别%c生日%d年%d月%d日当前考勤次

数%d\n〃,stu[j-l].name,stu[j-l].number,stu[j-l].sex,stu[j-l].y

ear,stu[j-l].month,stu[j-l].day,stu[j-l].kq);

printf(〃是否修改该生考勤信息0否1是〃);

〃选择是否修改考勤

scanf&x);〃输入选择变量值

if(x==l)

(

printf(〃请输入新的考勤值〃);

scanf&stu[j-l].kq);〃输入

新的考勤值

if((fp=fopen(,zdate.txt〃,"w"))=NULL)//

以只写方式打开文献

(

printf(〃文献打开失败\n〃);

exit(0);

)

for(j=0:j<i:j++)

if(fwrite(&stu[j],sizeof(structstudent),1,fp)!=1)printf(〃文献

写入错误\n〃);〃写入文献

fclose(fp);〃关闭文献

)

)

printf(〃是否继续修改其他学生考勤0否1是〃);

scanf&x);

if(x==l)change();

)

/********************5^按照学号查找结束

sjzs|zsj^slzsjzsl^^lz///

^T>iff

printffO返回主菜单\n〃);

getchar();

a=getchar();

getchar();

if(a二二'O')main();

N

输入X值选择

4.search()函数

voidsearch()

inti=0,j=0,sway,t,x;

charname[10],number[10];

printf("***********************学生信息查询

♦k\y、I•

*T**T**TX*T**T**T*XTszT^*TS>T**T^*Tx\II

if((fp二fopcn("date,txt",〃r"))==NULL)〃将

文献内容读入内存

(

printf(〃文献打开失败\n〃);

exit(0);

)

for(i=0;feof(fp)==0;i++)fread(&stu[i],sizeof(struct

student),1,fp);〃读取文献内容

fclose(fr);〃关闭文献

printf(〃选择查找方式1按照姓名查找2按照学号查找〃);

scanfftsway);

/**********************按照姓名查找开始

■[.///

l//

if(sway==l)

(

printf(〃请输入需要修改学生的姓名〃);

//printf(,,i=%d,z,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\n,z,stu[j-l].name,stu[j-l].number,stu[j-l].sex,stu[j-l].y

ear,stu[j-l].month,stu[j-1].day,kq);

)

printf(〃是否继续查询其他学生信息0否1是〃):

scanf&x);

if(x==l)search();

)

/**********************按照姓名查找结束

>T>xjx*£*xl*/fi/t/

/**********************按照学号查找开始

xZxvjxxlxvlxsixsJxsixsXxvlxffI

<IX///

if(sway==2)

printf(〃请输入需要修改学生的学号〃);

//printf(,zi=%d,z,i);

scanfnumber);

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性

别枇生日%d年%d月%d日当前考勤次

数%d\n〃,stu[j-l].name,stu[j-l].number,stu[jT].sex,stu[j-l].y

ear,month,day,kq);

)

printf(〃是否继续查询其他学生信息0否1是〃);

scanf&x);

if(x==l)search();

)

/********************合按照学号查找结束

*1**1**1**1**1**1*^1**1*///

>T^*1**7*>T^*7^^7^^7^/

printfCO返回主菜单\n〃);

getchar();

a=getchar();

getchar();

if(a二二'O')main();

)

流程图:

输入要查输入要查找

5.evaluate()函数

voidevaluate()

{inti=0,j=0,sway,t,x;

floatscore;

charname[10],number[10];

printf(,z***********************学生考勤分数计算

\**>、•

\III

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("猊”,&sway);

/**********************按照姓名查找开始

I/!

zT^z?vZT*yTvzT^yr*iff

if(sway==l)

(

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;

prinlf(〃未找到您所查询的数据,请重新输入\n〃);

)

if(j<i)〃查询成功

{

printf(〃您查找的学生信息如下\n姓名%s学号%s性

别%c生日%d年%d月%d日当前考勤次

数%d\n〃,stu[j-l].name,stu[j-l].number,stu[j-l].sex,stu[j-l].y

ear,stu[j-l].month,stu[j-l].day,stu[j-l].kq);

score=(stu[j-1].kq)/kqcs*100;

printf("该生当前考勤分数为%5.2f”,score);

)

printf(〃是否继续计算其他学生考勤分数。否1是〃);

scanf&x):

if(x==l)evaluate();

)

/**********************按照姓名查找结束

vizslz///

///

/**********************按照学号查找开始

KJ**1**1**1**1**1*///

iff

if(sway=2)

printf(〃请输入需要修改学生的学号〃);

//printf(z,i=%dz,,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\n”,stu[j-l].name,stu[j-l].number,stu[j-l].sex,y

ear,stu[j-l].month,stu[j-l].day,kq);

score=(stu[j-l].kq)/kqcs*100;

p二intf(〃该生当前考勤分数为%5.2铲,score);

)

printf(〃是否继续计算其他学生考勤分数0否1是〃);

scanf("%d",&x);

if(x==l)evaluate();

)

/********************;^按照学号查找结束

sixslzsix///

^///

printffO返回主菜单\n〃);

getchar();

a=getchar();

getchar();

if(a二二'O')main();

流程图:

三、测试及调试(测试方案、存在的问题及解决方法)

1.测试方案:按照每个函数功能进行测试,在做完每个函数对其

进行测试,主函数测试,先将所有需要的功能模块函数设立为

空,每个函数用一个printf语句来测试主函数。

存在问题:开始将生日定义为字符数组,当用scanf来输入年月日时,年月

日之间用空格分隔,但在输出时发现年月日出现错误。

分析因素:用scanf输入年月日时,系统会把用来分隔的空格当做字符读

入。

解决方法:将年月日定义为整型,这样就可以用scanf输入,用空格隔开。

2.存在问题2:在查找数据时,需要先将所有数据读入一个结构体数组,在

读取后未关闭文献,执行查找时查找不到相关信息。

分析因素:再运用for循环读取所有文献内容后,文献指针将会移至文献

末尾,这样再执行查找时就会从文献末尾开始,显然不符合规定,所以会

出现错误。

解决方法:在读取完数据后先关闭文献,在查找时再次打开文献,这时文

献指针就会指向文献开头。

存在问题3:再多个使用getchar或者gets输入的时候,会出现直接跳过输入

的情况。

分析因素:在使用getchar或者gets输入的时候,系统会将前一步用来确认

执行的回车当成字符读入,导致跳过该步输入。

解决方法:再getchar或者gets前面加上getchar()语句,读掉回车,下面的

getchar或者gets就可以正常输入。

四、小结

通过编写该程序,熟悉了C语言的基本语法,选择,循环等结构,进一

步练习了函数的调用方法,和文献的读写方法,熟悉了结构体的使用,更加深

化了面向过程语言思想,和一些基本算法。

通过对程序的后期调试,熟悉了C常见错误,锻炼了思维的严密性,和完备

性。

通过对程序的注释和画流程图,形成了一套自己编程的风格,和清楚地思绪,

使思维更加条理化,清楚化。

附件:重要源程序代码(需打印)

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

FILE*fp;〃定义文献

chara;〃返回选择变量

floatkqcs=0;〃应到考勤次数变量

structstudent

{charname[10];

charnumber[l1J;

charsex;

intyear;

intmonth;

intday;

intkq;

}stu[100];〃定义储存学生信息的结构体

数组

函数开

*1*«£**4**£**£*vl«K1**1**2^■>vl*«£^*£**3*K1*KI**£**2**2**3*K1**1**1^*2**£**3*K1#^1**£**£**3*K1«<I><1**2*vl*K1«

J/::•卜•卜•;、*J%•卜■卜•[、•卜•卜•;、*,«■;••[••[、•卜•;、・;•,[••[••;、,••卜•[••卜•[、•.、•卜•[••[、•;、.••卜•卜•.•rj*•[,.[••;、•;、«卜■卜

voidmain()

(

voidinput();〃录入数据函数

voidchange();〃修改数据函数

voidsearch();〃查询数据函数

voidevaluate();〃计算总评函数

charitem;

system("color34");

printf(n★◊★口★◊★口★◊★口★◊★口

★◊★□★、/);

prinif(M

•\n");

printf(MO学生考勤管

理系统◊、/);

printf(n

•\nn);

printf(nOBY朱胜佳

◊\n)

printf("

・\n");

printf(M★◊★口★◊★匚★口

★◊★□★◊★口★\n");

printf("•

•\n)

printf("O1.学生信息及考勤

情况录入O\n");

printf(M•

•\n)

printf(H◊2.学生信息及考勤

情况修改◊\n”);

printf(n•

•\n)

printf("O3.学生信息及考勤

情况查询◊\n”);

printf(n◎

O\n,f);

printf("•4.学生考勤总评分

数查询

printf(nO

◊\n");

printf("★◊★口★◊★匚★◊★口

★◊★□★◊★口★\nH);〃用户界面

printf(',\nH);

printf(n请选择您需要的操作\n");

scanf("%c",&item);

switch(item)

case'I1:input();break;

case2:change();break;

case3:search();break;

case4:evaluate();break;

//实现功能选择

〃//小本一1・小木不不木木小木木不字本小小木*1琴**1«小小小木-木]・*1不**1小*小小•水1・*军1**1本*小■小小"字小融小小*好小*木2^■小融〈上小•如本“字一I个小王.、困彳.

-jL*fr^.1.K1>*3**1*■1>«i>*1**1**1*«1>K1**1**1**X**£**1*.!**1**2*7,KI*.!**1*

fN-**[7J*Jw*jw*jw*j«.尸rj**Jwrj*..•*Jw*J**J«*jw*jw

MA2口Zix

///*****************************************录入数据函数内

,,;7IJ/»zV*X*^4•1«.酎«*«^9»^9^^9^»>*)««X*«3a

,▲I1^"、,;..卜*Tw.[•*T*»T».[.'I,,[.*T»»^w.[・.1.*T»»Tw»Tw-7。*T**!»rT»»T»rT»^Z**Tw.[.rTwrTw*Tw»TwrTw*7,»T»»TwrT»^Tw»Tw»Tw.1.rT»rTw*T»»Tw•[•»Tw*Tw*Tw*Tw

4u*zI%U

voidrecord()

inti,j=O,jx=l;

printf(n************************学生基本信息录入

小小小小事不小小小小小事*小小小小木木率小小小*k木小小木小小\n••\).

if((fp=fopen(,,date.txt,',Mw<'))==NULL)

printf("文献打开失败\n”);

exit(O);

)

for(i=0;jx==l;i++)〃输入信息循环

{for(;j==0;)〃输入确认循环

(

getchar();

printf("请输入第%d个学生的姓名”,i+l);

gets(stu[i].name);

printf(”请输入第%d个学生的学号”,i+l);

gets(stu[i].number);

printf(”请输入第%d个学生的性别(男:m女:f)u,i+l);

stu[i].sex=getchar();

printf("请输入第%d个学生的生日(格式:年月日)”,i+l);

scanf(,'%d%d%d,1,&stufi].year,&stu[i].month,&stu[i].day);

printf(”请输入第%d个学生的当前考勤次数

scanf("%d”,&stu[i].kq);

printff您输入的信息为姓名%s学号%s性别%c生日%d

年%d月%d日\n0重输1确认

H,,stufi].number,stufi].sex,stufi].year,stu[i].month,stufil.day);

scanf("%d",&j);〃输入确认

j=0;

if(fwrite(&stu[i],sizeof(structstudent),l,fp)!=l)printf("文献写入错误

\nH);〃写入文献

printfC1是否继续输入下一个学生信息0终止1继续

\n");

scanf(u%dH,&jx);〃继续输入选择

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论