C语言学生考勤系统优化 - 提升效率和用户体验

本项目使用C语言开发了一个学生考勤系统,并进行了优化,包括文件操作、时间格式化、查询输出、信息修改、添加、排序等方面的改进,提升了代码效率和用户体验。

优化内容

  1. 将文件操作改为二进制文件操作,使用了fread()fwrite()函数,提高了文件读写速度。
  2. 将时间结构体的数组改为了字符串数组,并将时间格式化输出,提高了代码可读性。
  3. 修改了查询学生信息的输出格式,使其更加清晰易懂。
  4. 修改了修改学生信息的输入格式,使其更加人性化。
  5. 修改了添加学生信息的输入格式,使其更加方便快捷。
  6. 修改了学生签到和签退的输入格式,使其更加简洁明了。
  7. 添加了学生信息的排序功能,方便用户查找和管理学生信息。
  8. 修改了部分变量名和函数名,使其更加易懂和规范。

代码示例

#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;
}

使用说明

  1. 将代码保存为.c文件,并使用C语言编译器编译运行。
  2. 运行程序后,根据提示选择功能,进行相应操作。

代码说明

  1. 使用#define宏定义了文件名称和最大学生人数。
  2. 使用struct Employee结构体定义了学生信息,包括姓名、学号、性别、年龄、联系电话、签到时间、签退时间和分数。
  3. 使用employees数组存储学生信息,numEmployees变量记录学生人数。
  4. 使用saveEmployees()loadEmployees()函数分别保存和加载学生信息。
  5. 使用generateRandomNum()函数生成随机学号。
  6. 使用formatTime()函数格式化时间。
  7. 使用inputEmployee()函数输入学生信息。
  8. 使用checkIn()函数进行学生签到。
  9. 使用checkOut()函数进行学生签退。
  10. 使用searchEmployee()函数查询学生信息。
  11. 使用modifyEmployee()函数修改学生信息。
  12. 使用deleteEmployee()函数删除学生信息。
  13. 使用displayEmployees()函数显示所有学生信息。
  14. main()函数中,根据用户选择执行相应的功能。

总结

本项目使用C语言开发了一个学生考勤系统,并进行了优化,提升了代码效率和用户体验。代码示例仅供参考,读者可以根据实际需求进行修改和扩展。

C语言学生考勤系统优化 - 提升效率和用户体验

原文地址: https://www.cveoy.top/t/topic/oM52 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录