- 相關(guān)推薦
課堂點(diǎn)名軟件(一)
課堂點(diǎn)名軟件
目 錄
一、緒 論 2
1.1.當(dāng)代大學(xué)生出勤的現(xiàn)狀 2
1.2.對(duì)大學(xué)課堂點(diǎn)名現(xiàn)狀的分析 3
二、對(duì)課堂點(diǎn)名軟件的分析 3
2.1 設(shè)計(jì)思想 3
2.1.1 系統(tǒng)的設(shè)計(jì)思想 3
2.1.2 系統(tǒng)的設(shè)計(jì)目標(biāo) 4
2.1.3 系統(tǒng)的基本框架 4
2.1.3.1 總體模塊結(jié)構(gòu) 5
2.1.3.2 子模塊結(jié)構(gòu) 5
2.1.4 系統(tǒng)的實(shí)現(xiàn)環(huán)境 7
2.1.4.1 硬件環(huán)境 7
2.1.4.2 軟件環(huán)境 7
2.2開(kāi)發(fā)工具的選用及介紹 7
三、課堂點(diǎn)名軟件的具體設(shè)計(jì)與實(shí)現(xiàn) 10
3.1數(shù)據(jù)表的設(shè)計(jì)與實(shí)現(xiàn) 10
3.2 課堂點(diǎn)名軟件的軟件部分設(shè)計(jì) 11
3.2.1 全體點(diǎn)名模塊 12
3.2.2 部分抽點(diǎn)模塊 21
3.2.2.1 隨機(jī)抽點(diǎn)子模塊 25
3.2.2.2 出勤抽點(diǎn)子模塊 26
3.2.3 課堂答題抽點(diǎn)模塊 29
3.2.4 出勤統(tǒng)計(jì)模塊 33
四、系統(tǒng)的測(cè)試與運(yùn)行 37
4.1 軟件測(cè)試 37
4.2 測(cè)試小結(jié) 37
參考文獻(xiàn) 38
一、緒 論
在電器化教學(xué)飛速發(fā)展的今天,計(jì)算機(jī)成為課堂輔助教學(xué)的重要工具。它在課堂教學(xué)的課件演示、課堂實(shí)驗(yàn)、課堂學(xué)生管理等各個(gè)方面發(fā)揮著重要的作用。目前課堂教學(xué),尤其是大學(xué)課堂教學(xué)課件的演示主要是用計(jì)算機(jī)來(lái)實(shí)現(xiàn)的,很多的課堂實(shí)驗(yàn)也是用計(jì)算機(jī)模擬可以實(shí)現(xiàn)的。而學(xué)生管理等方面更是少不了計(jì)算機(jī)的應(yīng)用,從一名大學(xué)生進(jìn)入大學(xué)校園的那一天起他的檔案資料就被錄入了學(xué)校的計(jì)算機(jī)。為了更好的管理學(xué)生日常的學(xué)習(xí)、生活大學(xué)校園也實(shí)現(xiàn)了自動(dòng)化辦公和自動(dòng)化教學(xué)。這種種自動(dòng)化辦公和自動(dòng)化教學(xué)也是由各種功能的軟件所支撐其來(lái)的?梢(jiàn)計(jì)算機(jī)軟件管理在學(xué)生管理中起到了很大的作用。所以我想到了設(shè)計(jì)一個(gè)課堂點(diǎn)名軟件來(lái)輔助課堂教學(xué)。本軟件采用Microsoft Visual Studio 2005.NET的Visual C#進(jìn)行編寫。
關(guān)鍵字:課堂點(diǎn)名,點(diǎn)名,課堂,軟件
1.1.當(dāng)代大學(xué)生出勤的現(xiàn)狀
大學(xué)生是國(guó)家青年中的精華,是未來(lái)建設(shè)祖國(guó)、實(shí)現(xiàn)中華民族偉大復(fù)興的中堅(jiān)力量;而大學(xué)又是人一生中學(xué)習(xí)知識(shí)、鍛煉能力的關(guān)鍵時(shí)期。大學(xué)生在大學(xué)中能夠接受多少知識(shí)直接關(guān)系到他們未來(lái)的發(fā)展,決定他們能不能擔(dān)當(dāng)起祖國(guó)合格建設(shè)者的光榮職責(zé)。在大學(xué)生的學(xué)習(xí)生活中,學(xué)校教育無(wú)疑是最重要的環(huán)節(jié),通過(guò)老師們的言傳身教,大學(xué)生能夠迅速掌握各種知識(shí),提升個(gè)人素質(zhì)。但是,在當(dāng)代大學(xué)生卻存在一個(gè)及其普遍的現(xiàn)象——逃課,“必修課選逃、選修課必逃”成為很多學(xué)生的上課準(zhǔn)則,一個(gè)課堂上只有寥寥數(shù)人的景象經(jīng)常發(fā)生;有些課堂上雖然有不少人在上課,但遲到、早退,上課中途又逃課等現(xiàn)象卻頻頻會(huì)發(fā)生。
學(xué)生的天職是學(xué)習(xí),上好每一節(jié)課是其最基本的任務(wù),也是其汲取知識(shí)、增長(zhǎng)才干的最基本途徑。而近些年來(lái),大學(xué)生逃課現(xiàn)象在大學(xué)校園里普遍出現(xiàn),并由逐步蔓延的趨勢(shì),幾乎成了高校中流行的通病,嚴(yán)重影響了大學(xué)的教學(xué)質(zhì)量。大學(xué)生出勤率的高低是衡量大學(xué)教學(xué)管理是否科學(xué)的標(biāo)準(zhǔn)之一.只有保證有較高的出勤率,才能保證教學(xué)質(zhì)量,才能讓學(xué)生學(xué)到更多的科學(xué)文化知識(shí),才能更好的提高大學(xué)生科學(xué)文化素質(zhì).據(jù)此希望大學(xué)能夠采取科學(xué)的措施來(lái)改善這種狀況,營(yíng)造良好的大學(xué)學(xué)風(fēng),為學(xué)生負(fù)責(zé),為社會(huì)負(fù)責(zé)。
高校擴(kuò)招以來(lái),伴隨著教育改革的深入,越來(lái)越多的青年學(xué)子能夠有機(jī)會(huì)步入理想的大學(xué)校園,實(shí)現(xiàn)青春的夢(mèng)想.但是大學(xué)生并非一些人心中的殿堂,當(dāng)不少大學(xué)生感受到大學(xué)所帶來(lái)的壓力時(shí),彷徨和困惑接踵而至.此時(shí),逃課成了他們逃避現(xiàn)實(shí)的方法之一.首先,同學(xué)們對(duì)于"必修課選逃,選修課選逃"等對(duì)曠課的說(shuō)法普遍持有"可以接受"的態(tài)度,站人說(shuō)的70%.雖然沒(méi)有人支持逃課,但是明確反對(duì)的僅占20%,而抱"無(wú)所謂"心態(tài)的同學(xué)則可以理解為默許,占到總?cè)藬?shù)的10%.(如表1)
表1對(duì)曠課的看法
支持 反對(duì) 可以接受 無(wú)所謂
人數(shù) 1 2 21 3
百分比 0% 20% 70% 10%
這是旨在了解同學(xué)在思想認(rèn)識(shí)上是如何看待逃課現(xiàn)象的,他們?cè)诟髯运枷氲闹笇?dǎo)下,表現(xiàn)為"逃課"或者"不逃課"的行為,與此相吻合的是,同學(xué)中有逃課經(jīng)歷的人數(shù)竟然站調(diào)查人數(shù)的66.7%.其中,逃課缺勤的課程選擇上,"對(duì)其無(wú)興趣的"占總?cè)藬?shù)的63.33%,"課程管理松的"占26.67%.(如表2)
表2缺勤較多的課程
專業(yè)課 基礎(chǔ)課 課程管理松 無(wú)興趣
人數(shù) 1 2 8 19
百分比 3.33% 6.67% 26.7% 63.33%
1.2.對(duì)大學(xué)課堂點(diǎn)名現(xiàn)狀的分析
通過(guò)上述對(duì)當(dāng)代大學(xué)生出勤現(xiàn)狀的調(diào)查分析,我們得出一個(gè)結(jié)論當(dāng)代大學(xué)生課堂出勤率持續(xù)低下以成普遍現(xiàn)象。目前大學(xué)期間學(xué)生獲得知識(shí)增長(zhǎng)才干的主要途徑仍是課堂教學(xué),但在如今低下得出勤率的情況下學(xué)生在課堂又能學(xué)到多少知識(shí)令人堪憂。由此大部分學(xué)校或任課教師為保證教學(xué)質(zhì)量讓更多的學(xué)生學(xué)到更多的知識(shí),采用了課堂點(diǎn)名簽到的辦法提高出勤率。此方法確實(shí)起到了立竿見(jiàn)影的效果,很多課堂上又出現(xiàn)了座無(wú)虛席的景象。有保障的出勤率使得教學(xué)質(zhì)量大大提高。
目前任課教師課堂點(diǎn)名一般采用兩種方式,即逐個(gè)對(duì)全部學(xué)生點(diǎn)名和自己進(jìn)行抽點(diǎn)。全部逐個(gè)點(diǎn)名的好處顯而易見(jiàn),它可以真實(shí)的記錄和反映所有學(xué)生得出勤情況,具有很強(qiáng)的說(shuō)服力。但是此方法的弱點(diǎn)也是顯而易見(jiàn)的耗時(shí)多,教師點(diǎn)名工作量大占去課堂教學(xué)的大量時(shí)間。為此抽點(diǎn)則要實(shí)用的多,可以短時(shí)間完成點(diǎn)名減少教師點(diǎn)名工作量,從而減少因點(diǎn)名而占用的課堂時(shí)間。不過(guò)這種點(diǎn)名方式也有它的弊端,他帶有教師強(qiáng)烈的主管情緒。做不到真正公平的隨機(jī)抽點(diǎn),也做不到按一定比例進(jìn)行抽點(diǎn)。
目前課堂點(diǎn)名大多還是使用傳統(tǒng)的點(diǎn)名方式,即任課教師手持學(xué)生點(diǎn)名名單對(duì)名單上的學(xué)生姓名點(diǎn)出,然后由學(xué)生答到再由教師對(duì)點(diǎn)名名單進(jìn)行手工的記錄出勤與否。如此教師每次給不同的班上課都要帶多份紙制名單很不方便,而且名單容易丟失。點(diǎn)名期間點(diǎn)錯(cuò)后不易修改,且教師每次點(diǎn)名工作量大。有時(shí)由于課堂人多人聲嘈雜還會(huì)出現(xiàn)漏點(diǎn)、錯(cuò)點(diǎn)和點(diǎn)名效率低下的情況。
二、對(duì)課堂點(diǎn)名軟件的分析
2.1 設(shè)計(jì)思想
2.1.1 系統(tǒng)的設(shè)計(jì)思想
先進(jìn)性:采用先進(jìn)的計(jì)算機(jī)和數(shù)據(jù)庫(kù)技術(shù),選用具有良好發(fā)展前景的產(chǎn)品,為應(yīng)用及開(kāi)發(fā)創(chuàng)造一個(gè)良好的環(huán)境,使系統(tǒng)具有先進(jìn)性,并在相當(dāng)長(zhǎng)的時(shí)期內(nèi)不失其先進(jìn)性。
實(shí)用性:選用的產(chǎn)品技術(shù)先進(jìn)、成熟,支持軟件多、開(kāi)發(fā)工具豐富,價(jià)格合理,符合國(guó)際、國(guó)家或行業(yè)標(biāo)準(zhǔn);用戶界面做到直觀、友好,業(yè)務(wù)人員只需經(jīng)過(guò)簡(jiǎn)單培訓(xùn)即可操作。在歸納共性的基礎(chǔ)上充分考慮具體商業(yè)企業(yè)的個(gè)性,使之成為一個(gè)結(jié)構(gòu)合理、功能齊全、界面友好、實(shí)用性強(qiáng)的系統(tǒng)。
可靠性:采用良好的操作系統(tǒng)和數(shù)據(jù)庫(kù),確保數(shù)據(jù)的一致性和完整性,并使系統(tǒng)免受病毒感染。提供完善的數(shù)據(jù)備份方案和系統(tǒng)崩潰后的恢復(fù)手段。
可維護(hù)性:系統(tǒng)提供強(qiáng)有力的數(shù)據(jù)庫(kù)管理功能,能有效地進(jìn)行數(shù)據(jù)庫(kù)系統(tǒng)的管理、維護(hù)、監(jiān)視;能方便地進(jìn)行系統(tǒng)的控制、重組和性能調(diào)整,使系統(tǒng)保持良好的性能。應(yīng)用系統(tǒng)應(yīng)有相應(yīng)的管理、維護(hù)功能,提供用戶幫助功能以方便用戶的使用和維護(hù)。
可擴(kuò)充性:學(xué)生名單的增減不影響系統(tǒng)的運(yùn)行;系統(tǒng)設(shè)備配置靈活方便,兼容性和開(kāi)放性好,便于升級(jí);應(yīng)用軟件實(shí)現(xiàn)模塊相互獨(dú)立,控制程序和執(zhí)行程序相分離,具有高度的程序獨(dú)立性和數(shù)據(jù)獨(dú)立性,使機(jī)構(gòu)和業(yè)務(wù)變化的影響減至最小,方便了擴(kuò)充和修改。
2.1.2 系統(tǒng)的設(shè)計(jì)目標(biāo)
操作界面簡(jiǎn)單,容易操作。
實(shí)現(xiàn)課堂全部點(diǎn)名的功能和指定某人點(diǎn)名。
實(shí)現(xiàn)按人數(shù)比例對(duì)學(xué)生進(jìn)行隨機(jī)抽點(diǎn)和根據(jù)歷史出勤情況進(jìn)行智能抽點(diǎn)。
實(shí)現(xiàn)課堂答題的隨機(jī)抽點(diǎn)功能。
實(shí)現(xiàn)語(yǔ)音化點(diǎn)名或無(wú)聲點(diǎn)名。
實(shí)現(xiàn)對(duì)點(diǎn)名數(shù)據(jù)的統(tǒng)計(jì)分析功能。
具有點(diǎn)名名單的擴(kuò)充性和靈活性。
2.1.3 系統(tǒng)的基本框架
本系統(tǒng)采用C/S開(kāi)發(fā)模式;
C/S (Client/Server)結(jié)構(gòu),即大家熟知的客戶機(jī)和服務(wù)器結(jié)構(gòu)。它是軟件系統(tǒng)體系結(jié)構(gòu),通過(guò)它可以充分利用兩端硬件環(huán)境的優(yōu)勢(shì),將任務(wù)合理分配到Client端和Server端來(lái)實(shí)現(xiàn),降低了系統(tǒng)的通訊開(kāi)銷。目前大多數(shù)應(yīng)用軟件系統(tǒng)都是Client/Server形式的兩層結(jié)構(gòu)。
C/S其結(jié)構(gòu)分為兩層,數(shù)據(jù)層、應(yīng)用層
2.1.3.1 總體模塊結(jié)構(gòu)
2.1.3.2 子模塊結(jié)構(gòu)
2.1.3.2.1 全體點(diǎn)名模塊
2.1.3.2.2 部分抽點(diǎn)模塊
2.1.3.2.3 答題點(diǎn)名模塊
2.1.3.2.4 出勤統(tǒng)計(jì)
2.1.4 系統(tǒng)的實(shí)現(xiàn)環(huán)境
應(yīng)用系統(tǒng)與其所處的系統(tǒng)環(huán)境密切相關(guān),一個(gè)系統(tǒng)的功能及性能好壞,環(huán)境起著十分顯著的作用。
2.1.4.1 硬件環(huán)境
系統(tǒng)的硬件配置如下:
PIII 800 CPU
256M 內(nèi)存
15英寸顯示器
30G 硬盤
2.1.4.2 軟件環(huán)境
課堂點(diǎn)名軟件要求安裝在Windows 2000以上的系統(tǒng)里,并要求安裝Microsoft .NET Framework 2.0。若要實(shí)現(xiàn)中文語(yǔ)音點(diǎn)名則還必須安裝Microsoft Speech SDK 5.1和Microsoft Speech SDK 5.1 Language Pack。
2.2開(kāi)發(fā)工具的選用及介紹
開(kāi)發(fā)本軟件開(kāi)發(fā)工具主要用到了Microsoft Visual Studio 2005.NET和Microsoft Office 2003,以及Microsoft .NET Framework 2.0、Microsoft Speech SDK 5.1和Microsoft Speech SDK 5.1 Language Pack等平臺(tái)的支持。
Visual Studio .NET 是一套完整的開(kāi)發(fā)工具,用于生成 ASP Web 應(yīng)用程序、XML Web services、桌面應(yīng)用程序和移動(dòng)應(yīng)用程序。Visual Basic .NET、Visual C++ .NET、Visual C# .NET 和 Visual J# .NET 全都使用相同的集成開(kāi)發(fā)環(huán)境 (IDE),該環(huán)境允許它們共享工具并有助于創(chuàng)建混合語(yǔ)言解決方案。另外,這些語(yǔ)言利用了 .NET Framework 的功能,此框架提供對(duì)簡(jiǎn)化 ASP Web 應(yīng)用程序和 XML Web services 開(kāi)發(fā)的關(guān)鍵技術(shù)的訪問(wèn)。
Windows 窗體
Windows 窗體是用于 Microsoft Windows 應(yīng)用程序開(kāi)發(fā)的、基于 .NET Framework 的新平臺(tái)。此框架提供一個(gè)有條理的、面向?qū)ο蟮摹⒖蓴U(kuò)展的類集,使您能夠開(kāi)發(fā)功能豐富的 Windows 應(yīng)用程序。另外,Windows 窗體可作為多層分布式解決方案中的本地用戶界面。
.NET Framework 旨在實(shí)現(xiàn)下列目標(biāo):
提供一個(gè)一致的面向?qū)ο蟮木幊汰h(huán)境,而無(wú)論對(duì)象代碼是在本地存儲(chǔ)和執(zhí)行,還是在本地執(zhí)行但在 Internet 上分布,或者是在遠(yuǎn)程執(zhí)行的。
提供一個(gè)將軟件部署和版本控制沖突最小化的代碼執(zhí)行環(huán)境。
提供一個(gè)可提高代碼(包括由未知的或不完全受信任的第三方創(chuàng)建的代碼)執(zhí)行安全性的代碼執(zhí)行環(huán)境。
提供一個(gè)可消除腳本環(huán)境或解釋環(huán)境的性能問(wèn)題的代碼執(zhí)行環(huán)境。
使開(kāi)發(fā)人員的經(jīng)驗(yàn)在面對(duì)類型大不相同的應(yīng)用程序(如基于 Windows 的應(yīng)用程序和基于 Web 的應(yīng)用程序)時(shí)保持一致。
按照工業(yè)標(biāo)準(zhǔn)生成所有通信,以確保基于 .NET Framework 的代碼可與任何其他代碼集成。
.NET Framework 具有兩個(gè)主要組件:公共語(yǔ)言運(yùn)行庫(kù)和 .NET Framework 類庫(kù)。公共語(yǔ)言運(yùn)行庫(kù)是 .NET Framework 的基礎(chǔ)。您可以將運(yùn)行庫(kù)看作一個(gè)在執(zhí)行時(shí)管理代碼的代理,它提供內(nèi)存管理、線程管理和遠(yuǎn)程處理等核心服務(wù),并且還強(qiáng)制實(shí)施嚴(yán)格的類型安全以及可提高安全性和可靠性的其他形式的代碼準(zhǔn)確性。事實(shí)上,代碼管理的概念是運(yùn)行庫(kù)的基本原則。以運(yùn)行庫(kù)為目標(biāo)的代碼稱為托管代碼,而不以運(yùn)行庫(kù)為目標(biāo)的代碼稱為非托管代碼。.NET Framework 的另一個(gè)主要組件是類庫(kù),它是一個(gè)綜合性的面向?qū)ο蟮目芍赜妙愋图,您可以使用它開(kāi)發(fā)多種應(yīng)用程序,這些應(yīng)用程序包括傳統(tǒng)的命令行或圖形用戶界面 (GUI) 應(yīng)用程序,也包括基于 ASP.NET 所提供的最新創(chuàng)新的應(yīng)用程序(如 Web 窗體和 XML Web services)。
.NET Framework 可由非托管組件承載,這些組件將公共語(yǔ)言運(yùn)行庫(kù)加載到它們的進(jìn)程中并啟動(dòng)托管代碼的執(zhí)行,從而創(chuàng)建一個(gè)可以同時(shí)利用托管和非托管功能的軟件環(huán)境。.NET Framework 不但提供若干個(gè)運(yùn)行庫(kù)宿主,而且還支持第三方運(yùn)行庫(kù)宿主的開(kāi)發(fā)。
.NET Framework 環(huán)境
()
SAPI SDK(Microsoft Speech SDK 5.1和Microsoft Speech SDK 5.1 Language Pack)
SAPI SDK是微軟公司免費(fèi)提供的語(yǔ)音應(yīng)用開(kāi)發(fā)工具包,這個(gè)SDK中包含了語(yǔ)音應(yīng)用設(shè)計(jì)接口(SAPI)、微軟的連續(xù)語(yǔ)音識(shí)別引擎(MCSR)以及微軟的語(yǔ)音合成(TTS)引擎等等。目前的5.1版本一共可以支持3種語(yǔ)言的識(shí)別 (英語(yǔ),漢語(yǔ)和日語(yǔ))以及2種語(yǔ)言的合成(英語(yǔ)和漢語(yǔ))。SAPI中還包括對(duì)于低層控制和高度適應(yīng)性的直接語(yǔ)音管理、訓(xùn)練向?qū)、事件、語(yǔ)法編譯、資源、語(yǔ)音識(shí)別(SR)管理以及TTS管理等強(qiáng)大的設(shè)計(jì)接口。其結(jié)構(gòu)如圖(1):
圖(1)
語(yǔ)音引擎則通過(guò)DDI層(設(shè)備驅(qū)動(dòng)接口)和SAPI(SpeechAPI)進(jìn)行交互,應(yīng)用程序通過(guò)API層和SAPI通信。通過(guò)使用這些API,用戶可以快速開(kāi)發(fā)在語(yǔ)音識(shí)別或語(yǔ)音合成方面應(yīng)用程序。
()
三、課堂點(diǎn)名軟件的具體設(shè)計(jì)與實(shí)現(xiàn)
3.1數(shù)據(jù)表的設(shè)計(jì)與實(shí)現(xiàn)
本系統(tǒng)使用Microsoft Office 2003 里的EXECL表作為數(shù)據(jù)庫(kù)。這主要是介于目前學(xué)校實(shí)際網(wǎng)絡(luò)情況而定的,如設(shè)計(jì)SQL Server 2000等數(shù)據(jù)庫(kù)實(shí)現(xiàn)全校統(tǒng)一管理則需要良好的網(wǎng)絡(luò)環(huán)境。通過(guò)實(shí)際了解本了教室的網(wǎng)絡(luò)情況得出以下不利因素:
1.網(wǎng)絡(luò)穩(wěn)定性差
2.網(wǎng)絡(luò)病毒流行
3.很多教室網(wǎng)絡(luò)完全不通
為了能夠更好的保障本系統(tǒng)的使用。所以,選擇了基于本地?cái)?shù)據(jù)庫(kù)的設(shè)計(jì)方法。
其次,從了解得知任課教師從教務(wù)處獲得的名單格式為Html的網(wǎng)頁(yè)格式。具體請(qǐng)見(jiàn)下圖:
名單為Html網(wǎng)頁(yè)格式。介于對(duì)Html網(wǎng)頁(yè)文件的操作安全性、數(shù)據(jù)存儲(chǔ)性和可操作行方面考慮,所以放棄了直接將Html網(wǎng)頁(yè)作數(shù)據(jù)庫(kù)的設(shè)計(jì)。從而選擇了操作更加簡(jiǎn)單,安全性更高的EXCEL表做數(shù)據(jù)庫(kù)。
EXECL點(diǎn)名數(shù)據(jù)庫(kù)的結(jié)構(gòu)如下:
列 名 類 型
序號(hào) 常 規(guī)
姓名 常 規(guī)
學(xué)號(hào) 常 規(guī)
第一次 常 規(guī)
… …
在本數(shù)據(jù)庫(kù)中用1和0表示出勤和缺勤的記錄,空值表示未點(diǎn)名。
任課教師可以方便的自行建立數(shù)據(jù)庫(kù)進(jìn)行點(diǎn)名。具體方法是:將原名單的Html文件打開(kāi),將其中表格內(nèi)的所有行和所有列進(jìn)行復(fù)制,然后新建一個(gè)excel表,打開(kāi)新建的excel表,在excel表的第一個(gè)空點(diǎn)擊鼠標(biāo)右鍵粘貼,然后保存退出即可。如此一個(gè)學(xué)生數(shù)據(jù)庫(kù)名單就建立成功,便可以方便的進(jìn)行點(diǎn)名操作了。
建立好的數(shù)據(jù)庫(kù)具體見(jiàn)下圖:
3.2 課堂點(diǎn)名軟件的軟件部分設(shè)計(jì)
本系統(tǒng)主要為實(shí)現(xiàn):
操作界面簡(jiǎn)單,容易操作。
實(shí)現(xiàn)課堂全部點(diǎn)名的功能和指定某人點(diǎn)名。
實(shí)現(xiàn)按人數(shù)比例對(duì)學(xué)生進(jìn)行隨機(jī)抽點(diǎn)和根據(jù)歷史出勤情況進(jìn)行智能抽點(diǎn)。
實(shí)現(xiàn)課堂答題的隨機(jī)抽點(diǎn)功能。
實(shí)現(xiàn)語(yǔ)音化點(diǎn)名或無(wú)聲點(diǎn)名。
實(shí)現(xiàn)對(duì)點(diǎn)名數(shù)據(jù)的統(tǒng)計(jì)分析功能。
具有點(diǎn)名名單的擴(kuò)充性和靈活性。
為實(shí)現(xiàn)上述點(diǎn)名功能本系統(tǒng)由兩個(gè)Winform窗體和四個(gè)的模塊組成。兩個(gè)Winform窗體分別為main主窗體和que答題點(diǎn)名窗體。main主窗體主要由全體點(diǎn)名模塊、部分抽點(diǎn)模塊和出勤統(tǒng)計(jì)模塊組成,而que答題點(diǎn)名窗體主要由課堂答題抽點(diǎn)模塊組成。具體架構(gòu)如下所示:
3.2.1 全體點(diǎn)名模塊
1.1 設(shè)計(jì)方法
本模塊用于對(duì)全體學(xué)生進(jìn)行點(diǎn)名,也可以指定對(duì)某人進(jìn)行點(diǎn)名。需要實(shí)現(xiàn)無(wú)聲點(diǎn)名和語(yǔ)音點(diǎn)名功能,并向數(shù)據(jù)庫(kù)記錄下點(diǎn)名記錄。主要工作流程見(jiàn)下圖:
1.2界面設(shè)計(jì)
打開(kāi)Microsoft Visual Studio 2005,選擇【文件】|【項(xiàng)目】|【Visual C#】|【W(wǎng)indows應(yīng)用程序】命令,然后就可以新建項(xiàng)目,如圖所示:
這時(shí)在窗口上會(huì)出現(xiàn)一個(gè)新窗體。向窗體中添加一個(gè)tabControl用于切換各個(gè)模塊的功能界面。如圖所示:
然后向tabpage1上添加控件,分別為八個(gè)button,;再填加一個(gè)checkBox、trackBar、comboBox和dataGridView;最后添加五個(gè)Label。再給上述控件設(shè)定相應(yīng)的參數(shù),具體參數(shù)見(jiàn)下表:
類型 Name Text
tabpage Tabpage1 全體點(diǎn)名
tabpage Tabpage2 部分點(diǎn)名
tabpage Tabpage3 答題點(diǎn)名
tabpage Tabpage4 出勤統(tǒng)計(jì)
button openfile 打開(kāi)
button top 第一個(gè)
button tail 最后一個(gè)
button back 上一個(gè)
button next 下一個(gè)
button appeare 開(kāi)始
button absent 缺勤
button red 重度
checkBox checkBox1 語(yǔ)音點(diǎn)名
trackBar trackBar1
comboBox time
dataGridView dataGridView1
Label Label1 第
Label Label2 次
Label Label10 (注:1表示已到,0表示缺席。)
Label tato
Label name
(注:向comboBox1的Itmes屬性裝入30個(gè)點(diǎn)名次數(shù)。例如:1,2,3...。再對(duì)trackBar1的maximum和minmum賦值分別為100和0。)
這樣第一個(gè)功能模塊的界面就設(shè)計(jì)好了,如圖所示:
1.3主要程序說(shuō)明
1 基本函數(shù)
//創(chuàng)建到excel數(shù)據(jù)庫(kù)的連接
public OleDbConnection returnConn()
{
string strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + address + ";Extended Properties=Excel 8.0";
System.Data.OleDb.OleDbConnection conn = new OleDbConnection(strConn);
return conn;
}
//返回DataAdapter
public OleDbDataAdapter returnRa()
{
string strCmdText = "select * from [Sheet1$]";
OleDbDataAdapter od = new OleDbDataAdapter(strCmdText, returnConn());
return od;
}
//將數(shù)據(jù)裝入到DataSet里面
DataSet ds;
public DataSet reutrnDs()
{
if (ds != null) //用于判斷數(shù)據(jù)集是否為空,防治數(shù)據(jù)集的重讀現(xiàn)象。
{
return ds;
}
else
{
ds = new DataSet();
returnRa().Fill(ds, "ds");
return ds;
}
}
//聲明一個(gè)類,確定更改字段名。用于對(duì)數(shù)據(jù)的的修改添加。
public string ReturnName(int i)
{
string[] AllName = new string[] { "序號(hào)", "姓 名", "學(xué) 號(hào)", "第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次" };
if (i >= 0 && i < AllName.Length)
return AllName[i];
else
MessageBox.Show("值錯(cuò)誤");
return "";
}
//打開(kāi)文件
public void open()
{
this.openFileDialog1.ShowDialog();
string MyFileName = this.openFileDialog1.FileName;//獲取文件地址
address = MyFileName.Trim();
if (address != "")
{
row = reutrnDs().Tables[0].Rows.Count;//獲取名單的總行數(shù)
column = reutrnDs().Tables[0].Columns.Count;//獲取名單的總列數(shù)
}
}
//顯示文件到DataGridView1
void dis(DataGridView Dgv, Label lab, int i, int j)
{
returnConn();
returnRa();
Dgv.DataSource = reutrnDs().Tables[0].DefaultView;//將名單顯示到dataGridView1里面
lab.Text = reutrnDs().Tables[0].Rows[i][j].ToString();//將人名顯示到name里面
}
//用于修改數(shù)據(jù)庫(kù)內(nèi)的數(shù)據(jù)
public void BindToView(int UpValue, int whichUpdateRow, int whichUpdateCl)
{
DataSet ds = reutrnDs();
try
{
ds.Tables["ds"].Rows[whichUpdateRow][whichUpdateCl] = UpValue;
}
catch
{
MessageBox.Show("類型不匹配或者主鍵不可更改");
return;
}
OleDbDataAdapter od = returnRa();
if (true)
{
if (ds.Tables["ds"].GetChanges() != null)
{
OleDbConnection conn = returnConn();
od.UpdateCommand = new OleDbCommand();
od.UpdateCommand.CommandText = "update [sheet1$] set " + ReturnName(whichUpdateCl) + "='" + ds.Tables["ds"].Rows[whichUpdateRow][whichUpdateCl].ToString() + "' where [" + ReturnName(2) + "]=" + ds.Tables["ds"].Rows[whichUpdateRow][2].ToString();
od.UpdateCommand.Connection = conn;
conn.Open();;
od.UpdateCommand.ExecuteNonQuery();
}
}
點(diǎn)擊事件程序
首先編寫了“打開(kāi)”按鍵下的點(diǎn)擊事件。用于選擇要打開(kāi)的excel數(shù)據(jù)庫(kù)文件。并將其顯示在dataGridView1、name和tato里面。dataGridView1用于顯示選定的整個(gè)數(shù)據(jù)庫(kù)的內(nèi)容,name顯示當(dāng)前點(diǎn)名學(xué)生的姓名,tato用于顯示數(shù)據(jù)庫(kù)名稱,一般可設(shè)為班級(jí)名稱。
private void openfile_Click(object sender, EventArgs e)
{
if (ds != null) //將數(shù)據(jù)集清空,以備用。
{
ds.Dispose();
}
open();
if (address != "")
{
i = 0; //數(shù)據(jù)的行控制
j = 1; //數(shù)據(jù)的列控制
hang = 0; //用于控制dataGridView1里面的光標(biāo)移動(dòng)
l = 1; //用于判斷是否選擇了名單
dis(dataGridView1, name, i, j);
dataGridView1.CurrentCell = dataGridView1.Rows[i].Cells[1];
}
tato.Text = openFileDialog1.FileName.Substring(openFileDialog1.FileName.LastIndexOf("\\") + 1);
appeare.Text = "開(kāi) 始";
tot = 0; //用于記錄點(diǎn)名總?cè)藬?shù)
sd = 0; //用于記錄實(shí)到人數(shù)
dy= 0; //用于控制語(yǔ)音朗讀
}
“上一個(gè)”按鍵主要程序
i -= 1;
dataGridView1.CurrentCell = dataGridView1.Rows[dataGridView1.CurrentRow.Index + 1].Cells[1];
name.Text = reutrnDs().Tables[0].Rows[i][j].ToString();
“下一個(gè)”按鍵主要程序
i += 1;
dataGridView1.CurrentCell = dataGridView1.Rows[dataGridView1.CurrentRow.Index + 1].Cells[1];
name.Text = reutrnDs().Tables[0].Rows[i][j].ToString();
“第一個(gè)”按鍵主要程序
i = 0;
dataGridView1.CurrentCell = dataGridView1.Rows[0].Cells[1];
name.Text = reutrnDs().Tables[0].Rows[i][1].ToString();
“最后一個(gè)”按鍵主要程序
i = row-1;
dataGridView1.CurrentCell = dataGridView1.Rows[0].Cells[1];
name.Text = reutrnDs().Tables[0].Rows[i][1].ToString();
“開(kāi)始”按鍵主要程序
本按鍵主要用于朗讀姓名和記錄出勤。記錄出勤主要調(diào)用到BindToView(1, i, int.Parse(time.Text) + 2)函數(shù)。
編寫語(yǔ)音函數(shù)首先要安裝Microsoft Speech SDK 5.1和Microsoft Speech SDK 5.1 Language Pack。然后在Visual Studio 2005.NET程序里添加引用中的COM里引用Microsoft Speech Object Library。
語(yǔ)音朗讀部分程序:
Try //用于將語(yǔ)音函數(shù)實(shí)例化和初始化
{
svsf = new SpeechVoiceSpeakFlags();
svc = new SpVoiceClass();
svetType("System.String"));
DataColumn dc2 = new DataColumn(time_1.Text, Type.GetType("System.String"));
dt1.Columns.Add(dc1);
dt1.Columns.Add(dc2);
for (int ij = 0; ij < (int)nummen; ij++)
{
//ij = Num(arrNum, ij);
if (ij < (int)nummen)
{
DataRow dr = dt1.NewRow();
dr["姓 名"] = reutrnDs().Tables[0].Rows[ax[ij]][1];
dr[time_1.Text] = reutrnDs().Tables[0].Rows[ax[ij]][int.Parse(time_1.Text)+2];
dt1.Rows.Add(dr);
}
}
Dgv.DataSource = dt1;
}
3.2.2.1 隨機(jī)抽點(diǎn)子模塊
在隨機(jī)抽點(diǎn)子模塊要做到的功能是從原始點(diǎn)名名單里隨機(jī)的抽出一部分人來(lái)生成一個(gè)隨機(jī)點(diǎn)名名單,然后對(duì)其進(jìn)行點(diǎn)名。
隨機(jī)抽點(diǎn)子模塊主要利用一個(gè)隨機(jī)函數(shù)來(lái)對(duì)DataSet數(shù)據(jù)集里面的學(xué)生所在行進(jìn)行隨機(jī)抽點(diǎn)。在DataSet數(shù)據(jù)集里面的數(shù)據(jù)是以二維表方式存放的,在這個(gè)二維表里面每一行代表一個(gè)學(xué)生及其出勤記錄。而行號(hào)就是確定學(xué)生姓名的關(guān)鍵字了。我的做法是首先得到總行數(shù)row,確定抽點(diǎn)人數(shù)比例用這個(gè)比例去乘以row得出抽點(diǎn)人數(shù)nummen,然后再?gòu)?-row中隨即抽取nummen個(gè)不相同的數(shù)字存放在數(shù)組arrNum中。這樣就確定了抽點(diǎn)名單了,再將名單顯是在dataGridView3里。點(diǎn)名時(shí)就只對(duì)arrNum數(shù)組里相對(duì)應(yīng)行號(hào)的學(xué)生點(diǎn)名。
具體流程示意圖:
主要相應(yīng)函數(shù):
//產(chǎn)生隨機(jī)數(shù)并裝入數(shù)組arrNum
int[] arrNum;
public int[] getRandomNum(in od.Fill(ds,"ds");
}
然后可以選擇是否置頂顯示,主要代碼如下
if (top == 0)
{
this.TopMost = true;
button2.Text = "取消置頂";
top = 1;
}
else
{
this.TopMost = false;
button2.Text = "置頂顯示";
top = 0;
}
然后選擇是否需要語(yǔ)音點(diǎn)名,然后開(kāi)始點(diǎn)名。主要代碼如下:
Random ra = new Random();
name_3.Text =ds.Tables[0].Rows[ra.Next(0, ds.Tables[0].Rows.Count)][1].ToString();
if (checkBox1.Checked == true)
{
try
{
svsf = new SpeechVoiceSpeakFlags();
svc = new SpVoiceClass();
svc.SetVolume(Convert.ToUInt16(80));
svc.SetRate(2);
svc.Voice = svc.GetVoices(string.Empty, string.Empty).Item(3);
}
catch
{
MessageBox.Show("語(yǔ)音庫(kù)不存在,請(qǐng)安裝Microsoft Speech SDK 5.1和Microsoft Speech SDK 5.1 Language Pack! ");
checkBox1.Checked = false;
}
mythread = new Thread(Voice);
mythread.Start();
}
2.1 操作流程
3.2.4 出勤統(tǒng)計(jì)模塊
1.1 設(shè)計(jì)方法
本功能模塊主要為實(shí)現(xiàn)對(duì)歷史出勤情況的一個(gè)統(tǒng)計(jì)匯總。主要分為學(xué)生個(gè)人出勤情況統(tǒng)計(jì)和班級(jí)出勤情況統(tǒng)計(jì)。主要工作流程見(jiàn)下圖:
1.2 界面設(shè)計(jì)
點(diǎn)擊tabControl1上的出勤統(tǒng)計(jì)選項(xiàng)卡,這時(shí)出現(xiàn)一個(gè)空白界面。然后向此界面上分別添加一個(gè)button按鈕、dataGridView、groupBox和六個(gè)label。再給上述控件設(shè)定相應(yīng)的參數(shù),具體參數(shù)見(jiàn)下表:
類型 Name Text
button openfile_3 統(tǒng)計(jì)
dataGridView dataGridView4
groupBox groupBox1 班級(jí)出勤情況:
label Label6 個(gè)人出勤情況:
label Label11 班 級(jí):
label Label12 總?cè)藬?shù):
label Label13 出勤總?cè)舜?
label Label14 缺席總?cè)舜?
label Label15 出 席 率:
這樣出勤統(tǒng)計(jì)模塊的界面就設(shè)計(jì)好了,如圖所示:
1.3 主要程序代碼說(shuō)明
主要用于計(jì)算并顯示統(tǒng)計(jì)結(jié)果。
算法示意:
public void dt_3(DataGridView Dgv)
{ int c1,ct,cf=0,cg=1,to=0,cto=0;
string c0=cf.ToString() ,cv=cg.ToString();
DataTable dt3 = new DataTable();
DataColumn dc1 = new DataColumn("姓 名", Type.GetType("System.String"));
DataColumn dc2 = new DataColumn("缺席次數(shù)", Type.GetType("System.String"));
DataColumn dc3 = new DataColumn("點(diǎn)名總次數(shù)", Type.GetType("System.String"));
dt3.Columns.Add(dc1);
dt3.Columns.Add(dc2);
dt3.Columns.Add(dc3);
for (int ij = 0; ij < row; ij++)
{
ct=c1=0;
DataRow dr = dt3.NewRow();
dr["姓 名"] = reutrnDs().Tables[0].Rows[ij][1];
for (int cc = 3; cc<column;cc++ )
{
if (reutrnDs().Tables[0].Rows[ij][cc].ToString()== c0)
{
c1++;
ct++;
cto++;
}
if (reutrnDs().Tables[0].Rows[ij][cc].ToString() == cv)
{
ct++;
to++;
}
}
dr["缺席次數(shù)"] = c1;
dr["點(diǎn)名總次數(shù)"] = ct;
dt3.Rows.Add(dr);
}
Dgv.DataSource = dt3;
label11.Text += " " + openFileDialog1.FileName.Substring(openFileDialog1.FileName.LastIndexOf("\\") + 1);
label12.Text += " " + row+"人";
label13.Text += " " + to+"人次";
label14.Text += " " + cto+"人次";
float ccf;
ccf= (float)to / ((float)to + (float)cto)*100;
label15.Text += " " +ccf.ToString("F")+"%";
}
2.1操作流程
只需點(diǎn)擊“統(tǒng)計(jì)”按鈕,便可生成通解結(jié)果。
四、系統(tǒng)的測(cè)試與運(yùn)行
4.1 軟件測(cè)試
盡管軟件質(zhì)量保證是貫穿軟件開(kāi)發(fā)全過(guò)程的活動(dòng),但最關(guān)鍵的步驟是軟件測(cè)試,軟件測(cè)試是對(duì)軟件規(guī)格說(shuō)明、軟件設(shè)計(jì)和編碼的最后復(fù)審,目的是在軟件產(chǎn)品交付之前盡可能發(fā)現(xiàn)軟件中潛伏的錯(cuò)誤。大量統(tǒng)計(jì)表明,軟件測(cè)試工作量往往占軟件開(kāi)發(fā)總工作量的40%以上。
這個(gè)階段是用來(lái)測(cè)試程序,找出系統(tǒng)Bug并修改錯(cuò)誤的過(guò)程。雖然在每個(gè)模塊開(kāi)發(fā)的過(guò)程中都進(jìn)行過(guò)階段性的測(cè)試,但是現(xiàn)場(chǎng)整體測(cè)試更接近將來(lái)系統(tǒng)投入使用的情況。
在查閱了資料后,了解到系統(tǒng)的整體測(cè)試方法主要有非漸增測(cè)試法和漸增測(cè)試法兩種。其中漸增測(cè)試法適用于模塊間數(shù)據(jù)流多、可以單獨(dú)測(cè)試各個(gè)模塊到測(cè)試多的模塊的情況。由于系統(tǒng)各部分之間有密切的關(guān)系,所以選擇漸增測(cè)試法作為測(cè)試的方法。
測(cè)試時(shí)首先對(duì)各個(gè)模塊的功能進(jìn)行測(cè)試,對(duì)照需求分析逐個(gè)測(cè)試系統(tǒng)的功能;然后對(duì)照數(shù)據(jù)庫(kù)的內(nèi)容察看各個(gè)查詢功能反饋的結(jié)果是否正確;最后整體運(yùn)行系統(tǒng),測(cè)試各個(gè)模塊之間的銜接是否會(huì)對(duì)系統(tǒng)的整體性能發(fā)生影響。為了測(cè)試程序的健壯性,還可以在測(cè)試過(guò)程中故意輸入一些錯(cuò)誤的數(shù)據(jù),保證系統(tǒng)能夠自行處理這些錯(cuò)誤,使得系統(tǒng)在日常的使用中不會(huì)由于工作失誤而無(wú)法運(yùn)行。
測(cè)試小結(jié)
在測(cè)試過(guò)程中,確實(shí)發(fā)現(xiàn)了很多的錯(cuò)誤。一部分因?yàn)殚_(kāi)發(fā)環(huán)境與實(shí)際使用環(huán)境不同產(chǎn)生的,比如說(shuō)圖片的效果不對(duì),或者控件的位置出現(xiàn)偏移等等;還有數(shù)據(jù)庫(kù)的連接問(wèn)題,在不同的計(jì)算機(jī)上因?yàn)橛?jì)算機(jī)名的不同導(dǎo)致無(wú)法連接數(shù)據(jù)庫(kù),這些問(wèn)題通過(guò)現(xiàn)場(chǎng)的調(diào)試基本得到了解決。
使用面向?qū)ο蟮拈_(kāi)發(fā)工具進(jìn)行系統(tǒng)開(kāi)發(fā)后,由于其獨(dú)有的特點(diǎn),所以調(diào)試時(shí)與傳統(tǒng)的程序開(kāi)發(fā)語(yǔ)言并不完全相同,就本次開(kāi)發(fā)過(guò)程中使用的Microsoft Visual Studio 2005來(lái)說(shuō),例如:在Microsoft Visual Studio 2005的定義當(dāng)中,面向?qū)ο蟮脑O(shè)計(jì)方法使得很多模塊的變量封裝起來(lái),由此,對(duì)象的變量常常是不可見(jiàn)的,定義全局變量一定要在窗體之外的公用模塊中,而且要定義為公用。
另一部分錯(cuò)誤卻出乎意料,比如說(shuō)有些控件數(shù)組的初始化問(wèn)題。因?yàn)橐篮芏嗲闆r下程序的錯(cuò)誤是連鎖性的,一個(gè)語(yǔ)句錯(cuò)誤,其后相關(guān)語(yǔ)句也跟著出錯(cuò),所以找出錯(cuò)誤源是很重要,在程序中設(shè)置斷點(diǎn)或在調(diào)試模式下執(zhí)行程序,可以快速發(fā)現(xiàn)和糾正錯(cuò)誤,把無(wú)法初始化的控件元素單獨(dú)初始化后,問(wèn)題可以得到解決。
經(jīng)過(guò)測(cè)試的過(guò)程,認(rèn)識(shí)到自己在程序的編寫和思路方面都存在一定的問(wèn)題,相信經(jīng)過(guò)不斷的學(xué)習(xí)和經(jīng)驗(yàn)積累,可以實(shí)現(xiàn)較大的改觀。
參考文獻(xiàn)
張忠國(guó). Visual C#中隨機(jī)數(shù)使用實(shí)例
關(guān)于紅葉二級(jí)電站生產(chǎn)管理系統(tǒng)開(kāi)發(fā)要求. 紅葉二級(jí)電站生產(chǎn)管理系統(tǒng) 2008
配網(wǎng)管理系統(tǒng)---需求分析說(shuō)明書. 紅葉二級(jí)電站生產(chǎn)管理系統(tǒng) 2008
商小千. 燕山大學(xué)里仁學(xué)院“兩課”社會(huì)調(diào)查報(bào)告 2006
白 春. POS系統(tǒng)在零售行業(yè)的應(yīng)用 2005
svc.SetRate(2);
svc.Voice = svc.GetVoices(string.Empty, string.Empty).Item(3);
}
catch
{
MessageBox.Show("語(yǔ)音庫(kù)不存在,請(qǐng)安裝Microsoft Speech SDK 5.1和Microsoft Speech SDK 5.1 Language Pack! ");
checkBox1.Checked = false;
}
private void Voice()//
{
svc.Speak(name.Text.Trim(), svsf);
mythread.Abort();
}
//用于語(yǔ)音的朗讀
mythread = new Thread(Voice);
mythread.Start();
“缺席”按鍵主要程序
“缺席”按鍵主要程序和“開(kāi)始”類似(略)。只是BindToView(0, i, int.Parse(time.Text) + 2)函數(shù)輸入為0。
2.1 操作流程
(注:如沒(méi)有安裝Microsoft Speech SDK 5.1和Microsoft Speech SDK 5.1 Language Pack的計(jì)算機(jī)則會(huì)提示:“語(yǔ)音庫(kù)不存在,請(qǐng)安裝Microsoft Speech SDK 5.1和Microsoft Speech SDK 5.1 Language Pack!” )
3.2.2 部分抽點(diǎn)模塊
1.1設(shè)計(jì)方法
本功能模塊主要實(shí)現(xiàn)按總?cè)藬?shù)比例生成隨機(jī)抽點(diǎn)名單和更具歷史出勤情況生成抽點(diǎn)名單,然后根據(jù)生成的抽點(diǎn)名單進(jìn)行無(wú)聲或語(yǔ)音點(diǎn)名。并向數(shù)據(jù)庫(kù)記錄下點(diǎn)名記錄。主要工作流程見(jiàn)下圖:
1.2界面設(shè)計(jì)
點(diǎn)擊tabControl1上的部分點(diǎn)名選項(xiàng)卡,這時(shí)出現(xiàn)一個(gè)空白界面。然后向此界面上分別添加八個(gè)button按鈕、一個(gè)checkBox、trackBar、兩個(gè)comboBox、兩個(gè)dataGridView和六個(gè)Label。再給上述控件設(shè)定相應(yīng)的參數(shù),具體參數(shù)見(jiàn)下表:
類型 Name Text
button openfile_1 打開(kāi)
button back_1 上一個(gè)
Button next_1 下一個(gè)
Button appeare_1 開(kāi)始
Button absent_1 缺勤
Button random 隨機(jī)抽點(diǎn)
Button duty 出勤抽點(diǎn)
button re_1 重讀
checkBox checkBox2 隨機(jī)抽點(diǎn)
trackBar trackBar2
comboBox percent
comboBox time_1
dataGridView dataGridView2
dataGridView dataGridView3
Label tato1
Label name_1
Label Label3 次
Label Label4 第
Label Label5 抽點(diǎn)比例
Label Label7 抽點(diǎn)名單:
Label Label9 (注:1表示已到,0表示缺席。)
(注:向time_1的Itmes屬性裝入30個(gè)點(diǎn)名次數(shù)。例如:1,2,3...。
向percent的Itmes屬性裝入百分比。例如:10%、20%、30%、40%、50%、60%、70%、80%再對(duì)trackBar2的maximum和minmum賦值分別為100和0。)
這樣部分抽點(diǎn)功能模塊的界面就設(shè)計(jì)好了,如圖所示:
1.3主要程序說(shuō)明
1 基本函數(shù)
//創(chuàng)建到excel數(shù)據(jù)庫(kù)的連接(同上,略)
//返回DataAdapter(同上,略)
//將數(shù)據(jù)裝入到DataSet里面(同上,略)
//聲明一個(gè)類,確定更改字段名。用于對(duì)數(shù)據(jù)的的修改添加。(同上,略)
//用于修改數(shù)據(jù)庫(kù)內(nèi)的數(shù)據(jù)(同上,略)
//顯示文件到DataGridView2
顯示文件到DataGridView3
public void dt_1(DataGridView Dgv,int[] ax)//創(chuàng)建數(shù)據(jù)表格用于裝和顯示生成的名單
{
DataTable dt1 = new DataTable();
DataColumn dc1 = new DataColumn("姓 名", Type.GetType("System.String"));
DataColumn dc2 = new DataColumn(time_1.Text, Type.GetType("System.String"));
dt1.Columns.Add(dc1);
dt1.Columns.Add(dc2);
for (int ij = 0; ij < (int)nummen; ij++)
{
//ij = Num(arrNum, ij);
if (ij < (int)nummen)
{
DataRow dr = dt1.NewRow();
dr["姓 名"] = reutrnDs().Tables[0].Rows[ax[ij]][1];
dr[time_1.Text] = reutrnDs().Tables[0].Rows[ax[ij]][int.Parse(time_1.Text)+2];
dt1.Rows.Add(dr);
}
}
Dgv.DataSource = dt1;
}
3.2.2.1 隨機(jī)抽點(diǎn)子模塊
在隨機(jī)抽點(diǎn)子模塊要做到的功能是從原始點(diǎn)名名單里隨機(jī)的抽出一部分人來(lái)生成一個(gè)隨機(jī)點(diǎn)名名單,然后對(duì)其進(jìn)行點(diǎn)名。
隨機(jī)抽點(diǎn)子模塊主要利用一個(gè)隨機(jī)函數(shù)來(lái)對(duì)DataSet數(shù)據(jù)集里面的學(xué)生所在行進(jìn)行隨機(jī)抽點(diǎn)。在DataSet數(shù)據(jù)集里面的數(shù)據(jù)是以二維表方式存放的,在這個(gè)二維表里面每一行代表一個(gè)學(xué)生及其出勤記錄。而行號(hào)就是確定學(xué)生姓名的關(guān)鍵字了。我的做法是首先得到總行數(shù)row,確定抽點(diǎn)人數(shù)比例用這個(gè)比例去乘以row得出抽點(diǎn)人數(shù)nummen,然后再?gòu)?-row中隨即抽取nummen個(gè)不相同的數(shù)字存放在數(shù)組arrNum中。這樣就確定了抽點(diǎn)名單了,再將名單顯是在dataGridView3里。點(diǎn)名時(shí)就只對(duì)arrNum數(shù)組里相對(duì)應(yīng)行號(hào)的學(xué)生點(diǎn)名。
具體流程示意圖:
主要相應(yīng)函數(shù):
//產(chǎn)生隨機(jī)數(shù)并裝入數(shù)組arrNum
int[] arrNum;
public int[] getRandomNum(int num, int minValue, int maxValue)
{
Random ra = new Random(unchecked((int)DateTime.Now.Ticks));
arrNum = new int[num];
for (int i = 0; i <= num - 1; i++)
{
arrNum[i] = 1234567;
}
int tmp = 0;
for (int i = 0; i <= num -1; i++)
{
tmp = ra.Next(minValue, maxValue); //隨機(jī)取數(shù)
arrNum[i] = getNum(arrNum, tmp, minValue, maxValue, ra); //防止取到重復(fù)的數(shù)字,并值賦到數(shù)組中
}
return arrNum;
}
//判斷是否有重復(fù)隨機(jī)數(shù)
public int getNum(int[] arrNum, int tmp, int minValue, int maxValue, Random ra)
{
int n = 0;
while (n <= arrNum.Length - 1)
{
if (arrNum[n] == tmp) //利用循環(huán)判斷是否有重復(fù)
{
tmp = ra.Next(minValue, maxValue); //重新隨機(jī)獲取。
tmp = getNum(arrNum, tmp, minValue, maxValue, ra);//遞歸:如果取出來(lái)的數(shù)字和已取得的數(shù)字有重復(fù)就重新隨機(jī)獲取。
}
n++;
}
return tmp;
}
3.2.2.2 出勤抽點(diǎn)子模塊
出勤抽點(diǎn)子模塊要做到的功能主要是根據(jù)學(xué)生每個(gè)人的歷史出勤情況有針對(duì)性的按比例生成點(diǎn)名名單。也就是缺勤次數(shù)越多的學(xué)生被加入這個(gè)點(diǎn)名名單的幾率越大。
出勤抽點(diǎn)子模塊主要是利用兩個(gè)數(shù)組和一個(gè)隨機(jī)函數(shù)做到的。首先,獲取DataSet內(nèi)的點(diǎn)名名單的行數(shù)row,然后根據(jù)選取的抽點(diǎn)人數(shù)百分比得出抽點(diǎn)人數(shù)nummen。將0-row行學(xué)生的行號(hào)裝入數(shù)組aa。之后對(duì)整個(gè)DataSet數(shù)據(jù)集里裝的每個(gè)學(xué)生的出勤情況進(jìn)行遍歷,如有缺勤記錄則向aa數(shù)組繼續(xù)裝入一次相應(yīng)的行號(hào)(即同一個(gè)人出現(xiàn)幾次缺勤就裝幾次他的行號(hào)進(jìn)去增加被抽中的幾率)。在遍歷數(shù)據(jù)的同時(shí)記下所有人總的缺勤次數(shù)z。然后利用getRandomNum函數(shù)從0-row+z中隨機(jī)取出nummen個(gè)不相同的數(shù)字存入arrNum,F(xiàn)在就可以根據(jù)arrNum內(nèi)存的數(shù)據(jù)確定aa的相應(yīng)行號(hào),通過(guò)aa又可以確定DataSet數(shù)據(jù)集里面裝得學(xué)生名單的行號(hào)了。實(shí)際上arrNum數(shù)組里面裝得就是生成的出勤名單了。
流程示意圖:
主要相應(yīng)函數(shù):
將將0-row行學(xué)生的行號(hào)和缺勤記錄的行號(hào)裝入數(shù)組aa。
z = row;
if (z <= 30)
t = 1;
if (30 < z && z <= 80)
t = 2;
if (80 < z && z <= 160)
t = 3;
if (160 < z)
t = 4;
aa = new int[row * row * t];
//原有行裝入數(shù)組
for (a = 0; a < row; a++)
aa[a] = a;
//增加行裝入數(shù)組
int dc = 0;
string dd = dc.ToString();
for (c = 0; c < row; c++)
for (a = 3; a < column; a++)
{
if (dd == reutrnDs().Tables[0].Rows[c][a].ToString())
{
for (int k = 0; k < t; k++)
aa[z] = c; z++;
}
}
出勤隨機(jī)函數(shù)
Int wz;
public int[] getRandomNum(int num, int minValue, int maxValue)
{
wz=0;
Random ra = new Random(unchecked((int)DateTime.Now.Ticks));
arrNum = new int[num];
for (int i = 0; i <= num - 1; i++)
{
arrNum[i] = 1234567;
}
int tmp = 0;
for (int i = 0; i <= num -1; i++)
{
tmp = ra.Next(minValue, maxValue); //隨機(jī)取數(shù)
arrNum[i] = getNum(arrNum, tmp, minValue, maxValue, ra); //取出值賦到數(shù)組中
wz++;
}
return arrNum;
}
//判斷是否有重復(fù)隨機(jī)數(shù)
public int getNum(int[] arrNum, int tmp, int minValue, int maxValue, Random ra)
{
int n = 0;
while (n <wz)
{
if (arrNum[n] == tmp||aa[arrNum[n]]==aa[tmp]) //利用循環(huán)判斷是否有重復(fù)
{
tmp = ra.Next(minValue, maxValue); //重新隨機(jī)獲取。
tmp= getNum(arrNum, tmp, minValue, maxValue, ra);//遞歸:如果取出來(lái)的數(shù)字和已取得的數(shù)字有重復(fù)就重新隨機(jī)獲取。
}
n++;
}
return tmp;
}
2.1 操作流程
3.2.3 課堂答題抽點(diǎn)模塊
1.1 設(shè)計(jì)方法
由于大學(xué)課堂人數(shù)眾多,任課教師記不得很多學(xué)生的姓名。提供此功能主要免去了教師反復(fù)抽點(diǎn)某些認(rèn)識(shí)的學(xué)生,使每個(gè)學(xué)生都有被抽到的機(jī)會(huì)。本功能模塊主要實(shí)現(xiàn)課堂教學(xué)過(guò)程中任課教師進(jìn)行的答題抽點(diǎn)功能,同時(shí)還提供小型浮動(dòng)窗口置頂顯示的功能方便教學(xué)時(shí)在PowerPoint、Word和其他一些演示功能的界面上進(jìn)行抽點(diǎn),這樣就不會(huì)影響教學(xué)。
主要工作流程見(jiàn)下圖:
1.2 界面設(shè)計(jì)
點(diǎn)擊tabControl1上的答題點(diǎn)名選項(xiàng)卡,這時(shí)出現(xiàn)一個(gè)空白界面。在界面上添加一個(gè)button按鈕和一個(gè)Label。再給上述控件設(shè)定相應(yīng)的參數(shù),具體參數(shù)見(jiàn)下表:
類型 Name Text
Label Label8 進(jìn)入課堂答題點(diǎn)名系統(tǒng)!
button Button1 進(jìn) 入
這樣答題點(diǎn)名功能模塊的部分界面就設(shè)計(jì)好了,如圖所示:
現(xiàn)在開(kāi)始設(shè)計(jì)答題點(diǎn)名窗體首先在課堂點(diǎn)名解決方案中添加一個(gè)窗體命名為que。然后向窗體上添加五個(gè)button、一個(gè)checkBox和三個(gè)label。再給上述控件設(shè)定相應(yīng)的參數(shù),具體參數(shù)見(jiàn)下表:
類型 Name Text
button openfile_3 選擇名單
button Random_1 點(diǎn)名
button Button1 關(guān)閉
button Button2 顯示置頂
button Button3 重讀
checkBox checkBox1 語(yǔ)音
label Label1 請(qǐng)
label Label2 答題!
label Label3
這樣答題點(diǎn)名功能模塊的界面就設(shè)計(jì)好了,如圖所示:
1.3主要程序說(shuō)明
主窗體main部分:
本段代碼主要用來(lái)進(jìn)入子船體que
答題點(diǎn)名下的進(jìn)入que界面的的button按鍵的事件
private void button1_Click(object sender, EventArgs e)
{
this.Hide();
qus qus = new qus();
qus.ShowDialog();
this.Close();
}
子窗體que部分:
本窗體主要用來(lái)進(jìn)行答題點(diǎn)名功能。
首先選擇點(diǎn)名名單利用open();函數(shù)
public void open()
{
ds.Clear();
this.openFileDialog1.ShowDialog();
string MyFileName = this.openFileDialog1.FileName;
address = MyFileName.Trim();
string strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + address + ";Extended Properties=Excel 8.0";
System.Data.OleDb.OleDbConnection conn = new OleDbConnection(strConn);
string strCmdText = "select * from [Sheet1$]";
OleDbDataAdapter od = new OleDbDataAdapter(strCmdText, conn);
【課堂點(diǎn)名軟件(一)】相關(guān)文章:
自動(dòng)發(fā)油控制軟件設(shè)計(jì)(一)03-07
一種基于網(wǎng)絡(luò)的監(jiān)控軟件設(shè)計(jì)與實(shí)現(xiàn)11-20