字母循环转换(‘z‘转换为‘a‘)

  今天写题遇到个问题,字母大小写循环转换,乍一看好像挺简单的,但是做了后发现 '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上运行成功后提交,如果有错误请您私信我,我看到后会及时改正

感谢您的阅读!

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值