题 目: 职工工资管理
一.程序设计思路
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 { 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 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); w4=0;w3=0; if(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,按实发工资排序。
需要全部资料可在我的资源里下载,包括程序文档、源程序。



