Tải bản đầy đủ - 0 (trang)
3 BÀI THỰC HÀNH BUỔI 3

3 BÀI THỰC HÀNH BUỔI 3

Tải bản đầy đủ - 0trang

Báo cáo thực hành lập trình mạng



2014



1.3.2 Tạo các class tính tốn ma trận

Để tiện cho việc thực hiện bài toán, ta sẽ định nghĩa 2 lớp là MaTran và PhepToan_MaTran:



1.3.2.1 Cài đặt:

a) Lớp MaTran được định nghĩa như sau:

class MaTran {

double maTran[][];

int n, m; // Số dòng, số cột

public

public

public

public



MaTran(int dong, int cot) {}

MaTran(File file){}

void Nhap_MaTran() {}

void In_MaTran() {}



}



b) Lớp PhepToan_MaTran được định nghĩa như sau:

public class

public

public

public

public

public

public

public

public

}



PhepToan_MaTran {

MaTran Cong(MaTran A, MaTran B) {}

MaTran Tru(MaTran A, MaTran B) {}

MaTran Nhan(MaTran A, MaTran B) {}

MaTran DoiDong(int i, int j, MaTran X) {}

double DinhThuc(MaTran Ori) {}

double PhanTu_MaTran_PhuHop(MaTran B, int i, int j) {}

MaTran ChuyenVi(MaTran C) {}

MaTran Chia(MaTran A, MaTran B) {}



1.3.3 Nhập ma trận:

Nhập bằng file: Trong file, các số ngăn cách nhau bởi kí tự tab - ‘\t’ - và mỗi hàng phân biệt

nhau bởi enter.



1.3.3.1 Thuật toán:

B1: Lấy 1 file chỉ định.

B2: Tạo 1 luồng đọc vào của file được chọn.

B3: Tạo 1 bộ đệm để lưu dữ liệu cho luồng đọc vào đó.

// Tiếp theo, đọc từng dòng trong bộ đệm để lấy dữ liệu dưới dạng chuỗi:

B4: Đọc dòng đầu tiên trong bộ đệm để lấy giá trị hàng và cột.

B4.1: Cắt chuỗi đọc vào dựa theo kí tự tab ‘\t’ để tách số, lưu vào mảng String token;

B4.2: Đổi các phần tử trong mảng token thành kiểu số thích hợp rồi gán vào số hàng, số cột.

B5: Tạo ma trận có số hàng và số cột đó.

B6: Cho i = 0. Đọc 1 dòng trong bộ đệm cho mỗi lần lặp.

Lặp khi đọc chưa tới dòng cuối cùng trong bộ đệm và (i < số hàng):



Page 14



B6.1: Cắt chuỗi đọc vào dựa theo kí tự tab ‘\t’ để tách số, lưu vào token;

B6.2: Cho j = 0. Lặp khi (j < số cột) và (j < độ dài mảng của token):

B6.2.1: Đổi kiểu số cho phần tử token[j] và gán vào phần tử maTran[i][j].

B6.2.2: j++;

B6.3: i++;



1.3.3.2 Cài đặt:

public void Nhap_MaTran(File file) {

Reader in;

BufferedReader br;

String token[],temp;

try {

in = new InputStreamReader(new FileInputStream(file.getPath()), "UTF-



8");



br = new BufferedReader(in);

temp = br.readLine();

token = temp.split("\t");

m = Integer.parseInt(token[0]);

n = Integer.parseInt(token[1]);



}

}



}

}

}

}



maTran = new double[m][n];

for (int i = 0; i < m && (temp = br.readLine()) != null; i++) {

token = temp.split("\t");

for (int j = 0; j < token.length && j < n; j++)

maTran[i][j] = Double.parseDouble(token[j]);

}

catch (NullPointerException e) {

catch (FileNotFoundException e) {

JOptionPane.showMessageDialog(null,

"Khơng tìm thấy file", "Loi!",

JOptionPane.ERROR_MESSAGE);

catch (UnsupportedEncodingException e) {

catch (NumberFormatException e) {

catch (IOException e) {



}



1.3.4 Cộng, trừ ma trận

1.3.4.1 Thuật tốn:

Giả sử có sẵn 2 ma trận A và B và ma trận C dùng để lưu kết quả. Phép tốn cộng và trừ 2 ma

trận có thuật toán tương tự nhau, chỉ khác nhau dấu phép toán.

B1: Kiểm tra số hàng và số cột của A và B có bằng nhau, nếu có:

B1.1: Tạo ma trận C[số hàng A][số cột A].

B1.2: Cho i = 0. Lặp khi (i < số hàng):

B1.2.1: Cho j = 0. Lặp khi (j < số cột):

B1.2.1.1: C[i][j] = A[i][j] +/- B[i][j];

B1.2.1.2: j++;



Họ và tên: Bùi Tấn Việt – Lớp: 10T2 – Nhóm 11BPage 15



Báo cáo thực hành lập trình mạng



2014



B1.2.2: i++;

B2: Nếu khơng: 2 ma trận khơng thể thực hiện phép tốn.



1.3.4.2 Cài đặt:

public MaTran Cong(MaTran A, MaTran B) {

MaTran C = new MaTran(0, 0);

if (A.n == B.n && A.m == B.m) {

C = new MaTran(A.m, A.n);

for (int i = 0; i < A.m; i++)

for (int j = 0; j < A.n; j++)

C.maTran[i][j] = A.maTran[i][j] + B.maTran[i][j];

} else {

System.out.println("Không thể thực hiện được phép cộng 2 ma trận vì

khác kích thước!");

}

return C;

}

public MaTran Tru(MaTran A, MaTran B) {

MaTran C = new MaTran(0, 0);

if (A.n == B.n && A.m == B.m) {

C = new MaTran(A.m, A.n);

for (int i = 0; i < A.m; i++)

for (int j = 0; j < A.n; j++)

C.maTran[i][j] = A.maTran[i][j] - B.maTran[i][j];

} else {

System.out.println("Không thể thực hiện được phép trừ 2 ma trận vì

khác kích thước!");

}

return C;

}



1.3.5 Nhân 2 ma trận

1.3.5.1 Thuật tốn:

Giả sử có sẵn 2 ma trận A và B và ma trận C dùng để lưu kết quả. Phép toán nhân ma trận A với

ma trận B.

Phần tử C[i][k] của ma trận C được tính bằng cơng thức:

Khi đó để đảm bảo 2 ma trận A và B có thể nhân với nhau thì số cột A = số hàng B và ma trận C

được tạo ra sẽ có số hàng = số hàng A và số cột = số cột B.

B1: Nếu số cột ma trận A == số hàng ma trận B:

B1.1: Tạo ma trận C[số hàng A][số cột B].

B1.2: Cho i = 0. Lặp khi (i < số dòng A):

B1.2.1: Cho k = 0. Lặp khi (k < số cột B):



Page 16



B1.2.1.1: C[i][k] = 0;

B1.2.1.2: Cho j = 0. Lặp khi (j < số cột A):

B1.2.1.2.1: C[i][k] += A[i][j] * B[j][k];

B1.2.1.2.2: j++;

B1.2.1.3: k++;

B1.2.2: i++;

B2: Nếu không: 2 ma trận không thể thực hiện phép nhân.



1.3.5.2 Cài đặt:

public MaTran Nhan(MaTran A, MaTran B) {

MaTran C = new MaTran(0, 0);

if (A.n == B.m) {

C = new MaTran(A.m, B.n);

for (int i = 0; i < A.m; i++)

for (int k = 0; k < B.n; k++) {

C.maTran[i][k] = 0;

for (int j = 0; j < A.n; j++)

C.maTran[i][k] += A.maTran[i][j] * B.maTran[j][k];

}

} else {

System.out.println("Không thể thực hiện được phép trừ 2 ma trận vì số

cột ma trận A không bằng số hàng ma trận B!");

}

return C;

}



1.3.6 Chia 2 ma trận

Trong tốn học, khơng có phép chia ma trận, nhưng ta có thể định nghĩa phép chia ma trận

thơng qua phép nhân ma trận:

Phép chia ma trận A cho ma trận B:



1.3.6.1 Thuật tốn:

Giả sử có sẵn 2 ma trận A và B và ma trận C dùng để lưu kết quả. Phép toán chia ma trận A với

ma trận B.

Cách tìm ma trận khả nghịch thơng qua ma trận :



Trong đó:



là định thức của ma trận B.

là ma trận phụ hợp của B.

Ma trận B phải là ma trận vuông cấp n.



Ma trận B khả nghịch khi và chỉ khi định thức ma trận B != 0



Họ và tên: Bùi Tấn Việt – Lớp: 10T2 – Nhóm 11BPage 17



Báo cáo thực hành lập trình mạng



2014



Ma trận vng B cấp n, phần tử . Ma trận phụ hợp của B kí hiệu là và được xác định.



=

Trong đó:



là phần bù đại số của phần tử , nghĩa là

Ma trận là ma trận chuyển vị của ma trận X



là ma trận cấp n - 1 có được từ ma trận B bằng cách bỏ hàng i và cột j của B.

Ma trận chuyển vị bằng cách đổi hàng thành cột hoặc cột thành hàng của ma trận X.

a) Tính định thức của 1 ma trận vuông:

Ta chuyển ma trận vuông thành ma trận tam giác trên rồi tính tích đường chéo chính của ma trận

tam giác đó.

Giả sử với ma trận vng A cấp n có phần tử aij.

B1: Biến đổi ma trận vuông A thành ma trận tam giác trên

B1.1: Lặp i = 1…n-:

B1.1.1: Nếu aij == 0:

public MaTran

DoiDong(int

i, int

X) {

B1.1.1.1:

Tìm j sao cho

aij �j,

0, MaTran

j = i+1…n

for (int k = 0; k < X.n; k++) {

X.maTran[i][k]

+=hoán

X.maTran[j][k];

B1.1.1.2:

Nếu j<= n thì

đổi dòng i và dòng j cho nhau

X.maTran[j][k] = X.maTran[i][k] - X.maTran[j][k];

B1.1.1.3:

Ngược lại kết

vì dữ liệu khơng hợp lệ

X.maTran[i][k]

-= thúc

X.maTran[j][k];

}

B1.1.2: Lặp

return

X; j = i+1…n

}

B1.1.2.1: m = -aij / aii

public double

DinhThuc(MaTran

{ ajk + aik * m

B1.1.2.2:

Lặp k = i…n: Ori)

ajk =

int i, j, k;

B2: Tínhdouble

định thức

m, dau = 1, dinhThuc;

// Sao chép ma trận

B2.1:

dt = 1

MaTran X = new MaTran(Ori.n, Ori.m);

for

0; i
B2.2:

Lặp(ii == 1…n:

= dt *i++)

aii

for (j = 0; j < X.m; j++)

X.maTran[i][j] = Ori.maTran[i][j];

B3: Trả về kết quả:

dinhThuc = 1;

Cài đặt: for (i = 0; i < X.n - 1; i++) {

if (X.maTran[i][i] == 0) {

for (j = i + 1; j < X.n; j++)

if (X.maTran[j][i] != 0) {

X = DoiDong(i, j, X);

dau *= -1;

break;

}

if (j == X.n)

return 0;

}

for (j = i + 1; j < X.n; j++) {

m = -X.maTran[j][i] / X.maTran[i][i];

for (k = i; k < X.n; k++)

X.maTran[j][k] += m * X.maTran[i][k];

}

}

for (i = 0; i < X.n; i++)

dinhThuc *= X.maTran[i][i];

dinhThuc *= dau;



Page 18

}



return dinhThuc;



b) Tính :

Với ma trận vuông B cấp, loại bỏ hàng i và cột j ta sẽ có

B1: Nhập vào ma trận B, i và j là dòng và cột cần bỏ trong ma trận B.

B2: Tạo ma trận vuông temp cấp n – 1.

B3: Cho x = 0, z = -1. Lặp khi x < n:

B3.1: Nếu z != i: z++;

B3.2: Cho y = 0, t = 0. Lặp khi y < n:

B3.2.1: Nếu x != i và y != j

B3.2.1: temp[i][j] = B[i][j];

B3.2.2: ++t;

B3.3.2: ++y;

public

double

B3.3:

++x PhanTu_MaTran_PhuHop(MaTran B, int i, int j) {

MaTran temp = new MaTran(B.n - 1, B.n - 1);



B4: Nếu i + j lẻ trả về kết quả DinhThuc(temp);



(inttrảxvề

= kết

0, quả

z =- DinhThuc(temp);

-1; x < B.n; x++) {

B5: Nếufor

không,



Cài đặt:



if (x != i)

z++;

for (int y = 0, t = 0; y < B.n; y++) {

if (x != i && y != j) {

temp.maTran[z][t] = B.maTran[x][y];

t++;

}

}



}

if ((i + j) % 2 == 0)

return DinhThuc(temp);

else

return -DinhThuc(temp);



Họ}và tên: Bùi Tấn Việt – Lớp: 10T2 – Nhóm 11BPage 19



Báo cáo thực hành lập trình mạng



2014



c) Tìm ma trận chuyển vi:

Với ma trận vng C cấp n, ma trận chuyển vị của nó chính là ma trận được tạo thành bằng cách

đổi chỗ hàng và cột của C.

B1: Tạo ma trận vuông temp cấp n.

B2: Cho i = 0. Lặp khi i < n:

B2.1: Cho j = 0, k = 0. Lặp khi j < n:

B2.1.2: temp[i][j] = C[k][i];

B2.1.2: k++, j++;

B2.2: i++;

B3: trả về ma trận temp;

Cài đặt:

public MaTran ChuyenVi(MaTran C) {

MaTran temp = new MaTran(C.n, C.n);

for (int i = 0; i < C.n; i++) {

for (int j = 0, k = 0; j < C.n; j++, k++) {

temp.maTran[i][j] = C.maTran[k][i];

}

}

return temp;

}



Page 20



d) Chia 2 ma trận A và B:

B1: Tạo ma trận C(0, 0)

B2: Nếu B là ma trận vuông: // Tạo ma trận khả nghịch

B2.1: dinhThuc = Định thức ma trận B;

B2.2: Nếu dinhThuc != 0:

B2.2.1: Tạo mới ma trận C[B.n][B.n];

B2.2.1: Nếu B.n == 1: C[0][0] = (1 / C[0][0]) / dinhThuc;

B2.2.2: Ngược lại:

B2.2.2.1: Cho i = 0. Lặp khi i < B.n:

B2.2.2.1: Cho j = 0. Lặp khi j < B.n:

C[i][j] = PhanTu_MaTran_PhuHop(B, i, j) / dinhThuc;

B2.2.3: C= ChuyenVi(C);

B2.2.4: C = Nhan(A, C);

B3: Return C;

Cài đặt:

public MaTran Chia(MaTran A, MaTran B) {

double det;

MaTran C = new MaTran(0, 0);

if (B.n == B.m) {

det = DinhThuc(B);

if (det != 0) {

C = new MaTran(B.n, B.n);

if (B.n == 1)

C.maTran[0][0] = (1 / C.maTran[0][0]) / det ;

else {

for (int i = 0; i < B.n; i++) {

for (int j = 0; j < B.n; j++) {

C.maTran[i][j] = PhanTu_MaTran_PhuHop(B,i,j)

/ det;

}

}

}

C = ChuyenVi(C);

C = Nhan(A, C);

} else {

System.out.println("Không thể thực hiện được phép chia 2 ma trận

vì ma trận B khơng có ma trận nghịch đảo!");

}

} else {

System.out.println("Khơng thể thực hiện được phép chia 2 ma trận vì ma

trận B không không phải ma trận vuông!");

}

return C;

}



Họ và tên: Bùi Tấn Việt – Lớp: 10T2 – Nhóm 11BPage 21



Báo cáo thực hành lập trình mạng



2014



1.3.7 Chương trình Client

1.3.7.1 Xử lý khi u cầu tính

tốn ma trận:

Thuật tốn:

B1: Kiểm tra đã có dữ liệu để xử lý chưa.

B2: Kiểm tra phép tốn nhập vào có đúng đắn.

B3: Tạo socket kết nối đến server có địa chỉ IP và cổng cho trước.

B4: Tạo đối tượng dạng thread để xử lý kết nối với server.

Cài đặt:

public void jbStart_ActionPerformed(ActionEvent evt) {

Socket socket;

if (fileA != null && fileB != null) {

try {

operator = jtfOperator.getText().trim();



}

}

}

}

}



}



if (operator.charAt(0) == '+' || operator.charAt(0) == '-'

|| operator.charAt(0) == '*'

|| operator.charAt(0) == '/') {

socket = new Socket("localhost", 7777);

Process t = new Process(fileA, fileB, operator, socket);

t.start();

Print_Debug("\nĐã kết nối tới server");

} else {

Print_Debug("\nLỗi toán tử");

}

catch (UnknownHostException e1) {

Print_Debug("\nNhập địa chỉ IP chính xác của server");

catch (NumberFormatException e) {

catch (ConnectException e) {

Print_Debug("\nServer không tồn tại");

catch (IOException e) {



} else {

JOptionPane.showMessageDialog(null,

"Lựa chọn file để truyền dữ liêu cho", "Thơng báo",

JOptionPane.WARNING_MESSAGE);

}



1.3.7.2 Gửi

Server:

Thuật tốn:

B1: Gửi số hàng.

B2: Chờ nhận phản hồi.

B3: Gửi số cột.

B4: Chờ nhận phản hồi.



Page 22



ma



trận



lên



B5: Duyệt tất cả phần tử ma trận từ trái qua phải, từ trên xuống dưới:

B5.1: Gửi phần tử ma trận.

B5.2: Chờ phản hồi

Cài đặt:

public void GuiMaTran(MaTran X) throws IOException {

dos.writeInt(X.m);

// Gui so hang

dis.read();

// Gui so cot

dos.writeInt(X.n);

dis.read();

// Gui ma tran

for (int i = 0; i < X.m; i++) {

for (int j = 0; j < X.n; j++) {

dos.writeDouble(X.maTran[i][j]);

}

}

}



dis.read();



1.3.7.3 Thực hiện phép toán và

nhận kết quả

Thuật toán:

B1: Gửi kí hiệu phép tốn.

B2: Chờ nhận phản hồi.

B3: Chờ nhận số hàng của ma trận kết quả.

B4: Phản hồi đã nhận.

B5: Chờ nhận số cột của ma trận kết quả.

B6: Phản hồi đã nhận.

B7: Tạo đối tượng MaTran mới với số hàng và số cột đã có.

B8: Nếu số hàng và số cột khác 0:

B8.1: Lần lượt nhận các phần tử của ma trận từ trái qua phải, từ trên xuống dưới. Mỗi lần nhận

thành công gửi phản hồi đến server.

Cài đặt:

public void PhepToan() {

int n, m;

try {

dos.writeInt(operator); dis.read();

/* Nhan ket qua */

m = dis.readInt();

dos.write(1);

// Lay so hang

n = dis.readInt();

dos.write(1);

// Lay so cot

ketQua = new MaTran(m, n);

if (n * m != 0) {

for (int i = 0; i < m; i++) {

for (int j = 0; j < n; j++) {

ketQua.maTran[i][j] = dis.readDouble();

dos.write(1);

}

}

} else

Print_Debug("\nKhơng thể thực hiện được phép tốn");

} catch (IOException e) {}

}



Họ và tên: Bùi Tấn Việt – Lớp: 10T2 – Nhóm 11BPage 23



Báo cáo thực hành lập trình mạng



2014



1.3.7.4 Lớp Thread xử lý việc

truyền ma trận và nhận kết

quả:

class Process extends Thread {

int operator;

MaTran A, B, ketQua;

DataInputStream dis;

DataOutputStream dos;

Socket socket;

public Process(File fileA, File fileB, String operator, Socket socket) {

A = new MaTran(fileA);

B = new MaTran(fileB);

In_MaTran(A);

In_MaTran(B);

if (operator.equals("+")) {

this.operator = 1;

} else if (operator.equals("-")) {

this.operator = 2;

} else if (operator.equals("*")) {

this.operator = 3;

} else if (operator.equals("/")) {

this.operator = 4;

}

this.socket = socket;

}

public void PhepToan() {

int n, m;

try {

dos.writeInt(operator); dis.read();



}



/* Nhan ket qua */

m = dis.readInt();

dos.write(1);

// Lay so hang

n = dis.readInt();

dos.write(1);

// Lay so cot

ketQua = new MaTran(m, n);

if (n * m != 0) {

for (int i = 0; i < m; i++) {

for (int j = 0; j < n; j++) {

ketQua.maTran[i][j] = dis.readDouble();

dos.write(1);

}

}

} else

Print_Debug("\nKhơng thể thực hiện được phép tốn");

} catch (IOException e) {}



public void GuiMaTran(MaTran X) throws IOException {

dos.writeInt(X.m);

// Gui so hang

dis.read();

// Gui so cot

dos.writeInt(X.n);

dis.read();

// Gui ma tran

for (int i = 0; i < X.m; i++) {

for (int j = 0; j < X.n; j++) {

dos.writeDouble(X.maTran[i][j]);

}

}

}



Page 24



dis.read();



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

3 BÀI THỰC HÀNH BUỔI 3

Tải bản đầy đủ ngay(0 tr)

×