中原工学院计算机学院
课程设计报告
课程名称: C++课程设计
专 业: 计算机科学与技术
班 级: 计科111
姓 名: ***
辅导老师: 强****
题 目: 学生通讯管理系统
2012年6月
摘要
通讯录管理系统的主要功能有:添加学生信息、修改学生信息删除学生信息、查询学生信息、查看学生男女比例、查看近期过生日的学生。 采用面向对象的思想建立两个类,一个类封装学生信息;另一个类封装对数据进行操作的一些函数;从而实现对系统的操作。做这个系统主要用到了微软公司的:Visual C++6.0开发环境,班级通讯录管理系统是一个专门针对储存学生联系方式以及一些简单个人信息的实用管理系统,它方便了教师对众多学生信息的储存和快速查阅的功能,大大减少了查找过程的时间。
关键词 通讯录,查找,删除,添加,统计。
前言
班级通讯录管理系统主要功能分为六个模块:添加学生信息、查询学生信息、查看学生男女比例、查看近期过生日的学生。修改学生信息、删除学生信息、
添加学生信息:录入学生的基本信息如学号、姓名、性别、出生日期、兴趣爱好、联系方式(电话、QQ、电子邮箱)地址等。
修改学生信息:可对系统中已录入的信息进行修改,如要修改学号为2011008141406的信息,这时需选择修改学生信息菜单,然后输入要修改的学生的学号,即可进行修改。
删除学生信息:可对系统中已存在的信息按学号进行删除。
查询学生信息:每个学生都可以查询通讯录的全部记录,或按条件进行查询
查看学生男女比例:系统会根据系统中已录入的学生自动计算出百分比。
查看近期生日的学生:自动列出近7日内要过生日的学生的信息。
任务
计算机学院所开设的C++课程设计是教学实践环节中一项重要内容,进行此课程设计的旨在:
1. 提高和加强学生的计算机应用与软件开发能力,使学生由初学者向专业的程序员过渡。
2. 培养学生分析问题、解决问题、查阅资料以及自学能力,以适应计算机产业日新月异发展的形势。
3. 学习和掌握C++程序设计方法以及上机调试技巧,为今后学习其它专业课程打好基础。
本次课程设计是以学生思考解决问题为主,教师指导为辅,结合上机操作,完成指定的任务,作出设计报告。
正文
1概要设计
1.1信息结构体
日期结构dateStruct
| 变量名 | 数据类型 | 描述 |
| year | Int | 年 |
| Month | Int | 月 |
| Day | Int | 日 |
| 变量名 | 数据类型 | 描述 |
| tel | int | 电话 |
| char | 电子邮箱 | |
| int | QQ号 |
| 变量名 | 数据类型 | 描述 |
| NO | int | 学号 |
| name | char | 姓名 |
| sex | char | 性别 |
| birth | dateStruct | 出生日期 |
| likes | char | 爱好 |
| address | char | 邮政地址 |
| contact | contactStruct | 联系方式 |
主菜单
添
学
生
信
息
加
删
除
学
生
信
息
查
询
学
生
信
息
修
改
学
生
信
息
查
看
男
女
学
生
比
例
近
期
过
生
日
的
学
生
退
出
系
统
根据学号删除
查看所有
根据学号查询
根据学号修改
2
2. 详细设计
2.1类的编写
开发项目时,以类的形式来组织、封装一些常用的方法,以便提高代码的重用率,大大方便了代码的管理。本系统中创建了两个类:stuClass 和stuOperate。其中stuClass主要用来定义学生基本信息,stuOperate类是操作类,用来执行添加、修改、删除、查询、统计等功能。程序开发时只需要调用相应方法即可。
2.1.1 stuClass类
stuClass类主要用来定义学生基本信息,包含三个结构体,分别是日期、联系方式、学生基本信息结构体;用这几个结构体分别来实现联系方式、学生信息、日期信息的保存和操作。
class stuClass
{
public:
struct dateStruct //定义一个日期结构体
{
int year;
int month;
int day;
};
struct contactStruct //定义一个联系方式结构体
{
int tel;
char mail[30];
int qq;
};
struct studentStruct //定义一个学生基本信息结构体
{
int NO;
char name[10];
char sex[4];
dateStruct birth;
char likes[100];
char address[100];
contactStruct contact;
};
};
2.1.2stuOperate类
stuOperate类是操作类,用来执行添加、修改、删除、查询、统计等功能。程序开发时只需要调用相应方法即可。
class stuOperate
{
public:
stuClass::studentStruct stu[100];
void insertStu();//增加
void print(int); //打印信息
bool checkStuNO(int);//判断学号是否重复
bool checkStr(char *,char *);//判断两字符串是否相等
void searchStu(int); //查询
void deleteStu(int); //删除
void editStu(int); //修改
void stuPercent();//百分比
void stuBirth();//近期生日
void display();//显示菜单项
};
2.2 程序流程图
stuClass类
dateStruct日期结构体
contactStruct联系方式结构体
studentStruct基本信息结构体
成员:
int year
int month
int day
成员:
int tel
char mail[30]
int qq
成员:
int NO
char name[10]
char sex[4]
dateStruct birth
char likes[100]
char address[100]
contactStruct contact
stuOperate 类
Void insertStu()
void print(int)
bool checkStuNO(int)
stuClass::studentStruct stu[100]
void stuBirth()
void deleteStu(int)
void editStu(int)
bool checkStr(char*,char*)
void stuPercent()
void searchStu(int)
void display()
3. 程序测试与分析
3.1 增加学生信息:
增加学生信息运行结果如图所示:
录入完一条信息后,会提示输入完毕,是否继续输入,Y继续输入,N便是回主菜单。
实现思想:先申明学生信息的相关的变量,然后输出提示输入相关信息,由于考虑到班级人数一般不超过30,因此在输入时判断小于1或大于30的均是不合法学号,需重新输入,判断学号的合法外还对学号是否重复进行了判断,由于是通过数组存储,则决断学号重复时需要循环组与输入的学号进行对比,由于此系统中有了功能模块是统计学生的男女比例因此在输入性别时也作了限定,只能输入男女或者boy girl ,信息输入完毕后,将学生记录数加1,然后将信息存储到对应的数组中,如stu[].NO=NO则是将输入的学号对应的数组(s是学生的记录数,每增一条信息s会加1,删除一条信息s会减1)。具体实现代码请看源程序附件中的inserStu()函数。
3.2 查询学生信息:
查询学生信息运行结果如图所示:
此时会提示您是查询所有学生信息还是根据学号查询,1查询所有,2根据学号查询,若查询所有,将会把系统中所有学生信息列出来, 如下图所示:
若根据学号查询,则会提示您输入学号,输入学号后,便可查询该生如下图:
实现思想:在查询数据时,需要先判断此系统中有无记录,若无记录则提示系统中无学生信息,请先输入,此时程序将不向下执行。否则将输出查询条件,1查询所有;2根据学号查询,查询所有时循环数组,读取每个元素对应的信息即可。根据学号查询需要先判断学号是否合法,然后判断系统中有无此学号。实现方式是循环读数组,将每个索引对应的学号与输入的学号进行比较,若相等,则输出此数组索引对应的信息。具体实现代码请看源程序附件中的searchStu(int s)函数。
3.3 查看学生男女比例:
查看学生男女比例运行结果如下图:
实现思想:在查看学生男女比例时,需要先判断此系统中有无记录,若无记录则提示系统中无学生信息,请先输入,此时程序将不向下执行。否则将循环读取数组,判段数组索引对应的SEX值为男还是女,统计出男女生人数,如果其中一个性别为0,则此性别的百分比为0,另一个的百分比为100%。否则将一个性别,如男的人数除以总人数,再乘100,就得到男生的百分比了,用100减去男的百分比既可得女生的百分比。具体实现代码请看源程序附件中的stuPercent()函数。
3.4 查看近期过生日的学生:
查看近期过生日的学生运行结果如下图:
实现思想:在查看近7天过生日的学生时,需要先判断此系统中有无记录,若无记录则提示系统中无学生信息,请先输入,此时程序将不向下执行。否则将引用ctime文件,通time获取当前时间,如下代码:
time_t t = time(NULL);
tm* pt = localtime(&t);
int stuYear,stuMonth,stuDay;
int thisYear,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)
{
isFound=1;
print(i);//调用打印函数
}
}
else//平年天
{
if(28-thisDay+stuDay<=7)
{
isFound=1;
print(i);//调用打印函数
}
}
}
else//不是月则按天计算
{
if(31-thisDay+stuDay<=7)
{
isFound=1;
print(i);//调用打印函数
}
}
}
//跨年
if((thisMonth==12)&&(stuMonth==1)&&(31-thisDay+stuDay<=7))
{
isFound=1;
print(i);//调用打印函数
}
}
if(isFound==0)
{
cout<<"在最近天中,没有学生过生日!"< } 具体实现代码请看源程序附件中的stuBirth ()函数。 3.5 修改学生信息: 修改学生信息运行如图所示: 当选择修改学生信息菜单时,会提示您输入要修改学生的学号,如果您输入错误,则提示学号不存在,如下图: 此时,只需重新输入正确的学号即可,如下图 根据您输入的学号,系统将会显示您要修改的学生的信息,会提示您是否确定要修改该学生的信息,Y执行修改,会提示您重新输入该学生的信息(注:此系统中学号是关键字段,不可修改,其他信息均修改),按N取消修改。 实现思想:在修改数据时先判断系统中有无记录,若无记录则提示系统中无学生信息,请先输入,此时就没必要再往下执行了。若有记录,则提示要修改的学生的学号,此时先判断学号是否合法,再判断学号是否存在,若存在,则显示该生的信息,然后输出确实修改的信息,若确定修改,则提示重新输入该生的姓名、性别等信息。具体实现代码请看源程序附件中的editStu(int n)函数。 3.6 删除学生信息: 删除学生信息运行结果如图所示: 此时,输入您要删除的学生的学号即可,出现如下图所示: 系统会提示您是否确认删除,Y执行删除,N取消删除。实现思想:在删除数据时,需要先判断此系统中有无记录,若无记录则提示系统中无学生信息,请先输入,此时程序将不向下执行。否则提示输入要删除的学生的学号,在输入学号后,先判断学号是否合法,再判断系统中有无此学号,若无则提示系统中无此记录。否则将显示要删除的学生的信息,然后提示确实是否删除,确认后便执行删除。由于采用的是数组存储,删除则是循环读取信息,然后将数组索引对应的信息前移,如stu[j].NO=stu[j+1].NO(J是数组的索引),然后再将学生人数S减1。具体实现代码请看源程序附件中的deleteStu(int n)函数。 参考文献: 总结 通过这次课程设计,使我们学到了一些以前没有学过的知识,使我们对C++程序设计有了更深层次的认识和理解,懂得了灵活运用C++。在计算机飞速发展的今天,懂得一门计算机语言技术是非常必要的。同时,我们也清醒的认识到,只有自己肯努力,愿意去付出劳动,就能够得到属于我们自己所想要的东西。 最后,在此由深切的向我的指导老师表示衷心的感谢,是她的悉心的指导和严格要求,才合我的课程设计有了较为皮完善的一面,才有了我能力的提高,得到了充分的锻炼。 源程序代码 #include #include #include #include #include int s=0; //申明全局变量S,用于存放记录数 class stuClass { public: struct dateStruct //定义一个日期结构体 { }; struct contactStruct //定义一个联系方式结构体 { }; struct studentStruct //定义一个学生基本信息结构体 { }; }; class stuOperate { public: stuClass::studentStruct stu[100]; void insertStu();//增加 void print(int); //打印信息 bool checkStuNO(int);//判断学号是否重复 bool checkStr(char *,char *);//判断两字符串是否相等 void searchStu(int); //查询 void deleteStu(int); //删除 void editStu(int); //修改 void stuPercent();//百分比 void stuBirth();//近期生日 void display();//显示菜单项 }; bool stuOperate::checkStr(char *a, char *b)//判断两个字符串是否相等 { int i; int j=strlen(b); for(i=0; i if(*a==*b) { } else } return 1; } bool stuOperate::checkStuNO(int stuNO) //判断学号是否重复函数 { int m=1,repeat=0; while(m<=s) { if(stuNO==stu[m].NO) { } m++; } return repeat; } void stuOperate::insertStu() //输入数据 { char name[10]; char sex[4]; int NO; int year,month,day; char likes[100]; char address[100]; int tel,qq; char mail[30]; cout<<"****************** 添加计科111班学生信息 ******************"< cin>>NO; while (NO<101||NO>130) //判断输入的学号是否正确 { cout<<"您输入的学号不正确!请重新输入:"< cin>>NO; } while(checkStuNO(NO)) //调用checkStuNO函数判断学号是否重复 { cout<<"该学号已存在,请重新输入!"< } cout<<"请输入姓名:"< cout<<"请输入性别(男/女):"< while (!checkStr(sex,"男") && !checkStr(sex,"boy") &&!checkStr(sex,"girl") &&!checkStr(sex,"女")) { cout<<"性别只能是男(boy)或女(girl)!"< } cout<<"下面输入出生日期:"< cin>>year; while (year<1800||year>2999) //判断输入的出生年是否正确 { cout<<"您输入的出生年不正确!请重新输入:"< cout<<"请输入出生月:"; cin>>month; 判断输入的出生月是否正确 { cout<<"您输入的出生月不正确!请重新输入:"< } cout<<"请输入出生日:"; cin>>day; 判断输入的出生日是否正确 { cout<<"您输入的出生日不正确!请重新输入:"< } cout<<"请输入兴趣爱好:"< cout<<"请输入地址:"< 下面输入联系方式: "< cout<<"请输入QQ号:"< cout<<"请输入电子邮箱:"< 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); } void stuOperate::print(int i) //输出数据 { cout<<"学号:"; 姓名:"; 性别:"; 出生日期:"; 兴趣爱好: "; 地址:"; 电话:"; :"; 电子邮箱:"; } void stuOperate::searchStu(int s) //查找数据 { int NO,p; while(s==0) { cout<<"系统中无学生信息,请先输入记录!"< } if(s!=0) { cout<<"请输入您要查找的学号:"< cin>>NO; while (NO<101||NO>130) //判断输入的学号是否正确 { 您输入的学号不正确!"< while(s!=0) //查找是否有符合条件的记录 { 学号:"; 姓名:"; 性别:"; 出生日期:"; 兴趣爱好: "; 地址:"; 电话:"; :"; 电子邮箱:"; } if(p==0) 您输入的学号不存在!"< getch(); } void stuOperate::deleteStu(int n) //删除数据 { int NO,p; char key; while(s==0) { cout<<"系统中无学生信息,请先输入!"< } { cout<<"请输入您要删除的学号后三位(101~130):"< cin>>NO; while (NO<101||NO>130) { 您输入的学号不正确!" < for(int i=1;i<=n;i++) { 学号:"; 姓名:"; 性别:"; 出生日期:"; 兴趣爱好: "; 地址:"; 电话:"; 电子邮箱:"; 您确定要删除该学生的记录吗?(y/n)"< 该记录已删除!"< 您已取消删除该记录!"< 您输入的学号不存在!"< getch(); } void stuOperate::editStu(int n) //修改数据 { char name[10]; char sex[4]; int year,month,day; char likes[100]; char address[100]; int tel,qq; char mail[30]; int NO,p; char key; while(s==0) { cout<<"系统中无学生信息,请先输入!"< } if(s!=0) { cout<<"请输入您要修改的学号后三位(101~130):"; cout<<"201100814"; cin>>NO; while (NO<101||NO>130) { 您输入的学号不正确!" < for(int i=1;i<=n;i++) { if(stu[i].NO==NO) { 学号:"; 姓名:"; 性别:"; 出生日期:"; 兴趣爱好: "; 地址:"; 电话:"; :"; 电子邮箱:"; 您确定要修改该学生的记录吗?(y/n)"< 性别只能是男(boy)或女(girl)!"< 判断输入的出生年是否正确 { 您输入的出生年不正确!请重新输入:"< } 请输入出生月:"; 判断输入的出生月是否正确 { cout<<"您输入的出生月不正确!请重新输入:"< } 请输入出生日:"; 判断输入的出生日是否正确 { cout<<"您输入的出生日不正确!请重新输入:"< } 请输入兴趣爱好:"< 该记录已修改!"< if(p==0) 您输入的学号不存在!"< getch(); } void stuOperate::stuBirth() //近期要过生日的学生 { if(s==0) { 系统中无学生信息,请先输入记录!"< else { time_t t = time(NULL); tm* pt = localtime(&t); int stuYear,stuMonth,stuDay; int thisYear,thisMonth,thisDay; thisYear = 1900+pt->tm_year; //获取当前年 thisMonth = pt->tm_mon+1;//获取当前月 thisDay = pt->tm_mday;//获取当前日 //判断润年与平年,平年二月是二十八天,闰年二月是二十九天,(1.年份能被4整除,不能被100整除;2.年份能被100整除,也能被400整除 ) int isRunYear=0; if(thisYear%4==0 && thisYear%100!=0) { } if(thisYear%100==0 && thisYear%400==0) { } //列出近7天要过生日的学生的信息 int isFound=0; for(int i=1;i<=s;i++) { 获取学生的日月年 本月 if((thisMonth==stuMonth)&&(stuDay-thisDay>0)&&(stuDay-thisDay<=7)) 调用打印函数 跨月 如果是2月 如果是润年29天 调用打印函数 else//平年28天 调用打印函数 不是2月则按31天计算 调用打印函数 跨年 调用打印函数 } if(isFound==0) { 在最近7天中,没有学生过生日!"< } } void stuOperate::stuPercent() //学生男女百分比 { if(s==0) { 系统中无学生信息,请先输入记录!"< else { int boy=0; float boyPercent,girlPercent; for(int i=1;i<=s;i++) { 男")||checkStr(stu[i].sex,"boy")) } if(boy==0) { } else if(boy==s) { } else { 只有转换成float类型才能计算,如果是int型将是0 } cout<<"****************** 查看学生男女比例 ******************"< } void stuOperate::display() //显示菜单项 { cout< void main() { stuOperate st; char confirmKey,key; while(1) { 显示菜单项 cout<<"请选择操作(1-6):"< if(key=='0') break; switch (key) { 调用输入函数 该生已输入完毕,是否继续输入?(y/n)"< 该生已输入完毕,是否继续输入?(y/n)"< 查询计科111班学生信息 ******************"< { 查询所有学生信息 系统中无学生信息,请先输入记录!"< 根据学号查询 您选择错误,请重新选择!"< } cout<<"您已退出系统!"<