C语言职工信息管理系统

这篇文章展示了如何使用 C 语言创建一个简单的职工信息管理系统。该系统允许用户执行以下操作:

  • 添加职工信息
  • 显示所有职工信息
  • 按不同条件查询职工信息
  • 修改职工信息
  • 删除职工信息
  • 按职工编号排序

代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

// 定义职工信息结构体
struct employee{
    char number[10];        // 编号
    char name[10];         // 姓名
    char sex[10];          // 性别
    char birthday[10];     // 出生年月
    char date[10];          // 入职年月
    char degree[10];       // 学历
    char position[10];     // 职位
    char add[10];          // 地址
    char tel[20];          // 电话
    struct employee *next; // 指向下一个职工信息的指针
}em[100], *head;

int n;    // 全局变量,记录职工人数

// 从文件中读取职工信息
void read()
{
    FILE *fp;
    int i;
    if ((fp = fopen('职工信息.txt', 'r')) == NULL)
    {
        printf('打开文件失败!请创建一个文本文件,文件名叫职工信息\n\n\n');
        system('pause');  // 冻结屏幕
        system('cls');    // 清屏
        exit(0);
    }
    fscanf(fp, '%d\n', &n);
    for (i = 0; i < n; i++)
    {
        fscanf(fp, '%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n', em[i].number, em[i].name, em[i].sex,
                em[i].birthday, em[i].date, em[i].degree, em[i].position, em[i].add, em[i].tel);
    }
    head = &em[0];
    fclose(fp);
}

// 将职工信息写入文件
void write()
{
    FILE *fp;
    int i = 0;
    if ((fp = fopen('职工信息录入.txt', 'w+')) == NULL)
    {
        printf('!!!打开文件失败!!!\n');
        return;
    }
    fprintf(fp,'%d\n',n);
    while(i < n)
    {
        fprintf(fp,'%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n',em[i].number, em[i].name, em[i].sex,
                em[i].birthday, em[i].date, em[i].degree, em[i].position, em[i].add, em[i].tel);
        i++;
    }
    fclose(fp);
}

// 添加职工信息
void add()
{
    int i, flag;
    char c;
    read();
    do
    {
        flag = 0;
        printf('\n\n');
        printf('请输入职工的编号:');
        scanf('%s', &em[n].number);
        for (i = 0; i < n; i++)
        {
            if(strcmp(em[i].number, em[n].number) == 0)
            {
                flag = 1;
                break;
            }
        }
        if(flag)
        {
                printf('!!!该职工已存在!!!\n\n');
                printf('\t\t是否继续输入?(Y/N): ');
                scanf('%c', &c);
                if(c == 'N' || c == 'n')
                    break;
                continue;
        }
        printf('请输入职工姓名:');
        scanf('%s', &em[n].name);
        printf('请输入职工性别:');
        scanf('%s', &em[n].sex);
        printf('请输入职工出生年月:');
        scanf('%s', &em[n].birthday);
        printf('请输入职工入职年月:');
        scanf('%s', &em[n].date);
        printf('请输入职工学历:');
        scanf('%s', &em[n].degree);
        printf('请输入职工职务:');
        scanf('%s', &em[n].position);
        printf('请输入职工住址:');
        scanf('%s', &em[n].add);
        printf('请输入职工电话:');
        scanf('%s', &em[n].tel);
        printf('是否继续输入?(Y/N): ');
        scanf('%*c%c', &c);
        n++;
    }while (c != 'N' && c != 'n');
    write();
    printf('\n\n数据已保存!\n\n');
}

// 格式化输出单个职工信息
void output(int t)
{
    printf('+--------+----+----+--------+--------+----+--------+----+------------+\n');
    printf('|职工编号|姓名|性别|出生年月|入职年月|学历|  职务  |地址|    电话    |\n');
    printf('+--------+----+----+--------+--------+----+--------+----+------------+\n');
    printf('|%-4s    |%-3s|%-3s |%-7s |%-7s |%-4s|%-6s  |%-4s|%-11s |\n', em[t].number, em[t].name,
            em[t].sex, em[t].birthday, em[t].date, em[t].degree, em[t].position, em[t].add, em[t].tel);
}

// 显示所有职工信息
void show()
{
    int i;
    read();
    if (n == 0)
        printf('无记录!\n\n');
    else
        for (i = 0; i < n; i++)
        {
            output(i);
        }
}

// 查询职工信息
void search()
{
    int num, flag, i;
    char a[10], name[10], degree[10], position[10], sex[10], birthday[10], date[10], add[10], tel[20];
    char c;
    read();
    while (1)
    {
        printf('\n');
        printf('+---------------------------------+\n');
        printf('|    职 工 信 息 查 询 系 统      |\n');
        printf('|          1.按编号查询           |\n');
        printf('|          2.按姓名查询           |\n');
        printf('|          3.按学历查询           |\n');
        printf('|          4.按职务查询           |\n');
        printf('|          5.按性别查询           |\n');
        printf('|          6.按出生年月查询       |\n');
        printf('|          7.按入职年月查询       |\n');
        printf('|          8.按地址查询           |\n');
        printf('|          9.按电话查询           |\n');
        printf('|      输入其他任意键退出本模块   |\n');
        printf('+---------------------------------+\n');
        printf('请选择操作:');
        scanf('%d', &num);
        if (num < 1 || num > 9)
        {
            printf('!!!输入错误!!!\n\n');
            system('cls');    // 清屏
        }
        flag = 0; // 初始化查询结果标志
        switch (num) {
            case 1:
                printf('\n请输入您要查询的职工的编号:');
                scanf('%s', &a);
                for (i = 0; i < n; i++) {
                    if (strcmp(em[i].number, a) == 0) {
                        output(i);
                        flag = 1;
                    }
                }
                break;
            case 2:
                printf('\n请输入您要查询的职工的姓名:');
                scanf('%s', &name);
                for (i = 0; i < n; i++) {
                    if (strcmp(em[i].name, name) == 0) {
                        output(i);
                        flag = 1;
                    }
                }
                break;
            case 3:
                printf('\n请输入您要查询的职工的学历:');
                scanf('%s', &degree);
                for (i = 0; i < n; i++) {
                    if (strcmp(em[i].degree, degree) == 0) {
                        output(i);
                        flag = 1;
                    }
                }
                break;
            case 4:
                printf('\n请输入您要查询的职工的职务:');
                scanf('%s', &position);
                for (i = 0; i < n; i++) {
                    if (strcmp(em[i].position, position) == 0) {
                        output(i);
                        flag = 1;
                    }
                }
                break;
            case 5:
                printf('\n请输入您要查询的职工的性别:');
                scanf('%s', &sex);
                for (i = 0; i < n; i++) {
                    if (strcmp(em[i].sex, sex) == 0) {
                        output(i);
                        flag = 1;
                    }
                }
                break;
            case 6:
                printf('\n请输入您要查询的职工的出生年月:');
                scanf('%s', &birthday);
                for (i = 0; i < n; i++) {
                    if (strcmp(em[i].birthday, birthday) == 0) {
                        output(i);
                        flag = 1;
                    }
                }
                break;
            case 7:
                printf('\n请输入您要查询的职工的入职年月:');
                scanf('%s', &date);
                for (i = 0; i < n; i++) {
                    if (strcmp(em[i].date, date) == 0) {
                        output(i);
                        flag = 1;
                    }
                }
                break;
            case 8:
                printf('\n请输入您要查询的职工的地址:');
                scanf('%s', &add);
                for (i = 0; i < n; i++) {
                    if (strcmp(em[i].add, add) == 0) {
                        output(i);
                        flag = 1;
                    }
                }
                break;
            case 9:
                printf('\n请输入您要查询的职工的电话:');
                scanf('%s', &tel);
                for (i = 0; i < n; i++) {
                    if (strcmp(em[i].tel, tel) == 0) {
                        output(i);
                        flag = 1;
                    }
                }
                break;
            default:
                break;
        }

        if (!flag) {
            printf('\n\n!!!无该职工信息!!!\n\n');
        }

        printf('\n\n是否继续查询?(Y/N):');
        scanf('%*c%c', &c);
        if (c == 'N' || c == 'n') {
            break;
        }
    }
}

// 修改职工信息
void modify()
{
    int num, flag, i, j;
    char a[10];
    char change[20];
    char c;
    read();
    while (1)
    {
        flag = 0;
        printf('\n请输入需要修改的职工编号:');
        scanf('%s', &a);
        for (i = 0; i < n; i++)
        {
            if (strcmp(em[i].number, a) == 0)
            {
                j = i;
                flag = 1;
                break; // 找到匹配项后退出循环
            }
        }
        if (!flag)
        {
            printf('\n\n!!!无此员工的信息!!!\n\n');
            printf('\n\n是否继续修改(Y/N):');
            scanf('%c', &c);
            if (c == 'N' || c == 'n')
                break;
            else
                continue; // 继续下一次修改
        }

        printf('\n');
        printf('+-------------------------------+\n');
        printf('|    职 工 信 息 修 改 系 统    |\n');
        printf('|           1.修改姓名          |\n');
        printf('|           2.修改学历          |\n');
        printf('|           3.修改职务          |\n');
        printf('|           4.修改地址          |\n');
        printf('|           5.修改出生年月      |\n');
        printf('|           6.修改入职年月      |\n');
        printf('|           7.修改电话          |\n');
        printf('|           8.修改职工编号      |\n');
        printf('|    输入其他任意键退出本模块   |\n');
        printf('+-------------------------------+\n');
        printf('请选择操作:');
        scanf('%d', &num);
        if (num < 1 || num > 8)
        {
            printf('!!!操作错误!!!\n\n');
            continue;
        }
        system('cls');    // 清屏
        printf('\n请输入修改后的信息:');
        scanf('%s', &change);
        switch (num)
        {
            case 1:
                strcpy(em[j].name, change);
                break;
            case 2:
                strcpy(em[j].degree, change);
                break;
            case 3:
                strcpy(em[j].position, change);
                break;
            case 4:
                strcpy(em[j].add, change);
                break;
            case 5:
                strcpy(em[j].birthday, change);
                break;
            case 6:
                strcpy(em[j].date, change);
                break;
            case 7:
                strcpy(em[j].tel, change);
                break;
            case 8:
                strcpy(em[j].number, change);
                break;
        }
        printf('\n\n是否继续修改?(Y/N):');
        scanf('%*c%c', &c);
        if (c == 'N' || c == 'n')
            break;
    }
    write();
}

// 删除职工信息
void Delete()
{
    char a[10];
    int i, j, flag;
    char c;
    read();
    while (1)
    {
        system('cls');    // 清屏
        flag = 0;
        printf('\n请输入需要删除的职工编号:');
        scanf('%s', &a);
        for (i = 0; i < n; i++)
        {
            if (strcmp(em[i].number, a) == 0)
            {
                // 从 i 开始,将后面的元素向前移动一位
                for (j = i; j < n - 1; j++)
                {
                    em[j] = em[j + 1];
                }
                n--;
                flag = 1;
                printf('\n\n!!!删除成功!!!\n');
                break; // 找到并删除后退出循环
            }
        }
        if (!flag)
            printf('\n\n!!!无此员工信息!!!\n\n');

        printf('\n\n是否继续删除?(Y/N):');
        scanf(' %c', &c); // 注意空格,用于清除回车符
        if (c == 'N' || c == 'n')
            break;
    }
    write();
}

// 显示职工信息列表 (用于排序)
void showList(employee *head)
{
    employee *p = head;
    int j = 1;
    while (p != NULL)
    {
        printf('%d. %s  %s  %s  %s  %s  %s  %s  %s  %s\n', j++, p->number, p->name, p->sex, p->birthday,
                p->date, p->degree, p->position, p->add, p->tel);
        p = p->next;
    }
}

// 交换两个职工信息
void exchange(employee *p, employee *q)
{
    employee temp;
    temp = *p;
    *p = *q;
    *q = temp;
}

// 按职工编号排序
void sort()
{
    char c;
    employee *p, *q;
    read();
    while (1)
    {
        printf('按职工编号从小到大的排序信息如下:\n');
        // 使用冒泡排序
        for (p = head; p != NULL && p->next != NULL; p = p->next) {
            for (q = p->next; q != NULL; q = q->next) {
                if (strcmp(p->number, q->number) > 0) {
                    exchange(p, q);
                }
            }
        }
        showList(head);
        printf('\n\n是否继续排序?(Y/N):');
        scanf(' %c', &c); // 注意空格,用于清除回车符
        if (c == 'N' || c == 'n') {
            break;
        }
    }
}

// 菜单
void menu()
{
    printf('*************************\n');
    printf('*      ○主菜单 ○      *\n');
    printf('*    0.退 出 菜 单      *\n');
    printf('*    1.录入职工信息     *\n');
    printf('*    2.显示职工信息     *\n');
    printf('*    3.查询职工信息     *\n');
    printf('*    4.修改职工信息     *\n');
    printf('*    5.删除职工信息     *\n');
    printf('*    6.职工信息排序     *\n');
    printf('*************************\n');
    printf('请输入操作:');
}

int main()
{
    int num;
    n = 0;
    system('color 0B');
    printf('************************************************\n');
    printf('******    欢 迎 使 用 职 工 管 理 系 统   ******\n');
    printf('************************************************\n');
    while (1)
    {
        menu();
        scanf('%d', &num);
        system('cls');    // 清屏
        switch (num)
        {
            case 1:
                add();
                break;
            case 2:
                show();
                break;
            case 3:
                search();
                break;
            case 4:
                modify();
                break;
            case 5:
                Delete();
                break;
            case 6:
                sort();
                break;
            case 0:
                printf('\t\t\n\n☆☆☆☆欢迎下次使用☆☆☆☆\n\n');
                return 0;
            default:
                printf('\n无效指令!\n\n\n');
        }
        system('pause');
        system('cls');
    }
    return 0; 
}

代码解释

数据结构

  • 使用结构体 employee 存储职工信息,包括编号、姓名、性别等。
  • 使用数组 em 存储所有职工信息,最多存储 100 条记录。
  • 使用指针 head 指向链表头,方便进行链表操作。

函数功能

  • read():从文件中读取职工信息到结构体数组中。
  • write():将结构体数组中的职工信息写入文件。
  • add():添加职工信息,进行查重处理。
  • output(int t):格式化输出单个职工的信息。
  • show():显示所有职工信息。
  • search():根据用户选择的条件查询职工信息。
  • modify():修改职工信息,支持修改多个字段。
  • Delete():删除职工信息。
  • showList(employee *head):显示职工信息列表,用于排序后展示。
  • exchange(employee *p, employee *q):交换两个职工信息。
  • sort():按职工编号对职工信息进行排序,使用冒泡排序算法。
  • menu():显示系统主菜单。
  • main():程序入口,处理用户输入和调用相应函数。

总结

这个 C 语言职工信息管理系统简单易懂,适合初学者学习如何使用 C 语言进行数据结构和文件操作。你可以根据自己的需要对代码进行修改和扩展,例如:

  • 增加更多的查询条件
  • 实现按其他字段排序
  • 使用图形界面
  • 连接数据库
C语言职工信息管理系统:实现增删改查排序功能

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

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