版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、信息与电子工程学院C 语言课程设计语言课程设计职工信息管理系统设计实验日期和时间: 2011 年 06 月 27 日06 月 29 日实验类别:课程设计实验类型:设计性一、一、实验环境实验环境操作系统:windows xp编程工具:Microsoft Visual C+ 6.0开发环境:CPU(Inter(R)Core(TM)2 Quad cpu QB200 2.33GHz)内存:2.76GB硬盘:228.3GB开发地点:现代教育中心 201 机房 A17 座二、二、实验目的和要求实验目的和要求实验目的:(1)使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作算法。
2、(2)使学生进一步掌握程序设计、编写、调试能力。(3)使学生了解软件开发的基本步骤和内容。实验要求:完成一个职工信息管理系统程序,具体内容如下:(1)在内存中用链表记录,在硬盘上用二进制文件保存。(2)设计完的程序能够以命令行或者菜单形式增加、删除、更新和查询数据的内容。数据内容能够排序以方便查询。(3)数据库中应该有至少 20 条记录。三、实验内容和结果三、实验内容和结果(1)程序程序整体功能;整体功能;1 1、系统总体框、系统总体框菜单开始根 据 菜 单 输 入 n 的 值 选择程序结束是否继续进行NY2修改职工信息3浏览职工信息4分类查找职工信息5删除职工信息6从文件读取信息0退出1录入
3、职工信息按职工号查找按姓名查找2、模块设计、模块设计该程序主要分为 7 个模块,分别是创建与添加模块、显示模块、查找模块、修改模块、删除模块、存档模块、文件统计模块、退出模块(2)程序组成及各模块程序组成及各模块/函数功能;函数功能;创建与添加模块创建与添加模块:该模块的功能是输入职工信息。函数为 void Add(Node*woker)原理: 采用尾插法, 先建立链表与头结点, 新增一个结点, 键盘输入职工号、职工姓名、职工性别、职工出生年月、职工学历、职工职位、职工工资,将这些信息存储到新增结点中,将新增加的节点连到链表的尾端,如此以往,将尾结点的指针域置空,这样就得到了一条存储职工信息的
4、链表,这样就完成了职工信息的创建与增加。显示模块显示模块:该模块功能是显示职工信息。函数为 void Disp(Node *woker)原理:先新建一个指针 P 指向头结点,判断它的指针域是否为空,若为空,则输出“没有记录可以显示” ;若不为空,则输出它的指针域所指向节点所储存的职工信息,并将该指针向后移一个结点,直到 P 指向空,即输出了所有职工的信息,这样就完成了所有职工信息的显示。查找模块查找模块:该模块功能是查找职工信息。函数为 void Tongji(Node *woker)原理:该模块分为两种查找方法,分别是按职工号查找和按职工姓名查找,因为这两种查找方法雷同,所以这里将只解释按职
5、工号查找的原理。先键盘输入一个要查找的职工号并新建一个指针 P 指向头结点,判断它的指针域是否为空,若为空,则输出“没有资料可以统计分类” ,若不为空,则判断它的指针域所指向节点所储存的职工信息中的职工号, 若相等, 则输出这个职工的其他所有信息,并将 P 指向下一个结点,再次进行判断,直到 P 指向空,即输出了所有查找到的信息。若不相等,则 P 指向下一个结点,再次进行判断,直到 P 指向空,即输出了所有查找到的信息,这样就完成了职工信息的查找。修改模块修改模块 : 该模块功能是修改职工信息。 函数为 void change(Node *woker)原理:根据查找原理,查找到要修改信息的职工
6、,删除这一节点,并新建一个节点,键盘输入想要修改的内容,并储存到新的结点中,将新的节点连接到链表中原先删除结点的位子,这样就完成了职工信息的修改。删除模块删除模块:该模块功能是删除管理职工信息。函数为 void dismiss(Node*woker)根据查找的原理,查找到要修改信息的职工,删除这一节点,并将其前驱结点的指针域指向其后继结点,这样就完成了职工信息的删除。存档存档模块模块:将内存中的信息存储到文件中。函数为 void save(Node *woker)原理:打开文件,新建一个指针 P 指向头结点,判断它的指针域是否为空,若为空,则输出“无记录” ,若不为空,则将这个职工的所有信息输
7、入到文件中,并将 P 指向下一个结点,直到 P 指向空,即输入了的信息,文件统计模块文件统计模块:打开文件,统计职工数目,并输出。函数为 void load(Node*woker)退出退出模块:模块:该模块功能是退出管理档案。(3)重要数据结构,重要模块)重要数据结构,重要模块/函数算法;函数算法;1:创建与添加模块:void Add(Node *woker)/添加记录Node *p,*r,*s;char n10;/先用于输入职工号,也用于判断是否跳出循环r=woker;s=woker-next;/使 s 为第一个有用的结点while(r-next!=NULL)/这个循环的作用是使 r 为最后
8、一个有用的结点r=r-next;/将指针置于最末尾while(1)printf(提示:输入 0 则返回主菜单!n);printf(n 请你输入职工号:);scanf(%s,n);if(strcmp(n,0)=0)break;p=(Node *)malloc(sizeof(Node);/申请空间strcpy(p-data.num,n);printf(n 请输入姓名:);scanf(%s,);printf(n 请输入性别:);scanf(%s,p-data.sex);printf(n 请输入出生年月:);scanf(%s,&p-data.birthday);print
9、f(n 请输入学历:);scanf(%s,&p-data.degree);printf(n 请输入职位:);scanf(%s,&p-data.position);printf(n 请输入工资:);scanf(%s,&p-data.salary);printf(提示:已经完成一条记录的添加。n);p-next=NULL;r-next=p;/这一步是必需的,将 p 与先前的链表连起来构成一条新链表r=p;/也是必需的.将 r 又重设为新链的最后一个有用结点2:显示模块void Disp(Node *woker)/输出职工信息Node *p;p=woker-next;if(!
10、p)printf(n提示:没有记录可以显示!n);return;printf(tttt 显示结果n);printf(职工号职工姓名职工性别职工生日职工学历职工职位职工工资n);while(p)printf(n%-13s%-11s%-7s%-10s%-13s%-10s%-5sn,p-data.num,,p-data.sex,p-data.birthday,p-data.degree,p-data.position,p-data.salary);p=p-next;3:查找模块void Tongji(Node *woker)/查找统计函数Node *p;int sel;int
11、flag2=0,ha=0;p=woker-next;char find20;if(!woker-next)/若链表为空printf(n提示:没有资料可以统计分类!n);return;printf(提示:n=0 退出n=1 按职工号统计n=2 按职工姓名名称统计n);scanf(%d,&sel);if(sel=1)printf(n 输入你要统计分类的职工号:);scanf(%s,find);while(p)if(strcmp(p-data.num,find)=0)flag2+;if(flag2=1&ha!=flag2) printf(职工号职工姓名职工性别职工生日职工学历职工职位
12、职工工资n);printf(n%-13s%-11s%-7s%-10s%-13s%-10s%-5sn,p-data.num,,p-data.sex,p-data.birthday,p-data.degree,p-data.position,p-data.salary);ha=flag2;elseif(flag2ha)printf(n%-13s%-11s%-7s%-10s%-13s%-10s%-5sn,p-data.num,,p-data.sex,p-data.birthday,p-data.degree,p-data.position,p-data.s
13、alary);ha=flag2;p=p-next;if(flag2)printf(n* 按 设 备 号 %s 统 计 分 类 的 有 %d 条 记录:*nn,find,flag2);else printf(n 按职工号%s 统计的结果为 0 个nn,find);else if(sel=2)printf(n 输入你要统计分类的职工姓名:);scanf(%s,find);while(p)if(strcmp(,find)=0)flag2+;if(flag2=1&ha!=flag2) printf(职工号职工姓名职工性别职工生日职工学历职工职位职工工资n);printf(
14、n%-13s%-11s%-7s%-10s%-13s%-10s%-5sn,p-data.num,,p-data.sex,p-data.birthday,p-data.degree,p-data.position,p-data.salary);ha=flag2;elseif(flag2ha)printf(n%-13s%-11s%-7s%-10s%-13s%-10s%-5sn,p-data.num,,p-data.sex,p-data.birthday,p-data.degree,p-data.position,p-data.salary);ha=flag
15、2;p=p-next;if(flag2)printf(n*按设备 名称%s统计的 有%d条记录:*nn,find,flag2);else printf(n 按职工姓名%s 统计分类的结果为 0 个nn,find);else if(sel=0) return;4:修改模块void change(Node *woker)/修改职工信息函数Node *p;char find20;if(!woker-next)printf(n提示:没有资料可以修改!n);return;printf(请输入要修改的职工号:);scanf(%s,find);p=woker-next;while(p!=NULL)if(st
16、rcmp(p-data.num,find)=0)/如果找到的话返回的是符合要求break;p=p-next;if(p)int x;while(1)printf(完成修改请输入 0 否则输入任意数再进行修改:);scanf(%d,&x);if(x=0)break;printf(请输入新职工号(原来是 %s ):,p-data.num);scanf(%s,p-data.num);printf(请输入新职工姓名(原来是 %s ):,);scanf(%s,);printf(请输入新职工性别(原来是 %s ):,p-data.sex);scanf(%s
17、,p-data.sex);printf(请输入新出生年月(原来是 %s ):,p-data.birthday);scanf(%s,p-data.birthday);printf(请输入新职工学历(原来是 %s ):,p-data.degree);scanf(%s,p-data.degree);printf(请输入新职工职位(原来是 %s ):,p-data.position);scanf(%s,p-data.position);printf(请输入新职工工资(原来是 %s ):,p-data.salary);scanf(%s,p-data.salary);printf(n提示:该项记录资料已经
18、成功修改!n);elseprintf(n提示:你要修改的信息不存在!n);5:删除模块void dismiss(Node *woker)/删除职工信息函数Node *p,*r,*s;char find10;if(!woker-next)printf(n提示:没有资料可以显示!n);return;printf(n提示:请输入您要删除的职工号!n);scanf(%s,find);p=woker-next;while(p!=NULL)if(strcmp(p-data.num,find)=0)/如果找到的话返回的是符合要求break;p=p-next;if(!p)printf(n提示:找不到您想删除的
19、职工号!n);elser=woker;while(r-next!=p)r=r-next;s=r-next;r-next=r-next-next;6:存档模块void save(Node *woker)/将职工信息保存到文件int n;Node *p;FILE *fp;/指向文件的指针printf(需要保存吗?(1-保存0-不保存));scanf(%d,&n);if(n)if(woker-next=NULL)printf(无记录);else p=woker-next;if(fp = fopen(职工管理系统.dat, wb) = NULL) /打开文件,并判断打开是否正常printf(c
20、an not open filen);/ 打开文件出错while(p!=NULL)fprintf(fp,%s%s%s%s%s%s%s,&p-data.num,&,&p-data.sex,&p-data.birthday,&p-data.degree,&p-data.position,&p-data.salary);p=p-next;fclose(fp);/关闭文件7:文件统计模块void load(Node *woker)Node *p,*q;FILE *fp;/指向文件的指针int recordNum;/ 统计记录
21、数if(fp = fopen(职工管理系统.dat, rb) = NULL)/打开文件printf(can not open filen);/不能打开p=woker;recordNum = 0;while(!feof(fp)q=(Node*)malloc(sizeof(Node);fscanf(fp,%s%s%s%s%s%s%s,p-data.num,,p-data.sex,p-data.birthday,p-data.degree,p-data.position,p-data.salary);/*从文件读入记录*/p-next=q;q-next=NULL;p=q;rec
22、ordNum+;fclose(fp);printf(文件里共有%d 条记录:n,recordNum);8:主函数模块void main()Node *woker;FILE *fp;int flag;Node *p,*q;printf(tttt 职工信息管理系统n);woker=(Node*)malloc(sizeof(Node);woker-next=NULL;p=woker;while(1)printf(*目录*);printf(n1 添加记录n);printf(n2 修改记录n);printf(n3 浏览记录n);printf(n4 分类查找记录n);printf(n5 删除记录n);pr
23、intf(n6 从文件读取记录n);printf(n0*-EXIT-*n);printf(请输入你要操作的序号:);scanf(%d,&flag);switch(flag)case 0:printf(n提示:已经退出系统,ByeBye!n);break;case 1:Add(woker);save(woker);break;/增加记录case 2:change(woker);break;/修改记录case 3:Disp(woker);break;/显示记录信息case 4:Tongji(woker);break;/查找记录case 5:dismiss(woker);break;/删除记
24、录case 6:load(woker);break;/读取记录default:printf(n提示:输入错误!n); break;(4)程序的运行和测试结果)程序的运行和测试结果主界面:主界面:创建与增加模块:创建与增加模块:输入职工信息为:职工号职工姓名职工性别职工出生年月职工学历职工职位职工工资1Af11aaa10002Bm22bbb20003Cf33ccc30004Dm44ddd4000输入第一次时:输入第二次时:输入第三次时:输入第四次时:显示模块:显示模块:输入四次后显示的结果为:存档模块:存档模块:文件统计模块:文件统计模块:查找模块:查找模块:输入查找职工号为 3 的职工信息:输
25、入查找职工姓名为 c 的职工信息:修改模块:修改模块:修改职工号为 3 的职工信息为:职工号职工姓名职工性别职工出生年月职工学历职工职位职工工资5Ef55eee5000职工信息变成:删除模块:删除模块:删除职工号为 5 的职工信息:删除后的结果为:退出模块:退出模块:四、四、实验中的问题及心得实验中的问题及心得此次实践课编写的是一个应用程序,相对于以前我们见到的程序,它要大得多,运行的结果也没有预想中的好,数据的输出格式不太规范,而且各模块也出现了一些小问题,在老师和同学的帮助下,我很有耐心的一次又一次的进行修改,最后运行的结果基本上达到了预期的目的。本次 C 语言的实习课让我对 C 语言的学
26、习又有了更深入的了解, 也让我更深刻地领悟到了“实践出真理”这个道理,在上机实践过程中学到的知识远远超过了在课堂上十几周学到的, 这次程序设计课让我增添了许多程序设计经验,为我们将来走上工作岗位其了不小的铺垫作用。本次实习中遇到了很多以前没有遇到过的问题,也曾想过要放弃,但看到那些同学都在那认真的写程序,给了我继续的信心。在同学和老师的帮助下,我顺利的结束了本次实习,让我知道原来凭借自己努力取得的成功会让自己这么欣慰,也让我知道了友谊和团结的重要性。(4)程序清单#include stdio.h#include stdlib.h#include string.hstruct wokers/定义
27、一个 woker 的结构体char num10;/职工号char name15;/职工姓名char sex15;/职工性别char birthday15;/职工出生年月chardegree10;/职工学历char position10;/职工职位char salary10;/职工工资;typedef struct nodestruct wokers data;struct node *next;/建立一个链表。Node;void Add(Node *woker)/添加记录Node *p,*r,*s;char n10;/先用于输入职工号,也用于判断是否跳出循环r=woker;s=woker-ne
28、xt;/使 s 为第一个有用的结点while(r-next!=NULL)/这个循环的作用是使 r 为最后一个有用的结点r=r-next;/将指针置于最末尾while(1)printf(提示:输入 0 则返回主菜单!n);printf(n 请你输入职工号:);scanf(%s,n);if(strcmp(n,0)=0)break;p=(Node *)malloc(sizeof(Node);/申请空间strcpy(p-data.num,n);printf(n 请输入姓名:);scanf(%s,);printf(n 请输入性别:);scanf(%s,p-data.sex);pri
29、ntf(n 请输入出生年月:);scanf(%s,&p-data.birthday);printf(n 请输入学历:);scanf(%s,&p-data.degree);printf(n 请输入职位:);scanf(%s,&p-data.position);printf(n 请输入工资:);scanf(%s,&p-data.salary);printf(提示:已经完成一条记录的添加。n);p-next=NULL;r-next=p;/这一步是必需的,将 p 与先前的链表连起来构成一条新链表r=p;/也是必需的.将 r 又重设为新链的最后一个有用结点void cha
30、nge(Node *woker)/修改职工信息函数Node *p;char find20;if(!woker-next)printf(n提示:没有资料可以修改!n);return;printf(请输入要修改的职工号:);scanf(%s,find);p=woker-next;while(p!=NULL)if(strcmp(p-data.num,find)=0)/如果找到的话返回的是符合要求break;p=p-next;if(p)int x;while(1)printf(完成修改请输入 0 否则输入任意数再进行修改:);scanf(%d,&x);if(x=0)break;printf(请
31、输入新职工号(原来是 %s ):,p-data.num);scanf(%s,p-data.num);printf(请输入新职工姓名(原来是 %s ):,);scanf(%s,);printf(请输入新职工性别(原来是 %s ):,p-data.sex);scanf(%s,p-data.sex);printf(请输入新出生年月(原来是 %s ):,p-data.birthday);scanf(%s,p-data.birthday);printf(请输入新职工学历(原来是 %s ):,p-data.degree);scanf(%s,p-data.degr
32、ee);printf(请输入新职工职位(原来是 %s ):,p-data.position);scanf(%s,p-data.position);printf(请输入新职工工资(原来是 %s ):,p-data.salary);scanf(%s,p-data.salary);printf(n提示:该项记录资料已经成功修改!n);elseprintf(n提示:你要修改的信息不存在!n);void Disp(Node *woker)/输出职工信息Node *p;p=woker-next;if(!p)printf(n提示:没有记录可以显示!n);return;printf(tttt 显示结果n);p
33、rintf(职工号职工姓名职工性别职工生日职工学历职工职位职工工资n);while(p)printf(n%-13s%-11s%-7s%-10s%-13s%-10s%-5sn,p-data.num,,p-data.sex,p-data.birthday,p-data.degree,p-data.position,p-data.salary);p=p-next;void Tongji(Node *woker)/查找统计函数Node *p;int sel;int flag2=0,ha=0;p=woker-next;char find20;if(!woker-next)/若链表为
34、空printf(n提示:没有资料可以统计分类!n);return;printf(提示:n=0退出n=1按职工号统计n=2按职工姓名名称统计n);scanf(%d,&sel);if(sel=1)printf(n 输入你要统计分类的职工号:);scanf(%s,find);while(p)if(strcmp(p-data.num,find)=0)flag2+;if(flag2=1&ha!=flag2) printf(职工号职工姓名职工性别职工生日职工学历职工职位职工工资n);printf(n%-13s%-11s%-7s%-10s%-13s%-10s%-5sn,p-data.num,
35、,p-data.sex,p-data.birthday,p-data.degree,p-data.position,p-data.salary);ha=flag2;elseif(flag2ha)printf(n%-13s%-11s%-7s%-10s%-13s%-10s%-5sn,p-data.num,,p-data.sex,p-data.birthday,p-data.degree,p-data.position,p-data.salary);ha=flag2;p=p-next;if(flag2)printf(n*按设备号%s 统计分类的有%d 条记
36、录:*nn,find,flag2);else printf(n 按职工号%s 统计的结果为 0 个nn,find);else if(sel=2)printf(n 输入你要统计分类的职工姓名:);scanf(%s,find);while(p)if(strcmp(,find)=0)flag2+;if(flag2=1&ha!=flag2) printf(职工号职工姓名职工性别职工生日职工学历职工职位职工工资n);printf(n%-13s%-11s%-7s%-10s%-13s%-10s%-5sn,p-data.num,,p-data.sex,p-d
37、ata.birthday,p-data.degree,p-data.position,p-data.salary);ha=flag2;elseif(flag2ha)printf(n%-13s%-11s%-7s%-10s%-13s%-10s%-5sn,p-data.num,,p-data.sex,p-data.birthday,p-data.degree,p-data.position,p-data.salary);ha=flag2;p=p-next;if(flag2)printf(n*按设备名称%s 统计的有%d 条记录:*nn,find,flag2);else prin
38、tf(n 按职工姓名%s 统计分类的结果为 0 个nn,find);else if(sel=0) return;void load(Node *woker)Node *p,*q;FILE *fp;/指向文件的指针int recordNum;/ 统计记录数if(fp = fopen(职工管理系统.dat, rb) = NULL)/打开文件printf(can not open filen);/不能打开p=woker;recordNum = 0;while(!feof(fp)q=(Node*)malloc(sizeof(Node);fscanf(fp, %s %s %s %s %s %s%s,p-
39、data.num,,p-data.sex,p-data.birthday,p-data.degree,p-data.position,p-data.salary);/*从文件读入记录*/p-next=q;q-next=NULL;p=q;recordNum+;fclose(fp);printf(文件里共有%d 条记录:n,recordNum);void save(Node *woker)/将职工信息保存到文件int n;Node *p;FILE *fp;/指向文件的指针printf(需要保存吗?(1-保存0-不保存));scanf(%d,&n);if(n)if(wo
40、ker-next=NULL)printf(无记录);else p=woker-next;if(fp = fopen(职工管理系统.dat, wb) = NULL) /打开文件,并判断打开是否正常printf(can not open filen);/ 打开文件出错while(p!=NULL)fprintf(fp,%s %s %s %s %s %s%s,&p-data.num,&,&p-data.sex,&p-data.birthday,&p-data.degree,&p-data.position,&p-data.salary);p=p-next;fclose(fp);/关闭文件void dismiss(Node *woker)/删除职工信息函数Node *p,*r,*s;char find10;if(!woker-next)printf(n提示:没有资料可以显示!n);return;printf(n提示:请输入您要删除的职工号!n);scanf(%s,find);p=woker-next;while(p!=NULL)if(strcmp(p-data.num,find)=0)/如果找到的话返回的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论