CodeRookie


私信TA

用户名:Shmily124

访问量:121396

签 名:

清风前烹茶对弈,明月下把酒言欢

等  级
排  名 14
经  验 21448
参赛次数 7
文章发表 39
年  龄 0
在职情况 学生
学  校 ZUA
专  业 计科

  自我简介:

悄悄地秃头,然后惊艳所有人?

发现好多题解都是授之鱼而不授之渔,属于应题代码,所以想写一个通用代码分享给大家


解题思路:

首先我们要知道一个叫做ASCII码表的东西,C语言的字符都是用ASCII码编写的

如果我们写一行这样的代码:

printf("%d\n", 'A');

将大写的 'A' 作为整形输出,会发现输出的结果是65,如果把 'A' 换成 'Z', 输出结果就会变成90

没错,其实每一个字符都是用一个数字来表示的,而且字符的排布是有序的,我们可以用字符来做比较甚至做运算

我们知道 'A' ==65, 'Z' ==90,那么我们想判断一个字符 ch 是否为大写字母的话,就可以这样写

if (ch >= 65 && ch <= 90)

或者不用数字,直接用字符做比较:

if (ch >= 'A' && ch <= 'Z')

同样的,判断小写字母就可以这样写:

if (ch >= 'a' && ch <= 'z')

判断语句写好了,接下来只需要将字母向后移动4位,但如果移动后的字符超过了字母 'Z' 或 'z' 该怎么办呢?

不必再使用分支,我们只需要将字符加4之后减去 'A' ( 或者 'a' ),然后对26取余,再加上 'A' ( 或者 'a' )


不太懂的话应该是这里没解释清楚:

字符加 4 就是后移的操作,减去 'A' 可以求出后移之后与 'A' 的距离

大写字母与 'A' 的距离应该为 0 ~ 25 ,但最后四个字母后移会超出这个范围

比如 'W' 后移 4 再减 'A' 变成了 26,超出了范围最大的 25,所以对 26 取余,就成了 0

0 就是 'W' 后移 4 之后与 'A' 真正的距离

此时拿这个距离再加上 'A' 就是后移之后真正的结果了,即 'A' ( 'W' 后移 4 位为 'A' )

小写字母同理


详细内容请看代码:

#include <stdio.h>
int main()
{
    char s[11];                             //定义一个长度为10的字符串(注意有结尾符)
    gets(s);                                //输入字符串
    for (int i = 0; s[i] != '\0'; i++)      //循环到结尾符'\0'时停止循环
    {
        if (s[i] >= 'A' && s[i] <= 'Z')             //判断是否为大写字母
        {
            s[i] = (s[i] + 4 - 'A') % 26 + 'A';     //大写字母后移
        }
        if (s[i] >= 'a' && s[i] <= 'z')             //判断是否为小写字母A
        {
            s[i] = (s[i] + 4 - 'a') % 26 + 'a';     //小写字母后移
        }
    }
    puts(s);                                //输出字符串
    return 0;
}


 

0.0分

628 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区

#include<stdio.h>
int main()
{
    int t;
    while((t=getchar())!='\n')
    {
        printf("%c",t+4);
    }
    return 0;
}
输出超限是为什么?
2021-11-21 22:11:03
#include"stdio.h"
int main()
{
	char a;
	int  i;
	for(i=1;i<=5;i++){
		a = getchar();
		a = a+4;
		printf("%c",a);
		
	}
	return 0;
}
我这个也能过,请问有什么不足之处吗
2021-11-21 09:52:49
原题中“用原来字母后面的第4个字母代替原来的字母”不够严谨,那请问大写Z后面第四个字母是多少?如果按照ASCII码应该是^,原题中应该在补充说明一下:对于后移4个字母期间超过最后一个字母Z时,则循环为A进行后移!
2021-10-23 22:48:00
我这个代码都能过也是真的离谱
#include<stdio.h>
int main()
{
    printf("Glmre");
}
2021-10-19 00:28:03
#include<stdio.h>
int main()
{
str(11);
gets(s)
for(int i=0,s[i]!='\0',i++)
{
    if(s[i]>='A'&&s[i]<='Z')
   {
       s[i]=(s[i]+4-'A')%26+'A';
   }
    if(s[i]>='a'&&s[i]<='z')
   {
       s[i]=(s[i]+4-'a')%26+'a';
   }
   puts(s);
   return 0;
}
哪里有问题
2021-10-18 20:04:58
#include<stdio.h>
int main()

{
      char  c1='C',c2='h',c3='i',c4='n',c5='a';
   c1='C'+4;
   c2='h'+4;
   c3+=4;
   c4+=4;
   c5+=4;
   printf("%c%c%c%c%c",c1,c2,c3,c4,c5);

}
2021-10-17 12:52:43
#include<stdio.h>
int main() {
    char a,b,c,d,e;
    scanf("%c%c%c%c%c",&a,&b,&c,&d,&e);
    if(a<='z' && a>='a') a=(a+4-'a')%26+'a';
    if(a<='Z' && a>='A') a=(a+4-'A')%26+'A';
    if(b<='z' && a>='a') b=(b+4-'a')%26+'a';
    if(b<='Z' && a>='A') b=(b+4-'A')%26+'A';
    if(c<='z' && a>='a') c=(c+4-'a')%26+'a';
    if(c<='Z' && a>='A') c=(c+4-'A')%26+'A';
    if(d<='z' && a>='a') d=(d+4-'a')%26+'a';
    if(d<='Z' && a>='A') d=(d+4-'A')%26+'A';
    if(e<='z' && a>='a') e=(e+4-'a')%26+'a';
    if(e<='Z' && a>='A') e=(e+4-'A')%26+'A';
    printf("%c%c%c%c%c",a,b,c,d,e);
    return 0;}
哪里错了?
2021-10-16 19:46:41
#include<stdio.h>
int main() {
    char a,b,c,d,e;
    scanf("%c%c%c%c%c",&a,&b,&c,&d,&e);
    if(a<='z' && a>='a') (a+4-'a')%26+'a';
    if(a<='Z' && a>='A') (a+4-'A')%26+'A';
    if(b<='z' && a>='a') (b+4-'a')%26+'a';
    if(b<='Z' && a>='A') (b+4-'A')%26+'A';
    if(c<='z' && a>='a') (c+4-'a')%26+'a';
    if(c<='Z' && a>='A') (c+4-'A')%26+'A';
    if(d<='z' && a>='a') (d+4-'a')%26+'a';
    if(d<='Z' && a>='A') (d+4-'A')%26+'A';
    if(e<='z' && a>='a') (e+4-'a')%26+'a';
    if(e<='Z' && a>='A') (e+4-'A')%26+'A';
    printf("%c%c%c%c%c",a,b,c,d,e);
    return 0;
}
请问大佬我哪里错了
2021-10-16 18:43:44