微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。为了增加敲钟的趣味性,还会糟改几句古诗词。其糟改的方法为:去网上搜寻压“ong”韵的古诗词,把句尾的三个字换成“敲笨钟”。例如唐代诗人李贺有名句曰:“寻章摘句老雕虫,晓月当帘挂玉弓”,其中“虫”(chong)和“弓”(gong)都压了“ong”韵。于是这句诗就被糟改为“寻章摘句老雕虫,晓月当帘敲笨钟”。
现在给你一大堆古诗词句,要求你写个程序自动将压“ong”韵的句子糟改成“敲笨钟”。
输入格式:
输入首先在第一行给出一个不超过 20 的正整数 N。随后 N 行,每行用汉语拼音给出一句古诗词,分上下两半句,用逗号 ,
分隔,句号 .
结尾。相邻两字的拼音之间用一个空格分隔。题目保证每个字的拼音不超过 6 个字符,每行字符的总长度不超过 100,并且下半句诗至少有 3 个字。
输出格式:
对每一行诗句,判断其是否压“ong”韵。即上下两句末尾的字都是“ong”结尾。如果是压此韵的,就按题面方法糟改之后输出,输出格式同输入;否则输出 Skipped
,即跳过此句。
输入样例:
5
xun zhang zhai ju lao diao chong, xiao yue dang lian gua yu gong.
tian sheng wo cai bi you yong, qian jin san jin huan fu lai.
xue zhui rou zhi leng wei rong, an xiao chen jing shu wei long.
zuo ye xing chen zuo ye feng, hua lou xi pan gui tang dong.
ren xian gui hua luo, ye jing chun shan kong.
输出样例:
xun zhang zhai ju lao diao chong, xiao yue dang lian qiao ben zhong.
Skipped
xue zhui rou zhi leng wei rong, an xiao chen jing qiao ben zhong.
Skipped
Skipped
一.解题思路
在一重循环中将输入的每行字符串进行判断,满足替换条件输出更改后的字符串 否则输出skipped
更换条件要满足逗号前有ong 结尾有ong 此处需要取出特定位置的字符串 因此想到c++中的substr()函数 同时结合find()函数找到特定字符的位置进行判断 最后注意逗号前的字符数量要>=3才能保证有ong存在
因此代码结构为一重循环循环n次,循环中输入字符串,if()中三个条件同时满足&& 否则输出skipped
二.代码展示
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
cin.ignore();//忽略换行符
string str;
int pos;
for(int i=0;i<n;i++)
{
getline(cin,str);//输入整行字符串
pos = str.find(',');//得到‘,’所在位置
if(pos>=3&&str.substr(pos-3,3)=="ong"&&str.substr(str.size()-4,3)=="ong")
//pos大于等于3确保有位置放ong3个字符 同时要满足逗号前三个字符是ong 结尾三个是ong
{
pos = str.size();
for(int j=0;j<3;j++)
{
pos = str.rfind(' ',pos-1);
//找到结尾三个空格的位置 pos-1从空格前一个字符开始找 否则每次都找到的是前一次找到的空格造成原地踏步
}
cout << str.substr(0,pos) << " qiao ben zhong." << endl;
}
else
{
cout << "Skipped" << endl;
}
}
return 0;
}
三.函数讲解
1.find()
可以是algorithm头文件中的算法 也可以是string头文件中的函数
传入字符参数找到该字符所在位置的下标
传入字符串参数找到字符串首字符的位置
2.rfind()
与find作用相同 rfind返回的是从后往前数的下标
3.substr()
取特定位置的一段字符串
第一个参数为起始位置 第二个参数为字符串个数
substr(a,b)表示取从a开始的b个字符
4.cin.ignore()
忽略某字符的输入
两个参数 参数一为一个数值表示输入字符的个数(通常输入一个较大的数),第二个参数为一个字符表示要忽略的字符 例:
cin.ignore(1024,'\n')
表示输入到1024个字符次函数结束或输入\n该函数结束
默认参数为cin.ignore(1, EOF) 把EOF前的1个字符清掉,没有遇到EOF就清掉一个字符然后结束
可用不传参的方法解决换行符对输入的影响。
EOF 表示文件结束符
while(scanf("%d",&n) != EOF){ }
可持续输入 退出时按下CTRL+Z 才可退出