📄 gongziguanli.txt
字号:
print(p); /*调用输出函数显示头结点信息*/
for(;;) /*循环开始*/
{
printf("\n\n0. Quit 1. Prior 2. Next 3. First 4.Last \n\n");
/*菜单项Quit退出 Prior前驱 Next后继 First第一条 Last最后一条*/
printf("\nplease select 0~4:"); /*提示输入菜单选项0~4*/
scanf("%d",&ch); /*输入菜单选项0~4*/
if(ch==0) break; /*如果选项为0,退出*/
switch(ch) /*开关语句根据选项字符判断*/
{
case 1:p=p->prior;if(p==NULL)p=First;break; /*指向前驱,没有前驱指向第一个*/
case 2:p=p->next;if(p==NULL) p=Last;break; /*指向后继,没有后继指向最后一个*/
case 3:p=First;break; /*指向第一个结点*/
case 4:p=Last;break; /*指向最后一个结点*/
}
print(p); /*调用输出函数显示指针所指结点信息*/
}
}
}
/*输出指针所指结点信息*/
void print(SALARY *p)
{
if(p) /*如果指针不为空,则显示信息*/
{
clrscr(); /*清屏*/
printf("\n\n\n"); /*换行*/
printf("************************************SALARY************************************\n"); /*输出标题信息*/
printf("|no | name | jbgz | koukuan| yfgz | shuijin | sfgz |\n"); /*输出字段标题*/
printf("|----------|---------------|---------|---------|---------|---------|---------|\n"); /*输出分割线*/
printf("|%-10s|%-15s|%9.2f|%9.2f|%9.2f|%9.2f|%9.2f|\n", p->no,p->name,
p->jbgz,p->koukuan,p->yfgz,p->shuijin,p->sfgz);/*输出结点信息*/
printf("***************************************end***************************** *******\n"); /*输出结束标记*/
}
}
/*计算实发工资*/
void calc()
{
int x; /*行坐标*/
int i=0; /*记录数*/
float temp; /*临时变量扣款*/
SALARY *p; /*移动指针*/
clrscr(); /*清屏*/
p=First; /*从头指针开始*/
while(p!=NULL) /*当p不为空时,也就是有记录时,外循环控制换页*/
{
x=0;
clrscr();
gotoxy(1,3);
printf("***************************gongziguanli************************************"); /*输出标题*/
gotoxy(1,5);
printf("|--------------------------------------------------------------------------|");
gotoxy(1,6);/*下面输出字段标题*/
printf("| no | name | jbgz | koukuan | yfgz |shuijin | sfgz |");
while(p!=NULL) /*当p不为空时,也就是有记录时,内循环控制处理9条*/
{
gotoxy(1,7+x);
printf("|----------|----------------|--------|----------|--------|--------|--------|");
gotoxy(1,8+x);printf("|");
gotoxy(12,8+x);printf("|");
gotoxy(29,8+x);printf("|");
gotoxy(38,8+x);printf("|");
gotoxy(49,8+x);printf("|");
gotoxy(58,8+x);printf("|");
gotoxy(67,8+x);printf("|");
gotoxy(76,8+x);printf("|");
gotoxy(2,8+x);
printf("%-10s",p->no); /*输出编号*/
gotoxy(13,8+x);
printf("%-15s",p->name); /*输出姓名*/
gotoxy(30,8+x);
printf("%.2f",p->jbgz); /*输出基本工资*/
gotoxy(39,8+x);
scanf("%f",&temp); /*输入扣款*/
p->koukuan=temp; /*扣款字段赋值*/
p->yfgz=p->jbgz-p->koukuan; /*计算应发工资=基本工资-扣款*/
gotoxy(50,8+x);
printf("%.2f",p->yfgz); /*输出应发工资*/
gotoxy(59,8+x);
p->shuijin=(p->yfgz-1000)*fax(p->yfgz); /*否则按税率计算税金*/
printf("%.2f",p->shuijin); /*输出税金*/
gotoxy(68,8+x);
p->sfgz=p->yfgz-p->shuijin; /*计算实发工资*/
printf("%-8.2f",p->sfgz); /*输出实发工资*/
x+=2; /*行坐标下移两行*/
i++; /*记录数加1*/
if(i%9==0)break; /*记录数超过9条,跳出内循环*/
p=p->next; /*指针后移,处理下一条*/
}
gotoxy(1,7+x);
printf("|----------|----------------|--------|----------|--------|--------|--------|\n"); /*输出结束行*/
printf("Press any key congtinue...\n");
getch();
}
}
/*根据应发工资,计算税率*/
float fax(float x)
{
float f1;
if(x<1000)
return 0; /*小于1000,返回0*/
switch((int)(x/1000))
{
case 1:f1=0.05;break; /*1000~1999,返回0.05*/
case 2:f1=0.1;break; /*2000~2999,返回0.1*/
case 3:f1=0.15;break; /*3000~3999,返回0.15*/
case 4:f1=0.2;break; /*4000~4999,返回0.2*/
default:f1=0.3;break; /*5000以上,返回0.3*/
}
return f1;
}
/*计算票面张数*/
void computer()
{
SALARY *p;
int i=0,a[7]={0},t100,t50,t20,t10,t5,t2,t1;/*设置数组和临时变量保存票面张数*/
float t; /*过渡变量,保存当前剩余工资*/
p=First; /*移动指针从头指针开始*/
while(p!=NULL) /*当p不为空时*/
{
t100=(int)p->sfgz/100; /*计算100元张数*/
a[0]=a[0]+t100; /*累加保存*/
t=p->sfgz-t100*100; /*剩余工资*/
t50=(int)(t/50); /*计算50元张数*/
a[1]=a[1]+t50; /*累加保存*/
t=t-t50*50; /*剩余工资*/
t20=(int)(t/20); /*计算20元张数*/
a[2]=a[2]+t20; /*累加保存*/
t=t-t20*20; /*剩余工资*/
t10=(int)(t/10); /*计算10元张数*/
a[3]=a[3]+t10; /*累加保存*/
t=t-t10*10; /*剩余工资*/
t5=(int)(t/5); /*计算5元张数*/
a[4]=a[4]+t5; /*累加保存*/
t=t-t5*5; /*剩余工资*/
t2=(int)(t/2); /*计算2元张数*/
a[5]=a[5]+t2; /*累加保存*/
t=t-t2*2; /*剩余工资*/
t1=(int)(t); /*计算1元张数*/
a[6]=a[6]+t1; /*累加保存*/
p=p->next; /*指针后移,处理下一条记录*/
}
clrscr(); /*清屏*/
printf("\n\n\n***********ticket number***************\n"); /*输出标题*/
printf("--100-----50------20-----10-----5------2------1------\n");
/*输出张数标题*/
for(i=0;i<7;i++)
printf("%5d ",a[i]);/*输出所需的张数*/
printf("\n");/*换行*/
}
/*按编号查找记录*/
SALARY *find(char *no)
{
SALARY *p; /*定义移动指针*/
p=First; /*从头指针开始*/
while(p) /*当p不为空时*/
{
if(!strcmp(no,p->no))
return p; /*比较相等,查找成功,返回指针*/
p=p->next; /*不相等指针后移*/
}
printf("not found\n"); /*没有找到*/
return NULL; /*返回为空指针*/
}
/*删除结点*/
void delete()
{
SALARY *p; /*定义临时变量,p指向要删除的结点p*/
char s[11]; /*要删除结点的编号*/
clrscr(); /*清屏*/
printf("please deleted no\n"); /*提示输入信息*/
scanf("%s",s); /*输入要删除的职工编号*/
if((p=find(s))!=NULL) /*调用查找函数,如果找到做下面的处理*/
{
if(First==p) /*如果是第一个结点*/
{
First=p->next; /*将头指针指向其后继结点*/
if(First) /*如头指针不为空*/
First->prior=NULL; /*将头结点的前驱设为空*/
else
Last=NULL; /*否则头为空,尾也为空*/
}
else /*删除的不是第一个结点*/
{
p->prior->next=p->next; /*p的前驱的后继指向p原来的后继*/
if(p!=Last) /*如果p不是最后个结点*/
p->next->prior=p->prior; /*p后继的前驱指向p原来的前驱*/
else
Last=p->prior;/*如p是最后一个结点,修改尾指针为p的前驱*/
}
free(p); /*删除结点后,不要忘记释放空间*/
printf("\n have deleted %s SALARY\n",s);
printf("Don't forget save\n");
}
}
/*按姓名查找结点*/
void search()
{
SALARY *p; /*移动指针*/
char s[15]; /*保存姓名*/
clrscr(); /*清屏*/
printf("please enter name for search\n"); /*提示输入*/
scanf("%s",s); /*输入要查找人的姓名*/
p=First; /*移动指针从头指针开始*/
while(strcmp(p->name,s)&&p!=NULL) /*做比较判断*/
p=p->next; /*没找到,指针后移继续查找*/
if(p==NULL) /*指针为空,说明没有找到*/
printf("\nlist no %s SALARY\n",s); /*显示没找到信息*/
else
{
printf("\n\n"); /*换行*/
print(p); /*查找成功,调用输出函数输出指针p所指记录*/
}
}
/*插入结点*/
void insert()
{
SALARY *p,*info; /* info为新结点,p为新结点的后继*/
char s[11]; /*保存查找的姓名*/
float temp; /*临时变量*/
clrscr(); /*清屏*/
printf("please enter location before the no\n"); /*提示输入在哪个结点之前插入*/
scanf("%s",s); /*输入指定结点的编号*/
printf("\nplease new record\n"); /*提示输入记录*/
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("|----------|----------------|--------|");
p=First; /*移动指针从头指针开始*/
while(strcmp(p->no,s)&&p!=NULL) /*查找结点确定插入位置*/
p=p->next; /*指针后移,继续查找*/
if(p==NULL) /*如p为空*/
if(p==First) /*如p为头指针,说明链表为空*/
{
First=info; /*新结点为头指针*/
First->prior=NULL; /*头结点的前驱为空*/
Last=First; /*唯一结点,尾指针等于头指针*/
}
else /*新结点插在尾部*/
{
Last->next=info;
info->prior=Last;
Last=info; /*尾指针指向新结点*/
}
else
if(p==First) /*p不为空,但p为头指针,新结点插在第一个结点位置*/
{
info->prior=NULL; /*新结点的前驱为空*/
info->next=p; /*新结点的后继为p*/
p->prior=info; /*p的前驱是新结点*/
First=info; /*修改头指针指向新结点*/
}
else /*新结点插入在中间某一个位置p之前*/
{
info->next=p; /*新结点的后继是p*/
info->prior= p->prior; /*新结点的前驱是p的前驱*/
p->prior->next=info; /*p的前驱的后继是新结点*/
p->prior=info; /*p的前驱是新结点*/
}
printf("\n\n\n ----have inserted %s SALARY----\n",info->name);
printf("\n---Don't forget save---\n"); /*提醒调用保存文件存盘*/
}
/*保存文件*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -