BÀI 1: CÀI ĐẶT MÔI TRƯỜNG VÀ LẬP TRÌNH JAVA CĂN BẢN

Mục tiêu

  • Kiến thức:

    • Trình bày được nguyên lý hoạt động của nền tảng Java bao gồm kiến trúc JVM, JRE, JDK và cơ chế thực thi mã bytecode.

    • Mô tả được cú pháp khai báo biến, các kiểu dữ liệu nguyên thủy, toán tử và các cấu trúc điều khiển trong Java.

    • Giải thích được cơ chế hoạt động của luồng nhập xuất chuẩn và lớp Scanner.

  • Kỹ năng:

    • Cài đặt và cấu hình thành công bộ phát triển Java (JDK) cùng môi trường lập trình (IDE NetBeans / IntelliJ IDEA).

    • Xây dựng được chương trình Java hoàn chỉnh áp dụng các cấu trúc rẽ nhánh, vòng lặp và xử lý mảng một chiều.

    • Sử dụng thành thạo lớp Scanner để nhập liệu từ bàn phím và xử lý triệt để hiện tượng trôi dòng lệnh.

  • Thái độ:

    • Thể hiện tính cẩn thận, chính xác khi thiết lập đường dẫn môi trường hệ thống.

    • Rèn luyện ý thức kỷ luật trong việc định dạng mã nguồn theo quy ước chuẩn của Java.

1. Cài đặt và thiết lập môi trường phát triển Java

1.1. Lý thuyết liên quan:

1.1.1. Khái niệm:

    • JDK (Java Development Kit): Là bộ công cụ phát triển phần mềm chứa trình biên dịch javac, trình thực thi java và các thư viện chuẩn.

    • JRE (Java Runtime Environment): Là môi trường cung cấp các thư viện thời gian chạy để mã Java có thể vận hành.

    • JVM (Java Virtual Machine): Là máy ảo đóng vai trò thông dịch mã bytecode (.class) thành mã máy tương ứng với từng hệ điều hành

1.1.2. Tác dụng: Giúp người lập trình biên dịch mã nguồn Java và thực thi chương trình trên nhiều nền tảng hệ điều hành khác nhau theo cơ chế độc lập phần cứng.

1.1.3. Ý nghĩa: Là bước chuẩn bị nền tảng và công cụ bắt buộc để có thể bắt đầu xây dựng, biên dịch và kiểm thử ứng dụng Java.

1.2. Trình tự thực hiện:

B1: Tải bộ cài đặt JDK (phiên bản JDK 17 LTS hoặc JDK 21 LTS) từ trang chủ chính thức hoặc kho lưu trữ nội bộ của nhà trường.

B2: Chạy tệp tin cài đặt .exe, nhấn Next theo đường dẫn mặc định (thông thường: C:\Program Files\Java\jdk-...).

B3: Thiết lập biến môi trường hệ thống:

    • Nhấn chuột phải vào This PC -> Chọn Properties ->Chọn Advanced system settings -> Nhấp chọn Environment Variables.

    • Tại mục System variables, tạo biến mới JAVA_HOME trỏ đến thư mục cài đặt JDK.

    • Chọn biến Path ->Nhấn Edit -> Thêm đường dẫn %JAVA_HOME%\bin -> Nhấn OK để lưu lại.

B4: Kiểm tra thiết lập bằng cách mở cửa sổ Command Prompt (cmd), gõ lệnh javac -versionjava -version. Màn hình hiển thị chính xác phiên bản cài đặt là hoàn tất.

B5: Cài đặt phần mềm lập trình (IDE NetBeans hoặc IntelliJ IDEA Community Edition) bằng cách chạy tệp cài đặt tương ứng và chấp nhận các thiết lập mặc định.

1.3. Bài tập

Bài tập 1.1: Kiểm tra cấu hình và kiểm chứng biến môi trường JDK

Yêu cầu: Mở Command Prompt (cmd), thực thi lần lượt hai lệnh javac -versionjava -version. Chụp ảnh màn hình hiển thị số hiệu phiên bản JDK. Sau đó gõ lệnh set JAVA_HOME để kiểm tra biến môi trường đã trỏ chính xác về thư mục cài đặt hay chưa.

Bài tập 1.2: Biên dịch và chạy chương trình Java thủ công bằng dòng lệnh

Yêu cầu: Dùng Notepad tạo một tệp tin XinChao.java trên ổ đĩa D:\ với nội dung in dòng chữ: "Cai dat JDK thanh cong!". Mở cmd chuyển vào thư mục trên, thực hiện lệnh javac XinChao.java để sinh tệp XinChao.class, sau đó chạy bằng lệnh java XinChao.

2. Khởi tạo dự án và xây dựng cấu trúc chương trình Java

2.1. Lý thuyết liên quan:

2.1.1. Khái niệm: Một chương trình Java được tổ chức thành các gói (package) và các lớp (class). Mọi câu lệnh thực thi bắt buộc phải nằm bên trong một khối lớp. Tên tệp tin mã nguồn (.java) phải trùng khớp hoàn toàn với tên của public class.

2.2.2. Tác dụng: Định hình không gian tên (namespace) rõ ràng, giúp quản lý mã nguồn chặt chẽ và tránh xung đột tên lớp trong các dự án phần mềm.

2.2.3. Ý nghĩa: Giúp người học làm quen với quy tắc tổ chức mã nguồn chuẩn ngay từ đầu, tránh các lỗi biên dịch cơ bản khi khởi tạo ứng dụng.

2.2. Trình tự thực hiện:

B1: Khởi động phần mềm IDE (NetBeans / IntelliJ IDEA).

B2: Chọn menu File ->Chọn New Project  -> Chọn loại dự án Java cơ bản  -> Đặt tên dự án không dấu (ví dụ: Bai1_CoBan).

B3: Tạo mới một gói mã nguồn: Nhấp chuột phải vào thư mục src –> Chọn New  –> Chọn Java Package (đặt tên: bai1.coban).

B4: Tạo lớp chính: Nhấp chuột phải vào package vừa tạo  -> Chọn New  -> Chọn Java Class  -> Đặt tên lớp là ChuongTrinhDauTien.

B5: Khai báo cấu trúc phương thức thực thi chính main bên trong lớp:

Java
package bai1.coban;

public class ChuongTrinhDauTien {
    public static void main(String[] args) {
        System.out.println("Xin chào! Bắt đầu học lập trình Java.");
    }
}

B6: Nhấn phím tắt thực thi (Shift + F6 trên NetBeans hoặc Shift + F10 trên IntelliJ) để kiểm tra kết quả hiển thị trên cửa sổ Output.

2.3. Bài tập

Bài tập 2.1: Tạo project và xuất thông tin cá nhân

Yêu cầu: Tạo một project mới đặt tên là ThongTinHocVien. Trong package bai1.thongtin, tạo class XuatThongTin. Viết các câu lệnh xuất ra màn hình console: Họ tên học sinh, Mã số học sinh, Tên lớp, Chuyên ngành theo từng dòng riêng biệt.

Bài tập 2.2: Phân chia nhiều Package trong cùng một Project

Yêu cầu: Trong project vừa tạo ở Bài 2.1, tạo thêm một package thứ hai có tên là bai1.loichao. Tạo class LoiChao trong package này để in ra câu châm ngôn học lập trình yêu thích của em. Chạy độc lập từng class để kiểm chứng kết quả.

4. Thao tác nhập dữ liệu và xử lý trôi dòng bằng lớp Scanner

4.1. Lý thuyết liên quan:

  • Khái niệm: Scanner là lớp tiện ích thuộc gói java.util, chịu trách nhiệm phân tích và đọc dữ liệu từ bàn phím thông qua luồng chuẩn System.in.

  • Tác dụng: Cung cấp các hàm đọc số nguyên, số thực, từ đơn và cả dòng văn bản từ bàn phím.

  • Ý nghĩa: Tạo khả năng tương tác trực tiếp giữa người dùng và ứng dụng, đồng thời cung cấp kỹ thuật kiểm soát bộ đệm bàn phím, tránh lỗi bỏ qua lệnh nhập chuỗi (trôi dòng).

4.2. Trình tự thực hiện:

B1: Khai báo nạp gói thư viện Scanner ở đầu tệp mã nguồn:

import java.util.Scanner;

B2: Khởi tạo đối tượng Scanner trong phương thức main:

Scanner sc = new Scanner(System.in);

B3: Gọi các phương thức đọc dữ liệu tương ứng:

    • Đọc số nguyên: int n = sc.nextInt();

    • Đọc số thực: double d = sc.nextDouble();

    • Đọc cả dòng văn bản: String dong = sc.nextLine();

B4: Xử lý hiện tượng trôi dòng: Khi chuyển tiếp từ các lệnh đọc số (nextInt(), nextDouble()) sang lệnh đọc dòng văn bản (nextLine()), bắt buộc chèn một lệnh sc.nextLine(); trung gian để nuốt ký tự xuống dòng (\n) còn tồn trong bộ đệm:

System.out.print("Nhập số ngày công: ");
int ngayCong = sc.nextInt();
sc.nextLine(); // Dọn sạch ký tự xuống dòng còn sót lại trong bộ đệm
System.out.print("Nhập họ tên nhân viên: ");
String hoTen = sc.nextLine();

B5: Đóng luồng quét khi kết thúc chương trình: sc.close();.

4.3. Bài tập

Bài tập 4.1: Tính chu vi và diện tích hình chữ nhật từ bàn phím

Yêu cầu: Viết chương trình sử dụng Scanner cho phép người dùng nhập chiều dài và chiều rộng (số thực) của hình chữ nhật từ bàn phím. Tính chu vi, diện tích và in kết quả làm tròn 2 chữ số thập phân bằng printf.

Bài tập 4.2: Nhập thông tin sinh viên và xử lý trôi lệnh

Yêu cầu: Viết chương trình nhập thông tin cá nhân theo đúng thứ tự: Mã sinh viên (chuỗi), Tuổi (số nguyên), Điểm trung bình (số thực), rồi đến Địa chỉ (chuỗi). Áp dụng chính xác lệnh sc.nextLine(); trung gian để đảm bảo không bị bỏ qua ô nhập địa chỉ.

5. Thao tác xử lý dữ liệu với mảng một chiều

5.1. Lý thuyết liên quan:

  • Khái niệm: Mảng một chiều trong Java là một đối tượng chứa tập hợp các phần tử có cùng kiểu dữ liệu, các phần tử được lưu trữ tại các ô nhớ liên tiếp nhau và truy xuất thông qua chỉ số bắt đầu từ 0.

  • Tác dụng: Quản lý danh sách các giá trị cùng loại với số lượng xác định trước thông qua thuộc tính .length.

  • Ý nghĩa: Rèn luyện kỹ năng tổ chức dữ liệu danh sách, áp dụng các giải thuật duyệt mảng, tìm kiếm phần tử lớn nhất/nhỏ nhất và tính toán thống kê số liệu.

5.2. Trình tự thực hiện:

B1: Khai báo và cấp phát bộ nhớ động cho mảng:

double[] mangLuong = new double[soLuong];

B2: Sử dụng vòng lặp for kết hợp Scanner để nhập dữ liệu cho từng phần tử:

for (int i = 0; i < mangLuong.length; i++) {
    System.out.printf("Nhập lương cho nhân sự thứ %d: ", (i + 1));
    mangLuong[i] = sc.nextDouble();
}

B3: Duyệt mảng để tìm giá trị lớn nhất và tính tổng:

double max = mangLuong[0];
double tong = 0;
for (double x : mangLuong) {
    if (x > max) {
        max = x;
    }
    tong += x;
}

B4: Hiển thị kết quả thống kê ra màn hình với định dạng số chuẩn:

System.out.printf("Lương cao nhất: %,.0f VNĐ | Tổng lương: %,.0f VNĐ\n", max, tong);

5.3. Bài tập

Bài tập 5.1: Nhập và in mảng số nguyên đảo ngược

Yêu cầu: Khởi tạo một mảng số nguyên gồm 5 phần tử. Cho phép người dùng nhập 5 giá trị từ bàn phím. Sử dụng vòng lặp for để duyệt và in các phần tử theo thứ tự ngược lại (từ phần tử cuối về phần tử đầu tiên).

Bài tập 5.2: Tìm kiếm phần tử và tính giá trị trung bình

Yêu cầu: Nhập vào mảng số thực n phần tử (n nhập từ bàn phím). Tính giá trị trung bình cộng của các phần tử trong mảng. Nhập thêm một số x từ bàn phím và đếm xem trong mảng có bao nhiêu phần tử mang giá trị lớn hơn x.