题目链接:L1-059 敲笨钟 - 团体程序设计天梯赛-练习集 (pintia.cn)
目录:
题目要求:
输入格式:
输出格式:
输入样例:
输出样例:
思路:
代码:
测试结果:
题目要求:
微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。为了增加敲钟的趣味性,还会糟改几句古诗词。其糟改的方法为:去网上搜寻压“ong”韵的古诗词,把句尾的三个字换成“敲笨钟”。例如唐代诗人李贺有名句曰:“寻章摘句老雕虫,晓月当帘挂玉弓”,其中“虫”(chong)和“弓”(gong)都压了“ong”韵。于是这句诗就被糟改为“寻章摘句老雕虫,晓月当帘敲笨钟”。
现在给你一大堆古诗词句,要求你写个程序自动将压“ong”韵的句子糟改成“敲笨钟”。
输入格式:
输入首先在第一行给出一个不超过 20 的正整数 N。随后 N 行,每行用汉语拼音给出一句古诗词,分上下两半句,用逗号 ,
分隔,句号 .
结尾。相邻两字的拼音之间用一个空格分隔。题目保证每个字的拼音不超过 6 个字符,每行字符的总长度不超过 100,并且下半句诗至少有 3 个字。
输出格式:
对每一行诗句,判断其是否压“ong”韵。即上下两句末尾的字都是“ong”结尾。如果是压此韵的,就按题面方法糟改之后输出,输出格式同输入;否则输出 Skipped
,即跳过此句。
输入样例:
5xun 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.Skippedxue zhui rou zhi leng wei rong, an xiao chen jing qiao ben zhong.SkippedSkipped
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
思路:
主要功能是读取用户输入的一系列字符串,然后检查每个字符串中是否同时包含"ong,"和"ong."这两个子串。如果找到这样的字符串,程序会输出这个字符串(但去掉末尾的三个字),并在末尾加上" qiao ben zhong.";如果没有找到,就输出"Skipped"。
头文件和命名空间:
这里包含了<bits/stdc++.h>
头文件,它实际上是一个包含了C++标准库中几乎所有头文件的头文件。使用using namespace std;
为了避免在代码中重复写std::
前缀。
#include <bits/stdc++.h> using namespace std;
主函数:
程序的入口
int main() { .... }
读取字符串数量:
使用cin
读取一个整数n
,表示接下来要输入的字符串数量。getchar();
用来吸收输入缓冲区中的换行符,防止它影响后续的getline
调用。 cin >> n; string str; getchar();
处理每个字符串:
使用for
循环遍历n
次,每次循环中: 使用getline(cin, str);
从标准输入读取一行字符串,并存储在str
中。 for(int i = 0; i < n; i++) { getline(cin,str); ..... }
使用for
循环来读取n
行字符串。getline(cin,str);
用于读取一行字符串,并将其存储在str
中。
检查字符串:
使用str.find("ong,")
和 str.find("ong.")
检查字符串str
中是否同时包含"ong,"和"ong."这两个子串。如果两个子串都存在,则执行特定的输出操作;否则,输出"Skipped"。 if(str.find("ong,") != -1 && str.find("ong.") != -1) { ..... }else{ cout << "Skipped" << endl;}
使用str.find()
函数来检查字符串str
中是否包含"ong,"和"ong."。如果find()
函数返回的不是-1
,则说明找到了该子字符串。
输出操作:
如果字符串满足条件,则执行以下步骤: 初始化变量sum
为0,用于计数遇到的空格数;int sum = 0;初始化变量k
为0,用于存储最后一个非空格字符的索引;int k = 0;从字符串末尾开始遍历,每遇到一个空格,sum
加1,并更新k
的值;for(int j = str.size() - 1; sum != 3; j--)当sum
达到3时,停止遍历;从字符串开头到索引k
的位置输出字符; for(int z = 0; z < k; z++){ cout << str[z];}
输出固定的字符串" qiao ben zhong."。 cout << " qiao ben zhong." << endl;
如果找到了这两个子字符串,代码会执行以下操作:
* 使用一个内部循环从字符串的末尾开始,计算遇到的空格数量,直到找到3个空格为止。在这个过程中,`k`被设置为最后一个被检查的字符的索引。
* 使用另一个循环从字符串的开头到`k`,输出这些字符。
* 输出" qiao ben zhong."。
int sum = 0,k = 0; for(int j = str.size() - 1; sum != 3; j--) { if(str[j] == ' ') sum++; k = j; } for(int z = 0; z < k; z++) { cout << str[z]; } cout << " qiao ben zhong." << endl;
注意:
代码中使用getchar();
来消耗输入缓冲区中的换行符。这是因为在读取n
之后,输入缓冲区中可能还留有一个换行符,如果不消耗掉,它会被getline()
读取,导致第一行字符串为空。在处理找到的字符串时,内部循环的k = j;
应该放在if
语句块内部,否则k
只会被设置为最后一个字符的索引,而不是最后一个空格的索引。 代码:
#include <bits/stdc++.h>using namespace std;int main(){ int n; cin >> n; string str; getchar(); for(int i = 0; i < n; i++) { getline(cin,str); if(str.find("ong,") != -1 && str.find("ong.") != -1) { int sum = 0,k = 0; for(int j = str.size() - 1; sum != 3; j--) { if(str[j] == ' ') { sum++; k = j; } } for(int z = 0; z < k; z++) { cout << str[z]; } cout << " qiao ben zhong." << endl; } else { cout << "Skipped" << endl; } } return 0;}
测试结果: