基于VC開發(fā)與設(shè)計(jì)考試系統(tǒng)_第1頁
基于VC開發(fā)與設(shè)計(jì)考試系統(tǒng)_第2頁
基于VC開發(fā)與設(shè)計(jì)考試系統(tǒng)_第3頁
基于VC開發(fā)與設(shè)計(jì)考試系統(tǒng)_第4頁
基于VC開發(fā)與設(shè)計(jì)考試系統(tǒng)_第5頁
已閱讀5頁,還剩57頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

PAGE授人以漁 能力為本畢業(yè)設(shè)計(jì)(論文)基于VC開發(fā)與設(shè)計(jì)考試系統(tǒng)摘要隨著社會(huì)的發(fā)展,考試要求、類型和規(guī)模的不斷變化,普通的手工閱卷已無法滿足考試形式和內(nèi)容日益復(fù)雜多樣的需求。如何更好的實(shí)現(xiàn)公平公正,充分發(fā)揮考試的作用,使之真正成為選拔錄用人才的工具,這個(gè)問題已經(jīng)成為社會(huì)關(guān)注的焦點(diǎn)。隨著國家對創(chuàng)新型、高素質(zhì)人才需求的增加,對考生實(shí)踐能力和創(chuàng)新意識(shí)進(jìn)行考察的發(fā)散思維和主觀性試題在教育考試中所占比重越來越多,這就給評閱工作的公平、公正性提出了新的挑戰(zhàn),傳統(tǒng)手工閱卷諸多弊端逐漸顯現(xiàn),如何更好的控制閱卷誤差成為急待解決的問題。隨著計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)、信息處理技術(shù)以及計(jì)算機(jī)的普及,計(jì)算機(jī)考試系統(tǒng)應(yīng)運(yùn)而生。計(jì)算機(jī)考試系統(tǒng)的出現(xiàn)可以說是我國考試領(lǐng)域的重大變革,近年來高考、中考、全國英語等級考試、公務(wù)員考試等大型考試中考試系統(tǒng)備受關(guān)注。本論文針對班級考試開發(fā)設(shè)計(jì)了一個(gè)學(xué)校信息管理系統(tǒng)的一個(gè)子系統(tǒng)——班級考試系統(tǒng)。經(jīng)過對多種主流數(shù)據(jù)庫管理系統(tǒng)進(jìn)行比較分析之后,選擇OfficeAccess作為數(shù)據(jù)庫管理系統(tǒng),使用VC++6.0作為開發(fā)平臺(tái),MFC類庫輔助。通過計(jì)算機(jī)對信息的管理簡化了教師對試卷的管理過程,優(yōu)化了試卷的管理。首先對考試系統(tǒng)進(jìn)行簡單地緒論和定義,隨后對考試系統(tǒng)的可行性進(jìn)行了多方面的研究,并從需求分析下手,對考試系統(tǒng)粗略的分析,構(gòu)建起考試系統(tǒng)的基本結(jié)構(gòu),并對系統(tǒng)架構(gòu)和功能架構(gòu)進(jìn)行設(shè)計(jì)。在總體設(shè)計(jì)中劃分功能模塊,并對系統(tǒng)的功能模塊進(jìn)行描述,對各個(gè)模塊的設(shè)計(jì)與實(shí)現(xiàn)進(jìn)行闡述,列舉了一些關(guān)鍵代碼幫助理解,并對系統(tǒng)界面進(jìn)行了人性化的設(shè)計(jì)。最后對本次開發(fā)和研究進(jìn)行了總結(jié)和展望。關(guān)鍵詞:VC++;Access;MFC;考試系統(tǒng)

目錄第一章緒論 11.1考試系統(tǒng)的定義 11.2考試系統(tǒng)的特點(diǎn) 1第二章需求分析 32.1功能需求 32.2可行性分析 32.3開發(fā)及運(yùn)行環(huán)境 42.3.1硬件環(huán)境 42.3.2軟件環(huán)境 42.3.3開發(fā)工具及其技術(shù)的選擇 52.4開發(fā)系統(tǒng)的應(yīng)用技術(shù) 62.4.1Access數(shù)據(jù)庫的介紹及其優(yōu)缺點(diǎn) 62.4.2MFC的介紹及其優(yōu)缺點(diǎn) 7第三章系統(tǒng)總體設(shè)計(jì) 93.1功能模塊設(shè)計(jì) 93.1.1學(xué)生考試子模塊圖 93.1.2教師管理子模塊圖 103.2系統(tǒng)流程圖 103.3用例圖 113.3.1系統(tǒng)總用例圖 113.3.2學(xué)生考試子模塊用例圖 113.3.3教師管理子模塊用例圖 12第四章數(shù)據(jù)庫設(shè)計(jì) 134.1E-R分析 134.2數(shù)據(jù)庫的邏輯設(shè)計(jì) 144.3數(shù)據(jù)庫的生成 15第五章系統(tǒng)實(shí)現(xiàn) 17結(jié)論 24致謝 25參考文獻(xiàn) 26附錄 27第一章緒論隨著家長對孩子教育方面的不斷重視,教育行業(yè)在人民心中的地位越來越重,老師們的負(fù)擔(dān)與壓力也越來越重。如何減輕老師的負(fù)擔(dān)及壓力,已經(jīng)成為廣大學(xué)校校長需要解決的頭號(hào)難題。在教育工作中,為學(xué)生考試出試卷和批改改卷是老師們最頭痛的,不僅消耗大量的時(shí)間,而且消耗大量的精力體力。因此,考試過程由人工操作轉(zhuǎn)向計(jì)算機(jī)操作是必然的結(jié)果。1.1考試系統(tǒng)的定義考試系統(tǒng)是以財(cái)政部印發(fā)的《從業(yè)資格考試大綱》為依據(jù)、以優(yōu)化的題庫資源為基礎(chǔ)、以現(xiàn)代信息技術(shù)為手段,通過隨機(jī)組合生成無紙化考試試卷進(jìn)行考試,并及時(shí)生成考試成績,集考試報(bào)名、試卷生成、上機(jī)考試、閱卷、成績生成等為一體的、多元化,新型的從業(yè)考試管理模式。計(jì)算機(jī)考試系統(tǒng)的出現(xiàn)可以說是我國考試領(lǐng)域的重大變革。1.2考試系統(tǒng)的特點(diǎn)傳統(tǒng)考試從出題、組卷、印刷,到試卷的分發(fā),答題、收卷,再到判卷,公布成績,統(tǒng)計(jì)分析考試結(jié)果整個(gè)過程都需要人工參與,周期長,工作量大,容易出錯(cuò),還要有適當(dāng)?shù)谋C芄ぷ?,使得整個(gè)學(xué)習(xí)考試成本較大。而考試系統(tǒng)相對于傳統(tǒng)考試擁有了很多優(yōu)勢:1.減少工作人員人工輸入分?jǐn)?shù)的環(huán)節(jié),減少過程中出現(xiàn)錯(cuò)誤的可能性,提高準(zhǔn)確性。2.減少紙質(zhì)試卷封裝加工環(huán)節(jié),節(jié)省費(fèi)用開支,減少出錯(cuò)機(jī)率。3.?dāng)?shù)據(jù)全部電子化,可以做到永久保存,管理也更加方便高效。4.具有評閱質(zhì)量監(jiān)控功能。由于所有考試信息保留在服務(wù)器,所以可以實(shí)時(shí)掌握閱卷質(zhì)量,如果出現(xiàn)偏差可以及時(shí)糾正。5.真正實(shí)現(xiàn)無干擾閱卷,盡量減小人為誤差,真正實(shí)現(xiàn)公平公正,這是傳統(tǒng)手工閱卷所無法比擬的。6.傳統(tǒng)手工閱卷中需要專人核對,而且需要搬用試卷,考試系統(tǒng)自動(dòng)分配,大大節(jié)省人力。7.?dāng)?shù)據(jù)信息方便深度挖掘,可以作為教學(xué)和決策依據(jù)。

第二章需求分析2.1功能需求查閱大量相關(guān)的文獻(xiàn)資料,對題目進(jìn)行了深入地研究。通過對班級考試和師生相關(guān)人物角色關(guān)系的調(diào)研,并對考試相關(guān)情況進(jìn)行了解,得出系統(tǒng)需具有以下功能:1.由于考試的需要和保密性,也為了便于管理,系統(tǒng)用戶具有不同的等級,即不同的權(quán)限。用戶按等級分為兩個(gè)等級:學(xué)生、教師。不同權(quán)限的用戶登錄后進(jìn)入系統(tǒng)的頁面也不同(系統(tǒng)的功能菜單不同)。其中學(xué)生只有對考試現(xiàn)場進(jìn)行操作,不能對試題管理做任何操作。2.從現(xiàn)有的考試模式來看,系統(tǒng)開發(fā)要具有兩大主要功能模塊:學(xué)生考試模塊和教師后臺(tái)管理模塊。3.學(xué)生考試模塊主要是對學(xué)生考試的處理,在這個(gè)功能模塊里主要是學(xué)生的考試功能,進(jìn)入時(shí)選擇考試科目,進(jìn)入后開始考試,考試時(shí)間設(shè)為1個(gè)小時(shí)。為了公平,每人每科只能考一次。4.教師后臺(tái)管理模塊根據(jù)不同需求對所需要的數(shù)據(jù)進(jìn)行分類管理統(tǒng)計(jì)分析,對于教師來說,所需要做的就是對考生所考的科目、試題和考試所的分?jǐn)?shù)進(jìn)行分類管理。根據(jù)要求設(shè)置不同的考試科目和考試題目,以便對學(xué)生的學(xué)習(xí)成績進(jìn)行考核,這些考生的考試數(shù)據(jù)對教師來說,能更好的了解學(xué)生學(xué)習(xí)的情況。對以后的教學(xué)有更好的幫助。增加、修改、刪除和查詢等數(shù)據(jù)操作是維護(hù)系統(tǒng)所必須的。2.2可行性分析本系統(tǒng)的開發(fā)宗旨,以及總體任務(wù)就是要實(shí)現(xiàn)考試的自動(dòng)化﹑規(guī)范化、系統(tǒng)化、科學(xué)化和人性化。通過對論文的調(diào)查與分析,復(fù)查了系統(tǒng)的規(guī)模和目標(biāo),所以為了能夠?qū)崿F(xiàn)編制這個(gè)軟件所設(shè)定的目標(biāo),在程序的開發(fā)前的可行性析是有必要的。本章對開發(fā)該系統(tǒng)的可行性從以下幾個(gè)方面進(jìn)行了分析。1.社會(huì)可行性:隨著國內(nèi)外軟件開發(fā)的日益發(fā)展壯大,各種中小企事業(yè)單位已具備獨(dú)立開發(fā)各種類型的軟件的能力,能夠滿足不同行業(yè)的特別的需求。目前很多的學(xué)校在考試的管理運(yùn)行中都采用科學(xué)的信息系統(tǒng)管理方法加以統(tǒng)一管理,運(yùn)用科學(xué)的管理方法可以使考試的投入的相對減少而獲得更加可觀的考試效果。這是沒個(gè)學(xué)校都愿意的,因此,考試系統(tǒng)的開發(fā)是可行的。2.技術(shù)可行性:這個(gè)系統(tǒng)盡管其在組織關(guān)系上存在著很大的復(fù)雜性,繁瑣性,但是就整個(gè)系統(tǒng)的技術(shù)構(gòu)成上來看,它還是屬于一個(gè)數(shù)據(jù)庫應(yīng)用類的系統(tǒng)。其基本操作還是對存在數(shù)據(jù)庫進(jìn)行添加、刪除、查找、編輯等。所以就單純的數(shù)據(jù)庫應(yīng)用來看,不存在太大的技術(shù)問題。該系統(tǒng)初步的設(shè)想是運(yùn)用C語言開發(fā)的,采用B/S模式,在開發(fā)中不會(huì)存在技術(shù)的問題,所以在技術(shù)上是可行的,能夠?qū)崿F(xiàn)這個(gè)系統(tǒng)。3.經(jīng)濟(jì)可行性:開發(fā)本系統(tǒng)的成本是很低的,能夠滿足經(jīng)濟(jì)要求。根據(jù)可行性研究的結(jié)果,認(rèn)為可以開發(fā)這個(gè)系統(tǒng)。2.3開發(fā)及運(yùn)行環(huán)境2.3.1可以根據(jù)班級的大小選擇合適的硬件的配置,如表2-1所示表2-1考試系統(tǒng)的硬件選擇用戶(人)并發(fā)訪問數(shù)據(jù)穩(wěn)定性維護(hù)性備選服務(wù)器小型班級(10-30)20-60(條/s)低差CPU/256M內(nèi)存/256M磁盤/中型班級(30-50)60-800(條/s)中一般CPU/512M內(nèi)存/512M磁盤/100G大型班級(50-100)800-1600(條/s)高良CPU/1G內(nèi)存/1G磁盤/300G超大型班級(>100)>1600(條/s)極高優(yōu)CPU/2G內(nèi)存/2G磁盤/以上這些硬件的配置不是絕對的,這些數(shù)據(jù)只是參考數(shù)據(jù),具體的配置還要根據(jù)用戶的需求來選擇,本人由于設(shè)備有限選用PentiumCPU/1G內(nèi)存/1G磁盤/300GB個(gè)人PC。2.3.2軟件環(huán)境軟件配置主要包括操作系統(tǒng)、數(shù)據(jù)庫和開發(fā)工具及其技術(shù)的選擇。1.操作系統(tǒng)的選擇服務(wù)器操作系統(tǒng)的選擇,根據(jù)用戶量的大小選擇不同的操作系統(tǒng),一般是選擇用戶比較熟悉的如Windows2000﹑WindowsXPProfessional或者Windows2000Server操作系統(tǒng)。而UNIX﹑Linux﹑WindowsNT操作復(fù)雜,界面對用戶來說很陌生。經(jīng)比較選擇WindowsXPProfessional操作系統(tǒng)。用戶操作系統(tǒng)的選擇,因?yàn)楸鞠到y(tǒng)對客戶機(jī)的要求非常的簡單,所有操作系統(tǒng)最好選擇我們大家都非常的熟悉的Windows操作系統(tǒng)如:Windows98、Windows2000、WindowsXP、Windows2000Server等都可以,本人選擇WindowsXP操作系統(tǒng)。2.?dāng)?shù)據(jù)庫的選擇可以根據(jù)數(shù)據(jù)的大小選擇不同的數(shù)據(jù)庫,如表2-2所示表2-2數(shù)據(jù)庫選擇用戶(人)數(shù)據(jù)量大小穩(wěn)定性維護(hù)性數(shù)據(jù)庫小型班級(10-30)小低差Mysql中型班級(30-50)一般中一般Mysql、SqlServer大型班級(50-100)大高良Access、SqlServer超大型班級(>100)極大極高優(yōu)Oracle上面列舉出來的數(shù)據(jù)庫配置也并不是絕對的。對于超大型班級的數(shù)據(jù)信息量是非常大的,要求數(shù)據(jù)庫的吞吐量和穩(wěn)定性較高,同時(shí)對維護(hù)性要求也很高,能夠在定時(shí)的較短時(shí)間內(nèi)恢復(fù)系統(tǒng)和數(shù)據(jù),這需要選擇更好的數(shù)據(jù)庫。但是對于一般的中小型班級,由于學(xué)生較少,數(shù)據(jù)信息量相對也比較小,為了節(jié)約成本和資金,可以選擇免費(fèi)的數(shù)據(jù)庫或者是較為便宜的數(shù)據(jù)庫,這要根據(jù)用戶的需求來確定。數(shù)據(jù)庫的選擇還要考慮與操作系統(tǒng)的配合,本人為了免去數(shù)據(jù)庫的開支,選擇的是Access數(shù)據(jù)庫。2.3.3系統(tǒng)開發(fā)使用VC++開發(fā)平臺(tái),MFC類庫輔助,采用Access數(shù)據(jù)庫,在Windows平臺(tái)上運(yùn)行,它有一個(gè)很友好和人性化的圖形用戶界面,有很好的可擴(kuò)展性,使用非常的方便簡單,其優(yōu)勢很明顯。2.4開發(fā)系統(tǒng)的應(yīng)用技術(shù)2.4.11.基本介紹MicrosoftOfficeAccess(前名MicrosoftAccess)是由微軟發(fā)布的關(guān)聯(lián)式數(shù)據(jù)庫管理系統(tǒng)。它結(jié)合了MicrosoftJetDatabaseEngine和圖形用戶界面兩項(xiàng)特點(diǎn),是MicrosoftOffice的成員之一。Access能夠存取Access/Jet、MicrosoftSQLServer、Oracle(甲骨文軟件公司),或者任何ODBC兼容數(shù)據(jù)庫內(nèi)的資料。熟練的軟件設(shè)計(jì)師和資料分析師利用它來開發(fā)應(yīng)用軟件,而一些不熟練的程序員和非程序員的"進(jìn)階用戶"則能使用它來開發(fā)簡單的應(yīng)用軟件。雖然它支援部份面向?qū)ο螅∣O)技術(shù),但是未能成為一種完整的面向?qū)ο箝_發(fā)工具。

這個(gè)軟件能夠有效地處理大量記錄但是測試顯示在某些情況下會(huì)導(dǎo)致數(shù)據(jù)損毀.比如說,大小超過700MB的文件常會(huì)出問題。(值得注意的是在1.0版廣泛應(yīng)用的時(shí)候大多數(shù)硬盤是小于700MB的。)軟件的使用指南指出過時(shí)的設(shè)備驅(qū)動(dòng)和錯(cuò)誤的配置可能回導(dǎo)致數(shù)據(jù)丟失。與一般的CS關(guān)系型數(shù)據(jù)庫管理不同,Access不執(zhí)行數(shù)據(jù)庫觸發(fā),預(yù)存程序或交互式登錄操作。Access2010包括了嵌入ACE數(shù)據(jù)引擎的表級觸發(fā)和預(yù)存程序,因此,客戶-服務(wù)器數(shù)據(jù)庫系統(tǒng)對于Access2010就不是必需的了。在Access2010中,表格,查詢,圖表,報(bào)表和宏現(xiàn)在基于網(wǎng)絡(luò)的應(yīng)用上能夠進(jìn)行分別開發(fā)。2.Access數(shù)據(jù)庫的的優(yōu)點(diǎn)

(1)存儲(chǔ)方式單一

Access管理的對象有表、查詢、窗體、報(bào)表、頁、宏和模塊,以上對象都存放在后綴為(.mdb)的數(shù)據(jù)庫文件種,便于用戶的操作和管理。

(2)面向?qū)ο?/p>

Access是一個(gè)面向?qū)ο蟮拈_發(fā)工具,利用面向?qū)ο蟮姆绞綄?shù)據(jù)庫系統(tǒng)中的各種功能對象化,將數(shù)據(jù)庫管理的各種功能封裝在各類對象中。它將一個(gè)應(yīng)用系統(tǒng)當(dāng)作是由一系列對象組成的,對每個(gè)對象它都定義一組方法和屬性,以定義該對象的行為和外國,用戶還可以按需要給對象擴(kuò)展方法和屬性。通過對象的方法、屬性完成數(shù)據(jù)庫的操作和管理,極大地簡化了用戶的開發(fā)工作。同時(shí),這種基于面向?qū)ο蟮拈_發(fā)方式,使得開發(fā)應(yīng)用程序更為簡便。

(3)界面友好、易操作

Access是一個(gè)可視化工具,是風(fēng)格與Windows完全一樣,用戶想要生成對象并應(yīng)用,只要使用鼠標(biāo)進(jìn)行拖放即可,非常直觀方便。系統(tǒng)還提供了表生成器、查詢生成器、報(bào)表設(shè)計(jì)器以及數(shù)據(jù)庫向?qū)А⒈硐驅(qū)?、查詢向?qū)?、窗體向?qū)?、?bào)表向?qū)У裙ぞ撸沟貌僮骱啽?,容易使用和掌握?/p>

(4)集成環(huán)境、處理多種數(shù)據(jù)信息

Access基于Windows操作系統(tǒng)下的集成開發(fā)環(huán)境,該環(huán)境集成了各種向?qū)Ш蜕善鞴ぞ?,極大地提高了開發(fā)人員的工作效率,使得建立數(shù)據(jù)庫、創(chuàng)建表、設(shè)計(jì)用戶界面、設(shè)計(jì)數(shù)據(jù)查詢、報(bào)表打印等可以方便有序地進(jìn)行。

(5)Access支持ODBC(開發(fā)數(shù)據(jù)庫互連,OpenDataBaseConnectivity),利用Access強(qiáng)大的DDE(動(dòng)態(tài)數(shù)據(jù)交換)和OLE(對象的聯(lián)接和嵌入)特性,可以在一個(gè)數(shù)據(jù)表中嵌入位圖、聲音、Excel表格、Word文檔,還可以建立動(dòng)態(tài)的數(shù)據(jù)庫報(bào)表和窗體等。Access還可以將程序應(yīng)用于網(wǎng)絡(luò),并與網(wǎng)絡(luò)上的動(dòng)態(tài)數(shù)據(jù)相聯(lián)接。利用數(shù)據(jù)庫訪問頁對象生成HTML文件,輕松構(gòu)建Internet/Intranet的應(yīng)用。

3.Access數(shù)據(jù)庫的缺點(diǎn)

Access是小型數(shù)據(jù)庫,既然是小型就有他根本的局限性,以下幾種情況下數(shù)據(jù)庫基本上會(huì)吃不消:

(1)數(shù)據(jù)庫過大,一般Access數(shù)據(jù)庫達(dá)到50M左右的時(shí)候性能會(huì)急劇下降。

(2)網(wǎng)站訪問頻繁,經(jīng)常達(dá)到100人左右的在線。

(3)記錄數(shù)過多,一般記錄數(shù)達(dá)到10萬條左右的時(shí)候性能就會(huì)急劇下降。

2.4.2MFC的介紹及其優(yōu)缺點(diǎn)1.MFC的介紹微軟基礎(chǔ)類(MicrosoftFoundationClasses),同VCL類似,是一種應(yīng)用程序框架,隨微軟VisualC++開發(fā)工具發(fā)布。目前最新版本為10.0(截止2011年3月),并且發(fā)布了中文版。該類庫提供一組通用的可重用的類庫供開發(fā)人員使用,大部分類均從CObject直接或間接派生,只有少部分類例外。MFC應(yīng)用程序的總體結(jié)構(gòu)通常由開發(fā)人員從MFC類派生的幾個(gè)類和一個(gè)CWinApp類對象(應(yīng)用程序?qū)ο螅┙M成。MFC提供了MFCAppWizard自動(dòng)生成框架。Windows應(yīng)用程序中,MFC的主包含文件為"Afxwin。h"。此外MFC的部分類為MFC/ATL通用,可以在Win32應(yīng)用程序中單獨(dú)包含并使用這些類。由于它的易用性,初學(xué)者常誤認(rèn)為VC++開發(fā)必須使用MFC,這種想法是錯(cuò)誤的。作為ApplicationFramework,MFC的使用只能提高某些情況下的開發(fā)效率,只起到輔助作用,而不能替代整個(gè)Win32程序設(shè)計(jì)。2.MFC的優(yōu)點(diǎn)隨著編程語言的推陳出新,MFC一些缺點(diǎn)日益突出。最重要的就是入門門檻相對其他語言要高,而且同樣完成一個(gè)任務(wù)代碼量相對較多。而原有的優(yōu)勢如運(yùn)行速度快等,也因?yàn)槠渌幊陶Z言的日臻完善和個(gè)人電腦的運(yùn)算速度增加而顯得不那么突出。MFC似乎江河日下。但是MFC真的沒有任何優(yōu)勢了嗎?不是,面對底層程序,它能很輕松的與WindowsAPI或驅(qū)動(dòng)程序結(jié)合,就是在自己的代碼中直接使用API函數(shù),而API和驅(qū)動(dòng)程序的資料都是以C語言為基礎(chǔ)的,這使得VC程序員能夠更輕松的使用WindowsAPI。這樣造成了一個(gè)很有意思的現(xiàn)象,即入門時(shí)VC程序員要付出更多的努力來學(xué)習(xí),但是一旦掌握后,開發(fā)其他領(lǐng)域的程序或使用第三方軟件時(shí),如工業(yè)控制類的程序,由于底層的程序都是用C語言編寫,反倒是VC程序員能夠更快的掌握該領(lǐng)域的編程技術(shù)。而很多其他的編程語言甚至找不到相關(guān)的資料。這就說明VC(MFC)實(shí)際上是一種入門困難,但是擴(kuò)展學(xué)習(xí)卻很輕松的語言框架。如果局限于某一領(lǐng)域的話VC毫無優(yōu)勢可言,但是如果開發(fā)一個(gè)新的領(lǐng)域的應(yīng)用程序或者該程序涉及多個(gè)應(yīng)用領(lǐng)域的話,可減少重復(fù)學(xué)習(xí)的頻率和難度,VC(MFC)的優(yōu)勢會(huì)立刻顯現(xiàn)出來。

第三章系統(tǒng)總體設(shè)計(jì)3.1功能模塊設(shè)計(jì)功能模塊設(shè)計(jì)在整個(gè)系統(tǒng)設(shè)計(jì)當(dāng)中站有非常重要的地位,通過它可以對系統(tǒng)進(jìn)行詳細(xì)的設(shè)計(jì)。如圖3-1是系統(tǒng)模塊圖??荚囅到y(tǒng)學(xué)生考試模塊考試系統(tǒng)學(xué)生考試模塊教師管理模塊圖3-1系統(tǒng)模塊圖3.1.1學(xué)生考試子模塊圖學(xué)生考試模塊學(xué)生考試模塊科目選擇試卷考試圖3-2學(xué)生考試模塊圖3.1.2教師管理子模塊圖教師管理模塊試題管理學(xué)生成績查詢數(shù)據(jù)庫管理增加科目刪除科目新增試題修改試題教師管理模塊試題管理學(xué)生成績查詢數(shù)據(jù)庫管理增加科目刪除科目新增試題修改試題刪除試題數(shù)據(jù)庫備份數(shù)據(jù)庫還原數(shù)據(jù)庫初始化圖3-3教師管理模塊圖3.2系統(tǒng)流程圖 系統(tǒng)流程圖又叫事務(wù)流程圖,是在計(jì)算機(jī)事務(wù)處理應(yīng)用進(jìn)行系統(tǒng)分析時(shí)常用的一種描述方法(另一個(gè)是數(shù)據(jù)流圖),它描述了計(jì)算機(jī)事務(wù)處理中從數(shù)據(jù)輸入開始到獲得輸出為止,各個(gè)處理工序的邏輯過程。圖3-4系統(tǒng)流程圖3.3用例圖用例圖是簡單的形象的描述用戶對整個(gè)系統(tǒng)的操作,當(dāng)然不同權(quán)限的用戶擁有的用例關(guān)系也不同。3.3.1系統(tǒng)總用例圖系統(tǒng)用例圖如圖3-5所示,是用來形象的描述系統(tǒng)業(yè)務(wù)處理以及業(yè)務(wù)與業(yè)務(wù)之間的內(nèi)在關(guān)系。在整個(gè)系統(tǒng)的用例中,兩個(gè)不同權(quán)限的用戶,對應(yīng)他們的業(yè)務(wù)處理也是不同的,教師和學(xué)生擁有的權(quán)限是完全不同的,教師不對學(xué)生考試進(jìn)行任何干預(yù),學(xué)生不對試題、成績、數(shù)據(jù)庫做任何操作。學(xué)生學(xué)生教師科目選擇試卷考試登錄學(xué)生成績查詢數(shù)據(jù)庫管理試題管理試卷圖3-5系統(tǒng)總用例圖3.3.2學(xué)生考試子模塊用例圖學(xué)生考試用例圖如圖3-6所示,該用例圖有且僅有一個(gè)用戶,也就是只有學(xué)生這一用戶,該用戶僅對考試科目進(jìn)行選擇并對試題作答,此外不能做其他操作。學(xué)生學(xué)生科目選擇試卷考試試卷圖3-6學(xué)生管理模塊用例圖3.3.3教師管理子模塊用例圖教師管理管理用例圖如圖3-7所示,該用例圖描述了教師在后臺(tái)對學(xué)生信息的管理的具體情況和流程。教師教師學(xué)生成績查詢數(shù)據(jù)庫管理試題管理刪除科目新增試題修改試題刪除試題增加科目圖3-7教師管理模塊用例圖

第四章數(shù)據(jù)庫設(shè)計(jì)4.1E-R分析在整個(gè)系統(tǒng)中,所存在的實(shí)體有試卷實(shí)體、學(xué)生實(shí)體和教師實(shí)體。對考試系統(tǒng)的E-R分析,從大的方面設(shè)計(jì)出各個(gè)實(shí)體之間的關(guān)系,再在這個(gè)關(guān)系的基礎(chǔ)上進(jìn)行細(xì)化。學(xué)生學(xué)生登錄名姓名身份證號(hào)年齡性別電話考試科目考試成績編號(hào)圖4-1學(xué)生實(shí)體圖教師教師登錄名姓名身份證號(hào)年齡性別電話編號(hào)圖4-2教師實(shí)體圖圖4-3試卷實(shí)體圖試卷科目名試卷科目名考試題目所有答案正確答案編號(hào)4.2數(shù)據(jù)庫的邏輯設(shè)計(jì)通過E-R圖的分析,本系統(tǒng)所要求的數(shù)據(jù)庫的框架已經(jīng)確定。下面實(shí)現(xiàn)數(shù)據(jù)庫的邏輯結(jié)構(gòu)即將數(shù)據(jù)庫的概念結(jié)構(gòu)轉(zhuǎn)化為access數(shù)據(jù)庫系統(tǒng)所支持的實(shí)際數(shù)據(jù)模型。數(shù)據(jù)庫由下面5個(gè)表組成,每個(gè)表格表示在數(shù)據(jù)庫中的一個(gè)表。各個(gè)表的詳細(xì)信息如下:注冊信息表register表4-1register字段名稱數(shù)據(jù)類型長度是否必填說明studentid數(shù)字長整型是用戶編號(hào)username文本20否用戶名password文本50否密碼question文本50否密碼提示問題answer文本50否答案name文本20否真實(shí)姓名age數(shù)字長整型否年齡sex文本50否性別phone數(shù)字長整型否聯(lián)系電話power文本50否用戶權(quán)限idcard文本50否身份證號(hào)login_date日期/時(shí)間否注冊日期考試情況表result表4-2result字段名稱數(shù)據(jù)類型長度是否必填說明starttime文本50否起始時(shí)間closetime文本50否截止時(shí)間subject文本50否考試科目totle數(shù)字長整型否學(xué)生成績studengtid數(shù)字長整型是學(xué)生編號(hào)科目表subject表4-3subject字段名稱數(shù)據(jù)類型長度是否必填說明subjectid數(shù)字長整型否科目IDsubjectname文本50否科目名稱試題表test表4-4text字段名稱數(shù)據(jù)類型長度是否必填說明testid數(shù)字長整型是試題IDquestion文本50否考試題目rightanswer文本50否正確答案totle數(shù)字長整型否題目分?jǐn)?shù)subject數(shù)字長整型否科目ID5.試題答案表testanswer表4-5testanswer字段名稱數(shù)據(jù)類型長度是否必填說明testid數(shù)字長整型否試題IDAnswerA文本50否A選項(xiàng)AnswerB文本50否B選項(xiàng)AnswerC文本50否C選項(xiàng)AnswerD文本50否D選項(xiàng)4.3數(shù)據(jù)庫的生成1.生成表register(注冊信息)圖4-4表register生成情況2.生成表result(考試情況)圖4-5表result生成情況3.生成表subject(科目)圖4-6表subject生成情況4.生成表test(試題)圖4-7表test生成情況5.生成表testanswer(試題答案)圖4-8表testanswer生成情況

第五章系統(tǒng)實(shí)現(xiàn)本系統(tǒng)采用VC++6.0軟件開發(fā),具有完整的應(yīng)用開發(fā)功能,同時(shí)支持多種關(guān)系數(shù)據(jù)庫管理系統(tǒng),采用面向?qū)ο蠹夹g(shù),圖形化的應(yīng)用開發(fā)環(huán)境,是數(shù)據(jù)庫的前端開發(fā)工具。以下是系統(tǒng)運(yùn)行情況。用戶的登錄界面:打開(ExamOnline.exe)文件后出現(xiàn)用戶登錄界面,如下圖所示:圖5-1用戶登錄界面2.用戶的注冊界面:登錄失敗后會(huì)提醒注冊或找回密碼,如下圖所示:圖5-2注冊提醒圖5-3密碼錯(cuò)誤提醒注冊提醒狀態(tài)下選擇”是(Y)”則會(huì)出現(xiàn)注冊界面,當(dāng)然在登陸界面選擇注冊也會(huì)出現(xiàn)注冊界面。如下圖所示:圖5-4注冊界面錯(cuò)誤提醒狀態(tài)下選”是(Y)”則會(huì)出現(xiàn)找回密碼界面。如下圖所示:圖5-5密碼找回界面3.學(xué)生選擇考試科目界面:學(xué)生登陸成功后就會(huì)進(jìn)入考試科目選擇,如下圖所示:圖5-6學(xué)生考試科目選擇界面

4.學(xué)生考試界面:學(xué)生選擇考試科目后則會(huì)進(jìn)行該科目的考試,如下圖所示:圖5-7學(xué)生考試界面

5.教師對試卷的操作界面:教師權(quán)限使用測試用戶名tsoft密碼123進(jìn)行登錄,登錄成功后則會(huì)直接進(jìn)入對試卷的操作界面,如下圖所示圖5-8試卷管理界面

6.教師對學(xué)生成績的操作界面:圖5-9學(xué)生成績管理界面

7.教師對數(shù)據(jù)庫的管理界面:圖5-10數(shù)據(jù)庫管理界面

結(jié)論在整個(gè)設(shè)計(jì)的過程中,我對VC6.0++和Access等內(nèi)容不僅從理論方面有了深入的學(xué)習(xí),而且將其實(shí)踐的過程融入到設(shè)計(jì)之中,這樣就使得理論知識(shí)與實(shí)際很好的結(jié)合在一起,讓我感受了軟件開發(fā)的整個(gè)過程。畢業(yè)設(shè)計(jì)不僅是對我在大學(xué)所學(xué)知識(shí)的一個(gè)綜合運(yùn)用,也是一次增長知識(shí)和經(jīng)驗(yàn)的好機(jī)會(huì),同時(shí)也使我學(xué)會(huì)了許多處理、解決問題的方法,大大提高了自己的動(dòng)手能力,為以后走上工作崗位打下了良好的基礎(chǔ)。由于本人是在校大學(xué)生,沒有參加過具體的商業(yè)項(xiàng)目,開發(fā)經(jīng)驗(yàn)不足,考慮事情的能力有限,在做論文的過程中撰寫代碼還存在一定的難度,所以開發(fā)出的系統(tǒng)軟件還不夠完善,功能實(shí)現(xiàn)的還不完全,保密性還不夠高,安全性還不夠好,雖然基本上實(shí)現(xiàn)了各個(gè)功能系統(tǒng)的實(shí)際應(yīng)用,但也有一定的限制。這都是我們以后在系統(tǒng)設(shè)計(jì)需要應(yīng)該重點(diǎn)注意和解決的問題。

致謝在論文完成之際,首先衷心地感謝張珍老師。在這幾個(gè)月的畢業(yè)設(shè)計(jì)中,張珍老師,給我的畢業(yè)設(shè)計(jì)提出了許多關(guān)鍵性的建議和指導(dǎo),讓我在設(shè)計(jì)過程中,避免了一些錯(cuò)誤,少走了一些彎路。更重要的是,在交流過程中,老師的一些創(chuàng)造性思維和方法,讓我受益無限。而且無論是在學(xué)術(shù)上,還是在思想上,張珍老師都給予了我很大的幫助和鼓勵(lì),使我順利的完成了畢業(yè)設(shè)計(jì)和畢業(yè)論文,在這再次向張珍老師您表示感謝。還要感謝三年來曾教過我的所有的老師們,是他們認(rèn)真的備課、嚴(yán)謹(jǐn)?shù)慕虒W(xué),讓我在大學(xué)三年的時(shí)間里學(xué)到了在以后的工作中強(qiáng)有力的理論知識(shí),為以后的工作奠定了良好的基礎(chǔ)。在畢業(yè)設(shè)計(jì)和論文寫作過程中,一些同學(xué)和朋友也給了我巨大的幫助和鼓勵(lì),在這也向他們表示感謝。再次感謝評委老師們辛勤的評閱工作!

參考文獻(xiàn)[1]張榮梅,梁曉林.VisualC++實(shí)用教程[M].冶金工業(yè)出版社,2004:90.[2]鄭阿奇.VisualC++實(shí)用教程(第2版)[M].電子工業(yè)出版社,2003:56.[3]孫鑫,余安萍.VC++深入詳解[M].電子工業(yè)出版社,2006:110. [4]陳清華等.VisualC++課程設(shè)計(jì)案例精選與編程指導(dǎo)[C].東南大學(xué)出版社, 2004:152.[5]嚴(yán)華峰等.VISUALC++課程設(shè)計(jì)案例精編(第二版)[A].中國水利水電出版社,2004:100.[6]周鳴揚(yáng).VISUALC++界面編程技術(shù)[M].北京希望電子,2003:30.[7]榮欽科技.VisualC++游戲編程基礎(chǔ)[M].電子工業(yè)出版社,2004:140.[8]羅偉堅(jiān).VisualC++經(jīng)典游戲程序設(shè)計(jì)[Z].人民郵電出版社,2006:15. [9]榮欽科技.VISUALC++游戲設(shè)計(jì)[M].北京科海電子出版社,2005:64.[10]侯俊杰著.深入淺出MFC(第2版)[EB/OL].華中科技大學(xué)出版社:76.[11]劉宗田/邢大紅/孫慧杰等譯.C++編程思想[J].BruceEckel著.機(jī)械工業(yè)出版社:198.[12]康博創(chuàng)作室譯.21天學(xué)通C++[M].JesseLiberty著.人民郵電出版社:68.

附錄以下是系統(tǒng)是實(shí)現(xiàn)各界面的關(guān)鍵代碼:1.實(shí)現(xiàn)用戶登錄界面的關(guān)鍵代碼:voidCLOGIN::OnButtonOk(){ UpdateData(); CStringstr; m_TypeList.GetLBText(m_TypeList.GetCurSel(),str); if(m_UserName.IsEmpty()) { AfxMessageBox("用戶名不能為空"); return; } if(m_UserPasswd.IsEmpty()) { AfxMessageBox("密碼不能為空"); return; } CStringsql="select*fromregisterwhereusername='"+m_UserName+"'and[password]='"+m_UserPasswd+"'andpower='"+str+"'"; try { _RecordsetPtrm_pRs; ADOConnm_AdoConn; m_AdoConn.OnInitADOConn(); m_pRs=m_AdoConn.GetRecordSet((_bstr_t)sql); if(m_pRs->adoEOF) { sql="select*fromregisterwhereusername='"+m_UserName+"'"; m_pRs=m_AdoConn.GetRecordSet((_bstr_t)sql); if(!m_pRs->adoEOF) { if(m_UserPasswd!=(char*)(_bstr_t)m_pRs->GetCollect("password")) { if(MessageBox("密碼錯(cuò)誤是否找回密碼?","提示",MB_YESNO)==IDYES) { CFinddlg; dlg.Name=m_UserName; CDialog::OnCancel(); dlg.DoModal(); } } else { if(str!=(char*)(_bstr_t)m_pRs->GetCollect("power")) { AfxMessageBox("權(quán)限錯(cuò)誤"); return; } } } else { if(MessageBox("用戶名不存在是否注冊","提示",MB_YESNO)==IDYES) { CDialog::OnCancel(); CRegisterdlg; dlg.m_UserName=m_UserName; dlg.DoModal(); } else CDialog::OnCancel(); } } else { if(str=="教職工") { CDialog::OnCancel(); CBackdlg; dlg.DoModal(); } else CDialog::OnOK(); } m_AdoConn.ExitConn(); } catch(...) { AfxMessageBox("操作失敗"); return; }}2.實(shí)現(xiàn)用戶的注冊界面的關(guān)鍵代碼:voidCRegister::OnReg(){ UpdateData(); if(m_UserName.IsEmpty()) { AfxMessageBox("請輸入用戶名"); return; } if(m_Passwd.IsEmpty()) { AfxMessageBox("請輸入密碼"); return; } if(m_Passwd!=m_PasswdRepeat) { AfxMessageBox("兩次輸入密碼不一致,請從新輸入"); return; } if(m_QuestionCombo.GetCurSel()==-1||m_QuestionCombo.GetCurSel()==0) { AfxMessageBox("請選擇密碼提示問題"); return; } if(m_Answer.IsEmpty()) { AfxMessageBox("請輸入提示問題答案"); return; } if(m_RealName.IsEmpty()) { AfxMessageBox("請輸入真實(shí)姓名"); return; } if(m_IDcard.GetLength()!=18) { AfxMessageBox("輸入身份證無效"); return; } else { intnum=0; charch; for(inti=0;i<17;i++) { ch=m_IDcard.GetAt(i); if(ch>47&&ch<58) num++; } if(i==17) { ch=m_IDcard.GetAt(i); if((ch>47&&ch<58)||(ch==88||ch==120)) num++; } if(num!=18) { AfxMessageBox("輸入身份證無效"); return; } else { CStringsyear=m_IDcard.Mid(6,4); intyear=atoi(syear); CStringsmonth=m_IDcard.Mid(10,2); intmonth=atoi(smonth); CStringsday=m_IDcard.Mid(12,2); intday=atoi(sday); BOOLleap; if(month<1||month>12) { AfxMessageBox("輸入身份證無效"); return; } switch(month) { case1: case3:case5:case7:case8:case10:case12: if(day<0||day>31) { AfxMessageBox("輸入身份證無效"); return; } break; case4: case6:case9:case11: if(day<0||day>30) { AfxMessageBox("輸入身份證無效"); return; } break; case2: if(year%4==0) { if(year%100!=0) leap=TRUE; elseif(year%400==0) leap=TRUE; else leap=FALSE; } else leap=FALSE; if(leap) if(day<0||day>29) { AfxMessageBox("輸入身份證無效"); return; } else if(day<0||day>28) { AfxMessageBox("輸入身份證無效"); return; } break; } } } CStringstr; m_QuestionCombo.GetLBText(m_QuestionCombo.GetCurSel(),str); CStringsex; if(radio==0) sex.Format(""); if(radio==1) sex.Format("男"); if(radio==2) sex.Format("女"); CTimetime; time=CTime::GetCurrentTime(); CStringnowtime=time.Format("%Y-%m-%d"); intid; try { m_AdoConn.OnInitADOConn(); CStringsql="select*fromregisterwhereusername='"+m_UserName+"'"; m_pRs=m_AdoConn.GetRecordSet((_bstr_t)sql); if(!m_pRs->adoEOF) { AfxMessageBox("用戶名已存在"); return; } else { sql.Format("selectstudentidfromregister"); m_pRs=m_AdoConn.GetRecordSet((_bstr_t)sql); if(m_pRs->adoEOF) id=1001; else { m_pRs->MoveLast(); id=atoi((_bstr_t)m_pRs->GetCollect("studentid")); id+=1; } sql.Format("insertintoregister(username,[password],question,answer,name,age,sex,phone,studentid,power,idcard,login_date)values('%s','%s','%s','%s','%s',%d,'%s',%d,%d,'學(xué)生','%s','%s')",m_UserName,m_Passwd,str,m_Answer,m_RealName,m_Age,sex,m_Phone,id,m_IDcard,nowtime); m_AdoConn.ExecuteSQL((_bstr_t)sql); m_AdoConn.ExitConn(); AfxMessageBox("注冊成功"); CDialog::OnCancel(); CLOGINdlg; dlg.DoModal(); } } catch(...) { AfxMessageBox("操作失敗"); return; } }voidCRegister::OnSexmale(){ radio=1; }voidCRegister::OnSexfemale(){ radio=2; }voidCRegister::OnCheckname(){ UpdateData(); _bstr_tsql="select*fromregisterwhereusername='"+m_UserName+"'"; try { m_AdoConn.OnInitADOConn(); m_pRs=m_AdoConn.GetRecordSet(sql); if(m_pRs->adoEOF) m_TiShiStatic.SetWindowText("用戶名可以使用"); else m_TiShiStatic.SetWindowText("用戶名已存在"); } catch(...) { AfxMessageBox("操作失敗"); return; } m_AdoConn.ExitConn(); }voidCRegister::OnChangeUsername(){ m_TiShiStatic.SetWindowText(""); }voidCRegister::OnReset(){ m_UserName=""; m_Passwd=""; m_PasswdRepeat=""; m_QuestionCombo.SetCurSel(0); m_Answer=""; m_RealName=""; m_Phone=0; m_Age=0; radio=0; UpdateData(FALSE);}BOOLCRegister::OnInitDialog(){ CDialog::OnInitDialog(); m_QuestionCombo.AddString("請選擇一個(gè)問題"); m_QuestionCombo.AddString("你的父親生日是哪天的?"); m_QuestionCombo.AddString("你的母親生日是哪天的?); m_QuestionCombo.AddString("你的女朋友生日是哪天的?"); m_QuestionCombo.AddString("你家養(yǎng)的貓叫什么?); m_QuestionCombo.AddString("你的車牌號(hào)后三位是什么?"); m_QuestionCombo.SetCurSel(0); returnTRUE;}3.實(shí)現(xiàn)學(xué)生登錄后選擇考試科目界面的關(guān)鍵代碼:voidCExamInfo::OnButtonOk(){ UpdateData(); if(m_SubjectCombo.GetCurSel()==-1) { AfxMessageBox("請選擇科目"); return; } intstudentid=theApp.studentid; m_SubjectCombo.GetLBText(m_SubjectCombo.GetCurSel(),Subject); m_AdoConn.OnInitADOConn(); CStringsql; sql.Format("select*fromresultwherestudentid=%dandSubject='%s'",studentid,Subject); m_pRs=m_AdoConn.GetRecordSet((_bstr_t)sql); if(m_pRs->adoEOF) { sql="select*fromsubjectwheresubjectname='"+Subject+"'"; m_pRs=m_AdoConn.GetRecordSet((_bstr_t)sql); Sid=atoi((char*)(_bstr_t)m_pRs->GetCollect("subjectid")); sql.Format("select*fromtestwheresubjectid=%dorderbytestid",Sid); m_pRs=m_AdoConn.GetRecordSet((_bstr_t)sql); Question=(char*)(_bstr_t)m_pRs->GetCollect("question"); CDialog::OnOK(); } else MessageBox("該考生已進(jìn)行過本科目的考試"); m_AdoConn.ExitConn(); }

4.實(shí)現(xiàn)學(xué)生考試界面的關(guān)鍵代碼:voidCExamOnlineDlg::OnNext()//下一題{ UpdateData(); CButton*m_checkA=(CButton*)GetDlgItem(IDC_RADIO_A); CButton*m_checkB=(CButton*)GetDlgItem(IDC_RADIO_B); CButton*m_checkC=(CButton*)GetDlgItem(IDC_RADIO_C); CButton*m_checkD=(CButton*)GetDlgItem(IDC_RADIO_D); CStringsql; CStringquestion,answer; m_Test.GetWindowText(question); CStringId; Id.Format("題號(hào):%d",testnum+1); m_AdoConn.OnInitADOConn(); sql.Format("select*fromtestwherequestion='%s'",question); m_pRs=m_AdoConn.GetRecordSet((_bstr_t)sql); CStringtestid=(char*)(_bstr_t)m_pRs->GetCollect("testid"); sql.Format("select*fromexamminginfowheretestnum=%d",testnum+1); m_pRs=m_AdoConn.GetRecordSet((_bstr_t)sql); if(m_pRs->adoEOF) { sql.Format("select*fromexamminginfowherequestion='%s'",question); m_pRs=m_AdoConn.GetRecordSet((_bstr_t)sql); if(m_pRs->adoEOF) { if(Answer!='A'&&Answer!='B'&&Answer!='C'&&Answer!='D') { AfxMessageBox("請選擇一個(gè)答案"); return; } SaveQuestion(); } sql.Format("select*fromexamminginfowheretestnum=%d",testnum); m_pRs=m_AdoConn.GetRecordSet((_bstr_t)sql); sql.Format("updateexamminginfosetanswer='%s'wheretestnum=%d",Answer,testnum); answer=(char*)(_bstr_t)m_pRs->GetCollect("answer"); if(answer!=Answer) m_AdoConn.ExecuteSQL((_bstr_t)sql); m_checkA->SetCheck(false); m_checkB->SetCheck(false); m_checkC->SetCheck(false); m_checkD->SetCheck(false); Answer='e'; inttid=atoi(testid); sql.Format("select*fromtestwheresubjectid=%dandtestid>%dorderbytestid",Sid,tid); m_pRs=m_AdoConn.GetRecordSet((_bstr_t)sql); if(m_pRs->adoEOF) { CheckAnswer(); m_AdoConn.ExitConn(); if(MessageBox("考試結(jié)束,是否交卷?","提示",MB_YESNO)==IDYES) { CDialog::OnCancel(); CTestResultdlg; dlg.TimeStr=TimeStr; dlg.DoModal(); } elsereturn; } else { question=(char*)(_bstr_t)m_pRs->GetCollect("question"); m_TestID.SetWindowText(Id); m_Test.SetWindowText(question); testnum++; PutAnswer(); } } else { sql.Format("select*fromexamminginfowheretestnum=%d",testnum); m_pRs=m_AdoConn.GetRecordSet((_bstr_t)sql); sql.Format("updateexamminginfosetanswer='%s'wheretestnum=%d",Answer,testnum); answer=(char*)(_bstr_t)m_pRs->GetCollect("answer"); if(answer!=Answer) m_AdoConn.ExecuteSQL((_bstr_t)sql); testnum++; sql.Format("select*fromexamminginfowheretestnum=%d",testnum); m_pRs=m_AdoConn.GetRecordSet((_bstr_t)sql); question=(char*)(_bstr_t)m_pRs->GetCollect("question"); answer=(char*)(_bstr_t)m_pRs->GetCollect("answer"); m_TestID.SetWindowText(Id); m_Test.SetWindowText(question); PutAnswer(); if(answer=='A') { m_checkA->SetCheck(true); m_checkB->SetCheck(false); m_checkC->SetCheck(false); m_checkD->SetCheck(false); } if(answer=='B') { m_checkB->SetCheck(true); m_checkA->SetCheck(false); m_checkC->SetCheck(false); m_checkD->SetCheck(false); } if(answer=='C') { m_checkC->SetCheck(true); m_checkA->SetCheck(false); m_checkB->SetCheck(false); m_checkD->SetCheck(false); } if(answer=='D') { m_checkD->SetCheck(true); m_checkA->SetCheck(false); m_checkB->SetCheck(false); m_checkC->SetCheck(false); } }}voidCExamOnlineDlg::OnBack()//上一題{ UpdateData(); CButton*m_checkA=(CButton*)GetDlgItem(IDC_RADIO_A); CButton*m_checkB=(CButton*)GetDlgItem(IDC_RADIO_B); CButton*m_checkC=(CButton*)GetDlgItem(IDC_RADIO_C); CButton*m_checkD=(CButton*)GetDlgItem(IDC_RADIO_D); if(testnum==1) { AfxMessageBox("這已經(jīng)是第一題了"); return; } CStringquestion; CStringId; CStringanswer; CStringsql; m_Test.GetWindowText(question); m_AdoConn.OnInitADOConn(); testnum--; sql.Format("select*fromExammingInfowheretestnum=%d",testnum); m_pRs=m_AdoConn.GetRecordSet((_bstr_t)sql); question=(char*)(_bstr_t)m_pRs->GetCollect("question"); answer=(char*)(_bstr_t)m_pRs->GetCollect("answer"); Id.Format("題號(hào)",testnum); m_TestID.SetWindowText(Id); m_Test.SetWindowText(question); PutAnswer(); if(answer=='A') { m_checkA->SetCheck(true); m_checkB->SetCheck(false); m_checkC->SetCheck(false); m_checkD->SetCheck(false); } if(answer=='B') { m_checkB->SetCheck(true); m_checkA->SetCheck(false); m_checkC->SetCheck(false); m_checkD->SetCheck(false); } if(answer=='C') { m_checkC->SetCheck(true); m_checkA->SetCheck(false); m_checkB->SetCheck(false); m_checkD->SetCheck(false); } if(answer=='D') { m_checkD->SetCheck(true); m_checkA->SetCheck(false); m_checkB->SetCheck(false); m_checkC->SetCheck(false); }}

5.實(shí)現(xiàn)教師操作界面的關(guān)鍵代碼:voidCTextManage::OnAddsubject()//增加科目{ CAddSubjectdlg; if(dlg.DoModal()==IDOK) { CStringName; Name=dlg.m_SubjectName; try { intsubjectid; CStringsql="select*fromsubject"; m_AdoConn.OnInitADOConn(); m_pRs=m_AdoConn.GetRecordSet((_bstr_t)sql); if(m_pRs->adoEOF) { subjectid=1; sql.Format("insertintosubject(subjectid,subjectname)values(%d,'%s')",subjectid,Name); m_AdoConn.ExecuteSQL((_bstr_t)sql); } else { m_pRs->MoveLast(); subjectid=atoi((char*)(_bstr_t)m_pRs->GetCollect("subjectid"))+1; sql.Format("insertintosubject(subjectid,subjectname)values(%d,'%s')",subjectid,Name); m_AdoConn.ExecuteSQL((_bstr_t)sql); } m_AdoConn.ExitConn(); m_TextTree.DeleteAllItems(); AddToTree(); } catch(...) { AfxMessageBox("操作失敗"); return; } }}voidCTextManage::AddToTree(){ HTREEITEMh_root; h_root=m_TextTree.InsertItem("試題科目",0,1); CStringsql="select*fromsubject"; _RecordsetPtrm_prs; try { m_AdoConn.OnInitADOConn(); m_pRs=m_AdoConn.GetRecordSet((_bstr_t)sql); while(m_pRs->adoEOF==0) { CStringstr=(char*)(_bstr_t)m_pRs->GetCollect("subjectname"); m_TextTree.InsertItem(str,0,1,h_root); m_pRs->MoveNext(); } m_AdoConn.ExitConn(); } catch(...) { AfxMessageBox("讀取數(shù)據(jù)失敗"); return; }}voidCTextManage::OnAddtest()//新增試題{ CAddTestdlg; if(dlg.DoModal()==IDOK) { CStringQuestion; CStringAnswer; CStringSubject; CStringtotle; CStringAnswerA,AnswerB,AnswerC,AnswerD; Subject=dlg.ComboText; Question=dlg.m_Question; Answer=dlg.m_Answer; totle=dlg.m_Totle; AnswerA=dlg.m_AnswerA; AnswerB=dlg.m_AnswerB; AnswerC=dlg.m_AnswerC; AnswerD=dlg.m_AnswerD; inttestid; CStringsql="select*fromtestwherequestion='"+Question+"'"; try { m_AdoConn.OnInitADOConn(); m_pRs=m_AdoConn.GetRecordSet((_bstr_t)sql); if(!m_pRs->adoEOF) { AfxMessageBox("試題已經(jīng)存在"); return; } else { sql="select*fromsubjectwheresubjectname='"+Subject+"'"; m_pRs=m_AdoConn.GetRecordSet((_bstr_t)sql); intSid=atoi((char*)(_bstr_t)m_pRs->GetCollect("subjectid")); sql="select*fromtest"; m_pRs=m_AdoConn.GetRecordSet((_bstr_t)sql); if(m_pRs->adoEOF) { testid=1000; } else { m_pRs->MoveLast(); testid=atoi((char*)(_bstr_t)m_pRs->GetCollect("testid"))+1; } sql.Format("insertintotest(testid,question,rightanswer,subjectid,totle)values(%d,\ '%s','%s',%d,'%s')",testid,Question,Answer,Sid,totle); m_AdoConn.ExecuteSQL((_bstr_t)sql); sql.Format("insertintotestanswer(testid,AnswerA,AnswerB,AnswerC,AnswerD)values(%d,\'%s','%s','%s','%s')",testid,AnswerA,AnswerB,AnswerC,AnswerD); m_AdoConn.ExecuteSQL((_bstr_t)sql); m_AdoConn.ExitConn(); m_TextList.DeleteAllItems(); AddToList(Sid); } } catch(...) { AfxMessageBox("操作失敗"); return; } }}voidCTextManage::OnSelchangedTextTree(NMHDR*pNMHDR,LRESULT*pResult){ NM_TREEVIEW*pNMTreeView=(NM_TREEVIEW*)pNMHDR; HTREEITEMselect=m_TextTree.GetSelectedItem(); if(select!=m_TextTree.GetRootItem()) { CStringTreeText=m_TextTree.GetItemText(select); m_TextList.DeleteAllItems(); try { CStringsql="select*fromsubjectwheresubjectname='"+TreeText+"'"; m_AdoConn.OnInitADOConn(); m_pRs=m_AdoConn.GetRecordSet((_bstr_t)sql);

intSid=atoi((char*)(_bstr_t)m_pRs->GetCollect("subjectid")); AddToList(Sid); m_AdoConn.ExitConn(); } catch(...) { AfxMessageBox("操作失敗"); return; } } *pResult=0;}voidCTextManage::AddToList(intSid){ CStringsql; sql.Format("select*fromtestwheresubjectid=%d",Sid); m_AdoConn.OnInitADOConn(); m_pRs=m_AdoConn.GetRecordSet((_bstr_t)sql); while(m_pRs->adoEOF==0) { CStringQue

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論