Một số thuật toán cơ bản xung quanh số nguyên tố – Java

Giới thiệu

Trong nội dung bài này, chúng ta cùng nhau tìm hiểu một số kiến thức cơ bản xung quanh số nguyên tố.

Một số tự nhiên p (p > 1) là số nguyên tố nếu p có đúng 02 ước số là 1 và p.

Ví dụ các số nguyên tố: 2, 3, 5, 7, 11, 13, 17, 19, 23, …

Chúng ta cùng nhau thực hiện một số giải thuật cơ bản bằng ngôn ngữ Java để giải quyết các bài toán con sau:

  • Kiểm tra xem một số tự nhiên n có phải là số nguyên tố hay không.
  • Liệt kê các số nguyên tố nằm trong phạm vi [1, n].

Kiểm tra tính nguyên tố

Giải thuật thứ nhất

Ý tưởng giải thuật

Chúng ta kiểm tra xem có tồn tại một số nguyên k (2 ≤ k ≤ n – 1) mà k là ước của n (n chia hết cho k) thì n không phải là số nguyên tố, ngược lại n là số nguyên tố.

Trên thực tế ta chỉ cần kiểm tra k từ 2 đến √n là được.

Bước 1.

Chúng ta tạo một Java Project trong Eclipse IDE và đặt tên là JavaAlgorithmBasicProject.

Chúng ta tiếp tục tạo package mainclass Main.java cùng phương thức main() mặc định.

Bước 2.

Chúng ta tạo package algorithmclass SoNguyenTo.java.

Chúng ta tiếp tục tạo phương thức kiemTraSNTFirst() với:

  • Tham số cho phương thức này là một số tự nhiên n.
  • Kiểu dữ liệu trả về là boolean. Phương thức trả về kết quả: (i) true nếu n là số nguyên tố; (ii) false nếu ngược lại.

Bước 3.

Chúng ta thực hiện giải thuật bằng ngôn ngữ Java như sau:

Những kỹ thuật lập trình cần chú ý:

  • Phương thức để tính căn bậc 2 của một số tự nhiên n là Math.sqrt().
  • Phương thức để lấy phần nguyên của một số thập phân là Math.round().
  • Thư viện Math định nghĩa các phương thức dùng tính toán các biểu thức toán học cơ bản. Các phương thức này đều là tĩnh nên được gọi trực tiếp bằng cú pháp Math.phương_thức().

Bước 4.

Chúng ta thực hiện thử nghiệm phương thức kiemTraSNTFirst() trong class Main.java như sau:

Bước 5.

Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Giải thuật thứ hai

Ý tưởng giải thuật

Chúng ta sẽ chỉ kiểm tra các số k có tính chất giống với một trong hai tính chất cơ bản sau của số nguyên tố:

  • Trừ số 2 và các số nguyên tố là số lẻ.
  • Trừ số 2, 3, các số nguyên tố có dạng 6k ± 1 (vì số có dạng 6k ± 2 thì chia hết cho 2, số có dạng 6k ± 3 thì chia hết cho 3).

Bước 1.

Chúng ta thực hiện giải thuật bằng ngôn ngữ Java như sau:

Bước 2.

Chúng ta thực hiện thử nghiệm phương thức kiemTraSNTSecond() trong class Main.java như sau:

Bước 3.

Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Liệt kê các số nguyên tố trong đoạn [1, N]

Giải thuật thứ nhất

Ý tưởng giải thuật

Chúng ta lần lượt xem xét các số m trong đoạn [1, n], rồi kiểm tra tính nguyên tố của m.

Bước 1.

Chúng ta thực hiện giải thuật bằng ngôn ngữ Java như sau:

Những kỹ thuật lập trình cần chú ý:

  • Java cung cấp cho chúng ta một số kiểu dữ liệu lưu trữ tập hợp các phần tử bên cạnh kiểu dữ liệu mảng. Chúng ta thường sử dụng một số dạng sau: (i) List để lưu trữ không giới hạn các phần tử có thể trùng nhau; (ii) Set để lưu trữ không giới hạn các phần tử không trùng nhau; (ii) Map để lưu trữ không giới hạn các phần tử theo từng cặp . Chúng ta sẽ dần tìm hiểu cụ thể hơn trong những bài tiếp theo.
  • Java cung cấp một phương pháp để xác định kiểu dữ liệu cho toàn bộ các phần tử trong danh sách: định nghĩa ngay từ ban đầu kiểu dữ liệu trong cặp dấu <>. Ví dụ ở đây là List.
  • Với tham số là một biến riêng lẻ, giá trị của tham số sẽ không bị thay đổi sau khi thực hiện phương thức.
  • Với tham số là một danh sách, các phần tử của danh sách có thể bị thay đổi sau khi thực hiện phương thức.

Bước 2.

Chúng ta thực hiện thử nghiệm phương thức lietKeSNTFirst() trong class Main.java như sau:

Những kỹ thuật lập trình cần chú ý:

  • Java cung cấp các dạng List khác nhau để chúng ta sử dụng tùy theo trường hợp: (i) ArrayList được sử dụng khi không quan tâm đến thứ tự trước sau của các phần tử; (ii) LinkedList được sử dụng khi quan tâm đến thứ tự trước sau của các phần tử.
  • Kiểu dữ liệu của các phần tử trong List đã được khai báo ban đầu thì không cần khai báo đối với ArrayList<>.
  • Số lượng phần tử của một danh sách là không giới hạn nên không cần khai báo trước số lượng phần tử ban đầu.

Bước 3.

Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Giải thuật thứ hai

Ý tưởng giải thuật

Chúng ta áp dụng sàng Eratosthenes (https://vi.wikipedia.org/wiki/S%C3%A0ng_Eratosthenes ) để tìm các số nguyên tố nhỏ hơn hoặc bằng số tự nhiên n:

  • Bước 1: Tạo 1 danh sách các số tự nhiên liên tiếp từ 2 đến n: (2, 3, 4,…, n).
  • Bước 2: Giả sử tất cả các số trong danh sách đều là số nguyên tố. Trong đó, p = 2 là số nguyên tố đầu tiên.
  • Bước 3: Tất cả các bội số của p: 2p, 3p, 4p,… sẽ bị đánh dấu vì không phải là số nguyên tố.
  • Bước 4: Tìm các số còn lại trong danh sách mà chưa bị đánh dấu và phải lớn hơn p. Nếu không còn số nào, dừng tìm kiếm. Ngược lại, gán cho p giá trị bằng số nguyên tố tiếp theo và quay lại bước 3.

Khi giải thuật kết thúc, tất các số chưa bị đánh dấu trong danh sách là các số nguyên tố cần tìm.

Bước 1.

Chúng ta thực hiện giải thuật bằng ngôn ngữ Java như sau:

Bước 2.

Chúng ta thực hiện thử nghiệm phương thức lietKeSNTSecond() trong class Main.java như sau:

Bước 3.

Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Tổng kết

Trong bài này, chúng ta đã cùng nhau tìm hiểu một số giải thuật cơ bản xung quanh số nguyên tố và thực hiện bằng ngôn ngữ Java.

Hy vọng rằng chúng ta có thể áp dụng phù hợp những kỹ thuật và chức năng này cho những bài tiếp theo.

Học kỹ thuật lập trình Java cơ bản qua các ví dụ – Phần 2 – Xây dựng phương thức và Debug trong Eclipse IDE

Giới thiệu

Tiếp theo nội dung của bài trước, trong bài này chúng ta cùng nhau tìm hiểu một số kỹ thuật lập trình cơ bản trong Java đồng thời tìm hiểu một số chức năng cần thiết trong Eclipse IDE.

Chúng ta thực hiện tiếp Yêu cầu 2 và Yêu cầu 3 của bài toán cơ bản thông qua những kỹ thuật về lập trình:

  • Kỹ thuật vòng lặp for kiểu mới.
  • Câu lệnh điều khiển và rẽ nhánh.
  • Các toán tử cơ bản.
  • Định nghĩa và thực thi các phương thức.

Chúng ta cũng tìm hiểu phương pháp debug trong Eclipse IDE để kiểm tra từng câu lệnh cũng như bắt lỗi.

Những kỹ thuật được trình bày sẽ mang tính phổ quát và độc lập ngôn ngữ lập trình. Điều đó có nghĩa rằng chúng ta có thể áp dụng ý tưởng từ các kỹ thuật này khi tìm hiểu các ngôn ngữ khác như PHP / C# / Python.

Xây dựng phương thức trong Java

Một phương thức trong Java là một khối các câu lệnh có tên và có thể được thực thi bằng cách gọi từ một nơi khác trong chương trình.

Chú ý rằng một phương thức phải được định nghĩa bên trong một class. Điều này sẽ được thảo luận kỹ hơn trong các bài tiếp theo về lập trình hướng đối tượng.

Cấu trúc cú pháp của một phương thức như sau:

phạm_vi_truy_cập [static] kiểu_dữ_liệu_trả_về tên_phương_thức (danh_sách_tham_số) {
  // Thực hiện công việc
}

Chúng ta có hai dạng phương thức chính:

  • Dạng phương thức không trả về kết quả.
  • Dạng phương thức có trả về kết quả.

Xây dựng phương thức không trả về kết quả

Bước 1.

Chúng ta thực hiện việc tạo một Java Project mới trong Eclipse IDE.

Chúng ta tiếp tục thực hiện việc tạo package mainclass Main.java.

Màn hình giao diện Eclipse IDE hiển thị nội dung của class Main.java hiện ra.

Chúng ta chú ý lựa chọn việc tạo sẵn phương thức main(String[] args) trong class Main.java.

Bước 2.

Chúng ta thực hiện việc tạo package baitapclass BaiCoBan.java.

Nội dung về packageclass sẽ được thảo luận sâu hơn trong các bài tiếp theo về lập trình hướng đối tượng.

Ở đây chúng ta chỉ cần chú ý tạo theo hướng dẫn, trong đó tên của packageclass có thể đặt theo mục đích riêng.

Chúng ta tiếp tục tạo phương thức:

public void tinhTong() {}

Có 02 từ khóa cần chú ý ở đây:

  • Từ khóa thứ nhất cho biết phạm vi được phép truy xuất đến phương thức này. Ở đây chúng ta sử dụng từ khóa public. Từ khóa này cho biết phạm vi được truy xuất đến phương thức này là trên toàn bộ project. Điều này sẽ được thảo luận kỹ hơn trong các bài tiếp theo về lập trình hướng đối tượng.
  • Từ khóa thứ hai cho biết kiểu dữ liệu của kết quả được trả về sau khi thực thi phương thức. Ở đây chúng ta sử dụng từ khóa void. Từ khóa này cho biết phương thức này không trả về kết quả mà chỉ thực hiện các tác vụ bên trong.

Bước 3.

Nội dung đầu tiên bên trong phương thức tinhTong() như sau:

Bước 4.

Nội dung thứ hai bên trong phương thức tinhTong() như sau:

Bước 5.

Nội dung thứ ba bên trong phương thức tinhTong() như sau:

Ở đây chúng ta có một số điểm cần chú ý:

  1. Thứ nhất, kỹ thuật lặp for mới.

Cú pháp cho kỹ thuật lặp for mới như sau:

for (kiểu_dữ_liệu biến : danh_sách) {
  // Thực hiện công việc
}

Ý nghĩa của cú pháp trên: hệ thống tự động truy xuất lần lượt từng phần tử trong danh_sách và gán giá trị cho biến với kiểu_dữ_liệu phù hợp.

  1. Thứ hai, câu lệnh điều kiện và rẽ nhánh.

Câu lệnh điều kiện thứ nhất là if có cấu trúc cú pháp như sau:

if (điều_kiện_1) {
  // Thực thi công việc nếu điều_kiện_1 là đúng
} else if (điều_kiện_2) {
  // Thực thi công việc nếu điều_kiện_2 là đúng
} else {
  // Thực thi công việc nếu cả điều_kiện_1 và điều_kiện_2 đều sai
}

Chú ý rằng tùy trường hợp chúng ta mới cần đến rẽ nhánh else if hoặc else.

Câu lệnh điều khiển thứ hai là switch có cấu trúc cú pháp như sau:

switch(biểu_thức) {
  case giá_trị_1:
    // thực thi công việc nếu giá trị của biểu_thức trùng với giá_trị_1
    break;
  case giá_trị_2:
    // thực thi công việc nếu giá trị của biểu_thức trùng với giá_trị_2
    break;
  default:
    // thực thi công việc nếu giá trị của biểu_thức khác với các giá trị bên trên
}

Chúng ta có một số chú ý ở đây:

  • Từ khóa break thực hiện thoát khỏi một đoạn chương trình bên trong cặp {} hoặc một vòng lặp.
  • Từ khóa default được sử dụng tùy trường hợp cần thiết.
  1. Thứ ba, một số toán tử cơ bản.

Chúng ta có thể tham khảo một số toán tử cơ bản trong Java như sau:

  • Toán tử +. Thực hiện phép cộng: x + y.
  • Toán tử . Thực hiện phép trừ: x – y.
  • Toán tử *. Thực hiện phép nhân: x * y.
  • Toán tử /. Thực hiện phép chia: x / y.
  • Toán tử %. Thực hiện phép chia lấy số dư: x % y.
  • Toán tử ++. Thực hiện phép cộng thêm 1 vào số: x ++.
  • Toán tử --. Thực hiện phép trừ đi 1 vào số: x --.

Bước 6.

Nội dung thứ tư bên trong phương thức tinhTong() như sau:

Bước 7.

Chúng ta thực thi phương thức tinhTong() trong class Main.java như sau:

Xây dựng phương thức có trả về kết quả

Bước 1.

Đối với phương thức tinhTong() có trả về kết quả, chúng ta có một số chú ý như sau:

  • Chúng ta thay thế từ khóa void bằng kiểu dữ liệu của kết quả được trả về. Ở đây do chúng ta thực hiện tính tổng các số tự nhiên nên kiểu dữ liệu của kết quả được trả về là int.
  • Chúng ta có thể cung cấp tham số cho phương thức này. Ở đây chúng ta cung cấp tham số là mảng int[] tapHop để thực hiện việc tính tổng các số tự nhiên.
  • Do là có trả về kết quả nên ở câu lệnh cuối chúng ta sử dụng từ khóa return. Ở đây chúng ta thực hiện return tong.

Bước 2.

Trong phương thức main() của class Main.java, chúng ta thực hiện một số nội dung trước khi thực thi phương thức tinhTong().

Chúng ta chú ý rằng nên định nghĩa một biến để lưu giá trị được trả về của phương thức tinhTong().

Bước 3.

Chúng ta thực thi toàn bộ project để thử nghiệm những đoạn mã nguồn Java được xây dựng bên trên:

Thực hiện Debug để kiểm tra các dòng lệnh và bắt lỗi trong Eclipse IDE

Bước 1.

Chúng ta nhấn đôi chuột trái vào cột bên trái của dòng lệnh muốn bắt đầu thực hiện debug.

Một chấm nhỏ màu xanh sẽ xuất hiện ngay vị trí dòng lệnh này:

Bước 2.

Chúng ta chú ý đến nút hình con bọ trên thanh Toolbars và nút mũi tên ngay bên phải.

Bước 3.

Chúng ta lựa chọn thực hiện chức năng debug project khi nhấn vào nút mũi tên.

Bước 4.

Màn hình thông báo về việc lựa chọn chuyển sang giao diện debug hiện ra.

Chúng ta lựa chọn nút Switch để chuyển sang giao diện debug.

Bước 5.

Giao diện debug Java của Eclipse IDE hiện ra.

Chúng ta nhận thấy dòng lệnh đầu tiên có đánh dấu chấm nhỏ màu xanh đã được tô đậm màu xanh lá cây.

Các chức năng của project cũng được thực thi và dừng lại tại dòng lệnh này.

Chúng ta có thể nhận thấy các kết quả thực thi trước dòng lệnh này trong phần màn hình Console ở góc bên dưới.

Trong phần màn hình ở góc bên phải, giá trị của các biến được định nghĩa bên trong phương thức đang được debug sẽ được hiển thị. Chú ý rằng chỉ những biến được định nghĩa trước dòng lệnh đang được debug mới được hiển thị.

Bước 6.

Chúng ta có thể nhấn menu Run trên thanh Toolbars để tham khảo các chức năng cơ bản cho tác vụ debug:

  • Chức năng Terminate với cặp phím Ctrl + F2. Chấm dứt tác vụ debug tại thời điểm hiện tại.
  • Chức năng Step Into với phím F5. Thực hiện lần lượt chuyển đến phương thức gặp phải tại dòng lệnh đang được debug.
  • Chức năng Step Over với phím F6. Thực thi dòng lệnh hiện tại và chuyển tiếp đến dòng lệnh tiếp theo bên dưới.
  • Chức năng Run to Line với cặp phím Ctrl + R. Thực thi các dòng lệnh liên tiếp và chuyển đến dòng lệnh đang đặt con trỏ chuột.

Bước 7.

Chúng ta thực hiện chức năng Step Over với phím F6 tại một số dòng lệnh liên tiếp.

Chúng ta thử dừng lại tại dòng lệnh:

System.out.println(phanTu + “ ”);

Chúng ta chú ý phần màn hình Variables ở góc bên phải.

Giá trị của các biến được định nghĩa trước dòng lệnh hiện tại đã được hiển thị chi tiết.

Bước 8.

Chúng ta thử thực hiện chức năng Terminate với cặp phím Ctrl + F2.

Chúng ta nhận thấy tác vụ debug được dừng lại và chỉ còn phần màn hình Console ở góc bên dưới là hiển thị các thông tin cho đến dòng lệnh hiện tại.

Tổng kết

Trong bài này, chúng ta đã cùng nhau tìm hiểu một số kỹ thuật lập trình cơ bản trong Java đồng thời tìm hiểu một số chức năng cần thiết trong Eclipse IDE.

Hy vọng rằng chúng ta có thể áp dụng phù hợp những kỹ thuật và chức năng này cho những bài tiếp theo.

Học kỹ thuật lập trình Java cơ bản qua các ví dụ – Phần 1

Giới thiệu

Trong chuỗi các bài học về kỹ thuật lập trình Java cơ bản qua các ví dụ, chúng ta sẽ cùng nhau tìm hiểu những kỹ thuật lập trình cơ bản nhất mà có thể áp dụng ngay để xây dựng các chương trình ứng dụng thực tế.

Những kỹ thuật được trình bày sẽ mang tính phổ quát và độc lập ngôn ngữ lập trình. Điều đó có nghĩa rằng chúng ta có thể áp dụng các kỹ thuật này đối với các ngôn ngữ khác như PHP / C# / Python.

Đề bài

Yêu cầu 1: Thiết lập một tập hợp gồm một số lượng nhất định các số tự nhiên ngẫu nhiên.

Yêu cầu 2: Tính tổng các số chẵn trong tập hợp này.

Yêu cầu 3: Hiển thị các số này và tổng ra màn hình Console.

Phân tích và lập trình Yêu cầu 1

Phân tích

Để thực hiện Yêu cầu 1, chúng ta xem xét một số tác vụ nhỏ sau:

  • Tác vụ 1. Xác định một số lượng cố định.
  • Tác vụ 2. Thiết lập một tập hợp với số lượng phần tử được xác định bên trên.
  • Tác vụ 3. Xác định giá trị số tự nhiên cho từng phần tử.

Như vậy chúng ta sẽ cùng tìm hiểu những kỹ thuật lập trình sau để thực hiện lần lượt các tác vụ trên:

  • Kỹ thuật 1. Các kiểu dữ liệu số nguyên cơ bản trong Java.
  • Kỹ thuật 2. Khai báo biến và gán giá trị.
  • Kỹ thuật 3. Kiểu dữ liệu về tập hợp: mảng.
  • Kỹ thuật 4. Sử dụng thư viện toán học cơ bản trong Open JDK.
  • Kỹ thuật 5. Kỹ thuật thực hiện vòng lặp để duyệt các phần tử trong tập hợp.

Lập trình với ngôn ngữ Java

Thực hiện Tác vụ 1 – Xác định một số lượng cố định

Chúng ta có thể thực hiện Tác vụ 1 với chuỗi lệnh sau:

int n = 10;

Những điểm cơ bản cần chú ý với chuỗi lệnh trên:

  1. Thứ nhất, cú pháp cho việc định nghĩa một biến và gán giá trị.

Theo quy định trong Java, tất cả các biến phải được định nghĩa trước khi có thể được sử dụng.

Cú pháp cơ bản cho việc định nghĩa một biến như sau:

kiểu_dữ_liệu tên_biến [ = giá_trị ][, tên_biến [= giá_trị ] …];

  1. Thứ hai, kiểu dữ liệu.

Theo Yêu cầu 1, số lượng phần tử của một tập hợp phải là một số tự nhiên.

Java cung cấp cho chúng ta 04 kiểu dữ liệu số tự nhiên tương ứng với phạm vi khác nhau:

  • Kiểu dữ liệu byte. Đây là kiểu dữ liệu có dấu 8-bit có phạm vi số từ –128 đến 127.
  • Kiểu dữ liệu short. Đây là kiểu dữ liệu có dấu 16-bit có phạm vi số từ –32,768 đến 32,767.
  • Kiểu dữ liệu int. Đây là kiểu dữ liệu có dấu 32-bit có phạm vi số từ –2,147,483,648 đến 2,147,483,647.
  • Kiểu dữ liệu long. Đây là kiểu dữ liệu có dấu 64-bit có phạm vi số rất lớn so với kiểu int.
  1. Thứ ba, gán giá trị cho biến.

Chúng ta có thể gán giá trị cho biến ngay khi định nghĩa giống như chuỗi lệnh trên.

Chúng ta cũng có thể định nghĩa biến trước rồi gán giá trị sau:

int n;

n = 10;

Theo nguyên tắc chung, chúng ta nên đặt tên biến có một ý nghĩa cụ thể phù hợp mục tiêu sử dụng.

Tên của biến có thể bao gồm nhiều ký tự viết liền nhau và nên bắt đầu bằng một ký tự in thường.

Ví dụ với Yêu cầu 1 trong bài này, chúng ta có thể đặt tên biến là n hoặc soPhanTu.

  1. Thứ tư, xác định số lượng.

Theo Yêu cầu 1, chúng ta có thể xác định trước một số lượng phần tử.

Ví dụ ở đây là n = 10.

Chúng ta cũng có thể xác định một cách ngẫu nhiên một số lượng trong phạm vi nào đó.

Chúng ta thực hiện ý tưởng trên với các chuỗi lệnh sau:

Random rand = new Random();

int n = rand.nextInt(1000);

Chuỗi lệnh thứ nhất là định nghĩa một thực thể của lớp đối tượng Random. Chúng ta sẽ tìm hiểu kỹ hơn những kiến thức về lớp đối tượng trong các bài sau.

Chuỗi lệnh thứ hai là thực thi phương thức nextInt() để phát sinh ngẫu nhiên một số tự nhiên trong phạm vi từ 0 đến 999. Chúng ta sẽ tìm hiểu kỹ hơn những kiến thức về phương thức trong các bài sau.

Thực hiện Tác vụ 2 – Thiết lập một tập hợp với số lượng phần tử được xác định

Chúng ta có thể thực hiện Tác vụ 2 với chuỗi lệnh sau:

int tapHop[] = new int[n];

Những điểm cơ bản cần chú ý với chuỗi lệnh trên:

  1. Thứ nhất, cú pháp cho việc định nghĩa mảng một chiều và gán giá trị.

Java cung cấp cho chúng ta một kiểu dữ liệu cơ bản để lưu trữ một tập hợp các phần tử: mảng.

Tùy thuộc vào yêu cầu của chương trình ứng dụng, chúng ta có thể định nghĩa mảng một chiều hoặc mảng nhiều chiều.

Theo Yêu cầu 1, chúng ta định nghĩa mảng một chiều.

Cú pháp cơ bản cho việc định nghĩa một mảng một chiều như sau:

kiểu_dữ_liệu tên_mảng[ ] = new kiểu_dữ_liệu[số_lượng];

Chú ý rằng toán tử đặc biệt new giúp khởi tạo trong bộ nhớ một khoảng để lưu trữ mảng một chiều.

Chúng ta sẽ tìm hiểu kỹ hơn những kiến thức về các toán tử trong các bài sau.

  1. Thứ hai, gán giá trị.

Chúng ta có thể gán giá trị cho mảng ngay khi định nghĩa giống như chuỗi lệnh trên.

Chúng ta cũng có thể định nghĩa mảng trước rồi gán giá trị sau:

int tapHop[];

tapHop = new int[số_lượng];

Thực hiện Tác vụ 3 – Xác định giá trị số tự nhiên cho từng phần tử

Những điểm cần chú ý khi thực hiện Tác vụ 3:

  1. Thứ nhất, truy xuất từng phần tử trong mảng.

Theo quy định trong Java, các phần tử trong mảng được bắt đầu từ vị trí 0 đến số_lượng – 1.

Như vậy, để truy xuất phần tử thứ i trong mảng, chúng ta sử dụng cú pháp:

tên_mảng[i-1]

  1. Thứ hai, gán giá trị cho từng phần tử trong mảng bằng phương pháp thủ công.

Chúng ta truy xuất từng phần tử trong mảng rồi gán giá trị.

Ví dụ với mảng tapHop[] gồm có 10 phần tử là các số tự nhiên. Chúng ta thực hiện gán giá trị như sau:

tapHop[0] = 1;
tapHop[1] = 8;
tapHop[2] = 15;
tapHop[3] = 19;
tapHop[4] = 24;
tapHop[5] = 35;
tapHop[6] = 12;
tapHop[7] = 64;
tapHop[8] = 24;
tapHop[9] = 88;

  1. Thứ ba, gán giá trị cho từng phần tử trong mảng bằng phương pháp tự động với kỹ thuật lặp for.

Cú pháp cơ bản cho việc truy xuất các phần tử trong một mảng một chiều với kỹ thuật lặp for như sau:

for (khởi_tạo_biến_truy_xuất; điều_kiện_lặp; bước_lặp) {
  // thực hiện công việc
}

Vòng lặp for hoạt động như sau.

  • Khi vòng lặp đầu tiên bắt đầu, phần khởi tạo của vòng lặp được thực thi. Nói chung, đây là một biểu thức đặt giá trị của biến điều khiển vòng lặp, hoạt động như một bộ đếm điều khiển vòng lặp. Điều quan trọng là phải hiểu rằng biểu thức khởi tạo chỉ được thực hiện một lần.
  • Tiếp theo, điều kiện được đánh giá. Đây phải là một biểu thức Boolean. Nó thường kiểm tra biến điều khiển vòng lặp dựa trên giá trị đích. Nếu biểu thức này là đúng, thì phần thân của vòng lặp được thực thi. Nếu nó sai, vòng lặp chấm dứt.
  • Tiếp theo, phần lặp của vòng lặp được thực thi. Đây thường là một biểu thức làm tăng hoặc giảm biến điều khiển vòng lặp. Vòng lặp sau đó lặp lại, đầu tiên đánh giá biểu thức điều kiện, sau đó thực hiện phần thân của vòng lặp và sau đó thực hiện biểu thức lặp với mỗi lần truyền. Quá trình này lặp lại cho đến khi biểu thức kiểm soát là sai.

Ví dụ với mảng tapHop[] gồm có 10 phần tử là các số tự nhiên. Chúng ta thực hiện gán giá trị như sau:

for (int i = 0; i < n; i++) {
  tapHop[i] = rand.nextInt(100);
}

  1. Thứ tư, gán giá trị cho từng phần tử trong mảng bằng phương pháp tự động với kỹ thuật lặp while.

Cú pháp cơ bản cho việc truy xuất các phần tử trong một mảng một chiều với kỹ thuật lặp while như sau:

while(điều_kiện_lặp) {
  // thực hiện công việc
}

Vòng lặp while là câu lệnh vòng lặp cơ bản nhất Java.

  • Nó lặp lại một câu lệnh hoặc khối trong khi biểu thức kiểm soát của nó là đúng. Điều kiện có thể là bất kỳ biểu thức Boolean nào.
  • Phần thân của vòng lặp sẽ được thực thi miễn là biểu thức điều kiện là đúng.
  • Khi điều kiện trở thành sai, điều khiển chuyển sang dòng mã tiếp theo ngay sau vòng lặp.

Ví dụ với mảng tapHop[] gồm có 10 phần tử là các số tự nhiên. Chúng ta thực hiện gán giá trị như sau:

int i = 0;
while (i < n) {
tapHop[i] = rand.nextInt(100);
i = i + 1;
}

Tổng kết

Trong bài này, chúng ta đã cùng nhau tìm hiểu một số những kỹ thuật lập trình cơ bản đầu tiên trong ngôn ngữ Java.

Trong những bài tiếp theo, chúng ta sẽ tiếp tục tìm hiểu những kỹ thuật lập trình cơ bản khác để hoàn thành bài toán đặt ra ban đầu.

Chương trình Java đầu tiên trên Eclipse IDE

Giới thiệu

Trong bài này, chúng ta cùng nhau xây dựng chương trình Java đầu tiên trên Eclipse IDE.

Tương tự như các chương trình lập trình đầu tiên với các ngôn ngữ khác, nội dung chính của chương trình này:

  • Xuất ra trên màn hình câu tiếng Việt “Xin chào thế giới lập trình và ngôn ngữ Java”.
  • Giao diện hiển thị ở đây là dòng lệnh Console.

Xây dựng chương trình Java đầu tiên

Bước 1.

Chúng ta khởi động Eclipse IDE và lựa chọn thư mục chứa các dự án.

Ví dụ ở đây chúng ta lựa chọn thư mục workspace:

Chúng ta lựa chọn nút Launch để tiếp tục.

Hình 1. Khởi động Eclipse IDE và lựa chọn workspace.

Bước 2.

Màn hình chính của Eclipse IDE hiện ra.

Hình 2. Màn hình chào mừng của Eclipse IDE.

Bước 3.

Chúng ta thu nhỏ cửa sổ chào mừng.

Màn hình chính của Eclipse IDE sẽ hiện ra bao gồm các phân vùng khác nhau như sau:

Hình 3. Màn hình chính của Eclipse IDE bao gồm các phân vùng.

Bước 4.

Chúng ta lựa chọn chức năng File → New → Other để tạo dự án mới.

Hình 4. Lựa chọn chức năng tạo dự án Java mới.

Bước 5.

Màn hình New hiện ra.

Chúng ta lựa chọn Java Project để tạo dự án Java mới.

Chúng ta lựa chọn nút Next để tiếp tục.

Hình 5. Màn hình New để tạo dự án mới.

Bước 6.

Màn hình New Java Project hiện ra.

Chúng ta nhập các thông tin như sau:

Project name: JavaHelloWorld

Chú ý rằng tên của dự án phải theo quy ước:

  • Chữ cái đầu tiên viết hoa.
  • Các từ phải viết liền kề nhau, không được xuất hiện khoảng trắng hay ký tự đặc biệt.

Các lựa chọn khác để mặc định.

Chúng ta lựa chọn nút Finish để thực hiện tạo dự án Java mới.

Hình 6. Thiết lập thông tin dự án Java mới.

Bước 7.

Cửa sổ thông báo hiện ra, hỏi chúng ta có muốn chuyển sang giao diện của Java Console / Desktop hay không.

Chúng ta lựa chọn nút Open Perspective để thực hiện việc chuyển sang giao diện mới.

Hinhf 7. Lựa chọn chuyển sang giao diện Java Console / Desktop.

Bước 8.

Màn hình giao diện của Java Console / Desktop hiện ra.

Chúng ta có thể nhìn thấy phân vùng bên góc trái màn hình có thể hiện cấu trúc thư mục của dự án JavaHelloWorld.

Hình 8. Màn hình giao diện Java Console / Desktop trong Eclipse IDE.

Bước 9.

Chúng ta nhấn chuột phải vào thư mục src.

Chúng ta lựa chọn New → Package để tạo gói java mới.

Theo quy định của ngôn ngữ Java, mọi tập tin Java phải thuộc một gói nào đó.

Điều này sẽ được trao đổi kỹ hơn trong các bài sau về ngôn ngữ Java.

Hình 9. Lựa chọn chức năng tạo gói mới.

Bước 10.

Màn hình New Java Package hiện ra.

Chúng ta nhập thông tin như sau:

Name: main

Chú ý rằng theo quy ước thì chữ cái đầu tiên trong tên của gói phải được viết thường.

Thông tin về Source folder thì giữ nguyên mặc định.

Chúng ta lựa chọn nút Finish để thực hiện tạo gói mới.

Hinh 10. Màn hình New Package để tạo gói mới.

Bước 11.

Màn hình chính của Eclipse IDE sau khi tạo gói main:

Hình 11. Màn hình chính Eclipse IDE sau khi tạo gói main.

Bước 12.

Chúng ta nhấn chuột phải vào gói main.

Chúng ta lựa chọn New → Class để tạo tập tin Java mới.

Theo quy định của ngôn ngữ Java, mọi tập tin Java là một lớp đối tượng.

Điều này sẽ được trao đổi kỹ hơn trong các bài sau về ngôn ngữ Java.

Hình 12. Lựa chọn chức năng tạo lớp đối tượng mới.

Bước 13.

Màn hình New Java Class hiện ra.

Chúng ta nhập thông tin như sau:

Name: Main

Chú ý rằng theo quy ước thì chữ cái đầu tiên trong tên của lớp đối tượng phải được viết hoa.

Chúng ta lựa chọn thêm thông tin:

public static void main(String[] args)

Đây là phương thức chính để thực thi toàn bộ chương trình.

Các thông tin khác giữ nguyên như mặc định.

Chúng ta lựa chọn nút Finish để thực hiện tạo lớp đối tượng Main.

Hình 13. Nhập thông tin tạo lớp đối tượng Main.

Bước 14.

Màn hình chính của Eclipse IDE sau khi tạo lớp đối tượng Main.

Chúng ta thấy các đoạn mã nguồn Java đã được tạo tự động theo như các thông tin đã được nhập trước đó:

Hình 14. Màn hình chính Eclipse IDE sau khi tạo lớp đối tượng Main.

Bước 15.

Chúng ta thực hiện đoạn mã nguồn để hiển thị ra các câu trên màn hình với 02 chuỗi lệnh sau:

System.out.println(“Xin chào thế giới lập trình và ngôn ngữ Java”);

System.out.println(“Chúng ta làm bạn nhé”);

Những điểm cần chú ý theo quy định trong Java:

  • Hai dòng mã nguồn trên được viết bên trong một phương thức nào đó. Cụ thể ở đây là phương thức main().
  • Phương thức để hiển thị một thông tin ra màn hình ConsoleSystem.out.println().
  • Do hiển thị 02 câu nên ở đây chúng ta áp dụng một phương pháp là viết 02 lần phương thức System.out.println().

Điều này sẽ được trao đổi kỹ hơn trong các bài sau về ngôn ngữ Java.

Hình 15. Mã nguồn Java hiển thị thông tin ra màn hình.

Bước 16.

Chúng ta thực hiện cấu hình việc biên dịch và chạy chương trình.

Chúng ta lựa chọn chức năng Run → Run Configurations… để cấu hình biên dịch.

Hình 16. Lựa chọn chức năng cấu hình biên dịch và chạy chương trình Java.

Bước 17.

Màn hình Run Configurations hiện ra.

Chúng ta lựa chọn mục Java Application trong phân vùng bên trái.

Hình 17. Màn hình cấu hình biên dịch và chạy chương trình Java.

Bước 18.

Chúng ta nhấn đôi chuột vào mục Java Application để tạo một cấu hình biên dịch mới.

Giao diện cấu hình biên dịch mới hiện ra.

Chúng ta nhập thông tin tương tự như sau:

Name: JavaHelloWorld

Những thông tin khác giữ nguyên mặc định.

Chúng ta lựa chọn nút Run để thực hiện biên dịch và chạy chương trình.

Hình 18. Nhập thông tin cấu hình biên dịch mới.

Bước 19.

Chương trình của chúng ta đã được biên dịch và chạy tốt.

Màn hình Console hiển thị 02 câu mà chúng ta muốn hiển thị.

Chúng ta có thể thấy màn hình Console ở phân vùng bên dưới.

Hình 19. Thực hiện biên dịch và chạy chương trình Java.

Bước 20

Những lần tiếp theo nếu chúng ta muốn thực hiện biên dịch và chạy chương trình.

Chúng ta lựa chọn dấu mũi tên màu đen chỉ xuống ở ngay bên cạnh nút mũi tên màu xanh trên thanh công cụ.

Chúng ta lựa chọn chức năng 1 JavaHelloWorld trong menu sổ xuống.

Hình 20. Thực hiện biên dịch và chạy chương trình Java.

Tổng kết

Trong bài này chúng ta đã cùng nhau thực hiện những công việc chính sau:

  • Thiết lập một dự án Java Console / Desktop bằng Eclipse IDE.
  • Tìm hiểu một số đoạn mã nguồn Java cơ bản để hiển thị thông tin ra màn hình Console.
  • Cấu hình Eclipse IDE để biên dịch và chạy chương trình Java Console / Desktop.

Thiết lập Eclipse IDE để phát triển Desktop và Web Applications bằng ngôn ngữ Java

Giới thiệu

Eclipse là một môi trường phát triển tích hợp (IDE) được sử dụng trong lập trình máy tính và là IDE Java được sử dụng rộng rãi nhất.

Eclipse được phát triển chủ yếu bằng Java và được sử dụng để phát triển các ứng dụng Java Desktop và Web.

Eclipse cũng có thể được sử dụng để phát triển các ứng dụng với các ngôn ngữ lập trình khác như PHP, Python, …

Thiết lập Eclipse IDE

Bước 1.

Chúng ta vào địa chỉ trang web của Eclipse để download phiên bản Eclipse IDE for Enterprise Java Developers:

https://www.eclipse.org/downloads/packages/

Đây là phiên bản Eclipse đã được tích hợp sẵn các chức năng để phát triển Desktop và Web Applications bằng Java.

Chúng ta lựa chọn download phiên bản dành cho Linux x64.

Hình 1. Download Eclipse IDE for Enterprise Java Developers.

Bước 2.

Sau khi download tập tin eclipse-jee-2019-03-R-linux-gtk-x86_64.tar.gz, chúng ta nhấp đôi chuột để mở tập tin này.

Đây là một dạng tập tin nén và được mở bởi ứng dụng mặc định.

Hình 2. Mở tập tin eclipse được download.

Bước 3.

Sau khi giải nén, chúng ta nhận được kiến trúc của thư mục eclipse như sau:

Hình 3. Kiến trúc thư mục eclipse.

Bước 4.

Chúng ta thực thi tập tin eclipse bằng cách nhấp đôi chuột để chạy.

Màn hình yêu cầu lựa chọn thư mục lưu trữ projects mặc định hiện ra.

Đây là thư mục sẽ được lưu trữ các projects được tạo ra khi chúng ta sử dụng Eclipse để phát triển phần mềm.

Chúng ta lựa chọn thư mục lưu trữ projects.

Chúng ta nhấn nút Launch để bắt đầu sử dụng Eclipse.

Hình 4. Lựa chọn thư mục lưu trữ projects.

Bước 5.

Màn hình chào mừng của Eclipse hiện ra.

Chúng ta có thể để nguyên hoặc tắt trang chào mừng mỗi lần khởi động lại Eclipse.

Hình 5. Giao diện chính của Eclipse.

Cài đặt Plugin WindowBuilder Pro để thiết kế giao diện Desktop Applications

WindowBuilder được xây dựng như là một plugin của Eclipse, bao gồm SWT DesignerSwing Designer và giúp dễ dàng tạo các ứng dụng GUI Java mà không mất nhiều thời gian để viết mã.

Sử dụng trình thiết kế trực quan và công cụ bố cục What You See Is What You Get (có nghĩa là kéo thả các thành phần) để tạo các biểu mẫu đơn giản cho các cửa sổ phức tạp; mã Java sẽ được tạo ra tự động.

Dễ dàng thêm các điều khiển bằng cách kéo và thả, thêm các trình xử lý sự kiện vào các điều khiển, thay đổi các thuộc tính khác nhau của các điều khiển bằng trình chỉnh sửa thuộc tính, quốc tế hóa ứng dụng và nhiều hơn nữa.

Bước 1.

Chúng ta lựa chọn Help → Install New Software.

Hình 6. Lựa chọn chức năng Install New Software.

Bước 2.

Màn hình cài đặt plugin mới hiện ra.

Chúng ta lựa chọn nút Add để thực hiện thêm plugin mới.

Hình 7. Màn hình cài đặt plugin mới.

Bước 3.

Màn hình thêm plugin mới hiện ra.

Chúng ta nhập các thông tin:

Name: WindowBuilder Pro.

Location: http://download.eclipse.org/windowbuilder/latest/

Chúng ta lựa chọn nút Add để thực thi việc thêm plugin WindowBuilder.

Hình 8. Màn hình nhập thông tin plugin mới.

Bước 4.

Màn hình lựa chọn các chức năng sẽ được cài đặt hiện ra.

Chúng ta lựa chọn các chức năng:

WindowBuilder

WindowBuilder XWT Support

Chúng ta lựa chọn nút Next > để tiếp tục.

Hình 9. Màn hình lựa chọn chức năng sẽ cài đặt.

Bước 5.

Màn hình tổng hợp các chức năng sẽ được cài đặt.

Chúng ta lựa chọn nút Next > để tiếp tục.

Hình 10. Màn hình tổng hợp các chức năng sẽ cài đặt.

Bước 6.

Màn hình yêu cầu chấp nhận bản quyền hiện ra.

Chúng ta lựa chọn

I accept the terms of the license agreement

Chúng ta lựa chọn nút Finish để thực hiện cài đặt.

Hình 11. Màn hình yêu cầu chấp nhận bản quyền.

Bước 7.

Sau khi việc cài đặt WindowBuilder được hoàn tất, Eclipse yêu cầu được khởi động lại để áp dụng.

Chúng ta lựa chọn nút Restart Now để khởi động lại Eclipse.

Hình 12. Eclipse yêu cầu khởi động lại để áp dụng WindowBuilder.

Tổng kết

Trong bài này chúng ta đã cùng nhau thực hiện thiết lập Eclipse IDE để phát triển Desktop và Web Applications bằng ngôn ngữ Java.

Thiết lập môi trường lập trình Java 8 – Cài đặt OpenJDK trên Ubuntu 18.04 x64 LTS

Trong bài này chúng ta cùng tìm hiểu việc cài đặt OpenJDK 8 trên Hệ điều hành Ubuntu 18.04 x64 LTS.

Lý do chính cho việc cài đặt OpenJDK 8 thay vì Oracle J2SE JDK 8 là vì để làm quen dần với xu hướng nguồn mở.

Những phiên bản Oracle JDK sau này sẽ dần trở nên không còn miễn phí và nguồn mở nữa.

Các bước cài đặt OpenJDK 8

Bước 1.

Chúng ta chọn chức năng Show Applications ở phía dưới cùng trên thanh Toolbars bên trái màn hình.

Chúng ta nhập chuỗi terminal để lựa chọn ứng dụng thực thi dòng lệnh Terminal.

Hình 1. Lựa chọn ứng dụng Terminal.

Bước 2.

Cửa sổ Terminal hiện ra.

Trước tiên chúng ta thực hiện cập nhật hệ thống với chuỗi lệnh:

sudo apt update

Chuỗi lệnh trên được thực hiện với quyền cao nhất là root.

Chúng ta nhấn phím Enter để thực hiện.

Hệ thống yêu cầu chúng ta nhập mật khẩu vì phải thực hiện với quyền root.

Chúng ta nhập mật khẩu của tài khoản đăng nhập rồi nhấn phím Enter.

Hình 2. Nhập mật khẩu cho tài khoản hiện tại để thực hiện cập nhật.

Bước 3.

Sau khi hệ thống thực hiện cập nhật.

Chúng ta thực hiện cài đặt OpenJDK 8 với chuỗi lệnh:

sudo apt install openjdk-8-jdk

Chúng ta nhấn phím Enter để thực hiện.

Hình 3. Nhập chuỗi lệnh yêu cầu cài đặt OpenJDK 8.

Bước 4.

Trong quá trình cài đặt, hệ thống sẽ hỏi có download font về để cài đặt hay không.

Chúng ta nhấn phím chứa ký tự Y để đồng ý.

Chúng ta nhấn phím Enter để tiếp tục.

Hình 4. Nhấn phím Y để đồng ý download OpenJDK 8.

Bước 5.

Hệ thống tiến hành cài đặt OpenJDK 8.

Hình 5. Hệ thống tiến hành cài đặt OpenJDK 8.

Bước 6.

Hệ thống hoàn thành tiến trình cài đặt OpenJDK 8.

Hình 6. Hệ thống hoàn thành cài đặt OpenJDK 8.

Bước 7.

Chúng ta kiểm tra xem phiên bản OpenJDK 8 được cài đặt có đúng chưa với chuỗi lệnh:

java -version

Hệ thống hiển thị thông tin về phiên bản được cài đặt.

Hình 7. Thực hiện kiểm tra phiên bản OpenJDK 8.

Tổng kết

Trong bài này chúng ta đã cùng nhau thực hiện cài đặt môi trường thực hành Java với OpenJDK 8.

Hi vọng rằng chúng ta có thể dần cảm thấy thoải mái với việc sử dụng Hệ điều hành Ubuntu 18.04 x64 LTS như trên Windows.