职工信息管理系统(用c++编译运行) 课程设计

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct staff
{
 char name[30],sex[20],education[40],address[100],number[30];//姓名,性别,学历,住址,电话     
 int num,age;//职工号,年龄
 double salary;//工资
 struct staff *next;
};

struct staff *head=NULL;
struct staff *head1;


//输入信息
void input(){
	struct staff*tail,*p;

if(head==NULL){
head=(struct staff*)malloc(sizeof(struct staff));
p=head;
tail=head;
head->next=NULL;
printf("输入职工姓名:");
 scanf("%s",p->name); 
 getchar();
 printf("输入职工号(4位):");
 scanf("%d",&p->num);
 printf("输入职工性别:");
 scanf("%s",p->sex);
 getchar();
 printf("输入职工年龄:");
 scanf("%d",&p->age);
 printf("输入职工学历:");
 scanf("%s",p->education);
 getchar();
printf("输入职工工资:");
 scanf("%lf",&p->salary);
 printf("输入职工住址:");
 scanf("%s",p->address);
 getchar();
 printf("输入职工电话:");
 scanf("%s",p->number);
getchar();
}

else {
for(tail=head;tail->next!=NULL;tail=tail->next){}//遍历链表,找到尾节点
 //head->next=NULL;tail=head;
p=(struct staff*)malloc(sizeof(struct staff));
 printf("输入职工姓名:");
 scanf("%s",p->name); 
 getchar();
 printf("输入职工号(4位):");
 scanf("%d",&p->num);
 printf("输入职工性别:");
 scanf("%s",p->sex);
 getchar();
 printf("输入职工年龄:");
 scanf("%d",&p->age);
 printf("输入职工学历:");
 scanf("%s",p->education);
 getchar();
printf("输入职工工资:");
 scanf("%lf",&p->salary);
 printf("输入职工住址:");
 scanf("%s",p->address);
 getchar();
 printf("输入职工电话:");
 scanf("%s",p->number);
getchar();
 p->next=NULL;
        tail->next=p;
}
}





//输出信息 
void output()
{struct staff*tail=head;
while(tail!=NULL)
{
 printf("  姓名          职工号            性别          年龄          学历             工资                    住址                      电话");
 printf("\n\n");
 {
 printf("%6s",tail->name);
  printf("%16d",tail->num);
  printf("%14s",tail->sex);
  printf("%14d",tail->age);
  printf("%17s",tail->education);
  printf("%19.2lf",tail->salary);
  printf("%30s",tail->address);
  printf("%24s",tail->number);
  printf("\n\n");
 }
 tail=tail->next;
}
}



//查询输出一个职工的信息 
int outputone(double salary)
{
struct staff *tail;

for(tail=head;tail->salary!=salary;tail=tail->next){if(tail->next==NULL&&tail->salary!=salary)return -1;}
 printf("  姓名          职工号            性别          年龄          学历             工资                    住址                      电话");
 printf("\n\n");
 {
   printf("%6s",tail->name);
  printf("%16d",tail->num);
  printf("%14s",tail->sex);
  printf("%14d",tail->age);
  printf("%17s",tail->education);
  printf("%19.2lf",tail->salary);
  printf("%30s",tail->address);
  printf("%24s",tail->number);
  printf("\n\n");
 }
  return 1;
}




///单链表结构按工资从高到低排序
void sort() //传进来一个有头节点的链表
{
  //传进来一个有头节点的链表

    struct staff *tail,*p,*q,*head1=head->next;
    tail = NULL;
    
    
    if(head->salary<(head->next->salary)){
    	head->next=head->next->next;
    	head1->next=head;
head=head1;    	
	}


    while((head->next->next) != tail) 
    {
        p = head;
        q = head->next;
        /*冒泡排序的本质将所找到的数都下沉,所以内层循环比外层小一个节点*/
        while((q->next) != tail)
        {
            if((q->salary) < (q->next->salary))   //不停判断两个相邻的数并且交换顺序
            {
                p->next = q->next;
                q->next = q->next->next;
                p->next->next = q;
                q = p->next;    //始终保存p,q是相邻的位置
            }
            q = q->next;
            p = p->next;
        }
        /*最重要的一步,将tail不停向前移动*/
        tail = q;   
    }
    
}




// 修改职工信息
void modify() {
    int num;
    struct staff*p=head;
    printf("请输入要修改的职工号:");
    scanf("%d", &num);
    while (p != NULL) {
        if (p->num == num) { // 找到要修改的节点
            printf("输入职工姓名:");
 scanf("%s",p->name);
 getchar(); 
 printf("输入职工号:");
 scanf("%d",&p->num);
 printf("输入职工性别:");
 scanf("%s",p->sex);
 printf("输入职工年龄:");
 scanf("%d",&p->age);
 printf("输入职工学历:");
 scanf("%s",p->education);
printf("输入职工工资:");
 scanf("%lf",&p->salary);
 printf("输入职工住址:");
 scanf("%s",p->address);
 printf("输入职工电话:");
 scanf("%s",p->number);
            printf("修改成功!\n\n");
            system("cls");
            return;
        }
        p = p->next;
    }

    printf("未找到该职工!\n\n");
    system("cls");
}


//删除 
void del() {
    int id;
    printf("请输入要删除的职工号:");
    scanf("%d", &id);

   struct staff* p = head;
    struct staff* prev = NULL;
    while (p != NULL) {
        if (p->num == id) { // 找到要删除的节点
            if (prev == NULL) { // 如果要删除的节点是头节点
                head = p->next;
            } else {
                prev->next = p->next;
            }
            free(p); // 释放要删除的节点的内存
            printf("删除成功!\n\n");
            system("cls");
            return;
        }
        prev = p;
        p = p->next;
    }

    printf("未找到该职工!\n\n");
   
    system("cls");
}





//存入文件 
void save()
{struct staff *Tail=NULL,*p1=NULL;//新建文件链表的头结点
head1=NULL;
 struct staff *tail=head;//原链表的指针
 FILE *fp;
 fp = fopen("职工信息管理系统.txt","w");
 if(fp == NULL)
 {
  printf("error!");
  exit(0);
 }
 else
 {fprintf(fp,"  姓名          职工号            性别          年龄          学历             工资                      住址                      电话\n");
  if(head1==NULL){
  head1=(struct staff*)malloc(sizeof(struct staff));
  Tail=head1;
  head1->next=NULL;
  strcpy(Tail->name,tail->name);
  //职工号
  //性别
  //年龄
  strcpy(Tail->education,tail->education);
  //工资
  strcpy(Tail->address,tail->address);
  strcpy(Tail->number,tail->number);
  strcpy(Tail->sex,tail->sex);
  Tail->num=tail->num;
  Tail->age=tail->age;
  Tail->salary=tail->salary;
  
    fprintf(fp,"%6s",Tail->name);
  fprintf(fp,"%16d",Tail->num);
  fprintf(fp,"%14s",Tail->sex);
  fprintf(fp,"%14d",Tail->age);
  fprintf(fp,"%17s",Tail->education);
  fprintf(fp,"%19.2lf",Tail->salary);
  fprintf(fp,"%30s",Tail->address);
  fprintf(fp,"%24s",Tail->number);
  fprintf(fp,"\n");
  tail=head->next;
  }
	
while(tail!=NULL){

p1=(struct staff*)malloc(sizeof(struct staff));
p1->next=NULL;
Tail->next=p1;

  strcpy(p1->name,tail->name);
  //职工号
  //性别
  //年龄
  strcpy(p1->education,tail->education);
  //工资
  strcpy(p1->address,tail->address);
  strcpy(p1->number,tail->number);
  strcpy(p1->sex,tail->sex);
  p1->num=tail->num;
  p1->age=tail->age;
  p1->salary=tail->salary;
  
    fprintf(fp,"%6s",p1->name);
  fprintf(fp,"%16d",p1->num);
  fprintf(fp,"%14s",p1->sex);
  fprintf(fp,"%14d",p1->age);
  fprintf(fp,"%17s",p1->education);
  fprintf(fp,"%19.2lf",p1->salary);
  fprintf(fp,"%30s",p1->address);
  fprintf(fp,"%24s",p1->number);
  fprintf(fp,"\n");

  Tail=p1;
  tail=tail->next;
  }
  printf("文件写入成功\n");
 }
 fclose(fp);

}






// 读取文件
struct staff* read(struct staff*head1)
{
    struct staff* head = NULL;
    struct staff* tail = NULL;

    FILE* fp;
    fp = fopen("职工信息管理系统.txt", "r");
    if (fp == NULL)
    {
        printf("打开文件失败!\n");
        exit(1);
    }

    // 跳过表头
    char header[200];
    fgets(header, sizeof(header), fp);
printf("  姓名          职工号            性别          年龄          学历             工资                    住址                      电话");
 printf("\n\n");
    while (!feof(fp)) {
        struct staff* p = (struct staff*)malloc(sizeof(struct staff));
        if(p == NULL) {
            printf("内存分配失败!\n");
            exit(1);
        }

        // 从文件中读取数据
        if (fscanf(fp, "%s%d%s%d%s%lf%s%s",p->name, &p->num, p->sex, &p->age, p->education, &p->salary, p->address, p->number) != 8) {
            free(p); // 如果读取失败,释放内存
            break;
        }

        p->next = NULL;

        if (head == NULL) {
            head = p;
            tail = p;
        }
        else {
            tail->next = p;
            tail = p;
        }
       printf("%6s",p->name);
  printf("%16d",p->num);
  printf("%14s",p->sex);
  printf("%14d",p->age);
  printf("%17s",p->education);
  printf("%19.2lf",p->salary);
  printf("%30s",p->address);
  printf("%24s",p->number);
  printf("\n\n");
    }

printf("文件读取成功");
    fclose(fp);
    return head;
}






//菜单 
int main(){
 struct staff*m;
 int n=0,count;
 int option=1;
 
 while(option<=8&&option>=1)
 {
  printf("\n------职工信息管理系统------\n\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("------0.  退出  ------\n");
  printf("------------------------\n");
  printf("输入选项:");
   scanf("%d",&option);
  switch(option)
  {
   case 1:
   {
    system("cls");
     input();
    break;
   }
   case 2:
   {
    system("cls");
     output();
    break;
   }
   case 3:
   {
    system("cls");
    sort();
    sort();
    printf("排序完成\n");
    break;
   }
   case 4:
   {
    system("cls");
    int salary;
    printf("输入要查找职工的工资:");
    scanf("%d",&salary);
    int index=outputone(salary);
    if(index==-1)
    {
     printf("查找失败\n");
    }
    else
    {
     printf("查找成功\n");
    }
    break;
   }
   case 5:
   {
   modify();
    
    break;
   }
   case 6:
   {
   
    del();
    system("cls");
    break;
   }
   
  
   case 7:
   {
    system("cls");
    save();
    break;
    
   }
   case 8:{
   	head=read(head1);
   	
	break;
   }
   
   
   case 9:{
   	FILE* fp;
    fp = fopen("职工信息管理系统.txt", "w");
    fclose(fp);
   printf("已经删除所有职工信息");
	break;
   }
   

   case 0: break;
    if(option==0)break;
   }
   if(option==0)break;
  }
   
 }



















功能:

1.录入信息
2.浏览信息  
3.按工资排序
4.按工资查询
5.修改信息 
6.删除信息 
7.保存至文件
8.读取文件
9.删除文本所有职工信息
0.  退出 

 

 

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值