1. 程式人生 > 其它 >20202303 實驗四 《資料結構與面向物件程式設計》實驗報告

20202303 實驗四 《資料結構與面向物件程式設計》實驗報告

# 20202303 2021-2022-1 《資料結構與面向物件程式設計》實驗三報告

課程:《程式設計與資料結構》
班級: 2023
姓名: 馬瀾
學號:20202303
實驗教師:王志強
實驗日期:2021年10月11日
必修/選修: 必修

## 1.實驗內容

(一)Java Socket程式設計

1.學習藍墨雲上教材《Java和Android程式設計》“第16章 輸入/輸出 ”和“第22章 網路”,學習JavaSocket程式設計
2.結對程式設計。結對夥伴A編寫客戶端SocketClient.java,結對夥伴B編寫伺服器端。
3.截圖加學號水印上傳藍墨雲,程式碼push到碼雲,並撰寫實驗報告。

(二)Java和密碼學

參考http://www.cnblogs.com/rocedu/p/6683948.html

以結對的方式完成Java密碼學相關內容的學習(帖子中所有程式碼和相關知識點需要學習)。提交學習成果碼雲連結和代表性成果截圖,要有學號水印。

(三)編寫有理數/複數計算器

結對程式設計,結對夥伴A編寫有理數計算器。結對夥伴B編寫複數計算器。截圖加水印上傳藍墨雲,程式碼push碼雲。

(四)遠端有理數計算器

結對程式設計,結對夥伴A程式設計實現客戶端,結果夥伴B實現伺服器端。
客戶端通過鍵盤輸入一個有理數計算的公式(例如:1/4 + 1/6 = ),並把該公式以字串的形式傳送給夥伴B(伺服器端),伺服器端根據字串計算出結果為5/12,並把結果返回給客戶端A,A收到結果後輸出結果。截圖加水印上傳藍墨雲,程式碼push碼雲。

(五)遠端複數計算器

結對程式設計,結對夥伴B程式設計實現客戶端,結果夥伴A實現伺服器端。
客戶端通過鍵盤輸入一個有理數計算的公式(例如:1/4 + 1/6 = ),並把該公式以字串的形式傳送給夥伴A(伺服器端),伺服器端根據字串計算出結果為5/12,並把結果返回給客戶端B,B收到結果後輸出結果。截圖加水印上傳藍墨雲,程式碼push碼雲。
注意實驗四(4)和實驗四(5),一個人不能僅實現客戶端,必須實現一個客戶端和伺服器,否則兩個實驗均不得分!!!

## 2. 實驗過程及結果

(一)Java Socket程式設計

也就是編寫伺服器與客戶端,在這裡我選擇了20202322袁藝勻為夥伴,我負責B部分,她負責A部分。

執行如圖所示

雙方進行了完美的對接。

(二)Java和密碼學

這個對於本人還是有一定難度的,好在有例子檔案,探究的話也不至於很費解。這個部分總共有四個板塊

1.首先要進行凱撒密碼的嘗試,並進行加密解密。如圖

在加密解密時,尤其是要注意利用正負號去顯示明文與密文

2.Java對稱加密-DES演算法

首先將金鑰經過物件序列化方式儲存在檔案中,然後列印密碼編碼的內容,接著使用對稱金鑰進行加密和解密,最後對SEnc.dat中的密文進行解密,獲得明文。

3.Java非對稱加密演算法-RSA演算法

首先獲取公鑰及引數,加密"Hello World!",計算密文並列印,然後使用私鑰檔案Skey_RSA_priv.dat,對密文檔案Enc_RSA.dat中的密文c進行解密,得到明文"Hello World!"操作很簡單

4.使用金鑰協定建立共享金鑰

首先建立DH公鑰和私鑰,建立共享金鑰並列印。建立過程其實也不太懂。不過有三個程式就可。

對於Java摘要演算法- MD5

(三)編寫有理數/複數計算器

結對程式設計,結對夥伴A編寫有理數計算器。結對夥伴B編寫複數計算器。截圖加水印上傳藍墨雲,程式碼push碼雲。

對於我自己是B任務,所以編寫複數計算器。

import java.util.Scanner;
public class MyComplex {
private double realpart; // 實部
private double imaginpart; // 虛部
public MyComplex ( double realpart, double imaginpart) {//有參構造
super();
setimaginpart(imaginpart);
setrealpart(realpart);
}
public MyComplex () {//無參
super();
realpart=0;
imaginpart=0;
}
public double getrealpart() {
return realpart;
}
public void setrealpart(double real) {
realpart = real;
}
public double getimaginpart() {
return imaginpart;
}
public void setimaginpart(double imag) {
imaginpart= imag;
}
public static MyComplex MyComplexAdd( MyComplex a, MyComplex b){//複數加法 a+b
double n=a.imaginpart+b.imaginpart;
double m=a.realpart+b.realpart;
MyComplex result=new MyComplex (m,n);
return result;
}
public static MyComplex MyComplexSub( MyComplex a, MyComplex b){//複數減法 a-b
double m=a.realpart-b.realpart;
double n=a.imaginpart-b.imaginpart;
MyComplex result=new MyComplex (m,n);
return result;
}
public static MyComplex MyCompleMul( MyComplex a, MyComplex b){//複數 乘法 a*b
double m=(a.realpart*b.realpart)-(a.imaginpart*b.imaginpart);
double n=(a.realpart*b.imaginpart)+(a.imaginpart*b.imaginpart);
MyComplex result=new MyComplex (m,n);
return result;
}
public static MyComplex MyCompleDiv( MyComplex a, MyComplex b){//複數除法 a/b
double c=b.realpart*b.realpart+b.imaginpart*b.imaginpart;
double n=(a.realpart*b.realpart)/c;
double m=a.imaginpart*(-1)*(b.imaginpart)/c;
MyComplex result=new MyComplex (m,n);
return result;
}
public static void playMyComplex ( MyComplex c){//輸出複數
System.out.println(c.realpart+"+"+c.imaginpart+"i");
}
@Override
public boolean equals(Object o){//重寫Object 的equals(Object obj)判斷兩個複數是否相等
if(o==null){
return false;
}else if(o instanceof MyComplex){
MyComplex myComplex=(MyComplex)o;
if(myComplex.realpart==this.realpart&&myComplex.imaginpart==this.imaginpart){
return true;
}else
return false;
}
return false;
}
public static void main(String []args){
Scanner input1 = new Scanner(System.in);
Scanner input2 = new Scanner(System.in);
Scanner input3 = new Scanner(System.in);
Scanner input4 = new Scanner(System.in);
System.out.println("請輸入第一個複數實部:");
int m = input1.nextInt();
System.out.println("請輸入第一個複數虛部:");
int l = input2.nextInt();
System.out.println(" ");

System.out.println("請輸入第二個複數實部:");
int s = input3.nextInt();
System.out.println("請輸入第二個複數虛部:");
int f = input4.nextInt();
System.out.println(" ");

MyComplex a=new MyComplex(m,l);
MyComplex b=new MyComplex(s,f);
System.out.print("複數a: ");
MyComplex.playMyComplex(a);
System.out.print("複數b: ");
MyComplex.playMyComplex(b);
System.out.print("a+b:");
MyComplex result=MyComplex.MyComplexAdd(a, b);
MyComplex.playMyComplex(result);
System.out.print("a-b:");
result=MyComplex.MyComplexSub(a, b);
MyComplex.playMyComplex(result);
System.out.print("a*b:");
result=MyComplex.MyCompleMul(a, b);
MyComplex.playMyComplex(result);
System.out.print("a/b:");
result=MyComplex.MyCompleDiv(a, b);
MyComplex.playMyComplex(result);
a=new MyComplex(m,l);
b=new MyComplex(s,f);
System.out.print("複數a: ");
MyComplex.playMyComplex(a);
System.out.print("複數b: ");
MyComplex.playMyComplex(b);
System.out.println("a==b:"+(a==b));
System.out.println("a.equals(b):"+a.equals(b));
}
}

(四)遠端有理數計算器

結對程式設計,結對夥伴A程式設計實現客戶端,結果夥伴B實現伺服器端。
客戶端通過鍵盤輸入一個有理數計算的公式(例如:1/4 + 1/6 = ),並把該公式以字串的形式傳送給夥伴B(伺服器端),伺服器端根據字串計算出結果為5/12,並把結果返回給客戶端A,A收到結果後輸出結果。截圖加水印上傳藍墨雲,程式碼push碼雲。

我是B任務,所以要寫根據有理數計算器結果,傳給客戶端A

(五)遠端複數計算器

結對程式設計,結對夥伴B程式設計實現客戶端,結果夥伴A實現伺服器端。
客戶端通過鍵盤輸入一個有理數計算的公式(例如:1/4 + 1/6 = ),並把該公式以字串的形式傳送給夥伴A(伺服器端),伺服器端根據字串計算出結果為5/12,並把結果返回給客戶端B,B收到結果後輸出結果。截圖加水印上傳藍墨雲,程式碼push碼雲。

我自己是B任務,所以要以客戶端的身份給出複數式子,最後A返回給我結果。

## 3. 實驗過程中遇到的問題和解決過程

- 問題1:在第一次建立伺服器和客戶端程式的編寫時,兩個人出了各種問題,埠數字沒對齊,而且電腦自己上才能聯動,兩臺電腦不能連線。
- 問題1解決方案:首先對齊埠,然後連線同一個網路,搜尋自己的ip,就命,把localhost換成了另一個連結,如下

然後也不能連線上,最後請教老師,防火牆沒有關來著。在老師的指導下最後成功聯動。

- 問題2:在密碼學的自學上,最後一個出現了問題,不會建立pri與pub檔案,而且部落格上沒有詳細說明。

- 問題2解決方案:我自己從網上搜索是沒有的,在偶然的條件下發現一種辦法,試了一下,真的可以,如下

## 其他(感悟、思考等)

在本次實驗中,我感覺有點難度,直呼好菜。最讓我“印象深刻”的就是有密碼學了。它的難點在於文章很長,也很瑣碎,需要耐心和搜查資料的堅定。所以我們也要具備一定的自學能力。還有在IDEA中發現了新大陸,原來可以夢幻聯動,實現兩臺電腦的交流,我覺得真的是比較有意思,實踐往往比較理論艱難一點,所以很快發現自己的不足,這給我帶來的感悟就是,光課上汲取知識是遠遠不夠的,課下的自學與努力也是必要的。


- [《Java程式設計與資料結構教程(第九版)》]

-https://www.cnblogs.com/rocedu/p/6683948.html