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多行了,真正掌握了書上多少知識點我並不清楚。“實踐是檢驗真理的唯一標准。”實驗使我將理論用於實際,對課本知識有了更深的理解。

剛開始看到這個題目的時候,感覺不是很難,但仔細分析之后發現,要真正完整的實現凱撒密碼,考慮到盡可能多的情況並不容易,我最初只是進行了一個大致的設計,然后就開始上手編代碼,其中遇到很多沒有想到的情況,就要打斷原來的思路,甚至顛覆之前的想法,這使我編寫代碼的效率大大降低。因此,敲代碼前先構思好整體的框架,盡可能多的想會出現的問題及解決方法,在再編寫時用細節一點一點的填充。

之前看書時,我不太理解為什么要將不同的類分開,覺得這樣查看起來很麻煩。但這次實驗使我感覺到編寫時將不同的類分開的好處。最初的代碼,我將兩個大類都放在一起,出現問題時,要一直上下翻看對比,在自定義異常類時,我將所有的類都分開了,一目了然,運行出現問題時,也比較好查看。

這個代碼算是我真正自己編寫的代碼,編完之后,一股成就感油然而生。這次實驗不僅使我更加深入的理解了教材上的知識點,而且鍛煉了我的思考能力,讓我意識到擁有正確的編程思想的重要性。

碼雲鏈接:

https://gitee.com/BESTI-IS-JAVA-2018/20165318_sun_xiaoxuan/commit/5657029dda6f33661c8ac71b7ffa4f674d75956c

代碼上傳截圖:

步驟 耗時 百分比
需求分析 4min 4%
設計 5min 5%
代碼實現 60min 64%
測試 4min 5%
分析總結 20min 22%


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM