20145320《Java程序设计》第一次实验报告
北京电子科技学院(BESTI)实验报告
课程:Java程序设计
班级:1453
指导教师:娄嘉鹏
实验日期:2016.04.08 18:30
实验名称:Java开发环境的熟悉
实验内容:实现凯撒密码,并进行测试
实验代码如下:
package experiment1;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class Experiment1 {
String eStr = new String();// 加密字符串
String dStr = new String();// 解密字符串
public static void main(String[] args) {
System.out.print("请输入密钥:");
Scanner s = new Scanner(System.in);
int key = s.nextInt() % 26; // %26的意义是获取密钥的偏移值
Experiment1 ks = new Experiment1();
ks.E(key);// 加密
ks.D(key);// 解密
}
/**
* 加密 公式
*/
void E(int k) {
try {
System.out.println("请输入一段明文:");
char b[];
BufferedReader br2 = new BufferedReader(new InputStreamReader(System.in));
String str2 = br2.readLine();
b = str2.toCharArray();//字符串转化为字符数组
char ch = ' ';
for (int i = 0; i < str2.length(); i++) {
if (b[i] >= 'a' && b[i] <= 'z') {
ch = (char) ((b[i] - 'a' + k) % 26 + 'a');
}
if(b[i] >= 'A' && b[i] <= 'Z'){
ch =(char) ((b[i] - 'A' + k) % 26 + 'A');
}
eStr.append(ch);// 拼接字符串
}
System.out.println("密文为:"+eStr+" 密匙为:" + k);
} catch (IOException e) {
System.out.println(error.NogetMessage());
}
}
/**
* 解密 公式
*/
void D(int k) {
try{
char b[];
b = eStr.toString().toCharArray();//把里面不是字符串转化为字符串后再转化为字符数组
char ch =' ';//初始化
for (int i = 0; i < eStr.length(); i++) {
if (b[i] >= 'a' && b[i] <= 'z') {
ch = (char)((b[i] - 'a' + 26 - k)% 26 +'a');
}
if(b[i] >= 'A' && b[i] <= 'Z'){
ch=(char)((b[i]-'A'+26-k)%26+'A');
}
dStr.append(ch);// 拼接字符串
}
System.out.println("明文:"+dStr);
}catch (IOException e) {
System.out.println(error.NogetMessage());
}
}
程序的核心算法:
for (int i = 0; i < eStr.length(); i++) {
if (b[i] >= 'a' && b[i] <= 'z') {
ch = (char)((b[i] - 'a' + 26 - k)% 26 +'a');
}
if(b[i] >= 'A' && b[i] <= 'Z'){
ch=(char)((b[i]-'A'+26-k)%26+'A');
}
凯撒密码属于比较简单的密码,其核心算法实现起来比较简单,关键在于ascii码与字符的相互转换。
程序的结果截图:
特殊说明:密钥可以不为3,支持大小写、中间可有空格。
遇到的难题与解决方案:
1.
在c语言中有一个gets()可以让用户直接输入一段字符,我在想java应该也会有这样的方法,然后上网搜索果然有,如下这段就是输入明文的
BufferedReader br2 = new BufferedReader(new InputStreamReader(System.in));
String str2 = br2.readLine();
InputStreamReader(System.in)
方法继承于实例java.io.InputStreamReader
,
关于输入流java.io.InputStreamReader
实例在第十章有介绍。
2.
又一次无意间忘记输入,出现了错误IOException
然后想到第九章刚学的对错误的处理,就使用了try...catch
语句。
3.
与c语言不一样的是,C语言无法直接定义字符串,要想收集字符串需要定义字符数组。但是java可以定义字符串使用String
,但是也遇到一个问题,就是在加密过程中需要一个一个字符加密,不能直接加密字符串。后来通过百度得知语句str2.toCharArray
是把字符串str2转化为字符数组,这样就能加密解密了。
4.
开始原本想用一个字符数组记录加密后的密文,但是不会把字符数组赋给字符串dStr
,后来网上查到一dStr.append(ch)
可以把字符ch
一个个接到dStr
中,很方便。
感想与总结:
对比于C语言,java确实非常好用,他的许多方法都十分方便。但是有很多方法都不太懂,所以花费在百度上的时间比较多。