索紅軍
(渭南師范學院,陜西 渭南 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名教師的信息。
應用這些測試數據運行測試,實際輸出結果與期望結果一致,沒有發現問題。另外,軟件系統中“開始循環”、“停止循環”、“清除本次選擇”、“保存全部選擇”等各種功能按鈕以及初始設置的各種單選按鈕、顯示區域的顯示情況等,運行良好,均未發現異常。
本文介紹了一種多功能抽簽選擇器軟件,從眾多候選數據項中選擇出部分或全部選項。軟件系統可以新裝入候選名單生成候選數據項,也可以按數字、按行列等設置生成候選數據項,還可以設置各種獎項的數目生成獎項池用來完成抽獎。軟件功能豐富多樣,適合很多場合應用,為相關人員的業務工作提供了一個很好的工具。