/*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 举报,一经查实,本站将立刻删除。