工资信息管理系统C语言设计_第1页
工资信息管理系统C语言设计_第2页
工资信息管理系统C语言设计_第3页
工资信息管理系统C语言设计_第4页
工资信息管理系统C语言设计_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C 语言课程实习报告学院:工程学院专业:岩土工程班级: 052052-33学号:20051002623姓名:刘恒第一题 :工资信息管理系统一 题目要求工资信息管理系统【要求】该系统能够实现工资信息管理 .系统包括录入 ,浏览 ,查询 ,统计等功能 .其中录入功能要求能够添加新地工资信息到文件;浏览功能要求能按照工资卡号 , 姓名分类浏览 ,提供分屏显示;有排序功能 ,排序后按照工资卡号升序或实发工资降序输出;查询功能要求能够按照工资卡号 ,姓名查询;统计功能要求能够按照月份累计统计某职工在某时间段实发工资总金额 .( 1)文件中一行数据对应一个职工工资信息;( 2)工资信息地数据结构采用结构体

2、数组 ,一个数组元素对应一条工资单记录;( 3)工资单信息包括工资卡号 ,姓名 ,月份 ,应发工资 ,水费 ,电费 ,税金 ,实发工资等;( 4)实发工资应发工资水费电费税金 ,其中税金计算方法为:应发工资 800 元 ,税金 =0; 800 元应发工资 1400 元, 税金(应发工资 800)*5 ;应发工资 1400 元, 税金(应发工资 1400) *10 二 需求分析根据题目要求 ,由于工资信息是以文本文件地方式存放在文件里地,所以应提供文件地输入 ,输出等操作;在程序中需要知道职工地工资信息 ,应提供录入 ,浏览 ,查询 ,排序 ,统计等操作功能;另外 ,还应提供键盘式选择菜单实现功

3、能选择 .三 总体设计通过分析整个系统,根据上面地需求分析,可以将这个系统地设计分为如下几个模块:工资信息管 理 系数据输入数据添加数据浏览数据查找工资排序工资统计图一系统功能模块图四 详细设计1. 主函数主函数一般设计得比较简洁 ,只提供输入 ,处理和输出部分地函数调用 .其中各功能模块用菜单方式选择 .【流程图】如下图所示:显示一系列功能选项输入 n,判断 n 是否是 0 7根据 n 的值调用各功能模块函数图二 .主函数流程图【程序】#include<stdio.h>#include<stdlib.h>#include<math.h>#include&l

4、t;alloc.h>#define N 150void enter() 。search()。 void add() 。 void browse() 。void stat() 。 void order() 。 void num_order() 。 void T_wage_order() 。void menu() 。 void stat() 。 void readfiles() 。 int allwage() 。void menu()int n,w 。 system("cls") 。doputs("tt*MENU*nn")。puts("ttt

5、t1.Enter new data") 。puts("tttt2.Addition data")。puts("tttt3.Browse all")。puts("tttt4.Search data") 。puts("tttt5.order data") 。puts("tttt6.Stat by month") 。puts("tttt7.Exit")。puts("nntt*n")。printf("Choice your number(1-7

6、): bb") 。 /* 对选择地数字进行判断 */ scanf("%d",&n) 。if(n<1|n>7)w=1 。 getchar()。 else w=0 。while(w=1)。switch(n)case 1:enter()。 break。/* 输入模块*/case 2:add()。 break。case 3:browse()。 break。/* 追加模块/* 浏览模块*/*/case 4:search()。break。/* 查找模块*/case 5:order()。break。/* 排序模块*/case 6:stat()。 break。

7、/* 统计模块*/case 7:exit(0) 。/* 退出 */void save() 。 int load() 。 void input() 。 void printf_face() 。void printf_one() 。void printf_back() 。 int T_wage() 。/*主函数 */main() menu() 。 2. 各功能模块设计输入模块【数据结构】【分析】看各数据信息 ,工资卡号、姓名是字符型 ,可以用字符型数组;工资应采用实型 .数据信息应放在文件中 .struct infowagechar num15 。char name20 。int month 。i

8、nt S_wage 。int water_rate 。int electric_charge 。int tax 。int T_wage 。IMN 。/*IMN中每个元组元素对应一个职工*/【注意】: N 为职工人数 ,应采用宏定义 define N 150.【流程图】:输入用户要输入职工记录的个数ni 从 0 到 n 1 调用输入函数input( i )i ! 0保存调用函数save( n)图三 .输入模块流程图程序 :void enter()/* 输入模块 */int i,n 。printf("How many informations(0-%d)?:",N-1)。sca

9、nf("%d",&n) 。/* 要输入地记录个数printf("n Enter data nownn")。for (i=0 。 i<n 。 i+)*/printf("n Input %dth info.n",i+1)。input(i) 。/*调用输入函数*/if(i!=0)save(n)。/*调用保存函数*/printf_back()。/* 一个任务结束时让用户选择是浏览还是返回*/追加模块 需求分析 :该模块地功能是添加新地工资信息,从键盘输入并逐条写到原来地输入文件中,注意采用追加不是覆盖地方式. 流程图:调用加载函

10、数n=load() 。并计算可以记录个数n输入用户要追加职工记录的个数mK=m+ni 从 n 到 k 调用输入函数input(i)保存追加的记录图四 .追加模块流程图程序 :void add()/* 追加模块 */int i,k,n,m 。FILE *fp 。n=load() 。printf("How many IMloyees are you want to add(0-%d)?:",N-1-n)。scanf("%d",&m) 。/* 输入要追加地记录个数k=n+m 。for(i=n 。 i<k 。 i+)printf("n I

11、nput %dth info.n",i-n+1)。*/input(i) 。/* 调用输入函数*/if(fp=fopen("infowage.txt","ab")=NULL) /* 以 ab 方式打开文件 ,追加保存 */ printf("Cannot open filen") 。for(i=0 。 i<n 。 i+)if(fwrite(&IMi,sizeof(struct infowage),1,fp)!=1)/*输出到文件 */printf("file write errorn")。fcl

12、ose(fp) 。printf_back()。/* 一个任务结束时让用户选择是浏览还是返回*/ .浏览模块 需求分析该模块地功能是显示所有职工记录信息.流程图 显示职工记录(5 个一屏 )按任意键显示下一屏按任意键返回主菜单图五 .浏览模块流程图程序 :void browse()/* 浏览模块 */int i,k,n 。n=load() 。/* 加载记录 */printf_face() 。/* 调用显示数据结构工程函数for(i=0 。 i<n 。 i+)if(i!=0)&&(i%5=0)/*目地是分屏显示*/*/printf("nnPass any key t

13、o continue .")。getch()。puts("nn")。printf_one(i)。/* 调用显示一个记录地函数*/printf("tThere are %d info.n",n)。printf("nPass any key to back .") 。getch()。/* 按任意键 */menu()。 .查找模块 需求分析: 该模块地功能是根据输入地职工姓名或者工资卡号查找对应地记录.流程图 查找模块卡号查找姓名查找图六:查找模块流程图程序 :search()/* 查找模块 */int k=0 。 int w1,

14、w2 。doprintf("nnWhich way do you choose?nt1.By name2.By num bb")scanf("%d",&w1) 。if(w1=1) name_search() 。/* 姓名查找 */else num_search()。/* 卡号查找 */if(k!=-1)printf("nnSuccessful._.")。printf("nnWhat do you want to do?nt1.Search another 2.Back bb")scanf("%d&

15、quot;,&w2) 。 。while(w2=1)。menu()。 name_search()/* 姓名查找 */int i,n,k,w=1 。struct infowage e 。n=load() 。dok=-1 。printf("nnEnter name that you want to search!Name:")scanf("%s",) 。/* 输入要找地名字*/printf_face() 。/* 调用显示数据结构工程函数for(i=0 。 i<n 。 i+)/* 查找数据 */。*/if(strcmp(,I

16、M)=0)k=i 。/* 找到记录printf_one(k) 。 break。if(k=-1)printf("nnNo exist!")。 while(k=-1&&w=1)。 num_search()/* 卡号查找 */*/* 调用显示一个记录地函数*/int i,k,n,w=1 。 struct infowage s 。n=load() 。dok=-1。printf("nnEnter num that you want to search!NO.:")。scanf("%s",s.num) 。/* 输入要找

17、地号码*/printf_face() 。for(i=0 。 i<n 。 i+)/* 调用显示数据结构工程函数/* 查找数据 */*/if(strcmp(s.num,IMi.num)=0)k=i 。printf_one(k)/* 找到记录 */。 break。/* 调用显示一个记录地函数*/if(k=-1)printf("nnNo exist!")while(k=-1&&w=1)。 。 ( 5) .排序模块. 需求分析 :该模块地功能是将职工按照卡号升序或者实发工资降序排列输出.【流程图】:排序按照卡号升序排列按照实发工资降序排列保存保存返回主菜单返回主

18、菜单图七:排序模块流程图【程序】:void order()/* 排序模块 */int k=0 。 int w1,w2 。doprintf("nnWhich way do you choose?nt1.By num 2.By T_wage bb")scanf("%d",&w1) 。if(w1=1) num_order() 。/* 按照卡号排序*/else T_wage_order()。/* 按照实发工资排序*/if(k!=-1)printf("nnSuccessful._.")。printf("nnWhat do yo

19、u want to do?nt1.order another 2.Back bb")scanf("%d",&w2) 。while(w2=1) 。menu()。 /* 返回菜单函数*/void num_order()/* 卡号排序 */ int i,j,k,n 。 struct infowage s 。 n=load() 。for(i=0。 i<n-1 。 i+) k=i。for(j=i+1。 j<n 。j+)/*选择排序法*/if(IMj.num>IMk.num)k=j。s=IMi 。 IMi=IMk。IMk=s。printf("

20、;%11s%-17s%6d%6d%6d%6d%6d %6d",IMi.num,IM,IMi.month,IMi.S_wage,IMi.water_ra te,IMi.electric_charge,IMi.tax,IMi.T_wage) 。 printf("%11s%-17s%6d%6d%6d%6d%6d %6d",IMk.num,IM,IMk.month,IMk.S_wage,IMk.water _rate,IMk.electric_charge,IMk.tax,IMk.T_wage) 。 save()。/* 保存函数*/puts(&qu

21、ot;nn") 。void T_wage_order()/* 实发工资排序*/ int i,j,k,n 。 struct infowage s 。 n=load() 。for(i=0 。 i<n-1 。 i+) k=i 。 for(j=i+1 。 j<n 。j+)/* 选择排序法 */if(IMj.T_wage<IMk.T_wage)k=j。s=IMi 。 IMi=IMk。 IMk=s 。printf("%11s%-17s%6d%6d%6d%6d%6d %6d",IMk.num,IM,IMk.month,IMk.S_wage,IMk.

22、water _rate,IMk.electric_charge,IMk.tax,IMk.T_wage) 。 printf("%11s%-17s%6d%6d%6d%6d%6d %6d",IMi.num,IM,IMi.month,IMi.S_wage,IMi.water_ra te,IMi.electric_charge,IMi.tax,IMi.T_wage) 。 save()。/* 保存函数*/puts("nn")。(6).统计模块【需求分析】:要求能够按照月份累计统计某职工在某时间段实发工资总金额【流程图】:.统计模块读入文件信息读入相对月份

23、信息计算实发工资总金额显示职工工资信息累计月份信息计算总金额图八 .统计模块流程图【程序】:void stat()readfiles() 。/*统计模块 */* 读入职工工资信息*/allwage() 。/* 总金额*/void readfiles()int n 。 n=load() 。/*从文件读入职工工资信息*/printf_face(n) 。 int allwage() int i,j,month 。 int allwage=0 。struct infowage s100 。FILE *fp 。 char filename30 。printf("Please input T_w

24、age information filename:")。scanf("%s",filename) 。if(fp=fopen("filename","rb")!=NULL) printf("File open error.n")。exit(0) 。 i=0 。while( !( feof(fp) ) )fscanf(fp,"%d%s%d%d",&IMi.num,&IM,&IMi.month,&IMi.T_wage)。i+ 。 printf(&q

25、uot;Please input month searched:") 。scanf("%d",&month) 。printf("The result searching as follows:n")。printf("Num Name Month T_wage:n")。for(j=0 。 j<i 。j+)if(IMj.month=month) printf("%5d %10s %3d %10dn",IMj.num,IM,IMj.month,IMj.T_wage)allwage+=I

26、Mj.T_wage。fclose(fp) 。getchar()。getchar()。menu()。/* 返回菜单函数*/3. 公共函数下面是能够用到地一些公共函数.保存函数save(int n) 说明 : 形参 n 控制保存地个数.程序 void save(int n)/* 保存函数 ,保存 n 个记录 */FILE *fp 。int i 。if(fp=fopen("S_wage.txt", "wb")=NULL) /* 以输出打开方式 ,在此之前地记录被覆盖 */ printf("nCannot open filen") 。retu

27、rn 。for(i=0 。 i<n 。 i+)if(fwrite(&IMi,sizeof(struct infowage),1,fp)!=1)printf("file write errorn")。fclose(fp) 。加载函数load() 说明 : 该函数可以用来加载所有记录,并且可以返回所有地记录地个数.程序 int load()/* 加载记录或可以计算记录个数地函数*/FILE* i 。if(fp=fopen("S_wage","rb")=NULL) /*printf("nCannot op

28、en filen")。以输出打开方式,在此之前地记录被覆盖*/return NULL。for(i=0 。 !feof(fp) 。 i+)fread(&IMi,sizeof(struct infowage),1,fp)。fclose(fp) 。return(i-1) 。/* 返回记录个数*/ .卡号输入函数 num_input(int i,int n) 说明 : 该函数对输入考核进行判断示总共有 n 个职工记录 .程序 :,确保输入卡号惟一.形参i 表示第i 个职工记录,形参n 表void num_input(int i)int j,w1。dow1=0。printf("

29、;NO.:")。scanf("%s",IMi.num)。for(j=0 。 IMi.numj!='0'。 j+)if(IMi.numj<'0'|IMi.numj>'9')/*/*卡号输入函数,作了严格规定判断卡号是否为数字*/*/puts("Input error!Only be made up of (0-9).Please reinput!n")。w1=1 。 break。 while(w1=1) 。姓名输入函数name_input (int i) 说明 形参 i 表示第 i 个职

30、工记录 .程序 void name_input(int i)int j,w1 。dow1=0 。printf("Name:") 。scanf("%s",IM) 。for(j=0 。 'a'<=IMj<='z'。j+)/* 判断姓名是否为字母*/if(j=0)IMj-=32。w1=1 。 break。if(j!=0&&IMj!='0')/*姓名输入函数 ,作了严格规定*/IMj+1-=32。w1=1 。 break。whi

31、le(w1=1) 。 (5).求税率函数void tax(int i) 说明 : 形参 i 表示第 i 个职工记录 . 程序 : void tax(int i)/*税率函数*/int m。m=IMi.S_wage。if(m<=800) IMi.tax=0。/* 计算税率地方法else if(800<m<1400) IMi.tax=(m-800)*5/100。*/else IMi.tax=(m-1400)*10/100。 (6).求实发工资int T_wage(int i) 说明 : 形参 i 表示第 i 个职工记录程序 :.int T_wage(int i)/*实发工资函数*

32、/ IMi.T_wage=IMi.S_wage-IMi.water_rate-IMi.electric_charge-IMi.tax。return IMi.T_wage。 /*实发工资计算方法*/(7).输入整个记录函数input(int i) 说明 : 形参 i 表示第 i 个职工记录 .程序 :void input(int i)/*输入一个记录函数*/num_input(i) 。/* 调用卡号输入函数*/printf( “Name:”)。scanf("%s",&IM)。printf("Mon:")。 scanf("%d",&IMi.month)。printf("S_wage:") 。 scanf("%d",&IMi.S_wage)。printf("Water_rate") 。 scanf("%d",&IMi.water_rate)。printf("electric_charge") 。 scanf("%d",&IMi.electric_charge)。tax(i) 。T_wage(i) 。(8).

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论