C語言實現 員工工資管理系統【面向過程 文件讀寫】

C/C++實現員工工資管理系統【面向對象 文件讀寫】

課程學期作業,c/c++分別實現員工工資管理系統,c++包含面向對象操作以及文件讀寫,有詳細的word文檔描述,代碼、測試數據以及運行截圖。適合剛接觸過c/c++面向對象的大一大二學生。

博主大一時分別用c和c++以面向過程和麪向對象的方式實現了員工工資管理系統,二者的功能需求差不多,主要是實現方式不同,這裏是c語言介紹,文末附上了c語言實現的打包文件。

1.系統功能需求描述

在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述

2.系統功能概述:

主要功能包括員工基本資料數據的維護管理功能、工資數據的維護管理功能、查詢員工數據信息、排序和統計等功能。
其中,
基本數據資料的維護管理功能包含: 資料的添加、修改、刪除和查詢功能;
工資數據的維護管理包含: 輸入、修改、刪除、查詢和計算功能;
查詢數據功能包含: 分頁顯示全部員工信息;按部門顯示員工信息;按崗位分類顯示員工信息;按工號或姓名查詢員工信息。
排序功能包含: 所有員工信息按當月工資從高到低排序並顯示;某個崗位的員工信息按當月工資從高到低排序並顯示。
統計功能包含 :統計並顯示某個部門的平均工資、最低工資和最高工資;統計並顯示某個部門超出平均工資的人數與員工信息;統計並顯示所有員工中的最低工資和最高工資員工的信息;統計並顯示所有員工超出平均工資的人數與員工信息。

此外還有從文件中讀取員工信息、將信息保存到文件和隨時保存員工信息到文件中等功能。

3.系統功能模塊構成

在這裏插入圖片描述

4.頭文件函數定義

文件操作

#include <stdio.h>
#include<stdlib.h>
#include <malloc.h>

void read_from_file();		//從文件中讀取信息到鏈表
void save_to_file();		//從鏈表信息保存到文件中

員工操作

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

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.文件打包

待補

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章