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% |