工资管理(C语言课程设计)[推荐]_c课程设计工资管理

2020-02-28 其他范文 下载本文

工资管理(C语言课程设计)[推荐]由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“c课程设计工资管理”。

#include “stdio.h”

/*I/O函数*/ # include “bios.h” /*ROM基本输入输出函数*/ #include “dos.h”

/*dos接口函数*/ #include “conio.h”

/*屏幕操作函数*/ #include “stdlib.h”

/*其它说明*/ #include “string.h” /*字符串函数*/ #include “mem.h” /*内存操作函数*/ #include “ctype.h” /*字符操作函数*/ #include “alloc.h” /*动态地址分配函数*/ /****变量定义*******/ typedef struct z1

/*定义数据结构*/ {

char no[11];

/*编号*/

char name[15];/*姓名*/

float jbgz;

/*基本工资*/

float koukuan;/*扣款*/

float yfgz;/*应发工资*/

float shuijin;/*税金*/

float sfgz;

/*实发工资*/

struct z1 *prior;/*前驱指针*/

struct z1 *next;/*后继指针*/ }SALARY;

/*结构体类型名*/ struct z1 *First;

/*双链表头指针*/ struct z1 *Last;

/*双链表尾指针*/ /******函数原型*********/ void init();

/*初始化*/ void create();/*创建链表*/ void calc();

/*计算应发工资*/ void delete();/*删除*/ void search();/*查找*/ void save();/*保存文件*/ void load();/*读取文件*/ void computer();/*计算所需各种票面张数*/ void insert();/*插入*/ void append();/*追加*/ void copy();/*复制文件*/ void sort();/*排序*/ void index();/*索引*/ void total();/*分类合计*/ void list();/*显示所有数据*/ void print(SALARY *p);/*输出单条记录*/ void display();/*随意逐条显示*/ float fax(float x);/*计算税金*/

int menu_select();/*主菜单*/ /*******主函数开始**********/ main(){

int i;

clrscr();

for(;;)

{

switch(menu_select())

/*调用菜单函数返回一个整数值*/

{

case 0:init();break;

/*初始化*/

case 1:create();break;/*输入数据创建双链表*/

case 2:list();break;/*显示所有数据*/

case 3:display();break;/*单条显示*/

case 4:calc();break;/*计算实发工资*/

case 5:search();break;/*查找职工信息数据*/

case 6:delete();break;/*删除记录*/

case 7:insert();break;/*插入记录*/

case 8:append();break;/*追加记录*/

case 9:save();break;/*保存文件*/

case 10:load();break;/*读取文件*/

case 11:copy();break;/*复制文件*/

case 12:sort();break;/*按实发工资升序排序*/

case 13:computer();break;/*计算所需票面数*/

case 14:index();break;/*按职工号索引*/

case 15:total();break;/*按部门求合计*/

case 16:exit(0);

/*退出*/

}

} } /*菜单函数,函数返回值为整型,代表所选的菜单项*/ menu_select(){

char *f[]= {

/*定义菜单字符串数组*/

“**************MENU*************”, /*菜单的标题行*/

“ 0.init list”, /*初始化双链表*/

“ 1.Enter list”, /*输入数据,创建双链表*/

“ 2.List all n”, /*显示所有记录*/

“ 3.Display record by step”, /*显示单条记录*/

“ 4.Calc the salary”, /*计算实发工资*/

“ 5.Search record on name”, /*查找记录*/

“ 6.Delete a record”, /*删除记录*/

“ 7.Insert record to list”, /*插入记录*/

“ 8.Append record to file”, /*追加记录*/

“ 9.Save data to the file”, /*保存文件*/

“ 10.Load data from the file”,/*读取文件*/

“ 11.Copy the file to new file”, /*复制文件*/

“ 12.Sort on sfgz”, /*排序*/

“ 13.Computer ticket number”, /*计算所需票面数*/

“ 14.Index on number”, /*索引*/

“ 15.Total on number”, /*分类合计*/

“ 16.Quit” };/*退出*/

char s[80];

int i;

int key=0;/*记录所压键值*/

int c=0;

gotoxy(1,25);/*移动光标*/

printf(“pre any key enter menu......n”);/*压任意键进入主菜单*/

getch();

clrscr();/*清屏*/

textcolor(YELLOW);/*设置文本颜色为黄色*/

textbackground(BLUE);/*设置背景颜色为兰色*/

gotoxy(10,2);

putch(0xda);/*输出左上角边框┏*/

for(i=1;i

putch(0xc4);/*输出上边框水平线*/

putch(0xbf);/*输出右上角边框

┓*/

for(i=3;i

{

gotoxy(10,i);putch(0xb3);

gotoxy(54,i);putch(0xb3);

}

gotoxy(10,22);putch(0xc0);/*输出左上角边框┗*/

for(i=1;i

putch(0xc4);/*输出下边框水平线*/

putch(0xd9);/*输出右下角边框┛*/

window(11,3,53,21);/* 制作显示菜单的窗口,大小根据菜单条数设计*/

clrscr();

/*清屏*/

for(i=0;i

{

gotoxy(10,i+1);

cprintf(“%s”,f[i]);/*输出菜单项数组*/

}

i=1;

gotoxy(10,2);/*设置默认选项在第一项*/

textbackground(LIGHTGREEN);/*设置背景颜色为浅绿*/

cprintf(“%s”,f[1]);/*输出菜单项,表示选中*/

gotoxy(10,2);/*移动光标到菜单的第一项*/

while(key!=13)

/*所压键不是回车键时*/

{

while(bioskey(1)==0);/*查询是否压下了一个键*/

key=bioskey(0);

/*返回下一个在键盘压下的键*/

key=key&0xff?key&0xff:key>>8;/*对所压的键进行判断*/

gotoxy(10,i+1);

textbackground(BLUE);/*设置背景颜色为蓝色*/

cprintf(“%s”,f[i]);/*输出菜单项*/

if(key==72)i=i==1?17:i-1;/*如压向上光标键↑,i减1,如已到第一行再上移,则到最后一行*/

if(key==80)i=i==17?1:i+1;/*如压向下光标键↓,i加1,如已到最后一行再下移,则到第一行*/

gotoxy(10,i+1);/*光标移动i的下一项*/

textbackground(LIGHTGREEN);/*将背景颜色设为浅绿*/

cprintf(“%s”,f[i]);/*输出菜单项*/

c=i-1;/*给代表菜单选项的整数赋值*/

}

textbackground(BLACK);/*设置背景颜色为黑色*/

window(1,1,80,25);/*恢复原窗口大小*/

return c;/*返回代表菜单选项的整数值*/ } /*初始化函数*/ void init(){

First=NULL;

Last=NULL;} /*输入数据,创建双链表*/ void create(){

int x;/*记录行坐标*/

int i;/*记录输入记录数*/

int flag=0;/*做结束标记*/

float temp;

/*定义临时变量*/

SALARY *info,*p;/*定义临时变量*/

if(First!=NULL)

init();/*如果头指针为空,调用初始化函数*/

p=First;/*从头指针开始*/

for(;;)

{

if(flag==1)

break;/*如果flag=1,结束输入*/

i=0;

x=0;

/*确定移动的行坐标*/

clrscr();/*清屏*/

gotoxy(1,3);

printf(“*************gongziguanli*************”);/*输出标题*/

gotoxy(1,4);

printf(“

--Enter @ end--”);/*提示输入@结束*/

gotoxy(1,5);

printf(“|-----|”);/*输出表格的起始线*/

gotoxy(1,6);

printf(“|

no

|

name

| jbgz |”);/*输出字段标题,注意空格数*/

for(;;)

{

gotoxy(1,7+x);

printf(“|----------|----------------|--------|”);/*输出表格的水平线*/

info=(SALARY *)malloc(sizeof(SALARY));/*申请一个记录空间*/

if(!info)

{

printf(“nout of memory”);/*如没有得到空间,输出内存溢出信息*/

exit(0);/*退出程序*/

}

info->next=NULL;/*新结点的后继为空*/

info->prior=NULL;/*新结点的前驱为空*/

gotoxy(1,8+x);printf(“|”);/*输出数据间的分割线*/

gotoxy(12,8+x);printf(“|”);

gotoxy(29,8+x);printf(“|”);

gotoxy(38,8+x);printf(“|”);

gotoxy(2,8+x);/*光标到输入编号位置*/

inputs(info->no,10);/*输入编号,并验证长度不超过10*/

if(info->no[0]=='@')

{

flag=1;

break;

} /*编号首字符为@结束输入*/

gotoxy(13,8+x);/*光标到输入姓名位置*/

inputs(info->name,14);/*输入姓名,并验证长度不超过14*/

gotoxy(30,8+x);/*光标到输入基本工资位置*/

scanf(“%f”,&temp);/*输入基本工资到临时变量*/

info->jbgz=temp;/*基本工资赋值*/

info->koukuan=0;/*初始扣款为0,待计算工资时输入*/

info->sfgz=0;/*初始实发工资为0,待计算工资时计算*/

info->shuijin=0;/*初始税金为0,待计算工资时计算*/

info->yfgz=0;/*初始应发工资为0,待计算工资时计算*/

if(p==NULL)/*如果p为空,说明输入的是第一个结点*/

{

First=Last=info;/*头指针和尾指针*/

First->prior=NULL;/*头指针的前驱是空*/

Last->next=NULL;/*尾指针的后继是空*/

}

else /*插入的结点不是第一结点,则插入在头结点之前*/

{

info->next=p;/*新结点的后继指向原来的头结点*/

info->prior=p->prior;/*新结点的前驱指向原来的头结点的前驱*/

p->prior=info;/*原来结点的前驱指向新结点*/

}

p=info;/*新结点变为p结点,暂时的头结点*/

First=info;/*新结点变为头结点*/

x+=2;

/*因为水平线,将光标下移两行*/

gotoxy(1,8+x);

i++;

/*输入记录数加1*/

if(i%9==0)

break;/*输入9个记录,换一页输入*/

}

gotoxy(1,8+x);

}

printf(“|----------|----------------|--------|”);/*输出结尾水平线*/ } /*字符串输入和验证函数*/ inputs(char *s, int count){

char p[255];

do{

scanf(“%s”,p);/*输入字符串*/

if(strlen(p)>count)printf(“n too long!n”);/*进行长度校验,超过count值重输入*/

}while(strlen(p)>count);

strcpy(s,p);/*将输入的字符串拷贝到字符串s中*/ } /*显示链表*/ void list(){

int i=0,n;/*记录输出行数*/

SALARY *p;/*定义移动指针*/

clrscr();/*清屏*/

p=First;/*从头指针开始*/

while(i%10==0&&p!=NULL)/*外循环控制换页*/

{

i=0;

/*记录一页的输出行数*/

clrscr();

/*清屏*/

printf(“nnn”);/*换行三次*/

printf(“*************************************SALARY***********************************n”);

/*输出大标题*/

printf(“|nO

|

name

|

jbgz | koukuan |

yfgz | shuijin |

sfgz |n”);/*输出字段标题*/

printf(“|----------|---------------|---------|---------|---------|---------|---------|n”);/*输出水平线*/

while(p!=NULL)/*当p不为空时*/

{

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);

p=p->next;/*指针后移*/

i++;

/*输出行数加1 */

if(i%10==0)

break;/*如果满10行,跳出内循环*/

}

printf(“****************************************end***********************************n”);/*输出本页的结束行*/

printf(“Pre any key congtinue...n”);

getch();/*输出一页暂停一下,压任意键继续*/

} /*返回到外循环,准备下一页的输出*/ } /*单条显示记录*/ void display(){

int ch;

/*菜单选项字符*/

SALARY *p;/*定义临时指针*/

clrscr();/*清屏*/

p=First;/*从头指针开始*/

if(p==NULL)/*指针为空,即链表为空,返回主函数*/

{

printf(“record is empty!n”);

return;

}

else

{

print(p);

/*调用输出函数显示头结点信息*/

for(;;)/*循环开始*/

{

printf(“nn0.Quit 1.Prior

2.Next

3.First

4.Last nn”);/*菜单项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(“nnn”);/*换行*/

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(“Pre any key congtinue...n”);

getch();

} } /*根据应发工资,计算税率*/ float fax(float x){

float f1;

if(x

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(“nnn***********ticket number***************n”);/*输出标题*/

printf(“--100-----50------20-----10-----5------2------1------n”);

/*输出张数标题*/

for(i=0;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 foundn”);/*没有找到*/

return NULL;/*返回为空指针*/ } /*删除结点*/ void delete(){

SALARY *p;/*定义临时变量,p指向要删除的结点p*/

char s[11];/*要删除结点的编号*/

clrscr();/*清屏*/

printf(“please deleted non”);/*提示输入信息*/

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 SALARYn”,s);

printf(“Don't forget saven”);

} } /*按姓名查找结点*/ void search(){

SALARY *p;/*移动指针*/

char s[15];/*保存姓名*/

clrscr();/*清屏*/

printf(“please enter name for searchn”);/*提示输入*/

scanf(“%s”,s);/*输入要查找人的姓名*/

p=First;/*移动指针从头指针开始*/

while(strcmp(p->name,s)&&p!=NULL)/*做比较判断*/

p=p->next;

/*没找到,指针后移继续查找*/

if(p==NULL)/*指针为空,说明没有找到*/

printf(“nlist no %s SALARYn”,s);/*显示没找到信息*/

else

{

printf(“nn”);/*换行*/

print(p);/*查找成功,调用输出函数输出指针p所指记录*/

} } /*插入结点*/ void insert(){

SALARY *p,*info;/* info为新结点,p为新结点的后继*/

char s[11];/*保存查找的姓名*/

float temp;/*临时变量*/

clrscr();/*清屏*/

printf(“please enter location before the non”);/*提示输入在哪个结点之前插入*/

scanf(“%s”,s);/*输入指定结点的编号*/

printf(“nplease new recordn”);/*提示输入记录*/

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(“nnn----have inserted %s SALARY----n”,info->name);

printf(“n---Don't forget save---n”);/*提醒调用保存文件存盘*/ } /*保存文件*/ void save(){

FILE *fp;/*定义指向文件的指针*/

SALARY *p;/*定义移动指针*/

char outfile[10];/*保存输出文件名*/

clrscr();/*清屏*/

printf(“Enter outfile name,for example c:f1 e.txt:n”);/*提示输入文件名格式信息*/

scanf(“%s”,outfile);

if((fp=fopen(outfile,“wb”))==NULL)/*为输出打开一个二进制文件*/

{

printf(“can not open filen”);

return;/*返回*/

}

printf(“nSaving file......n”);

p=First;/*移动指针从头指针开始*/

while(p!=NULL)/*如p不为空*/

{

fwrite(p,sizeof(SALARY),1,fp);/*写入一条记录*/

p=p->next;/*指针后移,处理下一条记录*/

}

fclose(fp);/*关闭文件*/

printf(“-----save succe!-----n”);/*显示保存成功*/ } /*读文件*/ void load(){

SALARY *p,*q=NULL;/*定义记录指针变量*/

FILE *fp;/* 定义指向文件的指针*/

char infile[10];/*保存文件名*/

clrscr();/*清屏*/

printf(“Enter infile name,for example c:f1 e.txt:n”);/*输入文件名格式*/

scanf(“%s”,infile);/*输入文件名*/

if((fp=fopen(infile,“rb”))==NULL)/*打开一个二进制文件,为读方式*/

{

printf(“can not open filen”);/*如不能打开,则结束程序*/

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 succe 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(“nnnEnter infile name,for example c:f1 e.txt:n”);/*提示输入文件名*/

scanf(“%s”,infile);

if((fp=fopen(infile,“ab”))==NULL)/*打开文件*/

{

printf(“can not open filen”);

return;/*返回*/

}

printf(“n-----Appending record!-----n”);

if(1!=fwrite(info,sizeof(SALARY),1,fp))/*向文件中追加记录*/

{

printf(“-----file write error!-----n”);/*写函数返回值不为1,说明写入错误*/

return;/*返回*/

}

printf(“-----append suce!----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 e.txt:n”);

scanf(“%s”,infile);/*输入源文件名*/

if((sfp=fopen(infile,“rb”))==NULL)/*二进制读方式打开源文件*/

{

printf(“can not open input filen”);/*显示不能打开文件信息*/

return;/*返回*/

}

printf(“Enter outfile name,for example c:f1 e.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 succe copy file!!n”);/*显示成功拷贝*/ } /*排序*/ void sort(){

SALARY *p0,*p00,*p1,*p11,*p2;/*定义临时指针*/

int i=1;/*统计当前排第几个结点*/

clrscr();/*清屏*/

printf(“nn 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 suce!!n”);/*输出排序成功*/ } /*索引*/ void index(){

SALARY *p,*q,*t,*h1;/*定义临时指针*/

clrscr();/*清屏*/

printf(“nn start index.....nn”);/*显示开始索引*/

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 suce!!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]='';/*做字符串结束标记*/

q=p->next;/*将指针指向待比较的记录*/

s1=p->sfgz;/*当前部门的实发工资初值作为该部门合计值的初值*/

while(q!=NULL)/*内循环开始*/

{

memcpy(qno,q->no,6);/*读部门号*/

qno[6]='';/*做字符串结束标记*/

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(“nn**************Total table**************n”);/*输出合计标题*/

printf(“n--no-------unit------------total---------n”);/*输出序号、部门、合计字段标题*/

for(j=0;j

printf(“

%d

%s

%10.2fn”,j,unit[j].u,unit[j].s);/*输出合计值*/

printf(“---------n”);}

《工资管理(C语言课程设计)[推荐].docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
工资管理(C语言课程设计)[推荐]
点击下载文档
相关专题 c课程设计工资管理 工资管理 课程设计 语言 c课程设计工资管理 工资管理 课程设计 语言
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文