鱼C论坛

 找回密码
 立即注册
查看: 2866|回复: 10

[已解决]要求:用户输入一行明文(字符串),针对字母进行加密(偏移量设置为 3),非字母...

[复制链接]
发表于 2022-9-5 23:40:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>  //感觉逻辑是没有什么问题,但是输出结果为方框;

int main() { 微信截图_20220905234013.png
        int ch;
        printf("请输入明文:");
        while ((ch = getchar()) != '\n') {
                if (ch >= 'A' && ch <= 'Z') {
                        if (ch = ch + 3 > 'Z' && ch + 3 <= 'a') {
                                ch = ch - 'Z' + 'A';
                                putchar(ch);
                        } else {
                                ch = ch + 3;
                                putchar(ch);
                        }
                } else if (ch >= 'a' && ch <= 'z') {
                        if (ch = ch + 3 > 'z') {
                                ch = ch - 'z' + 'a';
                                putchar(ch);
                        } else {
                                ch = ch + 3;
                                putchar(ch);
                        }
                } else {
                        putchar(ch);
                }
        }
        return 0;
}
最佳答案
2022-9-6 00:26:03
本帖最后由 额外减小 于 2022-9-6 00:30 编辑

知道了
你没有考虑运算符的优先级
赋值号的优先级应该是要小于“小于号”的
所以就着你的代码改成这样
  1. #include <stdio.h>
  2. int main()
  3. {
  4.         int ch;
  5.         printf("请输入明文:");
  6.         while ((ch = getchar()) != '\n') {
  7.                 if (ch >= 'A' && ch <= 'Z') {
  8.                         if ((ch = ch + 3 )> 'Z') {//原本这行你有个笔误,我帮你删掉了
  9.                                 ch = ch - 'Z' + 'A';
  10.                                 putchar(ch);
  11.                         } else {
  12. //去掉这行   (重复加了2个3)                            ch = ch + 3;
  13.                                 putchar(ch);
  14.                         }
  15.                 } else if (ch >= 'a' && ch <= 'z') {
  16.                         if ((ch = ch + 3 )> 'z') {
  17.                                 ch = ch - 'z' + 'a';
  18.                                 putchar(ch);
  19.                         } else {
  20. //       这行去掉                        ch = ch + 3;
  21.                                 putchar(ch);
  22.                         }
  23.                 } else {
  24.                         putchar(ch);
  25.                 }
  26.         }
  27.         return 0;
  28. }
复制代码
(只是微调了几个地方)

我可能要去睡觉了,以后可能没法回复
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-9-6 00:01:19 | 显示全部楼层
  1. #include <stdio.h>

  2. int main() {
  3.     int ch;
  4.     printf("请输入明文:");
  5.     while ((ch = getchar()) != '\n') {
  6.         if (ch >= 'a' && ch <= 'z'-3)
  7.                 {
  8.                 ch = ch + 3;
  9.                 } else if (ch >= 'A' && ch <= 'Z'-3)
  10.                 {
  11.                         ch = ch + 3;
  12.                 } else if (ch > 'Z'-3 && ch <= 'Z')
  13.                 {
  14.                         ch = 'A' + 3 - ('Z' - ch) - 1;
  15.                 } else if (ch > 'z'-3 && ch <= 'z')
  16.                 {
  17.                         ch = 'a' + 3 - ('z' - ch) - 1;
  18.                 }
  19.                 putchar(ch);
  20.     }
  21.     return 0;
  22. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-6 00:14:51 | 显示全部楼层

我的写的是有啥问题嘛;我感觉逻辑是对的;但是实际结果不对
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-6 00:16:34 | 显示全部楼层
本帖最后由 临时号 于 2022-9-6 00:17 编辑
阿亮不减肥 发表于 2022-9-6 00:14
我的写的是有啥问题嘛;我感觉逻辑是对的;但是实际结果不对


可以说问题还是很大的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-6 00:21:44 | 显示全部楼层
临时号 发表于 2022-9-6 00:16
可以说问题还是很大的

#include <stdio.h>// if里面是不是不能再用if了

int main() {
        int ch;
        printf("请输入明文:");
        while ((ch = getchar()) != '\n') {
                if (ch >= 'A' && ch <= 'Z') {
                        if (ch > 'Z' - 3 ) {
                                ch = ch - 'Z' + 'A' + 3;
                        } else {
                                ch = ch + 3;
                        }
                } else if (ch >= 'a' && ch <= 'z') {
                        if (ch >= 'z' - 3) {
                                ch = ch - 'z' + 'a' + 3;
                                putchar(ch);
                        } else {
                                ch = ch + 3;
                                putchar(ch);
                        }
                } else {
                        putchar(ch);
                }
        }
//        while ((ch = getchar()) != '\n') {
//                putchar(ch);

        return 0;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-6 00:25:30 | 显示全部楼层
阿亮不减肥 发表于 2022-9-6 00:21
#include // if里面是不是不能再用if了

int main() {

改完了
  1. #include <stdio.h>  //感觉逻辑是没有什么问题,但是输出结果为方框;

  2. int main() {
  3.         int ch;
  4.         printf("请输入明文:");
  5.         while ((ch = getchar()) != '\n') {
  6.             if (ch >= 'A' && ch <= 'Z') {
  7.                 if (ch + 3 > 'Z' && ch + 3 <= 'a') {
  8.                     ch = ch + 3 - 'Z' + 'A' - 1;
  9.                     putchar(ch);
  10.                 } else {
  11.                     ch = ch + 3;
  12.                     putchar(ch);
  13.                 }
  14.             } else if (ch >= 'a' && ch <= 'z') {
  15.                 if (ch + 3 > 'z') {
  16.                     ch = ch + 3 - 'z' + 'a' - 1;
  17.                     putchar(ch);
  18.                 } else {
  19.                     ch = ch + 3;
  20.                     putchar(ch);
  21.                 }
  22.             } else {
  23.                 putchar(ch);
  24.             }
  25.         }
  26.             return 0;
  27. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-6 00:26:03 | 显示全部楼层    本楼为最佳答案   
本帖最后由 额外减小 于 2022-9-6 00:30 编辑

知道了
你没有考虑运算符的优先级
赋值号的优先级应该是要小于“小于号”的
所以就着你的代码改成这样
  1. #include <stdio.h>
  2. int main()
  3. {
  4.         int ch;
  5.         printf("请输入明文:");
  6.         while ((ch = getchar()) != '\n') {
  7.                 if (ch >= 'A' && ch <= 'Z') {
  8.                         if ((ch = ch + 3 )> 'Z') {//原本这行你有个笔误,我帮你删掉了
  9.                                 ch = ch - 'Z' + 'A';
  10.                                 putchar(ch);
  11.                         } else {
  12. //去掉这行   (重复加了2个3)                            ch = ch + 3;
  13.                                 putchar(ch);
  14.                         }
  15.                 } else if (ch >= 'a' && ch <= 'z') {
  16.                         if ((ch = ch + 3 )> 'z') {
  17.                                 ch = ch - 'z' + 'a';
  18.                                 putchar(ch);
  19.                         } else {
  20. //       这行去掉                        ch = ch + 3;
  21.                                 putchar(ch);
  22.                         }
  23.                 } else {
  24.                         putchar(ch);
  25.                 }
  26.         }
  27.         return 0;
  28. }
复制代码
(只是微调了几个地方)

我可能要去睡觉了,以后可能没法回复
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-6 00:43:28 | 显示全部楼层

谢谢,大佬,明白哪里错误了!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-6 00:44:05 | 显示全部楼层
额外减小 发表于 2022-9-6 00:26
知道了
你没有考虑运算符的优先级
赋值号的优先级应该是要小于“小于号”的

谢谢大佬,明白哪里错了,主要是优先级哪里有问题,已解决;
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-6 10:41:40 | 显示全部楼层
本帖最后由 jackz007 于 2022-9-6 10:44 编辑

        凯撒密码而已,算法很简单
  1. #include <stdio.h>

  2. char crypt(char ch , int e)
  3. {
  4.         char b                                                   ;
  5.         if(ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z') {
  6.                 b = (ch >= 'a' && ch <= 'z') ? 'a' : 'A'         ;
  7.                 ch = b + (26 + ch - b + e) % 26                  ;
  8.         }
  9.         return ch                                                ;
  10. }

  11. int main(void)
  12. {  
  13.         char ch                                                  ;
  14.         int e = 3                                                ;
  15.         printf("请输入明文:")                                   ;
  16.         while ((ch = getchar()) != '\n') putchar(crypt(ch , e))  ;
  17.         printf("\n")                                             ;
  18.         printf("请输入密文:")                                   ;
  19.         while ((ch = getchar()) != '\n') putchar(crypt(ch , -e)) ;
  20.         printf("\n")                                             ;
  21. }
复制代码

        编译、运行实况:
  1. D:\[00.Exerciese.2022]\C>g++ -o x x.c

  2. D:\[00.Exerciese.2022]\C>x
  3. 请输入明文:Hello,World!
  4. Khoor,Zruog!
  5. 请输入密文:Khoor,Zruog!
  6. Hello,World!

  7. D:\[00.Exerciese.2022]\C>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-6 14:29:06 | 显示全部楼层
jackz007 发表于 2022-9-6 10:41
凯撒密码而已,算法很简单

        编译、运行实况:

666
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-13 13:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表