今天写题遇到个问题,字母大小写循环转换,乍一看好像挺简单的,但是做了后发现 'z' 无法转换为 'a',以前做过这种题,但是老忘ASCII码值是多少,导致每次都要去查然后慢慢理思路,所以干脆自己写一篇算了
第一种做法(有缺陷):
最通俗的做法就是当 c+1 的 ASCII 码值大于 'Z '或者大于 'z' 值就进行相减操作,因为字母的ASCII码值不会超过 122,可以不用进行取余操作
"""Python版"""
while True:
c = input()
if c == '-1':
break
#核心代码
if ('A' <= c <= 'Z') and (chr(ord(c) + 1) > 'Z'):
next_char = chr( ord(c) - 25 )
elif ('a' <= c <= 'z') and (chr(ord(c) + 1) > 'z'):
next_char = chr( ord(c) - 25 )
else:
next_char = chr( ord(c) + 1 )
print(next_char)
print()
这样写有点重复了,代码效率不高 ,让我们来优化一下代码
"""Python版"""
while True:
c = input()
if c == '-1':
break
#核心代码
if (('A' <= c <= 'Z') and (chr(ord(c) + 1) > 'Z')) or (('a' <= c <= 'z') and (chr(ord(c) + 1) > 'z')):
next_char = chr( ord(c) - 25 )
else:
next_char = chr( ord(c) + 1 )
print(next_char)
print()
附上C语言的写法
// C语言版
#include<stdio.h>
int main(void)
{
char ch;
char next_char;
while (1) //true 并不是一个本地定义的关键字,通常情况下,我们使用 1 表示真(true)和非零的值,并使用 0 表示假(false)和零值。
{
scanf_s("%c", &ch);
if (ch == '0')
break;
//核心代码
if (('A' <= ch && ch <= 'Z' && (ch + 1) > 'Z') || ('a' <= ch && ch <= 'z' && (ch + 1) > 'z'))
next_char = ch - 25;
else
next_char = ch + 1;
printf("%c\n", next_char);
}
return 0;
}
第二种做法(有缺陷):
这种做法的核心就在于,对 ASCII码 值大于一定范围的值进行先对 起始字母 相减,再对 26 取余的操作,拿 'z' 和 'a' 的转换来举例,'z' 的 ASCII 码值为 122 而 'a' 的 ASCII 码值为 97,进行如下运算:
(122-97+1) % 26 + 97 = 26 % 26 + 97 = 97
而 'a' 的 ASCII 码值就是 97
这样可以使得我们的字符能够正确被转换
"""Python版"""
while True:
c = input()
if c == '-1':
break
#核心代码
if ('A' <= c <= 'Z'):
next_char = chr( (ord(c) - ord('A') + 1) % 26 + ord('A') )
elif ('a' <= c <= 'z'):
next_char = chr( (ord(c) - ord('a') + 1) % 26 + ord('a') )
else:
next_char = chr( ord(c) + 1 )
print(next_char)
附上C语言的写法
// C语言版
#include<stdio.h>
int main(void)
{
char ch;
char next_char;
while (1) //true 并不是一个本地定义的关键字,通常情况下,我们使用 1 表示真(true)和非零的值,并使用 0 表示假(false)和零值。
{
scanf_s("%c", &ch);
if (ch == '0')
break;
//核心代码
if ('A' <= ch && ch <= 'Z')
next_char = (ch - 'A' + 1) % 26 + 'A';
else if ('a' <= ch && ch <= 'z')
next_char = (ch - 'a' + 1) % 26 + 'a';
else
next_char = ch + 1;
printf("%c\n", next_char);
}
return 0;
}
总结:
两种做法都有缺陷,就是无法对非法数据进行判断,比如输入 123,Python会认为这是一个字符串,无法与字符进行比较,就会报错。C也一样,输入 123 会输出 234,无法得到我们想要的数据,因为是我花了2小时+临时兴起写的文章,有问题在所难免,就先这样吧,以后再来改进
所有代码均由我在vs上运行成功后提交,如果有错误请您私信我,我看到后会及时改正