C语言职工信息管理系统:实现增删改查排序功能
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', °ree);
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 语言进行数据结构和文件操作。你可以根据自己的需要对代码进行修改和扩展,例如:
- 增加更多的查询条件
- 实现按其他字段排序
- 使用图形界面
- 连接数据库
原文地址: https://www.cveoy.top/t/topic/fwV5 著作权归作者所有。请勿转载和采集!