版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、工资管理系统7.1设计目的本程序旨在训练基本的编程能力,了解管理信息系统的开发流程,熟悉c语言的文件和结构数组的各种基本操作。本程序中涉及结构体、数组、文件等方面的知识。通过本程序的训练,使我对 c语言的文件操作有了一个更深刻的了解,掌握利用数组存储结构实现工资管理的原理,为进一步开发出高质量的信息管理管理系统打下坚实的基础。7.2功能描述如后图所示,与利用单链表实现的学生管理系统不同的是,此工资管理系统主要利用数组来实现,其数组元素是结构体类型。整个系统由如下几大功能模块组成。(1)输入记录模块。输入记录模块主要完成将数据存入数组中的工作。在此工资管理系统中,记录可以从以二进制形式存储的数据
2、文件中读入,也可以从键盘逐个输入记录。记录由职工的基本信息和工资信息字段构成。当从数据文件中读入记录时,它就是在以记录为单位存储的数据文件中,将记录逐条复制到数组元素中。(2)查询记录模块。查询记录主要完成在数组中查询满足相关条件的记录。在此工资管理系统中,用户可以按照职工编号或姓名在数组中进行查找。若找到该记录,则以表格形式打印出此记录的信息;否则,返回一个-1的值,并打印出未找到该记录的提示信息。(3)更新记录模块。更新记录模块主要完成对记录的维护。在此工资管理系统中,实现对记录的修改、删除、插入、和排序操作。一般而言,系统进行了这些操作之后,需要将修改的的数据存入源数据文件。7.3总体设
3、计731功能模块设计1.主控main()函数执行流程工资管理系统执行流程如后图所示。它先以可读写的方式打开数据文件,此文件默认为“c:zggz ”,如该文件不存在,则新建此文件。当打开文件操作成功后,则从文件中一次读 出一条记录,添加到新建的数组中,然后执行显示主菜单和进入主循环操作,进行按键判断。在判断键值时,有效的输入为 09之间的任意数值,其他输入都被视为错误按键。若 输入为0 (即变量select=O),则会继续判断是否在对记录进行更新操作之后进行了存盘操 作,若未存盘,则全局变量 saveflag=1,系统会提示用户是否需要进行数据存盘操作,用户 输入Y或y,系统会进行存盘操作。最后
4、,系统执行退出工资管理系统的操作。若选择1,则调用Add()函数,执行增加记录操作;若选择 2,则调用Del()函数,执 行删除记录操作;若选择3,则调用Qur()函数,执行查询记录操作;若选择 4,则调用Modify()函数,执行修改记录操作;若选择5,则调用Insert()函数,执行插入记录操作;若选择6,则调用Tongji()函数,执行统计记录操作;若选择 7 ,则调用Sort()函数,执行 按降序排序记录的操作;若选择88,则调用Save()函数,执行将记录记录存入磁盘中的数据文件的操作;若选择9,则调用Disp()函数,执行将记录以表格形式打印输出至屏幕的操 作;若输入09之外的值,
5、则调用 Wrong()函数,给出按键错误的提示。2输入记录模块输入记录模块主要实现将数据存入数组中。当从数据文件中读出记录时,它调用fread(&gzcou nt,sizeof(ZGGZ),1,fg)文件读取函数,执行一次从文件中读取一条工资记录信息存入某个数组元素中德操作,并且这个操作在main()中调用执行,即在工资管理系统进入显示菜单界面时,该操作已经执行了。若该文件中没有数据,系统会提示数组为空,没有任何记录可操作,此时,用户应选择1,调用Add()函数,进行记录的输入,即完成在数组中添加元素的操作。3. 查询记录模块查询记录模块主要实现在数组中按职工编号或姓名查找满足相关条件
6、记录。在查询函数Qur ()中,为了遵循模块化编程原则,我们将数组中进行的记录定位操作设计成了一个单独函数 int Locate(ZGGZ tp,char findmess,char nameornum),参数 findmess保存要查找的具体内容,nameornum 保存要查找的字段(职位字符串类型的num或者name),若找到该记录,则返回指向该记录的数组元素的下标,否则;返回一个一1的值。4. 更新记录模块更新记录模块主要实现对记录的修改、删除、插入和排序操作。因为记录是以数组的 结构形式储存的,所以这些操作都在数组中完成。下面分别介绍着4个功能模块。1) 修改记录修改记录的操作需要对数
7、组中目标元素的数域中的值进行修改,他分两步完成。第一步,输入要修改的职员编号,输入后调用定位函数Locate ()在数组中逐个对职员编号字段的值进行比较,直到找到该职员的编号记录;第二步,若找到该记录,则修改除职工编号之外 的各字段的值,并将存盘标记变量 savegflag置1,表示已经对记录进行了修改,但还未执行存盘操作。2) 删除记录删除记录操作完成删除指定职员编号或姓名的记录,他也分两步完成。第一步,输入要修改的职员编号,输入后调用定位函数Locate ()在数组中逐个对职员编号字段的值进行比较,直到找到该职员的编号记录,并返回指向该记录的数组元素下标;第二步,若找到该记录,则从该记录所
8、在元素的后续元素起,依次向前移一个元素位置,有值的数组元素个数减1.3) 插入记录插入记录操作完成在指定职工编号的随后位置插入新的记录。搜先,他要求用户输入某个员工的职工编号,新的记录将插入在该记录之后;然后,提示用户数输入一条新的记录的信息,这些信息保存在心结构体类型的数组元素的个字段中;最后,将该元素插入已经确认的位置的职工编号之后。它的具体插入执行过程如图7.3所示,新的元素 B1准备插入至已有5个元素的数组中,插入位置为元素A2之后。具体过程为:先调用 Locate ()函数找到A2在数组中的下标,从 A4开始,往后移动,至 A2停止移动,然后再原 A3的位置 插入元素B1.4) 排序
9、记录冒泡排序法属于内部排序中的一种,这是运用数据值比较后,一句判断规则对数据位 置进行交换以达到排序的目的。针对数组结构的特点, 这里采用这种排序法莱实现按实发工资字段的值从高到底对记录进行排序。冒泡排序法的基本思想为:将相邻的两个数组远足的实发工资字段的值进行比较,若左边的值小于右边的值,则将此两个元素的值进行交换;若左边的值大于右边的值,则此两个值的位置不变。右边的值继续和下一个值做比较,重复此动作,直到比较到最后一个值。用伪代码描述如下:插入B1A0A1A2A3A4插入B1前A0A1A2B1A3A4插入B1后图7.3数据中插入记录示意图if (左边的值 < 右边的值)then此两个
10、元素的位置互换;else /*左边的值 >=右边的值*/此两个元素的位置不变: 右边的元素继续和下一个元素比较;如图7.4所示,假设共有 个ZGGZ结构数组元素gz【0】至gz【n-1】,其具体比较过程 如下。第一轮:从gz【0】比到gz【n-1】,实发工资字段值最小的元素存放在 gz【n-1】中。 第二轮:从gz【0】比到gz【n-2】,实发工资字段值最小的元素存放在 gz【n-2】中。第n-1轮:从gz【0】比到gz【1】,实发工资字段值最小的元素存放在gz【1】中。gzngz0gz1gz2、gzn-2gzn-1图7.4数组中对记录因为是按实发工资的降序排序,所以每进行一轮比较都会以
11、交换位置的方式将该轮的最小者移向数据的尾端。 冒泡排序法的优点是, 若数组元素已有部分排好序, 则使用冒泡排序 法可以快速地完成排序。 其缺点则是会反复扫描数据, 比较相邻的两个元素, 速度不快且没 有效率。它属于稳定排序法。5. 统计记录模块该模块的实现比较简单,它主要通过依次读取数组中元素的数据域中的实发工资的值进 行比较判断的形式,完成工资在各个等级的人数统计。6. 输出记录模块当把记录输出至文件时,调用 fwrite(&tpi,sizeof(ZGGZ),1,fp)函数,将数组元素tpi中各字段的值,写入文件指针 fp所指的文件;当把记录输出至屏幕时,调用void Disp()函
12、数,将数组中存储的记录信息以表格的形式在屏幕上打印出来。开始图7.2主控函数执行流程图732数据结构设计本程序定义了结构体 emplee,用于存放职工的基本信息和工资信息。typedef struct employee/* 标记为 employee*/char num10;char n ame15;float jbgz;float jj;float kk;float yfgz;float sk;float sfgz;ZGGZ;其他字段的含义如下。num10:保存职工编号。name10:保存职工姓名。jbgz:保存职工基本工资。jj:保存职工奖金。kk:保存职工扣款。yfgz:保存职工应发工资。
13、sk:保存职工税款。sfgz:保存职工实发工资。7.3 . 3函数功能描述1) printheader()函数原型:void prin theader()prin theader()函数用于在以表格形式显示出记录时,打印输出表头信息。2) printdata()函数原型:void prin tada(ZGGZpp)函数用于在以表格形式显示的方法,打印输出单个数组元素pp中的记录消息。3) Disp()函数原型:void Disp(ZGGZtp,i nt n)Disp()函数用于显示tp数组中存储的n条记录,内容为employee 结构中定义的内容。4) numberinput()函数原型:fl
14、oat numberi nput(char* notice)numberinput()函数用于输入数值型数据,notice用于保存printf()中输出的提示消息。5) Stringinput()函数原型:void Stringinput(char*t,int lens,char*notice)164Stringinput()函数用于输入字符串,并进行字符串长度验证(长度 <lens),t用于保存输的 字符串,因为是以指针形式传递的, 所以t相当于该函数的返回值 notice用于保存printf() 中输出的提示信息。6) Locate()函数原型:int Locate(ZGGZ tp,
15、int n,charfindmess,charnameornum)Locate()函数用于定位数组重符合要求的元素,并返回该数组元素下标值。参数findmess保存要查找的具体内容,nameornum 保存按什么字段在数组tp中查找。7) Add()函数原型:int Add(ZGGZ tp,i nt n)Add()函数用于在数组tp中增加工资记录元素,并返回数组中的当前记录。并显示出来。8) Qur()函数原型: void Qur(ZGGZ tp,i nt n)Qur()函数用于在数组tp中按职工编号或姓名查找满足条件的记录,并显示出来。9) Del()函数原型:int Del(ZGGZ tp
16、,i nt n)Del()函数用于现在数组tp中找到满足条件的记录,然后删除记录。10) Modify()函数原型:void Modify(ZGGZ tp,i nt n)Modify函数用于在数组tp中修改记录元素。11) 1 nser()函数原型:In sert(ZGGZ tp int n)Insert函数用于在数组tp中插入记录,并返回数组中的当前记录数。12) To ngji()函数原型:void Ton gji(ZGGZ tp int n)Tongji()函数用于在数组tp中完成记录的统计工作,统计该公司职工工资的整体分布情况。13) Sort()函数原型:void Sort(ZGGZ
17、 tp, i nt n)Sort()函数用于在数组tp中完成利用冒泡排序算法实现数组的按实发工资字段的降序排序。14) Save()函数原型:void Save(ZGGZ tp int n)Save()函数用于将保存职工工资的数组tp中的n个元素写入磁盘的数据文件中。15) 主函数main()main()是整个工资管理系统控制部分。7.4程序实现7.4.1源码分析1. 程序预处理包括加载头文件,定义结构体,常量和变量,并对它们进行初始化工作。#i nclude"stdio.h"/*标准输入输出函数库*/#i nclude"stdlib.h"/*标准函数库
18、*/#i nclude"stri ng.h"/*字符串函数库*/#i nclude"con io.h"/*屏幕操作函数库*/#defi neHEADER1IIZGGZn"| yfgz |#define HEADER2 "| number| name | jbgz | jj | kk sk | sfgz | n"#define HEADER3"|1| n"#defi ne FORMAT "|%-8s|%-10s |%8.2f|%8.2f|%8.2f|%8.2f|%8.2f|%8.2f| n&quo
19、t;#defi ne DATAp_>nu m,p_ >n ame,p_>jbgz,p_>jj,p_>kk,p_>yfgz,p_>sk,p_>sfgz#defi ne END"n"#defi ne N 60int saveflag=0;/*是否需要存盘的标志变量 */*定义与职工有关的数据结构*/typedef struct employee/* 标记为 employee*/charnum10;/*职工编号*/charn ame15;/*职工姓名*/floatjbg z;/*基本工资*/floatjj;/*奖金*/floatkk
20、;/*扣款*/floatyfgz;/*应发工资*/floatsk;/*税款*/floatsfgz;/*实发工资*/ZGGZ;2. 主函数main()main()函数主要实现了对整个程序的运行控制,以及相关功能模块的调用。详细分析可参考图7.2。void mai n()ZGGZ gzN;/*定义ZGGZ结构体*/FILE *fp;/*文件指针*/int select;/*保存选择结果变量*/char ch;/* 保存(y,Y,n,N)*/int coun t=0;/*保存文件中的记录条数(或元素个数)*/fp=fope n( "C:zggz","ab+")
21、;/*以追加方式打开二进制文件c:zggz,可读可写,若此文件不存在,会创建此文件*/if(fp=NULL)prin tf("n=>ca n not ope n file!n");exit(O);while(!feof(fp)if(fread(&gzcount,sizeof(ZGGZ),1,fp)=1)/* 一次从文件中读取一条职工工资记录*/coun t+;fclose(fp); /* 关闭文件 */prin tf("n=>ope n file sucess,the total records nu mber is : %d.n",
22、co un t);getchar();men u();while(1)system("cls");men u();printf("nPlease Enter your choice(09):");/* 显示提示信息*/sca nf("%d", &select);if(select=O)if(saveflag=1)/*若对数组的数据有修改且未进行存盘操作,则此标志为1*/ getchar();prin tf("n=> Whether save the modified record to file?( y/n):
23、");scan f("%c", &ch);if(ch='y'|ch='Y')Save(gz,co un t);prin tf("n=>tha nk you for use ness!");getchar();break;switch(select)/*增加职工工资记录*/*删除职工工资记录*/case 1:co un t=Add(gz,co un t);break;case 2:co un t=Del(gz,co un t);break;/*查询职工工资记录*/*修改职工工资记录*/*插入职工工资记
24、录*/*统计职工工资记录*/*排序职工工资记录*/*保存职工工资记录*/*显示职工工资记录*/*按键有误,必须为数值 0-9*/case 3:Qur(gz,co un t);break;case 4:Modify(gz,co un t);break;case 5:co unt=ln sert(gz,co un t);break;case 6:T ongji(gz,count);break;case 7:Sort(gz,co un t);break;case 8:Save(gz,co un t);break;case 9:system("cls");Disp(gz,co un
25、 t);break;default: Wron g();getchar();break;3. 主菜单界面用户进入工资管理系统时,需要显示主菜单,提示用户进行选择,完成相应任务。此 代码被main()函数调用。void menu()/*主菜单*/system("cls");/*调用DOS命令,清屏与clrscr()功能相同*/textcolor(10);/*在文本模式中选择新的字符颜色*/gotoxy(10,5);/*在文本窗口中设置光标 */cpri ntf(”The Employee' Salary Man ageme nt System n ”);gotoxy(
26、10,8);cpri ntf(”*Me nu * n")gotoxy(10,9);cpri ntf(”* 1in putrecord2deleterecord* n");gotoxy(10,10);cpri ntf(”*3searchrecord4modifyrecord* n");gotoxy(10,11);cpri ntf(”*5in sertrecord6cou ntrecord* n");gotoxy(10,12);cpri ntf(”*7sortreord8saverecord* n");gotoxy(10,13);cpri ntf(
27、”*9displayrecord0quitsystem*n");gotoxy(10,14);cpri ntf(”* n");/*cpri ntf()送格式化输出至文本窗口屏幕中*/4. 表格形式显示记录由于记录显示操作经常进行,所以我们将这部分由独立的函数来实现,以减少代码的 重复。过程如下。调用Disp(ZGGZ tp,int n)函数,它将显示从数组 tp第一个元素开始的n条记录。(2)调用printdata(ZGGZpp)函数,它将显示数组元素pp中的记录信息。void printheader() /*格式化输出表头*/prin tf(HEADER1);prin tf
28、(HEADER2);prin tf(HEADER3);void prin tdata(ZGGZ pp) /*格式化输出表中数据 */ZGGZ* p;p=&pp;prin tf(FORMAT,DATA);void Disp(ZGGZ tp,int n)/*显示数组tp中存储的记录,内容为 employee 结构中定义的内容*/int i;if(n=O)/*表示没有职工工资记录*/prin tf("n=>Not employee record!' n");getchar();return;prin tf("nn");printheade
29、r(); /*输出表格头部*/i=0;while(i<n)/*逐条输出数组中存储的职工信息*/prin tdata(tpi);i+;prin tf(HEADER3);getchar();void Wrong()/*输出按键错误信息*/toprin tf("nnnnn *Error:i nputhas wrong! press any keycon ti nue);getchar();void Nofind()/*输出未查找此职工的信息*/prin tf("n=>Not find this employee record!n");5. 记录查找定位用户进
30、入工资管理系统时,在对某个记录进行处理前,需要按照条件找到这条记录, Locate()函数完成了记录定位的功能。这里可以按照职工编号或职工姓名进行记录查找定 位。/*作用:用于定位数组中符合要求的记录,并返回保存该记录的数组元素下标值参数:findmess保存要查找的具体内容;nameornum保存按什么在数组中查找*/int Locate(ZGGZ tp,i nt n, char fin dmess,char n ameor nu m)int i=0;if(strcmp(nameornum,"num")=0) /*按职工编号查询 */while(i< n)if(st
31、rcmp(tpi. nu m,fi ndmess)=O) /* return i;i+;else if(strcmp( nameor nu m," name")=0)while(i< n)if(strcmp(tpi. name,fi ndmess)=0) /* return i;i+;return -1; /*若未找到,返回一个整数6.格式化输入数据flag=1;break;-1*/若找到findmess 值的职工编号*/*按职工姓名查询*/若找到findmess 值的姓名*/莊此工资管理系统中,要求用户输入的只有字符型和数值型数据,所以我们设计了 下面两个函数来单独
32、处理,并对输出的数据进行检验。 调用stringinput(char *t,int lens,char *notice)函数,它将提示用户输入字符串,并对用户输入的字符串进行长度验证(长度必须小于lens)。(2)调用numberinput(char *notice) 函数,它将提示用户输入一个浮点型数值,对数值检验后返回该值。/*输入字符串,并进行长度验证(长度<lens)*/void stri ngin put(char *t, int len s,char *no tice)char n255;doprintf(notice);/* 显示提示信息 */scanf("%s&
33、quot;,n);/* 输入字符串 */if(strle n(n )>le ns) pri ntf("n exceed the required len gth! n"); /*进行长度校验,超过lens值重新输入*/while(strle n(n )>le ns);strcpy(t,n); /* 将输入的字符串拷贝到字符串t中*/*输入数值,0< =数值)*/float nu mberi nput(char *no tice)float t=0.00;doprintf(notice);/* 显示提示信息 */scanf("%f",&a
34、mp;t);/*输入如工资等数值型的值*/if(t<0) printf("n score must >=0! n”); /*进行数值校验 */while(t<0);return t;7. 增加记录调用Add(ZGGZ tp , int n)函数,完成在数组tp中添加职工工资记录的功能。若在刚进入工资管理系统时数据文件为空,则将从数组的头部开始增加记录:否则,将此记录添加在数组的尾部。/*增加职工工资记录*/int Add(ZGGZ tp,i nt n)char ch,nu m10;int i,flag=0;system("cls");Disp(t
35、p, n); /*先打印出已有的职工工资信息*/while(1)/* 次可输入多条记录,直至输入职工编号为0的记录才结束添加操作*/while(1) /*输入职工编号,保证该编号没有被使用,若输入编号为0,则退出添加记录操作*/stri ngi nput( nu m,10,"i nput number(press '0'return men u):"); /*格式化输入编号并检验*/flag=0;if(strcmp(num,"0")=0)/*输入为0,则退出添加操作,返回主界面 */return n;i=0;while(i<n)/*
36、查询该编号是否已经存在,若存在则要求重新输入一个未被占用的编号*/if(strcmp(tpi. nu m, nu m)=0)if(flag=1) /*提示用户是否重新输入*/ getchar();prin tf("=>The nu mber %s is exist in g,try aga in?(y/n):", nu m);scan f("%c",&ch);if(ch='y'|ch='Y')con ti nue;elsereturn n;elsebreak;strcpy(tp n.n um, num); /
37、*将字符串stri ngin put(tp n. name,15,"Name:");tpn .jbgz=nu mberi nput("jbgz:"); /*tpn .jj=nu mberi nput("jia ngji n:");tpn .kk =nu mberi nput("koukua n:");tp n.yfgz=tp n.jbgz+tp n.jj-tp n.kk;tp n.sk=tp n.y fgz*0.12;tp n.sfgz=tp n.yfgz-tp n.sk; /*saveflag=1;n+;num
38、拷贝到 tpn.num中*/输入并检验基本工资*/*输入并检验奖金*/*输入并检验扣款*/*计算应发工资*/*/*计算税金,这里取应发工资的百分之计算实发工资*/return n;8. 查询记录调用Qur(ZGGZtp, int n)函数,完成在数组tp中查询职工工资记录的功能。当用户执行此查询任务时,系统会提示用户进行查询字段的选择,即按职工编号或姓名进行查询。若此记录还在,则会以表格形式打印输出此条记录信息。/*按职工编号或姓名,查询记录*/void Qur(ZGGZ tp,i nt n)int select; /*1:按编号查,2 :按姓名查,其他:返回主界面(菜单) */char se
39、arch in put20; /*保存用户输入的查询内容*/int p=0;if(n<=0) /* 若数组为空*/system("cls");prin tf("n=>No employee record!' n");getchar();return;system("cls");prin tf("n=>1 Search by nu mber=>2 Search by n amen");printf(”please choice1,2:");scan f("%d&qu
40、ot;, &select);if(select=1) /* 按编号查询 */stri ngin put(search in put,10,"i nput the exist ing employee nu mber:");p=Locate(tp, n,searchi nput," num");/*在数组 tp 中查找编号为 search in put 值的元素,并返回该数组元素的下标值*/if(p!=-1) /*若找到该记录*/prin theader();prin tdata(tpp);prin tf(END);prin tf("pr
41、ess any key to retur n");getchar();elseNofi nd();getchar();else if(select=2) /* 按姓名查询 */stri ngin put(search in put,15,"i nput the exist ing employee n ame:");p=Locate(tp ,n, search in put, "n ame");if(p!=-1)prin theader();prin tdata(tpp);prin tf(END);prin tf("press any
42、 key to retur n");getchar();elseNofi nd();getchar();elseWron g();getchar();9. 删除记录调用Del (ZGGZ tp,int n)函数,完成在数组tp中删除职工工资记录的功能。在删除记录操作中,系统会先按用户要求先找到该记录的元素的下标值,然后从数组中删除该数组元素。int Del(ZGGZ tp,i nt n)int sel;char fin dmess20;int p=O,i=O;if(n <=0) system("cls");prin tf("n=>No emp
43、loyee record!' n");getchar();return n;system("cls");Disp(tp, n);byprin tf("n=>1 Delete by nu mber=>2 Deleten amen");prin tf("please choice1,2:");scan f("%d", &sel);if(sel=1)stri ngin put(fi ndmess,10,"i nput the exist ing employee nu mb
44、er:");p=Locate(tp ,n,fin dmess," nu m");getchar();if(p!=-1)for(i=p+1;i< n;i+)/*删除此记录,后面记录向前移*/strcpy(tpi-1. nu m,tpi. nu m);strcpy(tpi-1. name,tpi. name);tpi-1.jbgz=tpi.jbg z;tpi-1.jj=tpi.jj;tpi-1.kk=tpi.kk;tpi-1.yfgz=tpi.yfg z;tpi-1.jbgz=tpi.sk;tpi-1.sfgz=tpi.sfg z;prin tf("n
45、=>delete success!n");n-;getchar();saveflag=1;elseNofi nd();getchar();else if(sel=2) /*先按姓名查询到该记录所在的数组元素的下标值*/stri ngin put(fi ndmess,15,"i nput the exist ing employee n ame:");p=Locate(tp ,n,fin dmess," name");getchar();if(p!=-1)for(i=p+1;i<n;i+)/*删除此记录,后面记录向前移 */strcp
46、y(tpi-1. nu m,tpi. nu m);strcpy(tpi-1. name,tpi. name);tpi-1.jbgz=tpi.jbg z;tpi-1.jj=tpi.jj;tpi-1.kk=tpi.kk;tpi-1.yfgz=tpi.yfg z;tpi-1.jbgz=tpi.sk;tpi-1.sfgz=tpi.sfg z;prin tf("n=>delete success!n");n-;getchar();saveflag=1;elseNofi nd();getchar();Return n;10. 修改记录调用Modify (ZGGZ tp,int n
47、) 函数,完成在数组tp中修改职工工资记录的功能。在 修改记录操作中,系统会先按用户输入的职工编号查找到该记录,然后提示用户修改职工编号之外的值,但职工编号不能改。void Modify(ZGGZ tp, int n)char findmess20;int p=0;if(n<=0) system( "cls");printf( "n=>No employee record!'n");getchar();return ;system( "cls");printf( "modify employee reco
48、rder" );Disp (tp,n);stri ngin put(fi ndmess,10,"in put the exist ing employee nu mber:");/*输入并检验该编号*/p=Locate(tp,n,findmess,"num" ); /*查询到该数组元素,并返回下标值*/if(p!=-1)/*若p!=-,表明已经找到该数组元素 */printf( "Number:%s,n",tpp.num);printf( "Name:%s," ,);stri ngin p
49、ut(tpp. name,15,"in put new n ame:" );printf( "jbgz:%8.2f," ,tpp.jbgz); tpp.jbgz=numberinput("jbgz:");printf( "jiangjin:%8.2f,",tpp.jj);tpp.jj=nu mberi nput("jia ngji n:");printf( "koukuan:%8.2f,",tpp.kk);tpp.kk=nu mberi nput("koukua n
50、:");tp n.yfgz=tp n.jbgz+tp n.jj-tp n.kk;tpn .sk=tp n.y fgz*0.12;tp n.sfgz=tp n.yfgz-tp n.sk;printf( "n=>modify success!n");getchar();Disp (tp,n); getchar(); saveflag=1;elseNofi nd(); getchar(); return ;11. 插入记录调用Insert(ZGGZ tp,int n)函数,完成在数组tp中插入职工工资记录的功能。在插入记录操作中,系统会先按职工编号查找到要插入的元
51、素的位置,然后在该职工编号之后插入一个新记录。int In sert(ZGGZ tp, int n)char ch,num10,s10;/*s保存插入点位置之前的编号,num保存输入的新记录的编号*/ZGGZ n ewi nfo;int flag=0,i=0,kkk=0;system( "cis");Disp (tp,n);while (1) stri ngin put(s,10,"please in put in sert locati onafter the Number:" );flag=O;i=O;while (i<n) /*查询该编号是否
52、存在,flag=1表示该编号存在*/if(strcmp(tpi.num,s)=0)kkk=i;flag=1; break ;i+;if(flag=1)break ; /*若编号存在,则进行插入之前的新记录输入操作*/else getchar();printf( "n=>The nu mber %s is not exist in g,try aga in?(y/n):",s);scanf( "%c",&ch);if(ch= 'y' |ch= 'Y')con ti nue ;elsereturn n;/*以下新
53、记录的输入操作与Add()相同*/while (1) stri ngin put (nu m,10,"in put new employee Number:" );i=O;flag=O;while (i<n) /*查询该编号是否存在,flag=1表示该编号存在*/if(strcmp(tpi.num,num)=0)flag=1; break ;i+;if(flag=1)getchar();,nu m);printf( "n=>Sorry,The number %s isexisting,try again?(y/n):"scanf( "
54、;%c",&ch);if(ch= 'y' |ch= 'Y')con ti nue ;elsereturn n;elsebreak ;strcpy( newi nfo. nu m, nu m);/*将字符串num拷贝到newinfo.num中*/stri ngin put (newinfo.n ame,15,"Name:");newin fo.jbgz=nu mberi nput("jbgz:" ); /* 输入并检验 jbgz*/newinfo.jj=nu mberi nput("jiangjin:" );/* 输入并检验 jiangjin*/newin fo.kk=nu mberi nput("koukuan:" );/* 输入并检验 koukuan*/newinfo.yfgz=newinf
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 自动售检票系统运维安全操作规程
- 2026年家庭药师服务需求试题及答案
- 2026年陕西省人力资源和社会保障厅下属事业单位考试真题(附答案)
- 施工现场卫生防疫及消杀工作方案
- 阿尔茨海默病早期识别指南(2026版)
- 冷链库房安全管理方案
- 浙江省杭州天杭教育集团思远学部2025-2026学年九年级上学期语文期中试卷(含答案)
- NOC编程猫创意编程初赛试题(含详细答案解析)
- 铁路电力配电工安全操作规程
- 计算机技术与软件《初级网络管理员》试题六
- 2025年青少年心理健康知识竞赛备赛试题库150题(含答案)
- 2025年6月浙江省高考化学试卷真题(含答案及解析)
- 《中药炮制学》课程教学大纲
- 心力衰竭消化道出血课件
- 辽宁现代服务职业技术学院单招数学真题及完整答案详解【考点梳理】
- 内衬(覆)不锈钢复合钢管管道工程技术规程
- 高中数学分层练习(基础题):圆锥曲线(60题)
- 院前急救病历书写规范
- 电梯维修培训教程
- 《伤寒论》课件-葛根黄芩黄连汤证
- 机械制造加工车间安全手册
评论
0/150
提交评论