Ánh Văn Hóa Blog

Hướng dẫn assignment java 1 sinh viên kỳ 2 FPT Polytechnic

Hướng dẫn assignment java 1 sinh viên kỳ 2 FPT Polytechnic
Nguyễn Văn Ánh

Nguyễn Văn Ánh

blogger

Publish: 21 thg 2, 2023

Bạn đang gặp khó khắn khi làm assignment java 1 tại fpt polytechnic thì đây là bài viết dành cho bạn đây là source code cho các bạn tham khảo. Trong bài viết này mình không chỉ chia sẻ code mà còn giải thích cho các bạn các phần trong code này.

  • Y1. Nhập danh sách nhân viên từ bàn phím.
  • Y2. Xuất danh sách nhân viên ra màn hình.
  • Y3. Tìm và hiển thị nhân viên theo mã nhập từ bàn phím.
  • Y4. Xóa nhân viên theo mã nhập từ bàn phím.
  • Y5. Cập nhật thông tin nhân viên theo mã nhập từ bàn phím.
  • Y6. Tìm các nhân viên theo khoảng lương nhập từ bàn phím
  • Y7. Sắp xếp nhân viên theo họ và tên.
  • Y8. Sắp xếp nhân viên theo thu nhập.
  • Y9. Xuất 5 nhân viên có thu nhập cao nhất.

Xây dựng lớp NhanVien mô tả nhân viên hành chính

Trước tiên chúng ta hãy tạo class là NhanVien và cũng khai báo 3 thuộc tính tenNhaVien: String, luong: int, maNhanVien: String với phạm vi truy cập là protected để lúc nữa chúng ta cùng đi kế thừa.

protected String tenNhanVien;
protected int luong;
protected String maNhanVien;

bước tiếp theo chúng ta hay tạo 2 hàm tạo có tham sốkhông tham số chắc chắn bạn cũng đã hiểu hàm tạo có tham số và không có tham số để làm gì rồi đúng không.

public NhanVien() {}
public NhanVien(String tenNhanVien, int luong, String maNhanVien) {
    this.tenNhanVien = tenNhanVien;
    this.luong = luong;
    this.maNhanVien = maNhanVien;
}

Bước cuối cùng trong class NhanVien là tạo ra method(phương thức) với phạm vi truy cập public, phương thức getThuNhap với kiểu dữ liệu trả về là double, phương thức getThueNT với kiểu dữ liệu là double.

public double getThuNhap() {
    return this.luong;
}

Nếu bạn quan sát đề bài thì Dưới 9 triệu: không đóng thuế,Từ 9-15 triệu: đóng 10%, Trên 15 triệu: đóng 12% vậy chúng tay hay nghĩ ngay đến việc dùng if - else if - else nhé.

public double getThueNT() {
     if (this.getThuNhap() < 9) {
          return 0;
     } else if (this.getThuNhap() < 15) {
          return this.getThuNhap() * 0.1;
     } else {
          return this.getThuNhap() * 0.12;
     }
}

Phương thức cuối cùng là "inThongTin" chúng ta chỉ việc xuất nó ra ngoài màn hình thôi với câu lệnh System.out.println();

public void inThongTin() {
     System.out.println("Ten nhan vien: " + this.tenNhanVien);
     System.out.println("Ma nhan vien: " + this.maNhanVien);
     System.out.println("Luong hanh chinh: " + this.luong);   
}

2. Xây dựng lớp TiepThi cho đối tượng nhân viện tiếp thị

Khi xây dựng xong class TiepThi bạn hay thêm extends để kế thừa class NhanVien đã tạo từ trước, sau đó hay thêm vào đó 2 thuộc tính doanhSo - double, hoaHong - double với phạm vi truy cập là private do lúc đó mình không để ý lên đã đề là public mong các bạn thông cảm.

public class TiepThi extends NhanVien {
private double doanhSo;
private double hoaHong;
....
}

Và cũng là 2 hàm tạo có tham số và không có tham số. để kế thừa các thuộc tính như là tenNhaVien hay maNhanVien và luong mà khôn cần khai báo là đó chính là sử dụng từ super(tenNhanVien, luong, maNhanVien) để kế thừa từ thằng cha của nó.

public TiepThi() {}

public TiepThi(String tenNhanVien, int luong, String maNhanVien, double hoaHong, double doanhSo) {
      super(tenNhanVien, luong, maNhanVien);
      this.hoaHong = hoaHong;
      this.doanhSo = doanhSo;
}

Bạn hay tạo phương thức setHoaHong với kiểu dữ liệu void, phương thức getThuNhap với kiểu dữ liệu là double, và ở đây chúng ta đã ghi đè phương thức getThuNhap của thằn thuộc tính cha, và chúng ta cũng thêm phương thức inThongTin và ghi đè phương thức inThongTin của thằng cha nó.

public void setHoaHong(double hoaHong) {
     this.hoaHong = hoaHong;
}
public double getThuNhap() {
    return super.luong + this.doanhSo + this.hoaHong;
}
public void inThongTin() {
     System.out.println("Nhan vien tiep thi.");
     super.inThongTin();
     System.out.println("Doanh so: " + this.doanhSo);
     System.out.println("Luong hoa hong: " + this.hoaHong);
}

3. Xây dựng lớp TruongPhong cho đối tượng trưởng phòng

Cũng giống class TiepThi thì class TruongPhong cũng kế thừa từ class NhanVien nhưng chú ta hãy thên thuộc tính trachNghiem - double, cùng với đó chúng ta cũng tạo 2 hàm tạo có tham số và không có tham số, và các hoạt động tương tự như trên mình có giải thích.

public class TruongPhong extends NhanVien {
    public double trachNghiem;
    public TruongPhong() {};
    public TruongPhong(String tenNhanVien, int luong, String maNhanVien, double trachNghiem) {
        super(tenNhanVien, luong, maNhanVien);
        this.trachNghiem = trachNghiem;
    }
}

Tương tự với đó chúng ta hay tạo phương thức getThuNhapinThongTin để ghi đè lại phương thức của class cha mà chúng ta đã kế thừa.

public double getThuNhap() {
     return super.getThuNhap() + this.trachNghiem;
}
public void inThongTin() {
     System.out.println("Nhan vien Truong phong.");
     super.inThongTin();
     System.out.println("Luong trach nghiem: " + this.trachNghiem);
}

4 . Xây dựng class Main đề chúng ta cùng chạy chương trình

Chắc bạn cũng đã biết class Main này đề chúng ta xây dựng đối tượng và chay chươn trình. Sau khi tạo class Main thì hay import 2 thư viện import java.util.ArrayList; import java.util.Scanner; để chúng ta sử dụng được. Bạn hãy khởi tạo một ArrayList với object là NhanVien và khởi tạo Scanner để có thể nhập từ bàn phím vào. khởi tạo một biến luaCon - int biến này sẽ dùng để chứa lữa chọn của chúng ta sau khi nhập từ bàn phím. Tiếp theo bạn hay tạo cho mình một vào do-while với điều kiện truyền vào là (luaChon != 0), nếu các bạn đang thắc mắc tại sao cần dùng đến thằng do-while và trong code này nó hoạt động ra sao thì do-while chúng ta sử dụng nhằm mục đích để người dừng không bị thoát chương trình sau khi chọn xong các case(trường) nhưng nếu bạn nhập 0 thì chắc chắn sẽ bị thoát bởi vì do ở đây là toán tử so sánh nó sẽ trả về true hoặc false và ở đây nếu khác 0 nó sẽ trả về true vòng lặp sẽ chạy tiếp còn trả về false vòng lặp sẽ dừng lại.

ArrayList<NhanVien> DanhSachnv = new ArrayList<NhanVien>();
Scanner sc = new Scanner(System.in);
int luaChon;
do {
//....
} while (luaChon != 0);

Vậy bên trong vòn lặp do-while ta viết những gì? Trước tiên ta cần in ra các lựa chọn để người dùng có thể hiểu và chúng ta sẽ gán lại giá trị cho biến luaChon giá trị của chúng tạ sẽ do người dùng nhập từ bàn phím vào.

// in yêu cầu đề bài
System.out.println("\n------------Menu-----------");
System.out.println("1. Nhap danh sach nhan vien");
System.out.println("2. Xuat danh sach nhan vien");
System.out.println("3. Tim kiem nhan vien theo ma");
System.out.println("4. Xoa nhan vien theo ma");
System.out.println("5. Cap nhat thong tin nhan vien theo ma");
System.out.println("6. Tim cac nhan vien theo khoang luong");
System.out.println("7. Sap xep nha vien theo ho ten");
System.out.println("8. Sap xep nhan vien theo thu nhap");
System.out.println("9. Xuat 5 nhan vien cos thu nhap cao nhat");
System.out.println("0. Thoat");
System.out.println("-------------End-------------\n");
// Nhập lựa chọn
System.out.println("Nhap lua chon: ");
luaChon = sc.nextInt();

Bây giờ chúng hay hãy cùng xây dựng logic để xử lý các trường hợp mà người dùng nhập vào thôi nào, đầu tiên các bạn hãy cứ tạo cho mình switch-case, Chúng ta hãy tạo hết các case nhé. Ở đây mình sẽ tạo hết các case.

// Xử lý lựa chọn
switch (luaChon) {
    case 1: {
        ...
        break;                  
    }
    case 2: {
        ...
        break;
    }
    case 3: {
        ...
        break;
    }
    case 4: {
        ...
        break;
    }
    case 5: {
        ...
        break;
    }
    case 6: {
        ...
        break;
    }
    case 7: {
        ...      
        break;
    }
    case 8: {
        ...      
        break;
    }
    case 9: {
        ...      
        break;
    }
    case 0: {
        System.out.println("Thoat chuong trinh !");
        break;
    }
    default:
        System.out.println("Nhap Sai | Vui long nhap lai !");
}

Ở đây mình tạo một vòng while điều kiện là true mục đính để người dùng sẽ nhập thêm người nếu cần, chúng ta không cần bàn đến 2 dòng sout nhé vì đây chỉ in ra để người dùng nhìn thấy. Tiếp theo chúng ta hãy cùng đi tạo một biến loaiNhanVien - int và giá trị của nó trong khoảng từ 1 đến 3 Vì sao lại vậy? Do 1.hanh chinh | 2.tiep thi | 3.truong phong, nếu các bạn có thắc mắc tại sao lại có cái dòng quần què sc.nextLine() thì đó là để chúng ta bắt được phím enter nhé. Tiếp theo các bạn hay tạo ra 6 biến vói kiểu dữ liêk như sau: tenNhanVien - String, maNhanVien - String, luongHanhChinh - int, hoaHong - double, trachNghiem - double.

System.out.println("1. Nhap danh sach nhan vien");
System.out.println("Chon nhan vien can nhap 1.hanh chinh | 2.tiep thi | 3.truong phong");
int loaiNhanVien = sc.nextInt();
sc.nextLine();
String tenNhanVien;
String maNhanVien;
int luongHanhChinh;
double hoaHong;
double doanhSo;
double trachNghiem;

Để xử lý được lựa chọn của người dùng thì chúng ta cần dùng đến if - else if - else nhé, trước tiên nếu loaiNhanVien == 1 thì đây là nhân viên hành chính, ở đây mình sẽ khởi tạo một đối tượng nhân viên hành chính từ class NhanVien và mình truyền tham số như tên, lương và mã thì ở đây nó sẽ nhảy vào hàm tạo có tham số sau cùng là đi thêm vào mảng DanhSachnv mà mình đã tạo ở phần 4. Logic đó cũng sẽ đúng với 2 trường hợp còn lại chỉ khác nếu loaiNhanVien == 2 thì là nhân viên tiếp thị hoặc loaiNhanVien == 3 là trưởng phòng, còn nếu không rơi vào 3 trường hợp trên thì chúng ta sẽ thông báo cho người dùng biết là hộ đã nhập sai và cập nhập lại.

if (loaiNhanVien == 1) {
    System.out.println("Nhap ten nhan vien Hanh Chinh: ");
    tenNhanVien = sc.nextLine();
    System.out.println("Nhap ma nhan vien Hanh Chinh: ");
    maNhanVien = sc.nextLine();
    System.out.println("Nhap luong Hanh Chinh: ");
    luongHanhChinh = sc.nextInt();
    NhanVien nvhc = new NhanVien(tenNhanVien, luongHanhChinh, maNhanVien);
DanhSachnv.add(nvhc);
} else if (loaiNhanVien == 2) {
    System.out.println("Nhap ten nhan vien Tiep thi: ");
    tenNhanVien = sc.nextLine();
    System.out.println("Nhap ma nhan vien Tiep thi: ");
    maNhanVien = sc.nextLine();
    System.out.println("Nhap luong Hanh Chinh: ");
    luongHanhChinh = sc.nextInt();
    System.out.println("Nhap hoa hong: ");
    hoaHong = sc.nextDouble();
    System.out.println("Nhap doanh so: ");
    doanhSo = sc.nextDouble();
    TiepThi nvtt = new TiepThi(tenNhanVien, luongHanhChinh, maNhanVien, hoaHong, doanhSo);
    DanhSachnv.add(nvtt);
} else if (loaiNhanVien == 3) {
    System.out.println("Nhap ten nhan vien Tiep thi: ");
    tenNhanVien = sc.nextLine();
    System.out.println("Nhap ma nhan vien Tiep thi: ");
    maNhanVien = sc.nextLine();
    System.out.println("Nhap luong Hanh Chinh: ");
    luongHanhChinh = sc.nextInt();
    System.out.println("Nhap luon trach nghiem: ");
    trachNghiem = sc.nextDouble();
    TruongPhong nvtp = new TruongPhong(tenNhanVien, luongHanhChinh, maNhanVien, trachNghiem);
    DanhSachnv.add(nvtp);
} else {
    System.out.println("Ban nhap sai || vui long nhap lai");
    continue;
}

Để xác định người dùng có muốn nhập tiếp hay không thì chúng ta cần dùng để if trước tiên tạo một biến nhapTiep - String giá trị sẽ nhập từ bàn phím nếu người dùng nhập N thì chúng ta sẽ thoát chương trình và ngược lại nhập Y hay bất kỳ phím gì ta sẽ chon người dùng nhập tiếp nhân viên.

System.out.println("Ban co muon nha tiep Y | N");
 sc.nextLine();
 String nhapTiep = sc.nextLine();
 if (nhapTiep.compareToIgnoreCase("N") == 0) {
     break;
 }

Vậy là xong case 1 rồi giờ chúng ta cùng làm tiếp case 2 nhé.

6. Case 2 xuất ra danh sách nhân viên

case 2: {
    System.out.println("2. Xuat danh sach nhan vien");
    for (int i = 0; i < DanhSachnv.size(); i++) {
         System.out.println("\nNhan vien so" + (i + 1));
         DanhSachnv.get(i).inThongTin();
    }
    break;
}

Case 2 mình không cần giải thích nhiều đúng không, ở đây chỉ là sử dụng vòng for thông thường để xuất lý do là mình có thể xuất ra được nhân viên thứ bao nhiêu nhé.

7. Case 3 tìm kiếm nhân viên theo mã

Chúng ta hay đi tạo một biến "timMa - String" với giá trị nhập từ bàn phím nhé và check - boolean và giá trị là true, tiếp theo mình sẽ sử dụng vòng for-each để lặp qua mang cho ngắn, trong vòng for mình sử dụng if để check sau khi lặp qua mình nhân lại đươc một object nhanVien sau đó mình sẽ dùng đâu . để truy xuất vào maNhanVien của từng đối tượng, để so sánh với mã nhân viên thì chúng ta cần dùng đến method có sẵ của chuỗi là compareToIgnoreCase và lý do mình nó cái này mà không phải là compareTo là người dùng nhập chữ hoa hay chữ thường mình cũng tim chỉ cần giống về mặt chữ là được, nếu mà tìm ra nhân viên nào trùng với mã mà người dùng nhập vào mình sẽ in thông tin và gán lại biến check = false.

System.out.println("3. Tim kiem nhan vien theo ma");
System.out.println("\nNhap ma nhan vien: ");
String maTim = sc.nextLine();
boolean check = true;
for (NhanVien nhaVien : DanhSachnv) {
  if (nhaVien.maNhanVien.compareToIgnoreCase(maTim) == 0) {
     nhaVien.inThongTin();
     check = false;
   }
}

Chúng ta hay đi xử lý biến check nhé, biến check là đại điên cho không tìm thấy nếu không mình thấy biến check = true và nó sẽ chạy câu System.out.println("khong tim ra nhan vien voi ma nay.");

if (check) {
System.out.println("khong tim ra nhan vien voi ma nay.");
}

8. Case 4 xóa nhân viên theo mã

Với case 4 mình cũng sẽ tạo một biến maXoa - String với giá trị nhập từ bàn phím và biến "check - boolean" giá trị là true tiếp theo mình sẽ sử dụng vòng for-i để mình có thể được index và xóa đi phân tử có cùng với mã mà người dùng đã nhập còn logic check cũng như trên nhé.

System.out.println("4. Xoa nhan vien theo ma");
System.out.println("\nNhap ma nhan vien can xoa: ");
String maXoa = sc.nextLine();
boolean check = true;
for (int i = 0; i < DanhSachnv.size(); i++) {
     if (DanhSachnv.get(i).maNhanVien.compareToIgnoreCase(maXoa) == 0){
         DanhSachnv.remove(i);
         check = false;
     }
}
if (check) {
System.out.println("Khong co nhan vien trung voi ma nay.");
}

9 . Case 5 cập nhập lại thông tin nhân viên

Mình sẽ tạo ra biến maCapNhat - String với giá trị nhập từ bàn phím và biến check - boolean với logic như trên lên mình sẽ không nói thêm, trước tiên mình sẽ dùng 1 vòng lặp để có thể lặp qua danh sách nhân viên sau đó mình sẽ dùng if để xem mã người dùng nhập vào có trùng với nhân viên nào không thì mình sẽ cho cập nhật lại thông tin còn không trùng mình sẽ thông báo không tìm ra nhân viên có mã như vậy.

Giả sử nếu có thòng nhân viên trùng với mà thì chúng ta sẽ xử lý như sau, đầu tiền là ta tạo là 3 biến tenNhanVien - String, maNhanVien- String, luonHanhChinh - int và mình sử dụng if else-if - else đề xem nhân viên đó thuộc đối tượng nào Nếu nhân viên đó mà thuộc đôi tượng tiếp thị thì chúng ta sẽ tạo ra 2 biến biến nữa hoaHong - doubledoanhSo - double rồi khởi tạo đối tượng nhân viên tiếp thị từ class TiepThi và sử dụng phươn thức set cho nó thay thế lại chỗ nhân viên bị cập nhật, nếu nhân viên đó tược đối tương trưởng phòng thì chúng ta khởi tạo biến trachNghiem - double và khởi tạo đối tượng trưởng phòng từ class TruongPhong và cũng dùng phương thức set để thay thế phần tử được tìm, còn nếu là nhân viên hành chính chúng ta chỉ việc khởi tạo đối tưởng nhân viên hành chính từ class NhanVien

System.out.println("5. Cap nhat thong tin nhan vien theo ma");
System.out.println("\n Nha ma nhan vien can cap nhat: ");
String maCapNhat = sc.nextLine();
boolean check = true;
for (int i = 0; i < DanhSachnv.size(); i++) {
    if (DanhSachnv.get(i).maNhanVien.compareToIgnoreCase(maCapNhat) == 0) {
        check = false;
        String tenNhanVien;
        String maNhanVien;
        int luongHanhChinh;
        System.out.println("Cap nhat lai thong tin");
        if (DanhSachnv.get(i) instanceof TiepThi) {
            System.out.println("Nhap ten: ");
            tenNhanVien = sc.nextLine();
            System.out.println("Nhap ma: ");
            maNhanVien = sc.nextLine();
            System.out.println("Nhap luong hanh chinh: ");
            luongHanhChinh = sc.nextInt();
            System.out.println("Nhap hoa hong: ");
            Double hoaHong = sc.nextDouble();
            System.out.println("Nhap doanh so: ");
            Double doanhSo = sc.nextDouble();
            TiepThi nvtt = new TiepThi(tenNhanVien, luongHanhChinh, maNhanVien, hoaHong, doanhSo);
            DanhSachnv.set(i, nvtt);
        } else if (DanhSachnv.get(i) instanceof TruongPhong) {
            System.out.println("Nhap ten: ");
            tenNhanVien = sc.nextLine();
            System.out.println("Nhap ma: ");
            maNhanVien = sc.nextLine();
            System.out.println("Nhap luong hanh chinh: ");
            luongHanhChinh = sc.nextInt();
            System.out.println("Nhap luong trach nghiem: ");
            Double trachNghiem = sc.nextDouble();
            TruongPhong nvtp = new TruongPhong(tenNhanVien, luongHanhChinh, maNhanVien,
                    trachNghiem);
            DanhSachnv.set(i, nvtp);
        } else {
            System.out.println("Nhap ten: ");
            tenNhanVien = sc.nextLine();
            System.out.println("Nhap ma: ");
            maNhanVien = sc.nextLine();
            System.out.println("Nhap luong hanh chinh: ");
            luongHanhChinh = sc.nextInt();
            NhanVien nvhc = new NhanVien(tenNhanVien, luongHanhChinh, maNhanVien);
            DanhSachnv.set(i, nvhc);
        }
    }
}
if (check) {
    System.out.println("Khong co nhan vien voi ma nay.");
}

10. Case 6 tìm nhân viên theo khoảng lương

Chúng ta cần khởi tạo 2 biến tuLuong - intdenLuong - int sau đó sử dụng vòng lặp để có lặp qua các phần tử của mảng bên trong xử lý dùng if để kiểm tra chúng ta sử dụng toán tử logic và so sánh kết để tìm ra những nhân viên nằm trong khoảng lương này nhé.

System.out.println("6. Tim cac nhan vien theo khoang luong");
System.out.println("Nhap khoang tu: ");
int tuLuong = sc.nextInt();
System.out.println("den: ");
int denLuong = sc.nextInt();
boolean check = true;
for (NhanVien nhaVien : DanhSachnv) {
    if (nhaVien.getThuNhap() > tuLuong && denLuong > nhaVien.getThuNhap()) {
        nhaVien.inThongTin();
        check = false;
    }
}
if (check) {
    System.out.println("Khong co nhan vien trong khong luong nay.");
}

11. Case7 sắp xếp nhân viên theo họ tên

Để sắp xếp được chúng ta cần dùng đến Comparator, chúng ta cần khởi tạo trong đấy chúng ta sẽ xử lý việc sắp xếp theo tên.

System.out.println("7. Sap xep nha vien theo ho ten");
Comparator<NhanVien> comp = new Comparator<NhanVien>() {
    @Override
    public int compare(NhanVien o1, NhanVien o2) {
        return o1.tenNhanVien.compareTo(o2.tenNhanVien);
    }
};
Collections.sort(DanhSachnv, comp);
for (NhanVien nhaVien : DanhSachnv) {
    nhaVien.inThongTin();
}

12. case 8 xắp sếp theo lương

Logic này giống với logic case 8 chỉ thay đổi về phần lấy lường chúng ta sẽ sử dụng phương thức getThuNhap để xử lý logic nhé.

System.out.println("8. Sap xep nhan vien theo thu nhap");
Comparator<NhanVien> comp = new Comparator<NhanVien>() {
    @Override
    public int compare(NhanVien a1, NhanVien a2) {
        return Double.compare(a1.getThuNhap(), a2.getThuNhap());
    }
};
Collections.sort(DanhSachnv, comp);
for (NhanVien nhaVien : DanhSachnv) {
    nhaVien.inThongTin();
}

13. Case 9 xuất 5 nhân viên có lương cao nhất

Ở case 9 chúng ta sử dụng đến collections.sort sắp xếp sanh sách nhân viên từ thu nhập cao đến thấp, rồi sử dụng vòng for để in ra màn hình.

System.out.println("9. Xuat 5 nhan vien co thu nhap cao nhat");
Collections.sort(DanhSachnv, (a, b) -> (int) (b.getThuNhap() - a.getThuNhap()));
for (int i = 0; i < 5; i++) {
    DanhSachnv.get(i).inThongTin();
}

Phần kết

Đây là toàn bộ code của mình có thể nó không phải là các ngắn ngọn nhất nhưng sẽ giúp ích được cho bạn trong môn Java 1 tại fpt polytechnic, nếu bạn đang tìm bài viết này thì chắc bạn cũng sắp thì rồi, minh chúc bạn qua môn java 1 nhé.