1.课设需求分析
1.1功能需求分析
1) 2) 3) 4) 5) 6)
客户信息的的录入 客户信息的查找 客户信息的删除
全部通信录信息的显示 客户信息的加载 客户信息的存储
1.2性能需求分析
1.硬件环境
普通windows操作系统计算机
2.软件环境
Vc6.0环境下运行
1.3 通讯录总体结构设计
2详细设计
3.1数据结构设计
1) 类的设计
2) 通讯录包含的类库
#include
#include #include
3) 各个变量的定义和作用
Linkman *head 头指针,用于遍历访问包含通讯录信息的链表 Int count; 用于记录联系人个数
Static bool loaded 用于表示当前联系人的信息是否来自于加载 string name 用于保存联系人信息 String tel_number 用于保存联系人号码 String address 用于保存联系人所在城市 String city 用于保存联系人当地的邮编
Linkman *next 做链表中的指针用于将多个节点连接起来
3.2成员函数的组成、功能、参数说明、相互调用关系
主函数main()
调用了page();menu(Telephone_book t); 扉页page()
用于显示个人信息,按任意键后消失。 菜单menu(Telephone_book t)
含有多个选项,可以选择。对应用户的选择,会调用相应功能的函数。
添加到链表尾部void Add_at_end(Linkman **h) 参数为链表的头指针,向此链表添加联系人信息。 添加联系人信息void add_linkman()
可以连续添加,在函数中调用void Add_at_end(Linkman **h) 函数,添加后,调用menu(Telephone_book t)可以选择跳入菜单界
面
查找联系人信息void find()
查找联系人信息,以联系人的名字作为查询对象,可以连续查找。 也可以调用menu(Telephone_book t)可以选择跳入菜单界面 删除联系人信息void delete_linkman()
删除联系人信息,以联系人的名字作为查询对象,可以连续删除。 也可以调用menu(Telephone_book t)可以选择跳入菜单界面 显示联系人信息void display_all_linkman()
显示所有联系人信息也可以调用menu(Telephone_book t)可以选择跳入菜单界面
加载联系人信息void laoding()
将文件中的信息加载到联系人列表中,也可以调用
menu(Telephone_book t)可以选择跳入菜单界面
存储联系人信息void storage()
首先判读联系人信息是否来自于文件的加载,是则将文件晴空,在存储,否则将信息直接添加到文件尾部。可以调用
menu(Telephone_book t)可以选择跳入菜单界面
4.测试流程
1.显示扉页
2.
按任意键,跳转到菜单界面
3.录入联系人信息
4.不在继续添加,选择查找联系人
5.输入要删除联系人的信息
6.添加新联系人,
7.存储联系人信息
8.删除联系人信息后,再从文件中加载信息
9.显示所有联系人信息
10.退出程序
11.Linkman.dat文件中保存的联系人信息
参考文献
1.谭浩强,C++程序设计,北京:清华大学出版社,2004.06
2.Stanley B.Lippman,Josee Lajoie,Barbara E.Moo著,李师贤,蒋爱军,梅晓勇,林瑛译,C++ Primer第四版,人民邮电出版社,2012.02
附录
源代码
(因为机房无法打开.dat文件,所以演示的时候全将其替换为.txt文件)
#include #include #include
using namespace std;
class Telephone_book; struct Linkman //构建联系人 { string name; string tel_number; string address; string city; string postcode; Linkman *next ; };
void page() ; //扉页名片
void menu(Telephone_book &t); //主菜单
class Telephone_book {
public: Telephone_book(Linkman *p=NULL,int cou=0): head(p),count(cou){} //构造函数 void add_linkman(); //录入联系人信息 void find(); //按姓名查找联系人 void delete_linkman(); //按姓名删除联系人 void display_all_Linkman(); //输出所有人的信息 void storage(); //存储所有联系人 void loading(); //载入联系人 ~Telephone_book(); //析构函数 private: Linkman *head; int count; static bool loaded; //判断是否加载过,不用每次都清除文件内容 void Add_at_end(Linkman **h); //可以实现递归调用,连续录入联系人信息 };
bool Telephone_book::loaded=false;
void Telephone_book::Add_at_end(Linkman **h) //将联系人信息添加到通讯录尾部
{
string choice="Y";
if(*h!=NULL)
{
cout
return ;
}
*h=new Linkman;
cout
cout
cin>>(*h)->name ;
cout
cin>>(*h)->tel_number ;
cout
cin>>(*h)->address ;
(*h)->next=NULL;
cout>choice;
while(choice!="N"&&choice!="Y")
{
cout
cin>>choice;
}
if(choice=="Y")
{
add_linkman();
}
else
{
menu(*this);
}
}///////////////////////////////////////////////////////////////////////////////////////
void Telephone_book::add_linkman() //录入联系人信息
{
Linkman *p=head;
if(head==NULL)
{
Add_at_end(&head);
}
else
{
while(p->next!=NULL)
{
p=p->next;
}
Add_at_end(&(p->next));
}
}//////////////////////////////////////////////////////////////////////////////////
void Telephone_book::find() //按姓名查找联系人
{
string choice="Y";
string nam;
while(1)
{
Linkman *p=head;
bool flage=false;
cout
cin>>nam;
if(p==NULL)
{
cout
return ;
}
else
{
while(p!=NULL)
{
if(p->name==nam)
{
coutname
couttel_number address
flage=true;
break;
}
p=p->next;
}
}
if(flage==false)
{
cout
}
cout
cin>>choice;
while(choice!="N"&&choice!="Y")
{
cout
cin>>choice;
}
if(choice=="N")
{
break;
}
}
menu(*this);
}///////////////////////////////////////////////////////////////////////////////////////
void Telephone_book::delete_linkman() //按姓名删除联系人
{
string nam;
string choice="Y";
while(1)
{
Linkman *p=head,*q=head;
bool flage=false;
cout>nam;
if(head==NULL)
{
cout
return ;
}
else
{
if(head->name ==nam)
{
head=p->next;
delete p;
flage=true;
}
else
{
p=head->next;
while(p!=NULL)
{
if(p->name==nam)
{
q->next=p->next;
delete p;
flage=true;
break;
}
q=p;
p=p->next;
}
}
}
if(flage==false)
{
cout
}
else
{
cout
}
cout
cin>>choice;
while(choice!="N"&&choice!="Y")
{
cout
cin>>choice;
}
if(choice=="N")
{
break;
}
}
menu(*this);
}////////////////////////////////////////////////////////////////////////////////////////////
void Telephone_book::display_all_Linkman() //输出所有人的信息
{
Linkman *p=head;
if(p==NULL)
{
cout
}
else
{
while(p!=NULL)
{
coutname
couttel_number
coutaddress
cout
p=p->next;
}
}
menu(*this);
}/////////////////////////////////////////////////////////////////////////////////////////////
void Telephone_book::storage()
所有联系人
{
ofstream outfile;
if(loaded)
{
outfile.open("Linkman.dat",ios::out);
}
else
{
outfile.open("Linkman.dat",ios::out|ios::app);
}
if(!outfile)
{
cerr
exit(1);
}
Linkman *p=head;
if(p==NULL)
{
cout
}
else
{
//存储
while(p!=NULL)
{
outfilename
outfiletel_number
outfileaddress
outfile
p=p->next;
}
}
outfile.close();
cout
menu(*this);
}//////////////////////////////////////////////////////////////////////////////////////
void Telephone_book::loading() //载入联系人
{
ifstream infile("Linkman.dat",ios::out);
Linkman *p=NULL,*q=NULL;
p=new Linkman;
head=p;
while(infile>>p->name,infile>>p->tel_number,infile>>p->address,infile) {
q=p;
p=new Linkman;
q->next=p;
}
p->next=NULL;
infile.close();
cout
loaded=true;
menu(*this);
}
////////////////////////////////////////////////////////////////////////////////////////
Telephone_book::~Telephone_book()
{
Linkman *p=head,*q=head;
while(p!=NULL)
{
q=p->next;
delete p;
p=q;
}
}////////////////////////////////////////////////////////////////////////////////////////
int main()
{
Telephone_book t;
page();
menu(t);
return 0;
}
void page() //扉页名片
{
for(int i=0;i
{
cout
}
cout
cout
cout
cout
cout
{
cout
}
cout
system("pause");
system("cls");
}
void menu(Telephone_book &t) //主菜单
{
char count=0;
for(int i=0;i
{
cout
}
cout
cout
cout
} cout>count; cout
1.课设需求分析
1.1功能需求分析
1) 2) 3) 4) 5) 6)
客户信息的的录入 客户信息的查找 客户信息的删除
全部通信录信息的显示 客户信息的加载 客户信息的存储
1.2性能需求分析
1.硬件环境
普通windows操作系统计算机
2.软件环境
Vc6.0环境下运行
1.3 通讯录总体结构设计
2详细设计
3.1数据结构设计
1) 类的设计
2) 通讯录包含的类库
#include
#include #include
3) 各个变量的定义和作用
Linkman *head 头指针,用于遍历访问包含通讯录信息的链表 Int count; 用于记录联系人个数
Static bool loaded 用于表示当前联系人的信息是否来自于加载 string name 用于保存联系人信息 String tel_number 用于保存联系人号码 String address 用于保存联系人所在城市 String city 用于保存联系人当地的邮编
Linkman *next 做链表中的指针用于将多个节点连接起来
3.2成员函数的组成、功能、参数说明、相互调用关系
主函数main()
调用了page();menu(Telephone_book t); 扉页page()
用于显示个人信息,按任意键后消失。 菜单menu(Telephone_book t)
含有多个选项,可以选择。对应用户的选择,会调用相应功能的函数。
添加到链表尾部void Add_at_end(Linkman **h) 参数为链表的头指针,向此链表添加联系人信息。 添加联系人信息void add_linkman()
可以连续添加,在函数中调用void Add_at_end(Linkman **h) 函数,添加后,调用menu(Telephone_book t)可以选择跳入菜单界
面
查找联系人信息void find()
查找联系人信息,以联系人的名字作为查询对象,可以连续查找。 也可以调用menu(Telephone_book t)可以选择跳入菜单界面 删除联系人信息void delete_linkman()
删除联系人信息,以联系人的名字作为查询对象,可以连续删除。 也可以调用menu(Telephone_book t)可以选择跳入菜单界面 显示联系人信息void display_all_linkman()
显示所有联系人信息也可以调用menu(Telephone_book t)可以选择跳入菜单界面
加载联系人信息void laoding()
将文件中的信息加载到联系人列表中,也可以调用
menu(Telephone_book t)可以选择跳入菜单界面
存储联系人信息void storage()
首先判读联系人信息是否来自于文件的加载,是则将文件晴空,在存储,否则将信息直接添加到文件尾部。可以调用
menu(Telephone_book t)可以选择跳入菜单界面
4.测试流程
1.显示扉页
2.
按任意键,跳转到菜单界面
3.录入联系人信息
4.不在继续添加,选择查找联系人
5.输入要删除联系人的信息
6.添加新联系人,
7.存储联系人信息
8.删除联系人信息后,再从文件中加载信息
9.显示所有联系人信息
10.退出程序
11.Linkman.dat文件中保存的联系人信息
参考文献
1.谭浩强,C++程序设计,北京:清华大学出版社,2004.06
2.Stanley B.Lippman,Josee Lajoie,Barbara E.Moo著,李师贤,蒋爱军,梅晓勇,林瑛译,C++ Primer第四版,人民邮电出版社,2012.02
附录
源代码
(因为机房无法打开.dat文件,所以演示的时候全将其替换为.txt文件)
#include #include #include
using namespace std;
class Telephone_book; struct Linkman //构建联系人 { string name; string tel_number; string address; string city; string postcode; Linkman *next ; };
void page() ; //扉页名片
void menu(Telephone_book &t); //主菜单
class Telephone_book {
public: Telephone_book(Linkman *p=NULL,int cou=0): head(p),count(cou){} //构造函数 void add_linkman(); //录入联系人信息 void find(); //按姓名查找联系人 void delete_linkman(); //按姓名删除联系人 void display_all_Linkman(); //输出所有人的信息 void storage(); //存储所有联系人 void loading(); //载入联系人 ~Telephone_book(); //析构函数 private: Linkman *head; int count; static bool loaded; //判断是否加载过,不用每次都清除文件内容 void Add_at_end(Linkman **h); //可以实现递归调用,连续录入联系人信息 };
bool Telephone_book::loaded=false;
void Telephone_book::Add_at_end(Linkman **h) //将联系人信息添加到通讯录尾部
{
string choice="Y";
if(*h!=NULL)
{
cout
return ;
}
*h=new Linkman;
cout
cout
cin>>(*h)->name ;
cout
cin>>(*h)->tel_number ;
cout
cin>>(*h)->address ;
(*h)->next=NULL;
cout>choice;
while(choice!="N"&&choice!="Y")
{
cout
cin>>choice;
}
if(choice=="Y")
{
add_linkman();
}
else
{
menu(*this);
}
}///////////////////////////////////////////////////////////////////////////////////////
void Telephone_book::add_linkman() //录入联系人信息
{
Linkman *p=head;
if(head==NULL)
{
Add_at_end(&head);
}
else
{
while(p->next!=NULL)
{
p=p->next;
}
Add_at_end(&(p->next));
}
}//////////////////////////////////////////////////////////////////////////////////
void Telephone_book::find() //按姓名查找联系人
{
string choice="Y";
string nam;
while(1)
{
Linkman *p=head;
bool flage=false;
cout
cin>>nam;
if(p==NULL)
{
cout
return ;
}
else
{
while(p!=NULL)
{
if(p->name==nam)
{
coutname
couttel_number address
flage=true;
break;
}
p=p->next;
}
}
if(flage==false)
{
cout
}
cout
cin>>choice;
while(choice!="N"&&choice!="Y")
{
cout
cin>>choice;
}
if(choice=="N")
{
break;
}
}
menu(*this);
}///////////////////////////////////////////////////////////////////////////////////////
void Telephone_book::delete_linkman() //按姓名删除联系人
{
string nam;
string choice="Y";
while(1)
{
Linkman *p=head,*q=head;
bool flage=false;
cout>nam;
if(head==NULL)
{
cout
return ;
}
else
{
if(head->name ==nam)
{
head=p->next;
delete p;
flage=true;
}
else
{
p=head->next;
while(p!=NULL)
{
if(p->name==nam)
{
q->next=p->next;
delete p;
flage=true;
break;
}
q=p;
p=p->next;
}
}
}
if(flage==false)
{
cout
}
else
{
cout
}
cout
cin>>choice;
while(choice!="N"&&choice!="Y")
{
cout
cin>>choice;
}
if(choice=="N")
{
break;
}
}
menu(*this);
}////////////////////////////////////////////////////////////////////////////////////////////
void Telephone_book::display_all_Linkman() //输出所有人的信息
{
Linkman *p=head;
if(p==NULL)
{
cout
}
else
{
while(p!=NULL)
{
coutname
couttel_number
coutaddress
cout
p=p->next;
}
}
menu(*this);
}/////////////////////////////////////////////////////////////////////////////////////////////
void Telephone_book::storage()
所有联系人
{
ofstream outfile;
if(loaded)
{
outfile.open("Linkman.dat",ios::out);
}
else
{
outfile.open("Linkman.dat",ios::out|ios::app);
}
if(!outfile)
{
cerr
exit(1);
}
Linkman *p=head;
if(p==NULL)
{
cout
}
else
{
//存储
while(p!=NULL)
{
outfilename
outfiletel_number
outfileaddress
outfile
p=p->next;
}
}
outfile.close();
cout
menu(*this);
}//////////////////////////////////////////////////////////////////////////////////////
void Telephone_book::loading() //载入联系人
{
ifstream infile("Linkman.dat",ios::out);
Linkman *p=NULL,*q=NULL;
p=new Linkman;
head=p;
while(infile>>p->name,infile>>p->tel_number,infile>>p->address,infile) {
q=p;
p=new Linkman;
q->next=p;
}
p->next=NULL;
infile.close();
cout
loaded=true;
menu(*this);
}
////////////////////////////////////////////////////////////////////////////////////////
Telephone_book::~Telephone_book()
{
Linkman *p=head,*q=head;
while(p!=NULL)
{
q=p->next;
delete p;
p=q;
}
}////////////////////////////////////////////////////////////////////////////////////////
int main()
{
Telephone_book t;
page();
menu(t);
return 0;
}
void page() //扉页名片
{
for(int i=0;i
{
cout
}
cout
cout
cout
cout
cout
{
cout
}
cout
system("pause");
system("cls");
}
void menu(Telephone_book &t) //主菜单
{
char count=0;
for(int i=0;i
{
cout
}
cout
cout
cout
} cout>count; cout