CCF计算机软件能力认证试题:201509-3 模板生成系统

先说感受:这道题其实并不难,就是麻烦,处理了老长时间最后只得了70分,服了,也不知道哪没考虑到。
在这里插入图片描述

解题思路:

我用的是c++11的正则表达式来做的,先对没一行进行分析,找出要替换的地方,接着在进行处理,在处理最后几行输入时,我用的将其拆分放入一个map中,这样在填的时候就知道哪个没有,比如样例中address就没有需要对其进行填空("")处理,可直接使用map.insert(make_pair())处理。

测试代码

#include<iostream>
#include<stdlib.h>
#include<regex>
#include<vector>
#include<string>
#include<iterator>
#include<map>
using namespace std;
typedef vector<string> vec_str;
map<string, string> con;
int isnot_exist(string str) {
	for (auto ss : con) {
		if (ss.first == str) {
			return 0;
		}
	}
	return 1;
}

string cope_str(string str) {
	string str_final;
	for (string::iterator i = str.begin(); i != str.end(); ++i) {
		if (*i >= 'a'&&*i <= 'z') {
			str_final += *i;
		}
	}
	return str_final;
}
void cope_condit(vector<string> vec) {
	string key, value;
	for (vector<string>::iterator it = begin(vec); it != end(vec); ++it) {
		for (string::iterator it_ = it->begin(); it_ != it->end(); ++it_) {
			if (*it_ != '\"') {
				key += *it_;
			}
			else {
				while (it_ != it->end()) {
					if (*it_ != '\"') {
						value += *it_;
					}
					it_++;
				}
				break;
			}
		}
		key.resize(key.size() - 1);
		con.insert(make_pair(key, value));
		key.clear();
		value.clear();
	}
}
int main() {
	vec_str model;//存储模板
	vec_str condit;//存储条件
	smatch result;
	regex ref{ "[{]+ [a-z]* [}]+"};//匹配花括号时需要将其放到方括号中
	int num1, num2;
	cin >> num1 >> num2;
//模板输入
	for (int i = 0; i < num1 + num2 + 1; ++i) {//使用getline,要处理第一个空
		string temp;
		getline(cin, temp);
		model.push_back(temp);
	}
	//处理第一个空
	for (int i = 1; i < model.size(); ++i) {
		model.at(i - 1) = model.at(i);
	}
	model.resize(model.size()-1);
	
	for (int i = num1; i < model.size(); ++i) {
		condit.push_back(model.at(i));
	}
	model.resize(model.size() - num2);

	//将condit处理为map,存入map<string,string> con;
	cope_condit(condit);
#if 0
	con.insert(make_pair("name", "wangxiaoning"));
	con.insert(make_pair("email", "bsbs@qq.com"));
#endif
	for (int i = 0; i < model.size();++i) {
		string str = model.at(i);
		string sub_str;
		if (regex_search(str, ref)) {//搜索其中是否含有目标
			string::const_iterator itB = str.begin();
			string::const_iterator itE = str.end();
			while (regex_search(itB, itE, result, ref)) {
				string tmp = result[0];
				string s = cope_str(tmp);
				if (isnot_exist(s)) {
					con.insert(make_pair(s, ""));
				}
				for (map<string, string>::iterator mr = begin(con); mr != end(con); ++mr) {
					if (tmp.find(mr->first)!=string::npos) {//在Map中找到相应的。就将其替换
						for (string::const_iterator mn = itB; mn < result[0].second - tmp.size(); ++mn) {
							sub_str += *mn;
						}
						sub_str += mr->second;
						break;
					}
				}
				itB = result[0].second;
			}
			for (string::const_iterator mn = itB; mn != itE; ++mn) {
				sub_str += *mn;
			}
			model.at(i) = sub_str;
		}
	}

	for (auto str : model) {
		cout << str << endl;
	}
	return 0;
}

//
for(auto m:targ)//这样遍历不可修改遍历内容

自己尽力了,拿不到满分。欢迎指正交流,一起进步。

修正:仔细读了var变量的要求进一步改进得分80分:方法“修改正则匹配原则为regex ref{"[{]+ [a-zA-Z_]{1}[a-zA-Z0-9_]* [}]+"}”,意思为匹配var不以数字开头,并有大小写字母数字下划线组成成的变量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值