目录
- 主要内容:
本课程设计结合本学期所学C语言知识、数学运算、VC++软件编程、Easy x图形编辑等等,准备设计开发一个简单的:职工人事管理系统设计。设计开发这个系统需要用到链表、文件读取操作、结构体、函数、图表绘制、键盘操作等C语言知识。本课程设计将会实现:
1. 设计简单的菜单,能够进行系统功能选择;
2. 实现信息的录入功能;
3. 在已有信息的基础上添加新的记录;
4. 删除指定编号的记录;
5. 修改指定编号的记录;
6. 实现信息的浏览功能;
7. 按编号查询功能;
8. 按年龄排序功能;
9.将数据信息以文件的形式存盘,数据库信息的各种操作最后都能被存储,存储前有提示,并且能打开。
本着简单、易用的设计原则,本课程设计在尽量优化界面在保证输入输出美观的同时又不失友好的交互界面。
本次设计主要学习内容包括:
(一)进一步学习并熟练掌握C语言语法和编程思想。
(二)学习C语言提供的库函数,熟悉Easy x的绘图工具。
(三)学习C语言函数、简单的Easy x绘图、数学计算等知识。
(四)学习软件的设计与开发过程中所需要思想和细节。
二、基本要求:
(一)质量要求
(1)职工人事管理系统设计的基本功能模块的设计应包括:实现简单的职工人事信息管理,基本信息包括职工编号、姓名、性别、年龄、身份证号和简历。
(2)对职工人事管理系统设计并进行调试、修复、完善、测试。
(3)定期主动向指导教师汇报任务进度,认真填写相关报告文档。
(4)按时完成各阶段工作,不突击,不抄袭。
(二)进度要求
(2)明确课程设计任务,搜集资料:2021年3月14日—3月30日。
(3)完成程序的设计与实现,撰写课程设计论文初稿:2021年3月30日—4月15日。
(4)与指导教师沟通,完成课程设计论文定稿:2021年4月15日—5月15日。
(5)进入课程设计论文审阅阶段,准备答辩:2021年5月15日—6月10日。
三、课程设计分工情况
.
.
.
目录
1.概述
1.1 设计思想
(1)该系统的设计分成几个相对独立的模块,这些模块都进行集中式管理。
(2)分层的模块化程序设计思想,整个系统采用模块化结构设计作为应用程序,有较强的可操作性和扩展性。
(3)合理的数据设计,在应用系统设计中,相对独立的模块以数据相连,方便系统运行。
1.2 设计原则
为了使本系统功能齐全完备,操作简便,最大限度的提高职工人事管理系统的便捷,职工人事管理系统在企业中起着通行桥梁作用,通过与其他管理系统模块的信息连接,能够使整个企业有机并高效地运行起来,使得企业各个方面的各项工作顺利开展。在设计开发过程中遵循了如下原则:
- 实用性原则:在企业方面,可以有效的进行对职工信息管理;增加、删除、修改员工信息。职工方面,每个职工都可以对自己的信息进行查看。此外,尽可能预留空间,以便扩充功能。
- 合法性原则:规范录入员工信息,对职工的信息进行规范保存。
- 易操作原则:要求设计的系统功能齐全,操作方便,必要的地方进行提示。
- 源程序可读性原则:为了便于其他设计,维护人员读懂代码或以后的代码修改,软件升级维护,尽可能做好代码注释工作。
1.3 课程设计报告内容及分工情况
1.3.1课程设计报告内容
(1)系统功能模块结构图和程序流程图
(2)数据结构设计及用法说明
(3)程序结构(画功能模块图或流程图)
(4)各模块的功能
(5).实验结果(包括输入数据和输出结果)
(6)设计体会
(7)参考文献
1.3.2 课程设计分工情况
本组一共有5人,具体分工情况如下:
2.总体设计
2.1功能模块图
本职工人事管理系统功能大致分为两个模块,分别是基本模块,加强模块。基本模块功能可以进行录入,修改,删除,浏览;加强模块功能可以进行对职工信息按年龄排序,按编号排序,信息储存。功能模块图如图2.1所示。
2.2 主函数 main()
函数的功能:用于联系各个功能函数模块。
函数的入口:整个程序是从主函数开始的。
函数的出口:当从main()的menu函数中进入,即显示出开始界面;跳出while循环,然后退出main()函数,即退出整个程序。
函数调用关系:该函数不被其他函数调用。
2.3 程序流程图
本职工人事管理系统在启动后会先进入输入操作的数字编号,然后进入录入信息,查找、修改信息等实用性功能的操作。程序流程图如图2-2所示。
3.详细设计
3.1 函数
(1) 功能函数menu()
函数的功能: 查找职工信息是否存在
函数入口:从main中do语句进入
函数调用关系:被主函数调用
函数的出口:显示操作有误则没有此员工信息,结束该函数;若存在,可进行下一步查找功能,完成后结束整个程序。
(2)功能函数input()
函数的功能:创建职工信息
函数的入口:从main的switch(n) 的case 1: 进入
函数调用关系:被主函数调用函数的出口:用printf输出(“\n一个新职工的信息档案创建完毕!\n\n”);时,表明操作人员已经录入个人信息成功。
(3)功能函数save(int m)函数的功能:存储信息
函数的入口: 从文件中打开函数调用关系:被主函数调用
函数的出口: FILE *fp /*创建文件并判断是否能打开*/,再用for语句将内存中职工的信息输出到磁盘文件中去。
- 功能函数read()
函数的功能:读取信息
函数的入口:从文件中打开函数调用关系:被主函数调用
函数的出口:通过指针FILE*fp导入文件内容并读取信息。
- 功能函数display()
函数的功能:浏览信息
函数的入口:从main的switch(n) 的case 2: 进入
函数调用关系:被主函数调用
函数的出口:当printf输出(“浏览职工信息\n”);时),按Enter键继续,最后执行save(int m) 函数中“break;”跳出switch()开关函数。
- 功能函数 add()
函数的功能:添加职工信息
函数的入口:从main的switch(n) 的case 7: 进入
函数调用关系:被主函数调用
函数的出口:使用Staffer[i].Number=num语句输入职工信息,再使用display()函数,最后按Enter键继续。
- 功能函数 search()
函数的功能:查找职工信息
函数的入口:从main的switch(n) 的case 3: 进入
函数调用关系:被主函数调用
函数的出口:用do语句判断是否输入有误,再使用switch(t)语句查询信息。
- 功能函数search_name()
函数的功能:按编号查找职工信息
函数的入口:从void search_name()函数进入
函数调用关系:被主函数调用
函数的出口:先通过strcmp(name1,Staffer[i].name)判断查找的职工是否存在,若不存在,则会有“对不起,贵公司没有该员工!” ;若存在,再使用switch(t)语句查询信息。
- 功能函数Delete()
函数的功能:删除操作
函数的入口:从main的switch(n) 的case 4: 进入
函数调用关系:被主函数调用
函数的出口:先调用display()函数浏览职工信息,输入要删除的职工的职工号查找到此人,删除不需要的信息,最后调用save(m)函数保存信息。(10)功能函数change()
函数的功能:修改职工信息
函数的入口:从main的switch(n) 的case 5: 进入
函数调用关系:被主函数调用
函数的出口:先调用display()函数浏览职工信息,再使用read()函数导入文件内的信息,使用do语句修改职工信息。(11)功能函数order()
函数的功能:排序职工信息顺序
函数的入口:从main的switch(n) 的case 6: 进入
函数调用关系:被主函数调用
函数的出口:使用do语句将职工年龄排序,while(f==1) 中的switch(d)语句将年龄按由低到高排列,最后“break;”跳出switch(d)开关函数。3.2函数流程图
(1)录入职工人员信息流程如图3-1所示。
(2)保存职工人员信息流程如图3-2所示
(3)导入职工人员信息流程如图3-3所示
(4)浏览职工人员信息流程如图3-4所示
(5)删除职工人员信息流程如图3-5所示
(6)添加职工人员信息流程如图3-6所示
(7)查询职工人员信息流程如图3-7所示
(8)按姓名查找流程如图3-8所示
(9)修改职工人员信息流程如图3-9所示
(10)职工人员信息排序流程如图3-10所示
(11)按年龄排序流程如图3-11所示
4运行结果与调试
4.1 运行结果
4.2 软件调试
(1)此程序在Dev c++5.9.2版本运行时,在录入数据后无法返回主菜单而是直接退出程序,采用Dev c++5.11版本可以解决这个问题。
(2)程序需要采用c++运行,若采用c运行第137行会出现编译错误。
(3)第175if(fwrite(&Staffer[i],sizeof(struct Staff),1,fp)==1)的判断条件错误无法将内存中职工的信息输出到磁盘文件中去需改成if(fwrite(&Staffer[i],sizeof(struct Staff),1,fp)!=1)。
结束语
本系统包含13个函数,实现了公司职工人事管理系统所需的基本功能。系统功能大致分为两个模块,分别是录入模块,信息查询模块。启动程序后首先执行的是录入功能。在此功能中可以实现创建录入职工的信息,储存信息,浏览职工信息。录入职工信息时,可录入职工工号,姓名,性别,简历这些查询信息。录入后,储存信息,可读取浏览已存储的信息。在信息查询模块中可以进行职工信息的查找,排序,添加,删除,修改功能。本系统在信息查询时可采用按编号方式查找,在排序时可采用按职工号,年龄排序。在录入信息时用的是结构数组,在查询信息时用的是链表。通过这次职工人事管理系统的设计熟练了结构数组,文件,链表,指针的操作。同时对编写小型的系统有了一定的了解。对于细节方面考虑的比以往都有了很大提升,同时也锻炼了我们的团队合作能力。
参考资料
[1] 《算法图解》,袁国忠译,人民邮电出版社,2017年
[2] 《C语言程序设计(第二版)》,甘勇等编著,中国铁道出版社,2015年9月
[3] 《编程珠玑》,[美]乔恩·本特利(Jon Bentley),人民邮电出版社,2019年
[4] 《 C语言程序设计现代方法第2版》,吕秀锋,黄倩译,人民邮电出版社,2016年
[5] 《明解C语言 第3版 入门篇》,柴田望洋,人民邮电出版社,2015年
[6]《啊哈!算法》,啊哈磊,人民邮电出版社,2014年
附录
附录 #include <stdio.h> #include <stdlib.h> #include <windows.h>//system("cls");清屏 #include <string.h> struct Staff { //员工信息结构体 int Number; //职工号号 char name[20]; //姓名 char sex; // 性别 int age; // 年龄 char shen[20]; //身份证号 char jian[20]; //简历 }; struct Staff Staffer[100],Staffer1; //功能函数声明 void menu(); //主菜单 void input(); //输入员工信息 void save(int m); //存储信息 int read(); // 读取信息 void display();//浏览信息 void add() ; //添加 void search(); //查找 void search_name(); //按编号查找 void Delete(); //删除操作 void change(); //修改操作 void order(); //排序操作 void order_Num(); //按职工号排序 //浏览信息时按照职工号由小到大顺序排序 void order_age();//按职工年龄排序 //主函数 int main() { int n,f; while(1) { do { menu(); //*调用菜单函数* printf("请输入你需要操作的序号(1-8): "); scanf("%d",&n); if(n>=1&&n<=8) { f=1; break; } else { f=0; system("cls"); printf("\n\t\t\t您输入有误,请重新选择!"); } }while(f==0); switch(n) { case 1: system("cls"); printf("\n"); printf("\t\t\t 录入职工信息\n\n"); input(); break; case 2: system("cls"); printf("\n"); printf("\t\t\t\t浏览职工信息\n"); display(); printf("\n按Enter键继续\n"); getchar(); getchar(); system("cls"); break; case 3: system("cls"); printf("\n"); printf("\t\t\t\t查询职工信息\n"); search(); break; case 4: system("cls"); printf("\n"); printf("\t\t\t\t删除职工信息\n\n"); Delete(); case 5: system("cls"); printf("\n"); printf("\t\t\t\t修改职工信息\n"); display(); /* 调用浏览函数*/ change(); break; case 6: system("cls"); printf("\n"); printf("\t\t职工信息排序\n"); order(); break; case 7: system("cls"); printf("\n"); printf("\t\t添加职工信息\n\n"); add() ; break; case 8: system("cls"); printf("\n\n\n\n\n\n\t\t\tThank you for using !\n\n\n\n\n\n"); getchar(); getchar(); exit(8); break; } } } //其他函数 void menu() /*菜单函数*/ { printf("\n\n"); printf(" Welcome to \n"); printf(" Staff Information Management System (SIMS) \n\n"); printf("*****************************************************************\n"); printf("* 1.录入职工信息"); printf(" § 2.浏览职工信息 *\n"); printf("* 3.查询职工信息"); printf(" § 4.删除职工信息 *\n"); printf("* 5.修改职工信息"); printf(" § 6.职工信息排序 *\n"); printf("* 7.添加职工信息"); printf(" § 8.退出职工系统 *\n"); printf("*****************************************************************\n"); printf("\n"); } void input() /*录入函数*/ { int i,m,num=0; printf("请输入需要创建信息的职工人数(1--100): "); scanf("%d",&m); system("cls"); printf("\n"); if(m>100) { printf("\t\t\t超出范围!请重新输入。\n"); input(); } else{ for (i=0;i<m;i++) { printf("第%d个员工信息输入(按回车确认输入):\n", i+1); printf("请输入职工号: "); scanf("%d",&num); for(int j=0;j<i;j++) if(Staffer[j].Number==num) { printf("职工号为 %d 的员工已存在,请重新输入:",num); scanf("%d",&num); j=0; } Staffer[i].Number=num; printf("请输入姓名: "); scanf("%s",Staffer[i].name); printf("请输入性别(F/M): "); getchar(); scanf("%c",&Staffer[i].sex); printf("请输入年龄: "); scanf("%d",&Staffer[i].age); printf("请输入身份证号: "); scanf("%s",Staffer[i].shen); printf("请输入简历: "); scanf("%s",Staffer[i].jian); system("cls"); printf("\n一个新职工的信息档案创建完毕!\n\n"); } save(m); printf(""); } } void save(int m) /*保存文件函数*/ { int i; FILE *fp; if ((fp=fopen("D:\\Staff_list.dat","wb"))==NULL) /*创建文件并判断是否能打开*/ { printf ("cannot open file!\n"); exit(0); } for (i=0;i<m;i++) /*将内存中职工的信息输出到磁盘文件中去*/ if (fwrite(&Staffer[i],sizeof(struct Staff),1,fp)!=1) printf("file write error!\n"); fclose(fp); } int read() /*导入函数*/ { FILE*fp; int i=0; if((fp=fopen("D:\\Staff_list.dat","rb"))==NULL) { printf ("cannot open file!\n"); exit(0); } else { do { fread(&Staffer[i],sizeof(struct Staff),1,fp); i++; }while(feof(fp)==0); } fclose(fp); return(i-1); } void display() /*浏览函数*/ { int i; int m=read(); printf("\n贵公司所有职工信息:\n"); //printf("\n 原有职工信息:\n"); printf("\n职工号\t姓名\t性别\t年龄\t身份证号\t \t简历 \n"); order_Num(); for(i=0;i<m;i++) printf("\n %d\t%s\t %c\t %d\t%s\t %s\t\n",Staffer[i].Number,Staffer[i].name, Staffer[i].sex,Staffer[i].age,Staffer[i].shen,Staffer[i].jian); printf("\n"); } void Delete() /*删除函数*/ { int m=read(); int i,j,t,n, f,Num; display(); /*调用浏览函数*/ printf("请输入要删除的职工的职工号: "); scanf("%d",&Num); for(f=1,i=0;f&&i<m;i++) { if(Staffer[i].Number==Num) { printf("\n已找到此人,原始记录为:\n"); printf("\n职工号\t姓名\t性别\t年龄\t学历\t 工资\t住址\t 电话 \n"); printf("\n %d\t%s\t %c\t %d\t%s\t %s\t\n",Staffer[i].Number,Staffer[i].name, Staffer[i].sex,Staffer[i].age,Staffer[i].shen,Staffer[i].jian); printf("\n确认删除请按 1,取消删除请按 0: "); scanf("%d",&n); if(n==1) /*如果删除,则其他的信息都向前移一行*/ { for(j=i;j<m-1;j++) Staffer[j]=Staffer[j+1]; /*当找到第j个职工时,for语句后j自加了1,所以下面的应该把改后的 信息赋值给第j-1个人*/ f=0; } else f=2; } } system("cls"); switch(f){ case 0: m=m-1; printf("\n\t\t\t\t删除成功!\n"); save(m); /*调用保存函数*/ display(); /*调用浏览函数*/ break; case 1: printf("\n\t\t\t对不起,贵公司没有该员工!\n"); display(); /*调用浏览函数*/ break; case 2: printf("\n\t\t\t\t取消删除!\n"); break; } //display(); /*调用浏览函数*/ printf("\n继续删除请按1,返回主菜单请按0: "); scanf("%d",&t); system("cls"); switch(t) { case 1: Delete(); break; case 0: system("cls"); main(); break; default: break; } system("cls"); } void add() /* 添加函数*/ { int n=read(); int i,m,num=0; printf("请输入需要添加信息的职工人数: "); scanf("%d",&m); if(m+n>100) { system("cls"); printf("\n对不起,你所构建的职工人数超出范围。请重新输入(0至%d之间):\n\n",100-n); add(); } else{ for (i=n;i<m+n;i++) { printf("第%d个员工信息输入(按回车确认输入): \n", i+1); printf("请输入职工号: "); scanf("%d",&num); for(int j=0;j<i;j++) if(Staffer[j].Number==num) { printf("职工号为 %d 的员工已存在,请重新输入:",num); scanf("%d",&num); j=0; } Staffer[i].Number=num; printf("请输入姓名: "); scanf("%s",Staffer[i].name); printf("请输入性别(F/M): "); getchar(); scanf("%c",&Staffer[i].sex); printf("请输入年龄: "); scanf("%d",&Staffer[i].age); printf("请输入身份证号: "); scanf("%s",&Staffer[i].shen); printf("请输入简历: "); scanf("%s",&Staffer[i].jian); system("cls"); printf("\n一个职工的信息档案创建完毕!请输入下一个职工的信息\n"); printf("\n"); } save(m+n); system("cls"); printf("\n添加职工档案完成! \n"); display(); printf("\n按Enter键继续\n"); getchar(); getchar(); system("cls"); } } void search()/*查询函数*/ { int t,f; do { printf("\n按姓名查询请按 1; 进入主菜单按 0: "); scanf("%d",&t); if(t>=0&&t<=4) { f=1; break; } else { f=0; printf("您输入有误,请重新选择!"); } }while(f==0); system("cls"); while(f==1) { switch(t) { case 0: main(); break; case 1: printf("\n按姓名查询\n"); search_name(); break; default:break; } system("cls"); } } void search_name()/*按姓名查找函数*/ { char name1[20]; int i,t,n=0; int m=read(); printf("\n请输入要查找的姓名: "); scanf("%s",name1); for(i=0;i<m;i++) if(strcmp(name1,Staffer[i].name)==0) { if(n==0) { printf("\n已找到以下信息:\n"); printf("\n职工号\t姓名\t性别\t年龄\t身份证号\t \t简历\t \n"); } n++; printf("\n %d\t%s\t %c\t %d\t%s\t %s\t\n",Staffer[i].Number,Staffer[i].name, Staffer[i].sex,Staffer[i].age,Staffer[i].shen,Staffer[i].jian); } if(n==0) { printf("\n对不起,贵公司没有该员工!\n"); getchar();getchar(); } else { printf("\n查询到有 %d 个员工符合要求。\n",n); printf("\n"); printf("删除员工请按 1,修改信息请按 2,继续查询请按 3,返回上一层请按 4,\n\n\t\t\t返回主菜单请按 0 :"); scanf("%d",&t); switch(t) { case 0: system("cls"); main(); break; case 1: Delete(); break; case 2: change(); break; case 3: break; case 4: system("cls"); search(); break; default:break; } } } void change() /*修改函数*/ { int Number; //职工号号 char name[20]; //姓名 char sex; // 性别 int age; // 年龄 char shen[20]; //身份证号 char jian[20]; //简历 int b=1,c,i,n,t,k=0; int m=read(); /*导入文件内的信息*/ printf("\n"); printf("请输入要修改的职工的职工号: "); scanf("%d",&Number); system("cls"); for(i=0;i<m;i++) { if(Staffer[i].Number==Number) { k=1; printf("\n已找到该职工号员工,其记录为:\n"); printf("\n职工号\t姓名\t性别\t年龄\t身份证号\t 简历\t \n"); printf("\n %d\t%s\t %c\t %d\t%s\t %s\t\n",Staffer[i].Number,Staffer[i].name, Staffer[i].sex,Staffer[i].age,Staffer[i].shen,Staffer[i].jian); printf("\n确认修改请按1,取消修改请按0:"); scanf("%d",&n); if(n==1) { printf("\n需要进行修改的选项\n 1.职工号 2.姓名 3.性别 4.年龄 5.身份证号 6.简历 \n"); printf("请输入你想修改的那一项序号: "); scanf("%d",&c); do { switch(c) { case 1: printf("职工号改为: "); scanf("%d",&Number); Staffer[i].Number=Number; break; case 2: printf("姓名改为: "); scanf("%s",name); strcpy(Staffer[i].name,name); break; case 3: printf("性别改为:"); scanf("%c",&sex); Staffer[i].sex=sex; break; case 4: printf("年龄改为: "); scanf("%d",&age); Staffer[i].age=age; break; case 5: printf("身份证号改为: "); scanf("%s",shen); strcpy(Staffer[i].shen,shen); break; case 6: printf("简历改为: "); scanf("%s",&jian); strcpy(Staffer[i].jian,jian); break; } printf("\n确认修改 请按1,重新输入 请按2: "); scanf("%d",&b); if(b==1) { system("cls"); save(m);//储存修改后的数据 printf("\n"); display();//浏览修改后的数据 } } while(b==2); } } else if(i==(m-1)) i++; } if(k==0) { printf("\n对不起,您输入有误!\n"); getchar(); getchar(); } else{ printf("\n继续修改请按 1,退出修改请按 0: "); scanf("%d",&t); } system("cls"); switch(t) { case 1: display(); change();//返回修改函数 break; case 0: break; default:break; } system("cls"); } void order()/*排序函数*/ { int d,f; do { printf("\n按年龄排序请按 1,返回主菜单请按 0: "); scanf("%d",&d); if(d>=0&&d<=2) { f=1; break; } else { f=0; printf("对不起,您输入有误,请重新选择!"); } }while(f==0); system("cls"); while(f==1) { switch(d) { case 1: printf("\n按年龄排序为(由低到高排列):\n"); order_age(); break; case 0: system("cls"); main(); break; } system("cls"); } } void order_Num()/*按职工号排序函数*/ //浏览信息时按照职工号由小到大顺序排序 { int i,j; int m=read(); for(i=0;i<m-1;i++) for(j=0;j<m-1-i;j++) if(Staffer[j].Number>Staffer[j+1].Number)/*排序*/ { Staffer1=Staffer[j]; Staffer[j]=Staffer[j+1]; Staffer[j+1]=Staffer1; } save(m); //按职工号由小到大的顺序存储 } void order_age()/*按年龄排序函数*/ { int i,k,j; int m=read(); for(i=0;i<m-1;i++) for(j=0;j<m-1-i;j++) if(Staffer[j].age>Staffer[j+1].age)/*排序*/ { Staffer1=Staffer[j]; Staffer[j]=Staffer[j+1]; Staffer[j+1]=Staffer1; } save(m); //按年龄由低到高顺序存储 printf("\n职工号\t姓名\t性别\t年龄\t身份证号\t \t简历\t \n"); for(i=0;i<m;i++) printf("\n %d\t%s\t %c\t %d\t%s\t %s\t\n",Staffer[i].Number,Staffer[i].name, Staffer[i].sex,Staffer[i].age,Staffer[i].shen,Staffer[i].jian); printf("\n返回上一层请按 1,返回主菜单请按 0: "); scanf("%d",&k); switch(k) { case 1: system("cls"); order(); break; case 0: system("cls"); main(); break; default:break; } system("cls"); }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/34128.html