【问题描述】
输入5个小写字母,将其译成密码。密码规律是:用原来的字母后面第4个字母代替原来的字母。例如,输入“ahoux”,‘a’->‘b’->‘c’->‘d’->‘e’,所以字母‘a’后面第4个字母是‘e’,用‘e’代替‘a’;字母‘x’后面不足4个字母,则从‘a’开始补充,‘x’->‘y’->‘z’->‘a’->‘b’,所以字母‘x’后面第4个字母是‘b’,用‘b’代替‘x’。因此,“ahoux”应译为“elsyb”。
【输入形式】
连续输入5个字符
【输出形式】
连续输出5个字符
【样例输入】
world
【样例输出】
asvph
【样例说明】
‘w’后面第4字符已超出小写字母范围,因此回到开头继续数,是’a’,‘o’后面第4个字符是’s’,‘r’后面第4个字符是’v’,‘l’后面第4个字符是’p’,‘d’后面第4个字符是’h’
解法有很多,但无论如何,都逃不开if else这种选择结构。
那么问题来了,如何实现这个程序?
其实最本质的问题就是什么字母后移4个单位之后,是否越界。如果越界就要重新来,如果不越界那就直接加上4——当然,要注意数据类型的转换。
#include
using namespace std;
int main()
{
char a,b,c,d,e;
cin>>a>>b>>c>>d>>e;
if(a+4>122) cout<<(char)(a-22);
else cout<<(char)(a+4);
if(b+4>122) cout<<(char)(b-22);
else cout<<(char)(b+4);
if(c+4>122) cout<<(char)(c-22);
else cout<<(char)(c+4);
if(d+4>122) cout<<(char)(d-22);
else cout<<(char)(d+4);
if(e+4>122) cout<<(char)(e-22);
else cout<<(char)(e+4);
}
但是,作为选择结构的最后一题,为了和后面饿循环结构有一个平稳的过渡,我们不妨从另一个角度思考一下:这程序是否可以简化?换句话说,这个程序有没有比较冗余的地方?
其实是有的。
很容易观察出来,五组if else基本上都在做相同的事情。相同!那就有循环结构存在的意义了!当然,有点超纲,可是前面写程序的时候已经发现有人不讲武德了,那我也没什么好说的了。顺便用上数组了。
#include
using namespace std;
int main()
{
char c[5];
for(int i=0;i<5;i++) cin>>c[i];
for(int i=0;i<5;i++)
if(c[i]+4>'z') cout<<(char)(c[i]-22);
else cout<<(char)(c[i]+4);
}
用上循环结构,程序是不是简洁很多呢?
所以,写程序一段时间之后,可以通过后面的知识点再重新A掉前面的题,应该是会对水平有提升的——至少可以巩固知识点。