2018-2019-2 20175209 实验一《Java开发环境的熟悉》实验报告

一、实验内容及步骤

1.使用JDK编译、运行简单的Java程序

  • cd 20175209进入20175209文件夹
  • mkdir 20175209exp1建立20175209文件夹
  • 分别使用mkidr srcmkdir 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中调试部分的掌握是非常有必要的,包括哪些快捷键,在调试比较复杂的代码时可以节省大量的时间
  • 本次实验非常综合,我的题目对我来说难度也不小,需要反复的修改,尤其是其中还会涉及到少量暂时没有学到的东西,老师建议我们结对学习我认为也是十分必要的,在关键时候互相讨论可能会有更简单的方法解决,而不是花费大量时间去网上现场学习
  • 通过本次实验也发现了自己在编写程序之前对于程序框架的构造还不够全面,对于其中部分问题的操作方法也没有合理的考虑,因此在写程序时总会出现一些可以被避免的错误,这些也需要在写其他程序时多加练习

2018-2019-2 20175209 实验一《Java开发环境的熟悉》实验报告的更多相关文章

  1. 20145308刘昊阳 《Java程序设计》实验一 Java开发环境的熟悉 实验报告

    20145308刘昊阳 <Java程序设计>实验一报告 实验名称 Java开发环境的熟悉 实验内容 使用JDK编译.运行简单的Java程序 2.使用Eclipse 编辑.编译.运行.调试J ...

  2. 20175316 盛茂淞 2018-2019-2 《Java程序设计》实验一 Java开发环境的熟悉 实验报告

    20175316 盛茂淞 2018-2019-2 <Java程序设计>实验一 Java开发环境的熟悉 实验报告 一.实验要求 1.使用JDK编译.运行简单的Java程序: 2.使用IDEA ...

  3. 20165327《Java程序设计》实验一 Java开发环境的熟悉 实验报告

    20165327<Java程序设计>实验二 <Java面向对象程序设计>实验报告 实验二 <Java面向对象程序设计> 一.实验报告封面 课程:Java程序设计 班 ...

  4. 20165205 实验一 java开发环境的熟悉 实验报告

    20165205 实验一 Java开发环境的熟悉 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:刘喆君 学号:20165205 指导教师:娄嘉鹏 实验日期:2018年4月2日 实验 ...

  5. 20162327实验一Java开发环境的熟悉实验报告

    20162327 <程序设计与数据结构>第一次实验报告 基础知识 1.JDB的使用 使用JDB调试程序需要以下五个步骤: 1.设置断点 stop in 2.run 3.print 4.ne ...

  6. 实验一Java开发环境的熟悉

    实验一Java开发环境的熟悉 实验内容 •命令行下Java程序开发 •IDEA下Java程序开发.调试 •练习(通过命令行和Eclipse两种方式实现,在Eclipse下练习调试程序) •实现凯撒密码 ...

  7. 20175316 盛茂淞 实验一 Java开发环境的熟悉

    20175316 盛茂淞 实验一 Java开发环境的熟悉 实验目的 使用JDK编译.运行简单的Java程序 实验要求 1.建立"自己学号exp1"的目录 2.在"自己学号 ...

  8. 20155327实验一 Java开发环境的熟悉

    20155327实验一 Java开发环境的熟悉 实验内容 1.使用JDK编译.运行简单的java程序 2.使用IDEA编辑.编译.运行.调试java程序 实验步骤 1.使用JDK编译.运行简单的jav ...

  9. 20165233 实验一 Java开发环境的熟悉

    20165233 实验一 Java开发环境的熟悉 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程: 2.完成实验.撰写实验 ...

  10. 20155231 java实验一 Java开发环境的熟悉

    20155231 java实验一 Java开发环境的熟悉 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程: 完成实验.撰写实验 ...

随机推荐

  1. Win7 64位下安装64bit MS SQL Server2005时安装不了Reporting Services的处理办法

    警告截图: 解决办法: 在cmd窗口运行如下脚本即可: "cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/A ...

  2. 关于tomcat 配置时一闪而过的问题

    TOMCAT JAVA_HOME or JRE_HOME environment variable is not defined correctly 按照教程已经安装了JDK并设置好了JAVA_HOM ...

  3. JPA之@Transient

    java 的transient关键字的作用是需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中. 使用示例: ...

  4. SQLServer查询计划

    参考:http://blog.csdn.net/luoyanqing119/article/details/17022649 1. 开启方式 菜单栏:query---Display Estimated ...

  5. C#深度学习の接口传参(interface)-----接口的妙用

    一.接口可以干嘛 我们知道,接口的本质是一个约束规范,委托是方法纵向(形式上)的封装,接口是不同方法横向(广度)的封装 接口中不能有变量,但是可以有属性方法.常见的,我们可以用接口: 1.实现需求方的 ...

  6. [转]C#通过委托更新UI(异步加载)

    我们在使用 windowform 编程的时候,我们或许可能会越到,各种在窗体加载的时候,会进行其他的操作: 1.如果是在加载之前进行其它操作,则整个界面出来的很慢,而且若是时间长的话,页面很久才能出来 ...

  7. iOS开发基础-九宫格坐标(4)

    对iOS开发基础-九宫格坐标(3)的代码进行进一步优化. 新建一个 UIView 的子类,并命名为 WJQAppView ,将 appxib.xib 中的 UIView 对象与新建的视图类进行关联. ...

  8. LightGBM大战XGBoost,谁将夺得桂冠?

    引 言 如果你是一个机器学习社区的活跃成员,你一定知道 提升机器(Boosting Machine)以及它们的能力.提升机器从AdaBoost发展到目前最流行的XGBoost.XGBoost实际上已经 ...

  9. 基于 HTML5 的工业互联网云平台监控机房 U 位

    前言 机柜 U 位管理是一项突破性创新技术--继承了 RFID 标签(电子标签)的优点的同时,完全解决了 RFID 技术(非接触式的自动识别技术)在机房 U 位资产监控场应用景中的四大缺陷,采用工业互 ...

  10. spring Jackson 配置笔记

    配置代码 // 设置输出时包含属性的风格 this.findAndRegisterModules(); this.setSerializationInclusion(JsonInclude.Inclu ...