当前位置:文档之家› 工资信息管理系统

工资信息管理系统

工资信息管理系统C语言课程设计一、题目要求设计工资信息管理系统,要求该系统能够实现工资信息管理。

系统包括录入、浏览、查询、统计等功能。

其中录入功能要求能够添加新的工资信息到文件,浏览功能要求能按照工资卡号、姓名分类浏览,提供分屏显示;有排序功能,排序后按照工资卡号升序或实发工资降序输出;查询功能要求能够按照工资卡号、姓名查询;统计功能要求能够按照月份累计统计某职工在某时间段实发工资总金额。

二、需求分析根据题目要求,由于工资信息是存放在文件中,所以应提供文件的输入输出等操作;在程序中需要浏览工资信息,应提供显示、查找、排序等操作;另外还应提供键盘式选择彩旦实现功能选择。

三、总体设计四、详细设计1.主函数void main(){menu();/*主函数只用于调用菜单*/ };2.菜单#include"h.h"int menu(){int n,w1;do{system("cls");puts(" 工资信息管理系统\n\t\t Wage Information Management System \n \t\t\t\t BY 李汉 192101班");puts("*******************************MENU*************************** ********\n\n");puts(" 1.输入数据enter data *** *** ***");puts(" 2.添加数据addition data *** *** ***");puts(" 3.浏览全部browse all *** *** ***");puts(" 4.按姓名查找search by name *** ***********");puts(" 5.按卡号查找searchh by card number *** ***********");puts(" 6.按卡号排序order by card number *** *** ***");puts(" 7.统计Count ************* *** ***");puts(" 8.退出exit ************* *** ***");puts("***********************************************************************\ n");printf("请输入你的选择(1-6):\nChoice your number(1-6):[]\b\b");scanf("%d",&n);if(n<1||n>8){w1=1;getchar();}else w1=0;}while(w1==1);switch(n){case 1:enter();break;case 2:add();break;case 3:browse();break;case 4:search_by_name();break;case 5:search_by_card();break;case 6:order();break;case 7:count();break;case 8:exit(0);}return 1;}3.各功能模块设计1)录入模块数据结构struct employer{int month;charnum[11];char name[20];floatyfgz;floatsf;floatdf;floatsj;floatsfgz;}emp[N];N为职工人数,在此宏定义为100,#define N 100那么此阶段的流程图如下[程序]#include "h.h"int save(int n){FILE *fp;int i;if((fp=fopen("record.txt","wb"))==NULL){printf("\nCannot open file无法打开此文件\n"); return NULL;}for(i=0;i<n;i++)if(emp[i].salary!=0)if(fwrite(&emp[i],sizeof(struct employer),1,fp)!=1)printf("file write error文件写入有误\n");fclose(fp);return 1;}2)追加模块先确定要追加信息的条数,调用n=load()函数,再调用输入函数input(),最后保存追加的记录。

整个过的的流程图如下:[程序]#include"h.h"#include<stdio.h>void add(){ inti,n,m,k;FILE *fp;n=load();printf("How many employers are you want to add(0-%d)?:\n(你想添加多少位员工的信息?)",N-1-n);scanf("%d",&m);k=m+n;for (i=n;i<k;i++){ printf("\n Input %dth employer record.\n(请输入第%d名员工的信息)\n",i-n+1,i-n+1);record_input(i);}if((fp=fopen("record.txt","ab"))==NULL){ printf("cannot open file(打开文件失败!)\n");}for(i=n;i<k;i++)if(fwrite(&emp[i],sizeof(struct employer),1,fp)!=1)printf("file write error(文件写入错误!)\n");fclose(fp);printf_back();}3)查询模块下面是流程图:[程序]#include"h.h"voidsearch_by_name(){int i,n,k,w1=1,w2,w3,w4;struct employer e;n=load();do{do{k=1;printf("\n\nEnter the name that you want to search!请输入要查找的姓名!name:");scanf("%s",);printf_face();for(i=0;i<n;i++)if(strcmp(,emp[i].name)==0){k=i;printf_one(k);break;}if(k==-1){printf("\n\nNO exist! Please try again.不存在!请重试!");printf("\n\nAre you again?继续?\n\t1).again是的 2).NO and back 不,返回 []\b\b");scanf("%d",&w1);if(w1==2) break;}}while(k==-1&&w1==1);w4=0;w3=0;if(k!=-1){printf("\n\nWhat do you wanna do?接下来想做啥?\n\t1).Search another查找另一个 2).Back menu返回主菜单 []\b\b");scanf("%d",&w2);}if(w3==1||w4==1){save(n);printf("\n\nSuccessful.o(∩_∩)o ");printf("\n\nWhat do you wanna do?\n(接下来你想做啥米?)\n\t1).Search another(查找另一个) 2).Back(返回) []\b\b");scanf("%d",&w2);}}while(w2==1);menu();}voidsearch_by_card(){int i,n,k,w1=1,w2,w3,w4;struct employer e;n=load();do{do{k=1;printf("\n\nEnter the number that you want to search!请输入要查找的卡号!number:");scanf("%s",e.num);printf_face();for(i=0;i<n;i++)if(strcmp(e.num,emp[i].name)==0){k=i;printf_one(k);break;}if(k==-1){printf("\n\nNO exist! Please try again.不存在!请重试!");printf("\n\nAre you again?继续?\n\t1).again是的 2).NO and back 不,返回 []\b\b");scanf("%d",&w1);if(w1==2) break;}}while(k==-1&&w1==1);w4=0;w3=0;if(k!=-1){printf("\n\nWhat do you wanna do?接下来想做啥?\n\t1).Search another查找另一个 2).Back menu返回主菜单 []\b\b");scanf("%d",&w2);}if(w3==1||w4==1){save(n);printf("\n\nSuccessful.o(∩_∩)o ");printf("\n\nWhat do you wanna do?\n(接下来你想做啥米?)\n\t1).Search another(查找另一个) 2).Back(返回) []\b\b");scanf("%d",&w2);}}while(w2==1);menu();}4)浏览模块流程图[程序]#include"h.h"void browse(){ inti,n;n=load();printf_face();for(i=0;i<n;i++){if((i!=0)&&i%10==0){printf("\n\nPsaa any key to continue ...(按任意键继续)");getch(); puts("\n\n");}printf_one(i);}printf("\tThere are %d record.\n",n);printf("\nPass any key to back ...(按任意键返回)");getch();system("cls");menu();}5)排序模块此阶段按工人工资卡号升序排列程序如下:#include"h.h"void order(){inti,j,n;char t[11];n=load();for(i=0;i<n-1;i++){for(j=i+1;j<n;j++)if(strcmp(emp[i].num,emp[j].num)>0){strcpy( t,emp[i].num);strcpy( emp[i].num,emp[j].num);strcpy( emp[j].num,t);}}save(n);puts("\n\n");printf_back();}6)统计模块程序如下:#include"h.h"void count(){intm,n,i;float f;struct employer s;puts("请输入开始时间Please enter the former time:");scanf("%d",&m);puts("请输入结束时间Please enter the latter time:");scanf("%d",&n);puts("请输入要统计的员工的卡号Please enter the number that belongs to the one who you want to count:");scanf("%s",s.num);for(i=0;i<n;i++)if(strcmp(emp[i].num,s.num)==0&&m<emp[i].month&&emp[i].month<n)f+=emp[i].payment;}4.公共函数1)保存函数程序如下:#include "h.h"int save(int n){FILE *fp;int i;if((fp=fopen("record.txt","wb"))==NULL){printf("\nCannot open file无法打开此文件\n");return NULL;}for(i=0;i<n;i++)if(emp[i].salary!=0)if(fwrite(&emp[i],sizeof(struct employer),1,fp)!=1) printf("file write error文件写入有误\n");fclose(fp);return 1;}2)加载函数程序如下:#include"h.h"int load(){FILE *fp;int i;if((fp=fopen("record.txt","rb"))==NULL){printf("\nCannot open file\n(打开文件失败!)\n"); return NULL;}for(i=0;!feof(fp);i++)fread(&emp[i],sizeof(struct employer),1,fp);fclose(fp);return(i-1);}3)工资信息输入函数程序如下:record_input(int i){int j;printf("month:");scanf("%d",&emp[i].month);no_input(i,i);printf("name:");scanf("%s",&emp[i].name);printf("yfgz:");scanf("%f",&emp[i].yfgz);printf("sf:");scanf("%f",&emp[i].sf);printf("df:");scanf("%f",&emp[i].df);}4)输入工资卡号的函数程序如下:no_input(inti,int n){int j,k,w1;do{w1=0;printf("NO.:");scanf("%s",emp[i].num);for(j=0;emp[i].num[j]!='\0';j++)if(emp[i].num[j]<'0'||emp[i].num[j]>'9'){puts("Input error! Only be made up of (0-9).Please reinput!\n"); w1=1;break;}if(w1!=1)for(k=0;k<n;k++)if(k!=i&&strcmp(emp[k].num,emp[i].num)==0){puts("This record is exist.pleasereinput!\n");w1=1;break;}}while(w1==1);}5)计算税金的函数程序如下:sj(int i){if(emp[i].yfgz<800)emp[i].sj=0;if(emp[i].yfgz>800&&emp[i].yfgz<1400)emp[i].sj=(emp[i].yfgz-800)*0.05;if(emp[i].yfgz>1400)emp[i].sj=(emp[i].yfgz-1400)*0.1;}6)计算实发工资的函数程序如下:sfgz(int i){emp[i].sfgz=emp[i].yfgz-emp[i].sf-emp[i].df-emp[i].sj; }7)显示数据结构项目函数程序如下:voidprintf_face(){printf("\n\tNO. name month yfgzsfdfsjsfgz\n");}8)显示一个记录的函数程序如下:voidprintf_one(int i){printf("%s %s %d %f %f %f %f %f\n",emp[i].num,emp[i].name,emp[i ].month,emp[i].yfgz,emp[i].sf,emp[i].df,emp[i].sj,emp[i].sfgz);}9)一个任务结束时的选择浏览还是返回的函数程序如下:printf_back(){intk,w;printf("\n\n\tSuccessful.^_^\n\n");printf("What do you want to do?\n\n\t1)Browse all now\t2).Back: []\b\b");scanf("%d",&w);if(w==1) browse();else menu();}5上机操作1)主菜单2)录入模块输入1后提示输入记录的条数,输入3后界面如下再逐条输入信息后界面如下3)追加模块输入2后,回到主菜单,在输入2选在追加信息,提示输入追加信息条数,输入1后界面如下再将追加的信息录入后界面如下4)查询模块输入2后回到主菜单,输入4进入查询,输入职工名字ccc后可获得其工资信息,界面如下5)浏览模块输入2后回到主菜单,输入3浏览工资信息,界面如下6)排序模块点任意键返回主菜单后输入6,可按工人工资卡号升序将信息排列后显示出来,界面如下点任意键返回主菜单后输入6退出。

相关主题