C职工工资管理系统报告

更新时间:2024-05-20 08:10:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1.题目

《职工工资管理系统》的设计与实现

2.功能

(1)每一条记录包括一个职工的工号、姓名、基本工资、职务工资、津贴、医疗保险、公积金和总工资。

(2)输入功能:可以一次完成多条记录的输入。 (3)显示功能:完成全部职工记录的显示。

(4)查找功能:完成按工号和姓名查找职工记录,并显示。 (5)排序功能:按职工的工号进行排序。 (6)插入功能:可以插入多名职工信息记录。

(7)保存功能:将职工记录保存在任何自定义的文件中。

(8)读取功能:将保存在文件中的职工信息工资信息读取出来。 (9)有一个清晰美观界面来调用各个功能

3.要求

(1)整个系统均用C语言实现;

(2)利用指针、链表来实现学生成绩的数据结构设计;

(3)系统具有输入、显示、查询、删除、排序、插入,保存、读取基本功能; (4)系统的各个功能模块都用函数的形式来实现; (5)可以将职工工资信息保存在文件中。 (6)可以将职工工资信息从文件中读取出来。

4.设计内容

整个系统除了主函数外,另外还有14个函数,实现八大功能:输入功能、显示功能、查找功能、排序功能、插入功能、保存功能、读取功能。各个函数的详细设计说明分别如下:

4.1主函数 main()

利用无限次循环for( )和swithch()实现各函数的调用,系统根据输入的数字选项来调用相应的函数。

4.2菜单选择函数 void menu()

这是一个无参函数,主要实现“功能选择”的界面,在这个界面里有显示系统的主要功能,根据每个功能前面的序号进行选择。等执行完每一个函数功能后,按任一键回到主界面也要通过这个函数来实现!

void menu() //菜单界面 { system(\ printf(\菜单***\\n\\n\ printf(\ 0 排序 *****************\\n\\n\ printf(\ 1 输入 *****************\\n\\n\

}

printf(\ 2 显示 *****************\\n\\n\printf(\ 3 查找 *****************\\n\\n\printf(\ 4 删除 *****************\\n\\n\printf(\ 5 添加 *****************\\n\\n\printf(\ 6 修改 *****************\\n\\n\printf(\ 7 帮助 *****************\\n\\n\printf(\ 8 退出 *****************\\n\\n\

4.3输入记录函数 void input()

通过结构体的数组来进行操作,先头定义数组em[],先输入需要输入的职工人数m,然后进入循环,每次循环将各项输入结构体数组对应项的对应成员中,当循环次数等于人数时,完成全部职工的信息输入,退出循环,同时将数据存储在employee_list文件中并自动保存到磁盘中。

void input() /*录入函数*/ {

int i,m;

system(\

printf(\职工人数(1--100):\\n\ scanf(\ for (i=0;i

scanf(\ printf(\请输入职务工资: \ scanf(\ printf(\请输入津贴: \ scanf(\ printf(\请输入医疗保险: \ scanf(\ printf(\请输入公积金: \ scanf(\ em[i].total=((em[i].jbgz)+(em[i].zwgz)+(em[i].jt)-(em[i].yb)-(em[i].gjj));//计算总工资 printf(\计算总工资 }

printf(\创建完毕!\\n\

save(m);//保存职工人数m }

4.4保存数据到文件函数 void save(int m)

读取文件employee_list,若文件不存在,打印“打开失败”并退出。若存在,通过循环语句将输入到结构体数组的数据逐个输入磁盘。

void save(int m) /*保存文件函数*/ {

int i;

FILE*fp; //声明fp是指针,用来指向FILE类型的对象

if ((fp=fopen(\打开职工列表文件为空 { printf (\打开失败\\n\ exit(0); } for (i=0;i

if (fwrite(&em[i],sizeof(struct employee),1,fp)!=1)//写入数据块 &em[i]:是要输出数据的地址 sizeof(struct employee):获取一个单体的长度 1:数据项的个数 fp:目标文件指针

printf(\文件读写错误\\n\

fclose(fp);// 缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓冲区 }

4.5从文件读数据函数 int load()

打开文件employee_list,若文件不存在,打印“打开失败”并退出。若存在读取文件中的数据,并返回职工人数。

int load() /*导入函数 int型*/ { FILE*fp; int i=0;

if((fp=fopen(\ { printf (\ exit(0); } else { do { fread(&em[i],sizeof(struct employee),1,fp); //读取 i++; } while(feof(fp)==0); //检测流上的文件结束符 } fclose(fp);

return(i-1);//返回人数 }

4.6显示记录函数 void display()

先通过读取函数的返回值确定职工人数m,再通过循环将员工工资信息逐个打印,当循

环次数达到m时退出循环。 void display() /*浏览函数*/ {

int i,sum=0; int m=load(); system(\

printf(\职工号 姓名 基本工资 职务工资 津贴 医疗保险 公积金 总工资 \\n\

for(i=0;i

printf(\职工平均工资为:%d \\n\}

4.7查找记录函数 void search()

根据提示输入要查询的工号或者姓名,程序通过循环语句将输入的数字与保存的结构体数组中的数据对比,如果相同,则打印该职工的信息,当循环数等于人数时结束循环,若等循环结束也没有找到相同的,则输出“查无此人”。 void search()/*查询函数*/ { int t,button; system(\清屏 do { printf(\按1 按工号查询\\n按2 按姓名查询\\n按3 回主菜单\\n\ scanf(\ if(t>=1&&t<=3) { button=1; break; } else { button=0;

} { } }

printf(\输入错误\}

while(button==0);//回到查询选择项 while(button==1)

switch(t)//选择查询方式 { case 1:printf(\按工号查询\\n\ case 2:printf(\按姓名查询\\n\ case 3:main();break; default:break; }

按照工号查询:

void search_num()//按职工号查询 {

int a; int i,t;

int m=load();

printf(\请输入要查找的职工号:\\n\ scanf(\ for(i=0;i

printf(\职工号 姓名 基本工资 职务工资 津贴 医疗保险 公积金 总工资 \\n\

printf(\ %-6d%-6s %-8d %-8d %-8d %-8d %-8d %-8d \ break; }

if(i==m)

printf(\对不起,查无此人\\n\ printf(\

printf(\返回查询函数请按1,继续查询职工号请按2\\n\ scanf(\

switch(t) {

case 1:search();break; case 2: break; default:break; } }

按姓名查询: void search_name() {

char name[30]; int i,t;

int m=load();

printf(\请输入姓名:\\n\ scanf(\ for(i=0;i

if(strcmp(em[i].name,name)==0) {

printf(\已找到,其记录为:\\n\

printf(\职工号 姓名 基本工资 职务工资 津贴 医疗保险 公积金 总工资 \\n\

printf(\ %-6d%-6s %-8d %-8d %-8d %-8d %-8d %-8d \ }

if(i==m) printf(\ printf(\

printf(\返回查询菜单请按1,继续查询姓名请按2\\n\ scanf(\ switch(t) {

case 1:search();break; case 2:break; default :break; } }

4.8删除记录函数 void del()

先将职工信息打印出来,然后输入要删除职工的姓名,若该姓名不存在,则显示“查无此人”,如果存在则显示职工信息并且询问是否确认删除,若确定则删除。

void del() /*删除函数 */ {

int m=load(); int i,j,n,t,button; char name[20]; printf(\原来的职工信息:\\n\ display(); //显示删除前的员工信息 printf(\ printf(\按姓名删除:\\n\ scanf(\

for(button=1,i=0;button&&i

em[j].yb=em[j+1].yb; em[j].gjj=em[j+1].gjj; em[j].total=em[j+1].total; } button=0; } } }

if(!button)//button==0表明删除已完成 m=m-1;//总员工数减少一人 else printf(\查无此人!\\n\ printf(\删除后的所有职工信息:\\n\ save(m); //调用保存函数 display(); //调用浏览函数 printf(\继续删除请按1,不再删除请按0\\n\ scanf(\ switch(t) { case 1:del();break; case 0:break; default :break; } }

删除后为

4.9插入函数 void add()

打印原有职工信息,询问要添加到职工人数并询问是否确定添加。逐个逐项输入职工信息,之后计算总工资。完成后显示“添加成功”,打印新的职工信息并自动保存。 void add()/*添加函数*/ {

FILE*fp; int n; int count=0; int i; int m=load(); printf(\原来的职工信息:\\n\ display(); printf(\ fp=fopen(\ printf(\请输入想增加的职工数:\\n\确定要加入的职工数n scanf(\ for (i=m;i<(m+n);i++)//添加n名员工的信息 { printf(\请输入新增加职工的信息:\\n\ printf(\请输入职工号: \ scanf(\ printf(\ printf(\请输入姓名: \ scanf(\ getchar(); printf(\请输入基本工资: \ scanf(\ printf(\请输入职务工资: \ scanf(\ printf(\请输入津贴: \ scanf(\ printf(\请输入医疗保险: \ scanf(\ printf(\请输入公积金: \ scanf(\ em[i].total=( em[i].jbgz+ em[i].zwgz + em[i].jt- em[i].yb- em[i].gjj);//计算该员工

总工资 printf(\ count=count+1; printf(\已增加的人数:\\n\ printf(\ } printf(\添加成功\\n\ m=m+count;//将新添加员工的人数加到总员工人数中 printf(\增加后的所有职工信息:\\n\ printf(\ save(m); display();//显示添加后的信息 fclose(fp); }

运行后结果为

4.10排序函数 void sort()

根据职工的工号来进行排序,此处采用冒泡法。如果前一个职工的工号大于后面一个职工的工号,则两人位置交换,依次类推,经过多次交换后可得到工号从小到大的排序。 void sort() { int i,j; int m=load();

struct employee p; for(i=0;i=em[j+1].num) { p=em[j]; em[j]=em[j+1]; em[j+1]=p; }

printf(\职工号 姓名 基本工资 职务工资 津贴 医疗保险 公积金 总工资 \\n\

for(i=0;i

4.11修改数据函数 void modify()

打印职工信息并提示输入要修改信息的职工姓名。按照提示选择要修改的项目,输入要修改的结果并将该结果赋值给对应的成员,完成指定的修改。 void modify() /*修改函数*/ { int num; char name[20]; int jbgz; int zwgz; int jt; int yb; int gjj; int b,c,i,n,t,button; int m=load(); system(\ printf(\原来的职工信息:\\n\ display(); printf(\

printf(\请输入要修改的职工的姓名:\\n\ scanf(\

for(button=1,i=0;button&&i8||c<1) printf(\选择错误,请重新选择!\\n\ } button=0; } } if(button==1)

printf(\查无此人\\n\ do { switch(c) /*因为当找到第i个职工时,for语句后i自加了1,所以下面的应该把改后的信息赋值给第i-1个人*/ { case 1:printf(\职工号改为: \ scanf(\ em[i-1].num=num; break; case 2:printf(\姓名改为: \

scanf(\

strcpy(em[i-1].name,name); break; case 3:printf(\基本工资改为: \ getchar();

scanf(\ em[i-1].jbgz=jbgz; em[i-1].total=( em[i-1].jbgz+ em[i-1].zwgz + em[i-1].jt- em[i-1].yb- em[i-1].gjj); break; case 4:printf(\职务工资改为: \ scanf(\ em[i-1].zwgz=zwgz; em[i-1].total=( em[i-1].jbgz+ em[i-1].zwgz + em[i-1].jt- em[i-1].yb- em[i-1].gjj); break; case 5:printf(\津贴改为: \ scanf(\ em[i-1].jt=jt; em[i-1].total=( em[i-1].jbgz+ em[i-1].zwgz + em[i-1].jt- em[i-1].yb- em[i-1].gjj); break; case 6:printf(\医疗保险改为: \ scanf(\ em[i-1].yb=yb; em[i-1].total=( em[i-1].jbgz+ em[i-1].zwgz + em[i-1].jt- em[i-1].yb- em[i-1].gjj); break; case 7:printf(\公积金改为: \ scanf(\ em[i-1].gjj=gjj; em[i-1].total=( em[i-1].jbgz+ em[i-1].zwgz + em[i-1].jt- em[i-1].yb- em[i-1].gjj); break; case 8:modify(); break; } printf(\ printf(\确定修改 请按1 ; 重新修改 请按2: \\n\ scanf(\ }

while(b==2);

printf(\修改后的所有职工信息:\\n\ printf(\ save(m); display();

printf(\按1 继续修改 ,不再修改请按0\\n\

scanf(\ switch(t) { case 1:modify();break; case 0:break; default :break; } }

修改后为

程序部分

#include #include #include #include #define N 100

struct employee {

int num; //ID号 char name[20]; //姓名 int jbgz; //基本工资 int zwgz; //职务工资 int jt; // 津贴 int yb; //医疗保险 int gjj; //公积金/ int total; //总工资 }em[100]; void menu(); void input(); void save(int); void display(); void del(); void add(); void search();

void search_num(); void search_name(); void modify(); void help(); void sort();

void start(); /*定义各函数*/

void start() //开始界面 { system(\清屏 printf(\ printf(\***********\ printf(\欢迎使用工资管理系统

*****************************\ printf(\************\\n\\n\\n\\n\\n\ printf(\ ***按任意键进入***\\n\ }

void menu() //菜单界面 { system(\ printf(\菜单***\\n\\n\ printf(\*************************************\\n\\n\ printf(\*************************************\\n\\n\ printf(\*************************************\\n\\n\ printf(\*************************************\\n\\n\ printf(\*************************************\\n\\n\ printf(\*************************************\\n\\n\ printf(\*************************************\\n\\n\ printf(\*************************************\\n\\n\ printf(\*************************************\\n\\n\}

void input() /*录入函数*/ {

int i,m;

system(\

printf(\职工人数(1--100):\\n\ scanf(\

0 1 2 3 4 5 6 7 8 排序输入显示查找删除添加修改帮助退出 for (i=0;i

printf(\创建完毕!\\n\

save(m);//保存职工人数m }

void save(int m) /*保存文件函数*/ {

int i;

FILE*fp; //声明fp是指针,用来指向FILE类型的对象

if ((fp=fopen(\打开职工列表文件为空 { printf (\打开失败\\n\ exit(0); }

for (i=0;i

if (fwrite(&em[i],sizeof(struct employee),1,fp)!=1)//写入数据块 &em[i]:是要输出数据的地址 sizeof(struct employee):获取一个单体的长度 1:数据项的个数 fp:目标文件指针

printf(\文件读写错误\\n\

fclose(fp);// 缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓冲区 }

int load() /*导入函数 int型*/ { FILE*fp; int i=0;

if((fp=fopen(\ { printf (\ exit(0); } else { do { fread(&em[i],sizeof(struct employee),1,fp); //读取 i++; } while(feof(fp)==0); //检测流上的文件结束符 } fclose(fp);

return(i-1);//返回人数 }

void display() /*浏览函数*/ {

int i,sum=0; int m=load(); system(\

printf(\职工号 姓名 基本工资 职务工资 津贴 医疗保险 公积金 总工

资 \\n\

for(i=0;i

{printf(\ %-6d%-6s %-8d %-8d %-8d %-8d %-8d %-8d \ sum+=em[i].total;//计算员工总工资之和 }

printf(\职工平均工资为:%d \\n\}

void del() /*删除函数 */ {

int m=load(); int i,j,n,t,button; char name[20]; printf(\原来的职工信息:\\n\ display(); //显示删除前的员工信息 printf(\ printf(\按姓名删除:\\n\ scanf(\

for(button=1,i=0;button&&i

em[j].jt=em[j+1].jt; em[j].yb=em[j+1].yb; em[j].gjj=em[j+1].gjj; em[j].total=em[j+1].total; } button=0; } } }

if(!button)//button==0表明删除已完成 m=m-1;//总员工数减少一人 else printf(\查无此人!\\n\ printf(\删除后的所有职工信息:\\n\ save(m); //调用保存函数 display(); //调用浏览函数 printf(\继续删除请按1,不再删除请按0\\n\ scanf(\ switch(t) { case 1:del();break; case 0:break; default :break; } }

void add()/*添加函数*/ {

FILE*fp; int n; int count=0; int i; int m=load(); printf(\原来的职工信息:\\n\ display(); printf(\ fp=fopen(\ printf(\请输入想增加的职工数:\\n\确定要加入的职工数n scanf(\

for (i=m;i<(m+n);i++)//添加n名员工的信息 { printf(\请输入新增加职工的信息:\\n\ printf(\请输入职工号: \ scanf(\ printf(\ printf(\请输入姓名: \ scanf(\ getchar(); printf(\请输入基本工资: \ scanf(\ printf(\请输入职务工资: \ scanf(\ printf(\请输入津贴: \ scanf(\ printf(\请输入医疗保险: \ scanf(\ printf(\请输入公积金: \ scanf(\ em[i].total=( em[i].jbgz+ em[i].zwgz + em[i].jt- em[i].yb- em[i].gjj);//计算该员工总工资 printf(\ count=count+1; printf(\已增加的人数:\\n\ printf(\ } printf(\添加成功\\n\ m=m+count;//将新添加员工的人数加到总员工人数中 printf(\增加后的所有职工信息:\\n\ printf(\ save(m); display();//显示添加后的信息 fclose(fp); }

void search()/*查询函数*/ { int t,button; system(\清屏

do { printf(\按1 按工号查询\\n按2 按姓名查询\\n按3 回主菜单\\n\ scanf(\ if(t>=1&&t<=3) { button=1; break; } else { button=0; printf(\输入错误\ } } while(button==0);//回到查询选择项 while(button==1) { switch(t)//选择查询方式 { case 1:printf(\按工号查询\\n\ case 2:printf(\按姓名查询\\n\ case 3:main();break; default:break; } } }

void search_num()//按职工号查询 {

int a; int i,t;

int m=load();

printf(\请输入要查找的职工号:\\n\ scanf(\ for(i=0;i

printf(\职工号 姓名 基本工资 职务工资 津贴 医疗保险公积金 总工资

\\n\

printf(\ %-6d%-6s %-8d %-8d %-8d %-8d %-8d \ break; }

if(i==m)

printf(\对不起,查无此人\\n\ printf(\

printf(\返回查询函数请按1,继续查询职工号请按2\\n\ scanf(\ switch(t) {

case 1:search();break; case 2: break; default:break; } }

void search_name() {

char name[30]; int i,t;

int m=load();

printf(\请输入姓名:\\n\ scanf(\ for(i=0;i

if(strcmp(em[i].name,name)==0) {

printf(\已找到,其记录为:\\n\

printf(\职工号 姓名 基本工资 职务工资 津贴 医疗保险 公积金 资 \\n\

printf(\ %-6d%-6s %-8d %-8d %-8d %-8d %-8d \ }

if(i==m) printf(\ printf(\

printf(\返回查询菜单请按1,继续查询姓名请按2\\n\ scanf(\ switch(t) {

case 1:search();break;

%-8d 总工%-8d case 2:break; default :break; } }

void modify() /*修改函数*/ { int num; char name[20]; int jbgz; int zwgz; int jt; int yb; int gjj; int b,c,i,n,t,button; int m=load(); system(\ printf(\原来的职工信息:\\n\ display(); printf(\ printf(\请输入要修改的职工的姓名:\\n\ scanf(\

for(button=1,i=0;button&&i

if(c>8||c<1) printf(\选择错误,请重新选择!\\n\ } button=0; } } if(button==1)

printf(\查无此人\\n\ do { switch(c) /*因为当找到第i个职工时,for语句后i自加了1,所以下面的应该把改后的信息赋值给第i-1个人*/ { case 1:printf(\职工号改为: \ scanf(\ em[i-1].num=num; break; case 2:printf(\姓名改为: \

scanf(\

strcpy(em[i-1].name,name); break; case 3:printf(\基本工资改为: \ getchar();

scanf(\ em[i-1].jbgz=jbgz; em[i-1].total=( em[i-1].jbgz+ em[i-1].zwgz + em[i-1].jt- em[i-1].yb- em[i-1].gjj); break; case 4:printf(\职务工资改为: \ scanf(\ em[i-1].zwgz=zwgz; em[i-1].total=( em[i-1].jbgz+ em[i-1].zwgz + em[i-1].jt- em[i-1].yb- em[i-1].gjj); break; case 5:printf(\津贴改为: \ scanf(\ em[i-1].jt=jt; em[i-1].total=( em[i-1].jbgz+ em[i-1].zwgz + em[i-1].jt- em[i-1].yb- em[i-1].gjj); break; case 6:printf(\医疗保险改为: \ scanf(\

em[i-1].yb=yb; em[i-1].total=( em[i-1].jbgz+ em[i-1].zwgz + em[i-1].jt- em[i-1].yb- em[i-1].gjj); break; case 7:printf(\公积金改为: \ scanf(\ em[i-1].gjj=gjj; em[i-1].total=( em[i-1].jbgz+ em[i-1].zwgz + em[i-1].jt- em[i-1].yb- em[i-1].gjj); break; case 8:modify(); break; } printf(\ printf(\确定修改 请按1 ; 重新修改 请按2: \\n\ scanf(\ }

while(b==2);

printf(\修改后的所有职工信息:\\n\ printf(\ save(m); display();

printf(\按1 继续修改 ,不再修改请按0\\n\ scanf(\ switch(t) { case 1:modify();break; case 0:break; default :break; } }

void help()// {

system(\

printf(\说明:*如首次使用 尚未输入数据 请先输入数据 \\n 保存 \\n *再次选择输入功能时原数据将被覆盖\\n\\n\ getch(); menu();

*输入的数据将自动 }

void sort() { int i,j; int m=load(); struct employee p; for(i=0;i=em[j+1].num) { p=em[j]; em[j]=em[j+1]; em[j+1]=p; }

printf(\职工号 姓名 基本工资 职务工资 津贴 医疗保险 公积金 总工资 \\n\

for(i=0;i

int main()//主函数 { int n,button; char a; start(); getch(); menu();

do { printf(\功能选择(0--8):\\n\ scanf(\ if(n>=0&&n<=7) { button=1; break; } else

{ button=0; printf(\您输入有误,请重新选择!\ }

}while(button==0); while(button==1) { switch(n) { case 0:sort();break; case 1: input();break; case 2: display();break; case 3: search();break; case 4:del();break; case 5: add();break; case 6:modify();break; case 7:help();break; case 8:exit(0);break; default :break; } getchar(); printf(\

printf(\按任意键继续\\n\ getch();

system(\ /*清屏*/ menu(); /*调用菜单函数*/ printf(\功能选择(1--8):\\n\ scanf(\ printf(\

} return 0; }

本文来源:https://www.bwwdw.com/article/q8i7.html

Top