C语言实现 员工工资管理系统【面向过程 文件读写】

C/C++实现员工工资管理系统【面向对象 文件读写】

课程学期作业,c/c++分别实现员工工资管理系统,c++包含面向对象操作以及文件读写,有详细的word文档描述,代码、测试数据以及运行截图。适合刚接触过c/c++面向对象的大一大二学生。

博主大一时分别用c和c++以面向过程和面向对象的方式实现了员工工资管理系统,二者的功能需求差不多,主要是实现方式不同,这里是c语言介绍,文末附上了c语言实现的打包文件。

1.系统功能需求描述

C语言实现 员工工资管理系统【面向过程 文件读写】_第1张图片C语言实现 员工工资管理系统【面向过程 文件读写】_第2张图片C语言实现 员工工资管理系统【面向过程 文件读写】_第3张图片C语言实现 员工工资管理系统【面向过程 文件读写】_第4张图片C语言实现 员工工资管理系统【面向过程 文件读写】_第5张图片

2.系统功能概述:

主要功能包括员工基本资料数据的维护管理功能、工资数据的维护管理功能、查询员工数据信息、排序和统计等功能。
其中,
基本数据资料的维护管理功能包含: 资料的添加、修改、删除和查询功能;
工资数据的维护管理包含: 输入、修改、删除、查询和计算功能;
查询数据功能包含: 分页显示全部员工信息;按部门显示员工信息;按岗位分类显示员工信息;按工号或姓名查询员工信息。
排序功能包含: 所有员工信息按当月工资从高到低排序并显示;某个岗位的员工信息按当月工资从高到低排序并显示。
统计功能包含 :统计并显示某个部门的平均工资、最低工资和最高工资;统计并显示某个部门超出平均工资的人数与员工信息;统计并显示所有员工中的最低工资和最高工资员工的信息;统计并显示所有员工超出平均工资的人数与员工信息。

此外还有从文件中读取员工信息、将信息保存到文件和随时保存员工信息到文件中等功能。

3.系统功能模块构成

C语言实现 员工工资管理系统【面向过程 文件读写】_第6张图片

4.头文件函数定义

文件操作

#include 
#include
#include 

void read_from_file();		//从文件中读取信息到链表
void save_to_file();		//从链表信息保存到文件中

员工操作

#include 
#include 
#include 
#include 

typedef struct EmpLink
{
	int job_num;			//职工号
	char name[10];			//职工姓名
	char sex[3];			//职工性别
	char section[15];		//部门
	enum job_type job;		//岗位
	float work_hour;		//工作时间
	float per_salary;		//小时工资
	int work_age;			//工龄
	float sales_sum;		//销售额
	float base_salary;		//底薪
	float salary;			//当月工资
	struct EmpLink* next;	//指向下一个结构体
}Employee;

void data_manage();			//数据维护管理

void base_data();			//基本资料数据维护管理
void base_add();			//增加员工基本资料数据
void base_revise();			//修改员工基本资料数据
void base_delete();			//删除员工基本资料数据
void base_query();			//查询员工基本资料数据

void salary_data();			//工资数据维护管理
void salary_add();			//输入员工工资数据
void salary_revise();		//修改员工工资数据
void salary_delete();		//删除员工工资数据
void salary_query();		//查询员工工资数据
void calculate_salary();		//计算员工工资

void search_data();			//查询数据
int display_by_page();		//按照分页显示
void display_by_section();	//按照部门显示
void display_by_job_type();	//按照岗位显示
void display_by_num_or_name();	//按照工号或者姓名查询员工信息
Employee* locate_previous_page(Employee* p);	//定位到上一页的第一个员工
Employee* locate_last_page(int sum);	//定位到最后一页的第一个员工

void sort_show();			//排序并全部员工或某个岗位员工显示到屏幕
void sort_by_job_num();		//按照工号排序
void sort_by_salary();		//按照工资排序
void swap(Employee* p1,Employee* p2);	//交换两个员工的数据资料

void count_data();			//统计数据
void max_min_ave();			//统计并显示某个部门的最低最高和平均工资
void over_average();		//统计并显示某个部门超出平均工资的人数与员工信息
void all_max_min();			//统计并显示所有员工中的最低工资和最高工资员工的信息
void all_over_average();	//统计并显示所有员工超出平均工资的人数与员工信息
void display_emp(Employee* p);	//显示一个指定员工的信息

int is_base_legal(char* sex,char* job,int age,Employee* p);			//判断输入员工基本资料数据是否合法
int is_valid(Employee* p);	//判断员工的工资是否有效
void delete_list();	//释放链表

5.函数说明


1.read_from_file函数
 函数头:void read_from_file()
 参数列表:void
 返回值:void
 实现功能:从文件中读取员工信息到链表中。
 算法描述:第一步:调用fopen打开文件并定义文件指针fp使其指向所打开的文件。
第二步:申请结构体大小的内存并调用fread函数从文件读取结构体大小的数据到该内存。第三步:根据fread函数的返回值是否等于0判断是否读取到文件末尾。
第四步:若读取结束则调用fclose函数关闭文件。


2.save_to_file函数
 函数头:void read_from_file()
 参数列表:void
 返回值:void
 实现功能:将链表中的员工信息保存到文件中。
 算法描述:第一步:调用fopen打开文件并定义文件指针fp使其指向所打开的文件。
第二步:若链表头为空,直接退出函数。
第三步:否则链表头不为空,通过fwrite函数将链表信息以一个结构体的大小写入文件。
第四步,判断若fwrite函数返回值为0或链表遍历到末尾为空则写入文件结束。


3.data_manage函数
 函数头:void data_manage()
 参数列表:void
 返回值:void
 实现功能:二级菜单,对数据维护管理界面进行展示,并实现上下级菜单的跳转。
 算法描述:第一步:调用若干个printf函数打印二级菜单。
 第二步:通过while循环获取菜单选项,并判断输入是否合法。
第三步:判断输入的选项实现子菜单和上级菜单的跳转。


4.base_data函数
 函数头:void base_data ()
 参数列表:void
 返回值:void
 实现功能:三级菜单,对员工基本资料数据维护管理界面进行展示,并实现菜单下的的功能调用
 算法描述:第一步:调用若干个printf函数打印三级菜单。
第二步:通过while循环获取菜单选项,并判断输入是否合法。
第三步:判断输入的选项实现上级菜单的跳转和该菜单下的功能调用。


5.base_add函数
 函数头:void base_add ()
 参数列表:void
 返回值:void
 实现功能:添加员工基本资料数据
 算法描述:第一步:遍历链表找出链表的尾节点和工号的最大值,便于后续数据输入和尾插法实现。
第二步:分添加单个员工还是批量添加。
第三步:输入员工的基本资料数据,调用is_base_legal函数(下方有定义)判断输入数据的合法性,不合法重新输入。
第四步:申请一个结构体的内存,并将数据保存在里面,通过尾插法插入到链表中。


6.base_revise函数
 函数头:void base_revised ()
 参数列表:void
 返回值:void
 实现功能:修改员工基本资料数据
 算法描述:第一步:判断链表是否为空,若为空则直接退出函数。
第二步:若不为空则输入工号,遍历链表找到该工号的结构体内存,用指针指向它
第三步:输入修改的基本资料数据,调用is_base_legal函数(下方有定义)判断输入数据的合法性,不合法重新输入。
第四步:通过指针访问该员工结构体并修改基本资料数据。


7.base_delete函数
 函数头:void base_delete ()
 参数列表:void
 返回值:void
 实现功能:删除员工基本资料数据
 算法描述:第一步:判断链表是否为空,若为空则直接退出函数。
第二步:若不为空则输入工号,遍历链表找到该工号的结构体内存,用指针指向它
第三步:记住该结构体的前驱结点和后驱节点,使前驱节点的next指针指向后驱节点。
第四步:调用free函数释放原结构体的内存。


8.base_query函数
 函数头:void base_query ()
 参数列表:void
 返回值:void
 实现功能:查询员工基本资料数据
 算法描述:第一步:判断链表是否为空,若为空则直接退出函数。
第二步:若不为空则输入工号,遍历链表找到该工号的结构体内存,用指针指向它
第三步:通过指针访问该结构体并打印该员工基本资料数据。


9.salary_data函数
 函数头:void salary_data ()
 参数列表:void
 返回值:void
 实现功能:三级菜单,对员工工资数据维护管理界面进行展示,并实现菜单下的的功能调用
 算法描述:第一步:调用若干个printf函数打印三级菜单。
第二步:通过while循环获取菜单选项,并判断输入是否合法。
第三步:判断输入的选项实现上级菜单的跳转和该菜单下的功能调用。


10.salary_add函数
 函数头:void salary_add ()
 参数列表:void
 返回值:void
 实现功能:添加员工工资数据
 算法描述:第一步:若链表为空直接退出函数。
第二步:分添加单个员工还是批量添加。
第三步:输入员工的工号,遍历链表找到员工,用一个指针指向它。
第四步:输入员工的工资数据,判断输入数据的合法性,不合法重新输入。
第五步:调用calculate_salary(下方有定义)函数重新计算工资,因为若为销售员销售经理的工资会变化


11.salary_revise函数
 函数头:void salary_revised ()
 参数列表:void
 返回值:void
 实现功能:修改员工工资数据
 算法描述:第一步:判断链表是否为空,若为空则直接退出函数。
第二步:若不为空则输入工号,遍历链表找到该工号的结构体内存,用指针指向它
第三步:输入修改的工资数据,判断输入数据的合法性,不合法重新输入。
第四步:通过指针访问该员工结构体并修改工资数据。
第五步:调用calculate_salary(下方有定义)函数重新计算工资,因为若为销售员销售经理的工资会变化


12.salary_delete函数
 函数头:void salary_delete ()
 参数列表:void
 返回值:void
 实现功能:删除员工工资数据
 算法描述:第一步:判断链表是否为空,若为空则直接退出函数。
第二步:若不为空则输入工号,遍历链表找到该工号的结构体内存,用指针指向它
第三步:用指针访问该结构体内存把其中的工资数据置为-1。


13.salary_query函数
 函数头:void salary_query ()
 参数列表:void
 返回值:void
 实现功能:查询员工基本资料数据
 算法描述:第一步:判断链表是否为空,若为空则直接退出函数。
第二步:若不为空则输入工号,遍历链表找到该工号的结构体内存,用指针指向它
第三步:通过指针访问该结构体并打印该员工的工资数据。


13.calculate_salary函数
 函数头:void calculate_salary ()
 参数列表:void
 返回值:void
 实现功能:计算员工的工资
 算法描述:第一步:遍历链表每个结构体即员工。
第二步:根据员工的岗位分别计算对应的员工工资
第三步:若无销售经理则需再遍历链表累加部门其他销售员的销售额,再计算工资。


14.search_data函数
 函数头:void search_data ()
 参数列表:void
 返回值:void
 实现功能:二级级菜单,对员工信息查询菜单界面进行展示,并实现菜单下的功能调用
 算法描述:第一步:调用若干个printf函数打印二级菜单。
第二步:通过while循环获取菜单选项,并判断输入是否合法。
第三步:判断输入的选项实现上级菜单的跳转和该菜单下的功能调用。


15.display_by_page函数
 函数头:void display_by_page ()
 参数列表:void
 返回值:void
 实现功能:分页显示全部员工信息
 算法描述:第一步:若链表为空直接退出。
第二步:计算总员工个数,调用locate_last_page定位指向最后一页第一个员工的指针。
第三步:链表不为空则清屏并打印前十个工资数据不为-1的员工信息,并记录指向该页的首尾员工的指针。
第四步:记录指向该页面的第一个和最后一个员工的指针。
第五步:判断输入的选项实现首页、前一页、后一页、最后一页和退出的功能跳转
第六步:若为首页则清屏之后从头指针开始打印前十个工资不为-1的员工信息,并记录指向该页的首尾员工的指针(如果本来就位于首页则打印提示信息即可)。
第七步:若为前一页则调用locate_previous_page定位指向上一页的第一个员工的指针并清屏之后打印接来下十个工资不为-1的员工信息,并记录指向该页的首尾员工的指针(如果本来就位于第一页则打印提示信息即可)。
第八步:若为后一页则清屏之后从本页面的最后一名员工往后打印十个工资不为-1的员工或至链表结束,并记录指向该页的首尾员工的指针(如果已经位于最后一页则打印提示信息即可)。
第九步:若为后一页则根据函数locate_last_page得到的指向最后一页的第一个员工的指针,清屏并往后打印工资不为-1的员工信息至链表为空,并记录指向该页的首尾员工的指针(如果已经位于最后一页则打印提示信息即可)。
第十步:重复第五到第九步直至输入选项为退出,函数调用结束。


16.display_by_section函数
 函数头:void display_by_section ()
 参数列表:void
 返回值:void
 实现功能:按照指定部门显示员工信息
 算法描述:第一步:输入指定部门。
第二步:遍历链表输出相同部门的工资不为-1的员工信息。
第三步:若没有相同部门的员工则打印提示信息。


17.display_by_job_type函数
 函数头:void display_by_job_type ()
 参数列表:void
 返回值:void
 实现功能:按照指定岗位显示员工信息
 算法描述:第一步:输入选项指定部岗位,并判断输入的合法性,直至输入成功。
第二步:遍历链表输出相同岗位的工资不为-1的员工信息。
第三步:若没有相同岗位的员工则打印提示信息。


18.display_by_num_or_name函数
 函数头:void display_by_num_or_name ()
 参数列表:void
 返回值:void
 实现功能:按照工号或者姓名查询员工信息
 算法描述:第一步:输入选项指判断按工号还是姓名,并判断输入的合法性,直至输入成功。
第二步:遍历链表找到该工号或者姓名的员工,若链表为空或找不到该员工则打印提示信息并退出函数。
第三步:若存在该员工工资不为-1的则输出员工信息,否则打印提示工资不存在的提示信息。
第四步:退出函数


19.locate_previous_page函数
 函数头:Employee* locate_previous_page(Employee* p)
 参数列表:Employee* p 用于记录本页的一个员工
 返回值:Employee* 得到指向前一页第一个员工的指针
 实现功能:定位到前一页的第一个员工
 算法描述:第一步:遍历链表计算从表头至当前页第一个员工中,工资不为-1的员工人数number。
第二步:若得到的员工人数少于10,返回一个空指针。
第三步:若得到的员工人数大于等于10,则将人数number减9,
第四步:从头遍历链表,找到第number个工资不为-1的员工,返回指向该员工的指针。


20.locate_last_page函数
 函数头:Employee* locate_last_page (int sum)
 参数列表:int sum 用于记录链表中工资有效的员工人数
 返回值:Employee* 得到指向最后一页的第一个员工的指针
 实现功能:定位到最后一页的第一个员工
 算法描述:第一步:定义变量num,定义并初始化变量count为0。
第二步:数学计算得当num=sum-sum%10+1时链表中第num个工资不为-1的员工即为最后一页的第一个员工。
第三步:遍历链表,找到第num个工资不为-1的员工,并返回指向它的指针。


21.sort_show函数
 函数头:void sort_show ()
 参数列表:void
 返回值:void
 实现功能:二级级菜单,对员工信息排序菜单界面进行展示,并实现排序和输出功能
 算法描述:第一步:调用若干个printf函数打印二级菜单。
第二步:输入选项并判断输入数据的合法性直至输入成功
第三步:判断输入的选项实现上级菜单的跳转和该菜单下的功能调用。
第四步:若为所有员工信息按当月工资从高到低排序并显示,则先调用 sort_by_salary按工资排序再输出工资不为-1的员工。
第五步:若为所有按岗位工资从高到低排序并显示,则先调用 sort_by_salary按工资排序再按照岗位输出工资不为-1的员工。
第六步:排序和显示结束后调用sort_by_job_num函数将链表恢复为按照工号排序。


22.sort_by_job_num函数
 函数头:void sort_by_job_num ()
 参数列表:void
 返回值:void
 实现功能:将链表中的结构体按照工号升序
 算法描述:第一步:定义两个结构体指针。
第二步:利用交换法进行排序
第三步:调用swap函数(下方有定义)交换两个指针所指向结构体的内容


23.sort_by_salary函数
 函数头:void sort_by_salary ()
 参数列表:void
 返回值:void
 实现功能:将链表中的结构体按照工资降序
 算法描述:第一步:定义两个结构体指针。
第二步:利用交换法进行排序
第三步:调用swap函数(下方有定义)交换两个指针所指向结构体的内容


24.sort_by_salary函数
 函数头:void sort_by_salary ()
 参数列表:void
 返回值:void
 实现功能:将链表中的结构体按照工资降序
 算法描述:第一步:定义两个结构体指针。
第二步:利用交换法进行排序
第三步:调用swap函数(下方有定义)交换两个指针所指向结构体的内容


25.swap函数
 函数头:void swap(Employee* p1,Employee* p2)
 参数列表:Employee* p1,用于指向第一个结构体
Employee* p2,用于指向第二个结构体
 返回值:void
 实现功能:交换两个结构体指针所指向的数据
 算法描述:第一步:定义一个临时结构体来暂时存放一个p1指向的数据。
第二步:将p2指向的数据赋值给p1
第三步:将临时结构体的数据赋值给p1指向的结构体


26.count_data函数
 函数头:void count_data()
 参数列表:void
 返回值:void
 实现功能:二级级菜单,对员工信息统计菜单界面进行展示,并实现菜单下的功能调用
 算法描述:第一步:调用若干个printf函数打印二级菜单。
第二步:通过while循环获取菜单选项,并判断输入是否合法。
第三步:判断输入的选项实现上级菜单的跳转和该菜单下的功能调用。


27.max_min_ave函数
 函数头:void max_min_ave ()
 参数列表:void
 返回值:void
 实现功能:统计并显示某个部门的最低最高和平均工资
 算法描述:第一步:输入统计的部门,并遍历链表找到第一个工资有效的员工,标记是否存在员工。
第二步:从第一个有效工资的员工往后进行遍历,找出工资最高和最低的员工
第三步:判断标记,若部门存在员工则输出最高、最低工资员工。(不存在则给出提示)


28.over_average函数
 函数头:void over_average()
 参数列表:void
 返回值:void
 实现功能:统计并显示某个部门超出平均工资的人数与员工信息
 算法描述:第一步:输入统计的部门,并遍历链表求出员工总数和员工工资总数。
第二步:求出平均工资,根据平均工资遍历一遍链表输出每个高于平均工资的员工。
第三步:输出超出平均工资的员工人数。


29.all_max_min函数
 函数头:void all_max_min()
 参数列表:void
 返回值:void
 实现功能:统计并显示所有员工中的最低工资和最高工资员工的信息
 算法描述:第一步:找到第一个工资有效的员工。
第二步:假定第一个工资有效的员工工资为最高、最低
第三步:遍历链表,比较得出全体有效工资员工中的最高、最低工资的员工信息。
第四步:输出最高、最低工资的员工信息。


  1. all_over_average函数
     函数头:void all_over_average()
     参数列表:void
     返回值:void
     实现功能:统计并显示所有员工超出平均工资的人数与员工信息
     算法描述:第一步:遍历链表求出员工总数和员工工资总数,若链表为空直接退出函数。
    第二步:求出平均工资,根据平均工资遍历一遍链表输出每个高于平均工资的员工。
    第三步:输出超出平均工资的员工人数。

  1. display_emp函数
     函数头:void display_emp(Employee* p)
     参数列表:Employee* p,用于记录所要显示的员工
     返回值:void
     实现功能:显示一个指定员工的信息
     算法描述:第一步:遍历链表找到该员工。
    第二步:若工资无效时不输出。
    第三步:否则输出员工的信息。

  1. is_base_legal函数
     函数头:int is_base_legal(char* section,char* sex,char* job,int age,Employee* p)
     参数列表:char* section,用于暂时存放部门信息
    char* sex,用于暂时存放性别信息
    char* job,用于暂时存放岗位信息
    int age,用于暂时存放工龄
    Employee* p,用于记录判断正确后所要输入的员工结构体
     返回值:int,用于判断输入数据是否合法(返回1则合法,0则不合法)
     实现功能:判断输入员工基本资料数据是否合法(是否一个部门仅有一个销售经理),合法则保存数据
     算法描述:第一步:判断性别是否为男或女,不合法返回0。
    第二步:判断岗位是否合法,不合法返回0。
    第三步:判断若为销售经理,是否岗位中只有一个销售经理,不合法返回0。
    第四步:若以上判断都合法,则将基本资料数据保存到员工的结构体中,
    第五步:将结构体中的工资数据都设置为-1表示无效数据。
    第六步:返回1。

  1. delete_list函数
     函数头:void delete_list()
     参数列表:void
     返回值:void
     实现功能:释放链表
     算法描述:第一步:判断List链表是否为空。
    第二步:若不为空则free掉,同时将List往后移动一个结构体
    第三步:若为空,则退出函数
    第四步:重复第一、二、三步直到函数退出。

6.文件打包

链接
急的评论留下邮箱

你可能感兴趣的:(学期管理系统)