Gói (package) trong Java, đóng gói ứng dụng thành file jar
- 01-10-2023
- Toanngo92
- 0 Comments
Xét tình huống người dùng có khoảng năm mươi tệp, trong đó một số liên quan đến bán hàng, một số liên quan đến tài khoản và một số liên quan đến tồn kho. Ngoài ra, các tệp này thuộc về các năm khác nhau. Tất cả các tệp này được lưu trong một phần của một tủ. Bây giờ, khi cần một tệp cụ thể, người dùng phải tìm kiếm trong toàn bộ tủ. Điều này tốn thời gian và khó khăn. Vì vậy, người dùng tạo các thư mục riêng biệt và chia các tệp theo năm và tiếp tục nhóm chúng theo nội dung như thể hiện trong hình:
Trong hình minh họa này, các tệp được tổ chức thành các thư mục dựa trên năm và sau đó được nhóm theo nội dung (ví dụ: Bán hàng, Tài khoản, Tồn kho). Điều này giúp người dùng dễ dàng xác định và truy cập các tệp mà họ cần mà không cần phải tìm kiếm trong toàn bộ tủ.
Tương tự, trong Java, bạn có thể tổ chức các tệp bằng cách sử dụng gói (package). Một gói là một không gian tên (namespace) nhóm các lớp (classes) và giao diện (interfaces) có liên quan lại và tổ chức chúng thành một đơn vị. Theo cách tư duy, bạn có thể tưởng tượng các gói như các thư mục khác nhau được tạo trên máy tính để lưu trữ các tệp. Ví dụ, bạn có thể giữ các tệp nguồn (source files) trong một thư mục, hình ảnh trong một thư mục khác và các tệp thực thi (executables) trong một thư mục khác nữa. Phần mềm viết bằng Java thường gồm nhiều lớp. Do đó, tốt nhất bạn nên tổ chức các lớp bằng cách đặt các lớp và giao diện có liên quan vào các gói (packages).
Gói (package) có các đặc điểm sau:
- Một gói có thể chứa các gói con (sub packages). Một gói không thể có hai thành viên (members) trùng tên nhau.
- Nếu một lớp (class) hoặc giao diện (interface) được đặt trong một gói, thì nó phải được tham chiếu bằng tên đầy đủ của nó (fully qualified name), đó là tên của lớp Java kèm theo tên gói của nó.
- Nếu nhiều lớp và giao diện được định nghĩa trong cùng một tệp nguồn Java trong một gói, thì chỉ có một trong chúng có thể là public.
- Tên gói (package names) được viết bằng chữ thường (lowercase).
- Các gói tiêu chuẩn trong ngôn ngữ Java bắt đầu bằng java hoặc javax.
Mục lục
Lợi ích của việc sử dụng Gói (Packages)
Lập trình nên nhóm các lớp (classes) và giao diện (interfaces) liên quan vào một gói vì những lý do sau đây:
- Dễ dàng xác định rằng những lớp này có mối quan hệ với nhau. Người lập trình có thể biết nơi để tìm kiếm kiểu (type) cần thiết để cung cấp các chức năng cần thiết.
- Tên của các lớp trong một gói sẽ không xung đột với tên của các lớp trong các gói khác, vì gói tạo ra một không gian tên mới. Ví dụ, mypackage1.Sample và mypackage2.Sample.
- Lập trình vien có thể cho phép các lớp trong cùng một gói có quyền truy cập không bị giới hạn vào nhau trong khi hạn chế quyền truy cập đối với các lớp ở ngoài gói.
- Gói có thể lưu trữ các lớp ẩn (hidden classes) mà có thể sử dụng trong gói, nhưng không thể nhìn thấy hoặc truy cập từ bên ngoài gói.
- Gói cũng có thể chứa các lớp với dữ liệu thành viên (data members) mà có thể nhìn thấy bởi các lớp khác, nhưng không thể truy cập từ bên ngoài gói.
- Khi một chương trình từ một gói được gọi lần đầu tiên, toàn bộ gói được tải vào bộ nhớ. Do đó, các lần gọi sau đó đến các chương trình con liên quan của cùng một gói không đòi hỏi thêm Input/Output (I/O) từ đĩa.
Các kiểu gói (Types of Packages)
Nền tảng Java đi kèm với một thư viện lớp rộng lớn, đó là một tập hợp các gói (packages). Các lớp này có thể được sử dụng trong các ứng dụng bằng cách nhập các gói vào một lớp. Thư viện này được gọi là Giao diện Lập trình Ứng dụng (Application Programming Interface) (API). Các gói trong API đại diện cho các nhiệm vụ phổ biến nhất liên quan đến lập trình mục đích chung. Mỗi ứng dụng hoặc ứng dụng nhỏ Java có quyền truy cập vào gói lõi trong API, đó là gói java.lang.
Ví dụ, lớp String lưu trạng thái và hành vi liên quan đến chuỗi ký tự; lớp File cho phép người phát triển tạo, xóa, so sánh, kiểm tra hoặc sửa đổi một tệp trên hệ thống tệp. Tương tự, lớp Socket cho phép người phát triển tạo và sử dụng socket network, và các lớp điều khiển Giao diện Người dùng Đồ họa (GUI) như Button, Checkbox, vv cung cấp các điều khiển GUI sẵn sàng sử dụng. Có hàng nghìn lớp như vậy để lựa chọn và sử dụng. Những lớp dựng sẵn này cho phép lập trình viên tập trung vào thiết kế của ứng dụng thay vì quan tâm tới hạ tầng cần thiết để làm cho nó hoạt động.
Các kiểu package được liệt kê phía dưới:
- Predefined packages (gói định nghĩa trước)
- User-defined packages (gói người dùng định nghĩa)
Các gói (packages) được xác định trước là một phần của Java API. Các gói được xác định trước thường được sử dụng phổ biến như sau:
- java.io
- java.util
- Java.awt
Các gói do người phát triển tự định nghĩa được tạo ra bằng cách thực hiện các bước sau:
1. Chọn một tên phù hợp cho gói bằng cách sử dụng các quy tắc đặt tên sau:
- Tên gói thường viết thường để tránh xung đột với tên của các lớp hoặc giao diện.
- Các công ty thường đính tên miền Internet của họ (đảo ngược) làm tiền tố cho tên gói. Ví dụ: com.sample.mypkg cho một gói có tên mypkg được tạo bởi một lập trình viên tại example.com.
- Xử lý xung đột tên trong các dự án của một công ty duy nhất được thực hiện theo quy tắc đặt tên cụ thể của công ty đó. Thường bằng cách bao gồm tên khu vực hoặc tên dự án sau tên công ty. Ví dụ: com.sample.myregion.mypkg.
- Tên gói không nên bắt đầu bằng “java” hoặc “javax” vì chúng được sử dụng cho các gói là một phần của Java API.
- Trong một số trường hợp, tên miền Internet có thể không phải là một tên gói hợp lệ. Ví dụ: nếu tên miền chứa các ký tự đặc biệt như dấu gạch ngang, nếu tên gói bao gồm một từ khóa Java đã được đặt trước như “char”, hoặc nếu tên gói bắt đầu bằng một chữ số hoặc một ký tự khác mà không hợp lệ để sử dụng làm phần đầu của tên gói Java. Trong trường hợp này, nên sử dụng dấu gạch dưới như được thể hiện trong bảng sau:
Tên miền | Tên gói gợi ý |
sample-name.abc.com | com.abc.sample_name |
sample.int | int_.sample |
001name.sample.com | com.sample._001name |
2. Tạo một thư mục có tên giống với tên gói.
3. Đặt tệp nguồn (source file) vào thư mục đã tạo cho gói.
4. Thêm câu lệnh package như là dòng đầu tiên trong tất cả các tệp nguồn (source files) trong gói đó. Lưu ý rằng chỉ có thể có một câu lệnh package trong mỗi tệp nguồn. Ví dụ đoạn mã như sau
package mypackage;
public class StaticMembers {
public static void main(String[] args) {
// Your code goes here
}
public void displayCount(){
System.out.println(1);
}
}
5. Lưu tệp nguồn StaticMembers.java vào gói mypacage.
6. Biên dịch mã nguồn như sau:
javac StaticMembers.java
Hoặc biên dịch mã nguồn với tùy chọn -d như sau:
javac -d . StaticMembers.java
Ở đây, -d đại diện cho thư mục (directory), và “.” biểu thị thư mục hiện tại. Lệnh này sẽ tạo ra một thư mục con có tên là “mypackage” và lưu tệp lớp đã biên dịch vào bên trong nó.
7. Từ thư mục cha của tệp nguồn, thực thi chương trình bằng tên đầy đủ như sau:
java mypackage.StaticMembers
Lưu ý: Biến CLASSPATH phải được thiết lập để trỏ đến thư mục chứa tệp nguồn StaticDemo.java trước khi thực thi chương trình. Ví dụ, bạn có thể thiết lập CLASSPATH như sau: classpath=”D:\mypackage” khi thực thi chương trình, như sau: java -cp “D:\mypackage” mypackage.StaticDemo
Java cho phép người dùng nhập các lớp từ cả các gói được xác định trước và các gói do người dùng tự định nghĩa bằng câu lệnh import. Ví dụ, người ta có thể sử dụng lớp StaticMembers được tạo ra trong Đoạn mã trên, cũng như lớp tích hợp sẵn ArrayList trong gói java.util bằng cách nhập chúng vào một lớp khác thuộc gói khác thông qua từ khóa import. Tuy nhiên, các bổ từ truy cập đi kèm với các thành viên của lớp sẽ xác định xem những thành viên lớp này có thể được truy cập bởi một lớp thuộc gói khác hay không.
Một thành viên của một lớp công khai (public) có thể được truy cập bên ngoài gói bằng cách thực hiện một trong các điều sau đây:
- Đề cập đến lớp thành viên bằng tên đầy đủ của nó, tức là package_name.class_name.
- Nhập lớp thành viên của gói bằng cách sử dụng cú pháp import package_name.class_name.
- Nhập toàn bộ gói, sử dụng cú pháp import package_name.*;
Ví dụ:
package userpkg;
// Import the predefined and user-defined packages
import java.util.ArrayList;
import mypackage.StaticMembers; // Assuming session6 is the correct package name for StaticMembers
public class UserClass {
// Instantiate an ArrayList
ArrayList<String> myCart = new ArrayList<>(); // Added the generic type to ArrayList
/**
* Initializes an ArrayList.
*/
public void createList() {
// Add values to the list
myCart.add("Doll");
myCart.add("Bus");
myCart.add("Teddy");
// Print the list
System.out.println("Cart contents are: " + myCart);
}
/**
* Main method to run the program.
*/
public static void main(String[] args) {
// Instantiate the UserClass class
UserClass objUser = new UserClass();
// Invoke the createList() method
objUser.createList();
// Instantiate the StaticMembers class
StaticMembers objStatic = new StaticMembers(); // Assuming StaticMembers is in the session6 package
// Invoke the displayCount() method
objStatic.displayCount();
}
}
Tạo Tệp .jar Cho Triển Khai (Development)
Tất cả các tệp nguồn của một ứng dụng Java được đóng gói vào một tệp lưu trữ duy nhất được gọi là Java Archive (JAR). Tệp .jar chứa các tệp lớp và tài nguyên bổ sung liên quan đến ứng dụng.
Định dạng tệp .jar cung cấp một số lợi ích như sau:
- Bảo Mật: Tệp .jar có thể được ký số để chỉ có những người dùng nhận dạng chữ ký của bạn mới có thể cấp quyền bảo mật cho phần mềm mà phần mềm có thể không có nếu không có chữ ký.
- Giảm thời gian tải xuống: Các tệp nguồn được đóng gói trong một tệp .jar có thể được tải xuống trình duyệt trong một giao dịch HTTP duy nhất mà không cần mở kết nối mới cho mỗi tệp.
- Nén tệp: Định dạng tệp .jar nén các tệp để lưu trữ hiệu quả.
- Đóng gói cho các phần mở rộng: Khung mở rộng trong Java cho phép thêm chức năng bổ sung cho nền tảng core của Java. Định dạng tệp .jar định nghĩa việc đóng gói cho các phần mở rộng. Java 3D và Java Mail là ví dụ về các phần mở rộng được phát triển bởi Sun Microsystems. Định dạng tệp .jar cũng cho phép chuyển đổi phần mềm thành các phần mở rộng.
- Đóng gói chặt chẽ: Java cung cấp tùy chọn đóng gói (seal) các gói lưu trữ trong các tệp .jar để các gói này có thể áp dụng tính nhất quán về phiên bản. Khi một gói được đóng gói trong một tệp .jar, điều này ngụ ý rằng tất cả các lớp được định nghĩa trong gói đó phải có sẵn trong cùng một tệp .jar.
- Phiên Bản Gói: Một tệp .jar cũng có thể lưu trữ thông tin bổ sung về các tệp, như thông tin nhà cung cấp và phiên bản.
- Tính Di Động: Các tệp .jar được đóng gói trong định dạng tệp ZIP. Điều này cho phép người dùng sử dụng chúng cho các nhiệm vụ như nén dữ liệu không mất mát, giải nén, lưu trữ dữ liệu, và mở tệp lưu trữ.
Để thực hiện các nhiệm vụ cơ bản với tệp .jar, người dùng có thể sử dụng Công cụ Lưu trữ Java, được cung cấp cùng với JDK. Công cụ Lưu trữ Java được gọi bằng cách sử dụng lệnh “jar”. Cú pháp cơ bản để tạo tệp .jar như sau:
jar cf jar-file-name input-file-name(s)
Trong đó:
- c chỉ ra rằng người dùng muốn tạo một tệp .jar.
- f chỉ ra rằng kết quả đầu ra sẽ được lưu vào một tệp thay vì đầu ra tiêu chuẩn (stdout).
- jar-file-name đại diện cho tên của tệp .jar kết quả. Bất kỳ tên nào cũng có thể được sử dụng cho một tệp .jar; phần mở rộng .jar được cung cấp cùng với tên tệp, mặc dù nó không bắt buộc.
- input-file-name(s) đại diện cho một danh sách của một hoặc nhiều tệp cần bao gồm trong .jar, được phân tách bằng dấu cách. Đối số này cũng có thể chứa biểu tượng đại diện ‘*’. Nếu bất kỳ tệp đầu vào nào được chỉ định là một thư mục, nội dung của thư mục đó sẽ được thêm vào tệp .jar một cách đệ quy.
Các tùy chọn c và f có thể được sử dụng trong bất kỳ thứ tự nào, nhưng không có khoảng trống ở giữa. Lệnh “jar” tạo ra một tệp .jar được nén và mặc định đặt nó trong thư mục hiện tại. Nó cũng sẽ tạo ra một tệp thông báo mặc định cho .jar. Các dữ liệu siêu dữ liệu trong tệp .jar, chẳng hạn như tên mục, nội dung của thông báo và các ghi chú, phải được mã hóa bằng UTF-8.
Lưu ý – UTF-8 là một tiêu chuẩn mã hóa đại diện cho mọi ký tự trong bộ ký tự Unicode.
Một số tùy chọn khác, ngoài cf, có sẵn với lệnh “jar” được liệt kê trong bảng dưới:
Tùy chọn | Mô tả |
v | Tạo đầu ra VERBOSE (đầy đủ và có in mô tả trên môi trường dòng lệnh) trên stdout trong khi tệp .jar đang được xây dựng. Đầu ra hiển thị tên của từng tệp được bao gồm trong tệp .jar. |
0 (zero) | Cho biết rằng tệp .jar không được nén. |
M | Cho biết rằng tệp thông báo mặc định không được tạo. |
m | Cho phép bao gồm thông tin thông báo từ một tệp thông báo hiện có. |
-c | Thay đổi thư mục trong quá trình thực thi của lệnh. |
Khi một tệp .jar được tạo ra, thời gian tạo tệp được lưu trong tệp .jar. Vì vậy, ngay cả khi nội dung của tệp .jar không thay đổi, nếu tệp .jar được tạo nhiều lần, các tệp kết quả sẽ không hoàn toàn giống nhau. Vì lý do này, nên sử dụng thông tin về phiên bản trong tệp thông báo (manifest) thay vì thời gian tạo để kiểm soát phiên bản của một tệp .jar.
Ví dụ, hãy xem xét các tệp sau của một ứng dụng trò chơi BouncingBall đơn giản như được hiển thị trong hình vẽ.
Hình 6.7 hiển thị ứng dụng BouncingBall với tệp nguồn BouncingBall.java, tệp lớp BouncingBall.class, thư mục âm thanh (sounds), thư mục hình ảnh (images), và tệp Manifest.txt. Thư mục sounds và images là các thư mục con chứa các tệp âm thanh và hình ảnh .gif động được sử dụng trong ứng dụng.
Để tạo một tệp .jar của ứng dụng bằng dòng lệnh, thực hiện các bước sau:
Tạo cấu trúc thư mục như được hiển thị trong hình trên.
Tạo một tệp văn bản với mã nguồn như trong Đoạn mã sau:
package bounceball;
public class BouncingBall {
public static void main(String[] args) {
System.out.println("This is BouncingBall Game");
}
}
Lưu tệp với tên là BouncingBall.java trong package bounceball.
Biên dịch tệp .java bằng cửa sổ dòng lệnh bằng cách chạy lệnh sau:
javac -d . BouncingBall.java
Lệnh này sẽ tạo ra một thư mục con có tên giống như bounceball và lưu trữ tệp lớp BouncingBall.class trong thư mục đó, như được hiển thị trong hình trên
Lưu ý: Biến môi trường PATH phải được thiết lập trước khi thực thi lệnh bằng cách chạy lệnh: set path=”C:\Program Files\Java\jdk1.7.0\bin”. Nếu tệp lớp phải được lưu trữ trong một thư mục khác, sử dụng tùy chọn -cp để chỉ định CLASSPATH cho các tệp lớp.
Trong cấu trúc thư mục, tạo file Manifest với thuộc tính Main-class như mô tả:
Manifest-version: 1.9
Main-Class: bounceball.BouncingBall
ưu tệp với tên là Manifest.txt trong thư mục nguồn bounceball như trong hình trên. Tệp Manifest.txt sẽ được Jar tool sử dụng để xác định lớp Main trong quá trình tạo tệp .jar. Điều này sẽ thông báo cho Jar tool về điểm bắt đầu của ứng dụng.
Để đóng gói ứng dụng vào một tệp .jar duy nhất có tên BouncingBall.jar, viết lệnh sau:
jar cvmf Manifest.txt bounceball.jar bounceball/BouncingBall.class sounds images
# hoac jar cvfm bouncingball.jar Manifest.txt -C ./bouncingball Bouncingball.class
Lưu ý – Tên của tệp manifest và tệp .jar phải được sắp xếp theo cùng một thứ tự với các tùy chọn m và f.
File jar sẽ được tạo ra như hình mô tả:
Các tùy chọn lệnh “cvmf” cho biết người dùng muốn tạo một tệp .jar với đầu ra chi tiết (v), chỉ định tệp manifest (m), và chỉ định vị trí của tệp manifest (f).
Để thực thi tệp .jar trong cửa sổ dòng lệnh, gõ lệnh sau:
java -jar bounceball.jar
Lệnh này sẽ thực thi lớp main() của tệp .jar và in ra đầu ra như sau:
This is BouncingBall Game
Mô tả các bước qua hình ảnh:
Vì thư mục sounds và images là các thư mục, công cụ Jar sẽ đặt nội dung của chúng vào tệp .jar theo đường dẫn đệ quy. Tệp .jar kết quả BouncingBall.jar sẽ được đặt trong thư mục hiện tại. Bên cạnh đó, việc sử dụng tùy chọn ‘v’ sẽ hiển thị đầu ra chi tiết của tất cả các tệp được bao gồm trong tệp .jar.
Trong ví dụ này, các tệp và thư mục trong bản lưu trữ giữ nguyên tên đường dẫn tương đối và cấu trúc thư mục. Tuy nhiên, người dùng có thể sử dụng tùy chọn ‘c’ để tạo một tệp .jar trong đó các đường dẫn tương đối của các tệp trong bản lưu trữ sẽ không được bảo tồn.
Ví dụ, giả sử người dùng muốn đặt các tệp âm thanh và hình ảnh được sử dụng bởi chương trình BouncingBall vào một tệp .jar và muốn tất cả các tệp nằm ở cấp độ trên cùng, không có cấu trúc thư mục. Điều này có thể được thực hiện bằng cách thực hiện lệnh sau từ thư mục cha của các thư mục sounds và images:
jar cf SoundImages.jar -c sounds . -c images .
Ở đây, ‘-c sounds’ chỉ đạo công cụ Jar vào thư mục sounds và dấu ‘.’ theo sau ‘-c sounds’ chỉ đạo công cụ Jar để lưu trữ tất cả nội dung của thư mục đó. Tương tự, ‘-c images .’ thực hiện cùng một nhiệm vụ với thư mục images. Tệp .jar kết quả sẽ bao gồm tất cả các tệp âm thanh và hình ảnh của thư mục sounds và images như sau:
META-INF/MANIFEST.MF
beep.au
failure.au
ping.au
greenball.gif
redball.gif
table.gif
Tuy nhiên, nếu lệnh sau được sử dụng mà không có tùy chọn ‘-c’:
jar cf SoundImages.jar sounds images
Thì tệp .jar kết quả sẽ có cấu trúc như sau:
META-INF/MANIFEST.MF
sounds/beep.au
sounds/failure.au
sounds/ping.au
sounds/success.au
images/greenball.gif
images/redball.gif
images/table.gif
Bảng dưới hiển thị danh sách các tùy chọn lệnh jar thường được sử dụng:
Tác vụ | Lệnh |
Tạo tệp .jar | jar cf jar-file-name input-file-name(s) |
Xem nội dung tệp .jar | jar tf jar-file-name |
Trích xuất nội dung tệp .jar | jar xf jar-file-name |
Đóng gói ứng dụng vào tệp .jar | java -jar jar-file-name |
Để tạo một tệp .jar của ứng dụng bằng NetBeans IDE, thực hiện các bước sau:
1. Tạo một gói mới có tên bounceball trong dự án.
2. Tạo một lớp Java mới có tên BouncingBall.java trong gói bounceball.
3. Nhập mã nguồn như mô tả phía trên lớp BouncingBall.
4. Đặt BouncingBall.java là Main Class trong cấu hình Run của ứng dụng.
5. hạy ứng dụng bằng cách nhấp vào biểu tượng Run trên thanh công cụ. Đầu ra sẽ được hiển thị trong cửa sổ Output.
6. Để tạo một tệp .jar, nhấp chuột phải vào dự án và chọn tùy chọn Clean and Build
Hình ảnh minh họa:
Người dùng có thể tải tệp .jar này trên bất kỳ thiết bị nào có JVM và thực thi nó bằng cách double-click vào tệp hoặc chạy nó trong cửa sổ dòng lệnh bằng cách ghi lệnh sau:
java -jar jar-file-name.jar
Bài tập
Bài 1:
SmartDesigns là một công ty nổi tiếng về kiến trúc có trụ sở tại Chicago, Illinois. Hiện tại, quản lý của công ty đang tuyển dụng các chuyên gia công nghệ thông tin để tự động hóa các nhiệm vụ thực hiện trong công ty như vẽ, hoạt hình và tính toán kích thước bằng cách phát triển một ứng dụng phần mềm bằng Java. Vì mục đích này, công ty đã tổ chức cuộc phỏng vấn kỹ thuật cho các nhà phát triển trẻ. Như một trong những ứng viên, bạn đã được giao nhiệm vụ sau:
- Tạo một chương trình để tính diện tích của các hình dạng như hình tròn và hình vuông.
- Xác định một tên gói phù hợp để lưu trữ tệp nguồn và lớp.
- Giá trị cho hình dạng phải được nhập từ người dùng cùng với giá trị bán kính hoặc chiều dài tùy theo hình dạng.
- Nếu người dùng không cung cấp bất kỳ giá trị nào, thông báo thích hợp phải được hiển thị cho người dùng.
- Nếu người dùng chỉ định các giá trị cần thiết, hãy tính diện tích của hình dạng được chỉ định.
- Hiển thị kết quả như sau:
- User Number:
- Shape:
- Value of radius/length:
- Calculated Area:
- User Number phải được tăng lên với mỗi người dùng chạy chương trình.
- Đóng gói các tệp vào một tệp .jar (có thể bằng cửa sổ dòng lệnh hoặc bằng NetBeans IDE).
- Thực thi tệp .jar trong cửa sổ dòng lệnh.
Bài 2:
Viết chương trinh mô phỏng một phần mềm quản lý tài khoản mxh theo yêu cầu sau:
1.Tạo kiểu dữ liệu theo cấu trúc sau:
String username
String password
String user_type
Integer register_date
String Cookie
Float price
- Tạo header menu chương trình
Chuong trinh quan ly tai khoan |
1. Nhap lieu |2. Sap xep username theo ten |3. Sap xep theo gia |3. Phan tich |4. Tim user theo ten |5. Luu file |6. Mo File |7. Thoat |
Menu sẽ hiển thị khi chương trình bắt đầu
Sau khi người dung chọn tính năng và thực thi xong, trừ option 7 sẽ hiển thị thông báo xem người dung mong muốn tiếp tục không.
Ban muon tiep tuc khong ?
- Co. (bam phim ‘y’, ‘Y’)
- Khong (bam phim ‘n’, ‘N’)
– Clear man hinh ! (bam ‘c’, ‘C’)
Lua chon cua ban:
Nếu người dùng chọn trường hợp không hợp lệ, yêu cầu nhập lại
Nếu chọn y, quay lại in menu để người dùng tiếp tục nhập liệu, nếu N thì thoát, c thì clear screen
- Nhập vào danh sách tài hoản
Nếu người dùng chọn option 1, chương trình thực hiện những yêu cầu sau:
- Yêu cầu người dùng nhập tổng số tài khoản cần nhập liệu
- Nhập thông tin của mỗi tài khoản
- Validate thông tin nhập vào theo yêu cầu:
0<= giá (price) <= 100000
Register year phải là 5 năm trở lại đây (nâng cao, tự tìm hiểu nếu làm được)
Mô tả tính năng khi input tài khoản:
Nhap vao username [1]:
Name: toanngo92
Password: abcdef
user_type: facebook
Reister year: 1992
price: 1200
Cần tạo riêng một lớp ListAccount để lưu danh sách dữ liệu này (lớp ListAccount có thuộc tính riêng với ki ểu d ữ li ệu ArrayList đ ể l ưu d ữ liệu, c ác phương thức sắp xếp, t ìm kiếm nên được viết toàn bộ trong lớp n ày)
- Khi người dùng chọn option 2, hiển thị ra bảng danh sách sắp xếp theo alphabet
username |
Password |
user_type |
Reg date |
Cookie |
price |
||
Toanngo |
1234 |
|
2005 |
randomstring |
10000 |
||
User2 |
abcde |
|
2007 |
randomstring |
20000 |
||
User3 3 |
1234 |
|
2008 |
randomstring |
1000 |
Khi người dùng chọn option 3, hiển thị ra danh sách sắp xếp giá giảm dần
- Thuật toán Tìm kiếm số lượng nhân sự theo uer_type
Khi người dùng chọn option 3: tính toán số lượng tài khoản theo kiểu mxh
+ 2 tai khoan mxh ‘facebook.
+ 1 tai khoan mxh ‘twitter.
…
- Tìm kiếm tài khoản theo user_type và ía thấp nhất
Khi người dùng chọn option 4: Yêu cầu người dùng nhập mxh cần tìm kiếm và giá thấp nhất (min)
Hiển thị tất cả tài khoản dùng với user_type trùng khớp với input của người dùn và giá cao hơn giá thấp nhất ng dùng nhập vào
- Lưu File
Khi người dùng chọn option 5:
- Yêu cầu người dùng nhập tên file cần xuất ra
- Tạo file mode nhị phân
- Nếu chương trình không tạo đc file, return error và thông báo lỗi cho người dùng
- Nếu thành công, viết dữ liệu danh sách tài khoản đang lưu trữ trong object vào file
- Thông báo với người dùng đã lưu thành công
- Mở file và hiển thị
Khi người dùng chọn option 6:
- Yêu cầu người dùng nhập tên file cần mở
- Tạo file mode nhị phân
- Nếu chương trình không mở đc file, return error và thông báo lỗi cho người dùng
- Đọc dữ liệu từ file và hiển thị ra màn hình
- Đóng file
Bài 3:
Đề bài Java - Phần mềm quản lý quán cafe
-
Tạo cấu trúc dữ liệu sản phẩm:
- Tạo một class
Product
với các thuộc tính sau:- int id; String name;
- // tối đa 20 ký tự
- float price; // Giá sản phẩm
-
Tạo cấu trúc dữ liệu booking:
- Tạo một class
Booking
với các thuộc tính sau:- int id;
- int productId;
- String productName; // tối đa 20 ký tự
- float price; String date; // định dạng 'dd-mm-yy'
- int quantity;
- Lớp mô phỏng booking khi vào quán
- Tạo một class
- Tạo header menu chương trình
- Tạo một class
-
Chuong trinh quan ly quan c af e
1. Nhap san pham |2. Dat ban |3.Tim dat ban theo ngay (dd-mm-yy) |4. Danh sach san pham|5. Lich su dat ban|6. Thoat
Tính năng nhập sản phẩm:
- Nếu người dùng chọn option 1, chương trình yêu cầu:
- Nhập tổng số sản phẩm cần nhập.
- Nhập thông tin chi tiết của mỗi sản phẩm.
- Kiểm tra giá trị hợp lệ: Giá (price) phải từ 0 đến 100.000.
- Sau khi nhập liệu, tự động lưu các sản phẩm vào danh sách dữ liệu để quản lý
Tính năng đặt bàn:
- Nếu người dùng chọn option 2, bắt đầu tính năng đặt bàn. Yêu cầu:
- Nhập id sản phẩm cho đơn đặt.
- Nhập số lượng sản phẩm.
- Lưu trữ vào danh sách dữ liệu tương ứng để quản lý
-
Tính năng tìm đơn đặt bàn theo ngày:
- Nếu người dùng chọn option 3, chương trình cho phép tìm các đơn đặt bàn theo ngày (người dùng nhập ngày đúng format để tìm kiếm).
-
Tính năng hiển thị danh sách sản phẩm:
- Nếu người dùng chọn option 4, hiển thị danh sách sản phẩm, theo sắp xếp cột tên, giá
- Tính năng hiển thị lịch sử đặt bàn:
-
-
- Nếu người dùng chọn option 5, hiển thị lịch sử đặt bàn ,
-
- Thoát chương trình
- Nếu chọn option 6: thoát chương trình