《程序设计实践》课程设计报告(大学生考勤管理系统)

1 需求分析

大学生考勤是治理工作的重要内容,同时也是学校治理的重要组成部分,通过和指导老师交流,了解到本系统中的数据源于标准输入设备(如键盘),或者来自某文件,可以实现对大学生考勤信息的添加,根据需要也可查询用户所需的学生考勤信息、删除无价值的信息、修改错误的信息等,总之本系统,要具备如下功能:添加信息、查询信息、删除信息、修改信息、将信息排序、显示所有信息、数据统计、退出和保存信息,能够通过本系统便利的实现对学生考勤情况的把控,要求操作界面友好,便捷,有一定的容错率。

2 概要设计

  1. 数据组织

使用结构体数组临时存储每个学生信息和考勤情况,利用文件存储,达到对学生信息的永久记录。定义Enter()函数实现回车键返回菜单的功能,定义copy函数使两个学生信息进行交换,定义judge函数判断系统中是否已存在此学生,定义ADD()函数添加学生信息,定义find()函数查找学生信息,定义change()函数修改学生信息,定义Delete()函数删除学生信息,定义Print()函数打印学生信息,定义data()函数打印所需资料表。定义paixv()函数实现用姓名或学号对学生进行排序。

  1. 功能模块

需要实现的功能:

(1)新增学生信息数据。

2)数据的查找。

3)学生记录的修改

4)学生记录的删除

5)显示学生考勤数据列表。

6学生信息排序。

7)数据统计。

8)保存数据到文件中并从文件中读入数据。

3 运行环境(软、硬件环境)

1.硬件环境:PC机-内存 16GB

2.软件环境:操作系统-windows10

4 开发工具和编程语言

开发环境:Dev-C++5.11

编程语言:C语言。

5 详细设计

本系统实现了新增学生信息数据数据的查找学生记录的修改、学生记录的删除、显示学生考勤数据列表学生信息排序数据统计。具体展示如下:

5.1 新增学生数据

新增学生数据功能,需要输入学生的学号,如果学号已存在,显示此人已存在。如果学号不存在,输入学生姓名、班级、考勤日期和考勤结果。具体代码如下所示:

void ADD(){
	char ID[maxsize];
	printf("请输入学生的学号:");
	scanf("%s",ID);
	if(!judge(ID)){
		printf("此人已存在\n");
		printf("请按回车键返回\n");
		Enter();
		return; 
	}
	strcpy(students[num].studentID,ID);
	shuru("请输入学生的姓名:",students[num].Name);
	shuru("请输入学生的班级:",students[num].classNumber);
	shuru("请输入学生的考勤日期:",students[num].date);
	shuru("请输入学生的考勤结果:出 勤 √   旷 课 X   事 假 ▲   病 假 ●   迟 到 +   早 退 –",students[num].result);
	num++;
	printf("添加成功!按回车键返回\n");
	Enter(); 
} 

5.2 查找学生数据

查找学生数据功能选择按学号查找或按姓名查找,输入学号或姓名。如果存在此学生,打印学生信息。如果不存在此学生,显示不存在此信息。具体代码如下所示:

void find(){
	int i,op,flag=-1;//flag是是否查找到的标识 
	char information[maxsize];
	printf("<1>按学号查找  <2>按姓名查找");
	scanf("%d",&op);
	if(op==1){
		printf("请输入该生学号:");
		scanf("%s",information);
		for(i=0;i<num;i++){
			if(strcmp(information,students[i].studentID)==0)
			{
				printf("%s %s %s %s %s\n\n",students[i].studentID,students[i].Name,students[i].classNumber,students[i].date,students[i].result);
				flag=1;
			}
				}
	}
	else if(op==2){
		printf("请输入该生姓名:");
		scanf("%s",information);
		for(i=0;i<num;i++){
			if(strcmp(information,students[i].Name)==0)
			{
				printf("%s %s %s %s %s\n\n",students[i].studentID,students[i].Name,students[i].classNumber,students[i].date,students[i].result);
				flag=1;
			}
				}
	} 
	if(flag==-1)//没有找到该学生 
		printf("不存在此信息\n");
	printf("查找完成!按回车键返回\n");
	Enter();
} 

5.3 修改学生记录

修改学生记录功能先选择按学号查找或按姓名查找所要修改记录的学生。如果存在此学生,选择修改该生的姓名或学号。如果不存在此学生,显示不存在此信息。具体代码如下所示:

void change(){
	int i,j=-1;
	char op[2],information[maxsize],find[maxsize];
	printf("<1>按学号查找  <2>按姓名查找\n");
	scanf("%s",op);
	if(op[0]=='1'){
		shuru("请输入该生学号",information);
	}
	else if(op[0]=='2'){
		shuru("请输入该生姓名",information);
	}
	if(op[0]=='1'){
		for(i=0;i<num;i++)
			if(strcmp(information,students[i].studentID)==0) j=i;
	}
	else if(op[0]=='2'){
		for(i=0;i<num;i++)
			if(strcmp(information,students[i].Name)==0) j=i;
	}
	if(j==-1){
		printf("不存在要找的信息!\n");
		printf("按回车键返回\n");
		Enter();
		return;
	}
		shuru("请输入修改后的新学号:",information);
		strcpy(students[j].studentID,information);
		shuru("请输入修改后的新姓名:",information);
		strcpy(students[j].Name,information);
		shuru("请输入修改后的新班级:",information);
		strcpy(students[j].classNumber,information);
		shuru("请输入修改后的考勤日期:",information);
		strcpy(students[j].date,information);
		shuru("请输入修改后的考勤结果:出 勤 √   旷 课 X   事 假 ▲   病 假 ●   迟 到 +   早 退 –",information);
		strcpy(students[j].result,information);
	printf("修改完成!按回车键返回!\n");
	Enter(); 
}

 5.4 删除学生记录

删除学生记录功能先选择按学号删除或按姓名删除。如果存在此学生,删除成功。如果不存在此学生,显示不存在此信息。具体代码如下所示:

void Delete(){
	int i,j,flag=-1;
	char op[2],information[maxsize];
	shuru("请输入:<1>按学号删除<2>按姓名删除", op);
	if(op[0]=='1') {
		shuru("请输入学号:",information);
		for(i=0;i<num;i++){
			if(strcmp(information,students[i].studentID)==0){
				flag=1;
				for(j=i;j<num;j++){
					copy(&students[j],&students[j+1]);
				}
			}
		}
	}
	else if(op[0]=='2') {
		shuru("请输入姓名:",information);
		for(i=0;i<num;i++){
			if(strcmp(information,students[i].Name)==0){
				flag=1;
				for(j=i;j<num;j++){
					copy(&students[j],&students[j+1]); 
				}
			}
		}
	}
	if(flag==-1){
		printf("不存在此信息!\n");
		printf("按回车键返回\n");
		Enter();
		return;
	}
	else {
	num--;
	printf("删除完成!按回车键返回\n");
	Enter(); 
}
} 

5.5 打印学生考勤数据列表

打印学生考勤数据列表功能选择部分打印或全部打印,选择部分打印会输出学生姓名和考勤日期和考勤情况。选择全部打印会输出所有学生的所有信息。具体代码如下所示:

void Print(){
	int op;
	printf("请选择\n<1>部分打印(输出学生姓名和考勤日期和考勤情况)\n<2>全部打印(输出所有学生的所有信息):");
	scanf("%d",&op);
	if(op==1){
		shuchuPart();
	}
	else{
		shuchuAll();
	}
}
void shuchuAll(){
	int i;
	printf("------------------------------------\n");
 	for (i = 0; i < num; i++)
  		printf("%s %s %s %s %s\n", students[i].studentID,students[i].Name,students[i].classNumber,students[i].date,students[i].result);
 	printf("------------------------------------\n");
 	printf("打印成功!按回车键返回\n");
 	Enter();
}
void shuchuPart(){
	int i;
	printf("------------------------------------\n");
 	for (i = 0; i < num; i++)
  		printf("%s %s %s\n",students[i].Name,students[i].date,students[i].result);
 	printf("------------------------------------\n");
 	printf("打印成功!按回车键返回\n");
 	Enter();
} 

5.6 对指定数据进行排序

对指定数据进行排序功能选择按学号从小到大排序或按学生姓名ASCII码进行排序。具体代码如下所示:

void paixv(){
	int op,i,j;
	char tmp[maxsize];
	printf("请输入:<1>按学号从小到大排序 <2>按学生姓名ASCII码排序\n");
	scanf("%d",&op);
	if(op==1){
		for(i=0;i<num;i++){
			for(j=i+1;j<num;j++){
				if(strcmp(students[i].studentID,students[j].studentID)>0){
					exchange(&students[i],&students[j]);
				}
			}
		}
	}
	else if(op==2){
		for(i=0;i<num;i++){
			for(j=i+1;j<num;j++){
				if(strcmp(students[i].Name,students[j].Name)>0){
					exchange(&students[i],&students[j]);
				}
			}
		}
	}
	printf("排序成功!按回车键返回\n");
	Enter(); 
} 

5.7 进行数据统计

进行数据统计功能选择打印考勤日报表、考勤异常表、请假汇总表。选择打印考勤日报表后输入要打印的考勤日期,完成打印。选择打印考勤异常表会打印除考勤状态为出勤外的所有人。选择打印请假汇总表会打印所有请假的人。具体代码如下所示:

void data(){
	char op[2];
	shuru("请输入\n<1>考勤日报表\n<2>考勤异常表\n<3>请假汇总表",op);
	if(op[0]=='1'){
		daily();
	} 
	else if(op[0]=='2'){
		kaoqin();
	}
	else if(op[0]=='3'){
		qingjia();
	}
} 
void daily(){
	int i;
	char information[maxsize];
	shuru("请输入要查看的日期:",information);
	printf("------------------------------------\n");
	printf("%s的考勤情况:\n",information);
	for(i=0;i<num;i++){
		if(strcmp(information,students[i].date)==0){
			printf("%s %s %s %s\n",students[i].studentID,students[i].Name,students[i].classNumber,students[i].result);
		}
	} 
	printf("------------------------------------\n");
	printf("打印成功!按回车键返回\n");
	Enter(); 
} 
void kaoqin(){
	int i,cnt=0;
	printf("------------------------------------\n");
	printf("考勤异常表\n");
	for(i=0;i<num;i++){
		if(strcmp(students[i].result,"√")!=0)
			{
				printf("%s %s %s %s %s\n",students[i].studentID,students[i].Name,students[i].classNumber,students[i].date,students[i].result);
				cnt++;
			}
	}
	printf("考勤异常人数%d人\n",cnt);
	printf("------------------------------------\n");
	printf("打印成功!按回车键返回\n");
	Enter();
}
void qingjia(){
	int i,cnt=0;
	printf("------------------------------------\n");
	printf("请假异常表\n");
	for(i=0;i<num;i++){
		if(strcmp(students[i].result,"●")==0||strcmp(students[i].result,"▲")==0)
			{
				printf("%s %s %s %s %s\n",students[i].studentID,students[i].Name,students[i].classNumber,students[i].date,students[i].result);
				cnt++;
			}
	}
	printf("请假人数:%d人\n",cnt);
	printf("------------------------------------\n");
	printf("打印成功!按回车键返回\n");
	Enter();
} 

6 调试分析

问题1:如何让用户在输入结束后按回车键返回,更好的实现用户交互?

解决:放入两个getchar(),一个吸收选择功能时输入的回车,一个实现回车键返回。

问题2:C语言没有布尔类型,怎么用true和false来表示真假?

解决:引入头文件<stdbool.h>。

心得体会

程序设计基础这门课程对我来说是收获匪浅的一门课程,通过对基础理论知识的学习和实验及作业的训练,逐步对课程有了由浅入深的认识。通过完成这次《程序设计实践》课程设计,让我深刻认识到学习程序设计不能停留在学习它的语法规则,而是要利用学到的知识编写程序,解决实际问题。即把程序设计作为工具,描述解决实际问题的步骤,由计算机帮助我们解决问题。在完成此次课程设计的过程中,我学会了设置变量时命名规范且容易识别。在编写程序时,我做到了每个函数都有注释来说明功能,对参数和返回值也以注释的形式说明用途,关键的语句加入了注释解释,所以我学会了善于利用注释,增强程序的可读性。为了更好的实现用户交互,为了不使输入回车后还未观察数据就返回菜单,我使用了getchar()来吸收回车。在对文件进行读写的操作中,之前也遇到过乱码的问题,不过当时的解决办法都是退而求其次,将汉字信息写成英文字符,一直不知道乱码的症结所在,这次的课设,通过查阅资料找到了问题所在在于文件编码方式与编译器的不符,修改后问题得到解决。但由于时间关系,还有些许想法未能添加在程序中,如:按考勤日期对数据进行排序等。待时间充裕时,定要上手实现此功能,更好的充实程序设计。

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Java课程设计学生考勤管理系统的代码主要包含以下几个方面的功能实现:学生信息管理课程信息管理考勤信息管理和界面交互等。具体代码实现如下: 1. 学生信息管理 实现学生信息的录入、查询、修改和删除等功能。可以定义一个Student类,包含学生的学号、姓名、性别等属性,并提供相应的get和set方法。 2. 课程信息管理 实现课程信息的录入、查询、修改和删除等功能。可以定义一个Course类,包含课程的名称、教师、上课时间等属性,并提供相应的get和set方法。 3. 考勤信息管理 实现学生的考勤信息的录入、查询和修改等功能。可以定义一个Attendance类,包含学生学号、课程名称、考勤日期等属性,并提供相应的get和set方法。 4. 界面交互 利用Java的图形化界面库,如Swing或JavaFX等,实现用户和系统之间的交互。可以设计一个主界面,包含各个功能的按钮,如学生信息管理课程信息管理考勤信息管理等,点击相应的按钮可以进行相应功能的操作。 在实现代码时,可以根据需求设计相应的类和方法,并采用合理的数据结构来管理学生、课程考勤信息。同时,要注意代码的可读性和可维护性,采用良好的编程规范和设计模式,合理划分代码的模块和功能。 以上是Java课程设计学生考勤管理系统的代码实现的简要介绍,具体的代码实现需要根据具体需求和设计进行细化和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小关不摆烂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值