📄 gongziguanli.txt
字号:
void save()
{
FILE *fp; /*定义指向文件的指针*/
SALARY *p; /*定义移动指针*/
char outfile[10]; /*保存输出文件名*/
clrscr();/*清屏*/
printf("Enter outfile name,for example c:\\f1\\te.txt:\n");/*提示输入文件名格式信息*/
scanf("%s",outfile);
if((fp=fopen(outfile,"wb"))==NULL) /*为输出打开一个二进制文件*/
{
printf("can not open file\n");
return; /*返回*/
}
printf("\nSaving file......\n");
p=First; /*移动指针从头指针开始*/
while(p!=NULL) /*如p不为空*/
{
fwrite(p,sizeof(SALARY),1,fp); /*写入一条记录*/
p=p->next; /*指针后移,处理下一条记录*/
}
fclose(fp); /*关闭文件*/
printf("-----save success!!-----\n");/*显示保存成功*/
}
/*读文件*/
void load()
{
SALARY *p,*q=NULL; /*定义记录指针变量*/
FILE *fp; /* 定义指向文件的指针*/
char infile[10]; /*保存文件名*/
clrscr();/*清屏*/
printf("Enter infile name,for example c:\\f1\\te.txt:\n");/*输入文件名格式*/
scanf("%s",infile); /*输入文件名*/
if((fp=fopen(infile,"rb"))==NULL) /*打开一个二进制文件,为读方式*/
{
printf("can not open file\n"); /*如不能打开,则结束程序*/
return; /*返回*/
}
while(First) /*当表不为空时,清空链表*/
{
p=First; /*从头指针开始*/
First=First->next; /*删除头结点*/
free(p); /*释放空间*/
}
printf("\n -----Loading file!-----\n"); /*显示正在读文件*/
First=(SALARY *)malloc(sizeof(SALARY)); /*为头指针申请空间*/
if(!First) /*如果没有得到空间 显示内存溢出*/
{
printf("out of memory!\n");
return; /*返回*/
}
p=First; /*将头指针赋值给p*/
while(!feof(fp)) /*当文件不空时*/
{
if(1!=fread(p,sizeof(SALARY),1,fp))break; /*将记录读到p所指的结点*/
p->next=(SALARY *)malloc(sizeof(SALARY));/*为p的后继申请空间*/
if(!p->next) /*如果没有得到空间显示内存溢出*/
{
printf("out of memory!\n");
return; /*返回*/
}
p->prior=q; /*得到空间,则链接指针关系p的前驱为q*/
q=p; /*保存p做为新的p结点的前驱*/
p=p->next; /*p指针后移*/
}
q->next=NULL; /*q的后继为空*/
Last=q; /*尾指针为q*/
First->prior=NULL; /*头指针的前驱为空*/
fclose(fp); /*关闭文件*/
printf("---You have success read data from file!!!---\n"); /*显示成功读入记录*/
}
/*追加记录*/
void append()
{
FILE *fp; /*定义指向文件的指针*/
SALARY *info; /*指向追加信息的指针*/
char infile[10]; /*保存文件名*/
float temp; /*临时变量*/
clrscr(); /*清屏*/
gotoxy(1,3);
printf("**************gongziguanli************");
gotoxy(1,5);
printf("|------------------------------------|");
gotoxy(1,6);
printf("| no | name | jbgz | ");
gotoxy(1,7);
printf("|----------|----------------|--------|");
info=(SALARY *)malloc(sizeof(SALARY)); /*申请追加信息的空间*/
if(!info)
{
printf("\nout of memory"); /*没有空间,内存溢出*/
exit(0); /*结束程序*/
}
info->next=NULL; /*新信息的后继为空*/
info->prior=NULL; /*新信息的前驱为空*/
gotoxy(1,8);printf("|");
gotoxy(12,8);printf("|");
gotoxy(29,8);printf("|");
gotoxy(38,8);printf("|");
gotoxy(2,8);
inputs(info->no,10); /*输入编号并校验*/
gotoxy(13,8);
inputs(info->name,14); /*输入姓名并校验*/
gotoxy(30,8);
scanf("%f",&temp); /*输入基本工资*/
info->jbgz=temp;
info->koukuan=0; /*扣款为0*/
info->yfgz=0; /*应发工资为0*/
info->shuijin=0; /*税金为0*/
info->sfgz=0; /*实发工资为0*/
printf("|----------|----------------|--------|");
printf("\n\n\nEnter infile name,for example c:\\f1\\te.txt:\n"); /*提示输入文件名*/
scanf("%s",infile);
if((fp=fopen(infile,"ab"))==NULL) /*打开文件*/
{
printf("can not open file\n");
return; /*返回*/
}
printf("\n -----Appending record!-----\n");
if(1!=fwrite(info,sizeof(SALARY),1,fp)) /*向文件中追加记录*/
{
printf("-----file write error!-----\n"); /*写函数返回值不为1,说明写入错误*/
return; /*返回*/
}
printf("-----append sucess!!----\n");/*显示追加成功*/
fclose(fp);/*关闭文件*/
}
/*文件复制*/
void copy()
{
char outfile[10],infile[10]; /*保存源文件名和目标文件名*/
FILE *sfp,*tfp; /*定义指向源文件和目标文件的指针*/
SALARY *p=NULL; /*定义临时指针,暂存读出的记录*/
clrscr();
printf("Enter infile name,for example c:\\f1\\te.txt:\n");
scanf("%s",infile); /*输入源文件名*/
if((sfp=fopen(infile,"rb"))==NULL) /*二进制读方式打开源文件*/
{
printf("can not open input file\n"); /*显示不能打开文件信息*/
return; /*返回*/
}
printf("Enter outfile name,for example c:\\f1\\te.txt:\n"); /*提示输入目标文件名*/
scanf("%s",outfile); /*输入目标文件名*/
if((tfp=fopen(outfile,"wb"))==NULL) /*二进制写方式打开目标文件*/
{
printf("can not open output file \n");
return;
}
while(!feof(sfp)) /*读文件直到文件尾*/
{
if(1!=fread(p,sizeof(SALARY),1,sfp))
break;/*块读*/
fwrite(p,sizeof(SALARY),1,tfp); /*块写*/
}
fclose(sfp); /*关闭源文件*/
fclose(tfp); /*关闭目标文件*/
printf("you have success copy file!!!\n");/*显示成功拷贝*/
}
/*排序*/
void sort()
{
SALARY *p0,*p00,*p1,*p11,*p2; /*定义临时指针*/
int i=1; /*统计当前排第几个结点*/
clrscr(); /*清屏*/
printf("\n\n start sort....\n"); /*开始排序*/
p1=p11=p2=First;
while(p1!=NULL) /*当p1不为空时*/
{
p0=p1; /*待比较结点从p1开始*/
p2=p1; /*p2从当前待排序位置开始*/
while(p2->next!=NULL) /*p2的后继不为空时*/
{
if(p0->sfgz>p2->next->sfgz) /*找当前最小结点*/
{
p00=p2; /*找到当前最小结点记录其前驱指针*/
p0=p2->next; /*记录当前最小值结点的指针p0*/
}
p2=p2->next; /*指针后移*/
}
Last=p0; /*当前最小结点为尾结点*/
if(p1!=p0) /*判断最小结点是否是当前排序位置,不是则作指针修改*/
{
p00->next=p0->next; /*将p00的后继指向p0的后继*/
p0->next->prior=p00; /*p0的后继的前驱为p00*/
p0->next=p1; /*p0的后继指向下个排序位置p1*/
p1->prior=p0; /*p1的前驱为p0*/
if(i==1)
{
First=p0; /*作头指针*/
First->prior=NULL; /*头指针的前驱为空*/
}
else /*不是第一个结点*/
{
p11->next=p0; /*p11的后继指向p0*/
p0->prior=p11; /*p0的前驱指向p11*/
}
p11=p1=p0; /*因p0是排好序的最后一个结点,p1是下一个将要排序的位置,所以将p0赋值给p1和p11*/
}
i++; /*排好序的结点数加1*/
p1=p1->next; /*p1后移指向下一个待排序位置*/
}
printf("sort sucess!!!\n"); /*输出排序成功*/
}
/*索引*/
void index()
{
SALARY *p,*q,*t,*h1; /*定义临时指针*/
clrscr();/*清屏*/
printf("\n\n start index.....\n\n"); /*显示开始索引*/
h1=First->next; /*将原表的头指针所指的下一个结点作头指针*/
First->next=NULL; /*第一个结点为新表的头结点*/
Last=First; /*尾指针等于头指针*/
while(h1!=NULL) /*当原表不为空时,进行排序*/
{
t=h1; /*取原表的头结点*/
h1=h1->next; /*原表头结点指针后移*/
p=First; /*设定移动指针p,从头指针开始*/
q=First; /*设定移动指针q做为p的前驱,初值为头指针*/
while(strcmp(t->no,p->no)>0&&p!=NULL) /*作编号比较*/
{
q=p; /*待排序点值大,应往后插,所以新表指针后移*/
p=p->next;
}
if(p==q) /*p==q,说明待排序点值小,应排在首位*/
{
t->next=p; /*待排序点的后继为p*/
p->prior=t; /*p的前驱结点指向待排序结点*/
First=t; /*新头结点为待排序点*/
First->prior=NULL; /*头指针的前驱为空*/
}
else /*待排序点应插入在中间某个位置q和p之间,如p为空则是尾部*/
{
t->next=p; /*t的后继是p*/
t->prior=q; /*t的前驱是q*/
q->next=t; /*q的后继是t*/
if(p==NULL) /*判p是否为空*/
Last=t; /*将t赋值为尾指针*/
else
p->prior=t; /*否则将t赋值给p的前驱*/
}
}
printf("index sucess!!!\n");/*索引排序成功*/
}
/*分类合计*/
void total()
{
struct t1 /*定义结构体保存合计数据*/
{
char u[7]; /*部门*/
float s; /*合计实发工资*/
}unit[20]; /*定义一个单位部门数不超过20个*/
SALARY *p,*q; /*定义临时指针变量*/
char sno[7],qno[7],*ptr; /*保存部门号*/
float s1; /*保存合计值*/
int i,j; /*控制变量*/
p=First; /*从指针开始*/
i=0; /*统计部门数*/
clrscr();/*清屏*/
while(p!=NULL) /*当p不为空时做下面的处理*/
{
memcpy(sno,p->no,6); /*从编号中取出部门号*/
sno[6]='\0'; /*做字符串结束标记*/
q=p->next; /*将指针指向待比较的记录*/
s1=p->sfgz; /*当前部门的实发工资初值作为该部门合计值的初值*/
while(q!=NULL) /*内循环开始*/
{
memcpy(qno,q->no,6); /*读部门号*/
qno[6]='\0'; /*做字符串结束标记*/
if(strcmp(qno,sno)==0) /*比较部门号*/
{
s1+=q->sfgz; /*累加实发工资*/
q=q->next; /*指针指向下一条记录*/
}
else
break; /*不是一个部门的结束本次内循环*/
}
strcpy(unit[i].u,sno); /*将部门号写入部门结构体数组中*/
unit[i].s=s1; /*将实发工资写入部门结构体数组中*/
i++; /*部门数累加*/
if(q==NULL) /*如果q为空,跳出循环*/
break;
else
p=q; /*否则,将q赋值给p*/
}
printf("\n\n**************Total table**************\n");/*输出合计标题*/
printf("\n--no-------unit------------total---------\n"); /*输出序号、部门、合计字段标题*/
for(j=0;j<i;j++)
printf(" %d %s %10.2f\n",j,unit[j].u,unit[j].s); /*输出合计值*/
printf("----------------------------------------\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -