有一个职工类Employee,属性为commandname属性,sex,salary,department.设计一个测试程序,给营销部男性工资加150元

《C语言课程设计 高校人事管理程序》- 道客巴巴
《C 语言程序设计》 课程设计报告
11 通信(1)班
设计题目:
高校人事管理程序
指导教师:
开课时间:
学年第 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)在完成基本要求的基础上,设计新颖、功能丰富、运行稳定的作品,酌情加分。
学生签名:
一、 功能描述 (1) 输入记录模块。输入记录模块主要完成将数据存入数组中的工作。在此高校人事信息管理系统中,记录可以从以二进制形式存储的数据文件中读入,也可以从键盘逐个输入记录。记录由职工的基本信息字段构成。当从数据文件中读入记录时,它就是在以记录为单位存储的数据文件中,将记录逐条复制到数组元素中。 (2) 查询记录模块。查询记录模块主要完成在数组中查找满足相关条件的记录。在此人事管理系统中,用户可以按照职工编号或姓名在数组中进行查找。若找到该记录,则以表格形式打印出此记录的信息;否则,返回一个-1 的值,并打印出未找到记录的提示信息。 (3) 更新记录模块。更新记录模块主要完成对记录的维护。在此人事管理系统中,实现对记录的修改、删除和排序操作。一般而言,系统进行了这些操作之后,需要将修改的数据存入源数据文件。 (4) 统计记录模块。统计记录模块主要完成对职工总人数、性别、工龄在各等级的统计。 (5) 输出记录模块。输出记录模块主要完成两个任务。第一,它实现对记录的存盘操作,即将数组中各元素中存储的记录信息写入数据文件中。第二,它实现将数组中存储的记录信息以表格的形式在屏幕上打印出来。
高校人事管理系统功能模块图 二、 总体设计
二、 总体设计
(一)功能模块设计
(一)功能模块设计
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()函数,给出按键错误的提示。 开始 以可读写的方式打开一个数据文件 将此文件的内容读出并存入一个新的结构体类型的数组 调用 menu()菜单函数 进入 while(1)主循 环 输入 0-8 中的数值选择相应操作 输入是否为 0 判断键值,调用相应函 数,完成相应功能
结束 调用 Save()函数,进行写数据文件操作
是否已对修改进行了存盘 是 否 否 是
主控函数执行流程图 2.输入记录模块 输入记录模块主要实现将数据存入数组中。当从数据文件中读出记录时,它调用 fread(&zg[count],sizeof(ZGXX),1,fp)文件读取函数,执行一次从文件中读取一条职工信息记录存入某个数组元素中的操作,并且这个操作在 main()中调用执行,即在人事管理系统进入显示菜单界面时,该操作已经执行了。若该文件中没有数据,系统会提示数组为空,没有任何记录可操作,此时,用户选择 1,调用 Add()函数,进行记录的输入,既完成在数组中添加元素的操作。 3.查询记录模块 查询记录模块主要实现在数组中按职工编号或姓名查找满足相关条件的记录。在查询函数 Qur()中,为了遵循模块化编程的原则,我们将在数组中进行的记 录 定 位 操 作 设 计 成 了 一 个 单 独 的 函 数 int Locate(ZGXX v[],char message[],char way[]),参数 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 所指的文件;当把记录输出至屏幕时,调用 void Disp()函数,将数组中存储的记录信息以表格的形式在屏幕上打印出来。 (二)数据结构设计 本程序定义了结构体 employee,用于存放职工的基本信息。 typedef struct employee {
char num[10];
char name[15];
char sex[5];
char birth[15];
char department[15];
char post[15];
char zc[15];
char come_time[15];
其各字段含义如下: ? num[10]:保存职工编号。
? name[15]:保存职工姓名。 ? sex[5]:保存职工性别。 ? birth[15]:保存职工出生日期。 ? department[15]:保存职工部门。 ? post[15]:保存职工职位。 ? zc[15]:保存职工职称。 ? come_time[15]:保存职工来校时间 ? work_time[15]:保存职工工龄。 ? Salary:保存职工月收入。
(三)函数功能描述
(三)函数功能描述
1)printheader()
函数原型:void printheader()
Printheader()函数用于在以表格形式显示记录时,打印输出表头信息。
2)printdata()
函数原型:void printdata(ZGXX pp)
printdata()函数用于以表格显示的方式,打印输出单个数组元素 pp 中的记录信息。
函数原型:void Disp(ZGXX v[],int n)
Disp()函数用于显示数组 v 中存储的 n 条记录,内容为 employee 结构体中
定义的内容。 4)numberinput() 函数原型:int numberinput(char *notice) numberinput()函数用于输入数值型数据,notice 用于保存 printf()中输出的提示信息。该函数返回用户输入的整型数据值。 5)Stringinput() 函数原型:void Stringinput(char *p,int lenth,char *notice) Stringinput()函数用于输入字符串,并进行字符串长度验证(长度&lenth),p 用于保存输入的字符串,因为是以指针形式传递的,所以 p 相当于该函数的返回值。Notice 用于保存 printf()中输出的提示信息。 6)Locate() 函数原型:int Locate(ZGXX v[],int n,char massage[],char way[]) Locate()函数用于定位数组中符合要求的元素,并返回该元素的下标值。参数 message[]保存要查找的具体内容,way[]保存按什么字段在数组 v 中查找。 7)Add() 函数原型:int Add(ZGXX v[],int n) Add()函数用于在数组 v 中增加职工信息记录元素,并返回数组中的当前记录数。 8)Qur() 函数原型:void Qur(ZGXX v[],int n) Qur()函数用于在数组 v 中按职工编号或姓名查找满足条件的记录,并显示出来。 9)Del() 函数原型:int Del(ZGXX v[],int n) Del()函数用于先在数组 v 中找到满足条件的记录,然后删除该记录。 10) Modify() 函数原型:void Modify(ZGXX v[],int n) Modify()函数用于在数组 v 中修改记录元素。 11) Tongji() 函数原型:void Tongji(ZGXX v[],int n) Tongji()函数用于在数组 v 中完成记录的统计工作,统计高校职工的总人数、男女分布和工龄的整体分布情况。 12) Sort() 函数原型:void Sort(ZGXX v[],int n) Sort()函数用于在数组 v 中完成利用冒泡排序算法实现数组按工号字段的升序排序和分别按工龄、月收入的降序排序。 13) Save() 函数原型:void Save(ZGXX v[],int n) Save()函数用于将保存职工信息的数组v中的n个元素写入磁盘的数据文件中。 14) 主函数 main() main()是整个人事管理系统控制部分,其详细说明可参考图 2.
三、 设计代码
#include &stdio.h&
/*标准输入输出函数库*/ #include &stdlib.h&
/*标准函数库*/ #include &string.h&
/*字符串函数库*/ #include &conio.h&
/*屏幕操作函数库*/
#define HEADER1 &---------------------------------------ZGXX------------------------------------\n& #define HEADER2 &|num|name|sex|birth|department|post| zc |come_time|work_time|salary|\n& #define HEADER3 &|---|----|---|-----|----------|----|----|---------|---------|------|\n& #define FORMAT &|%3s|%4s|%3s|%5s|%10s|%4s|%4s|%9s|%9d|%6d|\n& #define DATA p-&num,p-&name,p-&sex,p-&birth,p-&department,p-&post,p-&zc,p-&come_time,p-&work_time,p-&salary #define END &----------------------------------------------------------------------------\n& #define N 5
int saveflag = 0;
/*是否需要存盘的标志变量*/ /*定义与职工信息有关的数据结构*/ typedef struct employee {
char num[10];
/*职工编号*/
char name[15];
/*职工姓名*/
char sex[5];
char birth[15];
/*出生日期*/
char department[15]; /*部门*/
char post[15];
char zc[15];
char come_time[15];
/*来校时间*/
/*月收入*/ }ZGXX;
void menu() {
system(&cls&);
printf(&\n
The Employee' Salary Management System \n\n&);
*************************Menu********************************\n&);
2 delete record
4 modify record
6 sort record
8 display record
*************************************************************\n&);
void printheader() /*格式化输出表头*/ {
printf(HEADER1);
printf(HEADER2);
printf(HEADER3); }
void printdata(ZGXX pp) /*格式化输出表中数据*/ {
printf(FORMAT,DATA); }
void wait()
/* 等待信息 */ {
printf(&\nPress any key to continue......\n&);
getch(); }
void Wrong()
/*输出按键错误信息*/ {
printf(&\n\n\n\n\n***********Error:input has wrong! press any key to continue**********\n&);
getch(); }
void Nofind()
/*输出未查找此职工的信息*/ {
printf(&\n=====&Not find this employee record!\n&); }
void Disp(ZGXX v[],int n)
/*显示数组 v[]中存储的记录,内容为 employee结构中定义的内容*/ {
/*表示没有职工信息记录*/
printf(&\n=====&Not employee record!\n&);
wait();/*xiugai*/
printf(&\n\n&);
printheader(); /*输出表格头部*/
while(i&n)
/*逐条输出数组中存储的职工信息*/
printdata(v[i]);
printf(HEADER3);
printf(END);
/*用于定位数组中符合要求的记录,并返回记录下标。参数:massage[]保存要查找的具体内容,way[]保存在数组中查找符合要求记录的方式*/ int Locate(ZGXX v[],int n,char message[],char way[]) {
if(strcmp(way,&num&)==0) /*按职工编号查询*/
while(i&n)
if(strcmp(v[i].num,message)==0) /*若找到 message 值的职工编号*/
else if(strcmp(way,&name&)==0)
/*按职工姓名查询*/
while(i&n)
if(strcmp(v[i].name,message)==0) /*若找到 message 值的姓名*/
return -1; /*若未找到,返回一个整数-1*/ }
/*输入字符串,并进行长度验证(长度&lenth)*/ void stringinput(char *p,int lenth,char *notice) {
char n[255];
printf(notice);
/*显示提示信息*/
scanf(&%s&,n);
/*输入字符串*/
if(strlen(n) & lenth)
printf(&\n exceed the required length! \n&); /*进行长度校验,超过 lenth 值重新输入*/
}while(strlen(n) & lenth);
strcpy(p,n); /*将输入的字符串拷贝到字符串 p 中*/
/*输入数值,0&=数值)*/ int numberinput(char *notice) {
printf(notice);
/*显示提示信息*/
scanf(&%d&,&x);
/*输入如工龄等数值型的值*/
if(x&0) printf(&\n the number must &=0! \n&); /*进行数值校验*/
}while(x&0); }
/*增加职工信息记录*/ int Add(ZGXX v[],int n) {
char ch,num[10];
int i,flag=0;
system(&cls&);
Disp(v,n); /*先打印出已有的职工信息*/
while(1) /*一次可输入多条记录,直至输入职工编号为 0 的记录才结束添加操作*/
while(1) /*输入职工编号,保证该编号没有被使用,若输入编号为 0,则退出添加记录操作*/
stringinput(num,10,&input number(press '0'return menu):&); /*格式化输入编号并检验*/
if(strcmp(num,&0&)==0) /*输入为 0,则退出添加操作,返回主界面*/
while(i&n) /*查询该编号是否已经存在,若存在则要求重新输入一个未被占用的编号*/
if(strcmp(v[i].num,num)==0)
if(flag==1) /*提示用户是否重新输入*/
printf(&==&The number %s is existing,try again?(y/n):&,num);
scanf(&%c&,&ch);
if(ch=='y'||ch=='Y')
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(&月收入:&);
/*输入并检验职工月收入信息*/
saveflag=1;
/*删除记录:先找到保存该记录的数组元素的下标值,然后在数组中删除该数组元素*/ int Del(ZGXX v[],int n) {
char message[20];
int p=0,i=0;
system(&cls&);
printf(&\n=====&No employee record!\n&);
system(&cls&);
Disp(v,n);
printf(&\n
=====&1 Delete by number
=====&2 Delete by name\n&);
please choice[1,2]:&);
scanf(&%d&,&choice);
if(choice==1)
stringinput(message,10,&input the existing employee number:&);
p=Locate(v,n,message,&num&);
for(i=p+1;i&n;i++) /*删除此记录,后面记录向前移*/
strcpy(v[i-1].num,v[i].num);
strcpy(v[i-1].name,v[i].name);
strcpy(v[i-1].sex,v[i].sex);
strcpy(v[i-1].birth,v[i].birth);
strcpy(v[i-1].department,v[i].department);
strcpy(v[i-1].post,v[i].post);
strcpy(v[i-1].zc,v[i].zc);
strcpy(v[i-1].come_time,v[i].come_time);
v[i-1].work_time = v[i].work_
v[i-1].salary = v[i].
printf(&\n==&delete success!\n&);
saveflag=1;
else if(choice==2) /*先按姓名查询到该记录所在的数组元素的下标值*/
stringinput(message,15,&input the existing employee name:&);
p=Locate(v,n,message,&name&);
for(i=p+1;i&n;i++)
/*删除此记录,后面记录向前移*/
strcpy(v[i-1].num,v[i].num);
strcpy(v[i-1].name,v[i].name);
strcpy(v[i-1].sex,v[i].sex);
strcpy(v[i-1].birth,v[i].birth);
strcpy(v[i-1].department,v[i].department);
strcpy(v[i-1].post,v[i].post);
strcpy(v[i-1].zc,v[i].zc);
strcpy(v[i-1].come_time,v[i].come_time);
v[i-1].work_time = v[i].work_
v[i-1].salary = v[i].
printf(&\n=====&delete success!\n&);
saveflag=1;
/*按职工编号或姓名,查询记录*/ void Qur(ZGXX v[],int n) { /*1:按编号查,2:按姓名查,其他:返回主界面(菜单)*/
char search[20]; /*保存用户输入的查询内容*/
if(n&=0) /*若数组为空*/
system(&cls&);
printf(&\n=====&No employee record!\n&);
system(&cls&);
printf(&\n
=====&1 Search by number
=====&2 Search by name\n&);
please choice[1,2]:&);
scanf(&%d&,&choice);
if(choice==1)
/*按编号查询*/
stringinput(search,10,&input the existing employee number:&);
p=Locate(v,n,search,&num&);/*在数组 v 中查找编号为 search 值的元素,并返回该数组元素的下标值*/
if(p!=-1) /*若找到该记录*/
printheader();
printdata(v[p]);
printf(END);
else if(choice==2) /*按姓名查询*/
stringinput(search,15,&input the existing employee name:&);
p=Locate(v,n,search,&name&);
printheader();
printdata(v[p]);
printf(END);
/*修改记录。先按输入的职工编号查询到该记录,然后提示用户修改编号之外的值,编号不能修改*/ void Modify(ZGXX v[],int n) {
char findmess[20];
system(&cls&);
printf(&\n=====&No employee record!\n&);
system(&cls&);
printf(&modify employee recorder&);
Disp(v,n);
stringinput(findmess,10,&input the existing employee number:&); /*输入并检验该编号*/
p=Locate(v,n,findmess,&num&); /*查询到该数组元素,并返回下标值*/
if(p!=-1) /*若 p!=-1,表明已经找到该数组元素*/
printf(&编号:%s,\n&,v[p].num);
printf(&姓名:%s,&,v[p].name);
stringinput(v[p].name,15,&input new name:&);
printf(&性别:%s,&,v[p].sex);
stringinput(v[p].sex,5,&input new sex:&);
printf(&出生日期:%s,&,v[p].birth);
stringinput(v[p].birth,15,&input new birthday:&);
printf(&部门:%s,&,v[p].department);
stringinput(v[p].department,15,&input new department:&);
printf(&职位:%s,&,v[p].post);
stringinput(v[p].post,15,&input new post:&);
printf(&职称:%s,&,v[p].zc);
stringinput(v[p].zc,15,&input new zc:&);
printf(&来校时间:%s,&,v[p].come_time);
stringinput(v[p].come_time,15,&input new come_time:&);
printf(&工龄:%d,&,v[p].work_time);
v[p].work_time = numberinput(&input new work_time:&);
printf(&月收入:%d,&,v[p].salary);
v[p].salary = numberinput(&input new salary:&);
printf(&\n=====&modify success!\n&);
Disp(v,n);
saveflag=1;
/*统计职工总数,分别按性别、工龄统计职工人数*/ void Tongji(ZGXX v[],int n) {
int total,man = 0,woman = 0; /*分别保存总人数、男职工数、女职工数*/
system(&cls&);
printf(&\n=====&Not employee record!\n&);
system(&cls&);
Disp(v,n);
printf(&\n
1.Count the total workers
2.Count by sex
3.Count by work_time\n&);
&Please input your choice[1,2,3]:&);
scanf(&%d&,&choice);
if (choice == 1)
/*总人数*/
printf(&\n--------------------------the TongJi result----------------------------\n&);
printf(&The total workers:%d (ren)\n&,total);
printf(&-----------------------------------------------------------------------\n&);
if (choice == 2) /*按性别统计*/
for (i = 0; i & i++)
if(strcmp(v[i].sex, &m&) == 0)
printf(&\n--------------------------the TongJi result----------------------------\n&);
printf(&The male workers:%d (ren)\nThe female workers:%d (ren)\n&,man,woman);
printf(&-----------------------------------------------------------------------\n&);
if (choice == 3) /*按工龄统计*/
int count0 = 0,count5=0,count10=0,count15=0,count20=0;
for (i = 0; i & i++)
if (v[i].work_time &= 20)
count20++;
if (v[i].work_time &= 15)
count15++;
if (v[i].work_time &= 10)
count10++;
if (v[i].work_time &= 5)
if (v[i].work_time & 5)
printf(&\n--------------------------the TongJi result----------------------------\n&);
printf(&work_time&=
20:%d (ren)\n&,count20);
printf(&15&=work_time&20:%d (ren)\n&,count15);
printf(&10&=work_time&15:%d (ren)\n&,count10);
printf(&5&=work_time&10 :%d (ren)\n&,count5);
printf(&work_time&5
:%d (ren)\n&,count0);
printf(&-----------------------------------------------------------------------\n&);
/*利用冒泡排序法实现数组的按工号的升序排序,工龄、月收入字段的降序排序,从高到低*/ void Sort(ZGXX v[],int n) {
int i=0,j=0,flag=0;
system(&cls&);
printf(&\n=====&Not employee record!\n&);
system(&cls&);
Disp(v,n);
/*显示排序前的所有记录*/
printf(&\n
1.Sort by number
2.Sort by work_time
3.Sort by salary\n&);
printf(&\n
Please input your choice[1,2,3]:&);
scanf(&%d&,&choice);
if (choice == 1)
/*按工号升序排序*/
for(i=0;i&n;i++)
for(j=0;j&n-1;j++)
if(strcmp(v[j].num,v[j+1].num) & 0)
strcpy(x.num,v[j].num);
/*利用结构变量 x 实现数组元素的交换*/
strcpy(x.name,v[j].name);
strcpy(x.sex,v[j].sex);
strcpy(x.birth,v[j].birth);
strcpy(x.department,v[j].department);
strcpy(x.post,v[j].post);
strcpy(x.zc,v[j].zc);
strcpy(x.come_time,v[j].come_time);
x.work_time = v[j].work_
x.salary = v[j].
strcpy(v[j].num,v[j+1].num);
strcpy(v[j].name,v[j+1].name);
strcpy(v[j].sex,v[j+1].sex);
strcpy(v[j].birth,v[j+1].birth);
strcpy(v[j].department,v[j+1].department);
strcpy(v[j].post,v[j+1].post);
strcpy(v[j].zc,v[j+1].zc);
strcpy(v[j].come_time,v[j+1].come_time);
v[j].work_time = v[j+1].work_
v[j].salary = v[j+1].
strcpy(v[j+1].num,x.num);
strcpy(v[j+1].name,x.name);
strcpy(v[j+1].sex,x.sex);
strcpy(v[j+1].birth,x.birth);
strcpy(v[j+1].department,x.department);
strcpy(v[j+1].post,x.post);
strcpy(v[j+1].zc,x.zc);
strcpy(v[j+1].come_time,x.come_time);
v[j+1].work_time = x.work_
v[j+1].salary = x.
if(flag==0)/*若标记 flag=0,意味着没有交换了,排序已经完成*/
Disp(v,n);
/*显示排序后的所有记录*/
saveflag=1;
printf(&\n
=====&sort complete!\n&);
if (choice == 2)
/*按工龄降序排序*/
for(i=0;i&n;i++)
for(j=0;j&n-1;j++)
if((v[j].work_time & v[j+1].work_time))
strcpy(x.num,v[j].num);
strcpy(x.name,v[j].name);
strcpy(x.sex,v[j].sex);
strcpy(x.birth,v[j].birth);
strcpy(x.department,v[j].department);
strcpy(x.post,v[j].post);
strcpy(x.zc,v[j].zc);
strcpy(x.come_time,v[j].come_time);
x.work_time = v[j].work_
x.salary = v[j].
strcpy(v[j].num,v[j+1].num);
strcpy(v[j].name,v[j+1].name);
strcpy(v[j].sex,v[j+1].sex);
strcpy(v[j].birth,v[j+1].birth);
strcpy(v[j].department,v[j+1].department);
strcpy(v[j].post,v[j+1].post);
strcpy(v[j].zc,v[j+1].zc);
strcpy(v[j].come_time,v[j+1].come_time);
v[j].work_time = v[j+1].work_
v[j].salary = v[j+1].
strcpy(v[j+1].num,x.num);
strcpy(v[j+1].name,x.name);
strcpy(v[j+1].sex,x.sex);
strcpy(v[j+1].birth,x.birth);
strcpy(v[j+1].department,x.department);
strcpy(v[j+1].post,x.post);
strcpy(v[j+1].zc,x.zc);
strcpy(v[j+1].come_time,x.come_time);
v[j+1].work_time = x.work_
v[j+1].salary = x.
if(flag==0)
Disp(v,n);
saveflag=1;
printf(&\n
=====&sort complete!\n&);
if (choice == 3)
/*按月收入降序排序*/
for(i=0;i&n;i++)
for(j=0;j&n-1;j++)
if((v[j].salary & v[j+1].salary))
strcpy(x.num,v[j].num);
strcpy(x.name,v[j].name);
strcpy(x.sex,v[j].sex);
strcpy(x.birth,v[j].birth);
strcpy(x.department,v[j].department);
strcpy(x.post,v[j].post);
strcpy(x.zc,v[j].zc);
strcpy(x.come_time,v[j].come_time);
x.work_time = v[j].work_
x.salary = v[j].
strcpy(v[j].num,v[j+1].num);
strcpy(v[j].name,v[j+1].name);
strcpy(v[j].sex,v[j+1].sex);
strcpy(v[j].birth,v[j+1].birth);
strcpy(v[j].department,v[j+1].department);
strcpy(v[j].post,v[j+1].post);
strcpy(v[j].zc,v[j+1].zc);
strcpy(v[j].come_time,v[j+1].come_time);
v[j].work_time = v[j+1].work_
v[j].salary = v[j+1].
strcpy(v[j+1].num,x.num);
strcpy(v[j+1].name,x.name);
strcpy(v[j+1].sex,x.sex);
strcpy(v[j+1].birth,x.birth);
strcpy(v[j+1].department,x.department);
strcpy(v[j+1].post,x.post);
strcpy(v[j+1].zc,x.zc);
strcpy(v[j+1].come_time,x.come_time);
v[j+1].work_time = x.work_
v[j+1].salary = x.
if(flag==0)
Disp(v,n);
saveflag=1;
printf(&\n
=====&sort complete!\n&);
/*数据存盘,若用户没有专门进行此操作且对数据有修改,在退出系统时, 会提示用户存盘*/ void Save(ZGXX v[],int n) {
fp=fopen(&c:\\zgxx&,&wb&);/*以只写方式打开二进制文件*/
if(fp==NULL) /*打开文件失败*/
printf(&\n=====&open file error!\n&);
for(i=0;i&n;i++)
if(fwrite(&v[i],sizeof(ZGXX),1,fp)==1)/*每次写一条记录或一个结构数组元素至文件*/
printf(&\n\n=====&save file complete,total saved's record number is:%d\n&,i);
saveflag=0;
system(&cls&);
printf(&the current link is empty,no employee record is saved!\n&);
fclose(fp); /*关闭此文件*/ }
void main() {
ZGXX zg[N];
/*定义结构体*/
/*文件指针*/
/*保存选择结果变量*/
/*保存(y,Y,n,N)*/
int count = 0;/*保存文件中的记录条数*/
fp = fopen(&c:\\zgxx&,&ab+&);
/*以追加方式打开二进制文件,可读可写,若文件不存在,会创建此文件*/
if (fp == NULL)
printf(&can not open file!\n&);
while (!feof(fp))
if (fread(&zg[count],sizeof(ZGXX),1,fp) == 1)/*一次从文件中读取一条职工信息记录*/
fclose(fp); /*关闭文件*/
printf(&\nopen file success,the total record number is:%d.\n&,count);
system(&cls&);
printf(&\n
Please enter your
choice(0-8):&);
/*显示提示信息*/
scanf(&%d&,&select);
if (select == 0)
if (saveflag == 1) /*若对数组的数据有修改且未进行存盘操作,则此标志为 1*/
printf(&\n
Whether save the modified record to
file?(y/n):&);
scanf(&%c&,&ch);
if (ch == 'y' || ch == 'Y')
Save(zg,count);
printf(&\n
thank you for useness!\n&);
switch(select)
case 1:count = Add(zg,count);
/*增加职工信息记录*/
case 2:count = Del(zg,count);
/*删除职工信息记录*/
case 3:Qur(zg,count);
/*查询职工信息记录*/
case 4:Modify(zg,count);
/*修改职工信息记录*/
case 5:Tongji(zg,count);
/*统计职工信息记录*/
case 6:Sort(zg,count);
/*排序职工信息记录*/
case 7:Save(zg,count);
/*保存职工信息记录*/
case 8:system(&cls&);Disp(zg,count);/*显示职工信息记录*/
default:Wrong();getchar();/*按键有误,必须为数值 0-8*/
四、 运行测试结果 1.主界面 当用户刚进入人事管理系统时,其主界面如图 3 所示。此时,系统已经将&c:\zgxx&文件打开,若文件不为空,则将数据从文件中逐条记录读出,并写入数组中。用户可选择 0&8 之间的数值,调用相应功能进行操作。当输入为 0时,退出此管理系统。
人事管理系统主界面
2.输入记录 当用户输入 1 并按 Enter 键后,即可进入数据输入界面。其输入记录过程如图 4 所示,这里输入了 4 条记录,当用户输入为 0 的职工编号时,它会结束输入过程,返回到主菜单界面。 图 4
输入记录 3.显示记录 图 4
输入记录 3.显示记录 当用户执行了输入记录或已经从数据文件中读取了记录之后,即可输入 8 并按 Enter 键,查看当前数组中的记录情况,如图 5 所示,此时表中有 4 条记录。
4.删除记录 当用户输入 2 并按 Enter 键后,即可进入记录删除界面。其删除记录的过程如图 6 所示,这里按职工编号删除了一条职工编号为 4 的记录。 图 6
删除记录 5.查找记录 图 6
删除记录 5.查找记录 当用户输入 3 并按 Enter 键后,即可进入记录查找界面。其查找记录过程如图 7 所示,可按职工编号或姓名进行记录查找。 图 7
查找记录 6.修改记录 图 7
查找记录 6.修改记录 当用户输入 4 并按 Enter 键后,即可进入记录修改界面。其修改过程如图 8
所示,将修改职工编号为 3 的记录。 图 8
修改记录 7.统计记录 图 8
修改记录 7.统计记录 当用户输入 5 并按 Enter 键后,即可进入记录统计界面。图 9、图 10、图11 分别为职工总人数、按性别统计和按工龄统计的结果。 图 9 统计总人数
统计男女职工数
统计男女职工数
统计各工龄段的人数
8.排序记录 图 11
统计各工龄段的人数
8.排序记录 当用户输入 6 并按 Enter 键后,即可进入记录排序界面。其排序结果如图12、图 13、图 14 所示,分别为按工号升序排序、按工龄和月收入降序排序的排
序结果,有排序前和排序后的记录输出结果。
按工号升序排序
按工龄降序排序
按工龄降序排序
按月收入降序排序
9.保存记录 当用户输入 7 并按 Enter 键后,即可进入记录保存界面。其保存结果提示信息如图 15 所示,这里有 3 条记录已经存储至磁盘数据文件 zgxx 中。 图 15
保存记录 五、 设计总结 课程设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。随着科学技术发展的日新月异,当今计算机应用在生活中可以说是无处不在。因此作为二十一世纪的大学生来说掌握计算机开发技术是十分重要的。 回顾起此次课程设计,我感慨颇多。刚拿到课程设计题目的时候感到无从下手,感觉学的东西很少很零散,不知该怎么连到一起。第一天基本都在看书,把基础知识和范例程序都熟悉了一遍。第二天便开始试着编写程序,在编写程序的过程中总是会遇到很多头疼的问题,在同学和老师的帮助下我终于编写完了程序。但在编译的过程中出现了很多错误,经过不断的检查修改和进一步的完善,在老师的指导下我最终在第一周完成了程序的编写。 在两周的课程设计中,我学到了很多东西,同时不仅巩固了以前所学的知识,而且学到了很多在书本上学不到的知识。通过这次课程设计,我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识同实践结合起来,从实践中得出结论才能真正为社会服务。同时提高自己的实际动手能力和独立思考问题的能力。 在此次课程设计的过程中,我发现了自己的很多不足之处,对以前所学过的知识理解不够深刻,掌握的不够牢固。比如说结构体的运用。这次课程设计不仅使我温故知新,同时也给我敲响了警钟,对于学习不能浮于表面,学习每一门课程都要脚踏实地,要尽最大努力掌握该门知识,提高自身修养与能力,为以后的工作打下良好的知识基础和技能基础。
C 语言是近年在国内得到迅速推广应用的一种语言,它语言功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。通过此次课程设计,我更加深刻的了解到 C 语言的优点和实用性,增加了我对 C 语言编程的兴趣。 在课程设计的过程中我遇到了很多问题,最终我能够顺利的完成任务离不开同学的帮助和老师的细心指导,在徐老师的身上我学到了很多实用的知识,对于徐老师的耐心指导我表示衷心的感谢。同时我也体会到了团结协作的重要性。 虽然设计完成了,但是我觉得其中还有一些不足之处: 1.警告句。程序中缺少一些警告句,例如:&是否真的删除(y/n)?&。 2.重名的情况。由于考虑不周全,没有设计当按照姓名查找记录时遇到重名的情况该如何处理。 总之,这次课程设计使我受益良多! 附 录 程序使用说明 1.当用户刚进入人事管理系统时,主界面为菜单界面。用户可根据自身需要选择 0&8 之间的数值,调用相应的功能进行操作。当输入为 0 时,推出此管理系统。 2.若用户要在文件中增加记录,输入 1 并按 Enter 键后即可进入数据输入界面。记录输入完成后,输入为 0 的职工编号时,系统会结束输入过程,返回到主菜单界面。 3.当用户执行了输入记录或已经从数据文件中读取了记录之后,即可按 8 键,查看当前数组中的记录情况。 4.若用户要删除记录,输入 2 并按 Enter 键后即可进入记录删除界面,用户可按照提示信息进行删除操作。 5.若用户要查找记录,输入 3 并按 Enter 键后即可进入记录查找界面,用户可按照提示信息进行查找操作。 6.若用户要修改记录,输入 4 并按 Enter 键后即可进入记录修改界面,用户可按照提示信息进行修改操作。 7.若用户需统计记录,输入 5 并按 Enter 键后即可进入记录统计界面,用户可按照提示信息根据不同需要进行不同的统计操作。 8.若用户要对记录进行排序,输入 6 并按 Enter 键后即可进入记录排序界面,用户可按照提示信息根据不同需要进行不同的排序操作。 9.当用户对文件中的记录进行了一些操作之后,若要保存记录,输入 7 并按 Enter 键后即可进入记录保存界面。 参考文献 [1] 姜灵芝 余健.C 语言课程设计案例精编 . 北京:清华大学出版社,2008.1第 1 版

我要回帖

更多关于 name属性 的文章

 

随机推荐