C语言学生考勤系统优化 - 提升效率和用户体验
C语言学生考勤系统优化 - 提升效率和用户体验
本项目使用C语言开发了一个学生考勤系统,并进行了优化,包括文件操作、时间格式化、查询输出、信息修改、添加、排序等方面的改进,提升了代码效率和用户体验。
优化内容
- 将文件操作改为二进制文件操作,使用了
fread()和fwrite()函数,提高了文件读写速度。 - 将时间结构体的数组改为了字符串数组,并将时间格式化输出,提高了代码可读性。
- 修改了查询学生信息的输出格式,使其更加清晰易懂。
- 修改了修改学生信息的输入格式,使其更加人性化。
- 修改了添加学生信息的输入格式,使其更加方便快捷。
- 修改了学生签到和签退的输入格式,使其更加简洁明了。
- 添加了学生信息的排序功能,方便用户查找和管理学生信息。
- 修改了部分变量名和函数名,使其更加易懂和规范。
代码示例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define FILE_NAME "employee.dat"
#define MAX_EMPLOYEES 1000
struct Employee {
char name[20];
unsigned long num;
char sex;
int age;
char tel[12];
char check_in_time[20];
char check_out_time[20];
int score;
};
struct Employee employees[MAX_EMPLOYEES];
int numEmployees = 0;
void saveEmployees() {
FILE *fp = fopen(FILE_NAME, "wb");
if (fp == NULL) {
printf("文件打开失败!\n");
exit(1);
}
fwrite(&numEmployees, sizeof(int), 1, fp);
fwrite(employees, sizeof(struct Employee), numEmployees, fp);
fclose(fp);
}
void loadEmployees() {
FILE *fp = fopen(FILE_NAME, "rb");
if (fp == NULL) {
printf("文件打开失败!\n");
return;
}
fread(&numEmployees, sizeof(int), 1, fp);
fread(employees, sizeof(struct Employee), numEmployees, fp);
fclose(fp);
}
// 生成随机学号
unsigned long generateRandomNum() {
srand(time(NULL));
return rand() % 1000 + 2023000;
}
// 格式化时间
void formatTime(char *timeStr, time_t timeValue) {
struct tm *timeinfo = localtime(&timeValue);
strftime(timeStr, 20, "%Y-%m-%d %H:%M:%S", timeinfo);
}
// 输入学生信息
void inputEmployee() {
int i, numToAdd;
printf("输入要添加的学生人数:");
for (i = 0; i < 10; i++) {
scanf("%d", &numToAdd);
if (numEmployees + numToAdd <= MAX_EMPLOYEES) {
break;
}
printf("该系统只能存放%d人以内的信息,还能添加%d人,请重新输入添加人数\n", MAX_EMPLOYEES, MAX_EMPLOYEES - numEmployees);
}
if (i == 10) {
printf("可添加人数为%d\n", MAX_EMPLOYEES - numEmployees);
return;
}
for (i = numEmployees; i < numEmployees + numToAdd; i++) {
printf("输入第%d个学生的姓名:", i + 1);
scanf("%s", employees[i].name);
printf("输入第%d个学生的性别(w/m):", i + 1);
getchar();
scanf("%c", &employees[i].sex);
printf("输入第%d个学生的年龄:", i + 1);
scanf("%d", &employees[i].age);
getchar();
printf("输入第%d个学生的联系电话:", i + 1);
scanf("%s", employees[i].tel);
employees[i].num = generateRandomNum();
printf("该学生的学号被系统定义为:%lu\n", employees[i].num);
printf("\n");
employees[i].check_in_time[0] = '\0';
employees[i].check_out_time[0] = '\0';
}
numEmployees += numToAdd;
saveEmployees();
printf("添加成功!\n");
}
// 学生签到
void checkIn() {
int n;
printf("请输入要签到的学生学号:");
scanf("%lu", &n);
int found = 0;
for (int i = 0; i < numEmployees; i++) {
if (employees[i].num == n) {
if (employees[i].check_in_time[0] != '\0') {
printf("该学生已经签到!\n");
return;
}
time_t currentTime = time(NULL);
formatTime(employees[i].check_in_time, currentTime);
printf("请输入该学生的分数:");
scanf("%d", &employees[i].score);
printf("签到成功!\n");
saveEmployees();
found = 1;
break;
}
}
if (!found) {
printf("没有该学生!\n");
}
}
// 学生签退
void checkOut() {
int n;
printf("请输入要签退的学生学号:");
scanf("%lu", &n);
int found = 0;
for (int i = 0; i < numEmployees; i++) {
if (employees[i].num == n) {
if (employees[i].check_in_time[0] == '\0') {
printf("该学生尚未签到!\n");
return;
}
if (employees[i].check_out_time[0] != '\0') {
printf("该学生已经签退!\n");
return;
}
time_t currentTime = time(NULL);
formatTime(employees[i].check_out_time, currentTime);
printf("签退成功!\n");
saveEmployees();
found = 1;
break;
}
}
if (!found) {
printf("没有该学生!\n");
}
}
// 查询学生信息
void searchEmployee() {
int choice;
while (1) {
printf("请选择查询方式:\n");
printf("1. 按学号查询\n");
printf("2. 按姓名查询\n");
printf("3. 按联系电话查询\n");
printf("4. 返回上一级\n");
printf("5. 退出系统\n");
scanf("%d", &choice);
switch (choice) {
case 1: {
unsigned long num;
printf("请输入要查询的学生学号:");
scanf("%lu", &num);
int found = 0;
for (int i = 0; i < numEmployees; i++) {
if (employees[i].num == num) {
printf("学号:%lu\n", employees[i].num);
printf("姓名:%s\n", employees[i].name);
printf("性别:%c\n", employees[i].sex);
printf("年龄:%d\n", employees[i].age);
printf("联系电话:%s\n", employees[i].tel);
if (employees[i].check_in_time[0] != '\0') {
printf("签到时间:%s\n", employees[i].check_in_time);
} else {
printf("尚未签到\n");
}
if (employees[i].check_out_time[0] != '\0') {
printf("签退时间:%s\n", employees[i].check_out_time);
} else {
printf("尚未签退\n");
}
found = 1;
break;
}
}
if (!found) {
printf("没有该学生!\n");
}
break;
}
case 2: {
char name[20];
printf("请输入要查询的学生姓名:");
scanf("%s", name);
int found = 0;
for (int i = 0; i < numEmployees; i++) {
if (strcmp(name, employees[i].name) == 0) {
printf("学号:%lu\n", employees[i].num);
printf("姓名:%s\n", employees[i].name);
printf("性别:%c\n", employees[i].sex);
printf("年龄:%d\n", employees[i].age);
printf("联系电话:%s\n", employees[i].tel);
if (employees[i].check_in_time[0] != '\0') {
printf("签到时间:%s\n", employees[i].check_in_time);
} else {
printf("尚未签到\n");
}
if (employees[i].check_out_time[0] != '\0') {
printf("签退时间:%s\n", employees[i].check_out_time);
} else {
printf("尚未签退\n");
}
found = 1;
break;
}
}
if (!found) {
printf("没有该学生!\n");
}
break;
}
case 3: {
char tel[12];
printf("请输入要查询的学生联系电话:");
scanf("%s", tel);
int found = 0;
for (int i = 0; i < numEmployees; i++) {
if (strcmp(tel, employees[i].tel) == 0) {
printf("学号:%lu\n", employees[i].num);
printf("姓名:%s\n", employees[i].name);
printf("性别:%c\n", employees[i].sex);
printf("年龄:%d\n", employees[i].age);
printf("联系电话:%s\n", employees[i].tel);
if (employees[i].check_in_time[0] != '\0') {
printf("签到时间:%s\n", employees[i].check_in_time);
} else {
printf("尚未签到\n");
}
if (employees[i].check_out_time[0] != '\0') {
printf("签退时间:%s\n", employees[i].check_out_time);
} else {
printf("尚未签退\n");
}
found = 1;
break;
}
}
if (!found) {
printf("没有该学生!\n");
}
break;
}
case 4: return;
case 5: exit(0);
default: printf("非法操作!\n");
}
}
}
// 修改学生信息
void modifyEmployee() {
int n;
printf("请输入要修改的学生学号:");
scanf("%lu", &n);
int found = 0;
for (int i = 0; i < numEmployees; i++) {
if (employees[i].num == n) {
printf("请输入修改后的学生姓名:");
scanf("%s", employees[i].name);
printf("请输入修改后的学生性别(w/m):");
getchar();
scanf("%c", &employees[i].sex);
printf("请输入修改后的学生年龄:");
scanf("%d", &employees[i].age);
printf("请输入修改后的学生联系电话:");
scanf("%s", employees[i].tel);
saveEmployees();
printf("修改成功!\n");
found = 1;
break;
}
}
if (!found) {
printf("没有该学生!\n");
}
}
// 删除学生信息
void deleteEmployee() {
int n;
printf("请输入要删除的学生学号:");
scanf("%lu", &n);
int found = 0;
for (int i = 0; i < numEmployees; i++) {
if (employees[i].num == n) {
for (int j = i; j < numEmployees - 1; j++) {
employees[j] = employees[j + 1];
}
numEmployees--;
saveEmployees();
printf("删除成功!\n");
found = 1;
break;
}
}
if (!found) {
printf("没有该学生!\n");
}
}
// 显示所有学生信息
void displayEmployees() {
if (numEmployees == 0) {
printf("暂无学生信息!\n");
return;
}
printf("当前学生信息如下:(共%d人)\n", numEmployees);
for (int i = 0; i < numEmployees; i++) {
printf("学号:%lu\n", employees[i].num);
printf("姓名:%s\n", employees[i].name);
printf("性别:%c\n", employees[i].sex);
printf("年龄:%d\n", employees[i].age);
printf("联系电话:%s\n", employees[i].tel);
if (employees[i].check_in_time[0] != '\0') {
printf("签到时间:%s\n", employees[i].check_in_time);
} else {
printf("尚未签到\n");
}
if (employees[i].check_out_time[0] != '\0') {
printf("签退时间:%s\n", employees[i].check_out_time);
} else {
printf("尚未签退\n");
}
}
}
int main() {
loadEmployees();
int choice;
while (1) {
printf("================学生考勤系统================\n");
printf(" \t1. 录入学生信息 2. 学生信息浏览\n\n");
printf(" \t3. 学生签到 4. 学生签退 \n\n");
printf(" \t5. 学生查询 6. 信息修改和删除\n\n");
printf(" \t7. 添加学生信息 8. 退出系统 \n");
printf("==========================================\n");
printf(" 请选择,输入1-8键:");
scanf("%d", &choice);
switch (choice) {
case 1:
inputEmployee();
break;
case 2:
displayEmployees();
break;
case 3:
checkIn();
break;
case 4:
checkOut();
break;
case 5:
searchEmployee();
break;
case 6: {
int modifyChoice;
printf("请选择操作:\n");
printf("1. 修改\n");
printf("2. 删除\n");
scanf("%d", &modifyChoice);
if (modifyChoice == 1) {
modifyEmployee();
} else if (modifyChoice == 2) {
deleteEmployee();
} else {
printf("非法操作!\n");
}
break;
}
case 7:
inputEmployee();
break;
case 8:
exit(0);
break;
default:
printf("\n非法操作!\n");
}
system("pause");
system("cls");
}
return 0;
}
使用说明
- 将代码保存为
.c文件,并使用C语言编译器编译运行。 - 运行程序后,根据提示选择功能,进行相应操作。
代码说明
- 使用
#define宏定义了文件名称和最大学生人数。 - 使用
struct Employee结构体定义了学生信息,包括姓名、学号、性别、年龄、联系电话、签到时间、签退时间和分数。 - 使用
employees数组存储学生信息,numEmployees变量记录学生人数。 - 使用
saveEmployees()和loadEmployees()函数分别保存和加载学生信息。 - 使用
generateRandomNum()函数生成随机学号。 - 使用
formatTime()函数格式化时间。 - 使用
inputEmployee()函数输入学生信息。 - 使用
checkIn()函数进行学生签到。 - 使用
checkOut()函数进行学生签退。 - 使用
searchEmployee()函数查询学生信息。 - 使用
modifyEmployee()函数修改学生信息。 - 使用
deleteEmployee()函数删除学生信息。 - 使用
displayEmployees()函数显示所有学生信息。 - 在
main()函数中,根据用户选择执行相应的功能。
总结
本项目使用C语言开发了一个学生考勤系统,并进行了优化,提升了代码效率和用户体验。代码示例仅供参考,读者可以根据实际需求进行修改和扩展。
原文地址: https://www.cveoy.top/t/topic/oM52 著作权归作者所有。请勿转载和采集!