private static void Move_record_from_pt_to_tui(CTui tui, CPhongThi pt, int num_loop) { for (int j = 0; j < num_loop; j++) { tui.Lst_baithi_theotui.Add(pt.Lst_baithi_theophong[0]); pt.Lst_baithi_theophong.RemoveAt(0); } }
private static void Update_sobaithi_con(CTui tui, CPhongThi pt) { //update lại số bài thi trong túi tui.sobaithi_con_theotui = Utils.sobaithi_theotui - tui.Lst_baithi_theotui.Count(); //update lại số bài thi trong phòng pt.sobaithi_con_theophong = pt.Lst_baithi_theophong.Count(); }
public static void TronTuiBaiThi() { #region chặt nhỏ dữ liệu chia ra thành các phòng thi khác nhau //reset lst_tui và lst_phongthi Utils.lst_tui = new List<CTui>(); Utils.lst_phongthi = new List<CPhongThi>(); //lấy về dữ liệu dbVeMTDataContext db = new dbVeMTDataContext(); //var db_sort = db.vemts.OrderBy(o => o.sobaodanh).OrderBy(o => o.phongthi); int sophongthi = db.vemts.Select(o => o.phongthi).Distinct().Count(); // 30; //sau này cần lấy động số phòng thi. //loop so phong thi để chuẩn bị dữ liệu theo từng phòng thi for (int i = 0; i < sophongthi; i++) { //tạo ra đối tượng phòng thi CPhongThi phongthi = new CPhongThi(); //lấy về toàn bộ số thí sinh theo phòng thi thứ i+1. var lst_thisinh = db.vemts.Where(o => o.phongthi == i + 1); if (lst_thisinh.Count() > 0) { //nếu số thí sinh trong 1 phòng thi > 0 thì chuyển toàn bộ dữ liệu của thí sinh vào trong đối tượng phòng thi foreach (var ts in lst_thisinh) { phongthi.Lst_baithi_theophong.Add(ts); } } //add phòng thi vừa có vào lst phòng thi Utils.lst_phongthi.Add(phongthi); } //đến đây đã có toàn bộ dữ liệu về từng phòng thi. #endregion #region thực hiện trộn túi bài thi //tính số bài thi để chia đoạn phòng thi int chiadoan = Utils.sobaithi_theotui * 2 / 3 + 1; //tính có bao nhiêu túi bài thi cần trộn Utils.sotuibaithi = ((int)db.vemts.Count() / Utils.sobaithi_theotui) + 1; //khởi tạo đối tượng để random phòng thi cho mỗi lần lấy bài thi vào túi Random r = new Random(); int k = r.Next(0, Utils.lst_phongthi.Count - 1); for (int i = 0; i < Utils.sotuibaithi; i++) { //khởi tạo 1 túi bài thi CTui tui = new CTui(); tui.sobaithi_con_theotui = Utils.sobaithi_theotui; while (tui.sobaithi_con_theotui > 0 && Utils.lst_phongthi.Count() > 0) { if (k > Utils.lst_phongthi.Count() - 1) { k = 0; } //MessageBox.Show(ar[index].ToString()); ////Ở đây chưa random nên lấy tuần tự //for (int k = 0; k < lst_phongthi.Count(); k++) //{ CPhongThi pt = Utils.lst_phongthi[k]; //kiểm tra xem phòng thi này còn bài thi k pt.sobaithi_con_theophong = pt.Lst_baithi_theophong.Count(); if (pt.sobaithi_con_theophong > 0) { //nếu còn bài thi trong phòng thì kiểm tra xem nó có > phandoan k? if (pt.sobaithi_con_theophong > chiadoan) { //Đ: kiểm tra số bài thi trong túi cần lấy thêm có > phandoan k? if (tui.sobaithi_con_theotui > chiadoan) { //Đ: lấy tuần tự số <phandoan> bài từ phòng thi ném vào trong túi hiện tại Move_record_from_pt_to_tui(tui, pt, chiadoan); k = k + 1; } else { //S: lấy toàn bộ số bài thi còn trong phòng ném vào trong túi. Move_record_from_pt_to_tui(tui, pt, tui.sobaithi_con_theotui); //k = k + 1; } //update số bài thi còn Update_sobaithi_con(tui, pt); } else { //S: kiểm tra số bài thi cần thêm vào túi có lớn hơn số bài thi còn trong phòng k if (tui.sobaithi_con_theotui >= pt.sobaithi_con_theophong) { //Đ: lấy hết số bài thi còn trong phòng Move_record_from_pt_to_tui(tui, pt, pt.sobaithi_con_theophong); //k = k + 1; } else { /********************************************************/ #region summary: đoạn này để chống phân mảnh bài thi. //---------------------------------------------------------------- //S: kiểm tra số phòng thi còn trong lst_phongthi >2 hay không //if (lst_phongthi.Count() > 2) //{ // //Đ: kiểm tra số lượng bài thi còn dư lại nếu lấy = số bài thi cần thêm vào túi // int sobaithi_con_saukhi_laydu_theotui = pt.sobaithi_con_theophong - tui.sobaithi_con_theotui; // if (sobaithi_con_saukhi_laydu_theotui > 3) // { // //Đ: Lấy = số bài thi cần thêm vào túi. // Move_record_from_pt_to_tui(tui, pt, tui.sobaithi_con_theotui); // } //} //else //{ //------------------------------------------------------------------------ #endregion /********************************************************/ //S: Lấy = số bài thi cần thêm vào túi. Move_record_from_pt_to_tui(tui, pt, tui.sobaithi_con_theotui); //} } //update số bài thi còn Update_sobaithi_con(tui, pt); } } else { //nếu phòng thi này k còn bài thi nào -> loại ra khỏi list_phongthi Utils.lst_phongthi.Remove(pt); } //nếu đã lấy đủ số bài thi cho túi thì break loop. if (tui.sobaithi_con_theotui == 0) { break; } } //} //sau khi chèn đủ số bài thi vào túi -> add vào list_tui Utils.lst_tui.Add(tui); } #endregion #region đánh số túi cho từng túi bài thi Danh_matui(); #endregion }