凯撒解密:中英文实现方法

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

 

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

 

一、程序设计思想:

(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.加密\t2.解密\t");

           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("是否想继续翻译?\n1.继续\t2.按任意键退出!");

           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键之前的所有字符,它是可以得到带空格的字符串的。

 

posted @ 2017-10-26 21:53  Someday&Li  阅读(706)  评论(0编辑  收藏  举报