zoukankan      html  css  js  c++  java
  • 凯撒解密:中英文实现方法

    古罗马皇帝凯撒在打仗时曾经使用过以下方法加密军事情报:

    请编写一个程序,使用上述算法加密或解密用户输入的英文字串要求设计思想、程序流程图、源代码、结果截图。

    一、程序设计思想:

    (1)定义全局字符串变量deciphering(解密)、encryption(加密)以方便在输出时对其进行调用。

    (2)先使用buffer对输入一大段的字符串进行存放。

    (3)使用operation(String  str,int k)对其进行操作。其中涉及一个比较懊恼的问题就是,如何区分标点、空格和换算过后超出26个字母的内容,虽然在明文翻译成密文不存在问题,但是反编译时会造成无法翻译或者不正确。

    于是我采用了将标点+空格作为一类,保持不变;其余的均做加密/解密操作。实现如下,支持中英文加密和解密。

    二、程序流程图:

     

    三、源程序:

     

    import java.util.Scanner;

     

    public class CaeserCipher {

     

        public void operation(String str,int k,int judge) {

            char cur[]=new char[str.length()];//设置当前数组

            char pre[]=str.toCharArray();

            int i=0;

            for(;i<str.length();i++) {

               pre[i]=str.charAt(i);

                if(pre[i]==' '||pre[i]==','||pre[i]=='.'||pre[i]=='!') {

                   cur[i]=pre[i];

               }

               else cur[i]=(char)(pre[i]+k);//翻译成明文时存在超出26个字母

            }

            System.out.println("翻译后的内容为 :");

            for(i=0;i<cur.length;i++) {

               System.out.print(cur[i]);

            }

            System.out.println();

        }

     

        public static void main(String[] args)  {

           // TODO Auto-generated method stub

           int k=3;//k用来设置移动字符,默认k=3

           String str=new String();

           Scanner in=new Scanner(System.in);

           CaeserCipher c=new CaeserCipher();

           boolean flag=true;

           while(flag) {

               System.out.println("输入你想执行的操作:1.加密 2.解密 ");

               int select=in.nextInt();

               str=in.nextLine();//接收输入数字时的空格符

               if(select==1) {

                  System.out.println("输入你想加密的内容:");

                  str=in.nextLine();

               }

               else if(select==2) {

                  System.out.println("输入你想解密的内容:");

                  str=in.nextLine();

               }

               else {

                  System.out.println("输入错误!");

               }

              

               System.out.println("输入凯撒密钥:");

               k=in.nextInt()%26;

               if(select==2) {

                  k=-(k%26);

               }

               c.operation(str, k,select);

               System.out.println("是否想继续翻译? 1.继续 2.按任意键退出!");

               int cc=in.nextInt();

               if(cc!=1) flag=false;

        }

          

          

     

        }

     

    }

    四、实现结果截图:

     

     

     

    五、实验总结:

    本次的实验极大地增强了自信心,因为终于花了大量时间做出来一个可以支持中英文的程序了,感动死自己。

    知识总结:

    String.next()与String.nextLine()区别:

    next()一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键、Tab键或Enter键等结束符,next()方法会自动将其去掉,只有在输入有效字符之后,next()方法才将其后输入的空格键、Tab键或Enter键等视为分隔符或结束符。简单地说,next()查找并返回来自此扫描器的下一个完整标记。完整标记的前后是与分隔模式匹配的输入信息,所以next方法不能得到带空格的字符串而nextLine()方法的结束符只是Enter键,即nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。

  • 相关阅读:
    【提高测试】飘雪圣域(树状数组)
    【BZOJ2820】YY的GCD(莫比乌斯反演)
    【BZOJ2301】【HAOI2011】—Problem b(莫比乌斯反演)
    【POJ2318】—TOYS(计算几何)
    React-状态提升
    React-表单
    React-条件渲染
    React-列表 & Key
    React-HelloWorld
    MongoDB中的读写锁
  • 原文地址:https://www.cnblogs.com/somedayLi/p/7739691.html
Copyright © 2011-2022 走看看