职工管理系统

本文介绍了使用C语言编写的职工管理系统,系统基于结构体和链表,包含增删查改、排序、查找、插入等功能。文章详细讲解了每个功能的实现原理,包括头文件、结构体定义、主函数与菜单设计,以及各功能的代码示例。同时,文章也提到了系统存在的问题,如插入功能的退出循环问题和文件操作等。
摘要由CSDN通过智能技术生成


职工管理系统


因为这是在学习了一段时间后才写的程序,一些知识都是前面学过的,所以我有关前面所学只是没有写的特别详细,只是把我在写的过程中被提醒或者被检查出来的错误写了上去。

一、职工管理系统详解

该系统基于结构体与链表创建,有链表基本的增删查改,排序,查找,插入,文件的创建,保存,读取和一些小功能。

也同样优缺点:插入指定位置,能够插入到指定位置,但退不出循环,创建的临时指针并未释放,可能指向该电脑未知内存,萌新慎重copy,不建议copy全部代码。

有些代码粘贴过来原有层次分类没有粘贴上。

二、职工管理系统功能详解

1.头文件与结构体定义

代码如下(示例):

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
 
typedef struct Worker{
   
 int number;
 char name[20];
 char sex[2];
 int year;
 int month;
 int day;
 char degree[20];
 struct Worker *next; 
}WOR;

在结构体中定义数值域与指针域,数值域储存员工信息,指针域储存要连接的结构体地址,

2.使用的函数声明

代码如下(示例):

void menu();//菜单
void showall(WOR *head);//显示所有员工信息
void attend(WOR *head); //添加员工信息
void print(WOR *head);//查找某一员工信息
void save(WOR *head);//保存职工信息(只有值,用于文件读取)
void save1(WOR *head);//保存职工信息(有值对应的具体信息,用于用户查阅)
void delte(WOR *head);//删除职工信息
void change(WOR *head);//改变职工信息
void order(WOR *head);//对职工信息排序
void read(WOR *head);//读取职工信息
void insert(WOR *head);//插入职工信息
void save2(WOR *head);//保存职工信息(排序后的文件)

在调用函数中需要加个小程序:进入函数需要有直接退出功能,以便不进行任何修改便可以直接退出。

3.主函数与菜单函数的声明

代码如下(示例):
在主函数中对头指针申请空间,后面所有函数定义void类型传入参数头指针,引用头指针时最好不要直接使用,定义一个指针为头指针再进行使用。
如果链表为空或者文件为空都要有一一对应错误提示

int main()
{
   
 WOR *head;
 head=(WOR*)malloc(sizeof(WOR));
 head->next=NULL;
 
 while(1){
   
  menu();
  char n[1000];
  printf("请选择");
  scanf("%s",n);
  int a=strlen(n);
  if(a>=2)
  {
   
   printf("你输入的什么东西,拉出去,糟蹋了\n");
   system("pause");
   continue;
  }
     switch(n[0])
  {
   
  case '1':
    read(head);
    system("pause");
    showall(head);
    system("pause");
       break;
  case '2':
    attend(head);
    save(head);
    save1(head);
    system("pause");
    break;
  case '3':
    delte(head);
    save(head);
    save1(head);
    system("pause");
     break;
  case '4':
    change(head);
    save(head); 
    save1(head);
    system("pause"); 
    break;
  case '5':
    read(head); 
    print(head);
    system("pause"); 
    break;
  case '6':
   system("cls");
    order(head);
    save2(head);
    system("pause");
    break;
  case '7':
    insert(head);
    save(head);
    save1(head);
    system("pause");
    break;
  case '8':
    printf("欢迎下次使用\n");
    system("pause");
     exit(1);  
     break;
  default:printf("别瞎输,只能输1-8\n");system("pause");break;  
     } 
 }
 return 0;
}

void menu()//制作菜单 
{
   
 system("cls");//清屏 
 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"); 
 return; 
}

注:只能输入具有该指令的数字,输入其他具有相对应的报错提示

乱打:在这里插入图片描述
输入不是1-8
在这里插入图片描述
输入超过个位数
在这里插入图片描述

注:因为我定义的是指字符数组输入,并且输入超过数组第一位就自动报出乱打错误

4.添加函数

代码如下(示例):
添加解析:在主函数中定义的头指针进行调用,定义新的临时指针用头指针依次链接,这是头插法

在添加函数中根据结构体中的定义,对职工号要有查重操作,性别不能有除男女外其他,出生年月天都应该有他的限定,不能不符合常理,学位也要有对应的真是学位限制。
我没有对月份是30天还是31天的判断,以及是否是闰年对应2月天数限制,有精力和能力的人可以加以限制,完善代码。

void attend(WOR *head)//添加员工信息
{
   
 int flag,i,a;
 char n[20];
 WOR *p=head;
 WOR *s;//临时储存职工数据 
 printf("输入0退出,其他继续\n");
 scanf("%s",n);
 if(n[0]=='0')
 return;
 else
 {
   
  printf("请选择要添加职工信息的个数");
  scanf("%d",&i);
  if(i<=0)
  return;
  else
  while(i)
  {
   
   s=(WOR*)malloc(sizeof(WOR));
   tp:printf("请输入职工号");
   scanf("%d",&s->number);
   WOR *q=head->next;
   while(q)
   {
   
    a=q->number;
    if(s->number==a)
    {
   
     printf("该职工号已被使用,其选择其他喜欢的职工号");
     goto tp;
    }
    q=q->next;
   }
   printf("请输入姓名:"); 
   scanf("%s",s->name);
   getchar();
   printf("请输入性别: w/m    ");
   while(1)
   {
   
    scanf("%s",s->sex); 
    if(strcmp("w",s->sex)==0)
    break;
    if(strcmp("m",s->sex)==
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值