1. 首页 > 经验 >

职工工资管理系统课程设计_职工工资管理系统课程设计代码

/*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 Notice: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 Notice: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.00\n");

/*循环从键盘上读取用户输入的序号、姓名、工资构成等相关信息*/

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 key\n",DataFile);

perror("Write file fail ");

getch();

exit(1);

}count++;

}/*如果输入的数据量超过最大允许的范围,则提示数据不能录入*/

if (count>SIZE)

printf("\nsorry,number of data can not exceed%d\n",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("\nNumber\t\tName\tgongzi\tjiangjin\tbaoxian\tshuijin\theji\n");

while(fread(&TmpS,sizeof(yuangong),1,fp) != (int)NULL)

{printf("\n%ld\t%s\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\n",TmpS.Number,TmpS.Name,TmpS.gongzi,TmpS.jiangjin,TmpS.baoxian,TmpS.shuijin,TmpS.heji);

}fclose(fp);

}

class Fuck()

{private:

string shop;

int num;

string name;

float base_salary;

float post_salary;

float bonus;

float deal_salary;

float fund;

float tax;

float fact_salary;

void fact_salary(float mbase,float mpost,float mbonus,float mdeal,float mfund,float mtax);

public:

void input(string mname,string mshop,int mnum,string mname,float mbase,float mpost,float mbonus,float mdeal,float mfund,float mtax);

void renew(float mbase,float mpost,float mbonus,float mdeal,float mfund,float mtax);

void sort(Fuck & sth);

void show();

}

#include

#include

#include

using namespace std;

const N=50; // 定义系统可录入的员工最大数值

string Ename[N];

long Enum[N];

char Esex[N];

int Eage[N];

char Emarriage[N];

int Edepart[N];

int Eposition[N];

int Edegree[50];

int Eworktime[N];

float Epay[N];

class Employee

{public:

string Employeename;

long Employeenum;

char Employeesex;

int Employeeage;

char Employeemarriage;

int Employeedepart;

int Employeeposition;

int Employeedegree;

int Employeeworktime;

float Employeepay;

static long EmployeeMaxNum;

static float EmployeeBasePay;

void NewInfo();

void ShowInfo();

void showall();

void showdepart(int depart);

void showdegree(int degree);

void showage(int min,int max);

void shownum(long number);

void RefreshInfo();

void DeleteInfo();

float Pay(int Employeegrade);

static int MaxNum();

};

class DBOperate

{public:

string Employeename;

long Employeenum;

char Employeesex;

int Employeeage;

char Employeemarriage;

int Employeedepart;

int Employeeposition;

int Employeedegree;

int Employeeworktime;

float Employeepay;

static long EmployeeMaxNum;

static float EmployeeBasePay;

void WriteIn(int iflag);

void ReadOut();

void RefreshMaxNum(int iflag); //i=1 or -1 or 0

};

long Employee::EmployeeMaxNum = 1000;

float Employee::EmployeeBasePay = 1500;

int Employee::MaxNum() //返回系统已经存储的人数

{int MN = 0;

ifstream myf;

myf.open("EmployeeMaxNum.txt");

myf>>MN;

cout<

myf.close();

return MN;

}void Employee::NewInfo() //添加新成员函数

{cout<<"新员工姓名: ";

cin>>Employee::Employeename;

Employee::Employeenum = EmployeeMaxNum + Employee::MaxNum()+1;

cout<<"新员工性别 (F为女性,M为男性): ";

cin>>Employee::Employeesex;

cout<<"新员工年龄: ";

cin>>Employee::Employeeage;

cout<<"新员工婚姻状况(Y为已婚,N为未婚): ";

cin>>Employee::Employeemarriage;

cout<<"新员工学历,请输入相应学历的序号: "<

cout<<" [1:初中 2:高中 3:本科 4:硕士 5:博士] ";

cin>>Employee::Employeedegree;

while(Employee::Employeedegree !=1&&Employee::Employeedegree !=2&&Employee::Employeedegree !=3&&Employee::Employeedegree !=4&&Employee::Employeedegree !=5)

{cout<<"输入有误,请重新输入:"<

cout<<" [1:初中 2:高中 3:本科 4:硕士 5:博士]";

cin>>Employee::Employeedegree;

}cout<<"新员工所在部门,请输入相应部门的序号:"<

cout<<" [1:董事会 2:市场部 3:公关部 4:客服中心 5:信息中心] ";

cin>>Employee::Employeedepart;

while(Employee::Employeedepart !=1&&Employee::Employeedepart !=2&&Employee::Employeedepart !=3&&Employee::Employeedepart !=4&&Employee::Employeedepart!=5)

{cout<<"输入有误,请重新输入:"<

cout<<" [1:董事会 2:市场部 3:公关部 4:客服中心 5:信息中心] ";

cin>>Employee::Employeedepart;

}cout<<"新员工职位, 请输入相应职位的序号: "<

cout<<" [1:临时职员 2: 正式职员 3:主任 4:部门经理 5:董事长] ";

cin>>Employee::Employeeposition;

while(Employee::Employeeposition !=1&&Employee::Employeeposition !=2&&Employee::Employeeposition !=3&&Employee::Employeeposition !=4&&Employee::Employeeposition !=5)

{cout<<"输入有误,请重新输入:"<

cout<<" [1:临时职员 2: 正式职员 3:主任 4:部门经理 5:董事长] ";

cin>>Employee::Employeeposition;

}cout<<"新员工的工作时(不需要输入单位): ";

cin>>Employee::Employeeworktime;

Employee::Employeepay = Employee::Pay(Employee::Employeeposition);

DBOperate dbo;

dbo.ReadOut();

int MaxNum = Employee::MaxNum();

Enum[MaxNum] = Employee::Employeenum;

Ename[MaxNum] = Employee::Employeename;

Esex[MaxNum] = Employee::Employeesex;

Eage[MaxNum] = Employee::Employeeage;

Emarriage[MaxNum] = Employee::Employeemarriage;

Edegree[MaxNum] = Employee::Employeedegree;

Edepart[MaxNum] = Employee::Employeedepart;

Eposition[MaxNum] = Employee::Employeeposition;

Eworktime[MaxNum] = Employee::Employeeworktime;

Epay[MaxNum] = Employee::Employeepay;

dbo.WriteIn(1);

cout<<" 添加新成员成功!"<

return;

}void Employee::ShowInfo() //程序主体 数据输出函数

{int choice1,choice2,min,max;

long searchnum;

Employee e;

cout<<" 请选择查询方式:"<

cout<<"******************************************"<

cout<<"* 输出全体职工信息--------------------- 1"<

cout<<"* 按职工部门输出----------------------- 2"<

cout<<"* 按职工学历输出----------------------- 3"<

cout<<"* 按职工年龄输出----------------------- 4"<

cout<<"* 按职工编号输出----------------------- 5"<

cout<<"******************************************"<

cin>>choice1;

switch(choice1)

{case 1: showall();break;

case 2: cout<<"请输入要查询职工的部门编号: [1:董事会 2:市场部 3:公关部 4:客服中心 5:信息中心] " ;

cin>>choice2;

e.showdepart(choice2);break;

case 3: cout<<"请输入要查询职工的学历编号: [1:初中 2:高中 3:本科 4:硕士 5:博士] ";

cin>>choice2;

e.showdegree(choice2);break;

case 4: cout<<"请输入要查询的年龄范围: ";

cout<<"最小值: ";

cin>>min;

cout<<"最大值: ";

cin>>max;

e.showage(min,max);break;

case 5: cout<<"请输入要查询的员工号: ";

cin>>searchnum;

e.shownum(searchnum);break;

default: cout<<"出错啦! "<

}}

void Employee::showall() //全体员工输出函数

{ int i;

long number;

for(i=0;i

{number = Enum[i];

shownum(number);

}}

void Employee::showdepart(int depart) //按员工所在部门输出函数

{int i;

switch(depart)

{case 1: cout<<"董事会的成员有: >"<

case 2: cout<<"市场部的成员有: >"<

case 3: cout<<"公关部的成员有: >"<

case 4: cout<<"客服中心成员有: >"<

case 5: cout<<"信息中心成员有: >"<

default: cout<<"输入错误!>"<

}for(i=0;i

{if(Edepart[i] == depart)

{long number = Enum[i];

shownum(number);

} else continue;

}}

void Employee::showdegree(int degree) //按员工学历输出函数

{int i;

switch(degree)

{case 1:cout<<"初中学历的员工有:"<

case 2:cout<<"高中学历的员工有:"<

case 3:cout<<"本科学历的员工有:"<

case 4:cout<<"硕士学位的员工有:"<

case 5:cout<<"博士学位的员工有:"<

}for(i=0;i

{if(Edegree[i] == degree)

{long number = Enum[i];

shownum(number);

} else continue;

}}

void Employee::showage(int min,int max) //按员工年龄段输出函数

{int i;

for(i=0;i

{if(Eage[i]>=min&&Eage[i]<=max)

{long number = Enum[i];

shownum(number);

}else continue;

}}

void Employee::shownum(long number) //按员工编号输出函数

{int i;

for(i=0;i

{if(Enum[i] == number)

{cout<<"**********************************"<

cout<<"员工编号 >"<

cout<<"姓 名 >"<

cout<<"性 别 >";

if(Esex[i]=='F') cout<<"女 "<

else if(Esex[i]=='M') cout<<"男 "<

cout<<"年 龄 >"<

cout<<"婚姻情况 >";

if(Emarriage[i]=='Y') cout<<"已婚 "<

else if(Emarriage[i]=='N') cout<<"未婚 "<

cout<<"学 历 >";

switch (Edegree[i])

{case 1:cout<<"初 中 "<

case 2:cout<<"高 中 "<

case 3:cout<<"本 科 "<

case 4:cout<<"硕 士 "<

case 5:cout<<"博 士 "<

}cout<<"所在部门 >";

switch (Edepart[i])

{case 1:cout<<"董事会 "<

case 2:cout<<"市场部 "<

case 3:cout<<"公关部 "<

case 4:cout<<"客服中心 "<

case 5:cout<<"信息中心 "<

}cout<<"所任职务 >";

switch (Eposition[i])

{case 1:cout<<"临时成员 "<

case 2:cout<<"正式员工 "<

case 3:cout<<"主任 "<

case 4:cout<<"部门经理 "<

case 5:cout<<"董事长 "<

}cout<<"工作时长 >"<

cout<<"额定工资 >"<

cout<<"**********************************"<

}else continue;

}}

void Employee::RefreshInfo() //修改员工信息的函数

{int cNum = 1000;

DBOperate dbo;

dbo.ReadOut();

void Employee::shownum(long number);

cout<<"请输入您要修改的员工编号: >";

cin>>cNum;

int MN;

MN = Employee::MaxNum();

for(int i=0;i

{if(Enum[i] == cNum)

{Employee::shownum(cNum);

cout<<"请输入该员工的新信息: "<

cout<<"新员工姓名: "; //录入员工的新的数据,员工号保持不变

cin>>Employee::Employeename;

Ename[i] = Employee::Employeename;

cout<<"新员工性别: [F为女性,M为男性]: ";

cin>>Employee::Employeesex;

Esex[i] = Employee::Employeesex;

cout<<"新员工年龄: ";

cin>>Employee::Employeeage;

Eage[i] = Employee::Employeeage;

cout<<"新员工婚姻状况(Y为已婚,N为未婚): ";

cin>>Employee::Employeemarriage;

Emarriage[i] = Employee::Employeemarriage;

cout<<"新员工学历,请输入相应学历的序号:"<

cout<<" [1:初中 2:高中 3:本科 4:硕士 5:博士] ";

cin>>Employee::Employeedegree;

while(Employee::Employeedegree !=1&&Employee::Employeedegree !=2&&Employee::Employeedegree !=3&&Employee::Employeedegree !=4&&Employee::Employeedegree !=5)

{cout<<"输入有误,请重新输入:"<

cout<<" [1:初中 2:高中 3:本科 4:硕士 5:博士] ";

cin>>Employee::Employeedegree;

}Edegree[i] = Employee::Employeedegree;

cout<<"新员工所在部门,请输入相应部门的序号: "<

cout<<" [1:董事会 2:市场部 3:公关部 4:客服中心 5:信息中心] ";

cin>>Employee::Employeedepart;

while(Employee::Employeedepart !=1&&Employee::Employeedepart !=2&&Employee::Employeedepart !=3&&Employee::Employeedepart !=4&&Employee::Employeedepart!=5)

{cout<<"输入有误,请重新输入:"<

cout<<" [1:董事会 2:市场部 3:公关部 4:客服中心 5:信息中心] ";

cin>>Employee::Employeedepart;

}Edepart[i] = Employee::Employeedepart;

cout<<"新员工职位,请输入相应职位的序号:"<

cout<<" [1:临时职员 2: 正式职员 3:主任 4:部门经理 5:董事长] ";

cin>>Employee::Employeeposition;

while(Employee::Employeeposition !=1&&Employee::Employeeposition !=2&&Employee::Employeeposition !=3&&Employee::Employeeposition !=4&&Employee::Employeeposition !=5)

{cout<<"输入有误,请重新输

职工工资管理系统课程设计题目:实现一个简单的工资管理系统。系统的主要功能是我有一个Windows下的,不知道你需要不需要 我倒可以凭借Baiduhi

不错 心黑哦“编写一个工资管理的程序” 你这个问题看上去像是在学 控制台的哦 数据库都没有用你还管理程序 顶多是个玩struct的

else

{P0=tab[yi];

P2=0;

del(2);

P0=tab[er];

P2=1;

del(2);

P0=tab[10];

P2=2;

del(2);

P0=tab[san];

P2=3;

del(2);

P0=tab[si];

P2=4;

del(2);

P0=tab[10];

P2=5;

del(2);

P0=tab[wu];

P2=6;

del(2);

//C语言课程设计 职工信息管理系统—单链表实现

#include "stdio.h"

#include "stdlib.h"

#include "string.h"

int saveflag=0; /*是否需要存盘的标志变量*/

struct employee

{char name[15];

char num[10];/* 工号 */

char sex[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 save(Link l); //将单链表l中的数据写入文件

void printe(Node *p); //本函数用于打印链表中某个节点的数据内容 */

//以下4个函数用于输出中文标题

void printstart();

void Wrong();

void Nofind();

void printc();

void menu()

{printf("\t*****************************************************************\n");

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("\t*****************************************************************\n");

} //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("\t\t\t\t显示结果\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%s\t%s\t%d\t%d\t%d\t %d\t %d\n",

p->data.num,p->data.name,p->data.sex,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.sex);

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;

saveflag=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");

saveflag=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");

saveflag=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("\t\t\t\t查找结果\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("\t\t\t\t查找结果\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.sex);

scanf("%s",p->data.sex);

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

//shoudsave=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;

system("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.sex);

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; /*表明这是链表的尾部结点*/

saveflag=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("\n\n");

// getchar();

}void Tongji(Link l) //统计

{Node *max,*min;/*用于指向工资最高的节点*/

Node *t=l->next;

if(!t)

{system("cls");

printf("\n=====>Not employee record!\n");

getchar();

return;

}system("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("最高工资为:%d\n",max);

printf("\t%s\t%s\t%s\t%s\t%s\t%d\n\n",t->data.num,t->data.name,t->data.sex,t->data.bm,t->data.zc,t->data.gz);

printf("最低工资为:%d\n",min);

printf("\t%s\t%s\t%s\t%s\t%s\t%d\n\n",t->data.num,t->data.name,t->data.sex,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)

{ system("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;

system("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);

saveflag=1;

printf("\n =====>sort complete!\n");

}void Save(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);

saveflag=0;

}else

{system("cls");

printf("保存文件失败,'0'条记录被保存!\n");

}fclose(fp);

} // void Save结束

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("\t\t\t\t职工信息管理系统\n\t\t\t\t\n");

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("\t\t====>请选择:");

scanf("%d",&choose);

if(choose==0)

{if(saveflag==1)

{getchar();

printf("\n=====>提示:资料已经改动,是否将改动保存到文件中(y/n)?\n");

scanf("%c",&ch);

if(ch=='y'||ch=='Y')

Save(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:

Save(list);

break;/* 保存职工记录 */

case 9:

system("cls");

Disp(list);

break; /*显示职工记录*/

default:

Wrong();

getchar();

break;

} //switch(choose)

}//while(1)

} //main()

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 12345678@qq.com 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息