例6.10译密码。为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文。例如,可以按以下规律将电文变成密码:
将字母a变成字母E,a变成e,即变成其后的第4个字母,W变成a,X变成b,Y变成c,Z变成D。见图6.15。字母按上述规律转换,非字母字符不变。如“china!”转换为“Glmre!” 。
输入一行字符,要求输出其相应的密码。
程序如下:
#include <Stdio.h>
main()
{
char c;
while((c=getchar())!='\n')
{
if((c>='a' && c<='Z') || (c>='a' && c<='Z'))
{ c=c+4;
if(c>'Z' && c<='Z'+4 || c>'Z') c=c-26;
}
printf("%c",c);
}
}
运行结果如下:
china! 
Glmre!
程序中对输入的字符处理办法是:先判定它是否大写字母或小写字母,若是,则将其值加4(变成其后的第4个字母)。如果加4以后字符值大于‘Z’或‘Z’,则表示原来的字母在V(或v)之后,应按图6.15所示的规律将它转换为a~D(或a~d)之一。办法是使c减26,如果读者对此还有疑问,请查ascII码表即可清楚。还有一点请读者注意:内嵌的if语句不能写成
if(c>'Z'|| c>'Z') c=c-26;
因为当字母为小写时都满足“c>‘Z’”条件,从而也执行“c=c-26;”语句,这就会出错。
因此必须限制其范围为“c>‘Z’ && c<=‘Z’+4”,即原字母为‘W’到‘Z’,在此范围以外的不是大写字母W~Z,不应按此规律转换。请考虑:为什么对小写字母不按此处理,即写成
c>'Z' && c<='Z'+4
而只须写成“c>‘Z’”即可。