1、. .XX医药学院信息管理与信息系统专业C程序设计课程设计报告题目:职工信息管理系统班级:学号:XX:成绩:前言在理论学习和基础实验的基础上,开发规模较大的程序,掌握应用计算机解决实际问题的基本方法,熟悉C程序开发的全过程。本任务是根据给定的数据和程序,应用单向链表处理一个小班学生的信息。通过整个程序开发的过程,提高综合应用C语言的能力、编程和调试能力,为学习软件专业课程创建较扎实的理论基础和实践基础。一、系统功能和原始数据1、系统功能A. 建立学生信息表,录入10名学生的信息,并将结果保存在文件student1.txt中B. 显示所有学生信息C. 给定某学生的学号,删除该学生的信息D. 添加
2、一名学生的信息,将其插入到相应位置,使整个学生信息表按学号有序E. 给定某学生的学号,修改该学生的信息F. 按XX查询学生信息G. 按入学成绩对学生的信息进行排序H. 计算并显示学生入学平均成绩,显示入学成绩最高分和最低分的学生信息I. 将最后的学生信息存入文件student2.txt中说明:1. 学生信息数据项:学号、XX、性别、年龄、院系、入学成绩2. 录入学生信息时按学号由小到大的顺序录入3. 系统功能使用结构数组和单向链表两种方法实现工资管理系统功能模块图开始以可读写的方式打开一个数据文件将此文件的内容读出,并存入一个新的结构体类型的数组中调用menu()菜单函数进入while(1)主
3、循环输入09中的一数值,选择相应操作输入是否为0判断键值,调用相应函数,完成相应功能是否已对修改进行了存盘调用save()函数,进行写数据文件操作结束2.原始数据工号XX性别部门职位工资100米砂女公管学院学生500101米砾男公管学院学生500102罗斯女公管学院学生500103X满男公管学院学生500104林磊男公管学院学生500105胡水女公管学院学生500106王源女公管学院学生500107李君男公管学院学生500108X清女公管学院学生500109万羽女公管学院学生5003数据结构本程序定义了结构体emplyee,用于存放职工的基本信息和工资信息。typedef struct emp
4、loyee /*标记为employee*/char num10;char name15;char sex;char charint gz;ZGGZ其各字段的值的含义如下。num10: 保存职工编号name 15:保存职工XXsex:保存职工性别 :保存职工部门 :保存职工职称gz :保存职工工资二、程序设计1、建立职工信息结构体(1)函数原型、功能和形参说明1)、printheader()函数原型:void printheader()printheader()函数用于在以表格形式显示记录时,打印输出表头信息。2)、printdata()函数原型:void printdata(ZGGZ pp)p
5、rintdata()函数用于以表格显示的方式,打印输出单个数组元素pp中的记录信息。3)、Disp()函数原型:void Disp(ZGGZ tp,int n)Disp()函数用于显示tp数组中存储的n条记录,内容为emplyee结构中定义的内容。4)、numberinput()函数原型:float numberinput(char *notice)numberinput()函数用于输入数值型数据,notice用于保存printf()中输出的提示信息。该函数返回用户输入的浮点类型数据值。5)、Stringinput()函数原型:void Stringinput(char *t,int lens
6、,char *notice)Stringinput()函数用于输入字符串,并进行字符串长度验证(长度lens),t用于保存输入的字符串,因为是以指针形式传递的,所以t相当于该函数的返回值。notice用于保存printf()中输出的信息。6)、Locate()函数原型:int Locate(ZGGZ tp,int n,char findmess,char nameornum)Locate()函数用于定位数组中符合要求的元素,并返回该数组元素的下标值。参数findmess保存要查找的具体内容,nameornum保存按什么字段在数组tp中查找。7)、Add()函数原型:int Add(ZGGZ t
7、p,int n)Add()函数用于在数组tp中增加工资记录元素,并返回数组中的当前记录数。8)、Qur()函数原型:void Qur(ZGGZ tp,int n)Qur()函数用于在数组tp中按职工编号或XX查找满足条件的记录,并显示出来。9)、Del()函数原型:int Del(ZGGZ tp,int n)Del()函数用于先在数组tp中找到满足条件的记录,然后删除该记录。10)、Modify()函数原型:void Modify(ZGGZ tp,int n)Modify()函数用于在数组tp中修改记录元素。11)、Insert()函数原型:int Insert(ZGGZ tp,int n)I
8、nsert()函数用于在数组tp中插入记录,并返回数组中的当前记录数。12)、Tongji()函数原型:void Tongji(ZGGZ tp,int n)Tongji()函数用于在数组tp中完成记录的统计工作,统计该公司职工工资的整体分布情况。13)、Sort()函数原型:void Sort(ZGGZ tp,int n)Sort()函数用于在数组tp中完成利用冒泡排序算法实现数组的按实发工资字段的降序排序。14)、save()函数原型:void Save(ZGGZ tp,int n)Save()函数用于将保存职工工资的数组tp中的n个元素写入磁盘的数据文件中。15)、主函数main()Mai
9、n()是整个工资管理系统控制部分(2)、程序清单#inclu#include #include #include struct employeechar num10;char name15;char sex5;char department30;char function32;int wage;int read_file(struct employee st);void menu();void write_file(struct employee st);void add(); void select(); /查看职工所有信息void name_query(); /按XX查询void num_
10、del(); /按工号删除void tongji(); /统计void sort(); /排序void num_modify(); /按工号修改职工信息void save(); /保存信息void fh(); /返回主菜单struct employee st300; /这个数组用来保存所有的职工信息 和文件里面的一致int Number=0; /记录总的职工人数 也就是数组/文件里面的职工人数void main() int choose=0; FILE *fp=NULL; char yesorno; if(fp=fopen(student1.txt,rb+)=NULL) printf(n=提示
11、:文件不存在,是否要创建一个?(y/n)n); scanf(%c,&yesorno); if(yesorno=y|yesorno=Y) /这里仅为了建立文件 fp=fopen(student1.txt,wb+);fclose(fp); /关闭fp所指的文件,释放文件缓冲区 else exit(0); else Number=read_file(st); /要是文件已经有数据 将数据初始化到数组中 system(cls); while(true) menu(); printf(tt=请选择:);scanf(%d,&choose);system(cls);switch(choose) case 0
12、: exit(0); /退出 break; case 1: add();fh();/增加职工信息break;case 2:select();fh();/查看职工信息break;case 3:name_query();fh();/ 查找break;case 4: num_del();fh();/删除break;case 5: tongji();fh();/统计break;case 6: sort();fh();/排序break;case 7:num_modify();fh();/修改后返回break;case 8:save();fh();/保存break;default:break;fflush
13、(stdin);getchar();system(cls);void save()printf(t=程序在运行时已自动保存.n);void fh()printf(t=按Enter键返回主菜单n);void num_modify() /修改职工信息FILE *fp=NULL;char xh60;int i=0;int changeIndex=0; /changeIndex 改变标记int index=0;printf(请输入要修改的职工编号:);scanf(%s,xh);for (i=0;iNumber;i+)if (strcmp(xh,sti.num)=0) /比较输入工号和数组中已有工号ch
14、angeIndex=i; /保存要修改的人的下标break;printf(t工号tXXt性别t部门t职能t工资n);printf(t%st%st%st%st%st%dnn,stchangeIndex.num,stchangeIndex.name,stchangeIndex.sex,stchangeIndex.department,stchangeIndex.function,stchangeIndex.wage);printf(请重新输入该职工信息);printf(工号:);scanf(%s,stchangeIndex.num);printf(XX:);scanf(%s,stchangeInd
15、ex.name);printf(性别:);scanf(%s,stchangeIndex.sex);printf(部门:);scanf(%s,stchangeIndex.department);printf(职能:);scanf(%s,stchangeIndex.function);printf(工资:);scanf(%d,&stchangeIndex.wage);/信息修改后重新更新文件里面的数据 以保持数据一致性fp=fopen(student1.txt,wb+);for (i=0;i修改成功n);void sort()/排序 struct student t;int wantNUmber=
16、0;int i=0;int j=0;int k=0;for(i=0;iNumber-1;i+)k=i;for(j=i+1;jstk.wage)k=j;if(k!=i)t=sti;sti=stk;stk=t;printf(你想输出前几名的成绩:);scanf(%d,&wantNUmber);if (wantNUmberNumber)wantNUmber=Number;printf(t工号tXXt性别t部门t职能t工资n);for(i=0;iwantNUmber;i+)printf(t%st%st%st%st%st%dnn,sti.num,sti.name,sti.sex,sti.departme
17、nt,sti.function,sti.wage); void tongji()/统计 int i,m,k,max,min;double sum=0.0;for(i=0;iNumber;i+)sum+=sti.wage;printf(总工资为:%fn,sum);printf(平均工资为:%fn,sum/Number);i=0;m=0;max=0;max=stm.wage;for(i=1;imax)m=i;max=stm.wage;printf(最高工资为:%dn,max);printf(t%st%st%st%st%st%dnn,stm.num,stm.name,stm.sex,stm.depa
18、rtment,stm.function,stm.wage);i=0;k=0;min=0;min=st0.wage;for(i=1;iNumber;i+)if (sti.wagemin)k=i;min=stk.wage;printf(最底工资分:%dn,min);printf(t%st%st%st%st%st%dnn,stk.num,stk.name,stk.sex,stk.department,stk.function,stk.wage);void num_del()/按工号删除 FILE *fp=NULL;char xh60;int i=0;int j=0;printf(请输入要删除的职工工
19、号:);scanf(%s,xh);for(i=0;iNumber;i+)if (strcmp(xh,sti.num)=0) /如果查找到就删除for (j=i;jNumber-1;j+)stj=stj+1;Number-;/将剩余数据写入文件 重新一写的方式打开文件 把以前的数据擦除了fp=fopen(student1.dat,wb);for (i=0;iNumber;i+)fwrite(&sti,sizeof(struct student),1,fp);fclose(fp);printf(删除成功;n);void name_query()/按XX查找char name20;int i=0;p
20、rintf(请输入要查找职工XX:);scanf(%s,name);system(cls);printf(t工号tXXt性别t部门t职能t工资n);for (i=0;iNumber;i+)if (strcmp(name,sti.name)=0)printf(t%st%st%st%st%st%dnn,sti.num,sti.name,sti.sex,sti.department,sti.function,sti.wage);void select()/查看职工int i=0;printf(以下是全部职工信息n);printf(t工号tXXt性别t部门t职能t工资n);for(i=0;iNumbe
21、r;i+)printf(t%st%st%st%st%st%dnn,sti.num,sti.name,sti.sex,sti.department,sti.function,sti.wage);void add()/增加职工int numberTemp=0;int i=0;struct student temp; /临时保存信息printf(请输入要增加职工个数:);scanf(%d,&numberTemp);for(i=0;inext; / l存储的是单链表中头结点的指针,该头结点没有存储职工学生信息,指针域指向的后继结点才有职工信息 if(!p) /*p=NULL,NUll在stdlib中定
22、义为0*/ printf(n=提示:没有职工记录可以显示!n);return; printf(tttt显示结果n);printstart(); /打印横线printc(); /打印职工信息printf(n);while(p) /逐条输出链表中存储的职工信息printe(p);p=p-next;printstart();printf(n); /void Disp结束void printstart()printf(-n);void Wrong()printf(n=提示:输入错误!n);void Nofind()printf(n=提示:没有找到该职工!n);void printc() /* 本函数用
23、于输出中文 */printf( 工号t XX 性别 部门 职称 工资n);void printe(Node *p)/* 本函数用于打印链表中某个节点的数据内容 */printf(%-12s%st%st%st%st%st %dn,p-data.num,p-data.name,p-data.xb,p-data.bm,p-data.zc,p-data.gz);/Locate(l,findmess,num);/* 该函数用于定位连表中符合要求的结点,并返回该指针 */Node* Locate(Link l,char findmess,char nameornum)Node *r;if(strcmp(n
24、ameornum,num)=0) /* 按工号查询 */r=l-next;while(r!=NULL)if(strcmp(r-data.num,findmess)=0) /*若找到findmess值的工号*/return r;r=r-next;else if(strcmp(nameornum,name)=0) /* 按XX查询 */r=l-next;while(r!=NULL)if(strcmp(r-data.name,findmess)=0) /*若找到findmess值的职工XX*/return r;r=r-next;return 0; /*若未找到,返回一个空指针*/add()函数中,无
25、节点时,r指向list头,有节点时,r指向末尾节点void Add(Link l) /* 增加职工 */Node *p,*r,*s; /*实现添加操作的临时的结构体指针变量*/char num10;int flag=0;r=l;s=l-next; /链表没有节点时,s=null;/链表有节点时,指向第一个职工节点while(r-next!=NULL) /如果存在后继结点时,r指针后移一个r=r-next; /*将指针移至于链表最末尾,准备添加记录*/while(1)printf(请你输入工号(以0返回上一级菜单:);scanf(%s,num);if(strcmp(num,0)=0) /输入0,
26、跳出while(1),即跳出add()函数break;s=l-next; /作用? 每次从第一个节点开始找,看num是否重复。while(s) /工号重复时,返回主菜单if(strcmp(s-data.num,num)=0)printf(=提示:工号为%s的职工已经存在,若要修改请你选择4 修改!n,num);flag=1;/break;return ;s=s-next; /while(s)p=(Node *)malloc(sizeof(Node); /生成没赋值的新节点 pstrcpy(p-data.num,num);printf(请你输入XX:);scanf(%s,p-data.name)
27、;getchar();printf(请你输入性别:);scanf(%s,p-data.xb);getchar();printf(请你输入部门:);scanf(%s,&p-data.bm);getchar();printf(请你输入职称:);scanf(%s,&p-data.zc);getchar();printf(请你输工资:);scanf(%d,&p-data.gz);getchar();/* 信息输入已经完成 */p-next=NULL; /*表明这是链表的尾部结点*/r-next=p; /*将新建的结点加入链表尾部中*/r=p;saveflag=1; /while(1) /void Ad
28、d增加结束void Del(Link l) /* 删除 */int sel;Node *p,*r; /*实现删除操作的临时的结构体指针变量*/char findmess20;if(!l-next) /当list无后继结点时,提示和结束返回del()printf(n=提示:没有记录可以删除!n);return;printf(n=1按工号删除n=2按XX删除n);scanf(%d,&sel);if(sel=1) /按工号删除printf(请你输入要删除的工号:);scanf(%s,findmess);p=Locate(l,findmess,num);if(p)r=l;while(r-next!=p)r=r-next; /从第一个结点找起,直到发现r-next=p, 是待删除结点,跳出循环r-next=p-next; /r r-next(p) p-nextfree(p);printf(n=提示:该职工已经成功删除!n);saveflag=1;elseNofind(); /显示一句话 /if(sel=1)else if(sel=2) /按XX删除printf(请你输入要删除的XX:);