您的位置:首页 > 其它

用STL做的简易英汉词典(VS2005下编写)

2007-08-04 10:43 239 查看
用STL做的简易英汉词典(VS2005下编写)
// dictionary.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<algorithm>
#include<vector>
#include<string>
#include<map>
#include<utility>

using namespace std;
typedef map<string,vector<string>*>::value_type ValueType;
typedef map<string,vector<string>*>::iterator map_iterator;

class Dectionary
{
public:
Dectionary()
{

}
~Dectionary()
{

}

void inputcitiao();//此函数用来添加词条及其解释
void outputcitiao();//此函数用来输出所有词条及其解释
void lookforcitiao();//此函数用来查找词条的解释
void modifycitiao();//此函数用来修改词条的解释
void deletecitiao();//此函数用来删除词条
void showmenu();//此函数用来显示菜单和提供选择

private:
map<string, vector<string>*> citiao;
};

inline void Dectionary::inputcitiao()
{
string s1,s2;
cout<<"/n请输入英文词条(以输入‘#’号结束输入)"<<endl;
cin>>s1;
cout<<"/n请输入它的解释"<<endl;
while(cin>>s2)
{
if(s2=="#")
return;
if(!citiao.count (s1))
{
vector<string>*p=new vector<string>;
p->push_back (s2);
citiao.insert (ValueType(s1,p));
}
else
(*citiao[s1]).push_back (s2);
}

}

inline void Dectionary::outputcitiao()
{
char ch;
if(!citiao.size ())
{cout<<"/n词典中没有任何词条"<<endl;
return ;
}

cout<<"/n词条将依次输出"<<endl;
map<string,vector<string>*>::iterator iter_begin=citiao.begin ();
map<string,vector<string>*>::iterator iter_end=citiao.end ();
int old_count=0;
for( ;iter_begin!=iter_end;++iter_begin)
{ int count=0;
vector<string>*p=iter_begin->second ;
vector<string>::iterator siter_begin=p->begin ();
vector<string>::iterator siter_end=p->end ();

cout<<"第"<<++old_count<<"个词条"<<iter_begin->first <<"的解释为:"<<endl;
for( ;siter_begin!=siter_end;++siter_begin)
{
cout<<"("<<++count<<")"<<*siter_begin<<endl;
}
}
cin>>ch;
}

inline void Dectionary::lookforcitiao()
{
char ch;
cout<<"/n请输入要查找的词条"<<endl;
string s1;
cin>>s1;
if(!citiao.count (s1))
cout<<"/n没有要查找的词条"<<endl;
else
{
cout<<s1<<"的解释为:"<<endl;
vector<string>::iterator siter_begin=citiao[s1]->begin ();
vector<string>::iterator siter_end=citiao[s1]->end ();
string::size_type count=0;
for( ;siter_begin!=siter_end;++siter_begin)
{ cout<<"("<<++count<<")"<<*siter_begin<<endl;
}
}
cin>>ch;
}

inline void Dectionary::modifycitiao ()
{
cout<<"/n请输入要修改的词条"<<endl;
string s1,s2;
cin>>s1;
if(!citiao.count (s1))
cout<<"/n找不到要修改的词条"<<endl;
else
{
cout<<"已经找到要修改的词条"<<s1<<endl;
vector<string>*p=citiao[s1];
vector<string>::iterator siter_begin=citiao[s1]->begin ();
vector<string>::iterator siter_end=citiao[s1]->end ();
vector<string>::iterator buff;
cout<<"词条的内容为"<<endl;

string::size_type count=0;
int a;
for( ;siter_begin!=siter_end;++siter_begin)
{ cout<<"("<<++count<<")"<<*siter_begin<<endl;
}

cout<<"/n请输入要修改的是第几个解释"<<endl;
cin>>a;
while(a<0 || a>(citiao[s1]->size ()))
{cout<<"/n没有此条解释,请重新输入"<<endl;
cin>>a;
}
siter_begin=citiao[s1]->begin ();

buff=p->erase(siter_begin+a-1); //对vector<string>的删除和修改出现问题
cout<<"/n请输入新的解释"<<endl;
cin>>s2;
p->insert (buff,s2);
cout<<"/n修改后的词条解释为"<<endl;
count=0;
siter_begin=citiao[s1]->begin ();
siter_end=citiao[s1]->end ();
for( ;siter_begin!=siter_end;++siter_begin)
{ cout<<"("<<++count<<")"<<*siter_begin<<endl;
}

}
}

inline void Dectionary::deletecitiao()
{
char ch;
string s1;
cout<<"/n请输入要删除的词条"<<endl;
cin>>s1;
if(!citiao.count (s1))
cout<<"/n没有指定要删除的词条"<<endl;
else
{
if(citiao.erase (s1))
cout<<"/n删除成功"<<endl;
else
cout<<"/n删除不成功"<<endl;
}
cin>>ch;
}

inline void Dectionary:: showmenu()
{
char ch;
cout<<"********************************欢迎进入本词典系统******************************"<<endl;

cout<<" 1.添加新的词条 "<<endl;
cout<<" 2.查询词条 "<<endl;
cout<<" 3.按字母顺序输出所有词条 "<<endl;
cout<<" 4.删除一个词条 "<<endl;
cout<<" 5.修改一个词条 "<<endl;
cout<<"********************************请选择操作**************************************"<<endl;
cout<<endl;
int a;
cin>>a;
while(a<1 || a>5)
{
cout<<"没有这个选项,请重新选择"<<endl;
cin>>a;
}
switch(a)
{
case 1:
inputcitiao();
break;
case 2:
lookforcitiao();
break;
case 3:
outputcitiao();
break;
case 4:
deletecitiao();
break;
case 5:
modifycitiao();
break;
}

system("cls");
cout<<"/n要退出本系统吗?按Y(y)退出系统,按N(n)回到菜单;"<<endl;

cin>>ch;
while(!(ch=='y'||ch=='Y'||ch=='N'||ch=='n'))
cin>>ch;
if(ch=='y'||ch=='Y')
return;
else
showmenu();

}

int _tmain(int argc, _TCHAR* argv[])
{
Dectionary dc;
dc.showmenu ();
return 0;
}

/*程序心得:
(1)map中的元素是按照规定的次序排列的,而不是按照你的输入顺序排列,这就省了我写一个排序的函数
还害我写了半天这个排序函数,还错误百出;
(2)buff=p->erase(siter_begin+a-1); 和p->insert (buff,s2);在运行的时候突然中断
原因是:在for循环里面的时候siter_begin改变了,要重新设置siter_begin的值。这是个低级的错误。但是要注意的是
顺序容器vector在调用成员函数erase和insert的时候会使所有的迭代器失效,所以后面要恢复
siter_begin和siter_end的值,才能够最后显示修改后的词条内容。(effective STL的内容)

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: