Vikot106's Blog.

程序:随机分组工具

字数统计: 1.1k阅读时长: 5 min
2019/04/03 76 Share

几天前,老师问我

“如果给你一本C#的书去自学,你能做出一个作品吗”

于是这个小工具就诞生啦~

工具介绍

  • 截图:

snap

  • 该工具在.net2.0环境下编译,大多数计算机无需安装依赖即可使用,且有处理乱码的模块。

  • 该工具可通过导入文本文件进行分组,可自定义分组列表,使用方便可自定义。

  • 该工具界面经过精心设计,简单易用,提高效率。

使用方法

分组列表

增加 按钮:增加一个分组,组别信息包括组名、人数。

重设 按钮:清除分组列表与结果列表。

删除 按钮:删除DataGridView中当前选定的组。

组员列表

SelectFileLog:显示为当前选定的文本文件名。

重载 按钮:当未选定文本文件时按下按钮将载入根目录中的“group.txt”,当指定txt文本后,在编辑txt文本文件后,按下此按钮会重新载入选定的txt文本。

编辑 按钮:当已选定txt文本后,按下此按钮将打开txt文本文件,并进行组员编辑。

浏览 按钮:按下此按钮后,用户可自行选择一个写有组员列表的txt文件,格式为每行一个姓名。

开始

按下此按钮后,程序会将组员列表中的组员随机分配至用户设定的分组列表中,并显示于“结果”栏内。

​ 注:当需分组人数小于组员数时,余出的组员将被忽略。

技术简述

部分源代码

  • 乱序分组
random
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
iDicPar = new Dictionary<int, string>();
Random rand = new Random();

for (int i = 0; i < textcount; i++){
iDicPar.Add(i, textBox3.Lines[i]);
}

for (int i = 0; i < dgvGroup.Rows.Count; i++){
int groupqual = int.Parse(dgvGroup.Rows[i].Cells[1].Value.ToString());
for (int j = 0; j < groupqual; j++){
int randnum = rand.Next(0, textcount);
bool done = false;
while (!done){
if (iDicPar.ContainsKey(randnum)){
this.dgvResult.Rows.Add(1);
this.dgvResult.Rows[this.dgvResult.Rows.Count - 1].Cells[0].Value = this.dgvGroup.Rows[i].Cells[0].Value;
this.dgvResult.Rows[this.dgvResult.Rows.Count - 1].Cells[1].Value = iDicPar[randnum];
iDicPar.Remove(randnum);
done = true;
}else{
randnum = rand.Next(0, textcount);
}
}
}
}
  • 编码读取
encode
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/// <summary>
/// FileEncoding 的摘要说明
/// </summary>
namespace FileEncoding{
/// <summary>
/// 获取文件的编码格式
/// </summary>
public class EncodingType{
/// <summary>
/// 给定文件的路径,读取文件的二进制数据,判断文件的编码类型
/// </summary>
/// <param name="FILE_NAME">文件路径</param>
/// <returns>文件的编码类型</returns>
public static System.Text.Encoding GetType(string FILE_NAME){
FileStream fs = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read);
Encoding r = GetType(fs);
fs.Close();
return r;
}

/// <summary>
/// 通过给定的文件流,判断文件的编码类型
/// </summary>
/// <param name="fs">文件流</param>
/// <returns>文件的编码类型</returns>
public static System.Text.Encoding GetType(FileStream fs){
byte[] Unicode = new byte[] { 0xFF, 0xFE, 0x41 };
byte[] UnicodeBIG = new byte[] { 0xFE, 0xFF, 0x00 };
byte[] UTF8 = new byte[] { 0xEF, 0xBB, 0xBF }; //带BOM
Encoding reVal = Encoding.Default;

BinaryReader r = new BinaryReader(fs, System.Text.Encoding.Default);
int i;
int.TryParse(fs.Length.ToString(), out i);
byte[] ss = r.ReadBytes(i);
if (IsUTF8Bytes(ss) || (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF)){
reVal = Encoding.UTF8;
}else if (ss[0] == 0xFE && ss[1] == 0xFF && ss[2] == 0x00){
reVal = Encoding.BigEndianUnicode;
}else if (ss[0] == 0xFF && ss[1] == 0xFE && ss[2] == 0x41){
reVal = Encoding.Unicode;
}
r.Close();
return reVal;
}

/// <summary>
/// 判断是否是不带 BOM 的 UTF8 格式
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
private static bool IsUTF8Bytes(byte[] data){
int charByteCounter = 1; //计算当前正分析的字符应还有的字节数
byte curByte; //当前分析的字节.
for (int i = 0; i < data.Length; i++){
curByte = data[i];
if (charByteCounter == 1){
if (curByte >= 0x80){
//判断当前
while (((curByte <<= 1) & 0x80) != 0){
charByteCounter++;
}
//标记位首位若为非0 则至少以2个1开始 如:110XXXXX...........1111110X
if (charByteCounter == 1 || charByteCounter > 6){
return false;
}
}
}else{
//若是UTF-8 此时第一位必须为1
if ((curByte & 0xC0) != 0x80){
return false;
}
charByteCounter--;
}
}
if (charByteCounter > 1){
throw new Exception("非预期的byte格式");
}
return true;
}
}
}

笔记

  • [ Dictionary<int, string> iDicPar; ] 为一个HashMap类型,泛型 <int, string> 中,int为不可重复的key,string为可重复的value。

下载地址

打包:https://share.weiyun.com/5UFmCwF

绿色:https://share.weiyun.com/5HTEfBo

制作时间

2019-3-29 — 2019-3-30

开发环境

VS2017

软件使用素材

图标:野田工房P

资料查阅

CSDN、博客园

CATALOG
  1. 1. 工具介绍
  2. 2. 使用方法
  3. 3. 技术简述
  4. 4. 下载地址
  5. 5. 制作时间
  6. 6. 开发环境
  7. 7. 软件使用素材
  8. 8. 资料查阅