| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
 本帖最后由 一秋 于 2019-9-15 21:58 编辑  
 
[hide]#include "stdio.h" 
#include "string.h" 
#include "stdlib.h" 
#define FILENAME "worker.bin" 
#define N 20 
struct worker 
{ 
    int number;       /*工号*/ 
    int counts;       /*数量*/ 
    int grade;        /*等级*/ 
 
}; 
/*******************************************************        
             定义 
 *******************************************************/ 
 void xinxi() 
 { 
 
        printf("\n+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"); 
        printf("+                 职工工作量统计系统                      +\n"); 
                printf("+                                                         +\n"); 
        printf("+                 1. 职工基本信息输入                     +\n"); 
        printf("+                                                         +\n"); 
                printf("+                 2. 工作量输入                           +\n"); 
        printf("+                                                         +\n"); 
                printf("+                 3. 按工作量排序                         +\n"); 
        printf("+                                                         +\n"); 
                printf("+                 4. 按职工工号进行信息删除               +\n"); 
        printf("+                                                         +\n"); 
        printf("+                 5. 结束程序                             +\n"); 
                printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"); 
 
 }  
/*******************************************************        
                    显示菜单 
 *******************************************************/ 
int readFromFile(struct worker w[]) 
 { 
        FILE *fp=NULL; 
        int i=0; 
 
        fp=fopen(FILENAME,"rb");  /*打开文件*/ 
 
        if(fp!=NULL) 
        { 
 
                while(!feof(fp))    /*从文件中读入学生*/ 
                { 
      
                        if(i>=N) 
                                break; 
                        if(fread(w+i,sizeof(worker),1,fp)==1) 
                                i++; 
                } 
 
                fclose(fp); 
        } 
    return i; 
} 
/*******************************************************        
                信息显示到屏幕 
 *******************************************************/ 
 int f(struct worker w[],int length) 
{ 
         
         int i=length; 
         while(i<N) 
         { 
                  printf("第%d个职工\n",i); 
                  printf("\n"); 
                  printf("请你输入工号(以职工号为0结束):\n");/*输入工号*/ 
                  scanf("%d",&w[i].number); 
                  if(w[i].number==0) 
                          break; 
                  printf("\n"); 
                  printf("\n"); 
                   
          printf("请你输入数量:\n");/*输入数量*/ 
                  scanf("%d",&w[i].counts); 
                  printf("\n");  
                  i++; 
         } 
         
          return i; 
         } 
  
/*******************************************************        
      功能:输入职工基本信息   
 *******************************************************/ 
 void input(struct worker w[],int length) 
 { 
     int i=1; 
         int number,counts; 
     printf("请输入工号:"); 
         scanf("%d",&number);   
     while(number!=0) 
         {   
                printf("请输入完成数量:\n"); 
                scanf("%d",&counts); 
                 for(i=0;i<length;i++) 
                        if(w[i].number==number) 
                        { 
                                w[i].counts+=counts; 
                break; 
                        } 
                if(i>=length)  
                        printf("工号不存在:\n"); 
                printf("请输入工号:"); 
                scanf("%d",&number);   
         } 
} 
/*******************************************************        
      功能:工作量输入并累加  
 *******************************************************/ 
void sortCounts(struct worker w[],int length) 
{ 
        int i=0,j=0,k=0; 
        struct worker s; 
        for(i=0;i<length;i++) 
        {       
                k=i; 
                for(j=i+1;j<length;j++) 
                        if(w[j].counts>w[k].counts) 
                                k=j; 
        /*  交换 w[i] and w[k] */ 
        s = w[k]; 
        w[k] =w[i]; 
        w[i] = s; 
    } 
        if(length>0) 
                w[0].grade =1; 
        for(i=1;i<length;i++) 
                if(w[i].counts==w[i-1].counts) 
                        w[i].grade=w[i-1].grade; 
                else 
                        w[i].grade=w[i-1].grade+1;   
  
 
} 
 
//////////////////////////////////////////////////////////////////////////////// 
                     /* 按工作量从大到小排序并标上名次 */ 
//////////////////////////////////////////////////////////////////////////////// 
void sortNumber(struct worker w[],int length) 
{ 
        int i=0; 
        int grade,count; 
    if(length>0) 
        {   while(i<length) 
                {       
                   count=0; 
                   grade=w[i].grade; 
                   printf("名次:%d ", grade); 
                   printf(" 工作量:%d ",w[i].counts); 
                   printf("%s","工号:"); 
                   while(i<length) 
                   { 
                          if(grade==w[i].grade) 
                          { 
                                  printf("%d ",w[i].number); 
                                  count++; 
                          } 
                          else 
                                break; 
                          i++; 
           }  
                   printf("人数:%d\n",count);                 
                } 
        } 
        else 
                printf("职工数据不存在!\n"); 
 
 
} 
//////////////////////////////////////////////////////////////////////////////// 
       /* 输出名次、同一名次的职工人数及他们的工号,姓名*/ 
//////////////////////////////////////////////////////////////////////////////// 
int delet(struct worker w[],int length,int stuNum) 
{ 
        int i,j; 
        char choice; 
        for(i=0;i<length;i++) 
        { 
                if(stuNum==w[i].number) 
       { 
                        printf("%s","欲删除职工号为:"); 
                    printf("%d\n",w[i].number);         
                        break;  
                } 
    } 
    if(i<length) 
        { 
                 printf("你确实要删除这个职工吗?(Y/N)"); 
                scanf("%c",&choice); 
                if(choice=='Y'||choice=='y') 
                { 
                        for(j=i;j<length;j++) 
                                w[j]=w[j+1]; 
                        length--; 
                      printf("删除成功!\n"); 
                }                 
        } 
    else 
        printf("\n指定的职工不存在!\n"); 
        return length; 
} 
 
/******************************************************** 
                 按职工号删除职工信息 
********************************************************/ 
void writeToFile(struct worker w[],int length) 
{ 
        FILE *fp=NULL; 
        int i=0; 
 
        fp=fopen(FILENAME,"wb"); 
 
        if(fp==NULL) 
        { 
                printf("打开文件出错!\n"); 
                exit(0); 
        } 
 
        for(i=0;i<length;i++) 
                fwrite(w+i,sizeof(worker),1,fp); 
 
        fclose(fp); 
 
} 
/******************************************************** 
                结构体数组中的职工信息输出到文件 
********************************************************/ 
void main () 
{    
         int choice; 
         struct worker w[N]; 
         int NUM;char stuName[100]; 
         int stuNum; 
         int length=0; 
         length=readFromFile(w);//读入 
     do 
         {    xinxi(); 
               
                  scanf("%d",&choice); 
                  switch(choice) 
                { case 1: 
                          length=f(w,length); 
                     break; 
          
                  case 2: 
                          input(w,length); 
                     break; 
                  case 3: 
                      sortCounts(w,length); 
                      sortNumber(w,length); 
                      break;  
                  case 4: 
              printf("请输入欲删除的职工号"); 
                          scanf("%d",&stuNum); 
                      length=delet(w,length,stuNum); 
                     break;  
          
                  case 5: 
                          {     
                                   writeToFile(w,length);//保存 
                               printf("程序使用以结束\n"); 
                               exit(0); 
                          } 
                   default: 
                           { 
                               printf("输入有错误请重新输入:\n"); 
                           } 
                  } 
        }while(1); 
} 
 
针对运行不了的问题,我把cpp文件上传到了百度网盘,有需要的小伙伴自行提取下载哈 
百度网盘链接:https://pan.baidu.com/s/1QaSxRdw6Vqr7f6VHMmOkaQ  
提取码:5nlv  |   
 
 
 
 |