Tải bản đầy đủ (.docx) (28 trang)

LẬP TRÌNH PHÂN tán

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (310.87 KB, 28 trang )

LẬP TRÌNH PHÂN TÁN NHÓM 1
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP TP.HỒ CHÍ MINH
KHOA CÔNG NGHỆ THÔNG TIN
GVHD: Huỳnh Thái Học
SVTH: Nhóm 1
1. Nguyễn Trung Hiếu 09070301
2. Trịnh Quang Huy 09072881
3. Huỳnh Văn Hiền 09071611
4. Trịnh Trường Thọ 09073251
TÍNH BIỂU THỨC SỐ LỚN 1
LẬP
TRÌNH
PHÂN
TÍNH BIỂU THỨC SỐ LỚN
Tp.HCM,
ngày 6
LẬP TRÌNH PHÂN TÁN NHÓM 1
MỤC LỤC
TÍNH BIỂU THỨC SỐ LỚN 2
LẬP TRÌNH PHÂN TÁN NHÓM 1
LỜI NÓI ĐẦU
Trong thời đại hiện nay với sự phát triển ngày càng lớn mạnh của công nghệ thông tin thì nhu
cầu xử lí dữ liệu với những con số cực lớn (từ 10000 chữ số trở lên) đang rất cần thiết, đặc biệt
trong các ngành khoa học như Toán học như tìm các số nguyên tố lớn, tìm giai thừa của một số
cực lớn, v.v nhưng việc tính toán các giá trị ấy hiện nay vẫn chưa được hỗ trợ, trong đó kiểu
Integer chỉ cho phép tính toán đến 2
32
(khoảng 9 chữ số) và kiểu Long cho phép tính toán đến
2
64
số (khoảng 18 chữ số). Vì vậy chúng ta cần phải tạo ra một chương trình có thể thỏa mãn


điều này nhầm tạo điều kiện cho sự phát triển của Công nghệ thông tin trên toàn thế giới cũng
như các ngành khoa học khác.
Mặc dù những bài toán với số lớn này hiện nay đã có cách giải tuy nhiên việc tính toán rất
phức tạp và rất mất thời gian, đặc biệt khi máy chủ được yêu cầu quá nhiều bài toán cùng một
lúc, rất may thay với sự hỗ trợ của Lập trình theo hướng phân tán, ta có thể tạo nên một ứng
dụng theo hướng phân tán giúp ta có thể giảm thiểu được giời gian xử lí bài toán cũng như có
thể tính toán đồng thời nhiều biểu thức cùng một lúc.
TÍNH BIỂU THỨC SỐ LỚN 3
LẬP TRÌNH PHÂN TÁN NHÓM 1
1 PHÂN TÍCH BÀI TOÁN
1.1 PHÂN TÍCH CẤU TRÚC DỮ LIỆU.
Để giải quyết bài toán tính đa thức với các chữ số lớn này trước hết chúng ta cần xây dựng
một Class với các phương thức tính toán đơn giản bao gồm các phép tính Cộng, Trừ và Nhân
các số lớn.
Như chúng ta đã biết các kiểu dữ liệu Integer và Long trong java không thể xử lí các phép tính
của các số có từ 18 chữ số trở lên nên chúng ta không thể lưu dữ liệu dưới dạng Integer hay
Long được mà sẽ lưu với một dạng khác đó chính là kiểu String, ở dạng kiểu String chúng ta sẽ
có thể lưu thoải mái số lượng chữ số cần thiết. Từ đây chúng ta sẽ chia các phép toán ra thành
từng phần và xử lí chúng:
1.1.1 Phép toán Cộng:
Để cộng 2 chuỗi số với nhau chúng ta cần chia chuỗi này thành các chuỗi con mỗi chuỗi gồm
có 3 chữ số, ta chuyển kiểu chuỗi này sang kiểu Integer và lưu vào một mảng mới kiểu Integer
theo thứ tự từ sau ra trước.
Ví dụ ta có một chuỗi sau: 7128793451
Ta sẽ chia chuỗi này ra thành từng nhóm, mỗi nhóm có 3 chữ số từ sau ra phía trước: 7|128|
793|451.
Sau đó ta sẽ chuyển đổi kiểu của từng cụm số ra kiểu Integer và lưu vào một mảng mới kiểu
Integer theo thứ tự từ sau ra trước, ta sẽ có mảng kiểu integer sau: {451, 793, 128, 7}
Giả sử chúng ta cần tính tổng giá trị của 2 số: 7128793451 và 495674968.
Trước hết chúng ta cần phải phân tích cả 2 số này trở về kiểu mảng Integer như đã nói ở

trên, sau khi phân tích ra ta sẽ được 2 mảng sau:
{451, 793, 128, 7}
{968, 674, 495}
Ta sẽ lần lượt cộng theo thứ tự từ vị trí 0 đến n với n là chiều dài của mảng dài nhất, nếu có
dư ta sẽ dùng một biến để lưu số dư này lại rồi cộng dồn cho các giá trị sau.
Ta sẽ được một mảng kết quả là:
{419, 468, 624, 7}
Việc còn lại là ta chỉ cần ghép các số này theo chiều ngược lại ta sẽ có kết quả cần tìm là:
7624468419.
1.1.2 Phép toán trừ:
Tương tự như phép toán cộng ta đã phân tích ở trên ta có phép toán trừ của 2 số lớn được
thực hiện như các bước sau:
TÍNH BIỂU THỨC SỐ LỚN 4
LẬP TRÌNH PHÂN TÁN NHÓM 1
Ví dụ ta muốn trừ 2 số: 7128793451 và 495674968.
Trước tiên ta vẫn phân tích 2 số này thành các mảng số nguyên như trên:
{451, 793, 128, 7}
{968, 674, 495}
Ta sẽ lần lượt trừ theo thứ tự từ 0 đến n với n là chiều dài của mảng dài nhất trong 2 mảng
trên, nếu số trên nhỏ hơn số ở dưới chúng ta sẽ cộng cho số ở trên cho 1000 và trừ như bình
thường như cần phải có một biến để lưu giá trị ta “mượn” này.
Sau khi trừ ta sẽ được một mảng kết quả như sau:
{483, 118, 633, 6}
Cũng tương tự như phép cộng, ta chỉ đơn giản ghép các số này lại theo thứ tự từ sau ra
trước để có một kết quả hoàn chỉnh: 6633118483.
Chú ý: Nếu số hạng thứ nhất nhỏ hơn số hạng thứ 2 thì ta sẽ lấy số thứ 2 trừ cho số thứ nhất
và trong kết quả ta sẽ gán thêm một dấu trừ phía trước kết quả.
1.1.3 Phép nhân.
Thông thường để thực hiện một phép nhân phức tạp chúng ta sẽ cộng lần lượt các số lại với
nhau để cho ra kết quả cuối cùng, tuy nhiên phương pháp này sẽ mất rất nhiều thời gian và

công sức. Ví dụ nếu ta nhân 2 con số 7128793451 và 495674968 lại với nhau theo phương
pháp này thì chúng ta phải thực hiện 495674968 lần phép cộng số 7128793451 vào kết quả
hiện tại!! Rõ ràng thuật toán này sẽ tốn của chúng ta rất nhiều thời gian để xử lí cũng như bộ
nhớ.
Để thực hiện phép nhân hai số lớn ta sẽ không thực hiện theo phương pháp đã nêu ở trên
mà sẽ sử dụng một phương pháp khác sẽ được trình bày ở dưới đây:
Ví dụ ta có 2 con số cần tính tích của chúng: 7128793451 và 495674968
Trước hết ta vẫn sẽ phân tích 2 con số này ra thành các mảng số nguyên:
A = {451, 793, 128, 7}
B = {968, 674, 495}
Chúng ta có một nhận xét như sau: Nếu ta nhân một số ở vị trí i và một số ở vị trí j thì kết quả
của nó sẽ nằm ở vị trí i + j trong mảng kết quả. Vì vậy mảng kết quả sẽ có số lượng phần tử là
n + m - 1 hoặc n + m nếu có dư với n là số lượng phần tử trong mảng 1 và m là số lượng phần
tử trong mảng 2.
Ta sẽ cho 2 vòng lập for chạy lòng vào nhau và lần lượt cho từng phần tử trong 2 mảng nhân
với nhau, nghĩa là A[0] sẽ nhân lần lượt với B[0], B[1], , B[m - 1] kết quả sẽ lưu vào mảng T[n
+ m].
Ta sẽ có kết quả sau:
T = {436568, 1071598, 881631, 485583, 68078, 3465}
TÍNH BIỂU THỨC SỐ LỚN 5
LẬP TRÌNH PHÂN TÁN NHÓM 1
Ta sẽ cộng dồn kết quả lại sao cho mỗi phần tử chỉ có 3 chữ số, nếu vượt quá 3 chữ số ta sẽ
lưu lại và cộng cho phần tử tiếp theo, kết quả sẽ là:
T = {568, 34, 703, 465, 564, 533, 3}
Tương tự như 2 phép toán ở trên ta sẽ ghép các số này lại theo thức tự từ phải sang trái. Kết
quả nhận được là: 3533564465703034568.
Như ta thấy thì bài toán trên độ phức tạp chỉ là (độ dài xâu 1 * độ dài xâu 2) / 9. Bài toán
được xử lí nhanh hơn rất nhiều so với phương pháp thông thường.
1.1.4 Tổng kết class BigNum.
Như đã phân tích ở trên ta thấy các hàm cần thiết để thực hiện 3 phép toán trên chính là các

hàm sau đây:
 Hàm int[] convertToArray(String a): Dùng để chuyển một kiểu chuỗi sang một kiểu
mảng integer.
 Hàm String Plus(String a, String b): Dùng để cộng 2 số kiểu chuỗi và trả về kết quả
kiểu chuỗi.
 Hàm String Subtract(String a, String b): Dùng để trừ 2 số kiểu chuỗi và trả về kết quả
kiểu chuỗi.
 Hàm String Multi(String a, String b): Dùng để nhân 2 số kiểu chuỗi và trả về kết quả
kiểu chuỗi.
 Hàm String modify(int[] A): Dùng để ghép các số trong mảng kết quả lại thành kiểu
chuỗi.
1.2 PHÂN TÍCH BÀI TOÁN ĐA THỨC THEO HƯỚNG PHÂN TÁN.
Để giải một bài toán đa thức theo hướng phân tán trước hết chúng ta cần phải chia bài toán
lớn ra thành các bài toán con và đưa các bài toán con này cho các máy khác xử lí.
Ví dụ ta có bài toán nhỏ sau: 3*4+5*(7+8).
Ta thấy trong bước đầu tiền khi phân tích đa thức này sẽ tồn tại 2 bài toán con cần xử lí đầu
tiên là 3 * 4 và 7 + 8. Ta sẽ đưa 2 bài toán con này cho các máy con khác xử lí vào được kết
quả là tạo thành một đa thức mới: 12 + 5 * 15. Từ đây lại sinh ra thêm một bài toán con nữa
chính là 5 * 15. Ta lại có một đa thức mới là 12 + 75. Tương tự cho đến khi đa thức này không
còn phép tính nào cả thì ta sẽ được kết quả cuối cùng là 87.
Để có thể phân tích một đa thức ra thành các đơn thức con như trình bày ở trên ta cần phải
sử dụng thuật toán Kí pháp Ba Lan để xử lí nó.
Khi sử dụng thuật toán kí pháp Ba Lan cho một đa thức ta sẽ phân tích đa thức đó thành một
mảng các chuỗi được sắp xếp theo độ ưu tiên của phép toán, ví dụ như chuỗi ở trên sẽ cho ra
kết quả: 3 4 * 5 7 8 + *
Các phép toán nào gần 2 số liên tiếp sẽ được xử lí trước và cho ra kết quả mới. Tương tự
cho đến khi kết quả cuối cùng chỉ còn lại một số.
TÍNH BIỂU THỨC SỐ LỚN 6
LẬP TRÌNH PHÂN TÁN NHÓM 1
2 THỰC THI

2.1 CLASS INTERFACECALCULATOR CHỨA CÁC INTERFACE XỬ LÝ CÁC PHÉP
TOÁN BIGNUM
Class này chứa các interface của các phép toán số lớn bao gồm phép Cộng, Trừ và Nhân.
import java.rmi.*;
public interface InterfaceCaculator extends Remote
{
public String Plus(String a, String b) throws RemoteException;
public String Subtract(String a, String b) throws
RemoteException;
public String Multi(String a, String b) throws RemoteException;
}
2.2 CLASS CALCULATORIMPL DÙNG ĐỂ THỰC THI CÁC PHƯƠNG THỨC TRONG
CLASS INTERFACECALCULATOR.
import java.util.*;
import java.math.*;
import java.io.*;
import java.rmi.*;
import java.rmi.server.*;
public class CaculatorImpl extends UnicastRemoteObject implements
InterfaceCaculator
{
public CaculatorImpl() throws RemoteException
{
super();
}
TÍNH BIỂU THỨC SỐ LỚN 7
LẬP TRÌNH PHÂN TÁN NHÓM 1
//Ham xu li phep toan cong
public String Plus(String a, String b) throws RemoteException
{

boolean ketQuaAm = false;
if (a.charAt(0) == '-' && b.charAt(0) == '-') {
a = a.substring(1);
b = b.substring(1);
ketQuaAm = true;
}
if (a.charAt(0) == '-')
return Subtract(b, a);
if (b.charAt(0) == '-')
return Subtract(a, b);
while (a.length() < b.length())
a = "0" + a;
while (a.length() > b.length())
b = "0" + b;
while (a.length() % 3 != 0)
a = "0" + a;
while (b.length() % 3 != 0)
b = "0" + b;
int[] A = convertToArray(a);
int[] B = convertToArray(b);
int du = 0;
int count = A.length;
int[] plus = new int[count + 1];
for (int i = 0; i < count; i++) {
TÍNH BIỂU THỨC SỐ LỚN 8
LẬP TRÌNH PHÂN TÁN NHÓM 1
du += A[i] + B[i];
plus[i] = du % 1000;
du /= 1000;
}

plus[count] = du;
String answer = modify(plus);
if (ketQuaAm)
answer = "-" + answer;
return answer;
}
//Ham xu li phep toan tru
public String Subtract(String a, String b) throws RemoteException
{
int du = 0;
boolean smaller = false;
if (a.length() < b.length() || (a.length() == b.length() &&
a.compareToIgnoreCase(b) < 0)) {
String temp = a;
a = b;
b = temp;
smaller = true;
}
while (a.length() < b.length())
a = "0" + a;
while (a.length() > b.length())
b = "0" + b;
while (a.length() % 3 != 0)
a = "0" + a;
TÍNH BIỂU THỨC SỐ LỚN 9
LẬP TRÌNH PHÂN TÁN NHÓM 1
while (b.length() % 3 != 0)
b = "0" + b;
int[] A = BigNum.convertToArray(a);
int[] B = BigNum.convertToArray(b);

int count = A.length;
int[] subtract = new int[count];
for (int i = 0; i < count; i++) {
A[i] -= du;
if (A[i] < B[i]) {
A[i] += 1000;
du = 1;
}
else
du = 0;
subtract[i] = A[i] - B[i];
}
String answer = BigNum.modify(subtract);
if (smaller)
answer = "-" + answer;
return answer;
}
//Ham xu li phep toan nhan
public String Multi(String a, String b) throws RemoteException
TÍNH BIỂU THỨC SỐ LỚN 10
LẬP TRÌNH PHÂN TÁN NHÓM 1
{
boolean aAm = false;
boolean bAm = false;
if (a.charAt(0) == '-') {
a = a.substring(1);
aAm = true;
}
if (b.charAt(0) == '-') {
b = b.substring(1);

bAm = true;
}
while (a.length() % 3 != 0)
a = "0" + a;
while (b.length() % 3 != 0)
b = "0" + b;
int[] A = convertToArray(a);
int[] B = convertToArray(b);
int du = 0;
int countA = A.length;
int countB = B.length;
int[] multi = new int[countA + countB];
Arrays.fill(multi, 0);
for (int i = 0; i < countA; i++)
for (int j = 0; j < countB; j++)
multi[i + j] += A[i] * B[j];
TÍNH BIỂU THỨC SỐ LỚN 11
LẬP TRÌNH PHÂN TÁN NHÓM 1
for (int i = 0; i < countA + countB; i++) {
du = multi[i] + du;
multi[i] = du % 1000;
du /= 1000;
}
multi[countA + countB - 1] += du;
String answer = modify(multi);
if (aAm && bAm)
return answer;
if (!aAm && !bAm)
return answer;
answer = "-" + answer;

return answer;
}
}
class BigNum {
//Ham de chuyen mot chuoi thanh mang integer
public static int[] convertToArray(String a) {
int count = a.length() / 3;
int[] answer = new int[count];
int len = a.length() - 1;
int cur = 0;
while (len >= 0) {
int val = (a.charAt(len - 2) - '0') * 100 + (a.charAt(len
- 1) - '0') * 10 + (a.charAt(len) - '0');
answer[cur] = val;
cur++;
len -= 3;
TÍNH BIỂU THỨC SỐ LỚN 12
LẬP TRÌNH PHÂN TÁN NHÓM 1
}
return answer;
}
//Ham de chuyen mot mang integer sang chuoi
public static String modify(int[] A) {
String answer = "";
int count = A.length;
for (int i = count - 1; i >= 0; i ) {
String temp = Integer.toString(A[i]);
while (temp.length() < 3)
temp = "0" + temp;
answer += temp;

}
while (answer.length() > 1 && answer.charAt(0) == '0')
answer = answer.substring(1);
return answer;
}
}
2.3 CLASS SERVER.
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.Naming;
import java.net.MalformedURLException;
public class Server
TÍNH BIỂU THỨC SỐ LỚN 13
LẬP TRÌNH PHÂN TÁN NHÓM 1
{
public static void main (String[] args) throws RemoteException,
MalformedURLException, AlreadyBoundException
{
try
{
LocateRegistry.createRegistry(1099);
CaculatorImpl cal=new CaculatorImpl();
System.out.println ("Server has started");
Naming.bind("rmi://localhost/cal",cal);
System.out.println ("Caculator Bound");
}
catch(Exception e)
{
System.out.println ("Error: "+e);

}
}
}
2.4 CLASS CLIENT.
public class Client extends javax.swing.JFrame {
/**
* Creates new form Client
*/
public Client() {
initComponents();
}
/**
TÍNH BIỂU THỨC SỐ LỚN 14
LẬP TRÌNH PHÂN TÁN NHÓM 1
* This method is called from within the constructor to initialize
the form.
* WARNING: Do NOT modify this code. The content of this method is
always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated
Code">//GEN-BEGIN:initComponents
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
btnCal = new javax.swing.JButton();
txtInput = new javax.swing.JTextField();
txtOutput = new javax.swing.JTextField();


setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jLabel1.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
jLabel1.setForeground(new java.awt.Color(204, 0, 51));
jLabel1.setText("Your expression here:");
jLabel2.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
jLabel2.setForeground(new java.awt.Color(0, 102, 102));
jLabel2.setText("The result is here:");
btnCal.setFont(new java.awt.Font("Tahoma", 1, 20)); // NOI18N
btnCal.setForeground(new java.awt.Color(153, 153, 0));
btnCal.setText("Calculate");
TÍNH BIỂU THỨC SỐ LỚN 15
LẬP TRÌNH PHÂN TÁN NHÓM 1
btnCal.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent
evt) {
btnCalActionPerformed(evt);
}
});
txtInput.setFont(new java.awt.Font("Tahoma", 0, 14)); //
NOI18N
txtInput.addFocusListener(new java.awt.event.FocusAdapter() {
public void focusGained(java.awt.event.FocusEvent evt) {
txtInputFocusGained(evt);
}
});
txtOutput.setFont(new java.awt.Font("Tahoma", 0, 14)); //
NOI18N
javax.swing.GroupLayout layout = new
javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);

layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment
.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(36, 36, 36)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment
.LEADING)
TÍNH BIỂU THỨC SỐ LỚN 16
LẬP TRÌNH PHÂN TÁN NHÓM 1
.addComponent(jLabel1)
.addComponent(jLabel2))
.addGap(18, 18, 18)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment
.LEADING, false)
.addComponent(txtInput)
.addComponent(txtOutput,
javax.swing.GroupLayout.DEFAULT_SIZE, 451, Short.MAX_VALUE)))
.addGroup(layout.createSequentialGroup()
.addGap(244, 244, 244)
.addComponent(btnCal)))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE))
);
layout.setVerticalGroup(


layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(25, 25, 25)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment
.BASELINE)
.addComponent(jLabel1)
.addComponent(txtInput,
javax.swing.GroupLayout.PREFERRED_SIZE, 60,
javax.swing.GroupLayout.PREFERRED_SIZE))

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment
.TRAILING)
.addGroup(layout.createSequentialGroup()
.addGap(53, 53, 53)
TÍNH BIỂU THỨC SỐ LỚN 17
LẬP TRÌNH PHÂN TÁN NHÓM 1

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment
.BASELINE)
.addComponent(jLabel2)
.addComponent(txtOutput,
javax.swing.GroupLayout.PREFERRED_SIZE, 60,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(102, Short.MAX_VALUE))
.addGroup(layout.createSequentialGroup()

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED,
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(btnCal)
.addGap(27, 27, 27))))
);
pack();
}// </editor-fold>//GEN-END:initComponents
private void txtInputFocusGained(java.awt.event.FocusEvent evt)
{//GEN-FIRST:event_txtInputFocusGained
// TODO add your handling code here:
txtInput.setText(null);
txtOutput.setText(null);
}//GEN-LAST:event_txtInputFocusGained
//Xu li chinh
private void btnCalActionPerformed(java.awt.event.ActionEvent evt)
{//GEN-FIRST:event_btnCalActionPerformed
// TODO add your handling code here:
char[] exp = txtInput.getText().toCharArray();
int count = exp.length;
String[] balanExpr = new String[10000];
TÍNH BIỂU THỨC SỐ LỚN 18
LẬP TRÌNH PHÂN TÁN NHÓM 1
char[] S = new char[10000];
int headBalan = 0;
int headS = 0;
String curNum = "";
/*Bat dau thuat toan Balan*/
for (char c : exp) {
if (Character.isDigit(c))
curNum += c;
else {
if (curNum.length() > 0)

balanExpr[headBalan++] = curNum;
curNum = "";
if (c == '*' || c == '(') {
S[headS++] = c;
continue;
}
if (c == ')') {
while (headS - 1 >= 0 && S[headS - 1] != '(')
{
balanExpr[headBalan++] =
Character.toString(S[headS - 1]);
headS ;
}
headS ;
continue;
}
if (c == '+' || c == '-') {
while (headS - 1 >= 0 && S[headS - 1] != '(')
{
TÍNH BIỂU THỨC SỐ LỚN 19
LẬP TRÌNH PHÂN TÁN NHÓM 1
balanExpr[headBalan++] =
Character.toString(S[headS - 1]);
headS ;
}
S[headS++] = c;
continue;
}
}
}

if (curNum.length() > 0)
balanExpr[headBalan++] = curNum;
while (headS - 1 >= 0) {
balanExpr[headBalan++] = Character.toString(S[headS -
1]);
headS ;
}
/*Ket thuc thuat toan Ba lan*/
/*Xu ly tinh bieu thuc*/
while (headBalan != 1) {
String[] tempBalan = new String[headBalan];
int headTemp = 0;
String[] A = new String[headBalan];
String[] B = new String[headBalan];
String[] phepToan = new String[headBalan];
int[] vitri = new int[headBalan];
int curCount = 0;
String allPhepToan = "*-+";
TÍNH BIỂU THỨC SỐ LỚN 20
LẬP TRÌNH PHÂN TÁN NHÓM 1
balanExpr[headBalan++] = "x";
balanExpr[headBalan++] = "x";
for (int i = 2; i < headBalan; i++) {
if (allPhepToan.contains(balanExpr[i]) && !
allPhepToan.contains(balanExpr[i - 1]) && !
allPhepToan.contains(balanExpr[i - 2])) {
A[curCount] = balanExpr[i - 2];
B[curCount] = balanExpr[i - 1];
phepToan[curCount] = balanExpr[i];
vitri[curCount] = headTemp;

curCount++;
i += 2;
}
else
tempBalan[headTemp] = balanExpr[i - 2];
headTemp++;
}
try
{
/*Danh sach cac bai toan nho can giai*/
for (int i = 0; i < curCount; i++)
{
int curVitri = vitri[i];

if (phepToan[i].equals("+"))
TÍNH BIỂU THỨC SỐ LỚN 21
LẬP TRÌNH PHÂN TÁN NHÓM 1
{
InterfaceCaculator
abc=(InterfaceCaculator)Naming.lookup("rmi://localhost/cal");
String num;
num=abc.Plus(A[i],B[i]);
tempBalan[curVitri] = num;
// System.out.println (A[i]+"+"+B[i]+"="
+num);
}
if (phepToan[i].equals("-"))
{
InterfaceCaculator
abc=(InterfaceCaculator)Naming.lookup("rmi://localhost/cal");

String num1;
num1=abc.Subtract(A[i],B[i]);
tempBalan[curVitri] = num1;
//System.out.println (A[i]+"-"+B[i]+"="
+num1);


}
if (phepToan[i].equals("*"))
{
InterfaceCaculator
abc=(InterfaceCaculator)Naming.lookup("rmi://localhost/cal");
String num2;
num2=abc.Multi(A[i],B[i]);
tempBalan[curVitri] = num2;
// System.out.println (A[i]+"*"+B[i]+"="
+num2);
}
TÍNH BIỂU THỨC SỐ LỚN 22
LẬP TRÌNH PHÂN TÁN NHÓM 1
}
}
catch(Exception e)
{
}
balanExpr = tempBalan;
headBalan = headTemp;
}
txtOutput.setText(balanExpr[0]);
}//GEN-LAST:event_btnCalActionPerformed

/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel
setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay
with the default look and feel.
* For details see
/>ml
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info :
javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {

javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
TÍNH BIỂU THỨC SỐ LỚN 23
LẬP TRÌNH PHÂN TÁN NHÓM 1
}
}
} catch (ClassNotFoundException ex) {

java.util.logging.Logger.getLogger(Client.class.getName()).log(java.ut
il.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {

java.util.logging.Logger.getLogger(Client.class.getName()).log(java.ut

il.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {

java.util.logging.Logger.getLogger(Client.class.getName()).log(java.ut
il.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {

java.util.logging.Logger.getLogger(Client.class.getName()).log(java.ut
il.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Client().setVisible(true);
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnCal;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
TÍNH BIỂU THỨC SỐ LỚN 24
LẬP TRÌNH PHÂN TÁN NHÓM 1
private javax.swing.JTextField txtInput;
private javax.swing.JTextField txtOutput;
// End of variables declaration//GEN-END:variables
}
2.5 THỰC THI CHƯƠNG TRÌNH.
Bước 1: Khởi động Server.

Bước 2: Chạy Client.
TÍNH BIỂU THỨC SỐ LỚN 25

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

Tải bản đầy đủ ngay
×