家政管理程序.docx
《家政管理程序.docx》由会员分享,可在线阅读,更多相关《家政管理程序.docx(55页珍藏版)》请在冰豆网上搜索。
家政管理程序
沈阳航空工业学院
课程设计报告
课程设计名称:
C语言课程设计
课程设计题目:
家政管理程序
院(系):
计算机学院
专业:
网络工程
班级:
学号:
姓名:
指导教师:
完成日期:
2010年03月19日
目录
第1章概要设计1
1.1题目的内容与要求1
1.2总体结构1
第2章详细设计3
2.1主模块3
2.2建立信息库模块5
2.3增加删除模块7
2.4查询更新模块9
2.5统计结算模块11
2.6输出信息模块13
第3章调试分析16
3.1字符和数字输入的问题16
3.2链表连接出现的问题16
第4章使用说明17
4.1进入系统前的准备17
4.2系统界面操作17
4.2.1建立信息库17
4.2.2增加删除人员19
4.2.3查询人员信息19
4.2.4统计结算20
4.2.5输出功能21
4.2.6退出系统23
参考文献24
附录(程序清单)25
第1章概要设计
1.1题目的内容与要求
内容:
设计一个家政服务中介管理管理系统,该系统提供家庭清洁、月嫂、做饭服务几个方面的统计、更新和结算。
要求:
1)家政服务中介管理系统的待应聘者信息应包括应聘者的个人资料(编号、年龄、性别、健康情况、工资及应聘岗位等),并可以对这些资料更新,查询、统计;
2)对新登记的应聘者的资料可以插入到该家政管理的待应聘者信息库中,而与客户达成协议的应聘者从待应聘者信息库中删除,添加到已签约信息库中;
3)程序功能要求有菜单选项,并给出充分的提示信息,界面友好;
4)熟练掌握基本的调试方法,并将程序调试通过;
5)按照课程设计规范书写程序设计报告;
1.2总体结构
本程序主要分为六个模块(功能模块图见图1.1):
主模块,建立信息库模块,增加删除模块,查询更新模块,统计结算模块,输出信息模块。
建立信息库模块:
建立两链表分别储存待应聘者和已应聘者信息。
增加删除模块:
通过增加删除链表节点增减待应聘者和已应聘者更新信息库。
查询更新模块:
根据查询条件遍历链表查找待应聘者和已应聘者并更新其信息。
统计结算模块:
统计待应聘者和已应聘者人数并结算已应聘者工资。
输出信息模块:
输出所有待应聘者和已应聘者信息并统计某类工种人数。
输出信息模块
图1.1功能模块图
第2章详细设计
2.1主模块
控制整个程序的运行,控制菜单操作,通过主函数模块分别调用各个模块,实现各流程项功能。
流程图如2.1所示:
注释:
1.先定义整型变量flag1=1、flag2、choice,字符型变量choice1,flag1用来控制无限循环;
2.无限循环进行,调用菜单函数打印主菜单,输入choice值,进入多路选择,判断后,进行建立信息库添加等八项操作;
3.输入choice1的值判断是否结束无限循环;
intflag1=1flag2choicecharchoice1
emphead=NULLunehead=NULL
1
N
图2.1主模块流程图
2.2建立信息库模块
建立信息库模块的主要功能是创立链表,输入待应聘者和已应聘者信息把信息存在链表里。
流程图如2.2、2.3所示:
Structemployee*emp1,*emp2;
emp1->num!
=0
empnum=empnum+1;
empnum==1
emp2->next=emp1;
emp2=emp1;
emp1->num!
=0
开始
emphead=emp1
Y
N
Y
N
结束
Y
emp2->next=NULL;
N
输入员工信息
图2..2建立已应聘者信息库模块流程图
注释:
1.先定义已应聘者结构体指针p1、p2用来连接节点建立信息库。
2.再申请空间,输入已应聘者信息存入链表。
3.当输入已应聘者的编号为0时,结束输入,把p2赋成空。
Structunemploy*une1,*une2;
une1->num!
=0
une2->next=NULL;
unempnum=unempnum+1;
unempnum==1
une2->next=une1;
une2=une1;
printf(输入员工信息);
开始
N
N
unehead=une1
Y
N
Y
une1->num!
=0
Y
结束
图2.3建立已应聘者信息库模块流程图
注释:
1先定义已应聘者结构体指针p1、p2用来连接节点建立信息库。
2再申请空间,输入待应聘者信息存入链表。
3当输入待应聘者的编号为0时,结束输入,把p2赋成空。
2.3增加删除模块
遍历链表,添加或删除待应聘者和已应聘者。
流程图如2.4和2.5所示:
开始
intflag=1;
flag=1?
a==1||a==4
printf("\t添加成功!
\n\n");
a==4?
choice=='y'
Structemployee*p1,*p2;
Structunemploy*p1,*p2;
flag=0;
empnum=empnum+1;
unempnum=unempnum+1;
getchar();
choice=n
flag=1
N
Y
Y
N
N
N
输入员工信息
N
Y
unehead==NULL
Y
输入员工信息
输入员工信息
Y
结束
图2.4建立已应聘者信息库模块流程图
注释:
1.先定义整形变量flag=1,字符型变量choice,用来控制循环的开始结束;
2.通过赋给型参a的值决定添加已应聘者还是添加待应聘者;
3.如果添加已应聘者先定义两已应聘者结果体指针用来遍历链表,如果链表还未建立就申请一个空间让头指针指向它然后输入要添加者信息。
已建立就遍历到链表尾,然后申请一个空间让p1指向它,输入添加者信息,把p1连到链表里;
4.显示添加成功,添加待应聘者信息同上一样;
intflag=1,num,o;
flag=1?
b==2
getchar();
flag=0;
Structemployee*p1,*p2;
Structunemploy*p1,*p2;
unehead==NULL
开始
printf“信息库未建立”
flag=1
N
N
Y
输入要删除编号
Y
Y
N
输入要删除编号
choice=='y'
N
结束
Y
图2.5删除模块流程图
注释:
1.先定义整形变量flag=1,num,o,字符型变量choice,用来控制循环的开始结束;
2.通过b的值决定删除已应聘者还是删除待应聘者;
3.如果删除已应聘者先定义两结构体指针用来遍历链表,如果链表还未建立就显示未建立退出删除。
已建立就遍历链表,找到要删除的节点,删除该节点,显示删除成功;
4.如删除待应聘者也是先定义两结构体指针用来遍历,如果链表还未建立就显示未建立退出删除。
已建立就遍历链表,找到要删除的节点,删除该节点,显示删除成功;还可选是否添加到应聘者,是的话就调用添加函数添加到已应聘者;
2.4查询更新模块
查询更新模块包括有条件查询和精确查询两种。
精确查询按编号和姓名查询,可以准确查询到要查找的员工,并可以对员工的信息进行更改,比如要更改员工年龄等。
条件查询有按年龄、工作查询和按年龄、工作、性别、资查询两种,招聘人或公司可以根据自己需求查找要招聘的人。
流程图如2.6所示:
注释:
1.先定义整形变量flag=1,num,s,字符型变量choice,字符数组name,flag和choice用来控制循环的开始结束;
2.遍历链表,根据编号姓名找到节点,输出其所含信息;
3.如果想更新信息就输入一再输入要更改的信息;
开始
intflag=1,num,s;
1
1
flag=1
c==1
getchar();
choice=='y'
flag=0;
Structemployee*p1;
structunemploy*p1;
flag=1
N
N
N
Y
Y
Y
printf“信息库未建立”
N
unehead==NULL
结束
查询员工
图2.6精确查询模块流程图
注释:
1.先定义整形变量flag=1,num,s,字符型变量choice,字符数组name,flag和choice用来控制循环的开始结束;
2.遍历链表,根据编号姓名找到节点,输出其所含信息;
3.如果想更新信息就输入一再输入要更改的信息;
2.5统计结算模块
能统计的待应聘者和已应聘者人数,输入要结算工资的员工信息还可以结算工资,结算完工资后工时自动清零。
流程图如2.7和2.8所示:
intflag1=1,choice,flag2=1;
flag1=1?
printf("\t\t>>>子菜单<<<\n");
flag2=1?
getchar();
choice1=='y'
flag1=0;
flag2=0;
choice=1
开始
结束
N
N
N
Y
输出待应聘者人数或结算工资
Y
Y
输出已应聘者人数,跳出
N
Y
flag=1
图2.7统计主模块流程图
注释:
1.先定义整形变量flag1=1,choice,flag2=1,字符choice1,flag1和choice用来控制循环的开始结束;
2.四路选择分支,一二分支统计打印待应聘者和已应聘者人数;
3.三路分支调用统计函数2结算工资,四路分支退出系统;
intnum,flag=1;
flag
printf("\t请输入员工编号:
");
emphead==NULL
getchar();
choice=='y'
flag=0;
p1=emphead;
开始
结束
N
Y
找到要结算工资的员工
结算工资
N
Y
printf“信息库未建立”
N
Y
flag=1
图2.8结算工资模块流程图
注释:
1.先定义整形变量flag=1,num,字符choice,flag和choice用来控制循环的开始结束;
2.输入要结算工资的员工编号,遍历链表找到该员工,按公式结算工资;
3.结算完工资后工时自动清零;
2.6输出信息模块
选择要输出待应聘者还是已应聘者信息,就能完整输出待应聘者和已应聘者的所有信息,同时还能统计某工种人数。
流程图如2.9和2.10所示:
开始
getchar();
structemployee*p1;
choice=='y'
N
emphead==NULL
Y
N
Y
getchar();
printf“信息库未建立”
p1=emphead;
p1!
=NULL
N
Y
printf(“员工信息\n");
输出员工信息
p1=p1->next;
结束
Y
choice=='y'
打印人数
N
图2.9输出已应聘者信息模块流程图
注释:
1先定义结构体指针p1,字符choice,字符串work;
2把头指针赋给p1,遍历链表输出所有已应聘者信息;
3同时还可以输入要统计人数的工种,统计该工种人数;
开始
Structunemploy*p1;
unehead==NULL
getchar();
choice=='y'
p1=unehead;
getchar();
p1!
=NULL
choice=='y'
printf“人数是”)
结束
N
N
N
N
Y
printf“信息库未建立”
Y
Y
输出员工信息
Y
图2.10输出待应聘者信息模块流程图
注释:
1先定义结构体指针p1,字符choice,字符串work;
2把头指针赋给p1,遍历链表输出所有待应聘者信息;
3同时还可以输入要统计人数的工种,统计该工种人数;
第3章调试分析
3.1字符和数字输入的问题
在选择是否结束某服务时要输入字符Y或N,但运行该选择项时程序就自动跳出了,首先怀疑是算法哪里出现了错误但反复检查了算法没有错误。
单步运行时才发现上步输入结束时按的回车键被接收字符Y或N的字符变量接收了,所以不用输入就自动结束跳出了。
于是我就在输入字符Y或N的语句前加一个getchar()接受上次输入结束时的回车。
这样就能选择是否退出服务了。
还一个问题就是在使用多路选择分支switch语句时用choice接收选择的服务,但每次输入它就显示输入错误请重新输入,于是我就想是否是我选择的变量类型和我输入的的类型不一致,检查发现我定义的choice是整形变量也就是1、2、3、……等数字里选择,可我在switch语句里case是用数字的ASC码。
所以每次输的数字都不可能和switch里的情况相符合,所以就显示输入错误请重新输入。
3.2链表连接出现的问题
因为家政公司的员工数量是不定的,要随时添加和删除。
用数组的话不知道要定义多大的数组才能满足要求。
所以选择链表的话就能随时添加删除。
但链表要连接好而且头要保护好。
丢失了头结点的话整个信息就找不到了。
还有要想到头尾结点为空的情况。
我在编写查询函数的时候遍历链表时设定条件只要一找到符合条件的员工就跳出循环停止遍历。
但运行时出现了问题,程序不能运行。
后来单步跟踪才发现然来我没有想到符合条件的员工没有的情况。
链表遍历到最后,最后一个结点为空,里面没有任何信息我还拿它和查找条件比较。
系统肯定识别不了从而出现错误。
第4章使用说明
4.1进入系统前的准备
先打开VC编译环境,先新建一个工程区,然后打开家政管理程序,再编译连接,就会弹出如图4.1所示界面。
图4.1
4.2系统界面操作
弹出运行窗口后用户就可以选择所需服务,但一般建议先选择1和2服务建立信息库。
4.2.1建立信息库
弹出运行窗口后用户选1和2就可以进入建立已应聘者和待应聘者信息库界面。
界面如图4.2、4.3所示:
图4.2
图4.3
按程序提示信息输入已应聘者信息,如果想退出创建按“0”;
4.2.2增加删除人员
用户如果想删除或增加人员,则输入:
3回车(enter键)(即选择添加删除功能)。
界面如图4.4所示:
图4.4
此时,用户只需要输入所需服务对应的数字按回车,程序就会进入所对的服务。
如用户想要添加已应聘者就输入1,然后程序进入添加已应聘者界面,用户可根据提示输入要添加人员信息,如果添加成功系统会显示添加成功等字样。
用户想删除待应聘者时系统会提示是否永久删除,用户可按需求选择永久删除后添加到已应聘者。
4.2.3查询人员信息
如果用户想要查询某员工的具体信息并修改信息或想查询符合某些条件的员工信息以供招聘使用请输入:
4回车,界面如图4.5所示:
图4.5
进入查询菜单界面后用户可输入想要查询类型所对应的数字,然后根据提示操作。
如想精确查询已应聘者信息用户可输入1,然后进入到精确查询界面,系统会提示用户输入想要查询人员的编号、姓名,同时系统还会提示用户是否要修改人员信息,用户可以根据需要选择。
4.2.4统计结算
如果用户想统计待应聘者和已应聘者人数或者结算工资。
输入:
5回车,界面如图4.6所示:
图4.6
输入想进行的服务,再根据提示进行操作。
如用户想统计待应聘者的总人数,用户可输入2,然后界面上会打印出待应聘者的总人数。
统计已应聘者的操作相似。
用户如果还想结算某员工工资可输入3,然后界面上会打印出该员工所有信息和应支付工资。
同时系统会将该员工工时清零。
4.2.5输出功能
如果用户想查看所有已应聘者和待应聘者信息并统计某工种人数。
输入:
6或7回车,界面如图4.7、4.8所示:
图4.7
图4.8
进入输出员工信息界面后,系统会提示用户是否要统计某工种员工人数,如果用户想查询请按“y”,同时输入所要统计的工种名。
然后屏幕上会打印出所有员工信息和要统计工种的人数。
4.2.6退出系统
如果用户想退出系统。
输入:
8回车。
界面如图4.9所示:
图4.8
在每一子菜单也有退出系统选项。
参考文献
[1]张长海.C语言程设计[M].北京:
高等教育出版社,2006
[2]谭浩强.C语言程设计(第三版).清华大学出版社,2005
[3]欧阳春娟.C语言程序设计.同济大学出版社,2007
[4]王士元.C高级实用程序设计.清华大学出版社,1994
[5]谭浩强.C语言程设计(第二版).清华大学出版社,2000
附录(程序清单)
/*家政管理程序设计者:
周武林时间:
2010-3*/
#include"stdio.h"
#include"malloc.h"
#include"string.h"//字符串处理函数的头文件
#include"stdlib.h"
#defineEMPsizeof(structemployee)
#defineUNEsizeof(structunemploy)
structemployee//创建已应聘者结构体
{
intnum;
charname[10];
intage;
charsex[4];
charhealth[100];
intsalary;
charwork[12];
intworktime;
structemployee*next;
};
intempnum=0;//已应聘者节点数
structunemploy//创建待应聘者结构体
{
intnum;
charname[10];
intage;
charsex[4];
charhealth[100];
intsalary;
charwork[12];
structunemploy*next;
};
intunempnum=0;
structemployee*emphead;//待应聘者节点数
voidcreat1()//创建已应聘者信息库的函数
{
structemployee*emp1,*emp2;
emp1=(structemployee*)malloc(EMP);
printf("\t****请输入数据按以下顺序*****\n");
printf("\n");
printf("编号姓名年龄性别健康情况工资工作工时\n");
emp2=emp1;
scanf("%d%s%d%s%s%d%s%d",&emp1->num,emp1->name,&emp1->age,emp1->sex,
emp1->health,&emp1->salary,emp1->work,&emp1->worktime);
printf("\n");
emphead=NULL;
while(emp1->num!
=0)
{
empnum=empnum+1;
if(empnum==1)
emphead=emp1;
else
emp2->next=emp1;//把链表连接起来
emp2=emp1;
emp1=(structemployee*)malloc(EMP);
printf("\t>>>>>>>>>提醒按0结束输入<<<<<<<<\n");
printf("请输入应聘者编号:
");
scanf("%d",&emp1->num);
if(emp1->num)
{
printf("\t****请输入数据按以下顺序*****\n");
printf("姓名年龄性别健康情况工资工作工时\n");
scanf("%s%d%s%s%d%s%d",emp1->name,&emp1->age,emp1->sex,
emp1->health,&emp1->salary,emp1->work,&emp1->worktime);
}
}
emp2->next=NULL;
free(emp1);
}
structunemploy*unehead;
voidcreat2()//创建待应聘者信息库的函数
{
structunemploy*une1,*une2;
une1=(structunemploy*)malloc(UNE);
printf("\t****请输入数据按以下顺序*****\n");
printf("编号姓名年龄性别健康情况工资工作\n");
une2=une1;
scanf("%d%s%d%s%s%d%s",&une1->num,une1->name,&une1->age,une1->sex,
une1->health,&une1->salary,une1->work);
unehead=NULL;
while(une1->num!
=0)
{
unempnum=unempnum+1;
if(unempnum==1)
unehead=une1;
else
une2->next=une1;
une2=une1;
une1=(structunemploy*)malloc(UNE);
printf("\t>>>>>>>>>提醒按0结束输入<<<<<<<<\n");
printf("请输入待应聘者编号:
");
scanf("%d",&une1->num);
if(une1->num)
{
printf("\t****请输入数据按以下顺序*****\n");
printf("姓名年龄性别健康情况工资工作\n");
scanf("%s%d%s%s%d%s",une1->name,&une1->age,une1->sex,
une1->health,&une1->salary,une1->work);
}
}
une2->next=NULL;
free(une1);
}
voidadd(inta)//增加人员的函数
{
intflag=1;
charchoice;
while(flag)
{
if(a==1||a==4)//a是1时添加应聘者是3时把待应聘者添加到应聘者
{
structemployee*p1,*p2;
if(emphead==NULL)
{
emphead=(structemployee*)malloc(EMP);
printf("\t****请输入数据按以下顺序*****\n");
printf("编号姓名年龄性别健康情况工资工作工时\n");
scanf("%d%s%d%s%s%d%s%d",&emphead->num,emphead->name,&emphead->age,emphea