C#编程:优化【性别和成绩名次】均衡分班
==标题==
C#编程,实现(男女和成绩)均衡分班 |
==正文==
上一篇用ExceVBA完成的分班,请看文章
ExcelVBA代码实现按性别和成绩名次均衡分班
网友提出问题 |
用VbA对班级学生随机分组,考虑男女人数和考试成绩均衡 |
一、需求分析
用户需要将工作表Sheet1中的数据进行科学分班,分为6个班,考虑男女人数和考试成绩均衡,并将结果输出到工作表Sheet2。
二、实现思路
读取数据:从Sheet1中读取所有数据。
数据处理:根据性别和名次进行排序,确保男女比例和成绩均衡。
分班算法:设计一个算法将学生分为6个班。
分班规则,这是重点 男:123456、654321,S形(蛇形) 女:654321、123456,S形(蛇形) 输出结果:将分班结果写入Sheet2。
三、实现代码(C#)
因为VBA,在排序,分配时不方便写代码,所以这次用C#写
public int PorNfenban(int n, int total, string pn)
{
//此处省略n行代码,留着白嫖一族思考,哈哈哈!!!
//这是一个自定义函数,用于返回分班的
}
public void StudentAssignClasses(int inNumber)
{
Excel.Application xlsApp = Globals.ThisAddIn.Application;
Excel.Workbook wbk = xlsApp.ActiveWorkbook;
Excel.Worksheet sht = xlsApp.ActiveSheet;
int lastRow = sht.Cells.Find("*", System.Type.Missing, System.Type.Missing, System.Type.Missing, Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlPrevious, false, System.Type.Missing, System.Type.Missing).Row;
List<Student> students = new List<Student>();
for (int i = 2; i <= lastRow; i++)
{
String id = sht.Cells[i, 1].Value?.ToString() ?? string.Empty;
String name = sht.Cells[i, 2].Value?.ToString() ?? string.Empty;
String gender = sht.Cells[i, 3].Value?.ToString() ?? string.Empty;
double score ;
if (!double.TryParse(sht.Cells[i, 4].Value.ToString(),out score))
{
score = 0;
}
students.Add(new Student()
{
ID = id,
Name = name,
Gender = gender,
Score = score,
});
}
//提出分类一惟一值
var uniqueGenders = students.Select(s => s.Gender).Distinct();
// 按成绩排序
students.Sort((x, y) => y.Score.CompareTo(x.Score));
// 分配班级
List<Student>[] Classes = new List<Student>[inNumber];
for (int i = 0; i < inNumber; i++)
{
Classes[i] = new List<Student>();
}
// 分配男生123456、654321
int maleIndex = 0;
foreach (var student in students.Where(s => s.Gender == "男"))
{
int res = PorNfenban(maleIndex + 1, inNumber, "p");
Classes[res-1].Add(student);
maleIndex +=1;
}
// 分配女生654321、123456
int femaleIndex = 0;
foreach (var student in students.Where(s => s.Gender == "女"))
{
int res = PorNfenban(femaleIndex + 1, inNumber, "n");
Classes[res-1].Add(student);
femaleIndex += 1;
}
//输出数据
// 创建新工作表
Excel.Worksheet newSheet = wbk.Sheets.Add(After: wbk.Sheets[wbk.Sheets.Count]);
newSheet.Name = "ClassDistribution";
// 输出班级数据
string[] array = { "序号", "姓名", "性别", "成绩", "班别" };
int rowIndex = 1;
for (int i = 0; i < inNumber; i++)
{
newSheet.Cells[rowIndex, 1].resize(1,5).Value = array;
rowIndex++;
foreach (var student in Classes[i])
{
newSheet.Cells[rowIndex, 1].Value = student.ID;
newSheet.Cells[rowIndex, 2].Value = student.Name;
newSheet.Cells[rowIndex, 3].Value = student.Gender;
newSheet.Cells[rowIndex, 4].Value = student.Score;
newSheet.Cells[rowIndex, 5].Value = $"Class{i + 1}";
rowIndex++;
}
}
}
public class Student
{
public string ID { get; set; }
public string Name { get; set; }
public string Gender { get; set; }
public double Score { get; set; }
}
四、完成效果
1.原数据
2.输出效果
4.数据分析
完成
==The end==
==合集==
====若有用,请转发免费学习====
关注看更多文章