C++(12):实现单词转换的map程序

这个程序的功能是这样的:给定一个string,将它转换为另一个string,程序的输入是两个文件。第一个文件保存的是一些规则,用来转换第二个文件中的文本,每条规则有两部分组成--一个可能出现在输入文件中的单词和一个用来替换为对应的短语,第二个输入文件包含要转换的文本。

程序如下:

#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <sstream>
#include <fstream>

map<string, string> buildMap(ifstream &map_file)     //读入给定rules.text文件,建立转换映射  
{  
    map<string, string> trans_map;   //保存转换规则  
    string key;                      //要转换的单词  
    string value;                   //替换后的内容  
    //读取第一个单词存入key中,行中剩余内容存入value  
    while (map_file >> key && getline(map_file, value))  
        if (value.size() > 1)        //检查是否有转换规则  
            trans_map[key] = value.substr(1);   
        else  
            throw runtime_error("no rule for " + key);  
    return trans_map;  
}  

const string &transform(const string &s, const map<string, string> &m)  
{  
    auto map_it = m.find(s);  
  
    if (map_it != m.cend())        //如果单词在转换规则m中  
        return map_it->second;     //使用替换短语  
    else  
        return s;                  //否则返回原string  
}  

void word_transform(ifstream &map_file, ifstream &input)  
{  
    auto trans_map = buildMap(map_file);   //保存转换规则  
    cout << "转换规则为: \n";  
    for (auto entry : trans_map)  
        cout << "key: " << entry.first<< "\tvalue: " << entry.second << endl;  
    cout << "\n\n";  
    string text;                     //保存输入中的每一行  
    cout << "转换后为: \n";  
    while (getline(input, text))  
    {    
        istringstream stream(text); //读取每一个单词  
        string word;  
        bool firstword = true;     //控制是否打印空格  
        while (stream >> word)   
        {  
            if (firstword)  
                firstword = false;  
            else  
                cout << " ";    
            cout << transform(word, trans_map);   
        }  
        cout << endl;          
    }  
} 

int main(int argc,const char *argv[])
{
    if (argc != 3)  
        throw runtime_error("wrong number of arguments");  
    ifstream map_file(argv[1]);    //第一个参数为rules.text文件  
    if (!map_file)               
        throw runtime_error("no transformation file");  
    ifstream input(argv[2]);      //第二个参数为text.text文件  
    if (!input)                   
        throw runtime_error("no input file");  
    word_transform(map_file, input); 
    return 0;
}

由于需要输入规则文件和替换文件,需要单独创建,比较麻烦,对于想要更快了解程序使用效果的人,可以使用下面的简写版本:

#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <sstream>
#include <fstream>

const string &transform(const string &s, const map<string, string> &m)
{
	auto map_it = m.find(s);

	if (map_it != m.cend())        //如果单词在转换规则m中  
		return map_it->second;     //使用替换短语  
	else
		return s;                  //否则返回原string  
}

void word_transform(map<string,string> rule, vector<string> &input)
{

	cout << "转换规则为: \n";
	for (auto entry : rule)
		cout << "key: " << entry.first << "\tvalue: " << entry.second << endl;
	cout << "\n\n";
	cout << "转换后为: \n";
	string word;
	bool firstword = true;     //控制是否打印空格  
	for (auto &word : input)
	{
		if (firstword)
			firstword = false;
		else
			cout << " ";
		cout << transform(word, rule);
		}
	cout << endl;

}

int main()
{
    map<string, string> rule;    //定义用于保存规则的空map
	rule[string("k")] = "okay?";
	rule[string("y")] = "why";
	rule[string("r")] = "are";
	rule.insert({ string("u"),"you" });
	rule.insert(make_pair(string("pic"), "picture"));
	rule.insert(pair<string, string>(string("thk"), "thanks"));
	rule[string("18r")] = "later";    //向map中插入自定义的规则,这里采用了好几种map的增加元素的方法
    //创建一个表示需要转换的字符串的vector
	vector<string> input = { "where","r","u" ,"?","y","dont","u","send","me","a","pic"};    

    word_transform(rule, input);
    return 0;
}

 

发布了85 篇原创文章 · 获赞 62 · 访问量 20万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览