20165318 《Java程序设计》实验一(Java开发环境的熟悉)实验报告
20165318 《Java程序设计》实验一(Java开发环境的熟悉)实验报告
一、实验报告封面
课程:Java程序设计 班级:1653班 姓名:孙晓暄 学号:20165318
指导教师:娄嘉鹏 实验日期:2018年4月2日
实验时间:13:45 - 3:25 实验序号:实验一
实验名称:Java开发环境的熟悉
实验题目:实现凯撒密码并进行安全加固,并进行测试(正常情况,异常情况,边界情况)
实验内容:
1.使用JDK编译、运行简单的Java程序;
2.使用IDEA 编辑、编译、运行、调试Java程序。
实验要求:
1.没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程;
2.完成实验、撰写实验报告,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等);
3.实验报告中统计自己的PSP(Personal Software Process)时间;
4.严禁抄袭。
二、实验内容及步骤
(一)使用JDK编译、运行简单的java程序
- 命令行下的程序开发
步骤一(新建文件夹):打开windows下的git bash → 输入cd java命令进入java目录 → 输入mkdir 20165318test建立以自己学号命名的文件夹 → 输入cd 20165318test进入文件夹 → 输入mkdir exp1建立“实验一”文件夹 → 输入cd exp1进入“实验一”文件夹 → 输入mkdir src,mkdir bin,建立src和bin文件夹。

步骤二(编译、运行java程序):使用git bash中的vim编辑器编辑java程序 → 在命令行下编译、运行



(二)使用IDEA编辑、编译、运行、调试Java程序
1、新建「HelloJDB」类,输入如下代码:

2、运行「HelloJDB」,单击运行按钮(或使用Alt+Shift+F10快捷键)

3、设置断点,单步运行。
在需要设置断点的一行左侧单击鼠标,出现红色圆点。比如如下在第七行设置了断点:

在上方Run菜单找到Debug...进行单步调试(或使用Alt+Shift+F9快捷键):

运行到第七行截止,结果如下:

继续向下单步执行可使用Step Into(快捷键F7)和Step Over(快捷键F8)

① Step Over(F8):程序向下执行一行(如果当前行有方法调用,这个方法将被执行完毕返回,然后到下一行)
② Step Into(F7):程序向下执行一行。如果该行有自定义方法,则运行进入自定义方法(不会进入官方类库的方法)
③ Force Step Into:进入任何方法
④ Step Out(Shift+F8):如果在调试的时候进入了一个方法,并觉得该方法没有问题,就可以使用stepout跳出该方法,返回到该方法被调用处的下一行语句。值得注意的是,该方法已执行完毕。
⑤ Run to Cursor:将程序运行到光标处。
可使用Resume(快捷键F9)直接运行完毕,如下图:

4、条件断点
如果想查看大循环中出现的问题,可以通过条件断点来解决。如下图所示设置条件断点,使用Resume(快捷键F9)从上一个断点直接运行到此条件断点。

(三)练习:实现凯撒密码并进行安全加固,并进行测试(正常情况,异常情况,边界情况)
『要求』:通过命令行和IDEA两种方式实现,在IDEA下练习调试程序。
1、设计思路
我们知道凯撒密码是一种代换密码。他的基本思想是:通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。位数就是凯撒密码加密和解密的密钥。
我要实现使用凯撒密码在不同密钥下对明文,进行加密;或对密文进行解密。
2、代码撰写
shiyan1.java
/**
* Created by SXX on 2018/3/31
*/
import java.io.*;
import java.util.Scanner;
public class shiyan1 {
public static void main(String[] args) {
EncryptAndDecrypt person = new EncryptAndDecrypt();
System.out.print("请选择加密还是解密:(加密输入1,解密输入2)");
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
if (n == 1) {
System.out.print("请输入明文:");
Scanner scanner1 = new Scanner(System.in);
String m = scanner1.nextLine();
System.out.print("请输入密钥:");
Scanner scanner2 = new Scanner(System.in);
int k = scanner2.nextInt();
try {
String serct = person.encrypt(m, k);
System.out.println("密文是:" + serct);
}
catch (EadException e){
System.out.println(e.warnMess());
}
} else {
System.out.print("请输入密文:");
Scanner scanner1 = new Scanner(System.in);
String m = scanner1.nextLine();
System.out.print("请输入密钥:");
Scanner scanner2 = new Scanner(System.in);
int k = scanner2.nextInt();
try {
String source = person.decrypt(m, k);
System.out.print("明文是:" + source);
}
catch (EadException e){
System.out.println(e.warnMess());
}
}
}
}
EncryptAndDecrypt.java //凯撒密码
public class EncryptAndDecrypt {
String encrypt(String sourceString, int password) throws EadException{ //加密算法
char[] c = sourceString.toCharArray();
int m = c.length;
for (int i = 0; i < m; i++) {
if(c[i]>122||c[i]<65||(c[i]>90&&c[i]<97)){
throw new EadException(sourceString);
}
int mima = (c[i] - 'a' + password) % 26 + 'a'; //加密
c[i] = (char) mima;
}
return new String(c); //返回密文
}
String decrypt(String sourceString, int password) throws EadException{ //解密算法
char[] c = sourceString.toCharArray();
int m = c.length;
for (int i = 0; i < m; i++) {
if(c[i]>122||c[i]<65||(c[i]>90&&c[i]<97)){
throw new EadException(sourceString);
}
int n = c[i] - 'a' - password;
if (n <= 0) {
n = n + 26;
}
int mima = n % 26 + 'a'; //解密
c[i] = (char) mima;
}
return new String(c); //返回明文
}
}
EadException.java //自定义异常类
public class EadException extends Exception{
String message;
public EadException(String sourceString){
message = "所输入的字符不符合要求";
}
public String warnMess(){
return message;
}
}
3、运行结果
命令行实现:
- 正常情况

- 边界情况


- 异常情况

IDEA调试:
- 正常情况

- 边界情况


- 异常情况



三、实验过程中遇到的问题
- 问题1:当输入字母处于临界值时,不能正常字母,出现异常字符,如下图:

解决过程:使用终端计算后发现,解密时,当字母对应ASCII码取余26,如果是负数,就会输出异常字符,在程序中添加
if语句,负数是加上26,就可以解决了。问题2:在使用异常类时,我本来想直接使用
IOException异常类,但是程序报错。解决过程:在查阅Scanner类会出现的异常时发现,
IOException异常类用于,参数有流的情况下,而我的代码中没有使用流。因此我自己定义了一个异常类,问题得以解决。
四、实验体会与总结
“纸上得来终觉浅,绝知此事要躬行。”书上的代码敲的有3000多行了,真正掌握了书上多少知识点我并不清楚。“实践是检验真理的唯一标准。”实验使我将理论用于实际,对课本知识有了更深的理解。
刚开始看到这个题目的时候,感觉不是很难,但仔细分析之后发现,要真正完整的实现凯撒密码,考虑到尽可能多的情况并不容易,我最初只是进行了一个大致的设计,然后就开始上手编代码,其中遇到很多没有想到的情况,就要打断原来的思路,甚至颠覆之前的想法,这使我编写代码的效率大大降低。因此,敲代码前先构思好整体的框架,尽可能多的想会出现的问题及解决方法,在再编写时用细节一点一点的填充。
之前看书时,我不太理解为什么要将不同的类分开,觉得这样查看起来很麻烦。但这次实验使我感觉到编写时将不同的类分开的好处。最初的代码,我将两个大类都放在一起,出现问题时,要一直上下翻看对比,在自定义异常类时,我将所有的类都分开了,一目了然,运行出现问题时,也比较好查看。
这个代码算是我真正自己编写的代码,编完之后,一股成就感油然而生。这次实验不仅使我更加深入的理解了教材上的知识点,而且锻炼了我的思考能力,让我意识到拥有正确的编程思想的重要性。
码云链接:
代码上传截图:

| 步骤 | 耗时 | 百分比 |
|---|---|---|
| 需求分析 | 4min | 4% |
| 设计 | 5min | 5% |
| 代码实现 | 60min | 64% |
| 测试 | 4min | 5% |
| 分析总结 | 20min | 22% |
20165318 《Java程序设计》实验一(Java开发环境的熟悉)实验报告的更多相关文章
- 20145308刘昊阳 《Java程序设计》实验一 Java开发环境的熟悉 实验报告
20145308刘昊阳 <Java程序设计>实验一报告 实验名称 Java开发环境的熟悉 实验内容 使用JDK编译.运行简单的Java程序 2.使用Eclipse 编辑.编译.运行.调试J ...
- 20175316 盛茂淞 2018-2019-2 《Java程序设计》实验一 Java开发环境的熟悉 实验报告
20175316 盛茂淞 2018-2019-2 <Java程序设计>实验一 Java开发环境的熟悉 实验报告 一.实验要求 1.使用JDK编译.运行简单的Java程序: 2.使用IDEA ...
- 20165327《Java程序设计》实验一 Java开发环境的熟悉 实验报告
20165327<Java程序设计>实验二 <Java面向对象程序设计>实验报告 实验二 <Java面向对象程序设计> 一.实验报告封面 课程:Java程序设计 班 ...
- 20165205 实验一 java开发环境的熟悉 实验报告
20165205 实验一 Java开发环境的熟悉 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:刘喆君 学号:20165205 指导教师:娄嘉鹏 实验日期:2018年4月2日 实验 ...
- 实验一《开发环境的熟悉》&实验二《固件设计》
20145312&20145338 实验一<开发环境的熟悉>&实验二<固件设计> 合作博客链接:http://www.cnblogs.com/yx2014531 ...
- 20162327实验一Java开发环境的熟悉实验报告
20162327 <程序设计与数据结构>第一次实验报告 基础知识 1.JDB的使用 使用JDB调试程序需要以下五个步骤: 1.设置断点 stop in 2.run 3.print 4.ne ...
- 20145233韩昊辰 《Java程序设计》实验报告一:Java开发环境的熟悉(Windows+IDEA)
20145233 <Java程序设计>实验报告一:Java开发环境的熟悉 实验要求 使用JDK编译.运行简单的Java程序: 使用IDEA 编辑.编译.运行.调试Java程序. 实验内容 ...
- 20175236 《Java程序设计》实验一(Java开发环境的熟悉)实验报告
一.实验报告封面 课程:Java程序设计 班级:1752班 姓名:温丰帆 学号:20175236 指导教师:娄嘉鹏 实验日期:2019年4月2日 实验时间:13:45 - 15:25 实验序号:实验一 ...
- 20165234 《Java程序设计》实验一 Java开发环境的熟悉
一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:刘津甫 学号:20165234 指导教师:娄嘉鹏 实验日期:2018年4月2日 实验时间:15:35 - 17:15 实验序 ...
随机推荐
- [javaSE] 变量的传值与传址
变量:就是将不确定的数据进行存储.也就是需要在内存中开辟一个空间 这个空间需要一个名称,这个名称就是变量名 基本数据类型:byte,short,int,long,double,float,char,b ...
- SpringBoot(一)初遇
环境: IDEA 2018.1.3 , jdk 1.8 , maven 3.3.9 零 第一次接触springboot, 如何学习比较困惑, 思前想后最后决定从文档来学习, 以下为学习中的参考资料: ...
- 深入理解java虚拟机---java内存区域与内存溢出异常---1内存结构
本文来源于翁舒航的博客,点击即可跳转原文观看!!!(被转载或者拷贝走的内容可能缺失图片.视频等原文的内容) 若网站将链接屏蔽,可直接拷贝原文链接到地址栏跳转观看,原文链接:https://www.cn ...
- Supervisord安装和配置
http://zhangweide.cn/archive/2013/supervisor-note.html Supervisord supervisord的出现,结束了我这苦恼的问题,它可以帮你守护 ...
- 基于 vue+element ui 的cdn网站(多页面,都是各种demo)
前言:这个网站持续更新中...,有网上预览,github上也有源码,喜欢记得star哦,欢迎留言讨论. 网站地址:我的个人vue+element ui demo网站 github地址:yuleGH g ...
- java单例模式的心得
由于设计模式对于java高级开发人员来说是非常重要的,网上也有很多关于设计模式的文章,博客等.所以,首先我对相对简单的单例模式做一个简单的总结. 一.实现方式 单例模式的实现方式有3种,分别是饿汉式, ...
- python学习之老男孩python全栈第九期_数据库day004知识点总结 —— MySQL数据库day4
复习: 1. MySQL:文件管理的软件 2. 三部分: - 服务端 - SQL语句 - 客户端 3. 客户端: - MySQL - navicat 4. 授权操作: - 用户操作 - 授权操作 5. ...
- nginx正确服务react-router应用
如今React应用普遍使用react-router作为路由管理,在开发端webpack自带的express服务器下运行和测试表现均正常,部署到线上的nginx服务器后,还需要对该应用在nginx的配置 ...
- Codeforces 750 F:New Year and Finding Roots
传送门 首先如果一开始就找到了一个叶子,那么暴力去递归找它的父亲,每次随机一个方向(除了已知的儿子)走深度次,如果走到了一个叶子就不是这个方向 (设根的深度为 \(1\))这样子最后到达深度为 \(3 ...
- java多线程3种方式
Java多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...