版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、湖北医药学院信息管理与信息系统专业C程序设计课程设计报告题目:职工信息管理系统班级:学号:姓名:成绩:前言在理论学习和基础实验的基础上,开发规模较大的程序,掌握应用计算机解决实际问题的基本方法,熟悉C程序开发的全过程。本任务是根据给定的数据和程序,应用单向链表处理一个小班学生的信息。通过整个程序开发的过程,提高综合应用C语言的能力、编程和调试能力,为学习软件专业课程创建较扎实的理论基础和实践基础。一、系统功能和原始数据1、系统功能A. 建立学生信息表,录入10名学生的信息,并将结果保存在文件student1.txt中B. 显示所有学生信息C. 给定某学生的学号,删除该学生的信息D. 添加一名学
2、生的信息,将其插入到相应位置,使整个学生信息表按学号有序E. 给定某学生的学号,修改该学生的信息F. 按姓名查询学生信息G. 按入学成绩对学生的信息进行排序H. 计算并显示学生入学平均成绩,显示入学成绩最高分和最低分的学生信息I. 将最后的学生信息存入文件student2.txt中说明:1. 学生信息数据项:学号、姓名、性别、年龄、院系、入学成绩2. 录入学生信息时按学号由小到大的顺序录入3. 系统功能使用结构数组和单向链表两种方法实现工资管理系统功能模块图 开始以可读写的方式打开一个数据文件将此文件的内容读出,并存入一个新的结构体类型的数组中调用menu()菜单函数进入while(1)主循环
3、输入09中的一数值,选择相应操作输入是否为0判断键值,调用相应函数,完成相应功能是否已对修改进行了存盘调用save()函数,进行写数据文件操作结束2.原始数据工号姓名性别部门职位工资100米砂女公管学院学生500101米砾男公管学院学生500102罗斯女公管学院学生500103张满男公管学院学生500104林磊男公管学院学生500105胡水女公管学院学生500106王源女公管学院学生500107李君男公管学院学生500108张清女公管学院学生500109万羽女公管学院学生5003数据结构 本程序定义了结构体emplyee,用于存放职工的基本信息和工资信息。typedef struct empl
4、oyee /*标记为employee*/char num10;char name15;char sex;char charint gz;ZGGZ其各字段的值的含义如下。num10: 保存职工编号name 15:保存职工姓名sex:保存职工性别 :保存职工部门 :保存职工职称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中按职工编号或姓名查找满足条件的记录,并显示出来。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(); /按姓名查询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
12、0: 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;fflus
13、h(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) /比较输入工号和数组中已有工号c
14、hangeIndex=i; /保存要修改的人的下标break;printf(t工号t姓名t性别t部门t职能t工资n);printf(t%st%st%st%st%st%dnn,stchangeIndex.num,stchangeI,stchangeIndex.sex,stchangeIndex.department,stchangeIndex.function,stchangeIndex.wage);printf(请重新输入该职工信息);printf(工号:);scanf(%s,stchangeIndex.num);printf(姓名:);scanf(%s,stchangeIn
15、);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工号t姓名t性别t部门t职能t工资n);for(i=0;iwantNUmber;i+)printf(t%st%st%st%st%st%dnn,sti.num,,sti.sex,sti.departm
17、ent,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.sex,stm.dep
18、artment,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.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()/按姓名查找char name20;int i=0;
20、printf(请输入要查找职工姓名:);scanf(%s,name);system(cls);printf(t工号t姓名t性别t部门t职能t工资n);for (i=0;iNumber;i+)if (strcmp(name,)=0)printf(t%st%st%st%st%st%dnn,sti.num,,sti.sex,sti.department,sti.function,sti.wage);void select()/查看职工 int i=0;printf(以下是全部职工信息n);printf(t工号t姓名t性别t部门t职能t工资n);for(i=0;iNum
21、ber;i+)printf(t%st%st%st%st%st%dnn,sti.num,,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 姓名 性别 部门 职称 工资n);void printe(Node *p)/* 本函数用于打印链表中某个节点的数据内容 */printf(%-12s%st%st%st%st%st %dn,p-data.num,,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
24、(nameornum,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) /* 按姓名查询 */r=l-next;while(r!=NULL)if(strcmp(,findmess)=0) /*若找到findmess值的职工姓名*/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) /输入
26、0,跳出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(请你输入姓名:);scanf(%s,p-data.nam
27、e);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
28、Add增加结束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按姓名删除n);scanf(%d,&sel);if(sel=1) /按工号删除printf(请你输入要删除的工号:);scanf(%s,findmess);p=Locate(l,findmess,num);if(p)r=l;while(r-next!
29、=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) /按姓名删除printf(请你输入要删除的姓名:);scanf(%s,findmess);p=Locate(l,findmess,name);if(p)r=l;while(r-next!=p)r=r-next;r-next=p-next; /r r-nex
30、t(p) p-nextfree(p);printf(n=提示:该职工已经成功删除!n);saveflag=1;elseNofind(); /if(sel=2)elseWrong(); /显示输入错误的话 /void Del删除结束void Qur(Link l) /查询功能int sel; /*1:按工号查询,2:按姓名查询,其它:返回主界面(菜单)*/char findmess20;Node *p; /实现查询操作的临时的结构体指针变量if(!l-next)printf(n=提示:没有资料可以查询!n);return;printf(n=1按工号查找n=2按姓名查找n);scanf(%d,&s
31、el);if(sel=1)/* 工号 */printf(请你输入要查找的工号:);scanf(%s,findmess);p=Locate(l,findmess,num);if(p)printf(tttt查找结果n);printstart(); /打印横线printc(); /打印信息printc(p); /打印p结点各个数据成员的值printstart(); /打印横线elseNofind(); /if(sel=1)else if(sel=2) /* 姓名 */printf(请你输入要查找的姓名:);scanf(%s,findmess);p=Locate(l,findmess,name);if
32、(p)printf(tttt查找结果n);printstart();printc();printc(p);printstart();elseNofind();elseWrong(); /void Qur查询结束void Modify(Link l) /修改功能Node *p;char findmess20;if(!l-next)printf(n=提示:没有资料可以修改!n);return;printf(请你输入要修改的职工工号:);scanf(%s,findmess);p=Locate(l,findmess,num);if(p)printf(请你输入新工号(原来是%s):,p-data.num
33、);scanf(%s,p-data.num);printf(请你输入新姓名(原来是%s):,);scanf(%s,);getchar();printf(请你输入新性别(原来是%s):,p-data.xb);scanf(%s,p-data.xb);getchar();printf(请你输入新的部门(原来是%s):,p-data.bm);scanf(%s,&p-data.bm);printf(请你输入新的职称(原来是%s):,p-data.zc);scanf(%s,&p-data.zc);getchar();printf(请你输入新的工资(原来是%d):
34、,p-data.gz);scanf(%d,&p-data.gz);printf(n=提示:资料修改成功!n);/shoudsave=1;elseNofind(); /if(p)结束 /void Modify(Link l) /修改功能结束/插入记录:按工号查询到要插入的节点的位置,然后在该工号之后插入一个新节点。void Insert(Link l)Node *s,*r,*p; /*p指向插入位置,p指新插入记录节点*/char ch,new_num10,old_num10;/old_num保存插入点位置之前的工号,new_num保存输入的新记录的工号int flag=0;s=l-next;s
35、ystem(cls);Disp(l);while(1)/stringinput(s,10,please input insert location after the Number:);printf(请你输入已存在的工号(以0返回上一级菜单:);scanf(%s,old_num);if(strcmp(old_num,0)=0) /输入0,跳出while(1),即跳出Insert()函数return;s=l-next; /作用? 每次从第一个节点开始找flag=0;while(s) /*查询该工号是否存在,flag=1表示该工号存在*/if(strcmp(s-data.num,old_num)=
36、0)flag=1;break;s=s-next;if(flag=1)break; /*若工号存在,则进行插入之前的新记录的输入操作*/elsegetchar();printf(n=The number %s is not existing,try again?(y/n):,old_num);scanf(%c,&ch);if(ch=y|ch=Y)continue;elsereturn; /回主菜单/while(1)/*以下新记录的插入新节点,工号不能跟已存在的工号相同,操作与Add()相同*/printf(请你输入待插入的工号(以0返回上一级菜单:);scanf(%s,new_num);if(s
37、trcmp(new_num,0)=0) /输入0,跳出while(1),即跳出add()函数return;s=l-next; /作用? 每次从第一个节点开始找,看num是否重复。while(s) /工号重复时,返回主菜单if(strcmp(s-data.num,new_num)=0)printf(=提示:工号为%s的已经职工存在!n,new_num);flag=1;return ;s=s-next; /while(s)p=(Node *)malloc(sizeof(Node);if(!p)printf(n allocate memory failure ); /*如没有申请到,打印提示信息*/return ; /*返回主界面*/strcpy(p-data.num,n
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年低压电工职业资格证考试卷及答案(十)
- 2026春季学期国家开放大学专科《高等数学基础》一平台在线形考形考任务二试题及答案
- 2026年妇产科羊水过少患者诊断与护理课件
- 科技革新赢在未来-科研合作拓展
- 企业引领海洋气候应对-风险防控与可持续发展策略
- 高中数学趣味性教学策略探析
- 潜在业务需求分析与探讨邀请函(8篇范文)
- 建筑企业质量管理体系与安全管理手册
- 企业融资透明承诺书(8篇)
- 客户服务投诉处理及改进措施清单
- 中信建投证券2026届金融科技专场春季校园招聘备考题库含答案详解(基础题)
- 长沙理工大学招聘考试试题
- 2026年国测模拟测试初中劳动试题
- (正式版)DB37∕T 4976-2025 《河湖生态产品价值核算技术规范》
- 人教版初中物理八年级下册《功和机械能》大单元教学设计
- JJG196-2023常用玻璃量器检定规程【关键要点与实操解读】
- 装配式住宅建筑检测技术标准JGJ-T485-2019
- 2026大学生国家安全知识竞赛试题及答案
- 冲击地压基础知识课件
- 2025天津市西青经开区投资促进有限公司第二批次招聘3人考试笔试参考题库及答案解析
- 儿童期慢性肉芽肿病护理查房
评论
0/150
提交评论