2018-2019-2 20175209 实验一《Java开发环境的熟悉》实验报告
一、实验内容及步骤
1.使用JDK编译、运行简单的Java程序
cd 20175209
进入20175209文件夹mkdir 20175209exp1
建立20175209文件夹- 分别使用
mkidr src
和mkdir bin
建立src和bin目录 - 通过
vim src/Hello.java
编写Hello.java javac -d bin src/Hello.java
编译代码cd bin
java wzh.Hello
运行代码
实验截图:
2.使用IDEA调试Java程序
调试代码这一部分按照博客链接http://www.cnblogs.com/rocedu/p/4421202.html完成即可,注意的是博客中讲的IDEA的快捷键有些电脑可能无法使用(比如我),如果出现这种情况,在使用快捷键的同时还需要按“Fn”键即可利用快捷键操作。
调试截图:
3.练习
题目1. 实现凯撒密码并进行安全加固,并进行测试(正常情况,异常情况,边界情况)。
实验程序:
import java.io.*;
import java.util.*;
public class shiyan1 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int a;
System.out.println("凯撒密码计算");
do{
System.out.println("1.加密 2.解密");//要执行的操作
System.out.println("请输入要执行的操作");
int n = in.nextInt();
if(n == 1) {
try {
EncryptAndDecrypt person = new EncryptAndDecrypt();
System.out.println("明文:");
Scanner scan = new Scanner(System.in);
String sourceString = scan.next();
System.out.println("密钥:");
Scanner scanner = new Scanner(System.in);
int password = scanner.nextInt();
String secret = person.encrypt(sourceString, password);
System.out.println("密文:" + secret);
}
catch(EncryptAndDecryptException e) {
System.out.println("Warning:");
System.out.println(e.warnMess());
}
}
else if(n == 2) {
try {
EncryptAndDecrypt person = new EncryptAndDecrypt();
System.out.println("密文:");
Scanner scan = new Scanner(System.in);
String sourceString = scan.next();
System.out.println("密钥:");
Scanner scanner = new Scanner(System.in);
int password = scanner.nextInt();
String source = person.decrypt(sourceString,password);
System.out.println("明文:"+source);
}
catch(EncryptAndDecryptException e) {
System.out.println("Warning:");
System.out.println(e.warnMess());
}
}
System.out.println("输入1继续,输入0结束:");
a = in.nextInt();
}while(a==1);
}
}
class EncryptAndDecrypt {
String encrypt(String sourceString,int password) throws EncryptAndDecryptException { //加密算法
char [] c = sourceString.toCharArray();
int m = c.length;
for(int k=0;k<m;k++){
if((c[k]>=65&&c[k]<=90)||(c[k]>=97&&c[k]<=122)){
int mima=(c[k] -'a' + password) % 26 + 'a'; //加密,同时转码
c[k]=(char)mima;
}
else {
throw new EncryptAndDecryptException(sourceString);
}
}
return new String(c); //返回密文
}
String decrypt(String sourceString,int password) throws EncryptAndDecryptException { //解密算法
char [] c = sourceString.toCharArray();
int m = c.length;
for(int k=0;k<m;k++){
if((c[k]>=65&&c[k]<=90)||(c[k]>=97&&c[k]<=122)){
int mima=((c[k] + 26) -'a' - password) % 26 + 'a'; //解密,同时转码
c[k]=(char)mima;
}
else {
throw new EncryptAndDecryptException(sourceString);
}
}
return new String(c); //返回明文
}
}
class EncryptAndDecryptException extends Exception {
String message;
public EncryptAndDecryptException(String sourceString) {
message="输入错误!";
}
public String warnMess() {
return message;
}
}
运行结果:
二、实验中遇到的问题
1.首先在写移位环节的代码时,只考虑到ASCII码表的转换差值,没有将所得的结果mod26运算导致运行时出现错误(这里由于当时程序时忘记了截图,现在写好的程序已经看不到这个问题了,所以只有改好的截图),正确方法是应该在进行完差值运算后要将结果mod26再加上'a'的值
2.在明密文转换时开始总是运行失败,自己一直找不到原因,在网上进行相关查找发现自己输入是以字符串String形式输入的,而在进行转换时需要一位一位转换,因此需要char [] c = sourceString.toCharArray();
语句将其放进数组中进行按位比较
3.在程序写好测试边界时,发现程序每次只能完成一组操作,这样测试起来会非常麻烦,因此我在程序之中加上了一个do--while 循环,由操作者确定执行操作的次数,这时用到了一个变量来控制程序的进行和停止,这里要注意的是,这个变量虽然要在循环内部输入,但定义时一定要在循环外部定义,否则会提示出现错误。
三、实验心得体会:
- 本次练习的题目为凯撒密码,大致看了一下几个题目,感觉这个题目的难度相对偏高,利用现有的知识编写可能相对困难,在编写EncryptAndDecrypt类是需要用到关键字throws、throw还有try-catch 语句,这些内容暂时还没有学到,所以在写题目的时候比较吃力,因此上网寻找了一些简单的代码并参考了相关程序,参考连接https://blog.csdn.net/lbllol365/article/details/78822123和https://blog.csdn.net/qq_40956679/article/details/80896922
- 对于IDEA中调试部分的掌握是非常有必要的,包括哪些快捷键,在调试比较复杂的代码时可以节省大量的时间
- 本次实验非常综合,我的题目对我来说难度也不小,需要反复的修改,尤其是其中还会涉及到少量暂时没有学到的东西,老师建议我们结对学习我认为也是十分必要的,在关键时候互相讨论可能会有更简单的方法解决,而不是花费大量时间去网上现场学习
- 通过本次实验也发现了自己在编写程序之前对于程序框架的构造还不够全面,对于其中部分问题的操作方法也没有合理的考虑,因此在写程序时总会出现一些可以被避免的错误,这些也需要在写其他程序时多加练习