通讯录管理系统的设计与实现
课程设计报告
通讯录管理系的设计与实现
姓名:钟婷英班级:计122
学号:39 时间:2014年1月10日
1,问题描述
通讯录是用来记载和查询联系人通讯信息的工具,电子通讯录已经为手机,电子词典等设备中不可缺少的工具软件,请设计一个能够满足这种需求的软件,基本功能模块如下图所示。
输入:记录的录入。
显示:通讯录的显示。
查找:按指定方式,输入关键字,查找指定记录。
插入:实现记录的添加或在指定位置插入记录。
保存:将内存中正在被操作的通讯录以文件形式保存到磁盘。
读入:保存的逆操作,讲存在磁盘中的通讯录文件读到内存中。
排序:按指定关键字对通讯录数据进行排序。
修改:提供修改某条记录的功能。
移动:移动记录在通讯录中的存储位子,使其被查找或显示时的位序前移或后移。退出:结束程序运行。
2,设计要求
(1)设计通讯录数据的逻辑结构和物理结构。
(2)通讯录至少包括下列数据信息:姓名,电话,单位等。
(3)完成图示基本功能。
(4)软件易用,操作简单。
(5)根据自己使用通讯录体会扩充其他功能,如按姓名查找,按号码查找,按序号删除等。
(6)设计足够多的测试用例
(7)数据输入有效性检验:如姓名不能为空,号码中不能有非法字符等。(8)提供分组管理的相关功能,如:分组显示,加入组,组创建,组查询等。(9)可视化的界面设计。
3,概要设计
1,使用struct data struct addressList定义结构体类型,struct data结构体中包括年月日的定义,strcut addressList中包括联系人ID账号,名字,性别,名族,生日,手机号码,QQ号码和家庭地址等。
struct date
{
int year;
int month;
int day;
};
struct addressList
{
char ID[10];
char name[10];
char gender[4];
char minzu[2];
date birthday;
char shoujihao[14];
char QQ[11];
char address[40];
};
2,程序设计过程中用到的函数有:
int zhujiemian( );
void tianjia(fstream & );
void xiugai(fstream & );
void shanchu(fstream & );
void chazhao(fstream & );
void liulan(fstream & );
int findRecord(fstream &, const char *);
int getAmount(fstream & );
3,整个程序用的是面向对象的方法,在主函数中调用各种函数,来实现通讯录的功能。在主函数中,使用的是c++语言中的开关语句(switch)用来选择通讯录的各种功能。
4,在各个函数的编译过程中使用了system(“cls)命令,进项清屏工作,在利用各种输出命令。,
5,主界面设计为
采用了单链表形式,使得选择更加方便,快速。程序段为:
int zhujiemian( )
{
system("cls");
int selection=0;
cout<<"***********************************************"< cout<<" ※通讯录※"< cout<<"***********************************************"< cout< cout<<" 1、添加联系人信息"< cout< cout<<" 2、删除联系人信息"< cout< cout<<" 3、修改联系人信息"< cout< cout<<" 4、查询联系人信息"< cout< cout<<" 5、浏览联系人信息"< cout< cout<<" 6、退出"< cout<<" **********************************************"< cout<<"请选择:"; cin>>selection; return(selection); } 6,下面开始写各个函数,在函数中,采用了边做边存的思想,减少了工作量。,提供了是否正确打开通讯录的程序 7,调用函数void tianjia(fstream &listFile )当打开方式正确时,输入联系人的信息ID账号,姓名,性别(男/女)民族,出生年月,手机号,QQ号,家庭住址等。以防信息的重复添加,还提供了添加提醒,当添加好一个联系人之后会提醒是否继续添加,或者是回到主界面,运用了while,if,选择语句,进行操作。程序代码如下: void tianjia(fstream &listFile ) { system("cls"); cout<<"*********************************************"< cout<<" ※添加界面※"< cout<<"*********************************************"< addressList a; char b,c; do { ("",ios::out|ios::app|ios::binary); if()) { cout<<"打开通讯录失败!"< exit(0); } cout<<" 请输入以下信息:"< cout<<" 学号:"< cin>>; cout<<”姓名:"< cin>>; cout<<" 性别(男/女):"< cin>>; cout<<" 民族:"< cin>>; cout<<" 出生年-月-日:"< cin>>" 手机号:"< cin>>; cout<<" QQ号:"< cin>>; cout<<" 家庭住址:"< cin>>; cout<<"此信息已经添加!"< ((char *)&a,sizeof(a)); ( ); cout<<"是否继续添加?(Y/N)"< cin>>b; (); (); } while(toupper(b)=='Y'); cout<<"***************************************"< cout<<"是否返回到主界面?(Y/N)"< cin>>c; if(toupper(c)=='Y') main(); else exit(0); } 8,调用void xiugai (fstream&listFile)函数进行对通讯录的修改。用了if else语句判断输入的联系人信息是否正确,嵌套while语句,再用switch语句选择要修改的信息。程序片段如下: void xiugai(fstream &listFile ) { system("cls"); cout<<"************************************************"< cout<<"***********************************************"< bool isExit=false; char modifyName[10]; cout<<"\n请输入要修改的联系人的姓名:"; cin>>modifyName; ("",ios::out|ios::in|ios::binary); if()) { cout<<"打开通讯录失败!"< exit(0); } int pos=findRecord(listFile, modifyName); if(-1==pos) cout<<"对不起,没有"< else { addressList temp; ((long)(sizeof(addressList) * pos),ios::beg); ((char*)&temp,sizeof(addressList)); while(!isExit) { int selection=0; cout<<"***********************************"< cout<<" 1、ID"< cout<<" 2、姓名"< cout<<" 3、性别"< cout<<" 4、民族"< cout<<" 5、出生年-月-日"< cout<<" 6、手机号"< cout<<" 7、QQ"< cout<<" 8、家庭住址"< cout<<" 9、返回上一层"< cout<<"***********************************"< cout<<"\n请输入要修改的选项:"; cin>>selection; cout< switch(selection) { case 1: cout<<"原ID:"<<< cout<<"新ID:"; cin>>; (); cout<<"修改成功!"< break; case 2: cout<<"原姓名:"<<< cin>>; ( ); cout<<"修改成功!"< break; case 3: cout<<"原性别:"<<< cout<<"新性别:"; cin>>; (); cout<<"修改成功!"< break; case 4: cout<<"原民族:"<<< cin>>; (); cout<<"修改成功!"< break; case 5: cout<<"原出生年-月-日:"< <<"新出生年-月-日:"; cin>>"修改成功!"< break; case 6: cout<<"原手机号:"<<< cout<<"新手机号:"; cin>>; (); cout<<"修改成功!"< break; case 7: cout<<"原QQ:"<<< cout<<"新QQ:"; cin>>; (); cout<<"修改成功!"< break; case 8: cout<<"原地址:"<<< cout<<"新地址:"; cin>>; (); cout<<"修改成功!"< break; case 0: isExit=true; break; } } ((long)(sizeof(addressList) pos),ios::beg); ((char*)&temp,sizeof(addressList)); ( ); (); } cout< } 9,调用用函数void shanchu(fstream&listFile)进行对联系人的删除,整个函数使用 while ,if else语句进行操作,未免误删,还要进行提示,是否确认删除并确定是否删除成功,用到语句仍是选择和循环语句。程序片段如下; 、 10,调用函数void chazhao (fstream &listFile )来查询联系人信息,程序通过联系人的姓名来查找。程序片段如下: void chazhao(fstream &listFile ) { system("cls"); cout<<"***********************************************"< cout<<" ※查询界面※"< cout<<"***********************************************"< char findName[21]={'\0'},c; ("",ios::out|ios::in|ios::binary); if()) { cout<<"打开通讯录失败!"< exit(0); } cout<<"\n请输入要查找的同学的姓名:"; cin>>findName; int pos=findRecord(listFile, findName); if(-1==pos) cout<<"对不起,没有"< else { addressList temp; ((long)(sizeof(addressList) * pos),ios::beg); ((char*)&temp,sizeof(addressList)); cout<<"***************************************"< cout<<"学号:"<<< cout<<"姓名:"<<< cout<<"性别(男/女):"<<< cout<<"民族:"<<< cout<<"出生年-月-日:" < cout<<"QQ:"<<< cout<<"家庭住址:"<<< } (); cout<<"***************************************"< cout<<"是否返回到主界面?(Y/N)"< cin>>c; if(toupper(c)=='Y') main(); else exit(0); } 11,调用函数void liulan(fstream &listFile )来浏览之前添加并保存过的联系人。程序片段如下: void liulan(fstream &listFile ) { system("cls"); cout<<"***********************************************"< cout<<" ※浏览界面※ "< cout<<"***********************************************"< addressList a; char b; int count=0; ("",ios::in); if()) { cout<<"打开通讯录失败!/n"; exit(0); } while(!()) { ((char *)&a,sizeof(a)); if()) break; cout<<"********************************************"< cout<<"学号:"<<< cout<<"姓名:"<<< cout<<"性别(男/女):"<<< cout<<"民族:"<<< cout<<"出生年-月-日:" < cout<<"手机号:"<<< cout<<"QQ:"<<< cout<<"家庭住址:"<<< cout<<"********************************************"< count++; } (); if(count==0) cout<<"该通讯录里没有记录!"< cout<<"是否返回到主界面?(Y/N)"< cin>>b; if(toupper(b)=='Y') main(); else exit(0); } 12,调用函数void dineRecord(fstream &listFile, const char *pName)来进行通讯录内储存过联系人的查找。调出存储在电脑内指定位置的文件,进行查找。并用函数int getAmount(fstream &listFile )在查找之后返回文件中记录的个数。程序片段如下: //查找记录的记录号 int findRecord(fstream &listFile, const char *pName) { int pos=-1; addressList Temp; (0L,ios::beg); ((char*)&Temp,sizeof(addressList)); while(!( )) { pos++; if(strcmp,pName)==0) return(pos); ((char*)&Temp,sizeof(addressList)); } ( ); return(-1); } //返回文件中记录的个数 int getAmount(fstream &listFile ) { int amount=0; addressList temp; (0L,ios::beg); ((char*)&temp,sizeof(addressList)); while(!( )) { amount++; ((char*)&temp,sizeof(addressList)); } ( ); return amount; } 4,设计与体会 一星期的课程设计就这样面临尾声,在课程设计之前,总觉得自己学的c++,java 和数据结构没什么用武之地,直到课程设计让我们设计通讯录管理系统,才发现原来学好计算机语言和数据结构是一件多么有趣的事,不仅可以设计通讯录,还可设计游戏,这激发了我好好学习计算机语言的兴趣。 在这次的课程设计当中,很多东西我都不太懂,除了会用一些基本的语句,编写一些函数之外,大部分程序还是向同学请教和网上参考的,在设计过程中遇到过很多的难题,最多的一次,碰上了100多个错误,和n多警告,在经过很多次的调试修改之后,还是没调出理想的结果,当时就想放弃了。但是,看着同学们那么激情洋溢的调试程序,给了我继续下去的勇气。终于调出了基本符合的程序,用的是最简单语法。借鉴了边看边存的程序语段,才提升了我程序的档次。尽管这次课程设计快要结束了,但是我还是会继续完善我做的程序,让它变得更加全面。 源程序附录: #include #include #include #include <> #include #include using namespace std; const char fileName[]=""; //定义结构体 struct date { int year; int month; int day; }; struct addressList { char xuehao[10]; char name[10]; char gender[4]; char minzu[2]; date birthday; char shoujihao[14]; char QQ[11]; char address[40]; }; //函数声明 int zhujiemian( ); void tianjia(fstream & ); void xiugai(fstream & ); void shanchu(fstream & ); void chazhao(fstream & ); void liulan(fstream & ); int findRecord(fstream &, const char *); int getAmount(fstream & ); //主函数 int main( ) { bool Exit=false; fstream listFile; while(!Exit) switch(zhujiemian( )) { case 1: tianjia(listFile); break; case 2: shanchu(listFile); break; case 3: xiugai(listFile); break; case 4: chazhao(listFile); break; case 5: liulan(listFile); break; case 0: Exit=true; break; } return 0; } int zhujiemian( ) { system("cls"); int selection=0; cout<<"***********************************************"< cout<<" ※通讯录※"< cout<<"***********************************************"< cout< cout<<" 1、添加联系人信息"< cout< cout<<" 2、删除联系人信息"< cout< cout<<" 3、修改联系人信息"< cout< cout<<" 4、查询联系人信息"< cout< cout<<" 5、浏览联系人信息"< cout< cout<<" 6、退出"< cout<<" **********************************************"< cout<<"请选择:"; cin>>selection; return(selection); } //添加联系人信息 void tianjia(fstream &listFile ) { system("cls"); cout<<"*********************************************"< cout<<" ※添加界面※"< cout<<"*********************************************"< addressList a; char b,c; { ("",ios::out|ios::app|ios::binary); if()) { cout<<"打开通讯录失败!"< exit(0); } cout<<" 请输入以下信息:"< cout<<" 学号:"< cin>>; cout<<" 姓名:"< cin>>; cout<<" 性别(男/女):"< cin>>; cout<<" 民族:"< cin>>; cout<<" 出生年-月-日:"< cin>> cout<<" 手机号:"< cin>>; cout<<" QQ号:"< cin>>; cout<<" 家庭住址:"< cin>>; cout<<"此信息已经添加!"<