STL阶段练习(简单电话簿功能模仿)

源代码:

View Code
// STLPhonBook.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

using namespace std;

enum MenuOptionSelect
{
InsertContactsetEnity=0,
DisplayEntries=1,
FindNumber=2,
DeleteConnect=3,
QuitApplation=4
};

struct ContactItem
{
string strYouName;
string strYouNumber;

ContactItem(const string & strName,const string &strNumber)
{
strYouName=strName;
strYouNumber=strNumber;
}

bool operator == (const ContactItem &itemToCompare) const
{
return (itemToCompare.strYouName==this->strYouName);
}

bool operator < (const ContactItem & itemtoCompare) const
{
return (this->strYouName<itemtoCompare.strYouName);
}
};

int ShowMenu();
ContactItem GetConnectInfo();
void DisplayConnectSet(const set<ContactItem> & setConnects);
void FindConnect(const set<ContactItem>& setConnects);
void DelateConnects(set<ContactItem >& setConnects);

int _tmain(int argc, _TCHAR* argv[])
{

set<ContactItem> setConnects;
int nUserSelection=InsertContactsetEnity;

//实现的就是为了一直循环 供用户选择 知道选择 结束程序
while(nUserSelection=ShowMenu()!=(int)QuitApplation)
{
switch(nUserSelection)
{
case InsertContactsetEnity:
setConnects.insert(GetConnectInfo());
cout<<"电话薄更新成功!"<<endl;
break;

case DisplayEntries:
DisplayConnectSet(setConnects);
break;

case FindNumber:
FindConnect(setConnects);
break;

case DeleteConnect:
DelateConnects(setConnects);
DisplayConnectSet(setConnects);
break;

default:
cout<<"非法输入!你得选择0-4里面的数据!!"<<endl;
break;

}

}


return 0;
}
void DisplayConnectSet(const set<ContactItem> & setConnects)
{
cout<<"* * * * * * * 电话簿信息 * * * * * * *"<<endl;
cout<<"总共有"<<setConnects.size()<<"个电话信息"<<endl;

set<ContactItem>::const_iterator iterConnect=setConnects.begin();
while(iterConnect!=setConnects.end())
{
cout<<"姓名:"<<iterConnect->strYouName<<" 电话:"<<iterConnect->strYouNumber<<endl;
iterConnect++;
}

}

ContactItem GetConnectInfo()
{
cout<<"请输入名字:>>";
string strName;
cin>>strName;
string strPhonNumber;

cout<<strName<<"的电话号码:>>";
cin>>strPhonNumber;
return ContactItem(strName,strPhonNumber);
}

int ShowMenu()
{
cout<<"**** * * * * ***欢迎,请选择***** * * * *******"<<endl;
cout<<"选择 0 添加 姓名以及 电话 "<<endl;
cout<<"选择 1 来显示所有电话信息 "<<endl;
cout<<"选择 2 来查找信息 "<<endl;
cout<<"选择 3 来删除电话信息"<<endl;
cout<<"选择 4 来结束电话簿服务 !"<<endl;
cout<<">>";

int nYourSelect=0;
cin>>nYourSelect;
cout<<endl;
return nYourSelect;
}
void FindConnect(const set<ContactItem>& setConnects)
{
cout<<"@@@@@@@@@@@@@@@@@@@@@22"<<endl;
cout<<"输入名字,哥来帮你找:"<<endl;
cout<<">>"<<endl;
string strName;
cin>>strName;

set<ContactItem>::const_iterator iterFind=setConnects.find(ContactItem(strName,""));
if (iterFind!=setConnects.end())
{
cout<<strName<<" 被找到!电话号码:"<<iterFind->strYouNumber<<endl;
}
else
cout<<"貌似没有这个人啊???"<<endl;
cout<<endl;
return;
}

void DelateConnects(set<ContactItem >& setConnects)
{
cout<<"你喜爱删除谁的信息捏??"<<endl;
cout<<">>"<<endl;

string strName;
cin>>strName;

size_t nDelet=setConnects.erase(ContactItem(strName,""));

if (nDelet>0)
{
cout<<strName<<"删除了!"<<endl;

}
else
cout<<strName<<"没找到!"<<endl;

}

这个礼拜学习了STL简单应用,仿照例子写了一个模仿电话簿功能的set的应用。

自己照着例子做的STL的简单应用。牛人不需要,俺是给新手们分享的。

而且看了《编程方法学》这个公开课,就试着以自顶向下的方式分析一下自己的代码,并分析自己碰到的问题。

首先是需求,我要做一个控制台下的电话簿,可以有一个菜单,里面存数据,删除数据,显示数据,搜索数据的功能(主要是为了应用STL)

所以我先定义了一个while循环

 1 while(nUserSelection=ShowMenu()!=(int)QuitApplation)
2 {
3 switch(nUserSelection)
4 {
5 case 0:
6 setConnects.insert(GetConnectInfo()); //获取输入的值
7 cout<<"电话薄更新成功!"<<endl;
8 break;
9
10 case 1:
11 DisplayConnectSet(setConnects); //显示所有得知
12 break;
13
14 case 2:
15 FindConnect(setConnects);//查找输入的值
16 break;
17
18 case3:
19 DelateConnects(setConnects); 是//删除
20 DisplayConnectSet(setConnects);//然后显示
21 break;
22
23 default:
24 cout<<"非法输入!你得选择0-4里面的数据!!"<<endl;
25 break;
26
27 }


这时候需要一个电话簿的类了。为了简单,我写了结构体,

 1 struct ContactItem
2 {
3 string strYouName;
4 string strYouNumber;
5
6 ContactItem(const string & strName,const string &strNumber)
7 {
8 strYouName=strName;
9 strYouNumber=strNumber;
10 }
11
12 bool operator == (const ContactItem &itemToCompare) const
13 {
14 return (itemToCompare.strYouName==this->strYouName);
15 }
16
17 bool operator < (const ContactItem & itemtoCompare) const
18 {
19 return (this->strYouName<itemtoCompare.strYouName);
20 }
21 };

结构体中,在set的的排序中我为了默认以名字的排序,重载了"<" 使得按照字母的顺序排列。

这样以来,我们就可以操作一个  ContactItem 类型的set对象了。下面一个一个实现功能。

1.获取输入的值:实现输入姓名以及电话,所以函数返回值为 ContactItem 。

 1 ContactItem GetConnectInfo()
2 {
3 cout<<"请输入名字:>>";
4 string strName;
5 cin>>strName;
6 string strPhonNumber;
7
8 cout<<strName<<"的电话号码:>>";
9 cin>>strPhonNumber;
10 return ContactItem(strName,strPhonNumber);//构造
11 }

2.显示所有保存的数据 : 遍历容器的所有内容,并打印。

用到迭代器:指向赋值容器的指针。所以操作迭代器就实现了遍历容器了。个人喜欢while,只有到中间的某个位置的时候,才会用for循环。(不担心位置问题)

 1 void DisplayConnectSet(const set<ContactItem> & setConnects)
2 {
3 cout<<"* * * * * * * 电话簿信息 * * * * * * *"<<endl;
4 cout<<"总共有"<<setConnects.size()<<"个电话信息"<<endl;
5
6 set<ContactItem>::const_iterator iterConnect=setConnects.begin();
7 while(iterConnect!=setConnects.end())
8 {
9 cout<<"姓名:"<<iterConnect->strYouName<<" 电话:"<<iterConnect->strYouNumber<<endl;
10 iterConnect++;
11 }
12
13 }

3.查找。find.

STL中定义: iterator find ( const key_type& x ) const;返回迭代器的类型,适合定位及显示。
 1 void FindConnect(const set<ContactItem>& setConnects)
2 {
3 cout<<"@@@@@@@@@@@@@@@@@@@@@22"<<endl;
4 cout<<"输入名字,哥来帮你找:"<<endl;
5 cout<<">>"<<endl;
6 string strName;
7 cin>>strName;
8
9 set<ContactItem>::const_iterator iterFind=setConnects.find(ContactItem(strName,""));
10 if (iterFind!=setConnects.end())
11 {
12 cout<<strName<<" 被找到!电话号码:"<<iterFind->strYouNumber<<endl;
13 }
14 else
15 cout<<"貌似没有这个人啊???"<<endl;
16 cout<<endl;
17 }
4.删除 erase。
     void erase ( iterator position );

size_type erase ( const key_type& x );

     void erase ( iterator first, iterator last );
分别用来传入迭代器删除、值删除(返回删除的个数,当然set不会又重复的,如果Muitiset的话就可以有好几个了)。
 1 void DelateConnects(set<ContactItem >& setConnects)
2 {
3 cout<<"你喜爱删除谁的信息捏??"<<endl;
4 cout<<">>"<<endl;
5
6 string strName;
7 cin>>strName;
8
9 size_t nDelet=setConnects.erase(ContactItem(strName,""));
10
11 if (nDelet>0)
12 {
13 cout<<strName<<"删除了!"<<endl;
14
15 }
16 else
17 cout<<strName<<"没找到!"<<endl;
这样,几个功能实现了,每个函数里面达到了原语级别。不用再往下分解。
另外,在switch中,为了编程的可读性强,定义一下枚举类型,
1 enum MenuOptionSelect
2 {
3 InsertContactsetEnity=0,
4 DisplayEntries=1,
5 FindNumber=2,
6 DeleteConnect=3,
7 QuitApplation=4
8 };
实现了可读性强的效果。
这就是我这几天学习的东西,发出来给新手看的,STL简单应用。
之后,也碰到了一些编译上的问题:
while循环中 忘记加括号。
while(nUserSelection=ShowMenu()!=(int)QuitApplation)
调试是nUserSelection 值始终是 1,首先判断ShowMenu() 与 (int)QuitApplation)是否相等,并返回结果给 nUserSelection 
加上括号 while((nUserSelection=ShowMenu())!=(int)QuitApplation)
过程相当于 
nUserSelection=ShowMenu()
while(nUserSelection!=(int)QuitApplation)
源程序:http://115.com/file/dpvawrhi#

你可能感兴趣的:(STL)