字母规律转换解决思路
字母规律转换
将字母A变成字母E,a变成e,即变成其后的第4个字母.W变成A,X变成B,Y变成C,Z变成D.
非字母不变,例如 "China! "转换为 "Glmre! ".
#include <stdio.h>
void main()
{
char c;
while((c=getchar())!= '\n ') /*!= '\n '这个是什么不等于n?,为什么呢?*/
{
if((c> = 'a '&&c <= 'z ')||(c> = 'A '&&c <= 'Z ')) /*c输入的是一个字符串当然都大于z*/
{
c=c+4; /*是一个字符串ASCII码+4,还一个一个字符+4呢?*/
if(c> 'z '&&c <= 'Z '+4||c> 'z ')/*为什么对小字母不按此处理,即没有写成 "c> 'z '&&c <= 'z '+4 ",而只写成 "c> 'z ' ".*/
c=c-26;/*为要-26呢?一个字符-26还是一个字符串*/
}
printf( "%c ",c);
}printf( "\n ");
}
谢谢大家的帮助!
希望大家能讲的详细点~~谢谢了3Q
------解决方案--------------------
/*!= '\n '这个是什么不等于n?,为什么呢?*/
+++++++++++++++++++++++++++++++++++++++++++
遇到 '\n '(回车)即结束,否则一直接受字符,所以你才可以输入“china”,然后打下回车程序才会继续运行。
/*是一个字符串ASCII码+4,还一个一个字符+4呢?*/
++++++++++++++++++++++++++++++++++++
c=c+4的运行过程是这样:c是char类型,4是int型,要相加需将c转换为int型,即其ASCII码;相加后是int类型,这时候再赋值给c,看到c是char型,所以将所得的int型的值再转换成char。总之相当于把比原来c的ASCII码大4的ASCII码对应的字符赋给c。
/*为什么对小字母不按此处理,即没有写成 "c> 'z '&&c <= 'z '+4 ",而只写成 "c> 'z ' ".*/
/*为要-26呢?一个字符-26还是一个字符串*/
+++++++++++++++++++++++++++++++++++++++++++
首先要知道ASCII码的范围:
a-> z:97-> 122
A-> Z:65-> 90
由于之前c+4以后两组字符的最后4位会越界,越界要返还回来(如Z-> D),有26个字母所以要-26。c> 'z '&&c <= 'Z '+4是你笔误了,应该是c> 'Z '&&c <= 'Z '+4,去判断是否是大写字母的后四位,&&c <= 'Z '+4是因为小写字母页可能符合这个条件,但是并不需要‘-26’(如‘a’)。c> 'z '是判断是否是小写字母的后四位,之所以没有再加c <= 'z '+4是因为只要大于122就没有上述的可能。
------解决方案--------------------
Sorry, 漏了一个条件语句:
sU[]= "EFGHIJKLMNOPQRSTUVWXYXZABCD "
sL[]= "efghijklmnopqrstuvwxyzabcd "
if ((c > = 'A ') && (c <= 'Z '))
c = sU[c - 'A '];
else if ((c > = 'a ') && (c <= 'z '))
c = sL[c - 'a '];
将字母A变成字母E,a变成e,即变成其后的第4个字母.W变成A,X变成B,Y变成C,Z变成D.
非字母不变,例如 "China! "转换为 "Glmre! ".
#include <stdio.h>
void main()
{
char c;
while((c=getchar())!= '\n ') /*!= '\n '这个是什么不等于n?,为什么呢?*/
{
if((c> = 'a '&&c <= 'z ')||(c> = 'A '&&c <= 'Z ')) /*c输入的是一个字符串当然都大于z*/
{
c=c+4; /*是一个字符串ASCII码+4,还一个一个字符+4呢?*/
if(c> 'z '&&c <= 'Z '+4||c> 'z ')/*为什么对小字母不按此处理,即没有写成 "c> 'z '&&c <= 'z '+4 ",而只写成 "c> 'z ' ".*/
c=c-26;/*为要-26呢?一个字符-26还是一个字符串*/
}
printf( "%c ",c);
}printf( "\n ");
}
谢谢大家的帮助!
希望大家能讲的详细点~~谢谢了3Q
------解决方案--------------------
/*!= '\n '这个是什么不等于n?,为什么呢?*/
+++++++++++++++++++++++++++++++++++++++++++
遇到 '\n '(回车)即结束,否则一直接受字符,所以你才可以输入“china”,然后打下回车程序才会继续运行。
/*是一个字符串ASCII码+4,还一个一个字符+4呢?*/
++++++++++++++++++++++++++++++++++++
c=c+4的运行过程是这样:c是char类型,4是int型,要相加需将c转换为int型,即其ASCII码;相加后是int类型,这时候再赋值给c,看到c是char型,所以将所得的int型的值再转换成char。总之相当于把比原来c的ASCII码大4的ASCII码对应的字符赋给c。
/*为什么对小字母不按此处理,即没有写成 "c> 'z '&&c <= 'z '+4 ",而只写成 "c> 'z ' ".*/
/*为要-26呢?一个字符-26还是一个字符串*/
+++++++++++++++++++++++++++++++++++++++++++
首先要知道ASCII码的范围:
a-> z:97-> 122
A-> Z:65-> 90
由于之前c+4以后两组字符的最后4位会越界,越界要返还回来(如Z-> D),有26个字母所以要-26。c> 'z '&&c <= 'Z '+4是你笔误了,应该是c> 'Z '&&c <= 'Z '+4,去判断是否是大写字母的后四位,&&c <= 'Z '+4是因为小写字母页可能符合这个条件,但是并不需要‘-26’(如‘a’)。c> 'z '是判断是否是小写字母的后四位,之所以没有再加c <= 'z '+4是因为只要大于122就没有上述的可能。
------解决方案--------------------
Sorry, 漏了一个条件语句:
sU[]= "EFGHIJKLMNOPQRSTUVWXYXZABCD "
sL[]= "efghijklmnopqrstuvwxyzabcd "
if ((c > = 'A ') && (c <= 'Z '))
c = sU[c - 'A '];
else if ((c > = 'a ') && (c <= 'z '))
c = sL[c - 'a '];