Đồ án Xây Dựng Phần Mềm Ứng Dụng Máy Tính Khoa Học cho Điện Thoại Cầm Tay Thông Minh chạy trên hệ điều hành Android

MỤC LỤC

 

 

TRÍCH YẾU 1

LỜI CẢM ƠN 2

NHẬP ĐỀ 3

MỤC LỤC 4

MÔ TẢ YÊU CẦU ĐỀ TÀI 5

YÊU CẦU ĐỒ ÁN 6

NỘI DUNG BÁO CÁO 8

I. THUẬT TOÁN CHUYÊN DỤNG 8

1. Calculator: 8

2. Smartphone: 8

3. Sơ lược hệ điều hành Android: 8

II. PHÂN TÍCH CHƯƠNG TRÌNH 9

1. Mô tả chức năng 9

LƯU ĐỒ KÍ PHÁP BALAN 12

LƯU ĐỒ THUẬT TOÁN ĐỘ ƯU TIÊN 18

LƯU ĐỒ GIẢI THUẬT CỘNG, TRỪ 22

I. Lưu đồ giải thuật đưa các trường hợp đặc biệt của cộng trừ thành dạng đơn giản 22

II. Lưu đồ giải thuật thực hiện việc cân bằng số chữ số đàng trước vào sau dấu chấm động 23

III. Lưu đồ giải thuật phép cộng 24

IV. Lưu đồ giải thuật phép trừ 25

V. Đánh giá kết quả 46

- Hàm căn bậc hai phục vụ cho giải phương trinh bậc 2 47

III. NHỮNG KỶ THUẬT VÀ HƯỚNG MỞ RỘNG CỦA CHƯƠNG TRÌNH 48

1. Những kĩ thuật và công nghệ đã áp dụng trong chương trình 48

2. Hướng mở rộng chương trình 48

KẾT LUẬN 49

TÀI LIÊU THAM KHẢO 50

 

 

doc51 trang | Chia sẻ: netpro | Lượt xem: 2479 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Đồ án Xây Dựng Phần Mềm Ứng Dụng Máy Tính Khoa Học cho Điện Thoại Cầm Tay Thông Minh chạy trên hệ điều hành Android, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
từ những yêu cầu được phân tích như trên. Xây dựng được một phần mềm ứng dụng như một máy tính khoa học thực thụ sẽ không đơn giản. Cho nên mức độ yêu cầu của đề tài chỉ bao gồm những phép toán và hàm đơn giản. Đồng thời ứng dụng được giới hạn chỉ cho máy điện thoại cầm tay thông minh do màn hình (lớn, cảm ứng, …) của chúng sẽ cho phép thiết kế và xây dựng một giao diện phức tạp đa năng, và bộ xử lý của chúng đủ mạnh để tính toán bài toán phức tạp (phát sinh từ việc không có bộ xử lý tính dấu phẩy động) nhằm đáp ứng được yêu cầu của đề tài. YÊU CẦU ĐỒ ÁN Xây dựng được giao diện (graphics interface) cho ứng dụng trên nền tảng Android tương tự như hình sau: Nhập và xử lý biểu thức: Cho phép nhập biểu thức dùng dạng mẩu (inputting expression using standard format) như của một máy tính khoa học thực sự. Ví dụ có thể nhập biểu thức: 2*(3.6 + log(5 + 3÷4.1) – sin(29.7)) – e2.7 sin Nhập hàm: tự động thêm dấu ngoặc mở khi nhập hàm. Ví dụ nhấn hàm sẽ thể hiện sin( trong biểu thức Cho phép bỏ dấu nhân (*) trong các trường hợp sau: Trước dấu ngoặc mở ‘(‘. Ví dụ: 2*(3.6 + 5.6) → 2(3.6 + 5.6) Trước hàm có dấu ngoặc mở: 2.0*sin(30) → 2.0sin(30) Trước một biến số, hằng số: 2A, 2y, 2π, … Sửa chửa biểu thức: có thể di chuyển con trỏ (cursor) để xóa/thêm trên biểu thức Các phép tính cơ bản cộng +, trừ -, nhân *, chia ÷ Các phép tính với các hàm: x2, x3, 1/x, n!, ln (log cơ số e), log (log cơ số 10), 10x, ex, sin, cos, tan, Abs, xy, sinh, cosh, tanh Các phép tính với các hàm: sin-1, cos-1, tan-1, sinh-1, cosh-1, tanh-1 Có thể dùng degree hay radians cho các hàm lượng giác (trigonometry) Các phép tính dựa trên nền sáu mươi (sexagesminal) của độ, phút, giây. Các phép tính cơ bản cho Base-N (hex, dec, oct, bin) Giải các phương trình: Ax + B = 0 Ax2 + Bx + C = 0 Giải hệ hai phương trình với hai ẩn số Gọi và dùng lại nội dung của (ít nhất năm) biểu thức tính toán cũ Biểu thị kết quả: Dạng số thập phân (decimal number), ví dụ 100÷7 = 14.2857142857142857142. Có thể xác định số chữ số thập phân (decimal place) của kết quả, ví dụ 100÷7 = 14.286 với 3 chữ số thập phân Dạng số khoa học (scientific number) ví dụ 100÷7 = 1.42857142857142857142E+01. Đồng thời cũng có thể xác định số chữ số có nghĩa (significant digits) của kết quả, ví dụ 100÷7 = 1.4286E+01 với 5 số chữ số có nghĩa Hướng dẫn sử dụng NỘI DUNG BÁO CÁO THUẬT TOÁN CHUYÊN DỤNG Calculator: Microsoft Calculator, hay còn gọi là Calculatortheo tiêu đề mà chương trình hiển thị, là một ứng dụng tính toán đi kèm trong tất cả các phiên bản của hệ điều hành Microsoft Windows. Chương trình có thể kích hoạt bằng lệnh "calc" trên phần lớn hệ thống Windows Smartphone: Smartphone, hay còn gọi là điện thoại thông minh, là sự kết hợp của một chiếc điện thoại và một PDA. Smartphone ưu việt hơn điện thoại thông thường ở chỗ nó được tích hợp thêm các tính năng văn phòng hỗ trợ người dùng. Ngoài ra, nếu so với PDA phone thì smartphone lại có tính ổn định về chức năng thoại và kết nối mạng tốt hơn Sơ lược hệ điều hành Android: Android là hệ điều hành trên điện thoại di động (và hiện nay là cả trên một số đầu phát HD, HD Player) phát triển bởi Google và dựa trên nền tảng Linux. Trước đây, Android được phát triển bởi công ty liên hợp Android ( sau đó được Google mua lại vào năm 2005). Theo NPD, thiết bị di động sử dụng hệ điều hành android bán được tại Mỹ trong quý II năm 2010 xếp vị trí đầu tiên với 33%, thứ 2 là BB os với 28% và iOS ở vị trí thứ 3 với 22%. Android có một cộng đồng những nhà phát triển rất lớn viết các ứng dụng cho hệ điều hành của mình.Hiện tại có khoảng 70,000 ứng dụng cho Android os và vào khoảng 100,000 ứng dụng đã được đệ trình, điều này khiến Android trở thành hệ điều hành di động có môi trường phát triển lớn thứ 2. Các nhà phát triển viết ứng dụng cho Android dựa trên ngôn ngữ Java. Sự ra mắt của Android vào ngày 5 tháng 11 năm 2007 gắn với sự thành lập của liên minh thiết bị cầm tay mã nguồn mở, bao gồm 78 công ty phần cứng, phần mềm và viễn thông nhằm mục đính tạo nên một chuẩn mở cho điện thoại di động trong tương lai. Google công bố hầu hết các mã nguồn của Android theo bản cấp phép Apache. Hệ điều hành Android bao gồm 12 triệu dòng mã; 3 triệu dòng XML, 2.8 triệu dòng mã C, 2.1 triệu mã Java và 1.75 triệu dòng mã C++ PHÂN TÍCH CHƯƠNG TRÌNH Mô tả chức năng Chức năng xử lý biểu thức: Giới thiệu Bình thường, để viết một biểu thức tổng 2 số, ta viết a + b. Cách viết này gọi là trung tố (infix). Bởi vì dấu + (ta gọi là toán tử) nằm ở giữa a, b (toán hạng). Một biểu thức phức tạp hơn có thể ở dạng (a + b) * c. Ký pháp Nghịch đảo Ba Lan (Reversed Polish Notation - RPN) là dạng biểu thức hậu tố (postfix), nghĩa là toán tử nằm sau toán hạng. Theo đó, biểu thức a + b viết thành a b +; biểu thức (a + b) * c sẽ viết thành a b + c *. Phương pháp này giúp loại bỏ dấu ngoặc trong các biểu thức, cũng như không phải lưu ý tới mức ưu tiên toán tử (operator precedence). RPN là một phương tiện tốt giúp máy tính "đọc" được các biểu thức toán học, từ đó tính ra giá trị. Vậy, khi ta nhập một biểu thức toán vào một chương trình tính giá trị biểu thức, nó sẽ chuyển biểu thức về dạng RPN, sau đó mới tính toán. Toán tử nhị phân & Toán tử đơn phân: Một toán tử gọi là nhị phân khi nó tác động lên 2 toán hạng, vậy cộng (+), trừ (-), nhân ( *), chia (/) và lũy thừa (^) là toán tử nhị phân. Một toán tử gọi là đơn phân khi nó chỉ tác động lên 1 toán hạng, vậy dấu âm (-) dương (+) là toán tử đơn phân. Trình tự chuyển đổi Trước hết là tạo ba mảng chuỗi, đặt tên là number, queueChar và Stack. Number chứa các toán tử,queueChar chứa các toán tử và và vị trí các toán hạng trong và sau lúc chuyển đổi. Stack tạm thời chứa các toán tử trong lúc chờ đưa vào queueChar. Ta theo một vòng lặp từ đầu cho tới cuối biểu thức, như sau: Nếu gặp toán hạng, push vào number và push vị trí của toán hạng đó vào queueChar. Nếu gặp dấu "(", push vào Stack. Nếu gặp dấu ")", lần lượt pop các toán tử trong Stack vào queueChar cho tới khi gặp dấu "(", bấy giờ pop dấu "(" ấy bỏ đi. Nếu gặp toán tử, tạm gọi là opCurrent, kiểm tra xem toán tử trên cùng của Stack có mức ưu tiên cao hơn hoặc bằng opCurrent hay không. Nếu có thì pop nó rồi push vào queueChar, cứ vậy hoài cho tới khi gặp một toán tử có mức ưu tiên nhỏ hơn opCurrent, hoặc khi Stack trống rỗng, thì dừng, bấy giờ push opCurrent vào Stack. Mức ưu tiên toán tử (thấp lên cao): dấu ngoặc < cộng, trừ < nhân chia < lũy thừa < dấu âm/dương (cộng trừ đơn phân). Cuối cùng, lần lượt pop các phần tử trong Stack và push vào queueChar cho tới hết. Ví Dụ: Biểu thức cần chuyển đổi: 3+4*2/(1-5) Chuỗi kí tự Thao tác Stack number queueChar Chuỗi hậu tố 3 Ghi 3 vào number 3 -0 3 + Push + vào Stack + 3 -0 3 4 Ghi 4 vào number + 3 4 -0 -1 -2 3 4 * Push * vào Stack + * 3 4 -0 -1 -2 3 4 2 Ghi 2 vào number + * 3 4 2 -0 -1 -2 3 4 2 / Lấy * ra khỏi stack, ghi vào queueChar, push / + / 3 4 2 -0 -1 -2 * 3 4 2 * ( Push (vào Stack + / ( 3 4 2 -0 -1 -2 * 3 4 2 * 1 Ghi 1 vào number + / ( 3 4 2 1 -0 -1 -2 * -3 3 4 2 * 1 - Push - vào Stack + / ( - 3 4 2 1 -0 -1 -2 * -3 3 4 2 * 1 5 Ghi 5 vào number + / ( - 3 4 2 1 5 -0 -1 -2 * -3 -4 3 4 2 * 1 5 ) Pop cho đến khi lấy được (, ghi các toán tử pop được ra number + / 3 4 2 1 5 -0 -1 -2 * -3 -4 - 3 4 2 * 1 5 - Pop tất cả các toán tử ra khỏi Stack và ghi vào queueChar 3 4 2 1 5 -0 -1 -2 * -3 -4 - / + 3 4 2 * 1 5 - / + Trình tự tính toán Tạo một ngăn xếp nữa gọi là StackTinh. Xét từng phần tử của queueChar, từ thấp lên cao (từ đầu về cuối). Nếu gặp toán hạng thì push vào StackTinh. Nếu gặp toán tử nhị phân, pop hai phần tử từ StackTinh, thực hiện phép toán, push kết quả trở lại StackTinh. Nếu gặp toán tử đơn phân, pop một phần tử từ StackTinh, thực hiện phép toán, push kết quả trở lại StackTinh. Kết quả cuối cùng là phần tử trên cùng của StackTinh. LƯU ĐỒ KÍ PHÁP BALAN Chức năng cộng, trừ , nhân, chia: Để cộng trừ nhân chia ta dùng hàm Priority(char x) với giá trị return=0 để kiểm tra toán hạng, Priority (char x) với giá trị return =2 cho toán tử ‘+’ và ‘-‘ giá trị return = 1 cho toán tử ‘*’ và ‘/’ để so sánh độ ưu tiên toán tử cuối cùng chuyển sang dạng hậu tố bằng hàm Convert () và tính kết quả bằng hàm tinhtoan(). LƯU ĐỒ THUẬT TOÁN ĐỘ ƯU TIÊN Cộng, trừ: Cho biểu thức: 2 – (3.1 + 2). Sau khi chuyển sang hậu tố bằng hàm Convert(); sẽ có dạng: 2 3.1 2+- Dùng hàm Pushstacktinh() để chuyển các toán hạng và các toán tử vào 2 mảng number[] và queueChar[] và ta sẽ được như sau: number[]={2,31,2} queueChar[]={-0,-,-1,+,-2} Mảng number[] chứa các toán hạng Mảng queueChar[] chứa các toán tử. Với phép toán cộng: Khi gặp phép “+” 2 toán hạng sẽ được chuyển vào 2 chuỗi bằng hàm pushStackTinh(char x[]); Vd: 3.45 + 65.2 Number [n][] = [‘3’,’.’,’4’,’5’] và Number[n+1][]= [‘6’,’5’,’.’,’2’] Với phép cộng ta có 4 trường hợp, cần phải đưa về dạng đơn giản nhất đó là a+b hoặc a-b : a + b à a + b -a + b à b - a a + -b à a - b -a + -b à a +b (dấu trừ thêm vào kết quả sau) Sau đó thực hiện phép cân bằng hai mảng a và b với hàm char *check_balance(char x[],char y[]); nhằm cân bằng hai mảng 03.45 + 65.20 Sau đó lần lượt cộng hay trừ từng phần tử tùy thuộc vào trường hợp từ 2 mảng vào mảng kq[] bằng hàm char *cong(char x[],char y[]) hoặc char *tru(char x[],char y[]) trong trường hợp này dung char *cong(char x[],char y[]) ta được kết quả: 68.65 Nếu trường hợp không cần thêm dấu trừ thì bỏ qua giao đoạn thêm dấu trừ sau đó hàm trả về chuỗi kq Code: public final double cong(String st1, String st2) { int sl, i; double so1, so2, kq; sl = ss(st1, st2); // so sanh vi tri cua dau cham dong so1 = Double.parseDouble(st1); so2 = Double.parseDouble(st2); for (i = 0; i < sl; i++) // nhan 10 de 2 so mat dau cham { so1 = so1 * 10; so2 = so2 * 10; } kq = so1 + so2; for (i = 0; i < sl; i++) // chia 10 de tra ve ket qua dung { kq = kq / 10; } return kq; } Với phép toán trừ: Khi gặp phép “-” 2 toán hạng sẽ được chuyển vào 2 chuỗi bằng hàmpushStackTinh(char x[]); Vd: 3.45 - 65.2 Number [n][] = [‘3’,’.’,’4’,’5’] và Number[n+1][]= [‘6’,’5’,’.’,’2’] Với phép trừ ta có 4 trường hợp, cần phải đưa về dạng đơn giản nhất đó là a+b hoặc a-b : a - b àa - b -a - b àa + b (dấu trừ thêm vào kết quả sau) a - -b àa + b -a - -b àb - a (dấu trừ thêm vào kết quả sau) Sau đó thực hiện phép cân bằng hai mảng a và b với hàm check_balance(); nhàm cân bằng hai mảng 03.45 - 65.20 Sau đó lần lượt cộng hay trừ từng phần tử tùy thuộc vào trường hợp từ 2 mảng vào mảng kq[] bằng hàm char *cong(char x[],char y[]) hoặc char *tru(char x[],char y[]) trong trường hợp này dùng char *tru(char x[],char y[]) Tại Hàm Char * tru, so Sánh từng phần tử [i] ở 2 mảng a và b nếu a[i]<b[i] thì sẽ hoán đổi vị trí và kết thúc quá trình trừ 2 mảng kết quả sẽ được thêm dấu ‘-‘ : 65.20 - 03.45 Kiểm Tra 2 chuỗi có phải số 0.0 hay không nếu một trong hai số là số 0.0 thì kết quả sẽ trả về giá trị còn lại mà không cần qua bước tính toán : Ví dụ: 0.000 - 4.123 à kq= -4.123 4.123 - 0.000 à kq=4.123 Thực hiện trừ lần lược từng phần tử từ hai chuỗi ta được kết quả: 61.75 Code: public final double tru(String st1, String st2) { int sl, i; double so1, so2, kq; sl = ss(st1, st2); // so sanh vi tri cua dau cham dong so1 = Double.parseDouble(st1); so2 = Double.parseDouble(st2); for (i = 0; i < sl; i++) // nhan 10 de 2 so mat dau cham { so1 = so1 * 10; so2 = so2 * 10; } kq = so1 - so2; for (i = 0; i < sl; i++) // chia 10 de tra ve ket qua dung { kq = kq / 10; } return kq; } LƯU ĐỒ GIẢI THUẬT CỘNG, TRỪ Lưu đồ giải thuật đưa các trường hợp đặc biệt của cộng trừ thành dạng đơn giản Lưu đồ giải thuật thực hiện việc cân bằng số chữ số đàng trước vào sau dấu chấm động Lưu đồ giải thuật phép cộng Lưu đồ giải thuật phép trừ Chức năng nhân, chia: Cho biểu thức: 2.1 * 3 / 4.22. Sau khi chuyển sang hậu tố bằng hàm Convert(); sẽ có dạng: 2.1 3 * 4.22 / Dùng hàm Pushstacktinh() để chuyển các toán hạng và các toán tử vào 2 mảng number[][] và queueChar[][] và ta sẽ được như sau: number[]={2,31,2} queueChar[]={-0,*,-1,/,2} Mảng number[] chứa các toán hạng Mảng queueChar[] chứa các toán tử. Với phép toán nhân: Khi gặp phép “*” 2 toán hạng sẽ được chuyển vào 2 chuỗi bằng hàm pushStackTinh(char x[]); Vd: 3.45 * 65.2 Number [n][] = [‘3’,’.’,’4’,’5’] và Number[n+1][]= [‘6’,’5’,’.’,’2’] Với phép nhân ta có 4 trường hợp, cần phải đưa về dạng đơn giản nhất đó là a*b a * b à a * b -a * b à a * b (dấu trừ thêm vào kết quả sau) a * -b à a * b (dấu trừ thêm vào kết quả sau) -a * -b à a * b (bỏ dấu trừ ) Sau đó thực hiện phép loại bỏ dấu chấm động ở mảng a và b với hàm char * check_balance1() để tính số kí tự cần lùi sau dấu phẩy là 2n khi có kết quả 65.2 * 3.456 65200 * 3456 Sau đó lần lượt vừa nhân từng phần tử từ mảng b[] cho mảng a[] vừa cộng dồn vào chuỗi kết quả một cách lần lượt ta có các mảng kq sau: 391200 326000 3651200 260800 29731200 195300 225331200 Chèn dấu chấm động vào vị trí 2n với n là số chữ số đằng sau dấu ‘.’ Bắt đầu từ vị trí cuối cùng đếm ngược về ta có được kết quả: 225.331200 Code: public final double nhan(String st1, String st2) { int vt1, vt2, i, kt1, kt2; double t, x, y; // Truong hop dat biet nhan 0 if (st1.charAt(0) == '0' && st1.length() == 1 || st2.charAt(0) = '0' && st2.length() == 1) { return 0; } kt1 = 0; kt2 = 0; vt1 = tim(st1); vt2 = tim(st2); // Lam mat dau tru truoc so am de tro thanh so duong if (st1.charAt(0) == '-') { st1=st1.substring(0, 0) + st1.substring(0 + 1); kt1 = 1; } if (st2.charAt(0) == '-') { st2=st2.substring(0, 0) + st2.substring(0 + 1); kt2 = 1; } //Truong hop dat biet nhan 1 if (st1.charAt(0) == '1' && st1.length() == 1 || st2.charAt(0) = '1' && st2.length() == 1) { x = Double.parseDouble(st1); y = Double.parseDouble(st2); t = x * y; if (kt1 == 1) { t = t * -1; } if (kt2 == 1) { t = t * -1; } return t; } //Bat dau xu ly nhan 2 so vt1 = tim(st1); vt2 = tim(st2); //Di chuyen dau cham dong if (vt1 > 1) { st1 = st1.substring(0, vt1) + st1.substring(vt1 + 1); st1 = new StringBuffer(st1).insert(1, ".").toString(); } if (vt2 > 1) { st2 = st2.substring(0, vt2) + st2.substring(vt2 + 1); st2 = new StringBuffer(st2).insert(1, ".").toString(); } x = Double.parseDouble(st1); y = Double.parseDouble(st2); t = x * y; //Tim vi tri dat dau cham dong trong ket qua if (vt1 > 0) { if (vt2 > 0) { vt1 = vt1 + vt2 - 2; } else { vt1 = vt1 - 1; } } else if (vt2 > 1) { vt1 = vt2 - 1; } for (i = 0; i < vt1; i++) { t = t * 10; } // Neu 2 so ban dau la am thi ket qua nhan -1 if (kt1 == 1) { t = t * -1; } if (kt2 == 1) { t = t * -1; } return t; } Với phép toán chia: Khi gặp phép “/” 2 toán hạng sẽ được chuyển vào 2 chuỗi bằng hàm pushStackTinh(char x[]); Vd: 3.45 / 65.2 Number [n][] = [‘3’,’.’,’4’,’5’] và Number[n+1][]= [‘6’,’5’,’.’,’2’] Với phép chia ta có 4 trường hợp, cần phải đưa về dạng đơn giản nhất đó là a/b a / b à a / b -a / b à a / b (dấu trừ thêm vào kết quả sau) a / -b à a / b (dấu trừ thêm vào kết quả sau) -a / -b à a / b (bỏ dấu trừ ) Sau đó thực hiện phép loại bỏ dấu chấm động ở mảng a và b với hàm char * check_balance3() Sau đó thực hiện phép cân bằng hai mảng a và b với hàm check_balance3(); nhàm cân bằng số chữ số đằng sau dấu phẩy 65.2 / 3.456 Ta được 2 chuỗi a và b 65200 / 3456 Đưa 2 chuỗi a va b để thưc hiện phép chia vào hàm char *chia(char a[],char b[]); Chuyển dạng 2 chuỗi a và b thành 2 số nguyên kiểu unsigned long int Ta được 2 số x y sau và thực hiện phép chia : 65200/3456 = 18 dư 2992 -> chèn 18 vào mảng kq[] Chèn dấu chấm động vào mảng kq[]. Tiếp tục lấy phần du chia cho số hạng b, nếu số chia cho b nhỏ hơn b thì nhân số chia cho 10 cứ tiếp tục thực hiện công việc đó cho đến khi dư = 0 đối với phép chia có hạn: 29920 / 3456 = 8 dư 2272 -> chèn 8 vào chuỗi kq[] 22720 / 3456 = 6 dư 1984 -> chèn 6 vào chuỗi kq[] Đối với phép chia có giới hạn ta chỉ lấy 10 con số sau dấu ‘.’ , ta có kết quả như sau: 18.86574074 Code : public final double chia(String st1, String st2) { int vt1, vt2, i, kt1, kt2, kt3; kt1 = kt2 = kt3 = 0; String tam; double t,x,y; //Truong hop dat biet 0 chia cho 1 so if (st2.charAt(0) == '0' && st2.length() == 1) { return 0; } //Truong hop dat biet chia cho 0 if (st1.charAt(0) == '0' && st1.length() == 1) { return 0; } vt1 = tim(st1); vt2 = tim(st2); //So am --> so duong if (st1.charAt(0) == '-') { st1 = st1.substring(0, 0) + st1.substring(0 + 1); kt1 = 1; } if (st2.charAt(0) == '-') { st2 = st2.substring(0, 0) + st2.substring(0 + 1); kt2 = 1; } //Chia cho 1 if(st2.charAt(0) == '1' && st2.length() == 1) { x = Double.parseDouble(st1); t = x; if(kt1 == 1) { t = t / (-1); } if(kt2 == 1) { t = t / (-1); } return t; } x = Double.parseDouble(st1); y = Double.parseDouble(st2); //So chia phai lon hon so bi chia if(x < y) { tam = st1; st1 = st2; st2 = tam; kt3 = 1; } //So bi chia la 1 if(st2.charAt(0) == '1' && st2.length() == 1) { t = y; if(kt1 == 1) { t = t / (-1); } if(kt2 == 1) { t = t / (-1); } return 1/t; } vt1=tim(st1); vt2=tim(st2); //Xu ly dau cham dong if (vt1 > 1) { st1 = st1.substring(0, vt1) + st1.substring(vt1 + 1); st1 = new StringBuffer(st1).insert(1, ".").toString(); } if (vt2 > 1) { st2 = st2.substring(0, vt2) + st2.substring(vt2 + 1); st2 = new StringBuffer(st2).insert(1, ".").toString(); } x = Double.parseDouble(st1); y = Double.parseDouble(st2); t = x / y; //Tim vi tri dat dau cham dong trong ket qua if(vt1 > 0) { if(vt2 > 1) { vt1 = vt1 - vt2; } else { vt1 = vt1 - 1; } } else if(vt2 >= 1) { vt1 = vt2 - 1; } if(vt1 == vt2 && vt2 == 0) { vt1 = 0; } if(kt3 == 1) { vt1 = vt1 * (-1); } if(vt1 > 0) { for(i = 0; i < vt1; i++) { t = t * 10; } } else { vt1 = vt1 * (-1); for(i = 0; i < vt1; i++) { t = t / 10; } } if(kt1 == 1) { t = t * (-1); } if(kt2 == 1) { t = t * (-1); } if(kt3 == 1) { t = 1 / t; } return t; } LƯU DỒ GIẢI THUẬT PHÉP NHÂN LƯU ĐỒ GIẢI THUẬT PHÉP CHIA Chức năng các hàm được yêu cầu Lũy thứa, bình phương, lập phương, giai thừa, ex: Với phép toán giai thừa: áp dụng công thức Code: private int gt(String a) { int n = Integer.parseInt(a); int kq = 1; while(n != 1) { kq = kq * n; n--; } return kq; } Với phép toán bình phương: áp dụng công thức Code: public final double sqr(String x) { double t = nhan(x, x); return t; } Với phép toán lập phương: áp dụng công thức Code: public final double cube(String x) { double t = nhan(new Double(nhan(x, x)).toString(), x); return t; } Với phép toán lũy thừa số mũ nguyên dương: áp dụng công thức Code: public final double lt(String x, String n) { int i, j; double t = 1; double y; y = Double.parseDouble(x); j = Short.parseShort(n); for (i = 0; i < j; i++) { t = nhan(new Double(t).toString(), new Double(y).toString()); } return t; } Với phép toán ex: áp dụng công thức Code: private double powe(String a) { double kq = 1, tu, mau, ps; for (int i = 1; i < 20; i++) { tu = lt(a, new Integer(i).toString()); mau = gt(new Integer(i).toString()); ps = chia(new Double(tu).toString(), new Double(mau).toString()); kq = cong(new Double(kq).toString(),new Double(ps).toString()) ; } return kq; } Căn bậc 2, bậc 3, bậc y, trị tuyệt đối Với phép toán trị tuyệt đối: áp dụng công thức Code: private double abs(String a) { double x = Double.parseDouble(a); if (x < 0) { x = nhan(a, "-1"); } return x; } Với phép toán căn bậc 2: áp dụng công thức Ví dụ: Tính , đến 6 con số đáng kể Do đó, Code: public final double sqrt(String a) { double x = Double.parseDouble(a); if (x < 0) { return 0; } if (x == 0) return 0; double xn, ketqua, tam; xn = chia(new Double(cong(a, "1")).toString(), "2"); do { ketqua = xn; xn = nhan("0.5", new Double(chia(new Double(cong(new Double(xn).toString(), a)).toString(), new Double(xn).toString())).toString()); tam = tru(new Double(xn).toString(), new Double(ketqua).toString()); if (tam < 0) tam = -tam; } while (tam > eps); return xn; } Với phép toán căn bậc 3: áp dụng công thức ln, log: Với phép toán lnx: áp dụng công thức Code: private double ln(String a) { double x = Double.parseDouble(a); double ps = chia(new Double(tru(a, "1")).toString(), new Double(cong(a, "1")).toString()); double kq = ps, t1, t2, t; if (x > 0) { for (int i = 1; i < 20; i++) { t1 = 1/i; t2 = lt(new Double(ps).toString(), new Double(t1).toString()); t = nhan(new Double(t1).toString(), new Double(t2).toString()); kq = cong(new Double(kq).toString(), new Double(t).toString()); i++; } } kq = nhan(new Double(kq).toString(), "2"); return kq; } Với phép toán logx: áp dụng công thức Code: private double log(String a) { double kq = 0; double x = Double.parseDouble(a); String ln10; if (x <= 0) { return 0; } else { ln10 = "2.30258509299404568"; x = ln(a); kq = chia((new Double(x)).toString(), ln10); return kq; } } Các hàm lượng giác Hàm sin: áp dụng công thức Code: private double sin(String a) { double x = Double.parseDouble(a); //Doi ra gia tri radian x = nhan(a, "3.14159265358979324"); x = chia((new Double(x)).toString(), "180"); double kq = x, tu, ps; int mu = 3, mau; //sinx = x - (x^3)/3! + (x^5)/5! - (x^7)/7! + ... for (int i = 2; i < 20; i++) { tu = lt(new Double(x).toString(), new Integer(mu).toString()); mau = gt(new Integer(mu).toString()); ps = chia(new Double(tu).toString(), new Integer(mau).toString()); if (mu % 2 == 1) kq = tru(new Double(kq).toString(), new Double(ps).toString()); else kq = cong(new Double(kq).toString(), new Double(ps).toString()); mu += 2; } return kq; } Hàm cos: áp dụng công thức Code: public final double cos(String a) { double x; x = Double.parseDouble(a); x = x + 90; x = sin(new Double(x).toString()); return x; } Hàm tan: áp dụng công thức Code: private double tan(String a) { double t, t1; t = sin(a); t1 = cos(a); if (t1 == 0) { return 0; } t = chia((new Double(t)).toString(), (new Double(t1)).toString()); return t; } Hàm sinh: áp dụng công thức Code: public final double sinh(String a) { return chia(new Double(tru(new Double(powe(a)).toString(), new Double(powe("-" + a)).toString())).toString(), "2"); } Hàm cosh: áp dụng công thức Code: public final double cosh(String a) { return chia(new Double(cong(new Double(powe(a)).toString(), new Double(powe("-" + a)).toString())).toString(), "2"); } Hàm tanh: áp dụng công thức Code: public final double tanh(String a) { return chia(new Double(sinh(a)).toString(), new Double(cosh(a)).toString()); } Phương trình bậc 1, bậc 2 Phương trình bậc 1: Cho phương trình ax + b = 0 Với a=0 thì xét b: . Nếu b=0 à phương trình có vô số nghiệm . Nếu b0 à phương trình vô nghiệm Với a0 thì xét b: . Nếu b=0 à phương trình có nghiệm x = 0 . Nếu b0 àphương trình có nghiệm x = Code: private String PTB1(String a, String b) { double soa, sob; soa = Double.parseDouble(a); sob = Double.parseDouble(b); if (soa != 0) { if (sob != 0) return new Double(chia("-" + b, a)).toString(); else return "Phương trình có vô số nghiệm"; } else return "Phương trình vô nghiệm"; } Phương trình bậc 2: Cho phương trình ax2 + bx + c =0 Với a=0 thì xét b và c : . Nếu b=0 & c0 à phương trình có vô số nghiệm . Nếu b=0 & c 0 à phương trình vô nghiệm . Nếu b0 & c0 à phương trình đã cho trở về dạng bậc nhất ax+b=0 : phương trình này có 1 nghiệm duy nhất đó là . Với a0 tính delta=b2-4ac . Nếu delta < 0 à phương trình vô nghiệm . Nếu delta = 0 à phương trình có nghiệm kép . Nếu delta > 0 à phương trình có hai nghiệm phân biệt Code: private String PTB2(String a, String b, String c) { double result, soa, sob, soc, x1 = 0, x2 = 0; soa = Double.parseDouble(a); sob = Double.parseDouble(b); soc = Double.parseDouble(c); if (soa == 0) { if (sob == 0) { if (soc == 0) return "Phương trình có vô số nghiệm"; else return "Phương trình vô nghiệm"; } else { result = chia("-" + c, b); return new Double(result).toString(); } } else { double t = nhan("4", new Double(nhan(a, c)).toString()); double delta = tru(new Double(sqr(b)).toString(), n

Các file đính kèm theo tài liệu này:

  • docXây Dựng Phần Mềm Ứng Dụng Máy Tính Khoa Học cho Điện Thoại Cầm Tay Thông Minh chạy trên hệ điều hành Android.doc