电话薄C++课设.docx
《电话薄C++课设.docx》由会员分享,可在线阅读,更多相关《电话薄C++课设.docx(35页珍藏版)》请在冰豆网上搜索。
电话薄C++课设
2013年C++课程设计
电话薄管理系统
-------南京理工大学
指导老师:
蔡骅
制作人:
李垒
电气1班
第一部分:
程序功能简介及程序设计要求
该程序为一简单的电话薄管理系统,即实现电话联系人数据的管理,包括添加联系人信息,修改联系人信息,显示查找联系人等代码简单易于实现,功能明确,思路清晰。
程序设计要求:
(1)将电话薄数据和相应的函数封装在类中,改写程序使之结构化。
(2)添加记录修改功能,能选择修改用户的姓名,电话。
(3)增加录入时间的显示及存储。
(4)增加缺省的查询方式,即查询时只输入姓名的首字母,所有符合这一条件的电话资料均在屏幕上显示。
第二部分:
程序设计详细介绍
一:
构思阶段
(1)本着用户使用的人性化要求,程序首先要有个整齐美观实用的交互界面,下面即为进入系统后的用户界面。
////////////////////////////////////////////////////////////////////////////////////////////////
当前登录时间:
SunApr1402:
43:
502013
****************************
1--添加联系人;
2--显示记录;
3--根据姓名查询;
4--智能查询(根据姓氏);
5--删除联系人;
6--删除所有联系人;
7--修改密码;
8--修改联系人号码;
9--退出程序;
****************************
输入对应编号:
//////////////////////////////////////////////////////////////////////////////////////////////
(2)考虑到实际情况,使用者的隐私要求该程序在设计阶段选择了设置一个安全模式,即密码登陆系统。
(3)考虑到程序的高效简洁性及代码的精炼之美,以及清晰地结构要求和保持良好的封装性,设计者详细周划了要设计哪些类,个各类实现什么功能,各类间关系及类之间的独立性要如何协调,最终敲定定义了时间类,密码类,节点类,记录管理类,文件操作类,各类之间功能结构清晰明了。
二:
实现阶段
具体写代码是一个艰难而快乐的过程,整个过程充满了探究性质,因为有些功能看似很简单,但实现起来却很困难,经常有很多小问题,这时候是最考验个人能力的关键,比如说文件操作类,
没去真正接触的时候觉得很简单都会得,但是做起来却遇到了问题,比如说,刚开始我一直以为输出到文件里东西都是以字符类型存在的,那我就疑惑,如果对一个整型数据进行操作该怎么办,是需要进行相关的转换吗,后来我发现并非如此,我针对这个问题专门做了一个小程序,来测试,测试后我发现,原来整形数据也是可以直接操作的,整形数据输出保持性质,但从文件中读入的时候,仍然可以用一个整型数据来接收其值,这令我有点欣喜地感觉,而且后来我发现这种方法来测试确实是一个百试不爽的方法。
当然有时候的情况是,你要接触一个你完全不懂的东西,这在刚开始会让你觉得很难下手,但当我们开始真正动手去查书,翻阅资料,请教老师,请教QQ群里的大神,以至于XX,常常为一个问题冥思苦想,编程熬夜到深夜,
到最终眉目一点点清晰,知道如何下手,再到后来知道如解决问题,这种探究的过程确确实实让我们收获了知识的喜悦。
以下主要把程序中的类以及函数功能简单介绍一下:
structNode//节点结构体定义
classCipher//密码类定义
{
voidEditCipher();
}
classStart
{
voidstart()//进入界面类,;包括:
界面显示,文件读取,当//前时间,上次登录时间,菜单显示,系统登录
}
classTime//定义时间类,在类将关于时间的内操作封装
{
voidshowtime()//显示当前时间
structtm*gettime()//返回时间节点指针,用于节点类中得到时间信息
classRecord_Manage//定义记录管理类,包含:
插入节点信息方法
{//输出所有节点信息方法,删除链表方法等
voidPrint_List()//输出所有信息
voidLookupOne(charname[])//根据姓名查询
voidClever_lookup(charFirstName[])//智能查找
voidAdd_node()//添加节点
voidDeleteNode()//删除指定节点
voidDeleteList()//删除所有的联系人
voidEditdata()//修该联系人信息
}
classFileStream
{
voidSaveFile(void)//保存数据到文件
voidLoadFile()/从文件中读取数据
}
classmenu//菜单类
{
showmenu()//显示菜单
voidhandle_choice()//选择进入的功能界面
}
三:
完善程序
在程序做好之后,我没有就此结束,而是开始和其他同学讨论交流方案,互相借鉴欣赏,在这个过程中,我发现自己的程序功能还是不够完善,使用不够人性化,于是我又进行了相关的修改。
比如添加通配符查询等,直到相对满意为止。
四:
源程序附录
#include
#include
#include//结构体类型tm在其中定义
#include
#include
#include
#include
#include
#include
structNode//节点结构体定义
{
charFirstName[20];
charName[40];
charptel_number[20];
intsec;
intmin;
inthour;
intmday;
intmon;
intyear;
intwday;
Node*next;
}*head=NULL;//全局节点型指针变量
longintold_cipher;
classCipher//密码类定义
{
public:
//longintold_cipher;
voidEditCipher()
{
longintnew_cipher1;
longintnew_cipher2;
loop:
cout<<"请输入新密码:
\n";
cin>>new_cipher1;
cout<<"请再次输入新密码确认:
\n";
cin>>new_cipher2;
if(new_cipher1==new_cipher2)
{
old_cipher=new_cipher1;
}
else
{
cout<<"两次密码不同,请重试\n";
gotoloop;
}
cout<<"密码修改成功!
\n";
}
};
classStart
{
intcipher_times;
public:
voidstart()//进入界面类,;包括:
界面显示,文件读取,当前时间,上次登录时间,菜单显示,系统登录
{
charenter;
cipher_times=0;//定义输入密码次数变量,超过3,程序退出
//Ciphercipher;//实例化密码对象
longinttemp_cipher;
cout<<"——————————欢迎进入电话薄管理系统————————————"<cout<<"_________指导老师:
"<cout<<"————————制作人:
"<cout<<"请输入5位登录密码:
(初始密码为12345;)\n";
cin>>temp_cipher;
while
(1)
{
if(temp_cipher==old_cipher)
break;
else
{
if(cipher_times>=2)
{
cout<<"您输入错误三次,程序将退出\n";
exit(0);
}
else
{
cipher_times++;
cout<<"密码错误,请重试!
\n";
cout<<"请输入5位登录密码:
(忘记密码请查看cipher.txt文件)\n";//cipher文档要事先建立并输入初始密码
cin>>temp_cipher;
}
}
}
cout<<"按回车键进入"<cin.get(enter);
system("cls");//执行系统命令,cls——清屏
}
};
classTime//定义时间类,在类将关于时间的内操作封装
{
public:
voidshowtime()//显示当前时间
{
time_ttimer;
timer=time(NULL);
cout<
}
structtm*gettime()//返回时间节点指针,用于节点类中得到时间信息
{
tm*ptime_node=NULL;
time_ttimer;
timer=time(NULL);
ptime_node=localtime(&timer);
returnptime_node;
}
};
classRecord_Manage//定义记录管理类,包含:
插入节点信息方法
{//输出所有节点信息方法,删除链表方法等
public:
voidPrint_List()//输出所有信息
{
Node*p_print=head;
if(head==NULL)
{
cout<<"目前无任何信息记录!
\n";
return;
}
while(p_print)
{
cout<<"姓名:
"<Name<cout<<"电话:
"<ptel_number<cout<<"录入时间:
"<cout<year<<"年"<mon<<"月"<mday<<"日"<hour<<"时"<min<<"分"<sec<<"秒"<cout<<"星期:
"<wday<cout<<"****************************************"<p_print=p_print->next;
}
}
voidLookupOne(charname[])//根据姓名查询
{
Node*p_lookup=head;
intflag=0;
if(head==NULL)
{
cout<<"目前无任何信息记录!
";
return;
}
while(p_lookup)
{
if(!
strcmp(p_lookup->Name,name))
{
cout<<"姓名:
"<Name<cout<<"电话:
"<ptel_number<cout<<"录入时间:
"<cout<year<<"年"<mon<<"月"<mday<<"日"<hour<<"时"<min<<"分"<sec<<"秒"<cout<<"星期:
"<wday<cout<<"****************************************"<flag=1;
}
p_lookup=p_lookup->next;
}
if(p_lookup==NULL&&flag==0)
{
cout<<"对不起,无此联系人信息!
\n";
}
}
voidprint_by_firstL()
{
charfirstL;
intk=0;
intflag=0;
cout<<"请输入姓氏首字母:
\n";
cin>>firstL;
Node*p_lookup=head;
if(head==NULL)
{
cout<<"目前无任何信息记录!
\n";
return;
}
while(p_lookup)
{
if(firstL==*p_lookup->FirstName)
{
k++;
cout<<"这是为您找到的第"<\n";
cout<<"********************************\n";
cout<<"姓名:
"<Name<cout<<"电话:
"<ptel_number<cout<<"录入时间:
"<cout<year<<"年"<mon<<"月"<mday<<"日"<hour<<"时"<min<<"分"<sec<<"秒"<cout<<"星期"<wday<cout<<"****************************************"<flag=1;
}
p_lookup=p_lookup->next;
}
if(p_lookup==NULL&&flag==0)
{
cout<<"对不起,无此联系人信息!
\n";
}
}
voidClever_lookup(charFirstName[])//智能查找
{
intflag=0;//标志变量,标明是否找到联系人
Node*p_lookup=head;
if(head==NULL)
{
cout<<"目前无任何信息记录!
\n";
return;
}
while(p_lookup)
{
if(!
strcmp(p_lookup->FirstName,FirstName))
{
cout<<"姓名:
"<Name<cout<<"电话:
"<ptel_number<cout<<"录入时间:
"<cout<year<<"年"<mon<<"月"<mday<<"日"<hour<<"时"<min<<"分"<sec<<"秒"<cout<<"星期"<wday<cout<<"****************************************"<flag=1;
}
p_lookup=p_lookup->next;
}
if(p_lookup==NULL&&flag==0)
{
cout<<"对不起,无此联系人信息!
\n";
}
}
intwildcard_match(constchar*wildcard,constchar*str)//通配符查询法
{
if(*wildcard=='\0')
return*str=='\0';
if(*wildcard=='?
')
returnwildcard_match(++wildcard,++str);
elseif(*wildcard=='*')
{
for(++wildcard;*str;++str)
if(wildcard_match(wildcard,str))
return1;
return*wildcard=='\0';
}
else
return*wildcard==*str&&wildcard_match(++wildcard,++str);
}
voidwild_lookup(char*wildcard)
{
Node*p_lookup=head;
intflag=0;
if(head==NULL)
{
cout<<"暂无任何联系人!
\n";
return;
}
while(p_lookup)
{
if(wildcard_match(wildcard,p_lookup->Name))
{
cout<<"姓名:
"<Name<cout<<"电话:
"<ptel_number<cout<<"录入时间:
"<cout<year<<"年"<mon<<"月"<mday<<"日"<hour<<"时"<min<<"分"<sec<<"秒"<cout<<"星期"<wday<cout<<"****************************************"<flag=1;
}
p_lookup=p_lookup->next;
}
if(p_lookup==NULL&&flag==0)
{
cout<<"对不起,没有找到你要的联系人!
如果确认联系人存在,请检查通配符是否正确,并确认是姓名通配!
\n";
}
}
voidAdd_node()//添加节点
{
charp_firstname[20];
charp_name[40];
charp_telnum[20];
Node*p_add1=head;
Node*p_add2=p_add1;//节点型指针1,2用于添加节点时遍历
Node*p_node=newNode;
tm*p_tm=NULL;
Timetimer;//时间类的实例化,获取当时时间
p_tm=timer.gettime();
cout<<"请输入联系人姓氏:
\n";
cin>>p_firstname;
cout<<"请输入联系人姓名:
\n";
cin>>p_name;
cout<<"请输入联系人电话号码:
\n";
cin>>p_telnum;
strcpy(p_node->FirstName,p_firstname);
strcpy(p_node->Name,p_name);
strcpy(p_node->ptel_number,p_telnum);
p_node->year=p_tm->tm_year+1900;
p_node->mon=p_tm->tm_mon+1;
p_node->mday=p_tm->tm_mday;
p_node->hour=p_tm->tm_hour;
p_node->min=p_tm->tm_min;
p_node->sec=p_tm->tm_sec;
p_node->wday=p_tm->tm_wday;//完善节点成员信息
p_add1=p_node;
if(head==NULL)
{
head=p_add1;
p_add1->next=NULL;
return;
}
while(p_add2->next)
p_add2=p_add2->next;
p_add2->next=p_add1;
p_add1->next=NULL;
}
voidDeleteNode()//删除指定节点
{
Node*p_delete1=NULL;
Node*p_delete2=NULL;
charp_getname[40];
if(head==NULL)
{
cout<<"链表为空,不能删除!
\n";
return;
}
cout<<"请输入要删除联系人的姓名:
\n";
cin>>p_getname;
p_delete1=head;
while(p_delete1)
{
if(!
strcmp(head->Name,p_getname))
{
head=head->next;
deletep_delet