(排序和删除有问题,求大神!!!)C语言写的职工工资管理系统

排序和删除运行后会突然停止工作,求大神搭救。本人C语言菜鸟一枚,刚学C,写了个比较粗糙的系统,代码也是有参考别人的。毕竟水平有限,希望能有大神,帮我看看,指出其中的毛病。好的差的评价与建议都可留下,能给我留评论的都不甚感激,我一定会参考大家的意见,做出改进,努力地进步的.



#include<stdio.h>
#include<string.h>
#include<stdlib.h>
/*-----------------------定义职工结构体-----------------------*/
struct workerinf   //职工信息
{
  char name[30];   //职工姓名
  char sex[4];
  int ID;          //职工工号
  double salary1,salary2,salary3;  //基本工资,奖金,扣款
  double yfgz;       //保存职工应发工资
  double sk;         //保存职工税款
  double sfgz;       //保存职工实发工资
};


struct workerlink   //职工信息链节点
{
  char name[30];
  char sex[4];
  int ID;
  double salary1,salary2,salary3;//基本工资,奖金,扣款
  double yfgz;       //保存职工应发工资
  double sk;         //保存职工税款
  double sfgz;       //保存职工实发工资
  struct workerlink *next;
};


int sizeworker=sizeof(struct workerinf);
int sizeworlink=sizeof(struct workerlink);
/*------------------------计算文件长度-------------------------*/
int FileLenth(FILE  *fp)
{
    long flen;
  fseek(fp,0L,2);  /*到文件末尾*/
    flen=ftell(fp);  /*取位置*/
    rewind(fp);      /*回到文件头*/
    return flen;
}
/*------------------检测工号是否存在,若存在返回 1---------------*/
int exist(int n,FILE *fp) 
{  struct workerinf*p; 
   int cz=0;
   p=(struct workerinf*)malloc(sizeworker);     /*申请一个新节点,用于读文件内容*/
   rewind(fp);
   while(!feof(fp))
   {
     fread(p,sizeworker,1,fp);  /*读出文件内容*/
     if(p->ID==n)
     {cz=1;break;}
   }
   return cz;
}
/*-------------------------录入文字---------------------------*/
void InputWord(char *lx,char *p)
{
    char word[20];
    printf("请输入%s:",lx);
    scanf("%s",word);
    strcpy(p,word);
}//该函数的设定是为了后面编写代码不用重复啰嗦,以体现代码的简洁性
/*--------------------录入职工的工资-------------------------*/
float InputResult(char *lx,float d1,float d2)
{
    float result;
    printf("请输入职工%s:",lx);
    scanf("%f",&result);
    while(result>d2||result<d1)
    {
       printf("%s在%6.2f--%6.2f之间,请重新输入:",lx,d1,d2);
       scanf("%f",&result);
    }
    return (result);
}//为了防止恶意操作,使操作系统更加的人性化。
/*--------------------创建职工数据表-----------------------*/
void CreatWorker()
{
  long start,filelen;     //定义long型位移量start
  FILE *fp;               //定义一个指向文件的指针变量
  struct workerinf *w;    //定义一个职工信息的结构体变量,用于记录职工信息
  int amount=0;           //记录职工个数


  if((fp=fopen("staff","a+"))==NULL) fp=fopen("staff","w+");//将fopen函数返回值(指向staff文件的指针,即staff文件信息区的起始地址)
  start=FileLenth(fp);     //FileLenth函数利用fp测出staff文件信息区的长度赋给start。
  w=(struct workerinf*)malloc(sizeworker);
                           //申请一个结构体空间,用于记录职工的数据。
  while(1)                 //如果真,就执行while循环
  {  
  printf("请输入职工的工号(输入0返回主菜单):\n");
     scanf("%d",&w->ID);
     if(w->ID==0)         //用户输入0,退出
       {
        if (amount==0) 
        break; //无数据输入,直接退出,不用在退出前打印新录入的数据。
         filelen=FileLenth(fp);//做为后面打印出刚输入的信息的参数
         fseek(fp,start,0);     /*在退出前,将文件位置标记向前移动到离文件开头start个字节处.即文件尾。*/
        printf("|工号\t|姓名\t|性别\t|基本工资|奖金\t |扣款\t|应发工资|税款\t|实发工资|\n");
         while(ftell(fp)<filelen)    /*如果ftell(fp)计算出的此时文件位置标记的位置<staff文件长度执行while循环将新录入的内容打印出来。*/
          {
             fread(w,sizeworker,1,fp);     /*fread函数从fp所指向文件缓冲区的文件读入1个sizewoker个字节的数据,存储到w结构体中。即读出文件的内容。*/
             printf("|%d\t|%s\t|%s\t|%6.2f|%6.2f|%6.2f|%6.2f|%6.2f|%6.2f|\n",w->ID,w->name,w->sex,w->salary1,w->salary2,w->salary3,w->yfgz,w->sk,w->sfgz);
           }//在退出前将新录入的数据打印出来。
        break;//终止本次循环,直接退出输入数据的界面。
       }
     if(w->ID<0)
       {
        printf("\n输入的工号不能为0,请您重新输入:\n");
        continue;//结束本次循环。
        }
     if(exist(w->ID,fp)==1)   //检测工号是否存在。
       {
        printf("\n输入的工号已经存在!请您重新输入:\n"); 
        continue;
        }


       InputWord("姓名",w->name); //录入数据
       InputWord("性别",w->sex);//录入数据
       w->salary1=InputResult("基本工资",2000,10000);//录入数据
       w->salary2=InputResult("奖金",1000,5000);//录入数据
       w->salary3=InputResult("扣款",100,1000);//录入数据
       w->yfgz=w->salary1+w->salary2-w->salary3;//计算出应发的工资
       w->sk=w->yfgz*(0.05);//计算税款
       w->sfgz=w->yfgz*(0.95);//计算实发工资
       
       printf("职工工资信息录入完成,请查看:\n\n");
       printf("|%d\t|%s\t|%s\t|%6.2f|%6.2f|%6.2f|%6.2f|%6.2f|%6.2f|\n",w->ID,w->name,w->sex,w->salary1,w->salary2,w->salary3,w->yfgz,w->sk,w->sfgz);


       fwrite(w,sizeworker,1,fp);//把数据写入staff磁盘文件
       printf("系统已自动保存该职工的信息...\n\n");
       amount++;


    }
     fclose(fp);
}
/*-------------------------查找职工的数据-----------------------*/
void xmcz()//按姓名查找
{
 FILE *fp;
 struct workerinf *w;
 char name[20];
 int n=0;
 void search();
 
 if((fp=fopen("staff","r+"))==NULL) {printf("无数据可查\n");return;}


 while(1)
  {
     printf("请输入要查找的职工的姓名(输入0返回上一步):");
     scanf("%s",name);
     if(name[0]=='0')  break;//退出循环.退出按姓名查找的界面.
     rewind(fp);      //由于打开文件时,文件位置标记移动到了文件尾,因此将标记移动回文件开头。
     
        while(!feof(fp))       //打印找到的数据
            {  w=(struct workerinf*)malloc(sizeworker);     //申请一个新节点,用于读文件内容
         
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值