wsb1991abc 发表于 2024-3-18 10:26:28

译密码,输入一个字符串(在26个字母内),按每个字母向后变为第4个字母的规律转换

#include<stdio.h>
int main()
{
char c;
c=getchar();
while(c!='\n')
{if((c>='A'&&c<='V')||(c>='a'&&c<='v'))
    c=c+4;
if((c>='W'&&c<='Z')||(c>='w'&&c<='z'))
    c=c-22;
}
printf("%c\n",c);
return 0;
}
请哪位大神看一下我的这个逻辑有哪些错误,执行不出正确结果

FishC 发表于 2024-3-18 10:26:46

你的代码存在一些语法错误,有几处赋值操作应该是比较操作。此外,你的逻辑也有误,因为你只判断了大写字母和小写字母的情况,没有考虑其他字符。以下是一个修正后的代码示例:

#include <stdio.h>

int main() {
    char c;
    c = getchar();
    while(c != '\n') {
      if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) {
            c += 4;
            if (c > 'Z' && c < 'a') {
                c -= 26;
            }
            else if (c > 'z') {
                c -= 26;
            }
      }
      printf("%c", c);
      c = getchar();
    }
    return 0;
}

这段代码中,我们首先读取用户输入的字符,并将其存储在变量c中。然后,我们通过循环遍历字符串中的每个字符,直到遇到换行符为止。在循环中,我们首先判断字符是否是大写字母或小写字母,如果是,则将其向后移动4个位置。然后,我们检查移动后的字符是否超出了字母范围(即超过了'Z'或'z'),如果是,则将其减去26,使其回到字母开头。最后,我们打印出转换后的结果,并继续读取下一个字符。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

wsb1991abc 发表于 2024-3-18 23:25:13

这个问题只在26个字母中选字符串的,还有为什么要在最后还要读取字符串

FishC 发表于 2024-3-18 23:25:31

wsb1991abc 发表于 2024-03-18 23:25
这个问题只在26个字母中选字符串的,还有为什么要在最 ...

非常抱歉,我理解错了你的问题。在这种情况下,我们可以使用取模运算符 `%` 来实现字母的循环转换。以下是一个修正后的代码示例:

#include <stdio.h>

int main() {
    char c;
    c = getchar();
    while(c != '\n') {
      if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) {
            c = (c - 'A' + 4) % 26 + 'A';// 对字母进行循环转换
      }
      printf("%c", c);
      c = getchar();
    }
    return 0;
}

在这段代码中,我们读取用户输入的字符,并将其存储在变量 `c` 中。然后,我们通过循环遍历字符串中的每个字符,直到遇到换行符为止。在循环中,我们首先判断字符是否是大写字母或小写字母,如果是,则将其转换为大写字母并进行循环转换。我们使用 `(c - 'A' + 4) % 26 + 'A'` 的表达式来实现循环转换,其中 `(c - 'A' + 4)` 将字母的 ASCII 值转换为相对于 `'A'` 的偏移量,然后使用取模运算符 `%` 将其限制在 0 到 25 的范围内,最后再加上 `'A'`,将其转换回对应的大写字母。最后,我们打印出转换后的结果,并继续读取下一个字符。

希望这次的解答能满足你的需求!如果有任何问题,请随时向我提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

wsb1991abc 发表于 2024-3-19 10:21:08

最后一个读取字符的逻辑是什么

FishC 发表于 2024-3-19 10:21:19

wsb1991abc 发表于 2024-03-19 10:21
最后一个读取字符的逻辑是什么

非常抱歉,我之前的回答有误。在这种情况下,我们不需要在最后再次读取字符,因为我们已经在循环中读取了所有的字符。以下是修正后的代码示例:

#include <stdio.h>

int main() {
    char c;
    c = getchar();
    while (c != '\n') {
      if (c >= 'A' && c <= 'Z') {// 大写字母
            c = (c - 'A' + 4) % 26 + 'A';
      } else if (c >= 'a' && c <= 'z') {// 小写字母
            c = (c - 'a' + 4) % 26 + 'a';
      }
      putchar(c);
      c = getchar();
    }
    return 0;
}

在这段代码中,我们首先读取用户输入的字符,并将其存储在变量 `c` 中。然后,我们通过循环遍历字符串中的每个字符,直到遇到换行符为止。在循环中,我们首先判断字符是否是大写字母或小写字母,如果是,则将其向后移动4个位置(使用取模运算符 `%` 实现循环转换)。然后,我们打印出转换后的结果,并继续读取下一个字符。

注意:这段代码假设输入的字符串只包含字母,并且不对其他字符进行处理。如果输入包含数字、符号等其他字符,你可以根据需要进行适当的处理。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

wsb1991abc 发表于 2024-3-19 13:00:52

第13行不要行不行,为什么

FishC 发表于 2024-3-19 13:06:07

wsb1991abc 发表于 2024-03-19 13:00
第13行不要行不行,为什么

非常抱歉,我之前的回答还是有误。你是正确的,第13行的代码是多余的。由于我们已经在循环中读取了字符并存储在变量c中,所以不需要再次读取字符。以下是修正后的代码示例:#include int main() {    char c;    while ((c = getchar()) != '\n') {      if (c >= 'A' && c = 'a' && c

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

wsb1991abc 发表于 2024-3-19 16:31:58

谢谢你的回答,我把书又看了一遍,看懂了,还是以前的不太熟

FishC 发表于 2024-3-19 16:32:06

wsb1991abc 发表于 2024-03-19 16:31
谢谢你的回答,我把书又看了一遍,看懂了,还是以前的不 ...

不客气,很高兴能帮到你!重新回顾和理解编程概念是非常重要的,有时候也需要多次练习才能掌握。如果你还有任何其他问题,都可以随时向我提问。祝你编程学习顺利!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 译密码,输入一个字符串(在26个字母内),按每个字母向后变为第4个字母的规律转换