Tải bản đầy đủ
THIẾT KẾ VÀ XÂY DỰNG ỨNG DỤNG

THIẾT KẾ VÀ XÂY DỰNG ỨNG DỤNG

Tải bản đầy đủ

Bố cục giao diện chính gồm 4 phần: trong đó phần 1,2,3 sử dụng textview để
thiết kế
Phần 1 Hiển thị lên số và phép tính nhập vào
Phần 2 Hiển thị lên kết quả phép tính
Phần 3 Hiển thị lên giá trị của M
Phần 4 Các nút bấm: được thiết kế bằng cách sử dụng GridView và Java enum.
Để thiết kế các nút bấm ta khai báo một lớp enum KeypadButton nó sẽ chứa tên
hiển thị lên màn hình của các nút dạng như sau:
public enum KeypadButton {
// Advance button
MC("MC",KeypadButtonCategory.MEMORYBUFFER)
, MR("MR",KeypadButtonCategory.MEMORYBUFFER)
, MS("MS",KeypadButtonCategory.MEMORYBUFFER)
, M_ADD("M+",KeypadButtonCategory.MEMORYBUFFER)
, M_REMOVE("M-",KeypadButtonCategory.MEMORYBUFFER)
, SIN("sin",KeypadButtonCategory.ADVANCE)
, SQRT("\u221a",KeypadButtonCategory.OTHER)
, SQR("^",KeypadButtonCategory.OTHER)
, PERCENT("%",KeypadButtonCategory.OTHER)
, OPEN("(", KeypadButtonCategory.OTHER)
, CLOSE(")", KeypadButtonCategory.OTHER)
, CLEAR("C",KeypadButtonCategory.OTHER)
.//CONSTAN // Constant button
, PI("PI", KeypadButtonCategory.CONSTANT)
, E("e", KeypadButtonCategory T)
………………….
CharSequence _text; // Display Text
KeypadButtonCategory _category;
KeypadButton(CharSequence text,KeypadButtonCategory category) {
_text = text;

41

_category = category;
}
public CharSequence getText() {
return _text;
}
public void setText(String text) {
_text = text;
}
}
Chúng ta cũng sử dụng java enums để biểu diễn các loại nút bấm. Khai báo một
KeypadButtonCategory enum class như sau:
public enum KeypadButtonCategory {
MEMORYBUFFER
, ADVANCE
, NUMBER
, CONSTANT
, OPERATOR
, DUMMY
, CLEAR
, RESULT
, OTHER
}

Việc tạo ra KeypadButtonCategory class để ta có thể style cho nhóm các button.
Ứng dụng của chúng ta sẽ đỡ đơn điệu và trở nên nhiều màu sắc hơn.
Chúng ta sẽ khai báo một KeypadAdaper class extends BaseAdapter cung cấp dữ
liệu để ta nhìn thấy tên nút hiển thị lên:
public class KeypadAdapter extends BaseAdapter{
private Context _context;
private OnClickListener _onButtonClick;

42

public KeypadAdapter(Context c) {
_context = c;
}
public void setOnButtonClickListener(OnClickListener
listener) {
_onButtonClick = listener;
}
public int getCount() {
return buttons.length;
}
public Object getItem(int position) {
return buttons[position];
}
public long getItemId(int position) {
return 0;
}
public View getView(int position, View convertView,
ViewGroup parent) {
Button btn;
if (convertView == null) {
btn = new Button(_context);
KeypadButton keypadButton = buttons[position];
switch(keypadButton._category)
{
case MEMORYBUFFER:// nhom cac phim

btn.setBackgroundResource(R.drawable.keypad);
// style cho tung nhom nut
break;
case NUMBER:

43

btn.setBackgroundResource(R.drawable.keypad1);
break;
case OPERATOR:
btn.setBackgroundResource(R.drawable.keypadop1);
break;
default:
btn.setBackgroundResource(R.drawable.keypad1);
break;
}
if(keypadButton != KeypadButton.DUMMY)
btn.setOnClickListener(_onButtonClick);
else
btn.setClickable(false)
btn.setTag(keypadButton);
} else {
btn = (Button) convertView;
}
btn.setText(buttons[position].getText());
return btn;
}
//Tao mang cac button theo thu tu
private KeypadButton[] buttons = {
KeypadButton.DELETE,KeypadButton.CE,KeypadButton.CLEAR,Keyp
adButton.SI
GN,KeypadButton.SQRT,KeypadButton.MC,KeypadButton.MR,Keypad
Button.MS,KeypadButton.M_ADD,KeypadButton.M_REMOVE,KeypadBu
tton.CALCULATE,
};
}

44

Nhiều nút bấm ta sẽ xoay ngang màn hình để dễ thiết kế. Để có thể xoay ngang
màn hình ta tạo một thư mục layout-land (chú ý tên thư mục là layout-land phải
viết chính xác) đặt nó vào trong thư mục res sau đó cop file main.xml vào trong
thư mục đó việc còn lại là viết file main.xml sao cho phù hợp với màn hình sau
khi xoay ngang.

3.2.Ký pháp BaLance. Chuyển đổi và tính toán:
Cách 1:
Sử dụng 2 stack tạm gọi là number và stack và queue tạm gọi queuechar . Trong
đó :
-

number: chứa toán tử

-

stack chứa toán hạng

-

queueChar: chứa toán tử và vị trí các toán hạng

Chúng ta sẽ chuyển biểu thức từ biểu thức bình thường về biểu thức hậu tố như
sau:
Ta theo một vòng lặp từ đầu cho đến cuối biểu thức như sau:
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 hạng, 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.

45

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ụ: 3+4*2/(1-5)+3= 3-2+3=4
K
ý
tự

Thao tác

Stack

3

Ghi 3 vào number

+

Push + vào Stack

+

4

Push 4 vào number

+

*

Number

queueChar(
)

3,

0

Chuỗi hậu
tố

0,
3,4

0,1

Toán tử + trên cùng +,*
của stack có độ tưu
tiên nhỏ hơn * nên
Push * vào stack

3,4

0,1

2

Push vào number

+,*

3,4,2

0,1,2

342

/

Toán tử * trên cùng +,/
của stack có mức
ưu tiên bằng với
toán tử / nên ta lôi
nó ra khỏi stack và

3,4,2,

0,1,2,*

342*

46