当前位置: 首页 > article >正文

C#编程:优化【性别和成绩名次】均衡分班

5c3c6a1d8d5141a294d411938a5152c4.png

==标题==

C#编程,实现(男女和成绩)均衡分班

==正文==

上一篇用ExceVBA完成的分班,请看文章

ExcelVBA代码实现按性别和成绩名次均衡分班

网友提出问题
用VbA对班级学生随机分组,考虑男女人数和考试成绩均衡

一、需求分析

用户需要将工作表Sheet1中的数据进行科学分班,分为6个班,考虑男女人数和考试成绩均衡,并将结果输出到工作表Sheet2。

二、实现思路

  1. 读取数据:从Sheet1中读取所有数据。

  2. 数据处理:根据性别和名次进行排序,确保男女比例和成绩均衡。

  3. 分班算法:设计一个算法将学生分为6个班。

    分班规则,这是重点
    男:123456、654321,S形(蛇形)
    女:654321、123456,S形(蛇形)
  4. 输出结果:将分班结果写入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.原数据

59c38bb75736c549e671a66a41330eb3.png

2.输出效果

5c5a10b39be32059034e637e55074c42.png

4.数据分析

8be2aea1cbb8d991ea9ad314a7f3e8fa.png

完成

==The end==

fda4e4f667ed173d073fa7329e928aa8.png

==合集==

====若有用,请转发免费学习====

关注看更多文章

4d974bf5454c439a6b46e2fb32ea78df.jpeg


http://www.kler.cn/a/399532.html

相关文章:

  • Java基础-组件及事件处理(中)
  • ElementPlus el-upload上传组件on-change只触发一次
  • vueRouter路由切换时实现页面子元素动画效果, 左右两侧滑入滑出效果
  • 红外遥控信号解码
  • 从零开始学习 sg200x 多核开发之 eth0 MAC 地址修改
  • C++学习-空指针推荐使用nullptr
  • 一文了解Android的核心系统服务
  • 使用 Keras 训练一个卷积神经网络(CNN)(入门篇)
  • L11.【LeetCode笔记】有效的括号
  • 代码随想录算法训练营第四十七天|Day47 单调栈
  • 2022数学分析【南昌大学】
  • mini-jquery
  • Python数据分析NumPy和pandas(三十五、时间序列数据基础)
  • 炼码LintCode--数据库题库(级别:简单;数量:55道)--刷题笔记_02
  • C++【nlohmann/json】库序列化与反序列化
  • ALSA - (高级Linux声音架构)是什么?
  • ShardingSphere 如何完美驾驭分布式事务与 XA 协议?
  • HTTP常见的状态码有哪些,都代表什么意思
  • DB_redis数据一致性(三)
  • web3+web2安全/前端/钱包/合约测试思路——尝试前端绕过直接上链寻找漏洞
  • @bytemd/vue-next Markdown编辑器的使用
  • Linux下MySQL的简单使用
  • 定时器(QTimer)与随机数生成器(QRandomGenerator)的应用实践——Qt(C++)
  • Linux中的挂载
  • vue 自定义指令( 全局自定义指令 | 局部自定义指令 )
  • 深度学习之GAN的生成能力评价