题 目: 职工工资管理
一.程序设计思路
1、设计思路
(1)根据题目要求,应该把职工工资信息用结构体形式输入,在定义一个全局变量和文件指针进行整个程序的运行,然后把职工工资信息送到文件中,所以应该提供一个结构体和文件的输入输出等操作;
(2)在程序中需实现职工工资浏览、查询、统计等功能的操作,所以需要建立相应的功能模块来实现;
(3)另外还需要提供键盘式选择菜单实现功能,在运行时达到所要的目的。
2、总体设计
整个系统可以分为信息输入、信息新增、信息浏览、信息排序和信息查询五个主要模块。
3、部分程序设计
(1)信息输入
printf("请您输入姓名:");
scanf("%s",p->data.name);
getchar();
printf("请您输入性别(m/f):");
scanf("%s",p->data.sex);
getchar();
printf("请您输入上旬完成(百分比):");
scanf("%f",&p->data.spercent);
getchar();
printf("请您输入中旬完成(百分比):");
scanf("%f",&p->data.zpercent);
getchar();
printf("请您输入下旬完成(百分比):");
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;
//信息输入已经完成
(2)浏览模块
调用排序模块的排序功能,可以浏览排序后的所有职工信息。
(3)排序模块
排序模块提供菜单选择,实现按照工资卡号升序、实发工资升序排序。排序方法可以选择冒泡排序、插入排序、选择排序等,本系统用的是冒泡排序。
(4)查询模块
实现按照编号和姓名的查询,采用基本的查找方法即可。
二.功能模块图
三.数据结构设计
系统用将职工各项信息以结构体类型char dir来定义,它包括num,name[15]等不同类型的数据项,同时定义了结构体数组,包括N个数组元素,对应N个职工,每一个元素用来存放一个职工的数据;每个职工的信息以结构体方式从内存和磁盘文件中进行存储和导出。以结构体方式来整合职工的不同信息,将不同的数据组合成一个有机整体,非常方便程序的调用。
四.算法设计
1、主函数
主函数一般设计比较简单,只提供输入、处理和输出部分的函数调用。各功能模块用菜单方式选择。
[流程图]
"
#include "stdlib.h"
#include "string.h"
int shoudsave=0;
char dir[15];
struct member
{
char num[5];//编号
char name[15];
char sex[1];
float spercent;
float zpercent;
float xpercent;
float jiangjin;
float totle;
float ave;
}; //一个结构体
typedef struct node
{
struct member data;//指向结构体的结构体
struct node *next;
}Node,*Link;
void explain()
{printf("=============================关于此程序的操作说明==============================n");
printf("===1>:员工每旬应该完成量为33.3个百分点,输入只输数字部分。n");
printf("===2>:员工每月应该完成量完成量为100个百分点。n");
printf("===3>:员工奖金按其超额总应该完成量(即百分之百)的多少计算。n");
printf("===4>:奖金=(总完成比-1)*1000。n");
printf("===5>:员工底金为1000元。n");
printf("===6>:逻辑删除资料必须在已经保存了先前记录的基础上方可进行。n");
printf("===7>:进行逻辑删除资料后如果保存即变为物理删除。n");
printf("===8>:本程序在c++环境中完成,程序文件扩展名为.c。n");
}
void menu() //菜单
{
printf("********************************************************************************");
printf("t1获取说明信息ttttt 2输入员工资料n");
printf("t3删除员工资料ttttt 4查询员工资料n");
printf("t5修改员工资料ttttt 6显示员工资料n");
printf("t7统计员工业绩ttttt 8排序员工实发工资n");
printf("t9保存员工资料ttttt10逻辑删除员工资料n");
printf("t0退出系统n");
printf("********************************************************************************n");
} 2、各功能模块设计
(1) 输入模块
struct member
{
char num[5];//编号
char name[15];
char sex[1];
float spercent;
float zpercent;
float xpercent;
float jiangjin;
float totle;
float ave;
}; //一个结构体 [流程图]
}(2) 浏览模块
[需求分析]
该模块的功能是显示所有职工记录工资信息.
/***************浏览(全部)模块***************/
void browse() /*浏览模块*/
{
void printf_one(int i);
void printf_face();
int load();
void menu();
int i,n;
n=load(); /*加载记录*/
printf_face(); /*调用显示数据结构项目函数*/
for(i=0;i<n;i++)
{
if((i!=0)&&(i%10==0)) /*目的是分屏显示*/
{printf("nnpress any key to contiune...");
getch();
puts("nn");}
printf_one(i); /*调用显示一个记录的函数*/
printf("n");
}
printf("t there are %d record.n",n);
printf("n pass any key to back...");
getch(); /*按任意键*/
menu();
}
⑷ 查找模块
该模块的功能是根据输入的职工姓名和卡号查找对应的记录.
[程序]
/***************查找函数***************/
void search() /*查找模块*/
{
int n,w1;
do
{
puts("ttt1.search by name");
puts("ttt2.search by num");
scanf("%d",&n);
if(n<1||n>2) /*对选择数字作判断*/
{
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(); /*调用显示数据结构项目函数*/
for(i=0;i<n;i++) /*查找所需数据*/
if(strcmp(s.name,list[i].name)==0)
{
k=i; /*找到数据*/
printf_one(k);break; /*调用显示一个记录的函数*/
}
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();
}
五、部分程序代码(
每个函数都要有功能说明)
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int shoudsave=0;
char dir[15];
struct member
{
char num[5];//编号
char name[15];
char sex[1];
float spercent;
float zpercent;
float xpercent;
float jiangjin;
float totle;
float ave;
}; //一个结构体
typedef struct node
{
struct member data;//指向结构体的结构体
struct node *next;
}Node,*Link;
void explain()
{printf("=============================关于此程序的操作说明==============================n");
printf("===1>:员工每旬应该完成量为33.3个百分点,输入只输数字部分。n");
printf("===2>:员工每月应该完成量完成量为100个百分点。n");
printf("===3>:员工奖金按其超额总应该完成量(即百分之百)的多少计算。n");
printf("===4>:奖金=(总完成比-1)*1000。n");
printf("===5>:员工底金为1000元。n");
printf("===6>:逻辑删除资料必须在已经保存了先前记录的基础上方可进行。n");
printf("===7>:进行逻辑删除资料后如果保存即变为物理删除。n");
printf("===8>:本程序在c++环境中完成,程序文件扩展名为.c。n");
}
void menu() //菜单
{
printf("********************************************************************************");
printf("t1获取说明信息ttttt 2输入员工资料n");
printf("t3删除员工资料ttttt 4查询员工资料n");
printf("t5修改员工资料ttttt 6显示员工资料n");
printf("t7统计员工业绩ttttt 8排序员工实发工资n");
printf("t9保存员工资料ttttt10逻辑删除员工资料n");
printf("t0退出系统n");
printf("********************************************************************************n");
}
void printc() // 本函数用于输出中文
{
printf("编号 姓名 性别 总完成比 旬平均 基本工资 奖金 工资总额 n");
}
void printe(Node *p)//本函数用于输出英文
{
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() //如果错误
{
printf("n=====>提示:输入错误!n");
}
void Nofind() //如果没找到
{
printf("n=====>提示:没有找到该员工!n");
}
Node* Locate(Link l,char findmess[],char nameornum[]) //该函数用于定位连表中符合要求的接点,并返回该指针
{
Node *r;
if(strcmp(nameornum,"num")==0) //按编号查询
{
r=l->next;
while(r!=NULL)
{
if(strcmp(r->data.num,findmess)==0)
return r;
r=r->next;
}
}
else if(strcmp(nameornum,"name")==0) //按姓名查询
{
r=l->next;
while(r!=NULL)
{
if(strcmp(r->data.name,findmess)==0)
return r;
r=r->next;
}
}
return 0;
}
六.程序运行结果
1、主函数运行,显示主菜单函数menu()
2、输入数字2,添入两组数据
3、如果再输入数字2,新增一组数据并浏览
4、输入数字6,浏览所有职工信息
5、输入4,进行查询程序,再输入2 ,按姓名查询,输入1 ,按编号查询
6、输入数字5,按实发工资排序。