Máy Tính Bỏ Túi Java – Bộ Công Cụ Tính Toán Đơn Giản
Hướng Dẫn Code Máy Tính Bỏ Túi Đơn Giản Bằng Java Từ A-Z
Máy tính bỏ túi là một trong những dự án cơ bản nhưng vô cùng hữu ích khi bạn bắt đầu học lập trình Java. Dự án này không chỉ giúp bạn làm quen với cú pháp Java cơ bản mà còn rèn luyện tư duy logic và khả năng xử lý đầu vào/đầu ra.
1. Chuẩn Bị Môi Trường Phát Triển
Trước khi bắt đầu code, bạn cần chuẩn bị những công cụ sau:
- Java Development Kit (JDK): Phiên bản mới nhất từ Oracle hoặc Adoptium
- IDE: IntelliJ IDEA, Eclipse hoặc VS Code với extension Java
- Hệ điều hành: Windows, macOS hoặc Linux đều hỗ trợ
Để kiểm tra JDK đã được cài đặt thành công, mở terminal và gõ lệnh:
javac -version
2. Cấu Trúc Cơ Bản Của Máy Tính Bỏ Túi
Một máy tính bỏ túi đơn giản bằng Java cần những thành phần chính sau:
- Giao diện người dùng: Console hoặc GUI (Swing/JavaFX)
- Xử lý đầu vào: Nhận số và phép tính từ người dùng
- Thực hiện tính toán: Các phương thức cho cộng, trừ, nhân, chia
- Xử lý ngoại lệ: Chia cho 0, đầu vào không hợp lệ
- Hiển thị kết quả: In ra màn hình hoặc giao diện
3. Code Máy Tính Console Đơn Giản
Dưới đây là code hoàn chỉnh cho máy tính bỏ túi chạy trên console:
import java.lang.Math;
public class SimpleCalculator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println(“=== MÁY TÍNH BỎ TÚI ĐƠN GIẢN ===”);
System.out.println(“1. Cộng (+)”);
System.out.println(“2. Trừ (-)”);
System.out.println(“3. Nhân (×)”);
System.out.println(“4. Chia (÷)”);
System.out.println(“5. Lũy thừa (^)”);
System.out.println(“6. Căn bậc hai (√)”);
System.out.print(“Chọn phép tính (1-6): “);
int choice = scanner.nextInt();
double num1 = 0, num2 = 0, result = 0;
boolean validInput = true;
try {
switch(choice) {
case 1:
System.out.print(“Nhập số thứ nhất: “);
num1 = scanner.nextDouble();
System.out.print(“Nhập số thứ hai: “);
num2 = scanner.nextDouble();
result = num1 + num2;
break;
case 2:
System.out.print(“Nhập số thứ nhất: “);
num1 = scanner.nextDouble();
System.out.print(“Nhập số thứ hai: “);
num2 = scanner.nextDouble();
result = num1 – num2;
break;
case 3:
System.out.print(“Nhập số thứ nhất: “);
num1 = scanner.nextDouble();
System.out.print(“Nhập số thứ hai: “);
num2 = scanner.nextDouble();
result = num1 * num2;
break;
case 4:
System.out.print(“Nhập số bị chia: “);
num1 = scanner.nextDouble();
System.out.print(“Nhập số chia: “);
num2 = scanner.nextDouble();
if(num2 == 0) {
System.out.println(“Lỗi: Không thể chia cho 0!”);
validInput = false;
} else {
result = num1 / num2;
}
break;
case 5:
System.out.print(“Nhập cơ số: “);
num1 = scanner.nextDouble();
System.out.print(“Nhập số mũ: “);
num2 = scanner.nextDouble();
result = Math.pow(num1, num2);
break;
case 6:
System.out.print(“Nhập số cần tính căn: “);
num1 = scanner.nextDouble();
if(num1 < 0) {
System.out.println(“Lỗi: Không thể tính căn của số âm!”);
validInput = false;
} else {
result = Math.sqrt(num1);
}
break;
default:
System.out.println(“Lựa chọn không hợp lệ!”);
validInput = false;
}
if(validInput) {
System.out.printf(“Kết quả: %.2f%n”, result);
}
} catch(Exception e) {
System.out.println(“Lỗi: Đầu vào không hợp lệ!”);
} finally {
scanner.close();
}
}
}
4. Nâng Cấp Thành Giao Diện Đồ Họa (GUI)
Để tạo máy tính với giao diện đồ họa, bạn có thể sử dụng Java Swing. Dưới đây là ví dụ cơ bản:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class GUICalculator {
public static void main(String[] args) {
JFrame frame = new JFrame(“Máy Tính Bỏ Túi”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 400);
frame.setLayout(new BorderLayout());
JTextField display = new JTextField();
display.setEditable(false);
display.setHorizontalAlignment(JTextField.RIGHT);
display.setFont(new Font(“Arial”, Font.PLAIN, 24));
frame.add(display, BorderLayout.NORTH);
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(5, 4));
String[] buttons = {
“7”, “8”, “9”, “/”,
“4”, “5”, “6”, “*”,
“1”, “2”, “3”, “-“,
“0”, “.”, “=”, “+”,
“C”, “√”, “^”, “DEL”
};
for(String text : buttons) {
JButton button = new JButton(text);
button.addActionListener(new ButtonClickListener(display));
buttonPanel.add(button);
}
frame.add(buttonPanel, BorderLayout.CENTER);
frame.setVisible(true);
}
}
class ButtonClickListener implements ActionListener {
private JTextField display;
public ButtonClickListener(JTextField display) {
this.display = display;
}
@Override
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if(command.charAt(0) >= ‘0’ && command.charAt(0) <= '9') {
display.setText(display.getText() + command);
} else if(command.equals(“.”)) {
if(!display.getText().contains(“.”)) {
display.setText(display.getText() + “.”);
}
} else if(command.equals(“=”)) {
try {
String expression = display.getText();
// Xử lý biểu thức tại đây
double result = evaluate(expression);
display.setText(String.valueOf(result));
} catch(Exception ex) {
display.setText(“Error”);
}
} else if(command.equals(“C”)) {
display.setText(“”);
} else if(command.equals(“DEL”)) {
String current = display.getText();
if(!current.isEmpty()) {
display.setText(current.substring(0, current.length() – 1));
}
} else {
display.setText(display.getText() + ” ” + command + ” “);
}
}
private double evaluate(String expression) {
// Triển khai logic tính toán tại đây
return 0;
}
}
5. So Sánh Các Phương Pháp Tính Toán Trong Java
Dưới đây là bảng so sánh hiệu suất của các phương pháp tính toán khác nhau trong Java:
| Phương Pháp | Độ Chính Xác | Hiệu Suất | Dùng Cho |
|---|---|---|---|
| Toán tử cơ bản (+, -, *, /) | Cao | Rất nhanh | Tính toán đơn giản |
| Math.pow() | Cao | Chậm hơn toán tử | Lũy thừa, căn bậc |
| BigDecimal | Rất cao (chính xác tuyệt đối) | Chậm | Tài chính, khoa học |
| ScriptEngine (JavaScript) | Trung bình | Chậm | Biểu thức động |
6. Xử Lý Ngoại Lệ Trong Máy Tính
Xử lý ngoại lệ là phần quan trọng để máy tính của bạn hoạt động ổn định. Các trường hợp cần xử lý:
- Chia cho 0: Sử dụng
ArithmeticException - Đầu vào không hợp lệ: Sử dụng
InputMismatchException - Tràn số: Sử dụng
NumberFormatException - Căn bậc hai của số âm: Kiểm tra điều kiện trước khi tính
Ví dụ về xử lý chia cho 0:
double result = numerator / denominator;
if(Double.isInfinite(result)) {
throw new ArithmeticException(“Cannot divide by zero”);
}
System.out.println(“Result: ” + result);
} catch(ArithmeticException e) {
System.out.println(“Error: ” + e.getMessage());
}
7. Tối Ưu Hóa Mã Nguồn
Để cải thiện hiệu suất và khả năng bảo trì:
- Sử dụng hằng số cho các giá trị cố định
- Tách phương thức cho từng phép tính
- Sử dụng enum cho các phép toán
- Áp dụng design pattern như Strategy
- Viết unit test với JUnit
Ví dụ về refactoring với enum:
ADD(“+”) {
public double apply(double a, double b) { return a + b; }
},
SUBTRACT(“-“) {
public double apply(double a, double b) { return a – b; }
},
MULTIPLY(“×”) {
public double apply(double a, double b) { return a * b; }
},
DIVIDE(“÷”) {
public double apply(double a, double b) {
if(b == 0) throw new ArithmeticException(“Division by zero”);
return a / b;
}
};
private final String symbol;
Operation(String symbol) {
this.symbol = symbol;
}
public abstract double apply(double a, double b);
@Override
public String toString() {
return symbol;
}
}
8. Triển Khai Và Chia Sẻ Ứng Dụng
Sau khi hoàn thành, bạn có thể:
- Đóng gói thành JAR: Sử dụng
jar cvfe Calculator.jar MainClass *.class - Chia sẻ trên GitHub: Tạo repository và push code lên
- Xuất bản trên trang web: Sử dụng Java Web Start (JNLP) hoặc Applet
- Chuyển đổi sang Android: Sử dụng Android Studio với Java
Để tạo file JAR thực thi:
javac SimpleCalculator.java
# Tạo file manifest
echo Main-Class: SimpleCalculator > manifest.txt
# Đóng gói thành JAR
jar cvfm Calculator.jar manifest.txt SimpleCalculator.class
# Chạy ứng dụng
java -jar Calculator.jar
Tài Nguyên Học Tập Bổ Sung
Để nâng cao kiến thức về lập trình Java và xây dựng máy tính bỏ túi, bạn có thể tham khảo những tài nguyên uy tín sau:
- Tài liệu chính thức từ Oracle: Java Documentation cung cấp toàn bộ thông tin về cú pháp và thư viện chuẩn.
- Khóa học từ Đại học Stanford: Programming Abstractions in Java – Khóa học nền tảng về lập trình Java từ một trong những trường đại học hàng đầu thế giới.
- Hướng dẫn từ MIT: Java Preparation for 6.170 – Tài liệu chuẩn bị Java từ Viện Công nghệ Massachusetts.
Câu Hỏi Thường Gặp
Q: Tại sao nên dùng Java thay vì Python cho máy tính bỏ túi?
A: Java cung cấp kiểu dữ liệu nghiêm ngặt và xử lý ngoại lệ mạnh mẽ hơn, phù hợp cho các ứng dụng cần độ chính xác cao như máy tính khoa học. Tuy nhiên, Python sẽ đơn giản hơn cho nguyên mẫu nhanh.
Q: Làm sao để thêm chức năng lưu lịch sử tính toán?
A: Bạn có thể sử dụng:
- Mảng hoặc ArrayList để lưu trữ các phép tính
- File I/O để lưu vào tệp tin
- Database như SQLite cho ứng dụng phức tạp
Q: Có thể tích hợp máy tính này với ứng dụng web không?
A: Có, bạn có thể:
- Chuyển đổi thành Java Servlet
- Sử dụng JSP cho giao diện
- Hoặc tạo API với Spring Boot và gọi từ frontend
Q: Làm sao để cải thiện giao diện đồ họa?
A: Một số gợi ý:
- Sử dụng JavaFX thay vì Swing
- Áp dụng Material Design với thư viện như FlatLaf
- Thêm animation và hiệu ứng chuyển tiếp
- Tối ưu hóa layout cho mobile