1、C语言课程设计报告职工管理目 录第1章 课题概述(课题介绍、) 11.1 课题的目的 11.2 课题的要求 11.2.1 输入输出的要求 11.2.2 程序所要实现的功能 1第2章 设计思路(概要设计、总体设计、) 22.1 存储结构的确定 22.2 程序流程图 2第3章 程序实现 33.1 存储结构与方式 33.2 程序中各函数分析 3第4章 问题与解决 15第5章 程序测试 16第6章 总 结 22参考文献 23第1章 课题概述(课题介绍、)1.1 课题的目的课程设计题目:职工信息管理程序;要求设计一个程序,能够对输入的职工信息进行修改、删除、查询、排序等功能。各功能以菜单方式列出,由用户
2、进行选择。1.2 课题的要求1.2.1 输入输出的要求(1)输入的职工信息以文件形式保存;(2)输出时以职工号和工资排序;1.2.2 程序所要实现的功能程序需要实现的功能有:(1)职工信息的录入功能(职工信息用文件 Workers.dat保存);(2)职工信息的删除、修改功能;(3)职工信息浏览功能;(4)按职工号和姓名查询的功能;(5)按职工号和资排序的功能;(6)各功能以菜单方式列出,由用户进行选择。第2章 设计思路(概要设计、总体设计、)2.1 存储结构的确定课题要求职工信息以文件形式保存,存储结构确定为结构体数组。成员分别包括职工号、姓名、性别、年龄、学历、工资、住址电话等。2.2 程
3、序流程图整个程序的流程如图2-1所示。图2-1第3章 程序实现3.1 存储结构与方式在程序运行时,文件以结构体数组的方式存储在内存中,再以文件形式保存到硬盘。struct employee /*定义结构体*/ int number; /*职工号*/ int age; /*年龄*/ int wage; /*工资*/ char name20,sex10,address30,xueli20; /*姓名、性别、地址、学历*/ long int telephone; /*电话*/emN; FILE *fp; /*打开文件*/ if(fp=fopen(Workers.txt,ab+)=NULL) prin
4、tf(不能打开该文件:n); exit(1); 3.2 程序中各函数分析表3-1 程序中的函数列表函数名函数功能main()主函数search()选择查找方式search_name()查找姓名search_number()查找职工号display()显示职工信息del()删除职工信息input()输入职工信息change()修改职工信息sortNumber()按职工号对职工进行排序sortWage()按工资对职工进行排序(1) main()显示系统工作菜单,罗列该系统所有功能。先声明所有将会调用到的函数名。再运用选择函数switch即可根据使用者所输入的功能代号进入对应的功能程序。同时通过对文
5、件数据的读取,获得当前文件中的职工个数。main() /*函数申明,已省略*/ int k; int i; int n; FILE *fp; if(fp=fopen(Workers.txt,ab+)=NULL) /*打开方式选择“ab+”,当文件不存在时,可创建文件*/ printf(不能打开该文件:n); exit(1); for(i=0;i=N;i+)/*“i”为读取出的人数*/ if(fread(&emi,sizeof(emi),1,fp)=0)/*当读取后的返回值是“0”则读取结束*/ break; people=i;/*当读取结束后将代表当前人数的“i”赋值给人数“people”*/
6、*输出菜单,已省略*/ scanf(%d,&n); switch(n)/*选择功能*/ case 1:printf( 输入职工信息n);printf(n);k=input();main();break; case 2:printf( 浏览职工信息n);printf(n);display();main();break; case 3:printf( 查询职工信息n);printf(n);search();break; case 4:printf( 删除职工信息n);printf(n);del();break; case 5:printf( 修改职工信息n);printf(n);change();
7、break; case 6:printf( 按职工号排序n);printf(n);sortNumber();break; case 7:printf( 按工资排序n);printf(n);sortWage();break; case 8:exit(0);break; default :break; (2)search()该函数的功能是输出查找菜单,选择查找方式。void search() int t; printf(n按职工号查询按1n按姓名查询请按2); printf(n返回主菜单请按3n); scanf(%d,&t); switch(t) case 1: printf(n按职工号查询n);
8、 search_number(); break; case 2: printf(n按姓名查询n); search_name(); break; case 3:main();break; default : printf(输入错误,请重新输入!n); search(); break; (2) search_name()查找姓名。定义字符串数组“name20”,输入想要查找的姓名,赋值给“name”。用for循环将“name”中的字符串与结构体数组中的成员“name”进行比较。如相同,则输出该成员所在的结构体数组;如比较完毕还未找到相同项,则输出“查无此人”void search_name() i
9、nt i; char name20; /*打开文件,已省略*/ printf(n请输入要查询的姓名:); scanf(%s,name); for(i=0;ipeople;i+)/*从“em0.name”开始查找*/ if(!strcmp(emi.name,name) /*查找相同项*/ printf(n该职工信息如下:n); printf(n职工号t 姓名t性别t年龄t 学历t 工资t 住址t 电话n); printf(n%dt%8st%st%dt%8st%dt%st%dn,emi.number,emi.name,emi.sex,emi.age,emi.xueli,emi.wage,emi.a
10、ddress,emi.telephone); printf(n); break; if(i=people) /*当“i”值等于当前人数时,即没有相同项*/ printf(n查无此人n); fclose(fp); search(); (3) search_number()查找职工号,与“查找姓名”功能类似,原理类似。(4) display()显示。显示文件中的职工信息,用for循环输出。原理较简单,不在此处详述。(5) del()删除。先通过用户输入,确定要删除的员工的姓名。用for循环查找此人。用此人所在的结构体数组的后一个结构体数组替代此人所在的结构体数组,以此类推,将职工信息删除。void
11、 del() int i,t,j,m,l; char name20; /*打开文件,已省略*/ printf(n所有职工信息:n); display(people); printf(n请输入要删除职工的名字:); scanf(%s,name); for(i=0;ipeople;i+) if(!strcmp(emi.name,name) /*查找*/ printf(n确认删除请按1n取消请按2n); scanf(%d,&t); if(t=1) for(j=i;jpeople;j+) /*从此所错在结构体数组开始删除*/ emj.age=emj+1.age; emj.wage=emj+1.wage
12、; emj.number=emj+1.number; emj.telephone=emj+1.telephone; strcpy(emj.xueli,emj+1.xueli); strcpy(emj.name,emj+1.name); strcpy(emj.address,emj+1.address); strcpy(emj.sex,emj+1.sex); people-; /*删除后,人数减少,故“people”执行自减*/ for(l=0;lpeople;l+) fwrite(&eml, sizeof(eml), 1, fp); break; if(t=2) break; if(j=peo
13、ple) printf(n输入错误,无此人n); fclose(fp); printf(n继续删除请按1n浏览信息请按2n返回主菜单请按3n); scanf(%d,&m); switch(m) case 1:del(people);break; case 2:display(people);main();break; case 3:main();break; default:break; (6) input()录入职工信息。用scanf输入职工信息,用fwrite保存到文件。int input() FILE *fp; /*打开文件,已省略*/ fflush(stdin); printf(请输入
14、职工号: ); scanf(%d,&empeople.number); fflush(stdin); printf(请输入姓名: ); scanf(%s,empeople.name); fflush(stdin); printf(请输入性别: ); scanf(%s,&empeople.sex); fflush(stdin); printf(请输入年龄: ); scanf(%d,&empeople.age); fflush(stdin); printf(请输入学历: ); scanf(%s,empeople.xueli); fflush(stdin); printf(请输入工资: ); sca
15、nf(%d,&empeople.wage); fflush(stdin); printf(请输入住址: ); scanf(%s,empeople.address); fflush(stdin); printf(请输入电话: ); scanf(%d,&empeople.telephone); fflush(stdin); printf(n); printf(输入成功!n); fwrite(&empeople,sizeof( struct employee),1,fp); fclose(fp); people+; /*每录入一次,员工人数加1,故“people”执行自增*/ return peop
16、le; /*将“people”返回,更新员工个数*/ (7) change()修改职工信息。用“scanf”语句输入想要修改的职工姓名,查找该员工。再查找到该员工后,通过“switch”语句选择要修改的职工信息,用赋值语句将要修改的职工信息赋值到原职工信息。/*修改*/void change() int num; char name10; char sex; int age; char xueli30; int wage; char addr30; long int tel; int i,t,n,k; /*打开文件,已省略*/ printf(n 原来的职工信息:n); display(peop
17、le); printf(输入想要更改信息的员工名字:n); scanf(%s,&name); for(i=0;i8|t1) printf(输入错误,请输入18之间的任意整数!n); switch (t) /*将新信息赋值给旧信息以实现修改*/ case 1:printf(职工号改为: ); scanf(%d,&num); emi.number=num; break; case 2:printf(姓名改为: ); scanf(%s,name); strcpy(emi.name,name); break; case 3:printf(性别改为: ); scanf(%s,&sex); strcpy(
18、emi.name,name); break; case 4:printf(年龄改为: ); scanf(%d,&age); emi.age=age; break; case 5:printf(学历改为: ); scanf(%s,xueli); strcpy(emi.xueli,xueli); break; case 6:printf(工资改为: ); scanf(%d,&wage); emi.age=age; break; case 7:printf(住址改为: ); scanf(%s,addr); strcpy(emi.address,addr); break; case 8:printf(
19、电话改为: ); scanf(%ld,&tel); emi.telephone=tel; break; printf(n是否确定所修改的信息?n 是 请按1 ; 不,重新修改 请按2: n); scanf(%d,&k); if (k=1) /*保存信息*/ for(i=0;ipeople;i+) fwrite(&emi, sizeof(emi), 1, fp); fclose(fp); else change(); if(i=people) printf(n查无此人n); main();(8) sortNumber()按职工号排序。排序方式选择冒泡排序法。void sortNumber() i
20、nt i,j; struct employee p; /*打开文件,已省略*/for(i=0;ipeople;i+) /*冒泡排序*/ for(j=0;ji+1;j+) if(emi.numberemj.number) p=emi; emi=emj; emj=p; printf(n职工号t 姓名t性别t年龄t 学历t 工资t 住址t 电话n); for(i=0;ipeople;i+) printf(n%dt%8st%st%dt%8st%dt%st%dn,emi.number,emi.name,emi.sex,emi.age,emi.xueli,emi.wage,emi.address,emi.
21、telephone); printf(n); fclose(fp); main();(9) sortWage()按工资排序,与“sortNumber()”函数类似。第4章 问题与解决编写程序的过程中遇到了很多问题,但是通过询问老师和与同组同学讨论都一一解决了,这些问题主要是以下几种类别:一、程序编写时遇到的问题与解决没有编写类似教复杂的程序的经验,先前都是做的一些小功能。虽然单个功能的编写不会有太大问题,但将他们组合在一起时有种无从下手的感觉。在经过老师的和参考网上的类似程序,终于将程序完成。在初次编写时,使用了多个全局变量,导致在程序实现的过程中出现了多个问题,数次修改无果,询问老师后,老师
22、给的建议是,尽量少用全局变量。经过修改后,程序思路变得清晰了,错误也解决了。二、程序实现时遇到的问题Q1:程序关闭后再次运行时,上次输入的数据无法读取;A1:这个问题研究了很久,始终被禁锢在原本的思路中,跳不出来。初步认为数据并没有保存到文件。手动打开文件,发现文件中存在数据,但并不是以正确的方式保存。在询问了老师后,老师教了我一种方法,在主函数中增加一端代码,在程序运行时能够读取文件中的人数,之后保存正确,程序再次运行时也读取正确。Q2:程序的修改功能是采用将新信息赋值给旧信息的方法,在赋值语句中,出现过编译错误;A2:开始的时候为了这个问题十分头痛,不知道该怎么办才好,不管是翻阅参考书还是
23、上网搜索资料,都找不到合适的方式,后来在仔细分析程序后,发现结构体数组中的成员类型不同,而我都是用strcpy语句进行赋值,故出现错误;第5章 程序测试图6-1 程序主菜单图6-2 输入界面图6-3 输入界面图6-4 浏览界面图6-5 查询图6-6 查询图6-7 删除图6-8 删除图6-9 修改图6-10 修改图6-11 排序图6-12 排序第6章 总 结经过一学年的C语言学习,我们掌握了C语言的基础知识,能够读懂别人用c语言设计的程序。平时的程序设计大多是以填空、纠错的形式出现,做的编程题也都是一些小程序。而这一周的课程设计,却让我们完完全全用自己学到的知识编写一个完整的体统程序。这是一个新
24、的挑战,也是一种新的学习。我选择的是职工信息管理系统。这需要我们自己设计一个系统,可以输入信息,保存到文件里,再从文件里调出来,使之显示在屏幕上,进行删除、添加等对信息的修改。初看到这个题目觉得很简单,但当我做到电脑前准备开始编写代码的时候才发现无从下手。通过去图书馆查找程序设计相关的书籍,和上网参考前人编写的类似程序,我脑中才有了一个大概方向。在这次课程设计的过程中,我运用了老师交给我们的方法:先将一个个的小功能编写出来,再将他们串联起来,组合成一个程序。初步串联起来后会有各种奇怪的问题出现。在理清楚了整个程序的思路后,一点一点仔细修改,慢慢的程序中的错误越来越少,随着程序运行的成功,预示着我们的职工信息管理系统大功告成!总之,经过这一次的课程设计,我们体会到了痛苦与快乐同存的感觉。当最后一次成功串联运行所有函数时,真的很
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1