Chào mừng bạn đến với EzBeauty.vn! Hôm nay chúng ta sẽ tìm hiểu về bài tập quản lý sinh viên trong Python. Chương trình này sẽ giúp bạn quản lý thông tin của sinh viên một cách dễ dàng. Hãy cùng khám phá nhé!

Đề bài: Viết chương trình quản lý sinh viên trong Python

Trước tiên, chúng ta cần tạo một chương trình quản lý sinh viên trong Python. Mỗi sinh viên sẽ có các thông tin như 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 sẽ được tự động tăng cho mỗi sinh viên.

Điểm trung bình sẽ được tính bằng giá trị trung bình của 3 môn toán, lý và hóa.

Học lực sẽ đượ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.
  7. 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 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. Dưới đâ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, tham khảo bài Cài đặt Python.
  • Python: 3.8

Cấu trúc chương trình Python:

Cấu trúc chương trình Python

Tạo class sinh viên

Chúng ta sẽ tạo một class sinh viên như sau, trong đó 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

Đầ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 chúng 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 sinh 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("Nhập tên sinh viên: ")
    sex = input("Nhập giới tính sinh viên: ")
    age = int(input("Nhập tuổi sinh viên: "))
    diemToan = float(input("Nhập điểm toán: "))
    diemLy = float(input("Nhập điểm Lý: "))
    diemHoa = float(input("Nhập điểm Hóa: "))
    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("Nhập tên sinh viên: ")
        sex = input("Nhập giới tính sinh viên: ")
        age = int(input("Nhập tuổi sinh viên: "))
        diemToan = float(input("Nhập điểm toán: "))
        diemLy = float(input("Nhập điểm Lý: "))
        diemHoa = float(input("Nhập điểm Hóa: "))
        # 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 = {} không tồn tại.".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ìm 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 bình 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 sinh viên
def xepLoaiHocLuc(self, sv:SinhVien):
    if (sv._diemTB >= 8):
        sv._hocLuc = "Giỏi"
    elif (sv._diemTB >= 6.5):
        sv._hocLuc = "Khá"
    elif (sv._diemTB >= 5):
        sv._hocLuc = "Trung Bình"
    else:
        sv._hocLuc = "Yếu"

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 sách sinh viên 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 sách sinh viên 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):
    # hiển thị tiêu đề cột
    print("{:<8} {:<18} {:<8} {:<8} {:<8} {:<8} {:<8} {:<8} {:<8}".format("ID", "Name", "Sex", "Age", "Toan", "Ly", "Hoa", "Diem TB", "Hoc Luc"))
    # hiển thị danh sách sinh viên
    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 sinh 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):
        svId = self.generateID()
        name = input("Nhập tên sinh viên: ")
        sex = input("Nhập giới tính sinh viên: ")
        age = int(input("Nhập tuổi sinh viên: "))
        diemToan = float(input("Nhập điểm toán: "))
        diemLy = float(input("Nhập điểm Lý: "))
        diemHoa = float(input("Nhập điểm Hóa: "))
        sv = SinhVien(svId, name, sex, age, diemToan, diemLy, diemHoa)
        self.tinhDTB(sv)
        self.xepLoaiHocLuc(sv)
        self.listSinhVien.append(sv)

    def updateSinhVien(self, ID):
        sv:SinhVien = self.findByID(ID)
        if (sv != None):
            name = input("Nhập tên sinh viên: ")
            sex = input("Nhập giới tính sinh viên: ")
            age = int(input("Nhập tuổi sinh viên: "))
            diemToan = float(input("Nhập điểm toán: "))
            diemLy = float(input("Nhập điểm Lý: "))
            diemHoa = float(input("Nhập điểm Hóa: "))
            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 = {} không tồn tại.".format(ID))

    def sortByID(self):
        self.listSinhVien.sort(key=lambda x: x._id, reverse=False)

    def sortByName(self):
        self.listSinhVien.sort(key=lambda x: x._name, reverse=False)

    def sortByDiemTB(self):
        self.listSinhVien.sort(key=lambda x: x._diemTB, reverse=False)

    def findByID(self, ID):
        searchResult = None
        if (self.soLuongSinhVien() > 0):
            for sv in self.listSinhVien:
                if (sv._id == ID):
                    searchResult = sv
        return searchResult

    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

    def deleteById(self, ID):
        isDeleted = False
        sv = self.findByID(ID)
        if (sv != None):
            self.listSinhVien.remove(sv)
            isDeleted = True
        return isDeleted

    def tinhDTB(self, sv:SinhVien):
        diemTB = (sv._diemToan + sv._diemLy + sv._diemHoa) / 3
        sv._diemTB = math.ceil(diemTB * 100) / 100

    def xepLoaiHocLuc(self, sv:SinhVien):
        if (sv._diemTB >= 8):
            sv._hocLuc = "Giỏi"
        elif (sv._diemTB >= 6.5):
            sv._hocLuc = "Khá"
        elif (sv._diemTB >= 5):
            sv._hocLuc = "Trung Bình"
        else:
            sv._hocLuc = "Yếu"

    def showSinhVien(self, listSV):
        print("{:<8} {:<18} {:<8} {:<8} {:<8} {:<8} {:<8} {:<8} {:<8}".format("ID", "Name", "Sex", "Age", "Toan", "Ly", "Hoa", "Diem TB", "Hoc Luc"))
        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")

    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

qlsv = QuanLySinhVien()

while (1==1):
    print("nCHƯƠNG TRÌNH QUẢN LÝ SINH VIÊN C#")
    print("*************************MENU**************************")
    print("** 1. Thêm sinh viên. **")
    print("** 2. Cập nhật thông tin sinh viên bởi ID. **")
    print("** 3. Xóa sinh viên bởi ID. **")
    print("** 4. Tìm kiếm sinh viên theo tên. **")
    print("** 5. Sắp xếp sinh viên theo điểm trung bình (GPA). **")
    print("** 6. Sắp xếp sinh viên theo tên. **")
    print("** 7. Sắp xếp sinh viên theo ID. **")
    print("** 8. Hiển thị danh sách sinh viên. **")
    print("** 0. Thoát **")
    print("*******************************************************")

    key = int(input("Nhập tùy chọn: "))

    if (key == 1):
        print("n1. Thêm sinh viên.")
        qlsv.nhapSinhVien()
        print("nThêm sinh viên thành công!")

    elif (key == 2):
        if (qlsv.soLuongSinhVien() > 0):
            print("n2. Cập nhật thông tin sinh viên. ")
            print("Nhập ID: ")
            ID = int(input())
            qlsv.updateSinhVien(ID)
        else:
            print("nDanh sách sinh viên trống!")

    elif (key == 3):
        if (qlsv.soLuongSinhVien() > 0):
            print("n3. Xóa sinh viên.")
            print("Nhập ID: ")
            ID = int(input())
            if (qlsv.deleteById(ID)):
                print("nSinh vien co id =", ID, "đã bị xóa.")
            else:
                print("nSinh vien co id =", ID ,"không tồn tại.")
        else:
            print("nDanh sách sinh viên trống!")

    elif (key == 4):
        if (qlsv.soLuongSinhVien() > 0):
            print("n4. Tìm kiếm sinh viên theo tên.")
            print("Nhập tên để tìm kiếm: ")
            name = input()
            searchResult = qlsv.findByName(name)
            qlsv.showSinhVien(searchResult)
        else:
            print("nDanh sách sinh viên trống!")

    elif (key == 5):
        if (qlsv.soLuongSinhVien() > 0):
            print("n5. Sắp xếp sinh viên theo điểm trung bình (GPA).")
            qlsv.sortByDiemTB()
            qlsv.showSinhVien(qlsv.getListSinhVien())
        else:
            print("nDanh sách sinh viên trống!")

    elif (key == 6):
        if (qlsv.soLuongSinhVien() > 0):
            print("n6. Sắp xếp sinh viên theo tên.")
            qlsv.sortByName()
            qlsv.showSinhVien(qlsv.getListSinhVien())
        else:
            print("nDanh sách sinh viên trống!")

    elif (key == 7):
        if (qlsv.soLuongSinhVien() > 0):
            print("n7. Sắp xếp sinh viên theo ID.")
            qlsv.sortByID()
            qlsv.showSinhVien(qlsv.getListSinhVien())
        else:
            print("nDanh sách sinh viên trống!")

    elif (key == 8):
        if (qlsv.soLuongSinhVien() > 0):
            print("n8. Hiển thị danh sách sinh viên.")
            qlsv.showSinhVien(qlsv.getListSinhVien())
        else:
            print("nDanh sách sinh viên trống!")

    elif (key == 0):
        print("nBạn đã chọn thoát chương trình!")
        break

    else:
        print("nKhông có chức năng này!")
        print("Hãy chọn chức năng trong hộp menu.")

Run chương trình quản lý sinh viên trong Python

Chạy chương trình trên cho kết quả ban đầu như sau:

Nhập một vài sinh viên vào hệ thống:

Hiển thị danh sách sinh viên:

Tìm kiếm sinh viên theo tên:

Sắp xếp sinh viên theo điểm trung bình:

Sắp xếp sinh viên theo tên:

Sắp xếp sinh viên theo ID:

Xóa sinh viên theo ID:

By Hà Phương

Với kinh nghiệm trên 7 năm trong lĩnh vực làm đẹp mình tạo nên EzBeauty là website chia sẻ kiến thức và thông tin cho mọi người!