面向对象课设通讯录管理系统Word下载.docx
《面向对象课设通讯录管理系统Word下载.docx》由会员分享,可在线阅读,更多相关《面向对象课设通讯录管理系统Word下载.docx(42页珍藏版)》请在冰豆网上搜索。
计算机学院所开设的C++课程设计是教学实践环节中一项重要内容,进行此课程设计的旨在:
1.提高和加强学生的计算机应用与软件开发能力,使学生由初学者向专业的程序员过渡。
2.培养学生独立分析问题、解决问题、查阅资料以及自学能力,以适应计算机产业日新月异发展的形势。
3.学习和掌握C++程序设计方法以及上机调试技巧,为今后学习其它专业课程打好基础。
本次课程设计是以学生独立思考解决问题为主,教师指导为辅,结合上机操作,完成指定的任务,作出设计报告。
正文
1概要设计
1.1信息结构体
日期结构dateStruct
变量名
数据类型
描述
year
Int
年
Month
月
Day
日
联系方式结构体ContactStruct
tel
int
电话
mail
char
电子邮箱
qq
QQ号
学生信息结构体
NO
学号
name
姓名
sex
性别
birth
dateStruct
出生日期
likes
爱好
address
邮政地址
contact
contactStruct
联系方式
1.2系统结构图
主菜单
添
学
生
信
息
加
删
除
查
询
修
改
看
男
女
比
例
近
期
过
的
退
出
系
统
根据学号删除
查看所有
根据学号查询
根据学号修改
2
2.详细设计
2.1类的编写
开发项目时,以类的形式来组织、封装一些常用的方法,以便提高代码的重用率,大大方便了代码的管理。
本系统中创建了两个类:
stuClass和stuOperate。
其中stuClass主要用来定义学生基本信息,stuOperate类是操作类,用来执行添加、修改、删除、查询、统计等功能。
程序开发时只需要调用相应方法即可。
2.1.1stuClass类
stuClass类主要用来定义学生基本信息,包含三个结构体,分别是日期、联系方式、学生基本信息结构体;
用这几个结构体分别来实现联系方式、学生信息、日期信息的保存和操作。
classstuClass
{
public:
structdateStruct//定义一个日期结构体
{
intyear;
intmonth;
intday;
};
structcontactStruct//定义一个联系方式结构体
inttel;
charmail[30];
intqq;
structstudentStruct//定义一个学生基本信息结构体
intNO;
charname[10];
charsex[4];
dateStructbirth;
charlikes[100];
charaddress[100];
contactStructcontact;
};
2.1.2stuOperate类
stuOperate类是操作类,用来执行添加、修改、删除、查询、统计等功能。
classstuOperate
stuClass:
:
studentStructstu[100];
voidinsertStu();
//增加
voidprint(int);
//打印信息
boolcheckStuNO(int);
//判断学号是否重复
boolcheckStr(char*,char*);
//判断两字符串是否相等
voidsearchStu(int);
//查询
voiddeleteStu(int);
//删除
voideditStu(int);
//修改
voidstuPercent();
//百分比
voidstuBirth();
//近期生日
voiddisplay();
//显示菜单项
2.2程序流程图
stuClass类
dateStruct日期结构体
contactStruct联系方式结构体
studentStruct基本信息结构体
成员:
intyear
intmonth
intday
inttel
charmail[30]
intqq
intNO
charname[10]
charsex[4]
dateStructbirth
charlikes[100]
charaddress[100]
contactStructcontact
stuOperate类
VoidinsertStu()
voidprint(int)
boolcheckStuNO(int)
stuClass:
studentStructstu[100]
voidstuBirth()
voiddeleteStu(int)
voideditStu(int)
boolcheckStr(char*,char*)
voidstuPercent()
voidsearchStu(int)
voiddisplay()
3.程序测试与分析
3.1增加学生信息:
增加学生信息运行结果如图所示:
录入完一条信息后,会提示输入完毕,是否继续输入,Y继续输入,N便是回主菜单。
实现思想:
先申明学生信息的相关的变量,然后输出提示输入相关信息,由于考虑到班级人数一般不超过30,因此在输入时判断小于1或大于30的均是不合法学号,需重新输入,判断学号的合法外还对学号是否重复进行了判断,由于是通过数组存储,则决断学号重复时需要循环组与输入的学号进行对比,由于此系统中有了功能模块是统计学生的男女比例因此在输入性别时也作了限定,只能输入男女或者boygirl,信息输入完毕后,将学生记录数加1,然后将信息存储到对应的数组中,如stu[].NO=NO则是将输入的学号对应的数组(s是学生的记录数,每增一条信息s会加1,删除一条信息s会减1)。
具体实现代码请看源程序附件中的inserStu()函数。
3.2查询学生信息:
查询学生信息运行结果如图所示:
此时会提示您是查询所有学生信息还是根据学号查询,1查询所有,2根据学号查询,若查询所有,将会把系统中所有学生信息列出来,如下图所示:
若根据学号查询,则会提示您输入学号,输入学号后,便可查询该生如下图:
在查询数据时,需要先判断此系统中有无记录,若无记录则提示系统中无学生信息,请先输入,此时程序将不向下执行。
否则将输出查询条件,1查询所有;
2根据学号查询,查询所有时循环数组,读取每个元素对应的信息即可。
根据学号查询需要先判断学号是否合法,然后判断系统中有无此学号。
实现方式是循环读数组,将每个索引对应的学号与输入的学号进行比较,若相等,则输出此数组索引对应的信息。
具体实现代码请看源程序附件中的searchStu(ints)函数。
3.3查看学生男女比例:
查看学生男女比例运行结果如下图:
在查看学生男女比例时,需要先判断此系统中有无记录,若无记录则提示系统中无学生信息,请先输入,此时程序将不向下执行。
否则将循环读取数组,判段数组索引对应的SEX值为男还是女,统计出男女生人数,如果其中一个性别为0,则此性别的百分比为0,另一个的百分比为100%。
否则将一个性别,如男的人数除以总人数,再乘100,就得到男生的百分比了,用100减去男的百分比既可得女生的百分比。
具体实现代码请看源程序附件中的stuPercent()函数。
3.4查看近期过生日的学生:
查看近期过生日的学生运行结果如下图:
在查看近7天过生日的学生时,需要先判断此系统中有无记录,若无记录则提示系统中无学生信息,请先输入,此时程序将不向下执行。
否则将引用ctime文件,通time获取当前时间,如下代码:
time_tt=time(NULL);
tm*pt=localtime(&
t);
intstuYear,stuMonth,stuDay;
intthisYear,thisMonth,thisDay;
thisYear=1900+pt->
tm_year;
//获取当前年
thisMonth=pt->
tm_mon+1;
//获取当前月
thisDay=pt->
tm_mday;
//获取当前日
获取时间的年月日后,循环读取学生数组,循环时获取每个学生的年月日,与当前时间的年月日进行比较,此时要考虑3种情况。
(1)、当前日加上7天后还是本月的情况,此时学生的月与当前月相等,并且学生出生日期的日减去当前日大于0并且小于等于7,就是近7天内过生日的学生。
(2)、当前日加上7天已经跨月的情况,此时还需要判断是否是2月是平年还是润年。
如果是润年的2月,用29(润年的2月是29天)减去当前日再加上学生出生日期的日,就得到与生日的差距了。
如果是平年的2月,则应用28(平年的2月是28天)减当前日加学生出生日期的日。
否则则用31(由于不知如何判断每月的天数,有的月30天,有的月31天,这里都采用31计算)减当前的日再加学生出生日期的日,能得出距生日的差距,得出差距判断小于或等于7就是近7天过生日的学生。
(3)、当前日加上7天已经跨年的情况,这种情况是当前月为12月,而学生的出生日期是1月的情况下才产生。
此时判断当前月等于12,学生的学生日期是1月,再用31(由于不知如何判断每月的天数,有的月30天,有的月31天,这里都采用31计算)减当前的日再加学生出生日期的日,如果小于或等于7那么就是近7天过生日的学生。
以下是生日判断的算法(thisYear、thisMonth、thisDay为当前的年月日,stuYear、stuMonth、stuDay为某学生出生日期的年月日):
//本月
if((thisMonth==stuMonth)&
&
(stuDay-thisDay>
0)&
(stuDay-thisDay<
=7))
isFound=1;
print(i);
//调用打印函数
}
//跨月
if(stuMonth==thisMonth+1)
if(thisMonth==2)//如果是月
if(isRunYear==1)//如果是润年天
if(29-thisDay+stuDay<
=7)
else//平年天
if(28-thisDay+stuDay<
else//不是月则按天计算
if(31-thisDay+stuDay<
//跨年
if((thisMonth==12)&
(stuMonth==1)&
(31-thisDay+stuDay<
if(isFound==0)
cout<
<
"
在最近天中,没有学生过生日!
endl;
}
具体实现代码请看源程序附件中的stuBirth()函数。
3.5修改学生信息:
修改学生信息运行如图所示:
当选择修改学生信息菜单时,会提示您输入要修改学生的学号,如果您输入错误,则提示学号不存在,如下图:
此时,只需重新输入正确的学号即可,如下图
根据您输入的学号,系统将会显示您要修改的学生的信息,会提示您是否确定要修改该学生的信息,Y执行修改,会提示您重新输入该学生的信息(注:
此系统中学号是关键字段,不可修改,其他信息均修改),按N取消修改。
在修改数据时先判断系统中有无记录,若无记录则提示系统中无学生信息,请先输入,此时就没必要再往下执行了。
若有记录,则提示要修改的学生的学号,此时先判断学号是否合法,再判断学号是否存在,若存在,则显示该生的信息,然后输出确实修改的信息,若确定修改,则提示重新输入该生的姓名、性别等信息。
具体实现代码请看源程序附件中的editStu(intn)函数。
3.6删除学生信息:
删除学生信息运行结果如图所示:
此时,输入您要删除的学生的学号即可,出现如下图所示:
系统会提示您是否确认删除,Y执行删除,N取消删除。
在删除数据时,需要先判断此系统中有无记录,若无记录则提示系统中无学生信息,请先输入,此时程序将不向下执行。
否则提示输入要删除的学生的学号,在输入学号后,先判断学号是否合法,再判断系统中有无此学号,若无则提示系统中无此记录。
否则将显示要删除的学生的信息,然后提示确实是否删除,确认后便执行删除。
由于采用的是数组存储,删除则是循环读取信息,然后将数组索引对应的信息前移,如stu[j].NO=stu[j+1].NO(J是数组的索引),然后再将学生人数S减1。
具体实现代码请看源程序附件中的deleteStu(intn)函数。
参考文献:
总结
通过这次课程设计,使我们学到了一些以前没有学过的知识,使我们对C++程序设计有了更深层次的认识和理解,懂得了灵活运用C++。
在计算机飞速发展的今天,懂得一门计算机语言技术是非常必要的。
同时,我们也清醒的认识到,只有自己肯努力,愿意去付出劳动,就能够得到属于我们自己所想要的东西。
最后,在此由深切的向我的指导老师表示衷心的感谢,是她的悉心的指导和严格要求,才合我的课程设计有了较为皮完善的一面,才有了我能力的提高,得到了充分的锻炼。
源程序代码
#include<
iostream.h>
string.h>
conio.h>
stdio.h>
#include<
ctime>
ints=0;
//申明全局变量S,用于存放记录数
structdateStruct//定义一个日期结构体
structcontactStruct//定义一个联系方式结构体
structstudentStruct//定义一个学生基本信息结构体
//增加
//判断学号是否重复
//判断两字符串是否相等
//查询
//删除
//修改
//百分比
//近期生日
//显示菜单项
boolstuOperate:
checkStr(char*a,char*b)//判断两个字符串是否相等
inti;
intj=strlen(b);
for(i=0;
i<
j;
i++)
if(*a==*b)
a++;
b++;
else
return0;
return1;
}
checkStuNO(intstuNO)//判断学号是否重复函数
intm=1,repeat=0;
while(m<
=s)
if(stuNO==stu[m].NO)
repeat=1;
break;
m++;
returnrepeat;
voidstuOperate:
insertStu()//输入数据
intNO;
intyear,month,day;
inttel,qq;
******************添加计科111班学生信息******************"
请输入学号后三位(101~130):
201100814"
;
cin>
>
NO;
while(NO<
101||NO>
130)//判断输入的学号是否正确
您输入的学号不正确!
请重新输入:
while(checkStuNO(NO))//调用checkStuNO函数判断学号是否重复
该学号已存在,请重新输入!
请输入姓名:
name;
请输入性别(男/女):
sex;
while(!
checkStr(sex,"
男"
)&
!
boy"
!
girl"
女"
))
性别只能是男(boy)或女(girl)!
//判断性别输入
下面输入出生日期:
请输入出生年:
year;
while(year<
1800||year>
2999)//判断输入的出生年是否正确
您输入的出生年不正确!
请输入出生月:
month;
while(month<
0||month>
12)//判断输入的出生月是否正确
您输入的出生月不正确!
请输入出生日:
day;
while(day<
0||day>
31)//判断输入的出生日是否正确
您输入的出生日不正确!
请输入兴趣爱好:
likes;
请输入地址:
address;
下面输入联系方式:
"
请输入电话:
tel;
请输入QQ号:
qq;
cout<
请输入电子邮箱:
mail;
s=s+1;
//学生人数加1
stu[s].NO=NO;
strcpy(stu[s].name,name);
strcpy(stu[s].sex,sex);
stu[s].birth.year=year;
stu[s].birth.month=month;
stu[s].birth.day=day;
strcpy(stu[s].likes,likes);
strcpy(stu[s].address,address);
stu[s].contact.tel=tel;
stu[s].contact.qq=qq;
strcpy(stu[s].contact.mail,mail);
print(int