用C语言实现一个简单的管理系统

相比于简单的C语言程序,用C语言写一个管理系统就显得相对复杂很多。在写代码之前,我们首先应有应有一个系统的基本框架,如该系统应该要实现那一些功能,这里我们以“员工管理系统”为例,我们应该建立一个菜单,读取文件的数据并创建链表,将链表中的信息写进文件,删除结点,增加结点,修改结点,以及链表的遍历。当我们明确一个系统应该要实现的功能后,便找到了问题的突破口,接下来只需要将各个功能用函数一一实现即可。

我们接下来以"员工管理系统为例",来进行具体的分析:
为了方便阅读后面文章的代码,我们这里将h设为头指针,结构类型为EMP,结构成员有员工编号number,员工年龄age,员工性别sex,员工姓名name。

1.增加结点与增加员工信息
为使系统代码更加简单化,我们在写"读取文件的数据并创建链表"这部分函数时,可以调用增加结点函数,简化代码。同时在增加员工信息时我们同样可以调用增加结点的函数,减少主函数的代码量,使主函数更加具有可读性。

void add(EMP *p2) //增加结点函数
{
EMP *p1; / /EMP为结构体,再定义一个结构指针
p1=h->next; //h为头指针
if(h==null)
{
p1=h->next; //链表为空时
}

  else
   {
        while(p1 != null)
        {
           p1=p1->null;     //找到尾节点
        }
        p2=p1->next;
        p2->next=null;
   }

}

add information() //增加员工信息
{
EMP *p; //定义结构指针存放信息
p=(EMP *)malloc(sizeof(EMP)); //动态分布内存
printf(“please input the employee’s information :(number ,age ,sex ,name)\n”);
scanf("%d%d%s%d",&p->number,&p->age,p->sex,p->name);
add§;
}

用户操作时用的使 add information()函数,而实际上实现该功能的是add(EMP *p2)函数,这样大大减少了主函数的代码量,增加程序的可读性。

总的来说,该部分函数的难点可能在于对尾节点的理解和判断,巧妙的使用while循环便解决了这个问题。

2.删除结点与删除员工信息
同理在删除结点上,我们同样可以将删除用户信息和删除结点联系在一起。简化主函数代码的同时,是程序的条理性变得更好。

void del(char name[20]) //删除结点
{
EMP *p1,*p2;
int flag=0;

 p1=h->next;
 p2=p1->next;
 
 while(p2->next != null)   //保证不是尾节点
     {
          if((strcmp(name,p2->name))==null) 
          {
             p1->next=p2->next;
             free(p2);
             flag=1;
             break;
          }
          p1=p2;
          p2=p2->next;
     }
     if(flag==0)
         printf("no exist this people !");
     else
        printf("succeed !");

}

void del_information()
{
char name[20];
printf(“please input the employee’s name:”);
scanf("%s",name);
void del(name);
}

3.读取文件并创建链表
此函数的功能在于读取文件的同时,将文件的信息存到链表中,存储信息时,我们可以调用add(EMP *p2) 函数来简化代码。实现该功能关键是将创建链表和读取文件同时进行。以下的while循环就巧妙的实现了这个操作。

void load();
{
FILE *fp;
fp=fopen(“文件路径”,“文件的打开方式”);
if(fp == NULL)
{
printf(“error ! \n”);
return; //如果文件打开失败,返回到调用函数的地方
}

 while(!feof(fp))
 {
   EMP *P=(EMP *)malloc(sizeof(EMP));
   fsacnf(fp,"%d%d%s%s",&p->number,&p->age,p->sex,p->name);
   add(p);   //函数调用增加结点
 }
 printf("finish read !");
 
 fclose(fp);           //关闭文件

}

4.将链表中的信息存储到文件
在进行这一部分操作时,难点在于要同时进行文件信息的存储和链表的遍历。用while语句便可以巧妙的实现二者同时进行。

//将链表中的信息存储到文件
void save (EMP *h)
{
    FILE *fp;
    EMP *p;
    fp=fopen("文件的打开路径","打开方式"); //打开文件
    
    if(fp=null)           //如果文件打开错误,则返回调用函数的地方
    {
        printf("error !");
        return ;
    }
    p=h->next;       //将p初始化为头结点,遍历链表
    
    while(p->next != null)
    {
       fprintf(fp," %d  %d  %s  %s  \n",p->number,p->age,p->sex,p->name);
       p=p->next;
    }
    
    fclose(fp);      //关闭文件
   
}

5.链表结点的修改和员工信息修改

显然类似于增加结点与增加员工信息和删除结点与删除员工信息,为例主函数的简洁性,我们可以将这两个函数联系起来,二者形成调用与被调用关系。也就是说,用户看到的函数是"/员工信息修改函数",而实际修改信息的是"修改链表结点函数"。这样大大增加了函数的可读性。

//修改员工信息
void update_employee(EMP *h)
{
     char name[10];
     prinft("input the employee's name:\n");
     sacnf("%s",name);
     updatedoc(name,h);    //调用修改结点函数
}

//修改结点信息
void updatedoc(char name[10],EMP *h)
{
    EMP  *p;
    p=h->next;       //将指针p初始化为头结点,以此找到相应的结点
    
    while ((strcmp(name,p->name)) != 0)
    {
           p=p->next;
    }
        
    printf("input the employee's age:");
    scanf("%d",&p->age);
    printf("input the employee's sex:");
    scanf("%s",p->sex);
    printf("input the employee's name:\n");
    scanf("%s",p->name);
  
}

6.遍历和显示菜单
这两部分相对来说应该比较简单,前者即是对链表的遍历,后者需要注意的是菜单显示的美观性。

以上即是对用C语言编写简单管理系统的分析。

发布了10 篇原创文章 · 获赞 2 · 访问量 1147

猜你喜欢

转载自blog.csdn.net/qq_44872260/article/details/89190700