C语言课程设计 某企业职工工资管理系统
我这里有一份我当年坐课程设计的程序,你可以改改
工资信息管理系统课程设计 工资管理系统概要设计说明书
工资信息管理系统课程设计 工资管理系统概要设计说明书
# include
# include
# include
# include
# include
using namespace std;
struct worker_inf
{int month; //月份
int code; //工人编号
string name; //姓名
float get[4]; //基本工资,津贴,房帖,交通补贴
float pay[4]; //房租,储蓄,交通费,会费
float tax; //个人所得税
float theory_num; //应发书
float reduce_num; //应扣数
float pract_num; //实发数
worker_inf next;
};
/////////////////////////////////////////////////////////////////
class worker //定义职工类
{private:
worker_inf head;
void print(worker_inf ); //输出一条指定职工的工资记录,并返回该记录的指针
worker_inf find(int); //查找条例条件的记录,并返回该记录的指针
public:
worker(){head=NULL;}
worker_inf get_head(){return head;}
int listcount(); //统计当前链表的记录总数,并返回一个整数
void add(int month,int code,string name,float get[4],float pay[4]); //添加一条工资记录表尾
void remove(int); //删除一条指定职工的工资记录
int menu(); //修改某职工工资的菜单
void changemonth(); //修改月份
void change(int); //修改职工的工资信息
void list(); //输出当月全体职工的工资信息
void search(int); //输出指定编号职工的工资信息
float tax_num(); //计算职工个人所得税
float theorynumber(); //计算应发工资
float reducenumber(); //计算应扣工资
float practnumber(); //计算实发工资
};
//////////////////////////////////////////////////////////////////
int worker::listcount() //统计当前链表数,并返回一个整数
{if(!head)return 0;
worker_inf p=head;
int n=0;
while(p)
{n++;p=p->next;}
return n;
}//////////////////////////////////////////////////////////////////
void worker::add(int month,int code,string name,float get[4],float pay[4]) //添加一条工资记录到表尾
{if(!head)
{head=new worker_inf;
for(int i=0;i<4;i++)
{head->get[i]=get[i];
head->pay[i]=pay[i];
}head->code=code;
head->month=month;
head->name=name;
head->next=NULL;
return;
}worker_inf t=head;
while(t && t->code!=code)
t=t->next;
if(t)
{cout<<"作失败:编号为"< return; }worker_inf p=head; while(p->next)p=p->next; worker_inf p1=new worker_inf; p1->code=code; for(int i=0;i<4;i++) {p1->get[i]=get[i]; p1->pay[i]=pay[i]; }p1->code=code; p1->month=month; p1->name=name; p1->next=NULL; p->next=p1; return; }//////////////////////////////////////////////////////////////////// void worker::remove(int code) //删除一条指定职工的工资记录 {worker_inf t=find(code); if(!t)return; worker_inf p=head;//如果要删除的记录位于表头 if(head==t) {head=head->next; delete p; cout<<"成功删除编号为"< return; }while(p->next!=t)p=p->next; worker_inf p1=p->next; p->next=p1->next; delete p1; cout<<"成功删除编号为"< return; }//////////////////////////////////////////////////////////////// int worker::menu() //修改某一职工信息的菜单 {int select=-1; cout<<"tttttt修改菜单"< cout<<"1.基本工资"< cout<<"2.津贴"< cout<<"3.房帖"< cout<<"4.交通补贴"< cout<<"5.房租"< cout<<"6.储蓄"< cout<<"7.交通费"< cout<<"8.会费"< cout<<"0.退出修改系统"< cout<<"[请选择(输入相应数字)]:"; cin>>select; if(select<0||select>9) {cout<<"对不起您输入错误!请重新输入【0-9】:"< cin>>select; }return select; }///////////////////////////////////////////////////////////////// int menu(); void worker::change(int code) //修改某职工部分工资信息 {worker_inf p=find(code); if(!p){cout<<"不存在职工编号为"< int select; while(1) {float m; select=menu(); if(select==0){("cls");break;} cout<<"请输入修改后的值"; cin>>m; int n; if(select<=4){ n=select-1; p->get[n]=m;} else{ n=select-5; p->pay[n]=m;} tax_num(); theorynumber(); reducenumber(); practnumber(); cout<<"修改成功"< }} //////////////////////////////////////////////////////////////////// void worker::changemonth() //修改月份 {worker_inf p=head; while(p) {if(p->month==12)p->month=1; else p->month++; p=p->next; }} ////////////////////////////////////////////////////////////////////// void worker::print(worker_inf p)//输出worker_inf制定的记录 {cout.precision(0); cout< month<<" "; cout< code<<" "; cout< name<<"t"; for(int i=0;i<4;i++) {cout< for(int j=0;j<4;j++) {cout< pay[j]<<"t";} cout< tax<<"t"; cout< theory_num<<"t"; cout< reduce_num<<"t"; cout< pract_num< return; }/////////////////////////////////////////////////////////////////////// void worker::list() //列出当前链表中的所有记录 {if(listcount==0) {cout<<"错误:当前的列表为空!"< return; }worker_inf p=head; cout<<"共有记录:"< cout<<"月份t编号t姓名t基本工资t津贴t房帖t交通补贴t房租t储蓄t交通费t会费t个人所得税t应发工资t应扣工资t实际工资"< while(p) {print(p); p=p->next; }cout< return; }///////////////////////////////////////////////////////////////////////// void worker::search(int code) //在当前链表查找指定记录并输出 {cout<<"searching....."< worker_inf p=find(code); if(p) {cout<<"月份t编号t姓名t基本工资t津贴t房帖t交通补贴t房租t储蓄t交通费t会费t个人所得税t应发工资t应扣工资t实际工资"< print(p); }cout< }////////////////////////////////////////////////////////////////////////// worker_inf worker::find(int code) //查找条例条件的记录,并返回该指针 {if(listcount==0) {cout<<"错误:当前列表为空!"< return NULL; }worker_inf p=head; while(p) {if(p->code==code)break; p=p->next; }if(!p) {cout<<"错误:找不到该记录!n"; return NULL; }return p; }////////////////////////////////////////////////////////////////////////// float worker::theorynumber() //计算应发数 {int i; if(listcount()==0) {cout<<"错误:当前的列表为空!"< return -1; }float sum; worker_inf p=head; while(p) {sum=0; for(i=0;i<4;i++) sum+=p->get[i]; p->theory_num=sum; p=p->next; }return 0; }////////////////////////////////////////////////////////////////// float worker::tax_num() //计算个人所得税 {if(listcount==0) {cout<<"错误:当前的列表为空!"< return -1; }worker_inf p=head; while(p) {float s; s=p->theory_num; if(s<=800) p->theory_num=0; else if(s<=2000) p->theory_num=(s-800)0.05; else if(s<=5000) p->theory_num=(s-2000)0.1+60; else p->theory_num=(s-5000)0.2+360; p=p->next; }return 0; }/////////////////////////////////////////////////////////////////////// float worker::reducenumber() //计算应扣数 {int i; if(listcount==0) {cout<<"错误:当前的列表为空!"< }float sum; worker_inf p=head; while(p) {sum=0; for(i=0;i<4;i++) sum+=p->pay[i]; p->reduce_num=p->tax+sum; p=p->next; }return 0; }///////////////////////////////////////////////////////////////////////// float worker::practnumber() //计算实发数 {if(listcount()==0) {cout<<"错误:当前的列表为空!"< return -1; }worker_inf p=head; while(p) {float a,b; a=p->theory_num; b=p->reduce_num; p->pract_num=a-b; p=p->next; }return 0; }//////////////////////////////////////////////////////////////////////////// worker worker; //定义全局变量 int menu() {int select=-1; cout<<"主菜单"< cout<<"1.添加职工信息;"< cout<<"2.删除职工信息;"< cout<<"3.修改职工的工资信息;"< cout<<"4.按职工编号查找记录;"< cout<<"5.列出所有记录;"< cout<<"6.从数据文件导入当月工资信息;"< cout<<"7.将当月工资信息导出到磁盘文件;"< cout<<"0.安全退出系统;"< cout<<"[请选择(输入相应的数字)]:"; cin>>select; return select; }///////////////////////////////////////////////////////////////////////////// char exit() {char s; cout<<"确定要退出程序吗?[Y/N]:"; cin>>s; return s; }////////////////////////////////////////////////////////////////////////////// void input(int month,intcode,string name,float get[4],float pay[4]) //输入职工信息 {cout<<"请输入月份 编号 姓名 基本工资 津贴 房帖 交通补贴 房租 储蓄 交通费 会费:"< cin>>month; cin>>code; if(code==-1)return; cin>>name>>get[0]>>get[1]>>get[2]>>get[3]>>pay[0]>>pay[1]>>pay[2]>>pay[3]; return; }/////////////////////////////////////////////////////////////////////////////// void addnew() //增加记录 {int month=0,code=0;float get[4]={0},pay[4]={0}; string name=""; cout< input(&month,&code,&name,get,pay); while(code!=-1) {worker.add(month,code,name,get,pay); worker.tax_num(); worker.theorynumber(); worker.reducenumber(); worker.practnumber(); input(&month,&code,&name,get,pay); }return; }//////////////////////////////////////////////////////////////////////////////// void dofind() //按职工编号查找 {int code; cout< do {cout<<"请输入要查找的职工的编号:"; cin>>code; if(code==-1)continue; worker.search(code); }while(code!=-1); return; }///////////////////////////////////////////////////////////////////////////////// void dodelete() //删除职工信息 {cout< int code; do {cout<<"请输入要删除的职工的编号:"; cin>>code; if(code==-1)continue; worker.remove(code); }while(code!=-1); return; }/////////////////////////////////////////////////////////////////////////////////// void domodify() //修改职工信息 {int code; cout<<"当输入职工编号为-1时表示结束修改"< while(1){ cout<<"请输入所需修改职工编号"; cin>>code; if(code==-1)return; else worker.change(code); }return; }/////////////////////////////////////////////////////////////////////////////////// void SeFili()//将当月工资信息写入文件 {worker_inf p; char name[20]; fstream iofile; int i=0; iofile.open("Worker_5th.dat",ios::out|ios::binary); if(!iofile) {cerr<<"open error!"< abort(); }p=worker.get_head(); while(p) {p->name.copy(name,20,0); name[p->name.length()]=0; iofile.write((char ) &p->code,sizeof(int)); iofile.write((char ) &p->month,sizeof(int)); iofile.write((char ) name,20); for(int i=0;i<4;i++) {iofile.write((char ) &p->get[i],sizeof(float)); }for(int j=0;j<4;j++) {iofile.write((char ) &p->pay[j],sizeof(float)); }p=p->next; }iofile.close(); cout<<"成功将工资信息存入文件"< }//////////////////////////////////////////////////////////////////////// void Loadfili() //读取当月全体职工的工资信息文件 {int month,code; char name[20]=""; float get[4],pay[4]; fstream iofile; int i=0; iofile.open("Worker_5th.dat",ios::in|ios::binary); if(!iofile) {cout<<"数据文件不存在,请先建立该文件"< return; }if(iofile.eof()) {cout<<"数据库为空,请先添加数据"< iofile.close(); }else {while(iofile.peek()!=EOF)//peek()是取文件当前指针,EOF是文件尾标符 {iofile.read((char ) &code,sizeof(int)); iofile.read((char ) &month,sizeof(int)); iofile.read((char ) name,20); for(int i=0;i<4;i++) {iofile.read((char ) &get[i],sizeof(float)); } for(int j=0;j<4;j++) {iofile.read((char ) &pay[j],sizeof(float)); }worker.add(code,month,name,get,pay); }worker.tax_num(); worker.theorynumber(); worker.reducenumber(); worker.practnumber(); iofile.close(); cout<<"成功导入工资信息"< }} ///////////////////////////////////////////////////////////////////////// void list() {worker.list(); }///////////////////////////////////////////////////////////////////////// int main() {cout<<"欢迎进入职工工资管理系统"< int select; char s; while(1) {select=menu(); switch(select) {case 0: //退出程序 s=exit(); if(s=='y'||s=='Y') return 0; break; case 1: //增加新记录 addnew(); break; case 2: //删除记录 dodelete(); break; case 3: //修改记录 domodify(); break; case 4: //按条件查找 dofind(); break; case 5: //列出全部记录 list(); break; case 6: //导入当月职工记录 Loadfili(); break; case 7: //将职工记录存入磁盘 SeFili(); break; default: cout<<"此输入无效!"< }} return 0; } //C语言课程设计 职工信息管理系统—单链表实现 #include "stdio.h" #include "stdlib.h" #include "string.h" int seflag=0; /是否需要存盘的标志变量/ struct employee {char name[15]; char num[10];/ 工号 / char [4]; char bm[15]; char zc[20]; int gz; }; typedef struct node {struct employee data; struct node next; }Node,Link; //Link l (注意是:字母l不是数字1) void add(Link l); void disp(Link l); //查看职工所有信息 void del(Link l); //删除功能 Node Locate(Link l,char findmess[],char nameornum[]); void Qur(Link l); //查询功能 void Tongji(Link l); //统计 void Sort(Link l); //排序 void Modify(Link l); //修改功能 void se(Link l); //将单链表l中的数据写入文件 void printe(Node p); //本函数用于打印链表中某个的数据内容 / //以下4个函数用于输出中文标题 void printstart(); void Wrong(); void Nofind(); void printc(); void menu() {printf("tn"); printf("t n"); printf("t 职工信息管理系统_结构体数组实现 n"); printf("t n"); printf("t [1] 增加职工信息 [2] 删除职工信息 n"); printf("t [3] 查询职工信息 [4] 修改职工信息 n"); printf("t [5] 插入职工记录 [6] 统计职工记录 n"); printf("t [7] 排序 [8] 保存职工信息 n"); printf("t [9] 显示数据 [0] 退出系统 n"); printf("t n"); printf("tn"); } //void menu菜单结束 void Disp(Link l) //显示单链表l中存储的职工记录,内容为employee结构中定义的内容 {int count=0; Node p; p=l->next; // l存储的是单链表中头结点的指针,该头结点没有存储职工信息,指针域指向的后继结点才有职工信息 if(!p) /p==NULL,NUll在stdlib中定义为0/ {printf("n=====>提示:没有职工记录可以显示!n"); return; }printf("tttt显示结果n"); printstart(); //打印横线 printc(); //打印各学科标题 printf("n"); while(p) //逐条输出链表中存储的职工信息 {printe(p); p=p->next; }printstart(); printf("n"); } //void Disp结束 void printstart() {printf("-----------------------------------------------------------------------n"); }void Wrong() {printf("n=====>提示:输入错误!n"); }void Nofind() {printf("n=====>提示:没有找到该职工!n"); }void printc() / 本函数用于输出中文 / {printf(" 工号t 姓名 性别 部门 职称 工资 总工资 平均工资n"); }void printe(Node p)/ 本函数用于打印链表中某个的数据内容 / {printf("%-12s%st%st%dt%dt%dt %dt %dn", p->data.num,p->data.name,p->data.,p->data.bm,p->data.zc,p->data.gz); }//Locate(l,findmess,"num"); / 该函数用于定位连表中符合要求的结点,并返回该指针 / Node Locate(Link l,char findmess[],char zcornum[]) {Node r; if(strcmp(zcornum,"num")==0) / 按工号查询 / {r=l->next; while(r!=NULL) {if(strcmp(r->data.num,findmess)==0) /若找到findmess值的工号/ return r; r=r->next; }} else if(strcmp(zcornum,"zc")==0) / 按职称查询 / {r=l->next; while(r!=NULL) {if(strcmp(r->data.zc,findmess)==0) /若找到findmess值的职工职称/ return r; r=r->next; }} return 0; /若未找到,返回一个空指针/ }//add()函数中,无时,r指向list头,有时,r指向末尾 void Add(Link l) / 增加职工 / {Node p,r,s; /实现添加作的临时的结构体指针变量/ char num[10]; int flag=0; r=l; s=l->next; //链表没有时,s=null;/链表有时,指向个职工 while(r->next!=NULL) //如果存在后继结点时,r指针后移一个 r=r->next; /将指针移至于链表最末尾,准备添加记录/ while(1) {printf("请你输入工号(以'0'返回上一级菜单:)"); scanf("%s",num); if(strcmp(num,"0")==0) //输入'0',跳出while(1),即跳出add()函数 break; s=l->next; //作用? 每次从个开始找,看num是否重复。 while(s) //工号重复时,返回主菜单 {if(strcmp(s->data.num,num)==0) {printf("=====>提示:工号为'%s'的职工已经存在,若要修改请你选择'4 修改'!n",num); flag=1; //break; return ; }s=s->next; } //while(s) p=(Node )malloc(sizeof(Node)); //生成没赋值的新 p strcpy(p->data.num,num); printf("请你输入姓名:"); scanf("%s",p->data.name); getchar(); printf("请你输入性别:"); scanf("%s",p->data.); getchar(); printf("请你输入职工所在部门:"); scanf("%d",&p->data.bm); getchar(); printf("请你输入职工职称:"); scanf("%d",&p->data.zc); getchar(); printf("请你输入职工工资:"); scanf("%d",&p->data.gz); getchar(); / 信息输入已经完成 / p->next=NULL; /表明这是链表的尾部结点/ r->next=p; /将新建的结点加入链表尾部中/ r=p; seflag=1; } //while(1) } //void Add增加结束 void Del(Link l) / 删除 / {int sel; Node p,r; /实现删除作的临时的结构体指针变量/ char findmess[20]; if(!l->next) //当list无后继结点时,提示和结束返回del() {printf("n=====>提示:没有记录可以删除!n"); return; }printf("n=====>1按工号删除n=====>2按姓名删除n"); scanf("%d",&sel); if(sel==1) //按工号删除 {printf("请你输入要删除的工号:"); scanf("%s",findmess); p=Locate(l,findmess,"num"); if(p) {r=l; while(r->next!=p) r=r->next; //从个结点找起,直到发现r->next=p, 是待删除结点,跳出循环 r->next=p->next; //r r->next(p) p->next free(p); printf("n=====>提示:该职工已经成功删除!n"); seflag=1; }else Nofind(); //显示一句话 } //if(sel==1) else if(sel==2) //按姓名删除 {printf("请你输入要删除的姓名:"); scanf("%s",findmess); p=Locate(l,findmess,"name"); if(p) {r=l; while(r->next!=p) r=r->next; r->next=p->next; //r r->next(p) p->next free(p); printf("n=====>提示:该职工已经成功删除!n"); seflag=1; }else Nofind(); } //if(sel==2) else Wrong(); //显示输入错误的话 } //void Del删除结束 void Qur(Link l) //查询功能 {int sel; char findmess[20]; Node p; //实现查询作的临时的结构体指针变量 if(!l->next) {printf("n=====>提示:没有资料可以查询!n"); return; }printf("n=====>1按工号查找n=====>2按职称查找n"); scanf("%d",&sel); if(sel==1)/ 工号 / {printf("请你输入要查找的工号:"); scanf("%s",findmess); p=Locate(l,findmess,"num"); if(p) {printf("tttt查找结果n"); printstart(); //打印横线 printc(); //打印各学科标题 printe(p); //打印p结点各个数据成员的值 printstart(); //打印横线 }else Nofind(); } //if(sel==1) else if(sel==2) / 职称 / {printf("请你输入要查找的职称:"); scanf("%s",findmess); p=Locate(l,findmess,"zc"); if(p) {printf("tttt查找结果n"); printstart(); printc(); printe(p); printstart(); }else Nofind(); }else Wrong(); } //void Qur查询结束 void Modify(Link l) //修改功能 {Node p; char findmess[20]; if(!l->next) {printf("n=====>提示:没有资料可以修改!n"); return; }printf("请你输入要修改的职工工号:"); scanf("%s",findmess); p=Locate(l,findmess,"num"); if(p) {printf("请你输入新工号(原来是%s):",p->data.num); scanf("%s",p->data.num); printf("请你输入新姓名(原来是%s):",p->data.name); scanf("%s",p->data.name); getchar(); printf("请你输入新性别(原来是%s):",p->data.); scanf("%s",p->data.); getchar(); printf("请你输入新的部门(原来是%s):",p->data.bm); scanf("%d",&p->data.bm); printf("请你输入新的职称(原来是%s):",p->data.zc); scanf("%d",&p->data.zc); getchar(); printf("请你输入新的工资(原来是%d):",p->data.gz); scanf("%d",&p->data.gz); printf("n=====>提示:资料修改成功!n"); //shoudse=1; }else Nofind(); //if(p)结束 } //void Modify(Link l) //修改功能结束 //插入记录:按工号查询到要插入的的位置,然后在该工号之后插入一个新。 void Insert(Link l) {Node s,r,p; /p指向插入位置,p指新插入记录/ char ch,new_num[10],old_num[10]; //old_num[]保存插入点位置之前的工号,new_num[]保存输入的新记录的工号 int flag=0; s=l->next; ("cls"); Disp(l); while(1) {//stringinput(s,10,"please input insert location after the Number:"); printf("请你输入已存在的工号(以'0'返回上一级菜单:)"); scanf("%s",old_num); if(strcmp(old_num,"0")==0) //输入'0',跳出while(1),即跳出Insert()函数 return; s=l->next; //作用? 每次从个开始找 flag=0; while(s) /查询该工号是否存在,flag=1表示该工号存在/ {if(strcmp(s->data.num,old_num)==0) {flag=1; break; }s=s->next; }if(flag==1) break; /若工号存在,则进行插入之前的新记录的输入作/ else {getchar(); printf("n=====>The number %s is not existing,try again?(y/n):",old_num); scanf("%c",&ch); if(ch=='y'||ch=='Y') {continue;} else {return;} //回主菜单 }}//while(1) /以下新记录的插入新,工号不能跟已存在的工号相同,作与Add()相同/ printf("请你输入待插入的工号(以'0'返回上一级菜单:)"); scanf("%s",new_num); if(strcmp(new_num,"0")==0) //输入'0',跳出while(1),即跳出add()函数 return; s=l->next; //作用? 每次从个开始找,看num是否重复。 while(s) //工号重复时,返回主菜单 {if(strcmp(s->data.num,new_num)==0) {printf("=====>提示:工号为'%s'的职工已经存在'!n",new_num); flag=1; return ; }s=s->next; } //while(s) p=(Node )malloc(sizeof(Node)); if(!p) {printf("n allocate memory failure "); /如没有申请到,打印提示信息/ return ; /返回主界面/ }strcpy(p->data.num,new_num); printf("请你输入姓名:"); scanf("%s",p->data.name); getchar(); printf("请你输入性别:"); scanf("%s",p->data.); getchar(); printf("请你输入部门:"); scanf("%d",&p->data.bm); getchar(); printf("请你输入职称:"); scanf("%d",&p->data.zc); getchar(); printf("请你输入工资:"); scanf("%d",&p->data.gz); getchar(); // 信息输入已经完成 p->next=NULL; /表明这是链表的尾部结点/ seflag=1; /在main()有对该全局变量的判断,若为1,则进行存盘作/ /将指针赋值给r,因为l中的头的下一个才实际保存着学生的记录/ r=l->next; while(1) {if(strcmp(r->data.num,old_num)==0) /在链表中插入一个/ {p->next=r->next; r->next=p; break; }r=r->next; }// while(1) , r作为查询指针,依次从个找起,找到后 跳出 while(1)循环 Disp(l); printf("nn"); // getchar(); }void Tongji(Link l) //统计 {Node max,min;/用于指向工资的/ Node t=l->next; if(!t) {("cls"); printf("n=====>Not employee record!n"); getchar(); return; }("cls"); Disp(l); max=min=t; while(t) {if(t->data.gz>=max->data.gz) max=t; if(t->data.gz<=min->data.gz) min=t; t=t->next; printf("工资为:%dn",max); printf("t%st%st%st%st%st%dnn",t->data.num,t->data.name,t->data.,t->data.bm,t->data.zc,t->data.gz); printf("工资为:%dn",min); printf("t%st%st%st%st%st%dnn",t->data.num,t->data.name,t->data.,t->data.bm,t->data.zc,t->data.gz); }} void Sort(Link l) //排序 {Link ll; Node p,rr,s; int i=0; if(l->next==NULL) { ("cls"); printf("n=====>Not employee record!n"); getchar(); return ; }ll=(Node)malloc(sizeof(Node)); /用于创建新的/ if(!ll) {printf("n allocate memory failure "); /如没有申请到,打印提示信息/ return ; /返回主界面/ }ll->next=NULL; ("cls"); Disp(l); /显示排序前的所有职工记录/ p=l->next; while(p) /p!=NULL/ {s=(Node)malloc(sizeof(Node)); /新建用于保存从原链表中取出的信息/ if(!s) /s==NULL/ {printf("n allocate memory failure "); /如没有申请到,打印提示信息/ return ; /返回主界面/ }s->data=p->data; /填数据域/ s->next=NULL; /指针域为空/ rr=ll; /rr链表于存储插入单个后保持排序的链表,ll是这个链表的头指针,每次从头开始查找插入位置/ while(rr->next!=NULL && rr->next->data.gz>=p->data.gz) {rr=rr->next;} /指针移至总分比p所指的的总分小的位置/ if(rr->next==NULL)/若新链表ll中的所有的总分值都比p->data.gz大时,就将p所指加入链表尾部/ rr->next=s; else /否则将该插入至个总分字段比它小的的前面/ {s->next=rr->next; rr->next=s; }p=p->next; /原链表中的指针下移一个/ }l->next=ll->next; /ll中存储是的已排序的链表的头指针/ Disp(l); seflag=1; printf("n =====>sort complete!n"); }void Se(Link l) {FILE fp; Node p; //实现保存作的临时的结构体指针变量 int flag=1,count=0; fp=fopen("employee.txt","wb"); if(fp==NULL) {printf("n=====>提示:重新打开文件时发生错误!n"); return; }p=l->next; //p指向个记录结点 while(p) {if(fwrite(p,sizeof(Node),1,fp)==1) //将个记录结点值写入文件 {p=p->next; //依次写入第二个结点的值, count++; //文件的记录数+1 }else {flag=0; break; }} //while(p) if(count>0) {printf("n=====>提示:文件保存成功.(有%d条记录已经保存.)n",count); seflag=0; }else {("cls"); printf("保存文件失败,'0'条记录被保存!n"); }fclose(fp); } // void Se结束 void main() {Link list; /定义链表/ // struct node list; FILE fp; / 文件指针 / int choose; /保存选择结果变量/ char ch; /保存(y,Y,n,N)/ int count=0; /保存文件中的记录条数(或结点个数)/ struct node p,r; /定义记录指针变量/ printf("tttt职工信息管理系统nttttn"); list=(struct node)malloc(sizeof(struct node)); if(!list) {printf("n allocate memory failure "); /如没有申请到,打印提示信息/ return ; /返回主界面/ }list->next=NULL; r=list; fp=fopen("employee.txt","rb"); if(fp==NULL) {printf("n=====>提示:文件还不存在,是否创建?(y/n)n"); scanf("%c",&ch); if(ch=='y'||ch=='Y') fp=fopen("employee .txt","ab+"); else exit(0); } // if(fp==NULL) printf("n=====>提示:文件已经打开,正在导入记录......n"); while(!feof(fp)) //没有到文件尾时,循环 {p=(struct node)malloc(sizeof(struct node)); if(!p) {printf(" memory malloc failure!n"); /没有申请成功/ exit(0); /退出/ }if(fread(p,sizeof(struct node),1,fp)) / 读文件的已有内容放入结点中 / {p->next=NULL; r->next=p; r=p; / 将该结点挂入链表中, r指向的 / count++; }} //while(!feof(fp)) fclose(fp); / 关闭文件 / printf("n=====>提示:记录导入完毕,共导入%d条记录.n",count); while(1) {menu(); printf("tt====>请选择:"); scanf("%d",&choose); if(choose==0) {if(seflag==1) {getchar(); printf("n=====>提示:资料已经改动,是否将改动保存到文件中(y/n)?n"); scanf("%c",&ch); if(ch=='y'||ch=='Y') Se(list); } //if printf("n=====>提示:你已经退出系统,再见!n"); break; }//if switch(choose) {case 1:Add(list); break; / 增加职工记录 / case 2: Del(list); break;/ 删除职工记录 / case 3: Qur(list); break;/ 查询职工记录 / case 4: Modify(list); break;/ 修改职工记录 / case 5: Insert(list); break;/插入职工记录/ case 6: Tongji(list); break;/统计职工记录/ case 7: Sort(list); break;/排序职工记录/ case 8: Se(list); break;/ 保存职工记录 / case 9: ("cls"); Disp(list); break; /显示职工记录/ default: Wrong(); getchar(); break; } //switch(choose) }//while(1) } //main() 我认为中心应该是: (在市场经济的大环境下,越来越多的人士逐渐认识到用计算机技术进行各类管理,交流的便捷,其中最突出的要算企事业单位的人事工资管理了,为了提高人事工资管理效率,减轻劳动强度,提高信息处理速度和准确性,在对其组成结构和系统功能进行了全面地分析,提出了人事工资管理系统的实现和解决方案,该方案利用计算机支持高效率地完事工资管理的日常事务,是适应现代企事业单位制度要求、推动企事业单位人事工资管理走向科学化、规范化的必要条件。) 设计的思路: 应该以Visual Basic6.0为开发语言和ACCESS2000为数据库以及其他第三方控件等软件作为设计工具,以工资为对象,开发的一个能够满足企事业单位的工资管理的要求的“人事工资管理系统”。 要求本系统具有完成单位人员工资管理的全过程,包括用户管理,员工管理,维护不同职务,职称,其他工资的工资标准以及浏览与结算和查询等。 :工资管理系统; VB; ACCESS class Fuck() {private: string shop; int num; string name; float base_salary; float t_salary; float bonus; float deal_salary; float fund; float tax; float fact_salary; void fact_salary(float mbase,float mt,float mbonus,float mdeal,float mfund,float mtax); public: void input(string mname,string mshop,int mnum,string mname,float mbase,float mt,float mbonus,float mdeal,float mfund,float mtax); void renew(float mbase,float mt,float mbonus,float mdeal,float mfund,float mtax); void sort(Fuck & sth); void show(); } 可以借助百度Hi示意我们 有机会可以解决你的问题 不多的要求也可以示意我们 ES:4585565364520EFB271548EFDCF4815A 比较麻烦 /add.c:添加员工工资信息记录/ #include "stdio.h" void AddRecord() {FILE fp = NULL; /定义指向文件的指针/ yuangong TmpS; /定义进行作时的临时结构体变量/ char DataFile[40] = ""; /存储员工工资信息的文件名/ int count = 1; /计算可输入数据的范围/ /====输入要添加员工工资信息的文件名====/ printf("n please input the file name which you will add recored to."); printf("n Not:Name of file can't exceed 8 characters.suffix can't exceed 3 characters,part of exceed will be discarded.n"); gets(DataFile); /如用户没有输入,则循环提示用户输入/ while(DataFile == ('0')) {printf("n please input new file name to store data,end with enter."); printf("n Not:Name of file can't exceed 8 characters,suffix can't exceed 3 characters.part of exceed will be discarded.n"); gets(DataFile); }fp = fopen(DataFile,"a+");/a+:当文件存在时,追加,当文件不存在时,创建/ /如果当前文件不存在,提示打开文件失败/ if (fp == NULL) {printf("n Open file %s fail!End with any key.n",DataFile); perror("Open file fail"); getch(); exit(1); }/如果成功打开或创建文件,则提示输入员工序号、姓名、工资构成等相关信息/ printf("input number,name and salary.number is 0 means input is end.n"); printf("Number is not exceed 9 figures,Name is not exceed 20 characters,range of grade:0.00~1000.00n"); /循环从键盘上读取用户输入的序号、姓名、工资构成等相关信息/ while(count <= SIZE) {/输入序号,如为0则停止输入/ printf("n input 'number =0' means end input.n"); printf("number="); scanf("%ld",&TmpS.Number); if (TmpS.Number == 0 ) break; /提示输入员工姓名/ printf("name="); scanf("%s",TmpS.Name); /提示输入员工工资/ printf("gongzi="); scanf("%f",&TmpS.gongzi); /提示输入员工奖金/ printf("jiangjin="); scanf("%f",&TmpS.jiangjin); /提示输入员工保险/ printf("baoxian="); scanf("%f",&TmpS.baoxian); /提示输入员工税金/ printf("shuijin="); scanf("%f",&TmpS.shuijin); /用公式自动计算员工实发工资即合计/ TmpS.heji=TmpS.gongzi+TmpS.jiangjin-TmpS.baoxian-TmpS.shuijin; printf("n"); /如遇无法写入文件的异常,则加以提示/ if(fwrite(&TmpS,sizeof(yuangong),1,fp)!=1) {printf("nwrite file %s fail!End with any keyn",DataFile); perror("Write file fail "); getch(); exit(1); }count++; }/如果输入的数据量超过允许的范围,则提示数据不能录入/ if (count>SIZE) printf("nsorry,number of data can not exceed%dn",SIZE); fclose(fp); /====在屏幕上显示文件内容====/ / clrscr();/ printf("The data you input is store successful %s in file.n",DataFile); printf("Content as follow:n"); fp=fopen(DataFile,"rb"); if (fp == NULL) {printf("nOpen file%sfail!End with any key n",DataFile); perror("Open file fail"); getch(); exit(1); }printf("nNumberttNametgongzitjiangjintbaoxiantshuijinthejin"); while(fread(&TmpS,sizeof(yuangong),1,fp) != (int)NULL) {printf("n%ldt%st%5.2ft%5.2ft%5.2ft%5.2ft%5.2fn",TmpS.Number,TmpS.Name,TmpS.gongzi,TmpS.jiangjin,TmpS.baoxian,TmpS.shuijin,TmpS.heji); }fclose(fp); } 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 836084111@qq.com 举报,一经查实,本站将立刻删除。求一份C语言课程设计的 " 工资管理系统",注意看要求
用C语言课程设计—职工工资管理系统(分别用结构体数组和链表编写程序)