C语言职工档案管理系统_500多行代码_第1页
C语言职工档案管理系统_500多行代码_第2页
C语言职工档案管理系统_500多行代码_第3页
C语言职工档案管理系统_500多行代码_第4页
C语言职工档案管理系统_500多行代码_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1、1 程序的总体设计职工档案管理系统设计,每个职工是一条记录,包括编号,姓名,性别,出生年月,所在部门,职称,工资级别、电话等。系统可实现以下功能:1 、输入功能:输入每一位职工记录,将其信息存入文件中。2 、显示功能:完成全部职工记录的显示。3 、查找功能:完成按编号或姓名查找职工的相关记录,并显示。2. 数据结构对于这个职工档案系统的设计, 我主要采用结构体存放不同类型的数据, 运用数组对各数据进行控制,而所有数据(除ID 外)都以字符型的形式存放,这样方便存入中文数据。本程序用指针相对较少,事实上,我只在文件的保存函数上用了指针。只要是因为我们对指针了解相对较少,而且指针相对容易出错误,而

2、这个程序用结构体和数组就可以很好地完成。3. 函数原型声明的说明(功能,参数,返回值)1 . 主函数 void main()主函数的主意作用是调用函数以实现程序的预期功能, 主函数有各函数的声明调用。 主函数用 switch 语句对各函数进行调用。2 添加函数: void append()该函数是无参函数,主要功能是添加职工,由于界面为DOS勺命令界面,为了使添加更加人性化,我采用先确认添加人数, 再对每个员工的每条信息,逐个添加, 这样可以减少错误的发生和加快输入速度。 员工添加后可用保存函数, 将其数据保存到指定文件中。3 查找函数: void search()该函数是无参函数, 主要功能

3、是查找员工, 可按编号或姓名查找职工的相关记录, 按姓名查找时采用字符串处理函数strcmp() 进行比较, 这样可以用两种方法查找职工信息。4 输出函数:void output()该函数是无参函数,主要功能是输出全部员工的信息,用 for 语句进行输出。5 删除函数:void delete()该函数是无参函数,主要功能是删除指定员工的全部信息,该函数相对较复杂,用 for语句对删除后该员工后的员工的序号进行排列。6 修改函数: void modify()该函数是无参函数, 主要功能是修改指定员工的信息, 该函数有密码操作, 要输入密码后才能进入修改界面,密码操作采用 while 语句,用 g

4、etch() 输入密码,可以将密码隐藏。这里 getch() 函数要调用 conio.h 文件。7 保存函数: void save()该函数是无参函数, 主要功能是保存添加的员工信息到指定文件, 该函数用到了指针和文件的内容。8 主菜单函数:void showmenu()该函数是无参函数,主要功能是提供美观的菜单界面。9 文档导入函数:voidread()该函数是无参函数,主要功能是导入文件中的职工档案信息。10 数据排序函数:voidsort()该函数是无参函数,主要将职工数据排序,分按编号排序和工资排序, 工资排序又分从高到低和从低到高两种。二、详细设计1.main() 流程图9 / 17

5、开始主函数Switch语句添 加 数 据查 找 函 数修 改 函 数输 出 数 据主 菜 单 函 数导入数据按 编 号 查 找按 姓 名 查 找按编号排序修改数据三、测试及调试(测试方案、存在的问题及解决方法)测试方案、存在的问题及解决方法我用的是visual C+ 6.0 进行编译和测试的,主要观察程序运行的错误及找出错误发 生的原因,还有各函数的功能的实现以及部分变量在程序运行时的变化。采取逐个函数测验 的方法,虽然比较耗时间,但是我实在没有找到可以检查我的海量错误的方法。下面是某此 调试的截图。i±nini_lMocalslt empt emp 029ncnajneO. c.c

6、(80): "(80):1 c(83); .c(69): ,c(154) .c(135) .c(140).c(176), cO.c(176), cUTfi) ,c(203),c讴Z刃.c (232)1 c(233) .c(236).c37) “(237) .i (237).c (237).c (337).c C2M)rerror C2143: syntax ertor : missing ' beforevatiting C4091: ' ' : ignoifid 廿此 left ftf ' int ' vhsn no variable is

7、declarederror C2065: number" : undeclared identifiererror C20651 ' i' : undeclirftd identifiererrcir C2O01: newline in constanterror C2143:syntaxerror:Jhissing:):tsfore'break"error C2143:syntaxerror:missing':'tefore3 far3error C2143:syntaxerror:inissing':'tefore

8、3'brealt>error C2O65: ? workj? : undsclared identifierwarning C4047; nfunction"earning 匚4024; ? strcpyT :error error sr。广 error err<jr error error errorC2143:C2O59: 匚2143; C2143; & 143; C2143: C2O65: C2O65:syntax syntaz syntax syntax syn-t ax syntaxerror error mH error error i?rro

9、r;'const char / differs in levels of different typ&s for formal and actual: missing tiefore;欣界二ng'丁t对口ru' ':mis sing'before? lype1;missingtefore'七加号'mis sing;;''before?_typenJ fileprLT : undeclared ident ifierwarning;warning C4024: :naming C4047! 士 jiing C4047

10、::uarnirLa C4047! uismi n-? r*d fl 9d a: undeclared identifierC4047: function : const char * di££ers m levels 口findirection from. ? int ' parameter 2indirect ion £idjil mtfopen5 : different types for formal and actual parameter 1= :'mt ' differs in 1 eve Is of rndirect ion

11、 front ' struct _iobuf *' =' :* ini ' differs in levels £ indire ct ion froin * void. *sfunction" : st ruct _iobuf *' differs in levels of indirect ion from ? int -f iirr it* Ai -Fornt 十 meq nr fn工 nrl 立 l+iigI nar aTri+ a r d可以看到,这时候几乎什么错误都有,低级的错误数不清,高级的错误无法数,在这样的 局势下,

12、我仍然心静如水地检查错误,下面介绍我遇到的问题及其解决方案。我主要遇到了三个函数问题,第一,我原本想用数组代替指针,这样可以更好的检查错 误,但是后来的的数据保存就遇到了问题,老是无法正确的保存数据,所以还是用了个FILE*fp,当然也为此狂看了文件一章,最后在数据导入也用到了指针和文件。第二,题目本没有 要求写删除函数也没有要求写排序函数,也许修改函数能够代替删除函数的一部分功能,但 是无法减少职工的数目,这个对于想裁员的公司不利,所以,我又想了一个删除函数。写删 除函数遇到的问题是,我删除了编号为 2的函数,如何把2后面的同志移到前面来,而1不 动,后来还是用最笨的for语句搞定了,据说这

13、里可以用链表很美妙地完成,但是也可以不 用链表。排序函数是最后加上去的,一个原因是我的程序不够500行,就完成了功能,后来要求尽情发挥,我就用了排序函数,这个函数相对简单,用的是我们学过的起泡法排序,有 按照编号和工资排序两种方式,也用到了 switch语句,这样是程序的功能更加完善了。第三, 密码的问题,密码函数是个比较严肃的函数,为此不能敷衍了事用个while语句和字符串处理函数搞定,这样密码是明文的,很别扭。所以,我又加了一个不熟悉的头文件#include<conio.h> ,调用了这个文件里的getch()函数,这个函数能够不显示你输入的字符,很有保 密特性。程序设计其实是

14、最大的问题,起初的两三天我根本就不知道从哪里入手,后来参考到 可以用switch语句对各功能函数很好的利用,这里还用到了 break语句,感觉,课堂上没讲 的东西就是这么有用啊!关于如何输入数据信息的问题,我起初准备用一个scanf语句,输入全部的职工信息, 都是后来发现这样极易出现输入格式不正确的问题,后来就考虑用一个一个数据输入的方法,虽然这样做使代码长度加长了一些,但是这样输入简单明了更加人性化,所以我最终采用了 逐个数据输入的方法。我还用宏定义定义了一个最大员工数 max_num ,这样能够使程序更高效率更准确地运行, 而且改变最大员工数业很方便。最后谈谈调试错误的问题,上面已经晒了我

15、的错误截图,感觉这些错误确实很震撼人, 有时候就一个字符串函数应用错误,找了半天,居然发现strcmp前面忘记加“! ” 了,还有诸如忘记写“;”“”,最头痛的还是把SW成。这样程序能够运行,就是系统告诉你内存 错误,搞得我以为电脑坏了,调了半天电脑,这就足够悲剧的。最后还是一点一点地去检查, 不怕花费时间,就怕那些小东西太不入眼了。越是小的问题,可能浪费的时间就越让人感到悲愤,所以,细心检查永远是解决此类问题的良方。四、小结(收获和建议)通过本次课程设计我不仅温习了 C 程序设计课程的主体知识,还锻炼了对错误的承受能力,而且这个题目是我这辈子做过的最大的题目,搞了一个多星期才有一点点眉目,让

16、人感到前途特别渺茫,也催迫着我不断前进。开始时,对这个题目完全无从下手,后来列出了主函数和结构体,就慢慢算入门了,成天趴在电脑里,电脑前放着那本绿色的程序设计的书,外面冷风嗖嗖,鞭炮响起。明天就是除夕了,我要赶在春节前把这个题目做完。而现在函数全部写出来了,且运行的相当成功,几个特殊的功能函数也奇迹般的起作用了,小小的成功给了我大大的喜悦。这个时候,电脑不是机器,数据不是抽象,一切都像春风一样。调试程序的时候情绪一直十分难控,一声声叹息加上使劲敲打键盘的声音还有怒目对视屏幕,这样感觉在无尽的黑暗中寻找黎明。现在黎明的曙光已经出现,感觉一切的努力都是那么值得,心胸豁然开朗。当然也有没有解决的问题

17、,就是我的密码不能够在程序运行的时候修改只能够在源程序上修改,后来想了很久也没有找到好的办法。建议,由于在学校时没有上过几次实验课,理论的东西已经慢慢淡忘。所以建议以后此类的课尽量在实验室上好些,还有感觉只有一个题目没有啥挑战性,应该多布置几个附件:主要源程序代码(需打印)/*C 语言课程设计任务书 :职工档案管理系统设计*/#include <stdio.h>#include<string.h>#include <stdlib.h>#include <conio.h>#include <stdlib.h>#define MAX_NU

18、M 900struct workerint ID;char Birth20;char Sex20;char Name30;char Telenum20;int Wage;char Department30;char Job30;workMAX_NUM;void main()void showmenu(); /* 声明主菜单函数*/void append();/* 声明添加函数*/void search(); /* 声明查找函数*/void output(); /* 声明输出函数 */void modify();/* 声明修改函数*/void deletes(); /* 声明删除函数 */voi

19、d save();/* 声明保存函数 */void read(); /* 声明录入函数*/void sort(); /* 声明排序存函数 */ int m;showmenu();scanf("%d",&m);for(;m>=0&&m<=8;) switch(m) case 1: append(); /* 用户选择 1 号菜单,程序执行添加的数据文件的函数*/break;case 2: search();/* 用户选择 2 号菜单,程序执行查找数据的函数 */break;case 3: modify();/* 用户选择 3 号菜单,程序执行

20、修改数据的函数*/break;case 4: deletes();/* 用户选择 4 号菜单,程序执行删除数据的函数*/break;case 5: output();/* 用户选择 5 号菜单,程序执行输出数据录的函数*/break;case 6: save();/* 用户选择 6 号菜单,程序执行保存数据的函数*/break;case 7: read();/* 用户选择 7 号菜单,程序执行读取文件的函数*/break;case 8: sort();/* 用户选择 8 号菜单,程序执行排序数据的函数 */break;case 0: exit(0);/* 用户选择 3 号菜单,程序执行退书的函

21、数*/printf("nn 操作完毕,请再次选择! ");default:printf(" 错误,重新输入 n"); showmenu(); scanf("%d",&m); printf("*n");printf("AAAAAAAAAAAAAAAAAAAAAAA 职工档钻理系统 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAn");printf(" 设计者: 陈文凯n");printf("*n");printf("printf

22、("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&n");printf("&1, 添加职工5,输出职工&n");prin

23、tf("&2,查找职工6,保存职工&n");printf("&3,修改职工7,读取档案&n");printf(" printf("&4,删除职工8,职工排序&n");/* 主菜单函数*/void showmenu()/* 显示 主菜单,并返回用户所选择的 菜单项 的 编号 */ &&&&&&&&&&&&&&&&&&&&&

24、amp;&&&&&&&&&&&&&&&&&&&&&&&&&&n");n");printf(" 退出,请按0n");printf(" 请选择(0-8):");/* 添加函数 */void append()int number,i;FILE *fp;char filepnMAX_NUM;system("cls");

25、printf("n 您选择的是添加职工!n");printf("n 请输入本次添加的职工人数: ");scanf("%d",&number);if(number>MAX_NUM)printf("您输入的人数太多,大于d人!n",MAX_NUM);for(i=0;i<number;i+)printf("n 请输入第%d 个职工的编号:t",i+1);scanf("%d",&worki.ID);printf("t 职工档案:n");

26、printf("tt 姓名 :");scanf("%s",&worki.Name);printf("tt 出生年月 :");scanf("%s",&worki.Birth);printf("tt电话:");scanf("%s",&worki.Telenum);printf("tt性别:");scanf("%s",&worki.Sex);printf("tt工资:");scanf(&qu

27、ot;%d",&worki.Wage);printf("tt 部门:");scanf("%s",&worki.Department);printf("tt 职称:");scanf("%s",&worki.Job);printf("n 您的输入是:n");printf(*职工档案信息库*n");printf(" 序号 编号 姓名 出生年月t 性别 t 工资 t 部门 t 职称 n");for(i=0;i<number;i+)pr

28、intf(" %d %d %s %st%st%st%dt%st%sn",i+1,worki.ID,worki.Name,worki.Birth,worki.T elenum,worki.Sex,worki.Wage,worki.Department,worki.Job);printf("*printf("n");/* 查找函数 */ void search()system("cls");int number=MAX_NUM,findID,v,i;char findName30;printf("n 您选择的是档案查询

29、 !n");printf(" *请选择查询方式*n");printf("t t 1- 按编号查找;t t t t 2-按姓名查找n"); /* 以下可以修改为子菜单方式:1-按编号查找,2-按姓名查找 */ printf(" 请选择: ");scanf("%d",&v);printf("*switch(v) case 1:system("cls");printf("n 您选择的是按编号查找!n");printf("n 请输入职工的编号:

30、");scanf("%d",&findID);for(i=0;i<number;i+)if(worki.ID=findID)break;if(i<number)printf(" 查找结果如下:n");printf("t编号t姓名t出生年月t电话t性别t工资t部门t职称n");printf("t%dt%st%st%st %st%dt%st%sn",worki.ID,worki.Name,worki.Birth,worki.Telenum,worki.Sex,worki.Wag e,wor

31、ki.Department,worki.Job);else printf(" 您输入的编号不存在!n");break;case 2:system("cls");printf("n 您选择的是按姓名查找!n");printf("n 请输入职工的姓名 : ");scanf("%s",&findName);for(i=0;i<number;i+)if(!strcmp(worki.Name,findName)break;if(i<number)printf(" 查找结果如下

32、:n");printf("t编号t姓名t出生年月t电话t性别t工资t部门t职称n");printf("t%dt%st%st%st %st%dt%st%sn",worki.ID,worki.Name,worki.Birth,worki.Telenum,worki.Sex,worki.Wag e,worki.Department,worki.Job);else printf(" 您输入的姓名不存在!n");break;/* 输出函数 */void output()int i,number=MAX_NUM;system("

33、;cls");printf(" 查找结果如下:n");printf("t编号t姓名t出生年月t电话t性别t工资t部门t职称n");for(i=0;i<number;i+)printf("t%dt%st%st%st %st%dt%st%sn",worki.ID,worki.Name,worki.Birth,worki.Telenum,worki.Sex,worki.Wag e,worki.Department,worki.Job);void deletes()int findID,i,j,number=MAX_NUM;s

34、ystem("cls");printf("n 您选择的是档案删除!n");printf("n 请输入职工的编号: ");scanf("%d",&findID);for(i=0;i<number;i+)if(worki.ID=findID)break;printf("t编号t姓名t出生年月t电话t性别t工资t部门t职称n");if(i<number) for(j=i;j<number-1;j+)workj.ID=workj+1.ID;strcpy(workj.Name,w

35、orkj+1.Name);strcpy(workj.Telenum,workj+1.Telenum);strcpy(workj.Birth,workj+1.Birth);strcpy(workj.Sex,workj+1.Sex);workj.Wage=workj+1.Wage;strcpy(workj.Department,workj+1.Department);strcpy(workj.Job,workj+1.Job);for(i=0;i<number-1;i+)printf("t%dt%st%st%st %st%dt%st%sn",worki.ID,worki.N

36、ame,worki.Birth,worki.Telenum,worki.Sex,worki.Wag e,worki.Department,worki.Job);elsefor(i=0;i<number-1;i+)printf("t%dt%st%st%st %st%dt%st%sn",worki.ID,worki.Name,worki.Telenum,worki.Birth,worki.Sex,worki.Wag e,worki.Department,worki.Job);number-;/* 修改函数 */ void modify() int findID,i,num

37、ber=MAX_NUM; system("cls");char yz9,psw9="12345678"printf("n 您选择的是档案修改!n");while(1)printf("n 请输入密码!n");for(i=0;i<9;i+) yzi=getch();printf("*"); if(yzi='r') yzi='0' break; if(!strcmp(psw,yz) printf("n 密码正确 !n"); break; els

38、eprintf(" 密码错误,请重输 !n"); printf("n 请输入职工的编号: ");scanf("%d",&findID); for(i=0;i<number;i+) if(worki.ID=findID) break; if(i<number) printf("t 姓名 t 出生年月电话tt 性别 t 工资 t 部门 t 职称 n");printf("原档案:nt%dt%st%st %st%dt%st%sn",worki.Name,worki.Birth,wor

39、ki.Telenum,worki.Sex,worki.Wage,worki.D epartment,worki.Job); printf(" 请输入新档案:n ");printf("tt 姓名 :");scanf("%s",&worki.Name);printf("tt 出生年月 :");scanf("%s",&worki.Birth);printf("tt电话:");scanf("%s",&worki.Telenum);print

40、f("tt性别:");scanf("%s",&worki.Sex);printf("tt工资:");scanf("%d",&worki.Wage);printf("tt 部门:");scanf("%s",&worki.Department);printf("tt 职称:");scanf("%s",&worki.Job);printf("n 您的输入是:n");printf(*职工档案信

41、息库*n");13 / 17printf(" 序号 编号 姓名 出生年月t 性别 t 工资 t 部门 t 职称 n");for(i=0;i<number;i+)printf(" %d %d %s %st%st%st%dt%st%sn",i+1,worki.ID,worki.Name,worki.Birth,worki.Telenum,worki.Sex,worki.Wage,worki.Department,worki.Job); printf("n"); elseprintf("*printf("

42、 您输入的编号不存在 !n");/* 保存函数 */void save()FILE *fp;char filepnMAX_NUM;int number=MAX_NUM,i;system("cls");printf(" 您选择的是职工档案的保存!n");printf(" 请输入文件路径及文件名 :");scanf("%s",filepn);if(fp=fopen(filepn,"w+")=NULL)printf(" 不能打开文件!n");for (i=0;i<n

43、umber;i+)if (fwrite(&worki,sizeof(struct worker),1,fp)!=1)printf(" 写入文件错误!n");fclose(fp);printf(" 文件已经保存!n");/* 读取档案函数*/void read() FILE *fp;char filepnMAX_NUM;int number=MAX_NUM,i;system("cls");printf(" 您选择的是职工档案的读取!n");printf(" 请输入文件路径及文件名 :");

44、scanf("%s",filepn);/* 输入文件路径及名称*/if(fp=fopen(filepn,"r+")=NULL)printf(" 不能打开文件!n"); i=0;while(!feof(fp)fread(&worki+,sizeof(struct worker),1,fp);number=i-1;/* 排序函数 */ void sort() int i,j,n=MAX_NUM,s,v;char temp20;printf("n 您选择的是数据排序!n");printf(*请选择排序方式*n&q

45、uot;);printf("t t 1- 按编号排序;t t t t 2-按工资排序n"); /* 以下可以修改为子菜单方式:1-按编号排序,2-按工资排序 */printf("*printf(" 请选择: ");scanf("%d",&v);switch(v) case 1:for(i=0;i<=n;i+)for(j=i+1;j<=n;j+)if(workj.ID<worki.ID)strcpy(temp,worki.Birth);strcpy(worki.Birth,workj.Birth);s

46、trcpy(workj.Birth,temp);strcpy(temp,worki.Name);strcpy(worki.Name,workj.Name);strcpy(workj.Name,temp);strcpy(temp,worki.Sex);strcpy(worki.Sex,workj.Sex);strcpy(workj.Sex,temp);s=worki.Wage;worki.Wage=workj.Wage;workj.Wage=s;strcpy(temp,worki.Telenum);strcpy(worki.Telenum,workj.Telenum);strcpy(workj.

47、Telenum,temp);strcpy(temp,worki.Department);strcpy(worki.Department,workj.Department);strcpy(workj.Department,temp);strcpy(temp,worki.Job);strcpy(worki.Job,workj.Job);strcpy(workj.Job,temp);s=worki.ID;worki.ID=workj.ID;workj.ID=s;printf(" 新的排序如下:n");printf("t编号t姓名t出生年月t电话t性别t工资t部门t职称n

48、");for(i=0;i<n;i+)printf("t%dt%st%st%st %st%dt%st%sn",worki.ID,worki.Name,worki.Birth,worki.Telenum,worki.Sex,worki.Wag e,worki.Department,worki.Job);break ;case 2:int k;printf("n 您选择的是按工资排序!n");printf(*请选择排序方式*n");17 / 17printf("t t 1- 按工资从高到低排序;t t t t 2- 按工资从

49、低到高排序n"); /* 以下可以修改为子菜单方式:1-按工资从高到低排序;2-按工资从低到高排序*/printf("*printf(" 请选择: ");scanf("%d",&k);switch(k) case 1: for(i=0;i<=n;i+)for(j=i+1;j<=n;j+)if(worki.Wage<workj.Wage)strcpy(temp,worki.Birth);strcpy(worki.Birth,workj.Birth);strcpy(workj.Birth,temp);strcpy(temp,worki.Name);strcpy

温馨提示

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

评论

0/150

提交评论