说明:本题为完善程序题
题目:给定一个字符串S(S仅包括大小写字母),下面的程序将S中的每个字母用规定的字母替换,并输出经过替换后S的结果。程序的输入是两个字符串,即规定的字符串S,以及第二个字符串S‘。S'由26个字母组成,它是a--z的任一排列,大小写不定。S'规定了每个字母对应的替换字母:S'中的第一个字母是A和a的替换字母,即S中的A用该字母的大写替换,S中的a用该字母的小写替换;S'中的第二个字母是B和b的替换字母,即S中的B用该字母的大写替换,S中的b用该字母的小写替换;......以此类推。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char change[26],str[5000];
void CheckChangeRule(){
int i;
for(i=0;i<26;i++)
if(_______ (1)_______________) change[i]-='A'-'a';
}
void ChangeString(){
int i;
for(i=0;i<strlen(str);i++){
if(________(2)_____________) str[i]=change[str[i]-'A']-'a'+'A';
else ______(3)_______________
int main(){
cin>>str;
cin>>change;
CheckChangeRule();
_____(4)_________
cout<<str<<endl;
return 0;
}
分析:从main函数开始看,联系到上面的ChangeString函数,因此(4)应填ChangeString();(注意哦,横线后没有分号!)
接下来,核心在于两个子函数中。
首先,数组change存储S'中的字符,即替换字母;str是原字符串S。
由表达式change[i]-='A'-'a'可知,A的ASCII码为64,a的ASCII码为97,变形change[i]+=32;,其实就是把change中的大写字母转换为小写字母。因此(1)应填change[i]>='A'&&change[i]<='Z'。
来到ChangeString函数,第一个for语句扫描整个字符串S,由函数名可知,它的功能就是替换字符,有一个巧妙之处就是change[str[i]-'A'],此处也就是整个程序的核心。把无规律的ASCII码转换为字母对应的顺序(字母表顺序)(例如:设str[i]装的字符是A,则str[i]的值就为64,即64-64=0,变成了change[0]。),再由-'a'+'A'得,str[i]=change[str[i]-'A']-32;(由题知,被替换的字母如果是大写字母,则替换字母也为大写字母)因此(2)应填str[i]>='A'&&str[i]<='Z' 否则,str中为小写字母,则不用转换。
因此(3)填str[i]=change[str[i]-'a'];
整个程序到这里就结束了。
以下为完整代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char change[26],str[5000];
void CheckChangeRule(){
int i;
for(i=0;i<26;i++)
if(change[i]>='A'&&change[i]<='Z') change[i]-='A'-'a';
}
void ChangeString(){
int i;
for(i=0;i<strlen(str);i++){
if(str[i]>='A'&&str[i]<='Z') str[i]=change[str[i]-'A']-'a'+'A';
else str[i]=change[str[i]-'a'];
int main(){
cin>>str;
cin>>change;
CheckChangeRule();
ChangeString();
cout<<str<<endl;
return 0;
}
本文介绍了NOIP 2008普及组初赛的一道字符串替换题目,分析了程序实现逻辑。通过ChangeString函数实现字符串中每个字母的替换,利用ASCII码转换实现大小写字母的对应替换。程序关键在于将输入的字符串S中每个字母映射到S'中的相应替换字母。
1119

被折叠的 条评论
为什么被折叠?



