Bài tập Java OOP: Chương tình tính diện tích đa giác
Trong bài tập này chúng ta sẽ thực hiện chương trình tính diện tích đa giác bằng ngôn ngữ Java. Sử dụng tính kế thừa trong Java để thực hiện chương trình.
Đề bài: Tính diện tích đa giác.
- Hãy xây dựng lớp DaGiac gồm có các thuộc tính: Số cạnh của đa giác, Mảng các số nguyên chứa kích thước các cạnh của đa giác. Các phương thức: Tính chu vi, In giá trị các cạnh của đa giác.
- Xây dựng lớp TamGiac kế thừa từ lớp DaGiac, trong đó viết đè các hàm tính chu vi và xây dựng thêm phương thức tính diện tích tam giác.
- Các lớp cần phải đảm bảo tính đóng gói và kế thừa.
- Xây dựng một ứng dụng Java để nhập vào một dãy gồm n tam giác rồi in ra màn hình danh sách theo dạng bảng n tam giác.
- In ra các cạnh của các tam giác có diện tích lớn nhất.
- Tìm kiếm và in ra tam giác theo vị trí (index) nhập vào.
- Xóa 1 tam giác tại vị trí nhập vào.
- Sắp xếp mảng tam giác tăng dần theo diện tích.
Chương trình tính diện tích đa giác.
Hướng dẫn:
Chúng ta sẽ yêu cầu người dùng nhập vào số lượng tam giác với các thuộc tính chung ở class DaGiac và các thuộc tính riêng ở class TamGiac, hãy cùng đi theo các bước dưới đây:
- Đầu tiên chúng ta sẽ tạo class DaGiac gồm các thuộc tính: soCanh, a[ ].
- Trong class DaGiac xây dựng các constructor và các phương thức getter, setter. Xây dựng phương thức tính chu vi và in giá trị các cạnh của đa giác và xây dựng phương thức xuất đa giác.
- Tiếp đến xây dựng class TamGiac kế thừa từ class DaGiac, trong đó viết đè thêm hàm tính chu vi và xây dựng thêm phương thức tính diện tích tam giác.
- Tiếp theo sẽ tạo class LístTamGiac với các phương thức nhập tam giác, xuất tam giác, tìm kiếm tam giác theo vị trí index, xóa tam giác theo vị trí nhập vào và cuối cùng là sắp xếp tam giác theo diện tích.
- Cuối cùng sẽ tạo class Main để tạo menu và gọi các phương thức đã viết để chạy chương trình.
import java.util.Arrays; import java.util.Scanner; public class DaGiac { //Khai báo các thuộc tính protected int soCanh; protected int a[]; Scanner scanner = new Scanner(System.in); //khởi tạo constructor mặc định public DaGiac() { this.soCanh = 0; this.a = null; } //Khởi tạo constructor có tham số public DaGiac(int soCanh, int[] a, Scanner scanner) { this.soCanh = soCanh; this.a = a; this.scanner = scanner; } public int getSoCanh() { return soCanh; } public void setSoCanh(int soCanh) { this.soCanh = soCanh; } public int[] getA() { return a; } public void setA(int[] a) { this.a = a; } public Scanner getScanner() { return scanner; } public void setScanner(Scanner scanner) { this.scanner = scanner; } //Khởi tạo phương thức nhập protected void nhap(){ do{ System.out.println("Nhập vào số cạnh: "); this.soCanh = scanner.nextInt(); }while(this.soCanh <= 2); for (int i = 0; i < this.soCanh; i++) { System.out.println("Nhập cạnh thứ "+(i+1)+" :"); this.a[i] = scanner.nextInt(); } } //khởi tạo phương thức tính chu vi protected int tinhCV(){ int cv = 0; for (int i = 0; i < this.soCanh; i++) { cv += this.a[i]; } return cv; } @Override public String toString() { return "DaGiac{" + "soCanh=" + soCanh + ", a=" + Arrays.toString(a) + '}'; } //khởi tạo phương thức xuất đa giác protected void xuatDaGiac(){ System.out.println("Độ dài các cạnh lần lượt là: "); for (int i = 0; i < this.soCanh; i++) { if(i < (this.soCanh-1)){ System.out.print(this.a[i] + "\t \t"); } else{ System.out.println(this.a[i]); } } System.out.println("--------------------End--------------------"); } }
Ở lớp này chúng ta chỉ đơn giản khởi tạo các constructor và getter, setter, viết một phương thức tính chu vi là tinhCV() và phương thức xuatDaGiac() để hiện thị độ dài các tam giác ra màn hình.
Bài viết này được đăng tại [free tuts .net]
import java.util.Scanner; public class TamGiac extends DaGiac { TamGiac() { this.a = new int[3]; this.soCanh = 3; } public void nhap() { do { System.out.println("Nhập số cạnh cho tam giác: "); for (int i = 0; i < 3; i++) { System.out.println("Nhập cạnh thứ " + (i + 1) + " :"); this.a[i] = scanner.nextInt(); } } while ((a[0] + a[1]) <= a[2] || (a[1] + a[2]) <= a[0] || (a[0] + a[2]) <= a[1]); } public int tinhCV() { int cv = 0; for (int i = 0; i < 3; i++) { cv += this.a[i]; } return cv; } public double tinhDT() { double dt = 0; int A = a[0]; int B = a[1]; int C = a[2]; double P = (A + B + C) / 2; dt = Math.sqrt(P * (P - A) * (P - B) * (P - C)); return dt; } public void xuat(){ super.xuatDaGiac(); } }
Trong class này chúng ta sẽ kế thừa từ class DaGiac với các thuộc tính soCanh, a[ ], kèm theo các constructor và getter, setter. Sau đó viết đè thêm hàm tính chu vi tinhCV() và hàm tính diện tích tinhDT() và kế thừa hàm xuatDaGiac() từ class cha DaGiac.
import java.util.Scanner; public class ListTamGiac { private int n; private TamGiac[] list = new TamGiac[100]; Scanner scanner = new Scanner(System.in); public void ListTG(){ for (int i = 0; i < 100; i++) { list[i] = new TamGiac(); } } public void List(){ System.out.println("Nhập số tam giác: "); n = scanner.nextInt(); for (int i = 0; i < n; i++) { TamGiac tg = new TamGiac(); tg.nhap(); list[i] = tg; } } public void xuat(){ for (int i = 0; i < n; i++) { System.out.println("Tam giác thứ : "+(i+1)); list[i].xuatDaGiac(); } } public void xuatLN() { double max = list[0].tinhDT(); int Max = 0; for (int i = 0; i < n; i++) { if (list[i].tinhDT() > max) { max = list[i].tinhDT(); Max = i; } } System.out.println("Lon nhat: "); list[Max].xuatDaGiac(); } public void timKiem(){ System.out.println("Nhập vị trí của tam giác cần tìm kiếm: "); int t = scanner.nextInt(); if(t > n){ System.out.println("Vị trí không tồn tại"); } else{ list[t-1].xuatDaGiac(); } } public void xoa(){ int k = 0; System.out.println("Nhập vào vị trí của tam giác cần xóa"); int x = scanner.nextInt(); if(x >= n){ System.out.println("Vị trí không tồn tại"); } else{ for (int i = 0; i < n; i++) { if(i != (x-1)){ list[k] = list[i]; k++; } } } n = k; } public void sapXep(){ TamGiac temp = list[0]; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if(list[i].tinhDT() > list[j].tinhDT()){ temp = list[j]; list[j] = list[i]; list[i] = temp; } } } } }
Trong class này chúng ta cần khai báo một mảng để chứa số lượng tam giác do người dùng nhập vào. Sau khi khai báo chúng ta sẽ bắt đầu thực hiện tạo các phương thức nhập xuất tam giác.
Xây dựng phương thức xuatLN() để xuất tam giác có diện tích lớn nhất.
Xây dựng phương thức timKiem() để tìm kiếm tam giác theo vị trí index do người dùng nhập vào.
Xây dựng phương thức xoa() để xóa đi tam giác mà người dùng nhập vào.
Xây dựng phương thức sắp xếp giảm dần theo diện tích của các tam giác.
import java.util.Scanner; public class Main { public static void main(String[] args) { int x; Scanner scanner = new Scanner(System.in); ListTamGiac dstg = new ListTamGiac(); do{ System.out.println("\n\t ---------------------------------- "); System.out.println("\t0. Thoát"); System.out.println("\t1. Thêm danh sách các tam giác"); System.out.println("\t2. Xuất danh sách các tam giác"); System.out.println("\t3. In tam giác có diện tích lớn nhất"); System.out.println("\t4. Tìm kiếm tam giác theo vị trí index (Nhập từ người dùng)"); System.out.println("\t5. Xóa 1 tam giác theo vị trí index (Nhập từ người dùng)"); System.out.println("\t6. Sắp xếp các tam giác theo thứ tự giảm dần theo diện tích"); System.out.println("\t------------------------------------"); x = scanner.nextInt(); System.out.println("--------------------End--------------------"); switch (x){ case 1: dstg.List(); break; case 2: dstg.xuat(); break; case 3: dstg.xuatMax(); break; case 4: dstg.timKiem(); break; case 5: dstg.xoa(); break; case 6: dstg.sapXep(); break; } }while(x != 0); System.out.println(" "); } }
Trong class Main chúng ta tạo Menu với các yêu cầu của bài toán và gọi các phương thức đã viết ở class ListTamGiac ra sử dụng.
Kết quả: Sau khi chạy chương trình chúng ta sẽ được Menu như sau, các bạn có thể kiểm tra từng mục để biết được kết quả sẽ như thế nào.
Như vậy là chúng ta đã thực hiện xong chương trình tính diện tích hình chữ nhật sử dụng tính Kế Thừa trong Java. Đây là một tính năng rất đặc biệt và được sử dụng rất nhiều trong Java. Chúc các bạn thực hiện thành công!!!