C语言程序设计职工信息管理系统链表

上传人:仙*** 文档编号:103331334 上传时间:2022-06-08 格式:DOC 页数:34 大小:137.50KB
返回 下载 相关 举报
C语言程序设计职工信息管理系统链表_第1页
第1页 / 共34页
C语言程序设计职工信息管理系统链表_第2页
第2页 / 共34页
C语言程序设计职工信息管理系统链表_第3页
第3页 / 共34页
点击查看更多>>
资源描述
信息与电子工程学院C语言课程设计职工信息管理系统设计实验日期和时间: 2019年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座IP:10.250.11.17二、实验目的和要求实验目的:(1)使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作算法。(2)使学生进一步掌握程序设计、编写、调试能力。(3)使学生了解软件开发的基本步骤和内容。实验要求:完成一个职工信息管理系统程序,具体内容如下:(1)在内存中用链表记录,在硬盘上用二进制文件保存。(2)设计完的程序能够以命令行或者菜单形式增加、删除、更新和查询数据的内容。数据内容能够排序以方便查询。(3)数据库中应该有至少20条记录。三、实验内容和结果(1)程序整体功能;1、系统总体框菜单开始根据菜单输入n的值选择程序结束是否继续进行 NY2修改职工信息3浏览职工信息4分类查找职工信息5删除职工信息6从文件读取信息0退出1录入职工信息按职工号查找按姓名查找2、模块设计该程序主要分为7个模块,分别是创建与添加模块、显示模块、查找模块、修改模块、删除模块、存档模块、文件统计模块、退出模块(2)程序组成和各模块/函数功能;创建与添加模块:该模块的功能是输入职工信息。函数为void Add(Node *woker)原理:采用尾插法,先建立链表与头结点,新增一个结点,键盘输入职工号、职工姓名、职工性别、职工出生年月、职工学历、职工职位、职工工资,将这些信息存储到新增结点中,将新增加的节点连到链表的尾端,如此以往,将尾结点的指针域置空,这样就得到了一条存储职工信息的链表,这样就完成了职工信息的创建与增加。显示模块:该模块功能是显示职工信息。函数为void Disp(Node *woker)原理:先新建一个指针P指向头结点,判断它的指针域是否为空,若为空,则输出“没有记录可以显示”;若不为空,则输出它的指针域所指向节点所储存的职工信息,并将该指针向后移一个结点,直到P指向空,即输出了所有职工的信息,这样就完成了所有职工信息的显示。查找模块:该模块功能是查找职工信息。函数为void Tongji(Node *woker)原理:该模块分为两种查找方法,分别是按职工号查找和按职工姓名查找,因为这两种查找方法雷同,所以这里将只解释按职工号查找的原理。先键盘输入一个要查找的职工号并新建一个指针P指向头结点,判断它的指针域是否为空,若为空,则输出“没有资料可以统计分类”,若不为空,则判断它的指针域所指向节点所储存的职工信息中的职工号,若相等,则输出这个职工的其他所有信息,并将P指向下一个结点,再次进行判断,直到P指向空,即输出了所有查找到的信息。若不相等,则P指向下一个结点,再次进行判断,直到P指向空,即输出了所有查找到的信息,这样就完成了职工信息的查找。修改模块 :该模块功能是修改职工信息。函数为void change(Node *woker)原理:根据查找原理,查找到要修改信息的职工,删除这一节点,并新建一个节点,键盘输入想要修改的内容,并储存到新的结点中,将新的节点连接到链表中原先删除结点的位子,这样就完成了职工信息的修改。删除模块:该模块功能是删除管理职工信息。函数为void dismiss(Node *woker)根据查找的原理,查找到要修改信息的职工,删除这一节点,并将其前驱结点的指针域指向其后继结点,这样就完成了职工信息的删除。存档模块:将内存中的信息存储到文件中。函数为void save(Node *woker)原理:打开文件,新建一个指针P指向头结点,判断它的指针域是否为空,若为空,则输出“无记录”,若不为空,则将这个职工的所有信息输入到文件中,并将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为最后一个有用的结点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,p-data.name); printf(n请输入性别:); scanf(%s,p-data.sex); printf(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 又重设为新链的最后一个有用结点 2:显示模块void Disp(Node *woker)/输出职工信息Node *p;p=woker-next;if(!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.name,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 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(职工号 职工姓名 职工性别 职工生日 职工学历 职工职位 职工工资n); printf(n%-13s%-11s%-7s%-10s%-13s%-10s%-5sn,p-data.num,p-data.name,p-data.sex,p-data.birthday,p-data.degree,p-data.position,p-data.salary); ha=flag2; else if(flag2ha)printf(n%-13s%-11s%-7s%-10s%-13s%-10s%-5sn,p-data.num,p-data.name,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 printf(n按职工号%s统计的结果为0个nn,find);else if(sel=2) printf(n输入你要统计分类的职工姓名:); scanf(%s,find); while(p) if(strcmp(p-data.name,find)=0) flag2+; if(flag2=1&ha!=flag2) printf(职工号 职工姓名 职工性别 职工生日 职工学历 职工职位 职工工资n); printf(n%-13s%-11s%-7s%-10s%-13s%-10s%-5sn,p-data.num,p-data.name,p-data.sex,p-data.birthday,p-data.degree,p-data.position,p-data.salary); ha=flag2; else if(flag2ha)printf(n%-13s%-11s%-7s%-10s%-13s%-10s%-5sn,p-data.num,p-data.name,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 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(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(请输入新职工号(原来是 %s ):,p-data.num); scanf(%s,p-data.num); printf(请输入新职工姓名(原来是 %s ):,p-data.name); scanf(%s,p-data.name); 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.degree); printf(请输入新职工职位(原来是 %s ):,p-data.position); scanf(%s,p-data.position); printf(请输入新职工工资(原来是 %s ):,p-data.salary); scanf(%s,p-data.salary); printf(n提示:该项记录资料已经成功修改!n); else printf(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提示:找不到您想删除的职工号!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(can not open filen);/ 打开文件出错while(p!=NULL)fprintf(fp,%s %s %s %s %s %s %s,&p-data.num,&p-data.name,&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;/ 统计记录数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.name,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);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); printf(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;/删除记录 case 6: load(woker);break;/读取记录 default: printf(n提示:输入错误!n); break;(4)程序的运行和测试结果主界面:创建与增加模块:输入职工信息为:职工号职工姓名职工性别职工出生年月职工学历职工职位职工工资1Af11aaa10002Bm22bbb20003Cf33ccc30004Dm44ddd4000输入第一次时:输入第二次时:输入第三次时:输入第四次时:显示模块:输入四次后显示的结果为:存档模块:文件统计模块:查找模块:输入查找职工号为3的职工信息:输入查找职工姓名为c的职工信息:修改模块:修改职工号为3的职工信息为:职工号职工姓名职工性别职工出生年月职工学历职工职位职工工资5Ef55eee5000职工信息变成:删除模块:删除职工号为5的职工信息:删除后的结果为:退出模块:四、实验中的问题和心得此次实践课编写的是一个应用程序,相对于以前我们见到的程序,它要大得多,运行的结果也没有预想中的好,数据的输出格式不太规范,而且各模块也出现了一些小问题,在老师和同学的帮助下,我很有耐心的一次又一次的进行修改,最后运行的结果基本上达到了预期的目的。本次C 语言的实习课让我对C 语言的学习又有了更深入的了解,也让我更深刻地领悟到了“实践出真理”这个道理,在上机实践过程中学到的知识远远超过了在课堂上十几周学到的,这次程序设计课让我增添了许多程序设计经验,为我们将来走上工作岗位其了不小的铺垫作用。本次实习中遇到了很多以前没有遇到过的问题,也曾想过要放弃,但看到那些同学都在那认真的写程序,给了我继续的信心。在同学和老师的帮助下,我顺利的结束了本次实习,让我知道原来凭借自己努力取得的成功会让自己这么欣慰,也让我知道了友谊和团结的重要性。(4)程序清单#include stdio.h#include stdlib.h#include string.hstruct wokers/定义一个woker的结构体char num10;/职工号char name15;/职工姓名char sex15;/职工性别char birthday15; /职工出生年月char degree10; /职工学历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-next; /使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,p-data.name); printf(n请输入性别:); scanf(%s,p-data.sex); printf(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 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(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(请输入新职工号(原来是 %s ):,p-data.num); scanf(%s,p-data.num); printf(请输入新职工姓名(原来是 %s ):,p-data.name); scanf(%s,p-data.name); 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.degree); printf(请输入新职工职位(原来是 %s ):,p-data.position); scanf(%s,p-data.position); printf(请输入新职工工资(原来是 %s ):,p-data.salary); scanf(%s,p-data.salary); printf(n提示:该项记录资料已经成功修改!n); else printf(n提示:你要修改的信息不存在!n);void Disp(Node *woker)/输出职工信息Node *p;p=woker-next;if(!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.name,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)/若链表为空 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,p-data.name,p-data.sex,p-data.birthday,p-data.degree,p-data.position,p-data.salary); ha=flag2; else if(flag2ha)printf(n%-13s%-11s%-7s%-10s%-13s%-10s%-5sn,p-data.num,p-data.name,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 printf(n按职工号%s统计的结果为0个nn,find);else if(sel=2) printf(n输入你要统计分类的职工姓名:); scanf(%s,find); while(p) if(strcmp(p-data.name,find)=0) flag2+; if(flag2=1&ha!=flag2) printf(职工号 职工姓名 职工性别 职工生日 职工学历 职工职位 职工工资n); printf(n%-13s%-11s%-7s%-10s%-13s%-10s%-5sn,p-data.num,p-data.name,p-data.sex,p-data.birthday,p-data.degree,p-data.position,p-data.salary); ha=flag2; else if(flag2ha)printf(n%-13s%-11s%-7s%-10s%-13s%-10s%-5sn,p-data.num,p-data.name,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 printf(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-data.num,p-data.name,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(woker-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.name,&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)/如果找到的话返回的是符合要求 break; p=p-next; if(!p)printf(n提示:找不到您想删除的职工号!n);elser=woker;while(r-next!=p)r=r-next;s=r-next;r-next=r-next-next;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); printf(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;/删除记录 case 6: load(woker);break;/读取记录 default: printf(n提示:输入错误!n); break;五、评分(请每个学生在做课程设计时仔细对照下面的考核标准表所列出的要求,在交报告之前先自己打自评分,老师将在验收成果时打分)自评分教师评分1.程序功能和原理(35)(1)记录用结构表示,至少包含字符串(如名字)和整型(如年龄)(5)(2)用链表来动态保存记录,并能以命令行或者菜单形式增加(5)、删除(5)、查询(5)、排序(5)内容。如果用数组最多得5分。(3)用二进制文件永久保存记录,并能在程序开始运行时读取文件内容(5),在程序运行结束前保存到文件(5)2.程序质量(30%)(1)用大括号和缩进来清楚地显示程序结构。(提示:按一次tab键产生一个缩进)(5)(2)各函数有功能说明和参数说明,对每个函数参数和函数返回值的含义进行说明(5)(3)每个源程序文件都有说明(比如本程序功能,作者,包含哪些函数)(5)(4)每个函数长度不超过100行(5)(5)函数、变量取名较规范易懂(5)(6)对不容易理解的常量、变量和语句有注释(比如全局常量、全局变量、if语句)(5)3.总结报告(25%)(1)说明程序整体功能、各模块/函数功能(5)(2)用流程图或其他有效方法描述一个函数的算法(5)(3)有小组分工情况说明和各自的经验总结(5)(4)附程序清单(5)(5)语言简练,条理清楚,图表规范,容易理解(5)(提示:请关注一下字体大小、图表的标题)4调试手段(10%)(1)会单步运行到任何一个语句(5)(2)单步运行时能查看变量值(5)总成绩: 等级:第 34 页
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!