題??? 目: 職工工資管理
一.程序設(shè)計(jì)思路
1、設(shè)計(jì)思路
(1)根據(jù)題目要求,應(yīng)該把職工工資信息用結(jié)構(gòu)體形式輸入,在定義一個(gè)全局變量和文件指針進(jìn)行整個(gè)程序的運(yùn)行,然后把職工工資信息送到文件中,所以應(yīng)該提供一個(gè)結(jié)構(gòu)體和文件的輸入輸出等操作;
(2)在程序中需實(shí)現(xiàn)職工工資瀏覽、查詢(xún)、統(tǒng)計(jì)等功能的操作,所以需要建立相應(yīng)的功能模塊來(lái)實(shí)現(xiàn);
(3)另外還需要提供鍵盤(pán)式選擇菜單實(shí)現(xiàn)功能,在運(yùn)行時(shí)達(dá)到所要的目的。
2、總體設(shè)計(jì)
整個(gè)系統(tǒng)可以分為信息輸入、信息新增、信息瀏覽、信息排序和信息查詢(xún)五個(gè)主要模塊。
3、部分程序設(shè)計(jì)
(1)信息輸入
printf("請(qǐng)您輸入姓名:");
scanf("%s",p->data.name);
getchar();
printf("請(qǐng)您輸入性別(m/f):");
scanf("%s",p->data.sex);
getchar();
printf("請(qǐng)您輸入上旬完成(百分比):");
scanf("%f",&p->data.spercent);
getchar();
printf("請(qǐng)您輸入中旬完成(百分比):");
scanf("%f",&p->data.zpercent);
getchar();
printf("請(qǐng)您輸入下旬完成(百分比):");
scanf("%f",&p->data.xpercent);
getchar();
p->data.totle=p->data.spercent+p->data.zpercent+p->data.xpercent;
p->data.ave=p->data.totle / 3;
if(p->data.totle<100)
{p->data.jiangjin=(p->data.totle-100)*10;}
else p->data.jiangjin=(p->data.totle-100)*10;
//信息輸入已經(jīng)完成
(2)瀏覽模塊
調(diào)用排序模塊的排序功能,可以瀏覽排序后的所有職工信息。
(3)排序模塊
排序模塊提供菜單選擇,實(shí)現(xiàn)按照工資卡號(hào)升序、實(shí)發(fā)工資升序排序。排序方法可以選擇冒泡排序、插入排序、選擇排序等,本系統(tǒng)用的是冒泡排序。
(4)查詢(xún)模塊
實(shí)現(xiàn)按照編號(hào)和姓名的查詢(xún),采用基本的查找方法即可。
二.功能模塊圖
三.數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)
系統(tǒng)用將職工各項(xiàng)信息以結(jié)構(gòu)體類(lèi)型char dir來(lái)定義,它包括num,name[15]等不同類(lèi)型的數(shù)據(jù)項(xiàng),同時(shí)定義了結(jié)構(gòu)體數(shù)組,包括N個(gè)數(shù)組元素,對(duì)應(yīng)N個(gè)職工,每一個(gè)元素用來(lái)存放一個(gè)職工的數(shù)據(jù);每個(gè)職工的信息以結(jié)構(gòu)體方式從內(nèi)存和磁盤(pán)文件中進(jìn)行存儲(chǔ)和導(dǎo)出。以結(jié)構(gòu)體方式來(lái)整合職工的不同信息,將不同的數(shù)據(jù)組合成一個(gè)有機(jī)整體,非常方便程序的調(diào)用。
四.算法設(shè)計(jì)
1、主函數(shù)
主函數(shù)一般設(shè)計(jì)比較簡(jiǎn)單,只提供輸入、處理和輸出部分的函數(shù)調(diào)用。各功能模塊用菜單方式選擇。
[流程圖]
"
#include "stdlib.h"
#include "string.h"
int shoudsave=0;
char dir[15];
struct member
{
char num[5];//編號(hào)
char name[15];
char sex[1];
float spercent;
float zpercent;
float xpercent;
float jiangjin;
float totle;
float ave;
}; //一個(gè)結(jié)構(gòu)體
typedef struct node
{
struct member data;//指向結(jié)構(gòu)體的結(jié)構(gòu)體
struct node *next;
}Node,*Link;
void explain()
{printf("=============================關(guān)于此程序的操作說(shuō)明==============================n");
printf("===1>:員工每旬應(yīng)該完成量為33.3個(gè)百分點(diǎn),輸入只輸數(shù)字部分。n");
printf("===2>:員工每月應(yīng)該完成量完成量為100個(gè)百分點(diǎn)。n");
printf("===3>:員工獎(jiǎng)金按其超額總應(yīng)該完成量(即百分之百)的多少計(jì)算。n");
printf("===4>:獎(jiǎng)金=(總完成比-1)*1000。n");
printf("===5>:員工底金為1000元。n");
printf("===6>:邏輯刪除資料必須在已經(jīng)保存了先前記錄的基礎(chǔ)上方可進(jìn)行。n");
printf("===7>:進(jìn)行邏輯刪除資料后如果保存即變?yōu)槲锢韯h除。n");
printf("===8>:本程序在c++環(huán)境中完成,程序文件擴(kuò)展名為.c。n");
}
void menu() //菜單
{
printf("********************************************************************************");
printf("t1獲取說(shuō)明信息ttttt 2輸入員工資料n");
printf("t3刪除員工資料ttttt 4查詢(xún)員工資料n");
printf("t5修改員工資料ttttt 6顯示員工資料n");
printf("t7統(tǒng)計(jì)員工業(yè)績(jī)ttttt 8排序員工實(shí)發(fā)工資n");
printf("t9保存員工資料ttttt10邏輯刪除員工資料n");
printf("t0退出系統(tǒng)n");
printf("********************************************************************************n");
}? 2、各功能模塊設(shè)計(jì)
(1) 輸入模塊
struct member
{
char num[5];//編號(hào)
char name[15];
char sex[1];
float spercent;
float zpercent;
float xpercent;
float jiangjin;
float totle;
float ave;
}; //一個(gè)結(jié)構(gòu)體 [流程圖]
}(2) 瀏覽模塊
[需求分析]
該模塊的功能是顯示所有職工記錄工資信息.
/***************瀏覽(全部)模塊***************/
void browse()?? /*瀏覽模塊*/
{
void printf_one(int i);
void printf_face();
int load();
void menu();
int i,n;
n=load();?? /*加載記錄*/
printf_face();????? /*調(diào)用顯示數(shù)據(jù)結(jié)構(gòu)項(xiàng)目函數(shù)*/
for(i=0;i<n;i++)
{
if((i!=0)&&(i%10==0))?? /*目的是分屏顯示*/
{printf("nnpress any key to contiune...");
getch();
puts("nn");}
printf_one(i);??? /*調(diào)用顯示一個(gè)記錄的函數(shù)*/
printf("n");
}
printf("t there are %d record.n",n);
printf("n pass any key to back...");
getch();?? /*按任意鍵*/
menu();
}
⑷ 查找模塊
該模塊的功能是根據(jù)輸入的職工姓名和卡號(hào)查找對(duì)應(yīng)的記錄.
[程序]
/***************查找函數(shù)***************/
void search()??? /*查找模塊*/
{
int n,w1;
do
{
puts("ttt1.search by name");
puts("ttt2.search by num");
scanf("%d",&n);
if(n<1||n>2)??? /*對(duì)選擇數(shù)字作判斷*/
{
w1=1;
getchar();
}
else w1=0;
}
while(w1==1);
switch(n)
{
void search_1();
void search_2();
case 1:search_1();break;
case 2:search_2();break;
}
}
void? search_1()?? /*按姓名查找*/
{
int load();
void printf_face();
void menu();
void printf_one(int i);
int i,n,k,w1=1,w2,w3,w4;
struct list s;
n=load();
do
{
do
{
k=-1;
printf("nnenter name that you want to search!??? name:");
scanf("%s",s.name);
printf_face();??? /*調(diào)用顯示數(shù)據(jù)結(jié)構(gòu)項(xiàng)目函數(shù)*/
for(i=0;i<n;i++)???? /*查找所需數(shù)據(jù)*/
if(strcmp(s.name,list[i].name)==0)
{
k=i;????? /*找到數(shù)據(jù)*/
printf_one(k);break;??? /*調(diào)用顯示一個(gè)記錄的函數(shù)*/
}
if(k==-1)
{
printf("nn NO.exit!please");
printf("nnare you again?nt1).again?? 2).NO and back? [ ]bb");
scanf("%d",&w1);
if(w1==2)break;
}
}
while(k==-1&&w1==1);???? /*如果w1不等于1這直接返回*/
w4=0;w3=0;
if(k!=-1)??? /*k不等于-1表示已找到,如果找到則選擇操作*/
{
printf("successful");
printf("nn what do you want to do?nt1).search another? 2).back? [ ]bb");
scanf("%d",&w2);
}
}
while(w2==1);
menu();
}
五、部分程序代碼(
每個(gè)函數(shù)都要有功能說(shuō)明)
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int shoudsave=0;
char dir[15];
struct member
{
char num[5];//編號(hào)
char name[15];
char sex[1];
float spercent;
float zpercent;
float xpercent;
float jiangjin;
float totle;
float ave;
}; //一個(gè)結(jié)構(gòu)體
typedef struct node
{
struct member data;//指向結(jié)構(gòu)體的結(jié)構(gòu)體
struct node *next;
}Node,*Link;
void explain()
{printf("=============================關(guān)于此程序的操作說(shuō)明==============================n");
printf("===1>:員工每旬應(yīng)該完成量為33.3個(gè)百分點(diǎn),輸入只輸數(shù)字部分。n");
printf("===2>:員工每月應(yīng)該完成量完成量為100個(gè)百分點(diǎn)。n");
printf("===3>:員工獎(jiǎng)金按其超額總應(yīng)該完成量(即百分之百)的多少計(jì)算。n");
printf("===4>:獎(jiǎng)金=(總完成比-1)*1000。n");
printf("===5>:員工底金為1000元。n");
printf("===6>:邏輯刪除資料必須在已經(jīng)保存了先前記錄的基礎(chǔ)上方可進(jìn)行。n");
printf("===7>:進(jìn)行邏輯刪除資料后如果保存即變?yōu)槲锢韯h除。n");
printf("===8>:本程序在c++環(huán)境中完成,程序文件擴(kuò)展名為.c。n");
}
void menu() //菜單
{
printf("********************************************************************************");
printf("t1獲取說(shuō)明信息ttttt 2輸入員工資料n");
printf("t3刪除員工資料ttttt 4查詢(xún)員工資料n");
printf("t5修改員工資料ttttt 6顯示員工資料n");
printf("t7統(tǒng)計(jì)員工業(yè)績(jī)ttttt 8排序員工實(shí)發(fā)工資n");
printf("t9保存員工資料ttttt10邏輯刪除員工資料n");
printf("t0退出系統(tǒng)n");
printf("********************************************************************************n");
}
void printc() // 本函數(shù)用于輸出中文
{
printf("編號(hào) 姓名??? 性別 總完成比 旬平均 基本工資 獎(jiǎng)金 工資總額 n");
}
void printe(Node *p)//本函數(shù)用于輸出英文
{
printf("%-5s%-10s%-4s%6.1f %6.1f? %6.1f %6.1f %6.1fn",p->data.num,p->data.name,p->data.sex,p->data.totle,p->data.ave,1000.0,p->data.jiangjin,1000+p->data.jiangjin);
}
void printstart()
{
printf("-----------------------------------------------------------------------n");
}
void Wrong() //如果錯(cuò)誤
{
printf("n=====>提示:輸入錯(cuò)誤!n");
}
void Nofind() //如果沒(méi)找到
{
printf("n=====>提示:沒(méi)有找到該員工!n");
}
Node* Locate(Link l,char findmess[],char nameornum[]) //該函數(shù)用于定位連表中符合要求的接點(diǎn),并返回該指針
{
Node *r;
if(strcmp(nameornum,"num")==0) //按編號(hào)查詢(xún)
{
r=l->next;
while(r!=NULL)
{
if(strcmp(r->data.num,findmess)==0)
return r;
r=r->next;
}
}
else if(strcmp(nameornum,"name")==0) //按姓名查詢(xún)
{
r=l->next;
while(r!=NULL)
{
if(strcmp(r->data.name,findmess)==0)
return r;
r=r->next;
}
}
return 0;
}
六.程序運(yùn)行結(jié)果
1、主函數(shù)運(yùn)行,顯示主菜單函數(shù)menu()
2、輸入數(shù)字2,添入兩組數(shù)據(jù)
3、如果再輸入數(shù)字2,新增一組數(shù)據(jù)并瀏覽
4、輸入數(shù)字6,瀏覽所有職工信息
5、輸入4,進(jìn)行查詢(xún)程序,再輸入2 ,按姓名查詢(xún),輸入1 ,按編號(hào)查詢(xún)
6、輸入數(shù)字5,按實(shí)發(fā)工資排序。