古罗马皇帝凯撒在打仗时曾经使用过以下方法加密军事情报:
请编写一个程序,使用上述算法加密或解密用户输入的英文字串要求设计思想、程序流程图、源代码、结果截图。
一、程序设计思想:
(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键之前的所有字符,它是可以得到带空格的字符串的。