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

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

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

@Override

public void actionPerformed(ActionEvent e) {

double nhan;

if (e.getSource() == bt1) {

try {

String s = tfnhap.getText();

outputStream.writeUTF(s);

nhan = inputStream.readDouble();

tfkq.setText("" + nhan);

} catch (UnknownHostException e1) {

} catch (IOException e1) {}

}

if (e.getSource() == bt2)

System.exit(0);

}



}



1.2.3 Phần chương trình Server:

1.2.3.1 Thuật tốn:

B1: Tạo ServerSocket kết nối với cổng cho sẵn.

B2: Server lắng nghe liên tục để chờ các client kết nối tới.

B2.1: Khi có Client kết nối tới thì Server sẽ tạo socket để giao tiếp, đồng thời tạo 1 đối tượng sử

dụng thread để xử lý yêu cầu.



1.2.3.2 Cài đặt:

import java.net.*;

public class server {

public static void main(String[] args) throws Exception {

ServerSocket serverSocket = new ServerSocket(7777);

while (true) {

Socket socket = serverSocket.accept();

server_Process t = new server_Process(socket);

t.start();

}

}

}



1.2.4 Phần chương trình xử lý của Server:

1.2.4.1 Thuật tốn:

B1: Tạo dòng vào ra kết nối với socket.

B2: Chờ liên tục để nhận dữ liệu từ Client:

B2.1: Khi nhận được dữ liệu từ Client thì sẽ tiến hành xử lý tính tốn lấy kết quả.

B2.2: Truyền kết quả cho Client.



1.2.4.2 Cài đặt:



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



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



2014



import java.io.*;

class server_Process extends Thread {

Socket socket;

public server_Process(Socket socket) {

this.socket = socket;

}

@Override

public void run() {

DataInputStream inputStream;

DataOutputStream outputStream;

double kq;

try {



inputStream = new DataInputStream(socket.getInputStream());

outputStream = new DataOutputStream(socket.getOutputStream());

while (true) {

String snhan;

try {

snhan = inputStream.readUTF();

TinhBieuThuc t = new TinhBieuThuc();

kq = t.TinhToan(snhan);

outputStream.writeDouble(kq);

} catch (IOException ex) {

Logger.getLogger(server_Process.class.getName()).log(

Level.SEVERE, null, ex);

}

}

} catch (IOException ex) {

Logger.getLogger(server_Process.class.getName()).log(Level.SEVERE,

null, ex);

}

}

}



1.2.5 Phần chương trình xử lý biểu thức:

1.2.5.1 Thuật tốn:

Để tính biểu thức nhập vào ta ứng dụng “kí pháp nghịch đảo Ba Lan”

B1: Ta chuyển biểu thức dạng trung tố nhập vào thành dạng hậu tố.

B2: Tính tốn biểu thức hậu tố theo kí pháp nghịch đảo Ba Lan.

-



Chuyển từ biểu thức trung tố sang biểu thức hậu tố:



1.2.5.2 Thuật toán:

Thuật toán chuyển đổi này được phát minh bởi Edsger Dijkstra. Thuật toán dựa theo cơ chế

ngăn xếp. Ý tưởng chung của thuật toán là duyệt biểu thức từ trái sang phải.

B1: Nếu gặp một toán hạng (con số hoặc biến) thì nó ghi vào chuỗi kết quả.

B2: Nếu gặp dấu mở ngoặc, đưa nó vào ngăn xếp.

B3: Nếu gặp một toán tử O1, thực hiện theo 2 bước:



Page 8



B3.1: Chừng nào còn có một tốn tử O2 ở đỉnh ngăn xếp và độ ưu tiên của O1 ≤ độ ưu tiên của

O2 thì lấy O2 ra khỏi ngăn xếp và ghi vào kết quả.

B3.2: Push O1 vào ngăn xếp

B4: Nếu gặp dấu “)” thì cứ lấy các toán tử trong ngăn xếp ra và ghi vào chuỗi kết quả cho đến khi

lấy được dấu “(“ ra khỏi ngăn xếp.

B5: Khi đã duyệt hết biểu thức trung tố, lần lượt lấy tất cả toán hạng (nếu có) từ ngăn xếp ra và ghi

vào chuỗi kết quả.

Ví dụ: Chuyển đổi biểu thức: 3 + sin(4) * 2

Phần tử



Thao tác



Stack



Chuỗi hậu tố



3



Ghi 3 vào kết quả



3



+



Push +



+



3



sin



Push sin



+ sin



3



(



Push (



+ sin (



3



4



Ghi 4 vào kết quả



+ sin (



34



)



Pop cho đến khi lấy

được ( ra khỏi ngăn

+ sin

xếp. Kết quả pop rag hi

vào kết quả



34



*



Pop sin ghi vào kết quả

+*

và push *



3 4 sin



2



Ghi 2 vào kết quả



3 4 sin 2



+*



Pop tất cả toán tử



3 4 sin 2 * +



1.2.5.3 Cài đặt:

public ArrayList ChuyenDoi_HauTo(String str) {

String[] toanTu = { "+", "-", "*", "/", "sin", "cos", "tan",

"cot" };

// Loại bỏ tất cả dấu cách

str = str.replaceAll("\\s", "");

// Tách biểu thức thành các phần tử

StringTokenizer tk = new StringTokenizer(str, "()+-*/", true);

// Danh sách lưu các phần tử

ArrayList tkList = new ArrayList();

// Lấy danh sách các toán tử

List operatorList = Arrays.asList(toanTu);

// Tạo ngăn xếp

Stack stack = new Stack();

// Tạo mảng kết quả

ArrayList resultList = new ArrayList();

// Lấy các phần tử cắt ra đưa vào danh sách

while (tk.hasMoreTokens()) {

tkList.add(tk.nextToken());

}



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



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



2014



// Chuyển đổi

for (String s : tkList) { // Lấy lần lượt các phần tử

if (operatorList.contains(s)) { // Toán tử

while (!stack.isEmpty() && DoUuTien(stack.peek()) > 0

&& DoUuTien(stack.peek()) >= DoUuTien(s)) {

resultList.add(stack.pop());

}

stack.push(s);

} else if (s.equals("(")) { // '('

stack.push(s);

} else if (s.equals(")")) { // ')'

// Lấy tất cả toán tử trong ngăn xếp cho đến khi gặp '('

while (!stack.peek().equals("("))

resultList.add(stack.pop());

stack.pop();

} else { // Tốn hạng

resultList.add(s);

}

}

while (!stack.isEmpty()) {

// Đưa các tốn tử còn lại trong ngăn xếp vào kết quả

resultList.add(stack.pop());

}

return resultList;

}

public int DoUuTien(String toanTu) {

if (toanTu.equals("+") || toanTu.equals("-"))

return 1;

if (toanTu.equals("*") || toanTu.equals("/"))

return 2;

if (toanTu.equals("sin") || toanTu.equals("cos")

|| toanTu.equals("tan") || toanTu.equals("cot"))

return 3;

return 0;

}



-



Tính tốn biểu thức hậu tố:



1.2.5.4 Thuật tốn:

Q trình tính tốn biểu thức hậu tố là đọc biểu thức từ trái sang phải:

B1: Nếu gặp một tốn hạng (số hoặc là biến) thì push tốn hạng đó vào ngăn xếp;

B2: Nếu gặp tốn tử:

B2.1: Nếu là tốn tử 1 ngơi thì pop 1 toán hạng ra khỏi ngăn xếp, push kết quả của tốn hạng

với tốn tử đó vào ngăn xếp.

B2.2: Nếu là tốn tử 2 ngơi thì pop 2 tốn hạng ra khỏi ngăn xếp, push kết quả của 2 toán hạng

với tốn tử đó vào ngăn xếp.

B3: Q trình tính kết thúc khi con số cuối cùng còn lại trong ngăn xếp chính là giá trị của biểu thức

đó.

Ví dụ: Tính biểu thức: 3 4 sin 2 * +



Page 10



Phần tử



Thao tác



Stack



3



Push 3



3



4



Push 4



34



Tính sin(4), push hết quả



3 [sin(4)]



2



Push 2



3 [sin(4)] 2



*



Tính sin(4)*2, push kết quả



3 [sin(4)*2]



+



Tính sin(4)*2 + 3, push kết quả



[sin(4)*2+3]



sin



1.2.5.5 Cài đặt:

public double TinhToan(String str) {

ArrayList hauTo = ChuyenDoi_HauTo(str);

Stack stack = new Stack();

for (String token : hauTo) {

int priority = DoUuTien(token);

if (priority == 3) { // toán tử: sin cos tan cot

String o = stack.pop();

stack.push(Double.toString(TinhLuongGiac(token, o)));

} else if (priority == 1 || priority == 2) {

String o2 = stack.pop();

String o1 = stack.pop();

stack.push(Double.toString(Tinh(token, o1, o2)));

} else {

stack.push(token);

}



}



}

return Double.parseDouble(stack.pop());



public double TinhLuongGiac(String toanTu, String toanHang) {

if (toanTu.equals("sin")) {

return sin(Double.parseDouble(toanHang));

}

if (toanTu.equals("cos")) {

return cos(Double.parseDouble(toanHang));

}

if (toanTu.equals("tan")) {

return (sin(Double.parseDouble(toanHang)) / cos(Double

.parseDouble(toanHang)));

}

if (toanTu.equals("cot")) {

return (cos(Double.parseDouble(toanHang)) / sin(Double

.parseDouble(toanHang)));

}

return 0;

}

public double Tinh(String toanTu, String toanHang1, String toanHang2) {

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

return Double.parseDouble(toanHang1) +

Double.parseDouble(toanHang2);

}



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



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



2014



if (toanTu.equals("-")) {

return Double.parseDouble(toanHang1) Double.parseDouble(toanHang2);

}

if (toanTu.equals("*")) {

return Double.parseDouble(toanHang1) *

Double.parseDouble(toanHang2);

}

if (toanTu.equals("/")) {

return Double.parseDouble(toanHang1) /

Double.parseDouble(toanHang2);

}

return 0;

}



-



Tính lượng giác sin(x):



Thuật tốn:

Ta có cơng thức triển khai tính sin(x):

Ta sử dụng 1 biến temp để tính giá trị từng phân tử, sau đó cộng vào kết quả chung, kết quả tính

được của phần tử trước sẽ được sử dụng để tính tiếp phần tử phía sau, thuật tốn được triển khai theo

cơng thức:



Việc tìm kết quả bằng cách trên sẽ lặp liên tục và kết thúc khi:

Cài đặt:

public double sin(double x) {

double ketQua = 0;

double temp = x, i = 1;

do {



ketQua += temp;

temp = (-1) * temp * x * x / ((++i) * (++i));

} while (temp > 10E-10 || temp < -10E-10);

return ketQua;

}



-



Tính lượng giác cos(x):



Thuật tốn:

Ta có cơng thức triển khai tính cos(x):



Page 12



Ta sử dụng 1 biến temp để tính giá trị từng phân tử, sau đó cộng vào kết quả chung, kết quả tính

được của phần tử trước sẽ được sử dụng để tính tiếp phần tử phía sau, thuật tốn được triển khai theo

cơng thức:



Việc tìm kết quả bằng cách trên sẽ lặp liên tục và kết thúc khi:

Cài đặt:

public double cos(double x) {

double ketQua = 0;

double temp = 1, i = 0;

do {



ketQua += temp;

temp = (-1) * temp * x * x / ((++i) * (++i));

} while (temp > 10E-10 || temp < -10E-10);

return ketQua;

}



-



Tính lượng giác tan(x) và cot:



Thuật toán:

Tan(x) và cot(x) được suy ra từ sin(x) và cos(x) từ cơng thức:



1.2.5.6 Demo:

Chương trình Client:



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

1.3.1 Đề bài

Gửi 2 ma trận từ Client qua Server. Server tính tốn +, -, *, / 2 ma trận rồi gửi kết quả về cho

Client.



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



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



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

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

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

×