1. <tt id="5hhch"><source id="5hhch"></source></tt>
    1. <xmp id="5hhch"></xmp>

  2. <xmp id="5hhch"><rt id="5hhch"></rt></xmp>

    <rp id="5hhch"></rp>
        <dfn id="5hhch"></dfn>

      1. 課堂點(diǎn)名軟件(一)

        時(shí)間:2022-11-22 17:30:18 計(jì)算機(jī)畢業(yè)論文 我要投稿
        • 相關(guān)推薦

        課堂點(diǎn)名軟件(一)

        課堂點(diǎn)名軟件
         目  錄
        一、緒  論 2
        1.1.當(dāng)代大學(xué)生出勤的現(xiàn)狀 2
        1.2.對大學(xué)課堂點(diǎn)名現(xiàn)狀的分析 3
        二、對課堂點(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開發(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)的測試與運(yùn)行 37
        4.1   軟件測試 37
        4.2 測試小結(jié) 37
        參考文獻(xiàn) 38

        課堂點(diǎn)名軟件(一)

         


        一、緒  論
        在電器化教學(xué)飛速發(fā)展的今天,計(jì)算機(jī)成為課堂輔助教學(xué)的重要工具。它在課堂教學(xué)的課件演示、課堂實(shí)驗(yàn)、課堂學(xué)生管理等各個方面發(fā)揮著重要的作用。目前課堂教學(xué),尤其是大學(xué)課堂教學(xué)課件的演示主要是用計(jì)算機(jī)來實(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)了自動化辦公和自動化教學(xué)。這種種自動化辦公和自動化教學(xué)也是由各種功能的軟件所支撐其來的。可見計(jì)算機(jī)軟件管理在學(xué)生管理中起到了很大的作用。所以我想到了設(shè)計(jì)一個課堂點(diǎn)名軟件來輔助課堂教學(xué)。本軟件采用Microsoft Visual Studio 2005.NET的Visual C#進(jìn)行編寫。

        關(guān)鍵字:課堂點(diǎn)名,點(diǎn)名,課堂,軟件
        1.1.當(dāng)代大學(xué)生出勤的現(xiàn)狀
        大學(xué)生是國家青年中的精華,是未來建設(shè)祖國、實(shí)現(xiàn)中華民族偉大復(fù)興的中堅(jiān)力量;而大學(xué)又是人一生中學(xué)習(xí)知識、鍛煉能力的關(guān)鍵時(shí)期。大學(xué)生在大學(xué)中能夠接受多少知識直接關(guān)系到他們未來的發(fā)展,決定他們能不能擔(dān)當(dāng)起祖國合格建設(shè)者的光榮職責(zé)。在大學(xué)生的學(xué)習(xí)生活中,學(xué)校教育無疑是最重要的環(huán)節(jié),通過老師們的言傳身教,大學(xué)生能夠迅速掌握各種知識,提升個人素質(zhì)。但是,在當(dāng)代大學(xué)生卻存在一個及其普遍的現(xiàn)象——逃課,“必修課選逃、選修課必逃”成為很多學(xué)生的上課準(zhǔn)則,一個課堂上只有寥寥數(shù)人的景象經(jīng)常發(fā)生;有些課堂上雖然有不少人在上課,但遲到、早退,上課中途又逃課等現(xiàn)象卻頻頻會發(fā)生。
        學(xué)生的天職是學(xué)習(xí),上好每一節(jié)課是其最基本的任務(wù),也是其汲取知識、增長才干的最基本途徑。而近些年來,大學(xué)生逃課現(xiàn)象在大學(xué)校園里普遍出現(xiàn),并由逐步蔓延的趨勢,幾乎成了高校中流行的通病,嚴(yán)重影響了大學(xué)的教學(xué)質(zhì)量。大學(xué)生出勤率的高低是衡量大學(xué)教學(xué)管理是否科學(xué)的標(biāo)準(zhǔn)之一.只有保證有較高的出勤率,才能保證教學(xué)質(zhì)量,才能讓學(xué)生學(xué)到更多的科學(xué)文化知識,才能更好的提高大學(xué)生科學(xué)文化素質(zhì).據(jù)此希望大學(xué)能夠采取科學(xué)的措施來改善這種狀況,營造良好的大學(xué)學(xué)風(fēng),為學(xué)生負(fù)責(zé),為社會負(fù)責(zé)。
        高校擴(kuò)招以來,伴隨著教育改革的深入,越來越多的青年學(xué)子能夠有機(jī)會步入理想的大學(xué)校園,實(shí)現(xiàn)青春的夢想.但是大學(xué)生并非一些人心中的殿堂,當(dāng)不少大學(xué)生感受到大學(xué)所帶來的壓力時(shí),彷徨和困惑接踵而至.此時(shí),逃課成了他們逃避現(xiàn)實(shí)的方法之一.首先,同學(xué)們對于"必修課選逃,選修課選逃"等對曠課的說法普遍持有"可以接受"的態(tài)度,站人說的70%.雖然沒有人支持逃課,但是明確反對的僅占20%,而抱"無所謂"心態(tài)的同學(xué)則可以理解為默許,占到總?cè)藬?shù)的10%.(如表1)
            表1對曠課的看法
         支持 反對 可以接受 無所謂
        人數(shù) 1 2 21 3
        百分比 0% 20% 70% 10%

        這是旨在了解同學(xué)在思想認(rèn)識上是如何看待逃課現(xiàn)象的,他們在各自思想的指導(dǎo)下,表現(xiàn)為"逃課"或者"不逃課"的行為,與此相吻合的是,同學(xué)中有逃課經(jīng)歷的人數(shù)竟然站調(diào)查人數(shù)的66.7%.其中,逃課缺勤的課程選擇上,"對其無興趣的"占總?cè)藬?shù)的63.33%,"課程管理松的"占26.67%.(如表2)
           
         表2缺勤較多的課程
         專業(yè)課 基礎(chǔ)課 課程管理松 無興趣
        人數(shù) 1 2 8 19
        百分比 3.33% 6.67% 26.7% 63.33%
        1.2.對大學(xué)課堂點(diǎn)名現(xiàn)狀的分析
        通過上述對當(dāng)代大學(xué)生出勤現(xiàn)狀的調(diào)查分析,我們得出一個結(jié)論當(dāng)代大學(xué)生課堂出勤率持續(xù)低下以成普遍現(xiàn)象。目前大學(xué)期間學(xué)生獲得知識增長才干的主要途徑仍是課堂教學(xué),但在如今低下得出勤率的情況下學(xué)生在課堂又能學(xué)到多少知識令人堪憂。由此大部分學(xué);蛉握n教師為保證教學(xué)質(zhì)量讓更多的學(xué)生學(xué)到更多的知識,采用了課堂點(diǎn)名簽到的辦法提高出勤率。此方法確實(shí)起到了立竿見影的效果,很多課堂上又出現(xiàn)了座無虛席的景象。有保障的出勤率使得教學(xué)質(zhì)量大大提高。
        目前任課教師課堂點(diǎn)名一般采用兩種方式,即逐個對全部學(xué)生點(diǎn)名和自己進(jìn)行抽點(diǎn)。全部逐個點(diǎn)名的好處顯而易見,它可以真實(shí)的記錄和反映所有學(xué)生得出勤情況,具有很強(qiáng)的說服力。但是此方法的弱點(diǎn)也是顯而易見的耗時(shí)多,教師點(diǎn)名工作量大占去課堂教學(xué)的大量時(shí)間。為此抽點(diǎn)則要實(shí)用的多,可以短時(shí)間完成點(diǎn)名減少教師點(diǎn)名工作量,從而減少因點(diǎn)名而占用的課堂時(shí)間。不過這種點(diǎn)名方式也有它的弊端,他帶有教師強(qiáng)烈的主管情緒。做不到真正公平的隨機(jī)抽點(diǎn),也做不到按一定比例進(jìn)行抽點(diǎn)。
        目前課堂點(diǎn)名大多還是使用傳統(tǒng)的點(diǎn)名方式,即任課教師手持學(xué)生點(diǎn)名名單對名單上的學(xué)生姓名點(diǎn)出,然后由學(xué)生答到再由教師對點(diǎn)名名單進(jìn)行手工的記錄出勤與否。如此教師每次給不同的班上課都要帶多份紙制名單很不方便,而且名單容易丟失。點(diǎn)名期間點(diǎn)錯后不易修改,且教師每次點(diǎn)名工作量大。有時(shí)由于課堂人多人聲嘈雜還會出現(xiàn)漏點(diǎn)、錯點(diǎn)和點(diǎn)名效率低下的情況。
        二、對課堂點(diǎn)名軟件的分析
        2.1 設(shè)計(jì)思想
        2.1.1 系統(tǒng)的設(shè)計(jì)思想
                先進(jìn)性:采用先進(jìn)的計(jì)算機(jī)和數(shù)據(jù)庫技術(shù),選用具有良好發(fā)展前景的產(chǎn)品,為應(yīng)用及開發(fā)創(chuàng)造一個良好的環(huán)境,使系統(tǒng)具有先進(jìn)性,并在相當(dāng)長的時(shí)期內(nèi)不失其先進(jìn)性。
                實(shí)用性:選用的產(chǎn)品技術(shù)先進(jìn)、成熟,支持軟件多、開發(fā)工具豐富,價(jià)格合理,符合國際、國家或行業(yè)標(biāo)準(zhǔn);用戶界面做到直觀、友好,業(yè)務(wù)人員只需經(jīng)過簡單培訓(xùn)即可操作。在歸納共性的基礎(chǔ)上充分考慮具體商業(yè)企業(yè)的個性,使之成為一個結(jié)構(gòu)合理、功能齊全、界面友好、實(shí)用性強(qiáng)的系統(tǒng)。
                可靠性:采用良好的操作系統(tǒng)和數(shù)據(jù)庫,確保數(shù)據(jù)的一致性和完整性,并使系統(tǒng)免受病毒感染。提供完善的數(shù)據(jù)備份方案和系統(tǒng)崩潰后的恢復(fù)手段。
                可維護(hù)性:系統(tǒng)提供強(qiáng)有力的數(shù)據(jù)庫管理功能,能有效地進(jìn)行數(shù)據(jù)庫系統(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è)備配置靈活方便,兼容性和開放性好,便于升級;應(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)
        操作界面簡單,容易操作。
        實(shí)現(xiàn)課堂全部點(diǎn)名的功能和指定某人點(diǎn)名。
        實(shí)現(xiàn)按人數(shù)比例對學(xué)生進(jìn)行隨機(jī)抽點(diǎn)和根據(jù)歷史出勤情況進(jìn)行智能抽點(diǎn)。
        實(shí)現(xiàn)課堂答題的隨機(jī)抽點(diǎn)功能。
        實(shí)現(xiàn)語音化點(diǎn)名或無聲點(diǎn)名。
        實(shí)現(xiàn)對點(diǎn)名數(shù)據(jù)的統(tǒng)計(jì)分析功能。
        具有點(diǎn)名名單的擴(kuò)充性和靈活性。
        2.1.3  系統(tǒng)的基本框架
        本系統(tǒng)采用C/S開發(fā)模式;
        C/S (Client/Server)結(jié)構(gòu),即大家熟知的客戶機(jī)和服務(wù)器結(jié)構(gòu)。它是軟件系統(tǒng)體系結(jié)構(gòu),通過它可以充分利用兩端硬件環(huán)境的優(yōu)勢,將任務(wù)合理分配到Client端和Server端來實(shí)現(xiàn),降低了系統(tǒng)的通訊開銷。目前大多數(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),一個系統(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)中文語音點(diǎn)名則還必須安裝Microsoft Speech SDK 5.1和Microsoft Speech SDK 5.1 Language Pack。
        2.2開發(fā)工具的選用及介紹
             開發(fā)本軟件開發(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等平臺的支持。
             Visual Studio .NET 是一套完整的開發(fā)工具,用于生成 ASP Web 應(yīng)用程序、XML Web services、桌面應(yīng)用程序和移動應(yīng)用程序。Visual Basic .NET、Visual C++ .NET、Visual C# .NET 和 Visual J# .NET 全都使用相同的集成開發(fā)環(huán)境 (IDE),該環(huán)境允許它們共享工具并有助于創(chuàng)建混合語言解決方案。另外,這些語言利用了 .NET Framework 的功能,此框架提供對簡化 ASP Web 應(yīng)用程序和 XML Web services 開發(fā)的關(guān)鍵技術(shù)的訪問。
        Windows 窗體
        Windows 窗體是用于 Microsoft Windows 應(yīng)用程序開發(fā)的、基于 .NET Framework 的新平臺。此框架提供一個有條理的、面向?qū)ο蟮、可擴(kuò)展的類集,使您能夠開發(fā)功能豐富的 Windows 應(yīng)用程序。另外,Windows 窗體可作為多層分布式解決方案中的本地用戶界面。

        .NET Framework 旨在實(shí)現(xiàn)下列目標(biāo):
        提供一個一致的面向?qū)ο蟮木幊汰h(huán)境,而無論對象代碼是在本地存儲和執(zhí)行,還是在本地執(zhí)行但在 Internet 上分布,或者是在遠(yuǎn)程執(zhí)行的。
        提供一個將軟件部署和版本控制沖突最小化的代碼執(zhí)行環(huán)境。
        提供一個可提高代碼(包括由未知的或不完全受信任的第三方創(chuàng)建的代碼)執(zhí)行安全性的代碼執(zhí)行環(huán)境。
        提供一個可消除腳本環(huán)境或解釋環(huán)境的性能問題的代碼執(zhí)行環(huán)境。
        使開發(fā)人員的經(jīng)驗(yàn)在面對類型大不相同的應(yīng)用程序(如基于 Windows 的應(yīng)用程序和基于 Web 的應(yīng)用程序)時(shí)保持一致。
        按照工業(yè)標(biāo)準(zhǔn)生成所有通信,以確; .NET Framework 的代碼可與任何其他代碼集成。
        .NET Framework 具有兩個主要組件:公共語言運(yùn)行庫和 .NET Framework 類庫。公共語言運(yùn)行庫是 .NET Framework 的基礎(chǔ)。您可以將運(yùn)行庫看作一個在執(zhí)行時(shí)管理代碼的代理,它提供內(nèi)存管理、線程管理和遠(yuǎn)程處理等核心服務(wù),并且還強(qiáng)制實(shí)施嚴(yán)格的類型安全以及可提高安全性和可靠性的其他形式的代碼準(zhǔn)確性。事實(shí)上,代碼管理的概念是運(yùn)行庫的基本原則。以運(yùn)行庫為目標(biāo)的代碼稱為托管代碼,而不以運(yùn)行庫為目標(biāo)的代碼稱為非托管代碼。.NET Framework 的另一個主要組件是類庫,它是一個綜合性的面向?qū)ο蟮目芍赜妙愋图希梢允褂盟_發(fā)多種應(yīng)用程序,這些應(yīng)用程序包括傳統(tǒng)的命令行或圖形用戶界面 (GUI) 應(yīng)用程序,也包括基于 ASP.NET 所提供的最新創(chuàng)新的應(yīng)用程序(如 Web 窗體和 XML Web services)。
        .NET Framework 可由非托管組件承載,這些組件將公共語言運(yùn)行庫加載到它們的進(jìn)程中并啟動托管代碼的執(zhí)行,從而創(chuàng)建一個可以同時(shí)利用托管和非托管功能的軟件環(huán)境。.NET Framework 不但提供若干個運(yùn)行庫宿主,而且還支持第三方運(yùn)行庫宿主的開發(fā)。
        .NET Framework 環(huán)境

        ()

        SAPI SDK(Microsoft Speech SDK 5.1和Microsoft Speech SDK 5.1 Language Pack)
        SAPI SDK是微軟公司免費(fèi)提供的語音應(yīng)用開發(fā)工具包,這個SDK中包含了語音應(yīng)用設(shè)計(jì)接口(SAPI)、微軟的連續(xù)語音識別引擎(MCSR)以及微軟的語音合成(TTS)引擎等等。目前的5.1版本一共可以支持3種語言的識別 (英語,漢語和日語)以及2種語言的合成(英語和漢語)。SAPI中還包括對于低層控制和高度適應(yīng)性的直接語音管理、訓(xùn)練向?qū)А⑹录、語法編譯、資源、語音識別(SR)管理以及TTS管理等強(qiáng)大的設(shè)計(jì)接口。其結(jié)構(gòu)如圖(1):


        圖(1)
        語音引擎則通過DDI層(設(shè)備驅(qū)動接口)和SAPI(SpeechAPI)進(jìn)行交互,應(yīng)用程序通過API層和SAPI通信。通過使用這些API,用戶可以快速開發(fā)在語音識別或語音合成方面應(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ù)庫。這主要是介于目前學(xué)校實(shí)際網(wǎng)絡(luò)情況而定的,如設(shè)計(jì)SQL Server 2000等數(shù)據(jù)庫實(shí)現(xiàn)全校統(tǒng)一管理則需要良好的網(wǎng)絡(luò)環(huán)境。通過實(shí)際了解本了教室的網(wǎng)絡(luò)情況得出以下不利因素:
        1.網(wǎng)絡(luò)穩(wěn)定性差
        2.網(wǎng)絡(luò)病毒流行
        3.很多教室網(wǎng)絡(luò)完全不通
        為了能夠更好的保障本系統(tǒng)的使用。所以,選擇了基于本地?cái)?shù)據(jù)庫的設(shè)計(jì)方法。
        其次,從了解得知任課教師從教務(wù)處獲得的名單格式為Html的網(wǎng)頁格式。具體請見下圖:

        名單為Html網(wǎng)頁格式。介于對Html網(wǎng)頁文件的操作安全性、數(shù)據(jù)存儲性和可操作行方面考慮,所以放棄了直接將Html網(wǎng)頁作數(shù)據(jù)庫的設(shè)計(jì)。從而選擇了操作更加簡單,安全性更高的EXCEL表做數(shù)據(jù)庫。
        EXECL點(diǎn)名數(shù)據(jù)庫的結(jié)構(gòu)如下:
        列  名 類   型
        序號 常   規(guī)
        姓名 常   規(guī)
        學(xué)號 常   規(guī)
        第一次 常   規(guī)
        … …
        在本數(shù)據(jù)庫中用1和0表示出勤和缺勤的記錄,空值表示未點(diǎn)名。
        任課教師可以方便的自行建立數(shù)據(jù)庫進(jìn)行點(diǎn)名。具體方法是:將原名單的Html文件打開,將其中表格內(nèi)的所有行和所有列進(jìn)行復(fù)制,然后新建一個excel表,打開新建的excel表,在excel表的第一個空點(diǎn)擊鼠標(biāo)右鍵粘貼,然后保存退出即可。如此一個學(xué)生數(shù)據(jù)庫名單就建立成功,便可以方便的進(jìn)行點(diǎn)名操作了。
        建立好的數(shù)據(jù)庫具體見下圖:

        3.2 課堂點(diǎn)名軟件的軟件部分設(shè)計(jì)
        本系統(tǒng)主要為實(shí)現(xiàn):
        操作界面簡單,容易操作。
        實(shí)現(xiàn)課堂全部點(diǎn)名的功能和指定某人點(diǎn)名。
        實(shí)現(xiàn)按人數(shù)比例對學(xué)生進(jìn)行隨機(jī)抽點(diǎn)和根據(jù)歷史出勤情況進(jìn)行智能抽點(diǎn)。
        實(shí)現(xiàn)課堂答題的隨機(jī)抽點(diǎn)功能。
        實(shí)現(xiàn)語音化點(diǎn)名或無聲點(diǎn)名。
        實(shí)現(xiàn)對點(diǎn)名數(shù)據(jù)的統(tǒng)計(jì)分析功能。
        具有點(diǎn)名名單的擴(kuò)充性和靈活性。
        為實(shí)現(xiàn)上述點(diǎn)名功能本系統(tǒng)由兩個Winform窗體和四個的模塊組成。兩個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ì)方法
             本模塊用于對全體學(xué)生進(jìn)行點(diǎn)名,也可以指定對某人進(jìn)行點(diǎn)名。需要實(shí)現(xiàn)無聲點(diǎn)名和語音點(diǎn)名功能,并向數(shù)據(jù)庫記錄下點(diǎn)名記錄。主要工作流程見下圖:


        1.2界面設(shè)計(jì)
            打開Microsoft Visual Studio 2005,選擇【文件】|【項(xiàng)目】|【Visual C#】|【W(wǎng)indows應(yīng)用程序】命令,然后就可以新建項(xiàng)目,如圖所示:


        這時(shí)在窗口上會出現(xiàn)一個新窗體。向窗體中添加一個tabControl用于切換各個模塊的功能界面。如圖所示:

            然后向tabpage1上添加控件,分別為八個button,;再填加一個checkBox、trackBar、comboBox和dataGridView;最后添加五個Label。再給上述控件設(shè)定相應(yīng)的參數(shù),具體參數(shù)見下表:
        類型 Name Text
        tabpage Tabpage1 全體點(diǎn)名
        tabpage Tabpage2 部分點(diǎn)名
        tabpage Tabpage3 答題點(diǎn)名
        tabpage Tabpage4 出勤統(tǒng)計(jì)
        button openfile 打開
        button top 第一個
        button tail 最后一個
        button back 上一個
        button next 下一個
        button appeare 開始
        button absent 缺勤
        button red 重度
        checkBox checkBox1 語音點(diǎn)名
        trackBar trackBar1 
        comboBox time 
        dataGridView dataGridView1 
        Label Label1 第
        Label Label2 次
        Label Label10 (注:1表示已到,0表示缺席。)
        Label tato 
        Label name 
        (注:向comboBox1的Itmes屬性裝入30個點(diǎn)名次數(shù)。例如:1,2,3...。再對trackBar1的maximum和minmum賦值分別為100和0。)
        這樣第一個功能模塊的界面就設(shè)計(jì)好了,如圖所示:

        1.3主要程序說明
           1 基本函數(shù)
        //創(chuàng)建到excel數(shù)據(jù)庫的連接
        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;
                    }
                }

        //聲明一個類,確定更改字段名。用于對數(shù)據(jù)的的修改添加。
                public string ReturnName(int i)
                {
                    string[] AllName = new string[] { "序號", "姓 名", "學(xué) 號", "第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("值錯誤");
                    return "";
                }

                 //打開文件
                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ù)庫內(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)擊事件程序
        首先編寫了“打開”按鍵下的點(diǎn)擊事件。用于選擇要打開的excel數(shù)據(jù)庫文件。并將其顯示在dataGridView1、name和tato里面。dataGridView1用于顯示選定的整個數(shù)據(jù)庫的內(nèi)容,name顯示當(dāng)前點(diǎn)名學(xué)生的姓名,tato用于顯示數(shù)據(jù)庫名稱,一般可設(shè)為班級名稱。
        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)移動
                        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 = "開  始";
                    tot = 0; //用于記錄點(diǎn)名總?cè)藬?shù)
        sd = 0; //用于記錄實(shí)到人數(shù)
        dy= 0; //用于控制語音朗讀
                }

        “上一個”按鍵主要程序
        i -= 1;
             dataGridView1.CurrentCell = dataGridView1.Rows[dataGridView1.CurrentRow.Index + 1].Cells[1];
            name.Text = reutrnDs().Tables[0].Rows[i][j].ToString();

        “下一個”按鍵主要程序
        i += 1;
             dataGridView1.CurrentCell = dataGridView1.Rows[dataGridView1.CurrentRow.Index + 1].Cells[1];
            name.Text = reutrnDs().Tables[0].Rows[i][j].ToString();

        “第一個”按鍵主要程序
        i = 0;
               dataGridView1.CurrentCell = dataGridView1.Rows[0].Cells[1];
             name.Text = reutrnDs().Tables[0].Rows[i][1].ToString();

        “最后一個”按鍵主要程序
        i = row-1;
               dataGridView1.CurrentCell = dataGridView1.Rows[0].Cells[1];
             name.Text = reutrnDs().Tables[0].Rows[i][1].ToString();

        “開始”按鍵主要程序
        本按鍵主要用于朗讀姓名和記錄出勤。記錄出勤主要調(diào)用到BindToView(1, i, int.Parse(time.Text) + 2)函數(shù)。
        編寫語音函數(shù)首先要安裝Microsoft Speech SDK 5.1和Microsoft Speech SDK 5.1 Language Pack。然后在Visual Studio 2005.NET程序里添加引用中的COM里引用Microsoft Speech Object Library。


        語音朗讀部分程序:
        Try  //用于將語音函數(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ī)的抽出一部分人來生成一個隨機(jī)點(diǎn)名名單,然后對其進(jìn)行點(diǎn)名。
        隨機(jī)抽點(diǎn)子模塊主要利用一個隨機(jī)函數(shù)來對DataSet數(shù)據(jù)集里面的學(xué)生所在行進(jìn)行隨機(jī)抽點(diǎn)。在DataSet數(shù)據(jù)集里面的數(shù)據(jù)是以二維表方式存放的,在這個二維表里面每一行代表一個學(xué)生及其出勤記錄。而行號就是確定學(xué)生姓名的關(guān)鍵字了。我的做法是首先得到總行數(shù)row,確定抽點(diǎn)人數(shù)比例用這個比例去乘以row得出抽點(diǎn)人數(shù)nummen,然后再從0-row中隨即抽取nummen個不相同的數(shù)字存放在數(shù)組arrNum中。這樣就確定了抽點(diǎn)名單了,再將名單顯是在dataGridView3里。點(diǎn)名時(shí)就只對arrNum數(shù)組里相對應(yīng)行號的學(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;
                    }

        然后選擇是否需要語音點(diǎn)名,然后開始點(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("語音庫不存在,請安裝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)對歷史出勤情況的一個統(tǒng)計(jì)匯總。主要分為學(xué)生個人出勤情況統(tǒng)計(jì)和班級出勤情況統(tǒng)計(jì)。主要工作流程見下圖:


        1.2 界面設(shè)計(jì)
        點(diǎn)擊tabControl1上的出勤統(tǒng)計(jì)選項(xiàng)卡,這時(shí)出現(xiàn)一個空白界面。然后向此界面上分別添加一個button按鈕、dataGridView、groupBox和六個label。再給上述控件設(shè)定相應(yīng)的參數(shù),具體參數(shù)見下表:
        類型 Name Text
        button openfile_3 統(tǒng)計(jì)
        dataGridView dataGridView4 
        groupBox groupBox1 班級出勤情況:
        label Label6 個人出勤情況:
        label Label11 班  級:
        label Label12 總?cè)藬?shù):
        label Label13 出勤總?cè)舜?
        label Label14 缺席總?cè)舜?
        label Label15 出 席 率:
        這樣出勤統(tǒng)計(jì)模塊的界面就設(shè)計(jì)好了,如圖所示:


        1.3 主要程序代碼說明
        主要用于計(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)的測試與運(yùn)行
        4.1   軟件測試
         盡管軟件質(zhì)量保證是貫穿軟件開發(fā)全過程的活動,但最關(guān)鍵的步驟是軟件測試,軟件測試是對軟件規(guī)格說明、軟件設(shè)計(jì)和編碼的最后復(fù)審,目的是在軟件產(chǎn)品交付之前盡可能發(fā)現(xiàn)軟件中潛伏的錯誤。大量統(tǒng)計(jì)表明,軟件測試工作量往往占軟件開發(fā)總工作量的40%以上。
        這個階段是用來測試程序,找出系統(tǒng)Bug并修改錯誤的過程。雖然在每個模塊開發(fā)的過程中都進(jìn)行過階段性的測試,但是現(xiàn)場整體測試更接近將來系統(tǒng)投入使用的情況。
        在查閱了資料后,了解到系統(tǒng)的整體測試方法主要有非漸增測試法和漸增測試法兩種。其中漸增測試法適用于模塊間數(shù)據(jù)流多、可以單獨(dú)測試各個模塊到測試多的模塊的情況。由于系統(tǒng)各部分之間有密切的關(guān)系,所以選擇漸增測試法作為測試的方法。
         測試時(shí)首先對各個模塊的功能進(jìn)行測試,對照需求分析逐個測試系統(tǒng)的功能;然后對照數(shù)據(jù)庫的內(nèi)容察看各個查詢功能反饋的結(jié)果是否正確;最后整體運(yùn)行系統(tǒng),測試各個模塊之間的銜接是否會對系統(tǒng)的整體性能發(fā)生影響。為了測試程序的健壯性,還可以在測試過程中故意輸入一些錯誤的數(shù)據(jù),保證系統(tǒng)能夠自行處理這些錯誤,使得系統(tǒng)在日常的使用中不會由于工作失誤而無法運(yùn)行。

        測試小結(jié)
        在測試過程中,確實(shí)發(fā)現(xiàn)了很多的錯誤。一部分因?yàn)殚_發(fā)環(huán)境與實(shí)際使用環(huán)境不同產(chǎn)生的,比如說圖片的效果不對,或者控件的位置出現(xiàn)偏移等等;還有數(shù)據(jù)庫的連接問題,在不同的計(jì)算機(jī)上因?yàn)橛?jì)算機(jī)名的不同導(dǎo)致無法連接數(shù)據(jù)庫,這些問題通過現(xiàn)場的調(diào)試基本得到了解決。
        使用面向?qū)ο蟮拈_發(fā)工具進(jìn)行系統(tǒng)開發(fā)后,由于其獨(dú)有的特點(diǎn),所以調(diào)試時(shí)與傳統(tǒng)的程序開發(fā)語言并不完全相同,就本次開發(fā)過程中使用的Microsoft Visual Studio 2005來說,例如:在Microsoft Visual Studio 2005的定義當(dāng)中,面向?qū)ο蟮脑O(shè)計(jì)方法使得很多模塊的變量封裝起來,由此,對象的變量常常是不可見的,定義全局變量一定要在窗體之外的公用模塊中,而且要定義為公用。
        另一部分錯誤卻出乎意料,比如說有些控件數(shù)組的初始化問題。因?yàn)橐篮芏嗲闆r下程序的錯誤是連鎖性的,一個語句錯誤,其后相關(guān)語句也跟著出錯,所以找出錯誤源是很重要,在程序中設(shè)置斷點(diǎn)或在調(diào)試模式下執(zhí)行程序,可以快速發(fā)現(xiàn)和糾正錯誤,把無法初始化的控件元素單獨(dú)初始化后,問題可以得到解決。
        經(jīng)過測試的過程,認(rèn)識到自己在程序的編寫和思路方面都存在一定的問題,相信經(jīng)過不斷的學(xué)習(xí)和經(jīng)驗(yàn)積累,可以實(shí)現(xiàn)較大的改觀。

        參考文獻(xiàn)
        張忠國. Visual C#中隨機(jī)數(shù)使用實(shí)例
        關(guān)于紅葉二級電站生產(chǎn)管理系統(tǒng)開發(fā)要求. 紅葉二級電站生產(chǎn)管理系統(tǒng) 2008
        配網(wǎng)管理系統(tǒng)---需求分析說明書. 紅葉二級電站生產(chǎn)管理系統(tǒng) 2008
        商小千. 燕山大學(xué)里仁學(xué)院“兩課”社會調(diào)查報(bào)告 2006
        白  春. POS系統(tǒng)在零售行業(yè)的應(yīng)用  2005

        c.SetVolume(Convert.ToUInt16(trackBar1.Value));
                                    svc.SetRate(2);
                                    svc.Voice = svc.GetVoices(string.Empty, string.Empty).Item(3);
                                }
                                catch
                                {
                                    MessageBox.Show("語音庫不存在,請安裝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();
                }
        //用于語音的朗讀
        mythread = new Thread(Voice);
                                mythread.Start();


        “缺席”按鍵主要程序
        “缺席”按鍵主要程序和“開始”類似(略)。只是BindToView(0, i, int.Parse(time.Text) + 2)函數(shù)輸入為0。
        2.1 操作流程

        (注:如沒有安裝Microsoft Speech SDK 5.1和Microsoft Speech SDK 5.1 Language Pack的計(jì)算機(jī)則會提示:“語音庫不存在,請安裝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)行無聲或語音點(diǎn)名。并向數(shù)據(jù)庫記錄下點(diǎn)名記錄。主要工作流程見下圖:

        1.2界面設(shè)計(jì)
           點(diǎn)擊tabControl1上的部分點(diǎn)名選項(xiàng)卡,這時(shí)出現(xiàn)一個空白界面。然后向此界面上分別添加八個button按鈕、一個checkBox、trackBar、兩個comboBox、兩個dataGridView和六個Label。再給上述控件設(shè)定相應(yīng)的參數(shù),具體參數(shù)見下表:
        類型 Name Text
        button openfile_1 打開
        button back_1 上一個
        Button next_1 下一個
        Button appeare_1 開始
        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個點(diǎn)名次數(shù)。例如:1,2,3...。
        向percent的Itmes屬性裝入百分比。例如:10%、20%、30%、40%、50%、60%、70%、80%再對trackBar2的maximum和minmum賦值分別為100和0。)
        這樣部分抽點(diǎn)功能模塊的界面就設(shè)計(jì)好了,如圖所示:


        1.3主要程序說明
        1 基本函數(shù)
        //創(chuàng)建到excel數(shù)據(jù)庫的連接(同上,略)
        //返回DataAdapter(同上,略)
        //將數(shù)據(jù)裝入到DataSet里面(同上,略)
        //聲明一個類,確定更改字段名。用于對數(shù)據(jù)的的修改添加。(同上,略)
        //用于修改數(shù)據(jù)庫內(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ī)的抽出一部分人來生成一個隨機(jī)點(diǎn)名名單,然后對其進(jìn)行點(diǎn)名。
        隨機(jī)抽點(diǎn)子模塊主要利用一個隨機(jī)函數(shù)來對DataSet數(shù)據(jù)集里面的學(xué)生所在行進(jìn)行隨機(jī)抽點(diǎn)。在DataSet數(shù)據(jù)集里面的數(shù)據(jù)是以二維表方式存放的,在這個二維表里面每一行代表一個學(xué)生及其出勤記錄。而行號就是確定學(xué)生姓名的關(guān)鍵字了。我的做法是首先得到總行數(shù)row,確定抽點(diǎn)人數(shù)比例用這個比例去乘以row得出抽點(diǎn)人數(shù)nummen,然后再從0-row中隨即抽取nummen個不相同的數(shù)字存放在數(shù)組arrNum中。這樣就確定了抽點(diǎn)名單了,再將名單顯是在dataGridView3里。點(diǎn)名時(shí)就只對arrNum數(shù)組里相對應(yīng)行號的學(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);//遞歸:如果取出來的數(shù)字和已取得的數(shù)字有重復(fù)就重新隨機(jī)獲取。
                        }
                        n++;
                    }
                    return tmp;
                }

        3.2.2.2 出勤抽點(diǎn)子模塊
          出勤抽點(diǎn)子模塊要做到的功能主要是根據(jù)學(xué)生每個人的歷史出勤情況有針對性的按比例生成點(diǎn)名名單。也就是缺勤次數(shù)越多的學(xué)生被加入這個點(diǎn)名名單的幾率越大。
        出勤抽點(diǎn)子模塊主要是利用兩個數(shù)組和一個隨機(jī)函數(shù)做到的。首先,獲取DataSet內(nèi)的點(diǎn)名名單的行數(shù)row,然后根據(jù)選取的抽點(diǎn)人數(shù)百分比得出抽點(diǎn)人數(shù)nummen。將0-row行學(xué)生的行號裝入數(shù)組aa。之后對整個DataSet數(shù)據(jù)集里裝的每個學(xué)生的出勤情況進(jìn)行遍歷,如有缺勤記錄則向aa數(shù)組繼續(xù)裝入一次相應(yīng)的行號(即同一個人出現(xiàn)幾次缺勤就裝幾次他的行號進(jìn)去增加被抽中的幾率)。在遍歷數(shù)據(jù)的同時(shí)記下所有人總的缺勤次數(shù)z。然后利用getRandomNum函數(shù)從0-row+z中隨機(jī)取出nummen個不相同的數(shù)字存入arrNum,F(xiàn)在就可以根據(jù)arrNum內(nèi)存的數(shù)據(jù)確定aa的相應(yīng)行號,通過aa又可以確定DataSet數(shù)據(jù)集里面裝得學(xué)生名單的行號了。實(shí)際上arrNum數(shù)組里面裝得就是生成的出勤名單了。
        流程示意圖:


        主要相應(yīng)函數(shù):
                       將將0-row行學(xué)生的行號和缺勤記錄的行號裝入數(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);//遞歸:如果取出來的數(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)識的學(xué)生,使每個學(xué)生都有被抽到的機(jī)會。本功能模塊主要實(shí)現(xiàn)課堂教學(xué)過程中任課教師進(jìn)行的答題抽點(diǎn)功能,同時(shí)還提供小型浮動窗口置頂顯示的功能方便教學(xué)時(shí)在PowerPoint、Word和其他一些演示功能的界面上進(jìn)行抽點(diǎn),這樣就不會影響教學(xué)。
        主要工作流程見下圖:

         

        1.2 界面設(shè)計(jì)
            點(diǎn)擊tabControl1上的答題點(diǎn)名選項(xiàng)卡,這時(shí)出現(xiàn)一個空白界面。在界面上添加一個button按鈕和一個Label。再給上述控件設(shè)定相應(yīng)的參數(shù),具體參數(shù)見下表:
        類型 Name Text
        Label Label8 進(jìn)入課堂答題點(diǎn)名系統(tǒng)!
        button Button1 進(jìn)   入
        這樣答題點(diǎn)名功能模塊的部分界面就設(shè)計(jì)好了,如圖所示:


             現(xiàn)在開始設(shè)計(jì)答題點(diǎn)名窗體首先在課堂點(diǎn)名解決方案中添加一個窗體命名為que。然后向窗體上添加五個button、一個checkBox和三個label。再給上述控件設(shè)定相應(yīng)的參數(shù),具體參數(shù)見下表:
        類型 Name Text
        button openfile_3 選擇名單
        button Random_1 點(diǎn)名
        button Button1 關(guān)閉
        button Button2 顯示置頂
        button Button3 重讀
        checkBox checkBox1 語音
        label Label1 請
        label Label2 答題!
        label Label3 
        這樣答題點(diǎn)名功能模塊的界面就設(shè)計(jì)好了,如圖所示:

        1.3主要程序說明
        主窗體main部分:
           本段代碼主要用來進(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部分:
         本窗體主要用來進(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)文章:

        初一英語課堂幾種行之有效的游戲03-07

        大專軟件技術(shù)專業(yè)開題報(bào)告怎么寫(軟件技術(shù)開題報(bào)告范文)07-19

        小學(xué)英語高效課堂論文08-10

        游戲軟件開發(fā)VC++05-13

        打造高效物理課堂的論文11-02

        軟件工程畢業(yè)論文開題報(bào)告07-01

        卓越計(jì)劃下軟件技術(shù)專業(yè)教改08-05

        軟件工程的歷史與發(fā)展趨勢論文04-26

        中小軟件企業(yè)項(xiàng)目管理如何做08-28

        課堂教學(xué)論文參考文獻(xiàn)04-15

        国产高潮无套免费视频_久久九九兔免费精品6_99精品热6080YY久久_国产91久久久久久无码

        1. <tt id="5hhch"><source id="5hhch"></source></tt>
          1. <xmp id="5hhch"></xmp>

        2. <xmp id="5hhch"><rt id="5hhch"></rt></xmp>

          <rp id="5hhch"></rp>
              <dfn id="5hhch"></dfn>