Q a m a t h

Loading...
Vui lòng chờ trong giây lát!

[Python] Bài tập quản lý sinh viên (Lời giải)

Python
là một ngôn ngữ lập trình đa mẫu hình, lập trình hướng đối tượng và lập trình cấu trúc được hỗ trợ hoàn toàn, và nhiều tính năng của nó cũng hỗ trợ lập trình hàm và lập trình hướng khía cạnh (bao gồm siêu lập trình và siêu đối tượng (phương thức thần kỳ)).Các mẫu hình khác cũng được hỗ trợ thông qua các phần mở rộng, bao gồm thiết kế theo hợp đồng và lập trình logic.

Đề bài: Viết chương trình quản lý sinh viên trong Python. Mỗi đối tượng sinh viên có các thuộc tính sau: id, tên, giới tính, tuổi, điểm toán, điểm lý, điểm hóa, điểm trung bình và học lực.
Id là mã sinh viên tự động tăng.

Điểm trung bình là giá trị trung bình của 3 môn toán, lý và hóa.

Học lực được tính như sau:

Giỏi: nếu điểm trung bình lớn hơn hoặc bằng 8.
Khá: nếu điểm trung bình nhỏ hơn 8 và lớn hơn hoặc bằng 6.5.
Trung Bình: nếu điểm trung bình nhỏ hơn 6.5 và lớn hơn hoặc bằng 5.
Yếu: nếu điểm trung bình nhỏ hơn 5.
Yêu cầu: tạo ra một menu với các chức năng sau:

1. Thêm sinh viên.
2. Cập nhật thông tin sinh viên bởi ID.
3. Xóa sinh viên bởi ID.
4. Tìm kiếm sinh viên theo tên.
5. Sắp xếp sinh viên theo điểm trung bình (GPA).
6. Sắp xếp sinh viên theo tên.
6. Sắp xếp sinh viên theo ID.
8. Hiển thị danh sách sinh viên.

Lời giải:
Chúng ta sẽ tạo ra một class để định nghĩa sinh viên, và một class để quản lý danh sách sinh viên nhập từ bàn phím. Sau đây là các bước cụ thể để cài đặt chương trình quản lý sinh viên trong Python bằng lập trình hướng đối tượng.
Các công nghệ sử dụng
Các công nghệ sử dụng để tạo bài tập quản lý sinh viên trong Python:
- Eclipse: eclipse-jee-2021-03-R-win32-x86_64
- Python: 3.8
Tạo class sinh viên
Chúng ta sẽ tạo một class sinh viên như sau, DiemTB sẽ được tính bằng trung bình của các môn toán, lý và hóa. HocLuc sẽ được tính toán dựa vào DiemTB như yêu cầu của bài toán.
Class SinhVien.py
class SinhVien:
 
    def __init__(self, id, name, sex, age, diemToan, diemLy, diemHoa):
        self._id = id
        self._name = name
        self._sex = sex
        self._age = age
        self._diemToan = diemToan
        self._diemLy = diemLy
        self._diemHoa = diemHoa
        self._diemTB = 0
        self._hocLuc = ""

Tạo class quản lý sinh viên
Dầu tiên, chúng ta nên tạo ra một biến để lưu trữ danh sách sinh viên, bạn có thể tham khảo một trong các Collections trong Python, ở đây tôi sử dụng List.
listSinhVien = []

Sau đây là danh sách các hàm mà chúng ta sẽ sử dụng trong chương trình quản lý sinh viên:
def generateID(self)
def soLuongSinhVien(self)
def nhapSinhVien(self)
def updateSinhVien(self, ID)
def sortByID(self)
def sortByName(self)
def sortByDiemTB(self)
def findByID(self, ID)
def findByName(self, keyword)
def deleteById(self, ID)
def tinhDTB(self, sv:SinhVien)
def showSinhVien(self, listSV)
def getListSinhVien(self)

1. Hàm generateID()
Yêu cầu của bài toán là id của sinh viên tự động tăng.
Nên chúng ta sẽ tạo hàm này để lấy ra id lớn nhất của danh sách sinh viên.
Thân hàm generateID():
# Hàm tạo ID tăng dần cho nhân viên
def generateID(self):
    maxId = 1
    if (self.soLuongSinhVien() > 0):
        maxId = self.listSinhVien[0]._id
        for sv in self.listSinhVien:
            if (maxId < sv._id):
                maxId = sv._id
        maxId = maxId + 1
    return maxId

2. Hàm trả về số lượng sinh viên soLuongSinhVien()
Hàm này trả về số lượng sinh viện hiện tại trong ListSinhVien:
def soLuongSinhVien(self):
    return self.listSinhVien.__len__()

3. Hàm nhập thông tin sinh viên
Hàm này được sử dụng để thêm mới sinh viên vào danh sách sinh viên ListSinhVien:
Thân hàm nhapSinhVien():
def nhapSinhVien(self):
    # Khởi tạo một sinh viên mới
    svId = self.generateID()
    name = input("Nhap ten sinh vien: ")
    sex = input("Nhap gioi tinh sinh vien: ")
    age = int(input("Nhap tuoi sinh vien: "))
    diemToan = float(input("Nhap diem toan: "))
    diemLy = float(input("Nhap diem Ly: "))
    diemHoa = float(input("Nhap diem Hoa: "))
    sv = SinhVien(svId, name, sex, age, diemToan, diemLy, diemHoa)
    self.tinhDTB(sv)
    self.xepLoaiHocLuc(sv)
    self.listSinhVien.append(sv)

4. Hàm cập nhật thông tin sinh viên
Hàm này được sử dụng để cập nhật thông tin sinh viên theo ID:
Trong trường hợp bạn không nhập gì cho các thuộc tính của sinh viên thì thuộc tính đó không được thay đổi.
Thân hàm updateSinhVien():
def updateSinhVien(self, ID):
    # Tìm kiếm sinh viên trong danh sách listSinhVien
    sv:SinhVien = self.findByID(ID)
    # Nếu sinh viên tồn tại thì cập nhập thông tin sinh viên
    if (sv != None):
        # nhập thông tin sinh viên
        name = input("Nhap ten sinh vien: ")
        sex = input("Nhap gioi tinh sinh vien: ")
        age = int(input("Nhap tuoi sinh vien: "))
        diemToan = float(input("Nhap diem toan: "))
        diemLy = float(input("Nhap diem Ly: "))
        diemHoa = float(input("Nhap diem Hoa: "))
        # cập nhật thông tin sinh viên
        sv._name = name
        sv._sex = sex
        sv._age = age
        sv._diemToan = diemToan
        sv._diemLy = diemLy
        sv._diemHoa = diemHoa
        self.tinhDTB(sv)
        self.xepLoaiHocLuc(sv)
    else:
        print("Sinh vien co ID = {} khong ton tai.".format(ID))

5. Hàm xóa sinh viên theo ID
Hàm này được sử dụng để xóa sinh viên khỏi danh sách theo ID. Tình sinh viên có ID đã cho trong danh sách, nếu tồn tại thì thực hiện xóa sinh viên.
Thân hàm deleteById():
# Hàm xóa sinh viên theo ID
def deleteById(self, ID):
    isDeleted = False
    # tìm kiếm sinh viên theo ID
    sv = self.findByID(ID)
    if (sv != None):
        self.listSinhVien.remove(sv)
        isDeleted = True
    return isDeleted 

6. Hàm tìm kiếm sinh viên theo tên
Hàm này được sử dụng để tìm kiếm sinh viên trong danh sách theo tên. Không phân biệt chữ hoa, chữ thường.
Thân hàm findByName():
# Hàm tìm kiếm sinh viên theo tên
# Trả về một danh sách sinh viên
def findByName(self, keyword):
    listSV = []
    if (self.soLuongSinhVien() > 0):
        for sv in self.listSinhVien:
            if (keyword.upper() in sv._name.upper()):
                listSV.append(sv)
    return listSV

7. Hàm tính điểm trung bình và xếp loại học lực
Thân hàm tinhDTB():
# Hàm tính điểm TB cho sinh viên
def tinhDTB(self, sv:SinhVien):
    diemTB = (sv._diemToan + sv._diemLy + sv._diemHoa) / 3
    # làm tròn điểm trung binh với 2 chữ số thập phân
    sv._diemTB = math.ceil(diemTB * 100) / 100

Thân hàm xepLoaiHocLuc():
#Hàm xếp loại học lực cho nhân viên
def xepLoaiHocLuc(self, sv:SinhVien):
    if (sv._diemTB >= 8):
        sv._hocLuc = "Gioi"
    elif (sv._diemTB >= 6.5):
        sv._hocLuc = "Kha"
    elif (sv._diemTB >= 5):
        sv._hocLuc = "Trung Binh"
    else:
        sv._hocLuc = "Yeu"

8. Hàm sắp xếp danh sách sinh viên theo điểm trung bình
Hàm này được sử dụng để sắp xếp sinh viên theo điểm trung bình theo thứ tự tăng dần.
Thân hàm sortByDiemTB():
# Hàm sắp xếp danh sach sinh vien theo điểm TB tăng dần
def sortByDiemTB(self):
    self.listSinhVien.sort(key=lambda x: x._diemTB, reverse=False)

9. Hàm sắp xếp danh sách sinh viên theo tên
Hàm này được sử dụng để sắp xếp sinh viên theo tên theo thứ tự tăng dần và không phân biệt chữ hoa, chữ thường.
Thân hàm sortByName():
#Hàm sắp xếp danh sach sinh vien theo tên tăng dần
def sortByName(self):
    self.listSinhVien.sort(key=lambda x: x._name, reverse=False)

10. Hàm hiện thị danh sách sinh viên ra màn hình
Hàm này được sử dụng để hiện thị danh sách sinh viên ra màn hình.
Thân hàm showSinhVien():
# Hàm hiển thị danh sách sinh viên ra màn hình console
def showSinhVien(self, listSV):
    # hien thi tieu de cot
    print("{:<8} {:<18} {:<8} {:<8}{:<8} {:<8} {:<8} {:<8} {:<8}"
          .format("ID", "Name", "Sex", "Age", "Toan", "Ly", "Hoa", "Diem TB", "Hoc Luc"))
    # hien thi danh sach sinh vien
    if (listSV.__len__() > 0):
        for sv in listSV:
            print("{:<8} {:<18} {:<8} {:<8}{:<8} {:<8} {:<8} {:<8} {:<8}"
                  .format(sv._id, sv._name, sv._sex, sv._age, sv._diemToan, sv._diemLy, 
                          sv._diemHoa,sv._diemTB, sv._hocLuc))
    print("\n")

11. Class QuanLySinhVien.py chứa toàn bộ các hàm trên
Class QuanLySinhVien.py:
import math
from main.SinhVien import SinhVien
 
class QuanLySinhVien:
    listSinhVien = []
 
    # Hàm tạo ID tăng dần cho nhân viên
    def generateID(self):
        maxId = 1
        if (self.soLuongSinhVien() > 0):
            maxId = self.listSinhVien[0]._id
            for sv in self.listSinhVien:
                if (maxId < sv._id):
                    maxId = sv._id
            maxId = maxId + 1
        return maxId
 
    def soLuongSinhVien(self):
        return self.listSinhVien.__len__()
 
    def nhapSinhVien(self):
        # Khởi tạo một sinh viên mới
        svId = self.generateID()
        name = input("Nhap ten sinh vien: ")
        sex = input("Nhap gioi tinh sinh vien: ")
        age = int(input("Nhap tuoi sinh vien: "))
        diemToan = float(input("Nhap diem toan: "))
        diemLy = float(input("Nhap diem Ly: "))
        diemHoa = float(input("Nhap diem Hoa: "))
        sv = SinhVien(svId, name, sex, age, diemToan, diemLy, diemHoa)
        self.tinhDTB(sv)
        self.xepLoaiHocLuc(sv)
        self.listSinhVien.append(sv)
 
    def updateSinhVien(self, ID):
        # Tìm kiếm sinh viên trong danh sách listSinhVien
        sv:SinhVien = self.findByID(ID)
        # Nếu sinh viên tồn tại thì cập nhập thông tin sinh viên
        if (sv != None):
            # nhập thông tin sinh viên
            name = input("Nhap ten sinh vien: ")
            sex = input("Nhap gioi tinh sinh vien: ")
            age = int(input("Nhap tuoi sinh vien: "))
            diemToan = float(input("Nhap diem toan: "))
            diemLy = float(input("Nhap diem Ly: "))
            diemHoa = float(input("Nhap diem Hoa: "))
            # cập nhật thông tin sinh viên
            sv._name = name
            sv._sex = sex
            sv._age = age
            sv._diemToan = diemToan
            sv._diemLy = diemLy
            sv._diemHoa = diemHoa
            self.tinhDTB(sv)
            self.xepLoaiHocLuc(sv)
        else:
            print("Sinh vien co ID = {} khong ton tai.".format(ID))
 
    # Hàm sắp xếp danh sach sinh vien theo ID tăng dần
    def sortByID(self):
        self.listSinhVien.sort(key=lambda x: x._id, reverse=False)
 
    #Hàm sắp xếp danh sach sinh vien theo tên tăng dần
    def sortByName(self):
        self.listSinhVien.sort(key=lambda x: x._name, reverse=False)
 
    # Hàm sắp xếp danh sach sinh vien theo điểm TB tăng dần
    def sortByDiemTB(self):
        self.listSinhVien.sort(key=lambda x: x._diemTB, reverse=False)
 
    # Hàm tìm kiếm sinh viên theo ID
    # Trả về một sinh viên
    def findByID(self, ID):
        searchResult = None
        if (self.soLuongSinhVien() > 0):
            for sv in self.listSinhVien:
                if (sv._id == ID):
                    searchResult = sv
        return searchResult
 
    # Hàm tìm kiếm sinh viên theo tên
    # Trả về một danh sách sinh viên
    def findByName(self, keyword):
        listSV = []
        if (self.soLuongSinhVien() > 0):
            for sv in self.listSinhVien:
                if (keyword.upper() in sv._name.upper()):
                    listSV.append(sv)
        return listSV
 
    # Hàm xóa sinh viên theo ID
    def deleteById(self, ID):
        isDeleted = False
        # tìm kiếm sinh viên theo ID
        sv = self.findByID(ID)
        if (sv != None):
            self.listSinhVien.remove(sv)
            isDeleted = True
        return isDeleted
 
    # Hàm tính điểm TB cho sinh viên
    def tinhDTB(self, sv:SinhVien):
        diemTB = (sv._diemToan + sv._diemLy + sv._diemHoa) / 3
        # làm tròn điểm trung binh với 2 chữ số thập phân
        sv._diemTB = math.ceil(diemTB * 100) / 100
 
    #Hàm xếp loại học lực cho nhân viên
    def xepLoaiHocLuc(self, sv:SinhVien):
        if (sv._diemTB >= 8):
            sv._hocLuc = "Gioi"
        elif (sv._diemTB >= 6.5):
            sv._hocLuc = "Kha"
        elif (sv._diemTB >= 5):
            sv._hocLuc = "Trung Binh"
        else:
            sv._hocLuc = "Yeu"
 
    # Hàm hiển thị danh sách sinh viên ra màn hình console
    def showSinhVien(self, listSV):
        # hien thi tieu de cot
        print("{:<8} {:<18} {:<8} {:<8}{:<8} {:<8} {:<8} {:<8} {:<8}"
              .format("ID", "Name", "Sex", "Age", "Toan", "Ly", "Hoa", "Diem TB", "Hoc Luc"))
        # hien thi danh sach sinh vien
        if (listSV.__len__() > 0):
            for sv in listSV:
                print("{:<8} {:<18} {:<8} {:<8}{:<8} {:<8} {:<8} {:<8} {:<8}"
                      .format(sv._id, sv._name, sv._sex, sv._age, sv._diemToan, sv._diemLy, 
                              sv._diemHoa,sv._diemTB, sv._hocLuc))
        print("\n")
 
    # Hàm trả về danh sách sinh viên hiện tại
    def getListSinhVien(self):
        return self.listSinhVien

Hàm main của chương trình quản lý sinh viên trong Python
Hàm main của chúng ta được sử dụng để khởi tạo menu và điều khiển chương trình quản lý sinh viên. Nó được đặt trong class Main:
Class Main.py:
from main.QuanLySinhVien import QuanLySinhVien
 
# khởi tạo một đối tượng QuanLySinhVien để quản lý sinh viên
qlsv = QuanLySinhVien()
while (1==1):
    print("\nCHUONG TRINH QUAN LY SINH VIEN C#")
    print("*************************MENU**************************")
    print("**  1. Them sinh vien.                               **")
    print("**  2. Cap nhat thong tin sinh vien boi ID.          **")
    print("**  3. Xoa sinh vien boi ID.                         **")
    print("**  4. Tim kiem sinh vien theo ten.                  **")
    print("**  5. Sap xep sinh vien theo diem trung binh (GPA). **")
    print("**  6. Sap xep sinh vien theo ten.                   **")
    print("**  7. Sap xep sinh vien theo ID.                    **")
    print("**  8. Hien thi danh sach sinh vien.                 **")
    print("**  0. Thoat                                         **")
    print("*******************************************************")
     
    key = int(input("Nhap tuy chon: "))
    if (key == 1):
        print("\n1. Them sinh vien.")
        qlsv.nhapSinhVien()
        print("\nThem sinh vien thanh cong!")
    elif (key == 2):
        if (qlsv.soLuongSinhVien() > 0):
            print("\n2. Cap nhat thong tin sinh vien. ")
            print("\nNhap ID: ")
            ID = int(input())
            qlsv.updateSinhVien(ID)
        else:
            print("\nSanh sach sinh vien trong!")
    elif (key == 3):
        if (qlsv.soLuongSinhVien() > 0):
            print("\n3. Xoa sinh vien.")
            print("\nNhap ID: ")
            ID = int(input())
            if (qlsv.deleteById(ID)):
                print("\nSinh vien co id = ", ID, " da bi xoa.")
            else:
                print("\nSinh vien co id = ", ID ," khong ton tai.")
        else:
            print("\nSanh sach sinh vien trong!")
    elif (key == 4):
        if (qlsv.soLuongSinhVien() > 0):
            print("\n4. Tim kiem sinh vien theo ten.")
            print("\nNhap ten de tim kiem: ")
            name = input()
            searchResult = qlsv.findByName(name)
            qlsv.showSinhVien(searchResult)
        else:
            print("\nSanh sach sinh vien trong!")
    elif (key == 5):
        if (qlsv.soLuongSinhVien() > 0):
            print("\n5. Sap xep sinh vien theo diem trung binh (GPA).")
            qlsv.sortByDiemTB()
            qlsv.showSinhVien(qlsv.getListSinhVien())
        else:
            print("\nSanh sach sinh vien trong!")
    elif (key == 6):
        if (qlsv.soLuongSinhVien() > 0):
            print("\n6. Sap xep sinh vien theo ten.")
            qlsv.sortByName()
            qlsv.showSinhVien(qlsv.getListSinhVien())
        else:
            print("\nSanh sach sinh vien trong!")
    elif (key == 7):
        if (qlsv.soLuongSinhVien() > 0):
            print("\n6. Sap xep sinh vien theo ID.")
            qlsv.sortByID()
            qlsv.showSinhVien(qlsv.getListSinhVien())
        else:
            print("\nSanh sach sinh vien trong!")
    elif (key == 8):
        if (qlsv.soLuongSinhVien() > 0):
            print("\n7. Hien thi danh sach sinh vien.")
            qlsv.showSinhVien(qlsv.getListSinhVien())
        else:
            print("\nSanh sach sinh vien trong!")
    elif (key == 0):
        print("\nBan da chon thoat chuong trinh!")
        break
    else:
        print("\nKhong co chuc nang nay!")
        print("\nHay chon chuc nang trong hop menu.")
Ok. Run chương trình quản lý sinh viên trong Python và xem kết quả.
Mới hơn Cũ hơn
Trang trí đón tết cho blog/website bằng hình ảnh câu đối, cành mai Trang trí đón tết cho blog/website bằng hình ảnh câu đối, cành mai