Chia lớp theo học lực

Liên hệ QC

phanvietdung

Thành viên mới
Tham gia
16/9/17
Bài viết
15
Được thích
0
Giới tính
Nam
Hiện tại e đang phải làm công tác trộn một danh sách học sinh khối 6 cũ thành 7 lớp mới khác nhau sao cho mỗi lớp đều có HS có học lực Giỏi, Khá, TB đều nhau (Các loại học lực không giống nhau với lớp cũ). Mong được sự giúp đỡ của anh chị chứ e ngồi làm thủ công biết khi nào xong. Em cám ơn trước.
 

File đính kèm

  • Danh sach K6.xls
    84 KB · Đọc: 41
Chuyện này mỗi học kỳ mần có 1 lần, làm bằng thủ công cho rồi:
Sắp xếp DS (danh sách) theo học lực
Thống kê (đếm) học lực Học sinh trong DS
& căn cứ vô đó mà phân bổ vô các lớp thôi!
 
Hiện tại e đang phải làm công tác trộn một danh sách học sinh khối 6 cũ thành 7 lớp mới khác nhau sao cho mỗi lớp đều có HS có học lực Giỏi, Khá, TB đều nhau (Các loại học lực không giống nhau với lớp cũ). Mong được sự giúp đỡ của anh chị chứ e ngồi làm thủ công biết khi nào xong. Em cám ơn trước.
6 cũ thành 7 mới, số lớp vẫn không đổi đúng ko bạn?
 
Hiện tại e đang phải làm công tác trộn một danh sách học sinh khối 6 cũ thành 7 lớp mới khác nhau sao cho mỗi lớp đều có HS có học lực Giỏi, Khá, TB đều nhau (Các loại học lực không giống nhau với lớp cũ). Mong được sự giúp đỡ của anh chị chứ e ngồi làm thủ công biết khi nào xong. Em cám ơn trước.
Bạn thử code này.
Mã:
Option Explicit

Private Function UniqueRandomNum(Bottom As Long, Top As Long, Amount As Long)
  On Error Resume Next
  If Amount > Top - Bottom + 1 Then Amount = Top - Bottom + 1
  With CreateObject("Scripting.Dictionary")
    Do
      .Add Int(Rnd() * (Top - Bottom + 1)) + Bottom, ""
    Loop Until .Count = Amount
    UniqueRandomNum = .Keys
  End With
End Function
Private Function LayDS(Rng As Range, Optional aCot = 5, Optional LOAI As String = "Trung bình")
    Dim aRow%, aCol%, i&, j&, k&
    Dim Arr, TempDes, Des, TT
    aRow = Rng.Rows.Count: aCol = Rng.Columns.Count
    Arr = Rng.Value
    aRow = UBound(Arr, 1): aCol = UBound(Arr, 2)
    ReDim TempDes(1 To aRow, 1 To aCol + 2)
    For i = 1 To aRow
        If Arr(i, aCot) = LOAI Then
            k = k + 1: TempDes(k, 1) = k
            For j = 1 To aCol
                TempDes(k, j + 1) = Arr(i, j)
            Next j
        End If
    Next i
    If k = 0 Then Exit Function
    TT = UniqueRandomNum(1, k, k)
    ReDim Des(1 To k, 1 To aCol + 2)
    aCol = UBound(TempDes, 2)
    For i = 1 To k
        For j = 1 To aCol
            If j = aCol Then
                Des(i, j) = TT(i - 1)
            Else
                Des(i, j) = TempDes(i, j)
            End If
        Next j
    Next i
    LayDS = Des
End Function
Private Function WorksheetExists(shtName As String, Optional wb As Workbook) As Boolean
    Dim sht As Worksheet
    If wb Is Nothing Then Set wb = ThisWorkbook
    On Error Resume Next
    Set sht = wb.Sheets(shtName)
    On Error GoTo 0
    WorksheetExists = Not sht Is Nothing
End Function
Private Function TachDS(DS, SL As Integer, aIndex As Integer, TT As Integer)
    Dim i%, j%, k%, Max%, Des
    k = 0: Max = SL + aIndex - 1
    If Max > UBound(DS, 1) Then Max = UBound(DS, 1)
    ReDim Des(1 To (Max - aIndex + 1), 1 To UBound(DS, 2))
    For i = aIndex To Max
        k = k + 1: Des(k, 1) = TT + k - 1
        For j = 2 To UBound(DS, 2)
            Des(k, j) = DS(CInt(DS(i, 7)), j - 1)
        Next j
    Next i
    TachDS = Des
End Function
Sub ChiaLop()
    Const SOLOP = 7
    Dim sh As Worksheet, DS(1 To 3) As Variant, TENLOP, LOAI, i%, j%
    Dim Rng As Range, SoHS%, ViTri%, TT%, TTLoai%, aStep%
    Dim Tach_DS
    TENLOP = Array("LOP1", "LOP2", "LOP3", "LOP4", "LOP5", "LOP6", "LOP7")
    LOAI = Array("Gi" & ChrW(7887) & "i", "Khá", "Trung bình")
    Set Rng = Sheet1.Range("C10:G" & Sheet1.Range("G10000").End(xlUp).Row)
    SoHS = Rng.Rows.Count \ SOLOP
    For i = 1 To 3
        DS(i) = LayDS(Rng, , CStr(LOAI(i - 1)))
    Next i
    For i = LBound(TENLOP) To UBound(TENLOP)
        If WorksheetExists(CStr(TENLOP(i))) Then
            Application.DisplayAlerts = False
            ThisWorkbook.Sheets(CStr(TENLOP(i))).Delete
            Application.DisplayAlerts = True
        End If
        ThisWorkbook.Sheets("Sheet1").Copy after:=Sheets(Sheets.Count)
        Set sh = ThisWorkbook.Sheets(Sheets.Count)
        sh.Name = CStr(TENLOP(i))
        sh.Range("A10:G10").Resize(Rng.Rows.Count).ClearContents
        TT = 1
        For j = 1 To 3
            ViTri = UBound(DS(j), 1) \ SOLOP
            TTLoai = ViTri: aStep = ViTri
            If UBound(DS(j), 1) Mod SOLOP > i Then
                ViTri = i * (ViTri + 1) + 1
                TTLoai = TTLoai + 1
            Else
                ViTri = i * (ViTri + 1)
            End If
            Tach_DS = TachDS(DS(j), TTLoai, ViTri, TT)
            If IsArray(Tach_DS) Then
                sh.Range("A9:G10").Offset(TT).Resize(UBound(Tach_DS, 1)).Value = Tach_DS
                TT = TT + UBound(Tach_DS, 1)
            End If
        Next j
    Next i
End Sub
Còn vụ Nam Nữ thì đợi anh @bebo021999 giúp vậy.
 
Bạn siêu thật. Ngần ấy giải thuật và code mà hoàn thành dưới 10 phút. :p
Giải thuật làm tay (dùng để viết code cũng được)
Bước 1: Tạo danh sách A gồm tất cả học sinh lớp 6 cũ gồm mã, tên, học lực, giới tính (và cả tiêu chí "cân bằng" khác)
Bước 2: Sort danh sách A theo tuần tự các tiêu chí "cân bằng": học lực, giới tính
Bước 3: Filter học lực giỏi + nam, đếm. Kết quả đếm chia 7 lấy tròn được n
Bước 4: copy n dòng đầu bỏ vào lớp 7-1, n dòng kế vào lớp 7-2, ... còn bao nhiêu dồn hết cho 7-7
Bước 5: Filter học lực giỏi + nữ, lại đếm, lại chia, lại copy paste
Các bước tiếp theo: tương tự Bước 3 và 4 với học lực khá + nam, học lực khá + nữ, học lực TB + nam, học lực TB + nữ, ... đến hết
------------

Tôi viết bài này mất dưới 10 phút, làm tay cũng dưới 10 phút, nhưng nếu viết code, test tiếc cẩn thận nhiều trường hợp, ... sẽ mất 60 phút trở lên. Thế nên tôi không viết code vì 1 giờ của tôi giá bèo bèo cũng 200.000 đVN, đủ uống cafe và thuốc lá 5 ngày.
 
Thực tế nền giáo dục Việt nam học lực đang xài số ma (số ảo) do bệnh thành tích;
Thường cấp II trên 80% học sinh là giỏi
Vậy nên rút gọn qui trình là ta chỉ thống kê các em khá & trung bình để chia thôi; Và hạng giỏi thì rãi vô cho đủ sỉ số của lớp
 
Giải thuật làm tay (dùng để viết code cũng được)
Bước 1: Tạo danh sách A gồm tất cả học sinh lớp 6 cũ gồm mã, tên, học lực, giới tính (và cả tiêu chí "cân bằng" khác)
Bước 2: Sort danh sách A theo tuần tự các tiêu chí "cân bằng": học lực, giới tính
Bước 3: Filter học lực giỏi + nam, đếm. Kết quả đếm chia 7 lấy tròn được n
Bước 4: copy n dòng đầu bỏ vào lớp 7-1, n dòng kế vào lớp 7-2, ... còn bao nhiêu dồn hết cho 7-7
Bước 5: Filter học lực giỏi + nữ, lại đếm, lại chia, lại copy paste
Các bước tiếp theo: tương tự Bước 3 và 4 với học lực khá + nam, học lực khá + nữ, học lực TB + nam, học lực TB + nữ, ... đến hết
------------

Tôi viết bài này mất dưới 10 phút, làm tay cũng dưới 10 phút, nhưng nếu viết code, test tiếc cẩn thận nhiều trường hợp, ... sẽ mất 60 phút trở lên. Thế nên tôi không viết code vì 1 giờ của tôi giá bèo bèo cũng 200.000 đVN, đủ uống cafe và thuốc lá 5 ngày.
Giải thuật của tôi thì vầy:
1. Sort theo học lực.
2. Rải random 1-7 vào 1 cột phụ. Cứ hết 7 dòng thì lại rải tiếp 7 dòng kế.
3. Sort theo cột phụ.
4. Lấy ra: 1 là lớp 1, 2 là lớp 2, ... đến lớp 7

Bảo đảm gần như xếp theo ngẫu nhiên, không phân biệt giới tính. Nếu muốn giới tính thì cộng 1/10 điểm học lực cho Nữ.
 
Còn giải thuật của tôi thì như vậy:
1. Rải Rand() trên cột phụ.
2. Sort theo học lực, giới tính, cột phụ
3. Xóa Rand. Rải lần lươt 1-7 vào 1 cột này. Cứ hết 7 dòng thì lại rải tiếp 7 dòng kế.
4. Sort theo cột phụ.
Xong.
 
Giải thuật nào cũng phải test nhiều trường hợp: Đơn cử trường hợp học sinh yếu chỉ có 3 (hoặc số bất kỳ <7), trường hợp 3 học sinh yếu này lại có toàn nam/ nữ hoặc 1 nam 4 nữ, 1 nữ 5 nam, ... Thậm chí số lớn hơn 7 (trong khoảng 8 - 15) nhưng nam 12, nữ 3, ...
Trường hợp khác là thêm tiêu chí phân lớp như yêu/ ghét 2 cấp độ, giàu/ nghèo 3 cấp độ. Lỡ 3, 4 em "chết tiệt con" cùng học lực, cùng giới tính dồn hết vào 1 lớp.
Cho nên viết code thì dễ, test mới khó. Mà test xong có khi phải viết lại code từ đầu!
 
...
Cho nên viết code thì dễ, test mới khó. Mà test xong có khi phải viết lại code từ đầu!
Tương đối thôi. Chứ khó nhìn trước mọi khía cạnh.
Test thì cũng phải biết mình muốn (tránh) cái gì. Vả lại, dữ liệu học kỳ này đâu giống kỳ tới. Người không có kinh nghiệm test có thể thấy code rất ngon lần này nhưng lần tới thì bét nhè.

Điển hình, điều kiện tên đâu có hề được xét. Việc lớp 1 có 5 tên Hùng và lớp 2 có 7 tên Dũng rất có thể xảy ra.

Tôi vào trường Pétrus Ký vào khoảng giữa thập niên 60's. Phải nói là Ban Giám Hiệu trường lúc ấy xếp 11 lớp đệ Thất (lớp 6 bi giờ) quá hay. Cũng rải đều điểm thi vào trường, cũng chia tên cho đều. Thời ấy làm quái gì có máy tính, chỉ dùng mấy mẫu giấy ghi tên và điểm mà chả thấy ai than "thủ công". Vấn đề chỉ là biết cách làm hay không thôi.
 
... chả thấy ai than "thủ công". Vấn đề chỉ là biết cách làm hay không thôi.
Họ cũng phải có 1 thuật toán.
Hình như trước 75, trường công luôn luôn là trường 1 giới tính thì phải. Lúc tôi thi lớp 6 (1972), Hồ Ngọc Cẩn, Võ Trường Toản, là trường toàn nam sinh. Nữ sinh thì thi Gia Long và Trưng Vương.
 
Cách khác xét trùng tên
1. Tạo cột phụ là tên học sinh.
2. Sort theo học lực, giới tính, cột phụ
3. Xóa tên, rải Rand 1-7 vào 7 dòng đầu cột phụ. Cứ hết 7 dòng thì lại rải tiếp 7 dòng kế.
4. Sort theo cột phụ.
 
Họ cũng phải có 1 thuật toán.
Hình như trước 75, trường công luôn luôn là trường 1 giới tính thì phải. Lúc tôi thi lớp 6 (1972), Hồ Ngọc Cẩn, Võ Trường Toản, là trường toàn nam sinh. Nữ sinh thì thi Gia Long và Trưng Vương.
1. Thường thường chứ không hẳn luôn luôn.
- Trường Mạc Đỉnh Chi là Nam Nữ.
- Ngày xưa, Ban Toán gọi là Ban B. Không phải trường nữ nào cũng có Ban B ở lớp 12. Trưng Vương nổi tiếng là do người ta "gán" cái mã "Bắc kỳ". Chứ thực sự thì trường này không lớn lắm. Không có Ban B cho lớp 12 (*1). Tôi nhớ thì còn nhỏ hơn Lê Văn Duyệt. Chú thích: trường "đối" với Trưng Vương là Chu Văn An - người ta thậm chí còn đồn rằng nó là trường Bưởi ngoài ấy.
- Ngày xưa học xong lớp 11 (tiếng cũ gọi là đệ Nhị) thì thi Tú tài 1. Đậu xong bằng Tú tài 1 này thì người ta có thể chuyển trường để học tiếp lớp 12 (đệ Nhất). Điển hình Ban D (Cổ Văn) chỉ dạy ở trường Pétrus Ký. Nam nữ gì muốn học đều phải chuyển qua trường này.
- Nhiều trường nữ ở tỉnh thành thiếu lớp. Điển hình ở Mỹ tho, các nữ sinh Lê Ngọc Hân muốn học lên cao thì phải chuyển sang học chung với nam, trường Nguyễn Đình Chiểu.

(*1) Mấy năm cuối thập niên 60's. Mấy chị Trưng Vương vẫn tranh đấu đòi mở thêm lớp 12 cho ban B. Nhưng mấy chị vẫn không đạt đủ con số đỗ Tú tài 1 Ban B để mở lớp. Ngày xưa đậu Tú tài khó giàn trời. Quên mất qua thập niên 70's thì đạt chưa.
 
Web KT
Back
Top Bottom