Phần I: LỜI MỞ ĐẦU
Chúng ta đang sống trong kỷ nguyên khoa học kỹ thuật hiện đại. Sự bùng nổ của ngành công nghệ thông tin nói riêng đã mang lại những bước đột phá mà ngay cả những người phát minh ra chúng cũng không thể hình dung ra được. Bởi sự phát triển của nó không chỉ mang lại giá trị mà nó vốn có mà nó kéo theo hàng loạt sự bùng nổ của các ngành khoa học khác. Điều đó đã được chứng tỏ trên thực tế trong thế kỷ qua.
Và bên trong sự phát triển của công nghệ thông tin không thể không nhắc đến sự phát triển và ra đời của hàng loạt các công cụ lập trình mới hết sức hữu hiệu trong đó có Java.Ngôn ngữ lập trình Java là một trong những chủ đề được đề cập đến nhiều nhất trong thế giới hiện nay, và logo của Java - một tách cà phê bốc khói, cùng các applet Java, tràn ngập khắp nơi trên World Wide Web. Tuy nhiên Java cũng không phải là ngẫu nhiên được xem là một sản phẩm của WWW từ nguyên thuỷ. Điều đầu tiên mà mọi người trải qua đối với Java là một hộp màu trắng nằm ngay giữa trang Web khi tải xuống một applet Java. Bạn sẽ thấy applet Java trong vô số các băng quảng cáo trên WWW, nó giúp các hình ảnh, âm thanh, và video trở nên hấp dẫn hơn, không độc quyền, và có thể làm theo yêu cầu. Applet Java được dùng làm cơ sở cho những giải pháp thương mại điện tử, cũng như để thực tô điểm cho những hiện trình ứng dụng hiện thực ảo bằng hình động và tương tác với người dùng. Để thấy được khả năng của Applet trong các ứng dụng thực tế chúng ta hãy cùng xem xét một chương trình ứng dụng sử dụng Applet để mô phỏng hoạt động của máy tính tay.
Phần II: NỘI DUNG
I. Cơ sở lý thuyết và công nghệ sử dụng.
Bài toán : Sử dụng Applet để mô tả hoạt động của máy tính tay.
1. Cơ sở lý thuyết.
a. Các thuật toán sử dụng:
Máy tính tay mà chúng ta vẫn hay sử dụng hỗ trợ khá nhiều cho việc tính toán các phép tính số học và đồng thời nó còn giúp chúng ta có thể giải được các phương trình bậc 1 , bậc 2 và cả hệ phương trình tuyến tính . Để thực hiện mô phỏng các chức năng trên của máy tính tay thông thường ở đây chúng tôi sử dụng các thuật toán : Thuật toán Gausse để giải hệ phương trình , thuật toán đổi hệ cơ số, .để cài đặt cho các chức năng của máy tính mà chúng tôi mô phỏng.
b. Ngôn ngữ sử dụng:
Như đã đề cập đến ở phần đầu, thì ngôn ngữ sử dụng của chúng tôi là ngôn ngữ Java mà cụ thể là sử dụng Applet của Java để cài đặt ứng dụng này.Trước khi đi vào trình bày các thành phần của Java và Applet mà chúng tôi sử dụng để thực hiện chương trình này chúng ta hãy cùng nhau tìm hiểu lý do tại sao chúng tôi sử dụng Java Applet mà không phải là Java Application để giải quyết bài toán này.
Thứ nhất, chúng ta cần phân biệt sự khác nhau giữa Java Application và Java Applet: Java Application là một chương trình độc lập mà bạn có thể chạy trên máy của mình. Còn Java Applet chỉ là một chương trình nhỏ hơn nhiều. Java Applet là những ứng dụng mini được phân phối trên Internet và chạy trong một trình duyệt Web hiểu Java. Các applet Java tăng cường cho trang Web khả năng tương tác phong phú hơn và tính đa phương tiện tốt hơn so với khi dùng HTML bình thường. Ở đây chúng tôi muốn hỗ trợ cho những ai lên Web mà có nhu cầu để tính toán chính vì vậy mà chúng tôi chọn Java Applet để thực hiện bài toán này và nhúng chúng vào trang Web.
Ở đây phần tạo các tao giao diện chúng tôi xây dựng các Button, các TextField ,các Label, các Menu bằng việc sử dụng thư viện JFC để có thể thu được một giao diện đẹp và dễ sử dụng đối với người dùng.
Việc thực hiện các phép toán sẽ được thực hiện qua các nút bấm , và kết quả sẽ được hiển thị trên các TextField tương ứng. Việc thực hiện các phép toán sẽ được cài đặt thông qua các lớp tương ứng.
2. Công nghệ sử dụng.
Công nghệ sử dụng ở trong đồ án này là công nghệ Java để tạo ra các Applet và sử dụng các IDE của Eclipse
Java, đó là một ngôn ngữ lập trình mới xuất hiện, một cuộc cách mạng trong công nghệ phần mềm. Trong mấy tháng nay, khi bạn lướt trên các trang web, vào các máy tìm kiếm, xem các nhóm thảo luận, đọc các báo, đâu đâu cũng thấy nhắc tới Java. Java không chỉ là một ngôn ngữ lập trình mà còn hơn thế nữa. Đó là cách suy nghĩ mới hoàn toàn về điện toán, ở nó có khả năng giúp cho nền công nghiệp máy tính phá vỡ sự thống trị của Wintel. ở nó có khả năng ghép nối mọi loại thiết bị vào mạng, nên chúng ta có thể tương tác với nhau theo những phương pháp mà trước đây chưa từng có.
Java được bắt đầu như một ý tưởng, một hy vọng là đến ngày nào đó, mọi thiết bị sẽ có thể nói được với nhau thông qua một hệ thống mạng. Hiện nay, với Java, chưa có nới nào tiếp cận được mục tiêu đó, nhưng nó đã làm cho các nhà biên soạn phần mềm suy nghĩ về những gì có thể đạt được.
Java mang cuộc sống đến cho WWW khi mà Web đã cho tiền thân của nó là Oak một viễn cảnh cuộc sống tốt đẹp hơn. Java đã được thấm sâu vào trong sự hiểu biết của nền công nghiệp này, còn nhanh hơn cả DOS hoặc Windows trong thời hoàng kim của chúng trước đây.
Nếu đã có thời gian làm việc trên Web với một Browser hiểu Java, chắc bạn sẽ muốn đưa thêm công nghệ tăng cường này vào các trang Web của mình. Nhưng tiêu khiển với các trang có sẵn có tăng cường Java mới chỉ được một nửa sự thú vị. Làm ra các applet rồi đưa vào trang Web của chính mình mới thực sự đúng điệu.
Bước đầu tiên là phải quyết định định các trang được tăng cường Java như thế nào, rồi sau đó mới đụng đến applet, công cụ sẽ làm cho các trang đó thành hiện thực. Điều chủ yếu, nếu không có các applet, “cơn khát” Java sẽ không thể nào thoả mãn được. Thực ra applet không phải là phương tiện duy nhất để tạo sinh động cho các trang Web của bạn bằng Java. Java Script, sẽ được trình bày chi tiết hơn trong phần III, cũng là một phương tiện bổ xung sống động Java . Tuy nhiên, Java Scrip chỉ như phần khuất chìm dưới nước của con thuyền applet, cũng là cà phê nhưng không phải là loại hảo hạng như applet.
II. Phân tích và thiết kế
1. Phân tích:
2. Thiết kế:
Quan hệ giữa các gói:
Các biểu đồ thành phần:
+ Gói view:
+ Gói equation:
24 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 2363 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Sử dụng Applet để mô tả hoạt động của máy tính tay, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Phần I: LỜI MỞ ĐẦU
Chúng ta đang sống trong kỷ nguyên khoa học kỹ thuật hiện đại. Sự bùng nổ của ngành công nghệ thông tin nói riêng đã mang lại những bước đột phá mà ngay cả những người phát minh ra chúng cũng không thể hình dung ra được. Bởi sự phát triển của nó không chỉ mang lại giá trị mà nó vốn có mà nó kéo theo hàng loạt sự bùng nổ của các ngành khoa học khác. Điều đó đã được chứng tỏ trên thực tế trong thế kỷ qua.
Và bên trong sự phát triển của công nghệ thông tin không thể không nhắc đến sự phát triển và ra đời của hàng loạt các công cụ lập trình mới hết sức hữu hiệu trong đó có Java.Ngôn ngữ lập trình Java là một trong những chủ đề được đề cập đến nhiều nhất trong thế giới hiện nay, và logo của Java - một tách cà phê bốc khói, cùng các applet Java, tràn ngập khắp nơi trên World Wide Web. Tuy nhiên Java cũng không phải là ngẫu nhiên được xem là một sản phẩm của WWW từ nguyên thuỷ. Điều đầu tiên mà mọi người trải qua đối với Java là một hộp màu trắng nằm ngay giữa trang Web khi tải xuống một applet Java. Bạn sẽ thấy applet Java trong vô số các băng quảng cáo trên WWW, nó giúp các hình ảnh, âm thanh, và video trở nên hấp dẫn hơn, không độc quyền, và có thể làm theo yêu cầu. Applet Java được dùng làm cơ sở cho những giải pháp thương mại điện tử, cũng như để thực tô điểm cho những hiện trình ứng dụng hiện thực ảo bằng hình động và tương tác với người dùng. Để thấy được khả năng của Applet trong các ứng dụng thực tế chúng ta hãy cùng xem xét một chương trình ứng dụng sử dụng Applet để mô phỏng hoạt động của máy tính tay.
Phần II: NỘI DUNG
Cơ sở lý thuyết và công nghệ sử dụng.
Bài toán : Sử dụng Applet để mô tả hoạt động của máy tính tay.
1. Cơ sở lý thuyết.
a. Các thuật toán sử dụng:
Máy tính tay mà chúng ta vẫn hay sử dụng hỗ trợ khá nhiều cho việc tính toán các phép tính số học và đồng thời nó còn giúp chúng ta có thể giải được các phương trình bậc 1 , bậc 2 và cả hệ phương trình tuyến tính . Để thực hiện mô phỏng các chức năng trên của máy tính tay thông thường ở đây chúng tôi sử dụng các thuật toán : Thuật toán Gausse để giải hệ phương trình , thuật toán đổi hệ cơ số, ….để cài đặt cho các chức năng của máy tính mà chúng tôi mô phỏng.
Ngôn ngữ sử dụng:
Như đã đề cập đến ở phần đầu, thì ngôn ngữ sử dụng của chúng tôi là ngôn ngữ Java mà cụ thể là sử dụng Applet của Java để cài đặt ứng dụng này.Trước khi đi vào trình bày các thành phần của Java và Applet mà chúng tôi sử dụng để thực hiện chương trình này chúng ta hãy cùng nhau tìm hiểu lý do tại sao chúng tôi sử dụng Java Applet mà không phải là Java Application để giải quyết bài toán này.
Thứ nhất, chúng ta cần phân biệt sự khác nhau giữa Java Application và Java Applet: Java Application là một chương trình độc lập mà bạn có thể chạy trên máy của mình. Còn Java Applet chỉ là một chương trình nhỏ hơn nhiều. Java Applet là những ứng dụng mini được phân phối trên Internet và chạy trong một trình duyệt Web hiểu Java. Các applet Java tăng cường cho trang Web khả năng tương tác phong phú hơn và tính đa phương tiện tốt hơn so với khi dùng HTML bình thường. Ở đây chúng tôi muốn hỗ trợ cho những ai lên Web mà có nhu cầu để tính toán chính vì vậy mà chúng tôi chọn Java Applet để thực hiện bài toán này và nhúng chúng vào trang Web.
Ở đây phần tạo các tao giao diện chúng tôi xây dựng các Button, các TextField ,các Label, các Menu bằng việc sử dụng thư viện JFC để có thể thu được một giao diện đẹp và dễ sử dụng đối với người dùng.
Việc thực hiện các phép toán sẽ được thực hiện qua các nút bấm , và kết quả sẽ được hiển thị trên các TextField tương ứng. Việc thực hiện các phép toán sẽ được cài đặt thông qua các lớp tương ứng.
2. Công nghệ sử dụng.
Công nghệ sử dụng ở trong đồ án này là công nghệ Java để tạo ra các Applet và sử dụng các IDE của Eclipse
Java, đó là một ngôn ngữ lập trình mới xuất hiện, một cuộc cách mạng trong công nghệ phần mềm. Trong mấy tháng nay, khi bạn lướt trên các trang web, vào các máy tìm kiếm, xem các nhóm thảo luận, đọc các báo, đâu đâu cũng thấy nhắc tới Java. Java không chỉ là một ngôn ngữ lập trình mà còn hơn thế nữa. Đó là cách suy nghĩ mới hoàn toàn về điện toán, ở nó có khả năng giúp cho nền công nghiệp máy tính phá vỡ sự thống trị của Wintel. ở nó có khả năng ghép nối mọi loại thiết bị vào mạng, nên chúng ta có thể tương tác với nhau theo những phương pháp mà trước đây chưa từng có.
Java được bắt đầu như một ý tưởng, một hy vọng là đến ngày nào đó, mọi thiết bị sẽ có thể nói được với nhau thông qua một hệ thống mạng. Hiện nay, với Java, chưa có nới nào tiếp cận được mục tiêu đó, nhưng nó đã làm cho các nhà biên soạn phần mềm suy nghĩ về những gì có thể đạt được.
Java mang cuộc sống đến cho WWW khi mà Web đã cho tiền thân của nó là Oak một viễn cảnh cuộc sống tốt đẹp hơn. Java đã được thấm sâu vào trong sự hiểu biết của nền công nghiệp này, còn nhanh hơn cả DOS hoặc Windows trong thời hoàng kim của chúng trước đây.
Nếu đã có thời gian làm việc trên Web với một Browser hiểu Java, chắc bạn sẽ muốn đưa thêm công nghệ tăng cường này vào các trang Web của mình. Nhưng tiêu khiển với các trang có sẵn có tăng cường Java mới chỉ được một nửa sự thú vị. Làm ra các applet rồi đưa vào trang Web của chính mình mới thực sự đúng điệu.
Bước đầu tiên là phải quyết định định các trang được tăng cường Java như thế nào, rồi sau đó mới đụng đến applet, công cụ sẽ làm cho các trang đó thành hiện thực. Điều chủ yếu, nếu không có các applet, “cơn khát” Java sẽ không thể nào thoả mãn được. Thực ra applet không phải là phương tiện duy nhất để tạo sinh động cho các trang Web của bạn bằng Java. Java Script, sẽ được trình bày chi tiết hơn trong phần III, cũng là một phương tiện bổ xung sống động Java . Tuy nhiên, Java Scrip chỉ như phần khuất chìm dưới nước của con thuyền applet, cũng là cà phê nhưng không phải là loại hảo hạng như applet.
Phân tích và thiết kế
Phân tích:
Thiết kế:
Quan hệ giữa các gói:
Các biểu đồ thành phần:
+ Gói view:
+ Gói equation:
+ Gói mathExpression:
+ Gói linearSystem:
+ Gói otherFunction:
Các biểu đồ lớp:
+ Gói view:
+ Gói mathExpression:
+ Gói linearSystem:
+ Gói equation:
+ Gói otherFunction:
Lập trình:
Sinh mã (xem source code).PHẦN III. GIAO DIỆN VÀ CÁCH SỬ DỤNG
1. Giao diện trong chương trình:
+ Menu:
* Các khung nhìn:
+ Giao diện máy tính tay:
+ Tính giá trị biểu thức toán học:
+ Giải phương trình bậc 1 và 2:
+ Giải hệ tuyến tính:
+ Đổi hệ cơ số:
2. Hướng dẫn sử dụng:
Xem file HTML đính kèm.Phần IV. KẾT LUẬN
Trên đây chỉ là một ứng dụng rất nhỏ mà Java Applet có thể thực hiện được. Trên thực tế chúng ta hoàn toàn có thể sử dụng Java Applet để thực hiện những bài toán lớn hơn.Chúng tôi hy vọng rằng với bài toán nhỏ này có thể giúp người sử dụng nó cảm thấy hài lòng và phần nào hiểu được những ích lợi mà Java Applet đem lại cũng như hiểu được thế mạnh của nó trong việc hỗ trợ cho các trang Web trở lên sinh động hơn.Vì thời gian và kiến thức chưa cho phép nên chúng tôi chưa thực hiện hết những chức năng mà chúng tôi mong muốn có thể hỗ trợ cho người dùng như: giải các phương trình bậc cao hơn hai, và các hệ phương trình tuyến tính n ẩn.(n>5)…. Chính vì vậy, trong tương lai, chúng tôi hi vọng có thể có điều kiện phát triển chương trình này để có thể hỗ trợ cho người dùng nhiều hơn nữa.
Cuối cùng, chúng tôi xin chân thành cảm ơn thầy giáo Phạm Văn Hùng và thầy giáo Võ Sỹ Nam đã giúp đỡ chúng tôi hoàn thành đồ án này .!
Nhóm thực hiện: Vũ Mạnh Cường(Trưởng nhóm)
Nguyễn Thị Hồng Chi
PHỤ LỤC
Một số mã nguồn chính:
-- File ExprDef.java --
/* Định nghĩa dạng và kiểm tra tính hợp lệ của biểu thực toán */
package mathExpression;
import mathExpression.ExprException;
public class ExprDef{
//-------------- Constructor ----------------------------------------------
public ExprDef(){
}
public ExprDef(String definition){
setDefinition(definition);
}
//-------------- Pubic interface ------------------------------------------
public void setDefinition(String definition){
this.definition = definition;
}
public String getDefinition(){
return definition;
}
public boolean parse() throws ExprException {
pos = beginPos = 0;
endPos = definition.length();
parseDefinition();
return true;
}
public boolean parse(int beginPos, int endPos) throws ExprException {
pos = this.beginPos = beginPos;
this.endPos = endPos;
this.parseDefinition();
return true;
}
//-------------- Data -----------------------------------------------------
protected String definition; // The original definition of the expression,
// as passed to the constructor.
protected static final byte // values for code array; values >= 0 are indices into constants array
PLUS = -1, MINUS = -2, TIMES = -3, DIVIDE = -4, POWER = -5,
SIN = -6, COS = -7, TAN = -8, COT = -9, SEC = -10,
CSC = -11, ARCSIN = -12, ARCCOS = -13, ARCTAN = -14, EXP = -15,
LN = -16, LOG10 = -17, LOG2 = -18, ABS = -19, SQRT = -20,
ASIN = -21, ACOS = -22, ATAN = -23, ACOT = -24,
SINH = -25, COSH = -26, TANH = -27, COTH = -28,
CEIL = -29, FLOOR = -30, ROUND = -31, SQR = -32,
UNARYMINUS = -33, VARIABLE = -34 ;
protected static String[] functionNames = // names of standard functions, used during parsing
{ "sin", "cos", "tan", "cot", "sec",
"csc", "arcsin", "arccos", "arctan", "exp",
"ln", "log10", "log2", "abs", "sqrt",
"asin", "acos", "atan", "acot",
"sinh", "cosh", "tanh", "coth",
"ceil", "floor", "round", "sqr" };
protected static String[] constantNames = // names of constants: E, PI
{ "e", "pi" };
protected static double[] constantValues = // values of constants
{ Math.E, Math.PI };
protected int pos = 0; // data for use during parsing
protected int beginPos = 0; // position starting to parse
protected int endPos = 0; // position ending of parse
//-------------- Implementation -------------------------------------------
private void parseDefinition() throws ExprException { // Parse the definition and produce all
// the data that represents the expression
// internally; can throw IllegalArgumentException
if (definition == null || definition.trim().equals(""))
throw new ExprException(0,0,"Illegal math expression!");
parseExpression();
skip();
if (next() != 0)
throw new ExprException(pos,pos,"Extra data found after the end of the expression.");
}
protected char next() { // return next char in data or 0 if data is all used up
if (pos >= endPos)
return 0;
else
return definition.charAt(pos);
}
protected void skip() { // skip over white space in data
while(Character.isSpace(next()))
++pos;
}
// remaining routines do a standard recursive parse of the expression
private void parseExpression() throws ExprException {
boolean neg = false;
skip();
if (next() == '+' || next() == '-') {
neg = (next() == '-');
++pos;
skip();
}
parseTerm();
skip();
while (next() == '+' || next() == '-') {
char op = next();
++pos;
parseTerm();
skip();
}
}
private void parseTerm() throws ExprException {
parseFactor();
skip();
while (next() == '*' || next() == '/') {
char op = next();
++pos;
parseFactor();
skip();
}
}
private void parseFactor() throws ExprException {
parsePrimary();
skip();
while (next() == '^') {
++pos;
parsePrimary();
skip();
}
}
private void parsePrimary() throws ExprException {
skip();
char ch = next();
if (ch == 'x' || ch == 'X') {
++pos;
}
else if (Character.isLetter(ch))
parseWord();
else if (Character.isDigit(ch) || ch == '.')
parseNumber();
else if (ch == '(') {
++pos;
parseExpression();
skip();
if (next() != ')')
throw new ExprException(pos,pos,"Expected a right parenthesis.");
++pos;
}
else if (ch == ')')
throw new ExprException(pos,pos,"Unmatched right parenthesis.");
else if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '^')
throw new ExprException(pos,pos,"Operator '" + ch + "' found in an unexpected position.");
else if (ch == 0)
throw new ExprException(pos,pos,"Unexpected end of data in the middle of an expression.");
else
throw new ExprException(pos,pos,"Illegal character '" + ch + "' found in data.");
}
private void parseWord() throws ExprException {
String w = "";
int curpos = pos;
while (Character.isLetterOrDigit(next())) {
w += next();
++pos;
}
w = w.toLowerCase();
for (int i = 0; i < functionNames.length; i++) {
if (w.equals(functionNames[i])) {
skip();
if (next() != '(')
throw new ExprException(pos,(pos+w.length()-1),"Function name '" + w + "' must be followed by its parameter in parentheses.");
++pos;
parseExpression();
skip();
if (next() != ')')
throw new ExprException(pos,pos,"Missing right parenthesis after parameter of function '" + w + "'.");
++pos;
return;
}
}
pos = curpos;
parseConstant();
}
private void parseConstant() throws ExprException {
String w = "";
char ch = next();
while (isNotOperator(ch) && Character.isLetterOrDigit(ch)) {
w += ch;
++pos;
ch = next();
}
w = w.toLowerCase();
for (int i = 0; i < constantNames.length; i++) {
if (w.equals(constantNames[i])) {
return;
}
}
throw new ExprException(pos,(pos+w.length()-1),"Unknown word '" + w + "' found in data.");
}
private boolean parseNumber() throws ExprException {
String w = "";
while (Character.isDigit(next())) {
w += next();
++pos;
}
if (next() == '.') {
w += next();
++pos;
while (Character.isDigit(next())) {
w += next();
++pos;
}
}
if (w.equals("."))
throw new ExprException(pos,pos,"Illegal number found, consisting of decimal point only.");
if (next() == 'E' || next() == 'e') {
w += next();
++pos;
if (next() == '+' || next() == '-') {
w += next();
++pos;
}
if (! Character.isDigit(next()))
throw new ExprException(pos,pos,"Illegal number found, with no digits in its exponent.");
while (Character.isDigit(next())) {
w += next();
++pos;
}
}
double d = Double.NaN;
try {
d = Double.valueOf(w).doubleValue();
}
catch (Exception e) {
}
if (Double.isNaN(d))
throw new ExprException(pos,pos,"Illegal number found, with no digits in its exponent.");
return true;
}
protected boolean isNotOperator(char ch){
if (ch == '^' || ch == '*' || ch == '/' || ch == '+' || ch == '-' || ch == ')'){
return false;
}
else return true;
}
} // class ExprDef
-- File Expr.java --
/* Tính giá trị biểu thức toán */
package mathExpression;
import mathExpression.ExprException;
import mathExpression.ExprDef;
public class Expr extends ExprDef {
//-------------- Constructor ----------------------------------------------
public Expr(){
}
public Expr(String definition){
ExprDef:setDefinition(definition);
}
//-------------- Pubic interface ------------------------------------------
public double value(double x) throws ExprException {
initAllStacks();
pos = beginPos = 0;
endPos = definition.length();
parseDefinition();
return eval(x);
}
public double value(int beginPos, int endPos, double x) throws ExprException {
initAllStacks();
pos = this.beginPos = beginPos;
this.endPos = endPos;
parseDefinition();
return eval(x);
}
//-------------- Data -----------------------------------------------------
private byte[] code; // A translated version of the expression, containing
// stack operations that compute the value of the expression.
private double[] stack; // A stack to be used during the evaluation of the expression.
private double[] constants; // An array containing all the constants found in the expression.
private int constantCt, codeSize; // data for use during parsing
//-------------- Implementation -------------------------------------------
private void initAllStacks(){
code = new byte[0];
stack = new double[0];
constants = new double[0];
constantCt = 0;
codeSize = 0;
}
private double eval(double variable) throws ExprException { // evaluate this expression for this value of the variable
try {
int top = 0;
for (int i = 0; i < codeSize; i++) {
if (code[i] >= 0)
stack[top++] = constants[code[i]];
else if (code[i] >= POWER) {
double y = stack[--top];
double x = stack[--top];
double ans = Double.NaN;
switch (code[i]) {
case PLUS: ans = x + y; break;
case MINUS: ans = x - y; break;
case TIMES: ans = x * y; break;
case DIVIDE: ans = x / y; break;
case POWER: ans = Math.pow(x,y); break;
}
if (Double.isNaN(ans))
throw new ExprException(-1,0,"Divide by zero!");
stack[top++] = ans;
}
else if (code[i] == VARIABLE) {
stack[top++] = variable;
}
else {
double x = stack[--top];
double ans = Double.NaN;
switch (code[i]) {
case SIN: ans = Math.sin(x); break;
case COS: ans = Math.cos(x); break;
case TAN: ans = Math.tan(x); break;
case COT: ans = Math.cos(x)/Math.sin(x); break;
case SEC: ans = 1.0/Math.cos(x); break;
case CSC: ans = 1.0/Math.sin(x); break;
case ARCSIN: if (Math.abs(x) <= 1.0) ans = Math.asin(x); break;
case ARCCOS: if (Math.abs(x) <= 1.0) ans = Math.acos(x); break;
case ARCTAN: ans = Math.atan(x); break;
case EXP: ans = Math.exp(x); break;
case LN: if (x > 0.0) ans = Math.log(x); break;
case LOG2: if (x > 0.0) ans = Math.log(x)/Math.log(2); break;
case LOG10: if (x > 0.0) ans = Math.log(x)/Math.log(10); break;
case ABS: ans = Math.abs(x); break;
case SQRT: if (x >= 0.0) ans = Math.sqrt(x); break;
case UNARYMINUS: ans = -x; break;
case ASIN: ans = Math.asin(x); break;
case ACOS: ans = Math.acos(x); break;
case ATAN: ans = Math.atan(x); break;
case ACOT: ans = Math.acos(x)/Math.asin(x); break;
case CEIL: ans = Math.ceil(x); break;
case FLOOR: ans = Math.floor(x); break;
case SINH: ans = Math.sinh(x); break;
case COSH: ans = Math.cosh(x); break;
case TANH: ans = Math.tanh(x); break;
case COTH: ans = Math.cosh(x)/Math.sinh(x); break;
case ROUND: ans = Math.round(x); break;
case SQR: ans = Math.pow(x,2); break;
}
if (Double.isNaN(ans))
throw new ExprException(-1,0,"Divide by zero!");
stack[top++] = ans;
}
}
}
catch (Exception e) {
throw new ExprException(-1,0,"Divide by zero!");
}
if (Double.isInfinite(stack[0]))
throw new ExprException(-1,0,"Divide by zero!");
else
return stack[0];
}
private int computeStackUsage() { // call after code[] is computed
int s = 0; // stack size after each operation
int max = 0; // maximum stack size seen
for (int i = 0; i < codeSize; i++) {
if (code[i] >= 0 || code[i] == VARIABLE) {
s++;
if (s > max)
max = s;
}
else if (code[i] >= POWER)
s--;
}
return max;
}
private void parseDefinition() throws ExprException { // Parse the definition and produce all
// the data that represents the expression
// internally; can throw IllegalArgumentException
if (definition == null || definition.trim().equals(""))
throw new ExprException(0,0,"Illegal math expression!");
code = new byte[definition.length()];
constants = new double[definition.length()];
parseExpression();
skip();
if (next() != 0)
throw new ExprException(pos,pos,"Extra data found after the end of the expression.");
int stackSize = computeStackUsage();
stack = new double[stackSize];
byte[] c = new byte[codeSize];
System.arraycopy(code,0,c,0,codeSize);
code = c;
double[] A = new double[constantCt];
System.arraycopy(constants,0,A,0,constantCt);
constants = A;
}
// remaining routines do a standard recursive parse of the expression
private void parseExpression() throws ExprException {
boolean neg = false;
skip();
if (next() == '+' || next() == '-') {
neg = (next() == '-');
pos++;
skip();
}
parseTerm();
if (neg)
code[codeSize++] = UNARYMINUS;
skip();
while (next() == '+' || next() == '-') {
char op = next();
pos++;
parseTerm();
code[codeSize++] = (op == '+')? PLUS : MINUS;
skip();
}
}
private void parseTerm() throws ExprException {
parseFactor();
skip();
while (next() == '*' || next() == '/') {
char op = next();
pos++;
parseFactor();
code[codeSize++] = (op == '*')? TIMES : DIVIDE;
skip();
}
}
private void parseFactor() throws ExprException {
parsePrimary();
skip();
while (next() == '^') {
pos++;
parsePrimary();
code[codeSize++] = POWER;
skip();
}
}
private void parsePrimary() throws ExprException {
skip();
char ch = next();
if (ch == 'x' || ch == 'X') {
pos++;
code[codeSize++] = VARIABLE;
}
else if (Character.isLetter(ch))
parseWord();
else if (Character.isDigit(ch) || ch == '.')
parseNumber();
else if (ch == '(') {
pos++;
parseExpression();
skip();
if (next() != ')')
throw new ExprException(pos,pos,"Expected a right parenthesis.");
pos++;
}
else if (ch == ')')
throw new ExprException(pos,pos,"Unmatched right parenthesis.");
else if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '^')
throw new ExprException(pos,pos,"Operator '" + ch + "' found in an unexpected position.");
else if (ch == 0)
throw new ExprException(pos,pos,"Unexpected end of data in the middle of an expression.");
else
throw new ExprException(pos,pos,"Illegal character '" + ch + "' found in data.");
}
private void parseWord() throws ExprException {
String w = "";
int curpos = pos;
while (Character.isLetterOrDigit(next())) {
w += next();
pos++;
}
w = w.toLowerCase();
for (int i = 0; i < functionNames.length; i++) {
if (w.equals(functionNames[i])) {
skip();
if (next() != '(')
throw new ExprException(pos,(pos+w.length()-1),"Function name '" + w + "' must be followed by its parameter in parentheses.");
pos++;
parseExpression();
skip();
if (next() != ')')
throw new ExprException(pos,pos,"Missing right parenthesis after parameter of function '" + w + "'.");
pos++;
code[codeSize++] = (byte)(SIN - i);
return;
}
}
pos = curpos;
parseConstant();
}
private void parseConstant() throws ExprException {
String w = "";
char ch = next();
while (isNotOperator(ch) && Character.isLetterOrDigit(ch)) {
w += ch;
pos++;
ch = next();
}
w = w.toLowerCase();
for (int i = 0; i < constantNames.length; i++) {
if (w.equals(constantNames[i])) {
code[codeSize++] = (byte)constantCt;
constants[constantCt++] = constantValues[i];
return;
}
}
throw new ExprException(pos,(pos+w.length()-1),"Unknown word '" + w + "' found in data.");
}
private boolean parseNumber() throws ExprException {
String w = "";
while (Character.isDigit(next())) {
w += next();
pos++;
}
if (next() == '.') {
w += next();
pos++;
while (Character.isDigit(next())) {
w += next();
pos++;
}
}
if (w.equals("."))
throw new ExprException(pos,pos,"Illegal number found, consisting of decimal point only.");
if (next() == 'E' || next() == 'e') {
w += next();
pos++;
if (next() == '+' || next() == '-') {
w += next();
pos++;
}
if (! Character.isDigit(next()))
throw new ExprException(pos,pos,"Illegal number found, with no digits in its exponent.");
while (Character.isDigit(next())) {
w += next();
pos++;
}
}
double d = Double.NaN;
try {
d = Double.valueOf(w).doubleValue();
}
catch (Exception e) {
}
if (Double.isNaN(d))
throw new ExprException(pos,pos,"Illegal number found, with no digits in its exponent.");
code[codeSize++] = (byte)constantCt;
constants[constantCt++] = d;
return true;
}
} // clas Expr
Các file đính kèm theo tài liệu này:
- Sử dụng Applet để mô tả hoạt động của máy tính tay.DOC