索红军
(渭南师范学院,陕西 渭南 714099)
目前,很多场合下需要从众多的候选个体中随机选取部分个体,比如公司年终会议抽奖环节,需要从所有员工中抽取部分员工;老师上课想从所有学生中选取部分学生回答问题;航空公司或高铁为了吸引乘客而需要按座位选取部分乘客送以礼品,达到吸引更多乘客的目的;商场搞活动抽奖以吸引消费者等。这就需要一个多功能的抽签软件。现有很多抽签之类的软件可以使用,但基本都是只能按照数字编号来进行抽取选择,不能适应像教师上课需要抽取具体的学生名字,或者像飞机、高铁之类根据行列座位抽取乘客的需要。为此,研究分析多种场合的具体需求,设计实现了一种多功能抽签选择器软件系统[1]。
本软件系统主要用来从众多候选数据项中选取部分数据项,以完成众选少的功能需求。经过分析,软件系统应该能够装入新名单或直接输入名单生成候选数据项,也可以通过不同设置生成候选数据项;并能够快速循环显示候选数据项或停止循环显示;软件系统可以从循环显示的候选数据项中随机选择部分数据项等功能。
通过“开始循环”和“停止循环”两个按钮可以循环显示候选数据项或停止循环显示候选数据项。应用于候选名单不变、可被重复选择1个数据项的情况。
1)初始数据区是在程序源代码中直接放置相应候选数据项。
初始名单:本院(渭南师范学院计算机学院)10名教师;
初始数字:1~50数字编号;
初始行列:7×10矩阵,即7行10列共70人编号;
初始抽奖:共100张奖券,其中特等奖1张,一等奖3张,二等奖5张,二等奖8张,优秀奖13张,谢谢参与70张。
2)数据装入区可以装入相应的候选数据项。
名单设置:可以通过相应对话框装入文本文件名单形成候选数据项;
数字设置:可以在相应对话框中设置候选数字的开始、结束值(大于零的一段自然数序列)。同时中间可以去掉至少连续两段数字序列,最终形成数字形式的候选数据项;
行列设置:可以在相应对话框中分别设置候选行、列的开始、结束值,行、列值均可为数字或字母。同时,行、列均可去掉中间一段序列。最终形成像高铁座位号模样的二维候选数据项;
奖项设置:通过相应对话框可以设置各种奖项的数目,形成抽奖池候选数据项;
名单输入:可以直接输入数据项,一般是候选数据项较少时应用。同时可以将输入的候选数据项保存成文本文件。
3)快速装入数字候选项。
可以通过 “数字 1~100”、“数字1~200”、“数字1~300”3个按钮快速装入相应的数字候选项,中间不能去掉部分值段。
所有候选数据项在循环显示时与装入时的顺序不一致,以保证随机。
通过“选择1人”、“选择3人”、“选择5人”3个按钮可以从相应候选数据项(候选数据项是否循环显示无关紧要)中分别选择1人、3人或5人。被选中的数据项从候选数据项中删除,下次不会再被选中。选择3人或5人不能是候选数据项中连续存放的选项。当候选数据项少于3人或5人时,进行对应选择会选中少于对应选择数的选项,即只能选择出剩余数据项中的数据项。
每次选择到的数据项会显示在右边本次选择区及全部选择区。其中本次选择区只显示本次的选择,自动清除上次显示的名单,而全部选择区若未人工清除,将一直显示所有选择到的数据项,可以通过“保存全部选择”按钮将该区显示的数据项保存成文本文件。
当候选数据项变化时,在全部选择区用一串“************”分隔开不同候选数据项的选择结果。
本次选择和全部选择区域均可通过相应按钮清除。
在系统设置区通过循环周期设置按钮打开相应对话框,可以设置循环显示时不同候选数据项的变化时间,系统默认该变化时间为20ms,可以在5~1000ms之间进行设置。
根据前边的需求分析,我们设计实现了该软件系统。
软件要完成众选少的功能,而候选数据类型各种各样,有字符串类型的人名,又有数字类型的自然数序列,还有像高铁座位号一样的二维行列编号。为了处理的方便,设计时将这些不同类型数据全部当作字符串处理,存放在一个字符串数组中。即使是二维行列矩阵编号,也将其行列各种组合全部罗列出来存放。当通过装入或设置等生成处理好候选数据项之后,将其存放顺序打乱。系统运行时通过开始循环按钮启动定时器,以约定的时间间隔将候选数据项循环显示在相应区域,也可以通过停止循环按钮停止定时器,显示停止在循环停止前的最后一个数据项。该循环及停止功能和传统的相关软件类似。本软件通过选择按钮选择时,若一次只选择一个,依据当时显示的数据项选择一个,若一次选择的是多个,则选择出第一个之后,再从所有候选项中选择出其它需要的数据项。为了防止已选数据项的重复,对于已经被选中的数据项,立即从候选数据项中删除。
在软件系统设计过程中,设计到一些具体的算法。
1)候选数据项顺序打乱。从文本文件读入进来候选数据项,或者通过设置处理好的自然数序列、行列组合序列,首先将其存放在一个临时字符串数组中,然后以存放数据的数组下标为基准,通过随机函数Rand()选择出第一个数据项,存放于存储候选数据项数组的第一个位置,同时删除临时字符串中该数据项。之后在临时字符串数组中剩余的候选数据项中继续通过随机函数Rand()选择下一个数据项存放于候选数据项数组的第二个位置,再删除临时字符串数组中该数据选项。依次这样处理,直到将所有候选数据项处理完成。完成后删除临时字符串数组释放空间。
2)选择数据项。从所有候选数据项进行选择,防止选择刚好循环显示到的数据项(因循环显示变化的频率可变),若一次只选择一个,为了公平,选择的数据项是正在显示的候选数据项紧后边的候选数据项(按照存放顺序),不能选择已经显示出来的数据项。若一次选择多个数据项,则在选择出第一个数据项之后,通过随机函数Rand()继续在候选数据项中选择其他的数据项,保证所选的数据项不会是在候选数据项中连续存放的数据项[2]。为了保证选中的数据项不会重复,每次选中一个数据项之后,立即将其从候选数据项中删除。删除的方法是将候选数据项数组最后边的数据项移动到被选中对象处覆盖被选中对象,同时使候选数据项个数减1。这样避免大量移动数据,又一次打乱剩余候选数据项的排序,既提高了效率,又加强了公平性。
本软件系统界面以对话框的形式设计,主界面分为不同的区域,分别显示候选项信息、本次选中的信息和所有选中的信息以及各种按钮[3]。各种操作设置通过不同按钮打开相应的对话框进行不同操作或设置。系统界面简洁清晰友好,没有杂乱信息[4]。
软件系统设计完成后,由两名学生分别以黑盒测试法进行了测试。测试过程应用了多组测试用例,其中详细记录测试过程并生成测试过程记录文档的测试用例如下:
装入的名单选用了计算机科学技术专业2017级1班48名学生名单;设置数字候选项设置了1至200,中间去掉了50至120和150至180两段,即就是候选数字为 1、2……、48、49、121、122、148、149、181、182、……、199、200共98个;行列设置以高铁座位号为基准,行为1至18行,列为A列至F列,去掉E列,即候选项为1A、1B、1C、1D、1F、2A……,18F,共90个;抽奖奖项数设置为特等奖、一等奖、二等奖、二等奖、谢谢参与分别为 1、3、5、10、200;直接输入名单输入了我校10名教师的信息。
应用这些测试数据运行测试,实际输出结果与期望结果一致,没有发现问题。另外,软件系统中“开始循环”、“停止循环”、“清除本次选择”、“保存全部选择”等各种功能按钮以及初始设置的各种单选按钮、显示区域的显示情况等,运行良好,均未发现异常。
本文介绍了一种多功能抽签选择器软件,从众多候选数据项中选择出部分或全部选项。软件系统可以新装入候选名单生成候选数据项,也可以按数字、按行列等设置生成候选数据项,还可以设置各种奖项的数目生成奖项池用来完成抽奖。软件功能丰富多样,适合很多场合应用,为相关人员的业务工作提供了一个很好的工具。