《C语言课程设计 高校人事管理程序》.docx
- 文档编号:3223543
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:49
- 大小:301.16KB
《C语言课程设计 高校人事管理程序》.docx
《《C语言课程设计 高校人事管理程序》.docx》由会员分享,可在线阅读,更多相关《《C语言课程设计 高校人事管理程序》.docx(49页珍藏版)》请在冰点文库上搜索。
《C语言课程设计高校人事管理程序》
《C语言程序设计》
课程设计报告
系部:
三系
班级:
11通信
(1)班
学号:
20110306111
姓名:
张梦瑶
设计题目:
高校人事管理程序
成绩:
指导教师:
徐 化 祥
开课时间:
2011-2012学年第2学期
2012 年 6 月
课程设计(报告)内容要求:
1.课程设计的目的
(1)熟练掌握C语言的基本知识和技能;
(2)掌握程序设计的一些经典算法和基本方法;
(3)了解数组、指针和结构体的应用;
(4)利用所学的基本知识和技能,解决日常生活中经常面临的问题;
(5)培养分析、解决问题的能力;培养撰写报告、科技论文的能力。
2.课程设计的任务及要求
1)课程设计题目:
高校人事管理程序
2)基本内容:
:
(1)设计一个功能菜单,将程序的各个功能显示出来,并有选择提示;
(2)应包含职工的职工号、职工姓名、性别、出生日期、部门、岗位角色、职称、工龄、来校时间、月收入等职工基本信息;
(3)要求有错误提示功能。
例如输入数据错误,提示用户重新输入。
(4)具有新增、修改、删除等功能;
(5)具有查询功能,且能够按职工号或职工姓名查询某一职工的信息。
(6)使用文件功能,信息的输入输出用文件的存取和显示的方式,建立文件,直接存取默认文件或指定文件。
3.提交内容:
(1)电子文档:
可执行文件(.exe)和程序源文件(.c)及使用说明文件(.txt);
(2)书面文档:
课程设计报告。
4.评分标准:
(1)完成基本功能,程序运行基本正常;(60分)
(2)程序界面友好,设置错误提示或者按照要求改变结果;(10分)
(3)完成课程设计报告和使用说明书,文字流畅,图表清晰,格式规范;(10分)
(4)出勤与回答问题情况。
(20分)
(5)在完成基本要求的基础上,设计新颖、功能丰富、运行稳定的作品,酌情加分。
学生签名:
张梦瑶
2012年 6 月 日
一、
功能描述
(1)输入记录模块。
输入记录模块主要完成将数据存入数组中的工作。
在此高校人事信息管理系统中,记录可以从以二进制形式存储的数据文件中读入,也可以从键盘逐个输入记录。
记录由职工的基本信息字段构成。
当从数据文件中读入记录时,它就是在以记录为单位存储的数据文件中,将记录逐条复制到数组元素中。
(2)查询记录模块。
查询记录模块主要完成在数组中查找满足相关条件的记录。
在此人事管理系统中,用户可以按照职工编号或姓名在数组中进行查找。
若找到该记录,则以表格形式打印出此记录的信息;否则,返回一个-1的值,并打印出未找到记录的提示信息。
(3)更新记录模块。
更新记录模块主要完成对记录的维护。
在此人事管理系统中,实现对记录的修改、删除和排序操作。
一般而言,系统进行了这些操作之后,需要将修改的数据存入源数据文件。
(4)统计记录模块。
统计记录模块主要完成对职工总人数、性别、工龄在各等级的统计。
(5)输出记录模块。
输出记录模块主要完成两个任务。
第一,它实现对记录的存盘操作,即将数组中各元素中存储的记录信息写入数据文件中。
第二,它实现将数组中存储的记录信息以表格的形式在屏幕上打印出来。
图1高校人事管理系统功能模块图
二、总体设计
(一)功能模块设计
1.主控main()函数执行流程
高校人事管理系统执行主流程如图2所示。
它先以可读写的方式打开数据文件,此文件默认为“c:
\zgxx”,若该文件不存在,则新建此文件。
当打开文件操作成功后,则从文件中一次读出一条记录,添加到新建的数组中,然后执行显示主菜单和进入主循环操作,进行按键判断。
在判断键值时,有效的输入为0—8之间的任意数值,其他输入都被视为错误按键。
若输入为0(即变量select=0),则会继续判断是否在对记录进行了更新操作之后了存盘操作,若未存盘,则全局变量saveflag=1,系统会提示用户是否需要进行数据存盘操作,用户输入y或Y,系统会进行存盘操作。
最后,系统执行退出人事管理系统的操作。
若选择1,则调用Add()函数,执行增加记录操作;若选择2,则调用Del()函数,执行删除记录操作;若选择3,则调用Qur()函数,执行查询记录操作;若选择4,则调用Modify()函数,执行修改记录操作;若选择5,则调用Tongji()函数,执行统计记录操作;若选择6,则调用Sort()函数,执行排序记录的操作;若选择7,则调用Save()函数,执行将记录存入磁盘中的数据文件的操作;若选择8,则调用Disp()函数,执行将记录以表格的形式打印输出至屏幕的操作;若输入0—8之外的值,则调用Wrong()函数,给出按键错误的提示。
图2主控函数执行流程图
2.输入记录模块
输入记录模块主要实现将数据存入数组中。
当从数据文件中读出记录时,它调用fread(&zg[count],sizeof(ZGXX),1,fp)文件读取函数,执行一次从文件中读取一条职工信息记录存入某个数组元素中的操作,并且这个操作在main()中调用执行,即在人事管理系统进入显示菜单界面时,该操作已经执行了。
若该文件中没有数据,系统会提示数组为空,没有任何记录可操作,此时,用户选择1,调用Add()函数,进行记录的输入,既完成在数组中添加元素的操作。
3.查询记录模块
查询记录模块主要实现在数组中按职工编号或姓名查找满足相关条件的记录。
在查询函数Qur()中,为了遵循模块化编程的原则,我们将在数组中进行的记录定位操作设计成了一个单独的函数intLocate(ZGXXv[],charmessage[],charway[]),参数message[]保存要查找的具体内容,way[]保存要查找的字段(值为字符串类型的num或者name),若找到该记录,则返回指向该记录的数组元素下标;否则,返回一个-1的值。
4.更新记录模块
更新记录模块主要实现对记录的修改、删除和排序操作。
因为记录是以数组的结构形式存储的,所以这些操作都在数组中完成。
下面分别介绍这3个功能模块。
1)修改记录
修改记录操作需要对数组中目标元素域中的值进行修改,它分两步完成。
第一步,输入要修改的职工编号,输入后调用定位函数Locate()在数组中逐个对职工编号字段的值进行比较,直到找到该职工编号的记录;第二步,若找到该记录,则修改除职工编号之外的各字段的值,并将存盘标记变量saveflag置1,表示已经对记录进行了修改,但还未进行存盘操作。
2)删除记录
删除记录操作完成删除指定职工编号或姓名的记录,它也分两步完成。
第一
步,输入要删除的职工编号或姓名,输入后调用定位函数Locate()在数组中逐个对职工编号或姓名字段的值进行比较,直到找到该职工的编号或姓名的记录,并返回指向该记录的数组元素下标;第二步,若找到该记录,则从记录所在元素的后续元素起,依次向前移一个元素位置,有值的数组元素个数减1。
3)排序记录
冒泡排序法属于内部排序法的一种,这是运用数据值比较后,依据判断规则对数据位置进行交换,以达到排序的目的。
针对数组结构的特点,这里采用这种排序法来分别`实现按工龄和月收入从高到低的排序。
5.统计记录模块
该模块主要完成对职工总人数、男女职工人数和工龄在各个等级人数的统计。
主要通过依次读取数组中元素的数据域中的性别的值进行比较判断的形式,完成对男女职工人数的统计,通过读取数组中元素的数据域中的工龄的值进行比较判断的形式,完成工龄在各个等级的人数统计。
6.输出记录模块
当把记录输出至文件时,调用fwrite(&v[i],sizeof(ZGXX),1,fp)函数,将数组元素v[i]中各字段的值,写入文件指针fp所指的文件;当把记录输出至屏幕时,调用voidDisp()函数,将数组中存储的记录信息以表格的形式在屏幕上打印出来。
(二)数据结构设计
本程序定义了结构体employee,用于存放职工的基本信息。
typedefstructemployee
{
charnum[10];
charname[15];
charsex[5];
charbirth[15];
chardepartment[15];
charpost[15];
charzc[15];
charcome_time[15];
intwork_time;
intsalary;
}ZGXX;
其各字段含义如下:
●num[10]:
保存职工编号。
●name[15]:
保存职工姓名。
●sex[5]:
保存职工性别。
●birth[15]:
保存职工出生日期。
●department[15]:
保存职工部门。
●post[15]:
保存职工职位。
●zc[15]:
保存职工职称。
●come_time[15]:
保存职工来校时间
●work_time[15]:
保存职工工龄。
●Salary:
保存职工月收入。
(三)函数功能描述
1)printheader()
函数原型:
voidprintheader()
Printheader()函数用于在以表格形式显示记录时,打印输出表头信息。
2)printdata()
函数原型:
voidprintdata(ZGXXpp)
printdata()函数用于以表格显示的方式,打印输出单个数组元素pp中的记录信息。
3)Disp()
函数原型:
voidDisp(ZGXXv[],intn)
Disp()函数用于显示数组v中存储的n条记录,内容为employee结构体中定义的内容。
4)numberinput()
函数原型:
intnumberinput(char*notice)
numberinput()函数用于输入数值型数据,notice用于保存printf()中输出的提示信息。
该函数返回用户输入的整型数据值。
5)Stringinput()
函数原型:
voidStringinput(char*p,intlenth,char*notice)
Stringinput()函数用于输入字符串,并进行字符串长度验证(长度 Notice用于保存printf()中输出的提示信息。 6)Locate() 函数原型: intLocate(ZGXXv[],intn,charmassage[],charway[]) Locate()函数用于定位数组中符合要求的元素,并返回该元素的下标值。 参数message[]保存要查找的具体内容,way[]保存按什么字段在数组v中查找。 7)Add() 函数原型: intAdd(ZGXXv[],intn) Add()函数用于在数组v中增加职工信息记录元素,并返回数组中的当前记录数。 8)Qur() 函数原型: voidQur(ZGXXv[],intn) Qur()函数用于在数组v中按职工编号或姓名查找满足条件的记录,并显示出来。 9)Del() 函数原型: intDel(ZGXXv[],intn) Del()函数用于先在数组v中找到满足条件的记录,然后删除该记录。 10)Modify() 函数原型: voidModify(ZGXXv[],intn) Modify()函数用于在数组v中修改记录元素。 11)Tongji() 函数原型: voidTongji(ZGXXv[],intn) Tongji()函数用于在数组v中完成记录的统计工作,统计高校职工的总人数、男女分布和工龄的整体分布情况。 12)Sort() 函数原型: voidSort(ZGXXv[],intn) Sort()函数用于在数组v中完成利用冒泡排序算法实现数组按工号字段的升序排序和分别按工龄、月收入的降序排序。 13)Save() 函数原型: voidSave(ZGXXv[],intn) Save()函数用于将保存职工信息的数组v中的n个元素写入磁盘的数据文件中。 14)主函数main() main()是整个人事管理系统控制部分,其详细说明可参考图2. 三、设计代码 #include #include #include #include #defineHEADER1"---------------------------------------ZGXX------------------------------------\n" #defineHEADER2"|num|name|sex|birth|department|post|zc|come_time|work_time|salary|\n" #defineHEADER3"|---|----|---|-----|----------|----|----|---------|---------|------|\n" #defineFORMAT"|%3s|%4s|%3s|%5s|%10s|%4s|%4s|%9s|%9d|%6d|\n" #defineDATAp->num,p->name,p->sex,p->birth,p->department,p->post,p->zc,p->come_time,p->work_time,p->salary #defineEND"----------------------------------------------------------------------------\n" #defineN5 intsaveflag=0;/*是否需要存盘的标志变量*/ /*定义与职工信息有关的数据结构*/ typedefstructemployee { charnum[10];/*职工编号*/ charname[15];/*职工姓名*/ charsex[5];/*性别*/ charbirth[15];/*出生日期*/ chardepartment[15];/*部门*/ charpost[15];/*职位*/ charzc[15];/*职称*/ charcome_time[15];/*来校时间*/ intwork_time;/*工龄*/ intsalary;/*月收入*/ }ZGXX; voidmenu() { system("cls"); printf("\nTheEmployee'SalaryManagementSystem\n\n"); printf("*************************Menu********************************\n"); printf("*1inputrecord2deleterecord*\n"); printf("*3searchrecord4modifyrecord*\n"); printf("*5countrecord6sortrecord*\n"); printf("*7savereord8displayrecord*\n"); printf("*0quitsystem*\n"); printf("*************************************************************\n"); } voidprintheader()/*格式化输出表头*/ { printf(HEADER1); printf(HEADER2); printf(HEADER3); } voidprintdata(ZGXXpp)/*格式化输出表中数据*/ { ZGXX*p; p=&pp; printf(FORMAT,DATA); } voidwait()/*等待信息*/ { printf("\nPressanykeytocontinue......\n"); getch(); } voidWrong()/*输出按键错误信息*/ { printf("\n\n\n\n\n***********Error: inputhaswrong! pressanykeytocontinue**********\n"); getch(); } voidNofind()/*输出未查找此职工的信息*/ { printf("\n=====>Notfindthisemployeerecord! \n"); } voidDisp(ZGXXv[],intn)/*显示数组v[]中存储的记录,内容为employee结构中定义的内容*/ { inti; if(n==0)/*表示没有职工信息记录*/ { printf("\n=====>Notemployeerecord! \n"); wait();/*xiugai*/ return; } printf("\n\n"); printheader();/*输出表格头部*/ i=0; while(i { printdata(v[i]); i++; printf(HEADER3); } printf(END); wait(); } /*用于定位数组中符合要求的记录,并返回记录下标。 参数: massage[]保存要查找的具体内容,way[]保存在数组中查找符合要求记录的方式*/ intLocate(ZGXXv[],intn,charmessage[],charway[]) { inti=0; if(strcmp(way,"num")==0)/*按职工编号查询*/ { while(i { if(strcmp(v[i].num,message)==0)/*若找到message值的职工编号*/ returni; i++; } } elseif(strcmp(way,"name")==0)/*按职工姓名查询*/ { while(i { if(strcmp(v[i].name,message)==0)/*若找到message值的姓名*/ returni; i++; } } return-1;/*若未找到,返回一个整数-1*/ } /*输入字符串,并进行长度验证(长度 voidstringinput(char*p,intlenth,char*notice) { charn[255]; do{ printf(notice);/*显示提示信息*/ scanf("%s",n);/*输入字符串*/ if(strlen(n)>lenth) printf("\nexceedtherequiredlength! \n");/*进行长度校验,超过lenth值重新输入*/ }while(strlen(n)>lenth); strcpy(p,n);/*将输入的字符串拷贝到字符串p中*/ } /*输入数值,0<=数值)*/ intnumberinput(char*notice) { intx=0; do{ printf(notice);/*显示提示信息*/ scanf("%d",&x);/*输入如工龄等数值型的值*/ if(x<0)printf("\nthenumbermust>=0! \n");/*进行数值校验*/ }while(x<0); returnx; } /*增加职工信息记录*/ intAdd(ZGXXv[],intn) { charch,num[10]; inti,flag=0; system("cls"); Disp(v,n);/*先打印出已有的职工信息*/ while (1)/*一次可输入多条记录,直至输入职工编号为0的记录才结束添加操作*/ { while (1)/*输入职工编号,保证该编号没有被使用,若输入编号为0,则退出添加记录操作*/ { stringinput(num,10,"inputnumber(press'0'returnmenu): ");/*格式化输入编号并检验*/ flag=0; if(strcmp(num,"0")==0)/*输入为0,则退出添加操作,返回主界面*/ {returnn;} i=0; while(i { if(strcmp(v[i].num,num)==0) { flag=1; break; } i++; } if(flag==1)/*提示用户是否重新输入*/ { printf("==>Thenumber%sisexisting,tryagain? (y/n): ",num); wait(); scanf("%c",&ch); if(ch=='y'||ch=='Y') continue; else returnn; } else {break;} } strcpy(v[n].num,num);/*将字符串num拷贝到v[n].num中*/ stringinput(v[n].name,15,"姓名: ");/*输入并检验职工姓名信息*/ stringinput(v[n].sex,5,"性别: ");/*输入并检验职工性别信息*/ stringinput(v[n].birth,15,"出生日期: ");/*输入并检验职工生日信息*/ stringinput(v[n].department,15,"部门: ");/*输入并检验职工部门信息*/ stringinput(v[n].post,15,"职位: ");/*输入并检验职工职位信息*/ stringinput(v[n].zc,15,"职称: ");/*输入并检验职工职称信息*/ stringinput(v[n].come_time,15,"来校时间: ");/*输入并验证职工来校时间信息*/ v[n].work_time=numberinput("工龄: ");/*输入并检验职工工龄信息*/ v[n].salary=numberinput("月收入: ");/*输入并检验职工月收入信息*/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言课程设计 高校人事管理程序 C语言课程设计 高校人事管理程序 语言 课程设计 高校 人事管理 程序