1、要求:职工信息包括职工号,姓名,性别,年龄,学历,工资,住址,电话等(职工号不相等)。试设计一职工信息管理系统,使之能够提供下列功能:(1)系统以菜单方式工作 (2)职工信息录入功能(职工信息用文件保存) (3)职工信息浏览功能 (4)职工信息查询功能,查询方式: 1)按学历查询 2)按职工号查询 (5)职工信息删除,修改功能(可选项)。思路:(1)录入并向文件里保存数据的实现思路:C语言并没有提供由键盘输入数据直接录入文件的功能,只有内存变量向文件写入数据的功能,而由键盘输入数据可以到内存变量,因此实现此部分功能时,应当由键盘将数据放入变量,再由变量写入文件。这里录入要求不采用书上例子,它是
2、用结构体数组,我们要求只用一个结构体实现。先将一个人的信息放入结构体,将这个结构体数据写入文件后,再将下一个人的信息继续放在这个结构体中,再将这个结构体写入文件。这样节省内存空间。计算并修改文件里数据的实现思路:这部分的功能的实现应当先将文件的数据读到变量当中,在变量当中完成计算,再将数据写入文件。如果只是修改文件的数据,并不计算,则可以直接定位到文件中相应的位置,写入数据,则把原来的数据覆盖以完成修改。(2)向文件里追加数据的实现思路:文件本身提供了这项功能,只要以 “a”的方式打开就行。然后向文件写入的数据,直接放在文件末尾。(3)查找文件里是否有某项数据的实现思路:C语言并没有提供判断文
3、件内容的功能,必须将文件内容读到变量里再进行判断。实际的查找可能是在大量的数据里的查找,高效的查找是折半查找(下学期的数据结构专门讲这一内容),折半的前提是排序,因此需先对排序后的文件读出,以折半方式查找。(这要要求,是希望巩固折半查找与排序两个重要算法,至于它的时空效率是否高,可以学完数据结构知识后自己再判断)。(4)根据要求显示文件里的某些数据或全部数据的实现思路:C语言没有提供将文件内容显示的功能,所以需要将文件内容读到变量里,再显示变量。(5)在文件里插入或删除某项数据的实现思路:C语言同样没有直接提供该项功能,因此必须借由内存变量完成。由以前的知识知道,在大量的数据里删除一个数,用数
4、组表示不合适,因为涉及到大量的数据的移动,用链表是合适的,效率高(关于这一点,在数据结构这门课有详细的讲解)。因此完成这部分操作要求用链表实现,先将文件里的数据读出组织成链表,在链表上完成插入与删除后,再将链表中的数据写入文件。(6)按某个数据项进行排序生成排序文件的实现思路:排序是在数组里实现。因此先要将文件里的数据读到数组里,将数组排完序后,再将数据写入文件(一般写入一个新文件)。四【上机调试程序流程图】1.显示主菜单(以如下程序作为介绍)2.添加职工信息3.浏览职工信息。4.查询职工信息。4(1)根据标号查询职工信息。(2)根据姓名查询职工信息。(3)根据年龄查询职工信息。5.修改职工信
5、息。浏览修改后的职工信息。6.删除职工信息。浏览删除后的职工信息。7.用链表添加职工信息。浏览添加后的职工信息。五【上机调试中出现的错误信息、错误原因及解决办法】1.光条菜单的错误:刚开始只能用键盘上的英文字母控制光条上下移动,想用上下箭头的ASCII代码,结果错误不能上下移动解决方法:使用键盘扫描码。2、浏览函数 scan()在调试和链接的时候都没有出现错误提示,但在运行的时候出现了问题。写入指定位置的文件,打开后总会有乱码。与c语言课本上的例题对照后发现,我写的fopen(wenjian,ab)没有指定文件的存储类型。在文件名wenjian后面加上.txt后即可。3.浏览函数scan()遇
6、到的问题虽然不大,但解决起来很麻烦。理想的运行结果是美观整齐。即下面的职工信息分别与第一个printf输出的中文项目提示对齐。不断修改空格个数,不断运行察看效果。4.程序运行后菜单界面不消失使用清屏函数,是每次运行后界面还原。5.功能函数运行完后会跳出界面,直接退出。在每个功能函数的后面加如返回值。六【上机调试后的源程序及还存在的问题】源程序:#includestdio.() *清屏* int i,j; gotoxy(1,1); textbackground(RED); for(i=1;i=25;i+) for(j=1;j=80;j+) cprintf( ); clrscr();void In
7、itial() *定义初始化程序的函数* char list720=1. Add, *菜单名* 2. Scan,3. Edit4. Modify5. Delete6. Into7. Exit; cleanscreen(); textbackground(YELLOW);=14;i+) *画窗口* if (i=1|i=14|j=79) cprintf( else if (i=3&=12&j=5&=76) else printf( gotoxy(32,4); textcolor(BLACK); cprintf(W E L C O M E ! gotoxy(31,14);Worker System
8、- BY GK for(i=0;7;i+) *显示菜单* gotoxy(34,i+6); cprintf(%s,listi);void PrintPause() *暂停* printf(Press any key to go on . . . getch();void Guangtiao(int flag) *定义画光条的函数* gotoxy(34,flag+5); textcolor(WHITE); textbackground(BLACK);,listflag-1); textcolor(LIGHTGRAY);int Add() *添加信息* WORKERBASIC new; FILE *
9、fp=NULL; char ch=y; while(ch= cleanscreen(); printf(Please input the workers No. scanf(%d,&new.No); getchar();s age:new.age);s name:,new.name); if(fp=fopen(wenjian.txt)=NULL) fp=fopen(wb if(fwrite(&new,sizeof(WORKERBASIC),1,fp)!=1) printf(add failed!n PrintPause(); fclose(fp);whether go on(y or n):%
10、cch); return 0;int Scan() *查看信息* WORKERBASIC load; int n=0; if(fp=fopen(rbcan not find wenjian! PrintPause(); return 0;-nNo.tworkersagetworkernamen while(!feof(fp) if (fread(&load,sizeof(WORKERBASIC),1,fp)=1) n+; else break;%dt%dtt%sn,load.No,load.age,load.name);total:%dn,n); fclose(fp); PrintPause(
11、);void exchange(WORKERBASIC *max,WORKERBASIC *min) *调换两个职工在数组中的位置* WORKERBASIC t; strcpy(t.name,max-name); t.No=max-No; strcpy(max-name,min- max-No=min- strcpy(min-name,t.name); min-No=t.No;int EditByNo(WORKERBASIC *F1,int n) *按编号查找* int i,j,k,num,-1;i+) *排序* k=i; for(j=i+1;n; if (F1+k*sizeof(WORKER
12、BASIC)-No) (F1+j*sizeof(WORKERBASIC)-No) k=j; if (k!=i) exchange(F1+i*sizeof(WORKERBASIC),(F1+k*sizeof(WORKERBASIC); *此显示信息只为说明职工已按编号排序,该部分可删除*agettworker%dt%dttt%sn,(F1+i*sizeof(WORKERBASIC)-No,(F1+i*sizeof(WORKERBASIC)-age, (F1+i*sizeof(WORKERBASIC)-nPlease input a number you want to search: scanf
13、(num); getchar(); low=0; *折半法* -1; while(lowNo,(F1+mid*sizeof(WORKERBASIC)- (F1+mid*sizeof(WORKERBASIC)-int EditByName(WORKERBASIC *F1,int n) *按姓名查找* char str20; int i,j,k,flag=0,low,-1; if (strcmp( (F1+k*sizeof(WORKERBASIC)-name, (F1+j*sizeof(WORKERBASIC)-name )0) *此显示信息只为说明职工已按名字排序,该部分可删除*nPlease
14、input a worker you want to exactly search:,str); *折半法*No,age,(F1+mid*sizeof(WORKERBASIC)-int EditByage(WORKERBASIC *F1,int n) *按年龄查找* int a,flag=0,i;nPlease input workerage:a); if (a=(F1+i*sizeof(WORKERBASIC)-age) if(flag=0) flag=1; (F1+i*sizeof(WORKERBASIC)- if (flag=0)can not find the worker!int E
15、dit() *查找* WORKERBASIC load,*F1; int n=0,key=0,i; if (fp=fopen()=NULL) feof(fp) *统计职工的数量*load,sizeof(WORKERBASIC),1,fp)=1) if (n=0)No information of worker! F1=(WORKERBASIC *)malloc(n*sizeof(WORKERBASIC); *按职工的人数申请内存空间* fp=fopen( if (fread(F1+i*sizeof(WORKERBASIC),sizeof(WORKERBASIC),1,fp)!read fail
16、ed! return 0; while(key!=ESC) clrscr();Please select search method:1t=By No.n2t=By Name.n3t=By age.nEsct=ExitnPress 1 2 3 or Esc? key=getch(); switch(key) case 1: key=EditByNo(F1,n); break;2 key=EditByName(F1,n);3 key=EditByage(F1,n); free(F1);int Modify() *修改* WORKER *(); load=(WORKER *)malloc(size
17、of(WORKER); load=(WORKER *)malloc(sizeof(WORKER); t-next=load; if (fread(load,sizeof(WORKERBASIC),1,fp)! t=load; t-next=NULL;*创建链表完成* t=();nWhich worker do you want to modify?Please input the No. age. or name: num=atoi(str); *把字符串转换为长整型数* if (strcmp(t-workerinfo.name,str)=0)|(num=t-workerinfo.No)|(num=t-workerinfo.age)nPlease input the new No. t-workerinfo.No);nPlease input the new age. workerinfo.age);nPlease input the new name:,t-workerinfo.name);Modify S
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1