版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 本科畢業(yè)設(shè)計(jì)(論文)</p><p><b> ?。ǘ?屆)</b></p><p> 在線判題系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)</p><p> 所在學(xué)院 </p><p> 專業(yè)班級(jí) 計(jì)算機(jī)科學(xué)與技術(shù) </p>
2、<p> 學(xué)生姓名 學(xué)號(hào) </p><p> 指導(dǎo)教師 職稱 </p><p> 完成日期 年 月 </p><p> 摘要:計(jì)算機(jī)編程學(xué)習(xí)過(guò)程中,單單只接受老師所傳授的知識(shí)是不夠的,而要在課后自己進(jìn)行編程練習(xí)和鞏固老師
3、教的知識(shí)。而Online Judge系統(tǒng)很好的為我們提供了一個(gè)學(xué)習(xí)和練習(xí)的平臺(tái)。它可以對(duì)程序原代碼進(jìn)行編譯和執(zhí)行,并通過(guò)預(yù)先設(shè)計(jì)的測(cè)試數(shù)據(jù)來(lái)檢驗(yàn)程序原代碼的正確性。</p><p> 本課題結(jié)合計(jì)算機(jī)學(xué)科編程語(yǔ)言教學(xué)中的需求,利用Visual Studio 2010 功能強(qiáng)大的集成開(kāi)發(fā)環(huán)境,使用ASP.NET和SQL Server后臺(tái)數(shù)據(jù)庫(kù),開(kāi)發(fā)了一個(gè)能夠?qū)崿F(xiàn)C/C++程序在線自動(dòng)評(píng)判的網(wǎng)上編程學(xué)習(xí)系統(tǒng)。系統(tǒng)包
4、括前臺(tái)管理模塊和后臺(tái)判定模塊。本系統(tǒng)很好的為用戶提供了一個(gè)學(xué)習(xí)編程、掌握編程與編程交互的平臺(tái)。</p><p> 關(guān)鍵詞:程序設(shè)計(jì);在線判題;API;編譯器 </p><p> Design and implementation of the Online Judge </p><p> Abstract :Computer programming learn
5、ing process, just only accepted the knowledge taught by the teacher is not enough, but to practice program and the consolidation of their teacher's knowledge in the after-school. The Online Judge system provides a go
6、od platform for learning and practicing. It can compile the program and execute source code, and test data through pre-designed to test the correctness of program source code.</p><p> This subject combines
7、the needs of learning computer programming, using Visual Studio 2008 which provides a powerful integrated development platform, ASP.NET and SQL Server 2005, to build this E-Learning system which can judge C/C++ programs.
8、 This system is divided into two parts: Front Management Module and Background Judgment Module.</p><p> Key words: Program; Online Judge ; API ; Compiler</p><p><b> 目 錄</b></p&
9、gt;<p><b> 1 引言1</b></p><p> 1.1 課題背景、意義1</p><p> 1.2 系統(tǒng)開(kāi)發(fā)語(yǔ)言C++1</p><p> 1.3 相關(guān)技術(shù)簡(jiǎn)介3</p><p> 1.3.1 .Net簡(jiǎn)介3</p><p> 1.2.3
10、 Visual Studio簡(jiǎn)介4</p><p> 1.2.3 SQL server 簡(jiǎn)介4</p><p> 2 研究的基本內(nèi)容及解決方法錯(cuò)誤!未定義書(shū)簽。</p><p> 2.1課題的基本內(nèi)容錯(cuò)誤!未定義書(shū)簽。</p><p> 2.2 要解決的技術(shù)難點(diǎn)及解決方法錯(cuò)誤!未定義書(shū)簽。</p>&l
11、t;p> 2.2.1 登陸信息管理錯(cuò)誤!未定義書(shū)簽。</p><p> 2.2.2 題庫(kù)的設(shè)計(jì)實(shí)現(xiàn)錯(cuò)誤!未定義書(shū)簽。</p><p> 2.2.3編譯的實(shí)現(xiàn)錯(cuò)誤!未定義書(shū)簽。</p><p> 3 系統(tǒng)總體設(shè)計(jì)與目標(biāo)10</p><p> 3.1 系統(tǒng)設(shè)計(jì)的原則錯(cuò)誤!未定義書(shū)簽。</p>&l
12、t;p> 3.2 系統(tǒng)設(shè)計(jì)方法12</p><p> 3.3 系統(tǒng)結(jié)構(gòu)8</p><p> 3.4 系統(tǒng)結(jié)構(gòu)圖8</p><p> 3.1 系統(tǒng)設(shè)計(jì)目標(biāo)9</p><p> 4 系統(tǒng)詳細(xì)設(shè)計(jì)錯(cuò)誤!未定義書(shū)簽。</p><p> 4.1 用戶注冊(cè)與登錄錯(cuò)誤!未定義書(shū)簽。</
13、p><p> 4.2 題庫(kù)的具體實(shí)現(xiàn)11</p><p> 4.3 后臺(tái)程序算法的實(shí)現(xiàn)與分析12</p><p> 4.4 判題的實(shí)現(xiàn)錯(cuò)誤!未定義書(shū)簽。</p><p> 4.5 系統(tǒng)測(cè)試21</p><p><b> 結(jié)束語(yǔ)23</b></p><p&
14、gt;<b> 致謝24</b></p><p><b> 參考文獻(xiàn)25</b></p><p><b> 1 引言</b></p><p><b> 課題背景、意義</b></p><p> 隨著信息化進(jìn)程的飛速發(fā)展以及計(jì)算機(jī)技術(shù)的普及,
15、高等院校開(kāi)設(shè)了越來(lái)越多的計(jì)算機(jī)課程。和傳統(tǒng)的課程比較,計(jì)算機(jī)課程具有實(shí)踐性很強(qiáng)的特點(diǎn)。學(xué)生要學(xué)好這些課程不但要認(rèn)真學(xué)習(xí)理論知識(shí),還需要大量的實(shí)踐訓(xùn)練。例如,C 語(yǔ)言課程的學(xué)習(xí),就需要編寫(xiě)大量的程序,才能夠積累足夠的經(jīng)驗(yàn),真正掌握程序設(shè)計(jì)的方法,編寫(xiě)出正確、高效的程序。對(duì)傳統(tǒng)課程的考核多采用筆試的方式,但是,對(duì)于計(jì)算機(jī)方面的課程,特別是程序設(shè)計(jì)語(yǔ)言類課程這是不夠的,因?yàn)樗⒉荒艽偈箤W(xué)生在平時(shí)的學(xué)習(xí)中加強(qiáng)實(shí)踐的鍛煉。如何對(duì)這些課程進(jìn)行有效的
16、考核,成為一個(gè)長(zhǎng)期工作在第一線的計(jì)算機(jī)教育工作者反復(fù)思考和不斷探索的問(wèn)題[1]。</p><p> 在目前的教學(xué)方式中,多數(shù)高等院?;旧线€是采用基于傳統(tǒng)方式的筆試來(lái)考核學(xué)生的計(jì)算機(jī)課程水平,然后在此基礎(chǔ)上稍作補(bǔ)充。在上機(jī)實(shí)踐考試中,學(xué)生采用FTP,Email,甚至手寫(xiě)的方式提交編程作業(yè),老師需要對(duì)他們的作業(yè)進(jìn)行一一批閱,相當(dāng)多的時(shí)候,任課教師從學(xué)生處得到的是一些低效的,甚至不能運(yùn)行通過(guò)的源代碼,可是卻要花費(fèi)不
17、少時(shí)間來(lái)判斷分析學(xué)生程序到底在什么地方出錯(cuò),然后給出相應(yīng)的得分。這需要老師和學(xué)生花費(fèi)很多的精力,效果也不是很好。學(xué)生更無(wú)法得知自己所編寫(xiě)的程序存在哪方面的問(wèn)題,因而不能有效及時(shí)地進(jìn)行更正[2]。而Online Judge可以自動(dòng)批閱作業(yè)并給出成績(jī),并且直接統(tǒng)計(jì)學(xué)生作業(yè)的提交情況,以及成績(jī)的登記。這給老師帶來(lái)了很大的方便,同時(shí)學(xué)生也可以通過(guò)Online Judge直接查詢答題狀況。</p><p> 采用 Onl
18、ine Judge 后,老師可以通過(guò)對(duì)參數(shù)進(jìn)行設(shè)置,限制學(xué)生提交的編程作業(yè)的類型、文件大小、運(yùn)行時(shí)間長(zhǎng)短和空間大小。學(xué)生在提交編程作業(yè)時(shí)能夠很快的得到作業(yè)是否正確的反饋。一方面,Online Judge 可以對(duì)作業(yè)進(jìn)行自動(dòng)編譯,檢查出程序是否存在語(yǔ)法錯(cuò)誤;另一方面,它還能驗(yàn)證程序是否能得到正確結(jié)果,以及所花費(fèi)的代價(jià)(時(shí)間和空間上的)。根據(jù)后處理的結(jié)果與相應(yīng)的參數(shù)設(shè)置,Online Judge 能自動(dòng)給出學(xué)生此次編程作業(yè)的成績(jī)。這大大地減
19、小了學(xué)生提交錯(cuò)誤程序的概率,還能給出與程序相應(yīng)的成績(jī)。當(dāng)然老師也可以進(jìn)行再次審查,對(duì)學(xué)生的作業(yè)提出評(píng)語(yǔ),修改成績(jī)等。這種方式完全模擬了使用程序設(shè)計(jì)語(yǔ)言解決實(shí)際問(wèn)題的過(guò)程,編寫(xiě)程序、不斷測(cè)試修改、根據(jù)結(jié)果反饋修改程序[2]。這樣的考試方式對(duì)學(xué)生的學(xué)習(xí)過(guò)程具有很好的指導(dǎo)作用。與此同時(shí),還消除了老師在檢查作業(yè)的過(guò)程中的主觀因素,增加了學(xué)生之間的公平性。</p><p> Online Judge 的實(shí)現(xiàn),能很快地運(yùn)用
20、到現(xiàn)實(shí)的學(xué)習(xí)生活中去,有效的考核學(xué)生的真實(shí)水平,促使學(xué)生更好的學(xué)習(xí)計(jì)算機(jī)知識(shí),強(qiáng)化學(xué)生的實(shí)踐能力,給學(xué)生和老師帶來(lái)立竿見(jiàn)影的效果;極大地提高了學(xué)生和老師雙方面的效率,減輕了老師在教學(xué)管理上的負(fù)擔(dān)[3];還使學(xué)生將來(lái)能更好地適應(yīng)快速發(fā)展的信息化時(shí)代;進(jìn)一步發(fā)揮出計(jì)算機(jī)網(wǎng)絡(luò)對(duì)當(dāng)今教育領(lǐng)域甚至其他行業(yè)的突出貢獻(xiàn)。</p><p> 1.2 系統(tǒng)開(kāi)發(fā)語(yǔ)言C++</p><p> 系統(tǒng)采用的主要
21、開(kāi)發(fā)技術(shù)是C++。C++這個(gè)詞在中國(guó)大陸的程序員圈子中通常被讀做“C加加”,而西方的程序員通常讀做“C plus plus”,“CPP”。 它是一種使用非常廣泛的計(jì)算機(jī)編程語(yǔ)言。C++是一種靜態(tài)數(shù)據(jù)類型檢查的,支持多重編程范式的通用程序設(shè)計(jì)語(yǔ)言。它支持過(guò)程化程序設(shè)計(jì)、數(shù)據(jù)抽象、面向?qū)ο蟪绦蛟O(shè)計(jì)、制作圖標(biāo)等等泛型程序設(shè)計(jì)等多種程序設(shè)計(jì)風(fēng)格。C語(yǔ)言之所以要起名為“C”,是因?yàn)樗侵饕獏⒖寄莻€(gè)時(shí)候的一門(mén)叫B的語(yǔ)言,它的設(shè)計(jì)者認(rèn)為C語(yǔ)言是B語(yǔ)言
22、的進(jìn)步,所以就起名為C語(yǔ)言;但是B語(yǔ)言并不是因?yàn)橹斑€有個(gè)A語(yǔ)言,而是B語(yǔ)言的作者為了紀(jì)念他的妻子,他的妻子名字的第一個(gè)字母是B; 當(dāng)C語(yǔ)言發(fā)展到頂峰的時(shí)刻,出現(xiàn)了一個(gè)版本叫C with Class,那就是C++最早的版本,在C語(yǔ)言中增加class關(guān)鍵字和類,那個(gè)時(shí)候有很多版本的C都希望在C語(yǔ)言中增加類的概念;后來(lái)C標(biāo)準(zhǔn)委員會(huì)決定為這個(gè)版本的C起個(gè)新的名字,那個(gè)時(shí)候征集了很多種名字,最后采納了其中一個(gè)人的意見(jiàn),以C語(yǔ)言中的++運(yùn)算符來(lái)體
23、現(xiàn)它是C語(yǔ)言的進(jìn)步,故而叫C++,成立了C++標(biāo)準(zhǔn)委員會(huì)。 </p><p> 美國(guó)AT&T貝爾實(shí)驗(yàn)室的本賈尼·斯特勞斯特盧普(Bjarne Stroustrup)博士在20世紀(jì)80年代初期發(fā)明并實(shí)現(xiàn)了C++(最初這種語(yǔ)言被稱作“C with Classes”)。一開(kāi)始C++是作為C語(yǔ)言的增強(qiáng)版出現(xiàn)的,從給C語(yǔ)言增加類開(kāi)始,不斷的增加新特性。虛函數(shù)(virtual function)、運(yùn)算符重
24、載(operator overloading)、多重繼承(multiple inheritance)、模板(template)、異常(exception)、RTTI、命名空間(name space)逐漸被加入標(biāo)準(zhǔn)。1998年國(guó)際標(biāo)準(zhǔn)組織(ISO)頒布了C++程序設(shè)計(jì)語(yǔ)言的國(guó)際標(biāo)準(zhǔn)ISO/IEC 1988-1998。C++是具有國(guó)際標(biāo)準(zhǔn)的編程語(yǔ)言,通常稱作ANSI/ISO C++。1998年是C++標(biāo)準(zhǔn)委員會(huì)成立的第一年,以后每5年視實(shí)際
25、需要更新一次標(biāo)準(zhǔn),下一次標(biāo)準(zhǔn)更新原定是在2009年,目前我們一般稱該標(biāo)準(zhǔn)C++0x,但是由于對(duì)于新特性的爭(zhēng)端激烈,除了在Technical Report 1(tr1)中的新增修改被基本確定外,完整的標(biāo)準(zhǔn)還遙遙無(wú)期。況且遺憾的是,由于C++語(yǔ)言過(guò)</p><p> 目前最符合和接近C++標(biāo)準(zhǔn)的編譯器有為 GNU GCC 4.6.1 和 Visual Studio 2010 sp1 等。 </p>&
26、lt;p> 另外,就目前學(xué)習(xí)C++而言,可以認(rèn)為他是一門(mén)獨(dú)立的語(yǔ)言;他并不依賴C語(yǔ)言,我們可以完全不學(xué)C語(yǔ)言,而直接學(xué)習(xí)C++。根據(jù)《C++編程思想》(Thinking in C++)一書(shū)所評(píng)述的,C++與C的效率往往相差在正負(fù)5%之間。所以有人認(rèn)為在大多數(shù)場(chǎng)合C++ 完全可以取代C語(yǔ)言(然而我們?cè)趩纹瑱C(jī)等需要謹(jǐn)慎利用空間、直接操作硬件的地方還是要使用C語(yǔ)言)[3]。</p><p> C++設(shè)計(jì)成靜態(tài)
27、類型、和C同樣高效且可移植的多用途程序設(shè)計(jì)語(yǔ)言。 </p><p> C++設(shè)計(jì)成直接的和廣泛的支援多種程序設(shè)計(jì)風(fēng)格(程序化程序設(shè)計(jì)、資料抽象化、面向?qū)ο蟪绦蛟O(shè)計(jì)、泛型程序設(shè)計(jì))。 </p><p> C++設(shè)計(jì)成給程序設(shè)計(jì)者更多的選擇,即使可能導(dǎo)致程序設(shè)計(jì)者選擇錯(cuò)誤。 </p><p> C++設(shè)計(jì)成盡可能與C兼容,籍此提供一個(gè)從C到C++的平滑過(guò)渡。 &l
28、t;/p><p> C++避免平臺(tái)限定或沒(méi)有普遍用途的特性。 </p><p> C++不使用會(huì)帶來(lái)額外開(kāi)銷的特性。 </p><p> C++設(shè)計(jì)成無(wú)需復(fù)雜的程序設(shè)計(jì)環(huán)境。 </p><p><b> 1.3相關(guān)技術(shù)簡(jiǎn)介</b></p><p> 本系統(tǒng)是基于Visual Web Deve
29、loper和SQL Server開(kāi)發(fā)環(huán)境下的畢業(yè)設(shè)計(jì)過(guò)程管理系統(tǒng),是以Visual Web Developer為前臺(tái)開(kāi)發(fā)工具,以SQL Server 作為后臺(tái)數(shù)據(jù)庫(kù)開(kāi)發(fā)的B/S(瀏覽器/服務(wù)器)結(jié)構(gòu)的應(yīng)用系統(tǒng)。</p><p> 1.3.1 .Net簡(jiǎn)介</p><p> 系統(tǒng)采用的主要開(kāi)發(fā)技術(shù)是.Net技術(shù)。.Net首先是一個(gè)平臺(tái),它定義了一種公用語(yǔ)言子集(Common Langua
30、ge Subset,CLS),這是一種為符合其規(guī)范的語(yǔ)言與類庫(kù)之間提供無(wú)縫集成的混合語(yǔ)。.Net統(tǒng)一了編程類庫(kù),提供了對(duì)下一代網(wǎng)絡(luò)通訊標(biāo)準(zhǔn),可擴(kuò)展標(biāo)記語(yǔ)言(Extensible Markup Language,XML)的完全支持,使應(yīng)用程序的開(kāi)發(fā)變得更容易,更簡(jiǎn)單。Microsoft.Net計(jì)劃還將實(shí)現(xiàn)人機(jī)交互方面的革命,微軟將在其軟件中添加手寫(xiě)和語(yǔ)音識(shí)別的功能,讓人們能夠與計(jì)算機(jī)進(jìn)行更好的交流,并在此基礎(chǔ)上繼續(xù)擴(kuò)展功能,增加對(duì)各種用戶
31、終端的支持能力。最為重要的是.Net將改變因特網(wǎng)的行為方式:軟件將變?yōu)榉?wù)。與Microsoft的其他產(chǎn)品一樣,.Net與Windows平臺(tái)緊密集成,并且與其他微軟產(chǎn)品相比它更進(jìn)一步:由于其運(yùn)行庫(kù)已經(jīng)與操作系統(tǒng)融合在了一起,從廣義上把它稱為一個(gè)運(yùn)行庫(kù)也不為過(guò)。</p><p> .Net框架是.Net平臺(tái)的基礎(chǔ)架構(gòu)。其強(qiáng)大功能來(lái)自于公共語(yǔ)言運(yùn)行時(shí)(Common Language Runtime,CLR)環(huán)境和類
32、庫(kù)。CLR和類庫(kù)緊密結(jié)合在一起,提供了不同系統(tǒng)之間交叉與綜合的解決方案和服務(wù)。.Net框架創(chuàng)造了一個(gè)完全可操控的、安全的和特性豐富的應(yīng)用執(zhí)行環(huán)境。這不但使得應(yīng)用程序的開(kāi)發(fā)與發(fā)布更加簡(jiǎn)單,并且成就了眾多種類語(yǔ)言間的無(wú)縫集成。</p><p> .Net的核心組件包括:</p><p> ● 一組用于創(chuàng)建互聯(lián)網(wǎng)操作系統(tǒng)的構(gòu)件塊,其中包括Passport.Net(用于用戶認(rèn)證)以及用于文件存
33、儲(chǔ)的服務(wù)、用戶首選項(xiàng)管理、日歷管理以及眾多的其他任務(wù)。</p><p> ● 構(gòu)建和管理新一代服務(wù)的基本結(jié)構(gòu)和工具,包括Visual Studio.Net、.Net企業(yè)服務(wù)器、.Net Framework和Windows.Net。</p><p> ● 能夠啟用新型智能互聯(lián)網(wǎng)設(shè)備的.Net設(shè)備軟件。</p><p> ● .Net用戶體驗(yàn)。</p>
34、<p><b> .Net結(jié)構(gòu)包括:</b></p><p> ● 虛擬對(duì)象系統(tǒng)(Visual Object System ,VOS)類型系統(tǒng)</p><p><b> ● 元數(shù)據(jù)</b></p><p> ● 公用語(yǔ)言規(guī)范(Common Language Specification,CLS)<
35、/p><p> ● 虛擬執(zhí)行系統(tǒng)(Visual Execution System,VES)</p><p> 簡(jiǎn)而言之,.Net是一種面向網(wǎng)絡(luò)、支持各種用戶終端的開(kāi)發(fā)平臺(tái)環(huán)境。微軟的宏偉目標(biāo)是讓.Net徹底改變軟件的開(kāi)發(fā)方式、發(fā)行方式、使用方式等等,并且不止是針對(duì)微軟一家,而是面向所有開(kāi)發(fā)商與運(yùn)營(yíng)商。.Net的核心內(nèi)容之一就是搭建第三代因特網(wǎng)平臺(tái),這個(gè)網(wǎng)絡(luò)平臺(tái)將解決網(wǎng)站之間的協(xié)同合作問(wèn)題,
36、從而最大限度地獲取信息。在.Net平臺(tái)上,不同網(wǎng)站之間通過(guò)相關(guān)的協(xié)定聯(lián)系在一起,網(wǎng)站之間形成自動(dòng)交流,協(xié)同工作,提供最全面的服務(wù)。</p><p> 1.3.2 Visual Studio簡(jiǎn)介</p><p> Visual Studio 2008 Express Editions包括Visual Web Developer 2008 Express Edition、Visual B
37、asic 2008 Express Edition、Visual C# 2008 Express Edition、Visual C++ 2008 Express Edition和Visual J# 2005 Express Edition。Visual Web Developer是一種簡(jiǎn)便的、易學(xué)易用的開(kāi)發(fā)工具,重點(diǎn)專注于使用ASP.NET 3.5進(jìn)行網(wǎng)絡(luò)開(kāi)發(fā),構(gòu)建動(dòng)態(tài)網(wǎng)絡(luò)應(yīng)用。通過(guò)具有易用的拖拽界面的可視化設(shè)計(jì)器、功能強(qiáng)大的代碼編輯器
38、、嵌入式數(shù)據(jù)控制和到SQL Server的集成入口、以及對(duì)Visual Basic, C#和J#等多種語(yǔ)言的支持,創(chuàng)建并管理網(wǎng)絡(luò)應(yīng)用。</p><p> Visual Web Developer內(nèi)置完備的開(kāi)發(fā)套件,可以快速進(jìn)行Web應(yīng)用開(kāi)發(fā)。通過(guò)所見(jiàn)即所得的拖拽界面就可以創(chuàng)建出美觀、易用的網(wǎng)站。內(nèi)置60余種控件、上百段代碼片斷,可以幅度降低創(chuàng)建互動(dòng)式Web應(yīng)用的時(shí)間。支持頁(yè)面模板,從而統(tǒng)一地管理網(wǎng)頁(yè)的排版與布局
39、。通過(guò)IntelliSense,可以更快的訪問(wèn)資源庫(kù)和方法。并可以通過(guò)Common Tasks和Smart Tags調(diào)用最常用的Web開(kāi)發(fā)功能。</p><p> 此外,Visual Web Developer 2008 Express 提供使用ASP.NET 3.5開(kāi)始構(gòu)建網(wǎng)絡(luò)應(yīng)用的所有材料。它包括:</p><p> 通過(guò)易用的拖拽界面使創(chuàng)建網(wǎng)絡(luò)應(yīng)用更加容易的Visual Desi
40、gner。</p><p> 功能豐富的強(qiáng)大的代碼編輯器,例如Intellisense,它可以使編寫(xiě)代碼和HTML變得更加迅速。</p><p> 使用嵌入式數(shù)據(jù)控制和到Microsoft SQL Server 2005 Express的集成入口,快速創(chuàng)建數(shù)據(jù)驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用。</p><p> 支持多種語(yǔ)言:Visual Basic, C#和J#。</p
41、><p> 使用嵌入式的全功能的初學(xué)者套件來(lái)起步,如Personal Web Starter Kit。</p><p> 1.3.3 SQL server簡(jiǎn)介</p><p> Microsoft SQL Server 2005 Express Edition(SQL Server Express)是基于Microsoft SQL Server 2005的數(shù)據(jù)庫(kù)
42、平臺(tái)。它也可用于替換Microsoft Desktop Engine(MSDE)。與Microsoft Visual Studio 2005集成之后的SQL Server Express使得能夠輕松開(kāi)發(fā)數(shù)據(jù)驅(qū)動(dòng)的應(yīng)用程序,這些應(yīng)用程序功能豐富、提供了增強(qiáng)的存儲(chǔ)安全性并可快速進(jìn)行部署。</p><p> Microsoft具有高級(jí)服務(wù)的SQL Server 2005 Express Edition(SQL Ser
43、ver Express) 是SQL Server Express的一個(gè)版本,包括新的圖形管理工具、報(bào)告功能和基于文本的高級(jí)搜索功能。這兩個(gè)SQL Server Express版本可以根據(jù)協(xié)議重新進(jìn)行分發(fā)。其中每個(gè)版本都可以充當(dāng)客戶端數(shù)據(jù)庫(kù)和基本服務(wù)器數(shù)據(jù)庫(kù)。</p><p> SQL Server 2005 Express Edition是適用于負(fù)載較小的網(wǎng)站的一種輕型數(shù)據(jù)庫(kù)服務(wù)器。它作為可選組件提供,可以在V
44、isual Web Developer安裝過(guò)程中進(jìn)行安裝。與Microsoft Access相似,可以使用SQL Server 2005特定的強(qiáng)大功能,將數(shù)據(jù)庫(kù)作為獨(dú)立的文件進(jìn)行創(chuàng)建和部署。這為構(gòu)建網(wǎng)站提供了不可估量的數(shù)據(jù)庫(kù)功能和管理功能。</p><p> 2 研究的基本內(nèi)容及解決的問(wèn)題</p><p> 2.1 課題的基本內(nèi)容</p><p><b
45、> 用戶注冊(cè)的實(shí)現(xiàn)。</b></p><p><b> 用戶信息的管理。</b></p><p> 題目的設(shè)計(jì)與算法實(shí)現(xiàn)。</p><p> 建立數(shù)據(jù)庫(kù)保存信息。</p><p> 編譯器的調(diào)用于實(shí)現(xiàn)。</p><p><b> 調(diào)用后臺(tái)源程序。</b
46、></p><p> 判斷輸入程序的真確性。</p><p> 2.2 解決的問(wèn)題</p><p> 2.2.1 登錄信息管理</p><p><b> 表1 權(quán)限信息表</b></p><p> 表 2用戶角色信息表</p><p> 2.2.2 題庫(kù)
47、的設(shè)計(jì)實(shí)現(xiàn)</p><p> 程序設(shè)計(jì)在線判題系統(tǒng)的題庫(kù)由各類基本程序設(shè)計(jì)題組成,程序設(shè)計(jì)題目是進(jìn)行判題和評(píng)分的單元,是測(cè)試驅(qū)動(dòng)源文件。在本系統(tǒng)中,并不是所有的題目都能夠進(jìn)行在線編譯判題,所以設(shè)計(jì)時(shí)必須針對(duì)程序設(shè)計(jì)題程序設(shè)計(jì)在線判題系統(tǒng)設(shè)計(jì)一個(gè)特定的題目結(jié)構(gòu),這種題目結(jié)構(gòu)的目的在于考核學(xué)生對(duì)于一定的知識(shí)點(diǎn)的掌握并且能夠被正確評(píng)估,一個(gè)切實(shí)可行的方案是限定程序題目的輸入和輸出。在程序中適當(dāng)?shù)牧艨眨谶@種條件下系統(tǒng)
48、就能夠有效實(shí)現(xiàn)程序正確性的判定。每一道題目由以下五部分組成:Input(標(biāo)準(zhǔn)輸入),Output(標(biāo)準(zhǔn)輸出),RII.c(程序填空)。Text(題目的正文),Title(題目標(biāo))。為此引用MYSQL建立后臺(tái)使用C和C++編寫(xiě),并使用了多種編譯器進(jìn)行測(cè)試,保證源代碼的可移植性。 支持AIX、FreeBSD、HP-UX、Linux、Mac OS、Novell Netware、OpenBSD、OS/2 Wrap、Solaris、Windows
49、等多種操作系統(tǒng)。為多種編程語(yǔ)言提供了API。支持多線程,充分利用CPU資源 。優(yōu)化的SQL查詢算法,有效地提高查詢速度 。既能夠作為一個(gè)單獨(dú)的應(yīng)用程序應(yīng)用在客戶端服務(wù)器網(wǎng)絡(luò)環(huán)境</p><p> 2.2.3 編譯的實(shí)現(xiàn)</p><p> 用戶提交(submit)代碼之后,OJ調(diào)用相應(yīng)的編譯器(compiler)編譯這段代碼,如果出現(xiàn)編譯錯(cuò)誤(CE),立即將編譯器給出的CE消息返回給用戶
50、。.如果編譯階段通過(guò)后,將代碼轉(zhuǎn)換為可執(zhí)行文件.exe(C/C++)或類文件.class(Java)。然后需要調(diào)入事先準(zhǔn)備好的各類測(cè)試數(shù)據(jù)考驗(yàn)用戶程序。.這時(shí)候OJ需要執(zhí)行用戶程序,但用戶程序是讀入和寫(xiě)出標(biāo)準(zhǔn)I/O流,與你準(zhǔn)備好的輸入/輸出測(cè)試數(shù)據(jù)需要一個(gè)連接器(connector)。這里我準(zhǔn)備使用類似管道的技術(shù)。.在windows上可以書(shū)寫(xiě)批處理.bat文件,將輸入數(shù)據(jù)1000.in文件重定向到1000.exe,然后將1000.exe
51、執(zhí)行后存入標(biāo)準(zhǔn)輸出流的數(shù)據(jù)重定向到輸出數(shù)據(jù)1000.out文件中。這時(shí)候如果有運(yùn)行時(shí)錯(cuò)誤RE則和處理CE過(guò)程類似。如果有運(yùn)行結(jié)果,則將這一結(jié)果和標(biāo)準(zhǔn)結(jié)果做對(duì)比。</p><p> 3 系統(tǒng)總體設(shè)計(jì)與目標(biāo)</p><p> 3.1 系統(tǒng)設(shè)計(jì)的原則</p><p> 實(shí)用性:系統(tǒng)的設(shè)計(jì)從用戶的需求出發(fā),滿足了判題活動(dòng)的一系列要求,而且力求用戶操作方便、簡(jiǎn)單易懂、
52、界面友好。</p><p> 安全性:系統(tǒng)采用了輸入“用戶名”和“密碼”來(lái)識(shí)別用戶的登錄界面,從而防止了非法用戶的入侵;通過(guò)對(duì)用戶權(quán)限的設(shè)置實(shí)現(xiàn)了管理員與用戶相分離,充分保證了系統(tǒng)的安全性。</p><p> 可維護(hù)性和可擴(kuò)展性:系統(tǒng)具有良好的可擴(kuò)展性和可維護(hù)性。系統(tǒng)中各個(gè)模塊的獨(dú)立性可以完全保證各個(gè)模塊的適當(dāng)擴(kuò)展和修改不會(huì)影響到其他模塊的運(yùn)行。</p><p>
53、; 標(biāo)準(zhǔn)性:軟件設(shè)計(jì)嚴(yán)格執(zhí)行國(guó)家有關(guān)軟件工程的標(biāo)準(zhǔn),保證系統(tǒng)質(zhì)量,提供完整、準(zhǔn)確、詳細(xì)的開(kāi)發(fā)文檔。</p><p> 簡(jiǎn)單化:界面盡量簡(jiǎn)單化,做到實(shí)用、方便,盡量滿足不同角色用戶的需要。</p><p> 3.2 系統(tǒng)設(shè)計(jì)方法</p><p> 結(jié)構(gòu)化方法是系統(tǒng)在設(shè)計(jì)時(shí)采用的主要方法。結(jié)構(gòu)化方法的基本思路就是把整個(gè)系統(tǒng)開(kāi)發(fā)過(guò)程分為若干階段,每個(gè)階段進(jìn)行若干
54、活動(dòng),每項(xiàng)活動(dòng)應(yīng)用一系列標(biāo)準(zhǔn)、規(guī)范、方法和技術(shù),完成一個(gè)或多個(gè)任務(wù),形成符合給定規(guī)范的產(chǎn)品。</p><p> 結(jié)構(gòu)化系統(tǒng)開(kāi)發(fā)方法的特點(diǎn)是:</p><p> 用“自上而下”的開(kāi)發(fā)策略,進(jìn)行系統(tǒng)分析和系統(tǒng)設(shè)計(jì),然后“自下而上”地開(kāi)發(fā)和調(diào)試各個(gè)模塊,最后實(shí)現(xiàn)模塊聯(lián)調(diào)和整個(gè)系統(tǒng)的聯(lián)調(diào)。</p><p> 工作文件的標(biāo)準(zhǔn)化與文檔化。即每一階段、每一步驟都有詳細(xì)的文檔
55、記錄,并有完整的管理制度。</p><p> 強(qiáng)調(diào)面向用戶的特點(diǎn)。即將用戶的參與程度和滿意與否作為系統(tǒng)開(kāi)發(fā)能否成功的關(guān)鍵。</p><p> 結(jié)構(gòu)化開(kāi)發(fā)方法在大多數(shù)情況下是信息系統(tǒng)工程開(kāi)發(fā)的有效方法。它首先用結(jié)構(gòu)化分析(SA)對(duì)軟件進(jìn)行需求分析,然后用結(jié)構(gòu)化設(shè)計(jì)(SD)方法進(jìn)行總體設(shè)計(jì),最后是結(jié)構(gòu)化編程(SP)。</p><p> 結(jié)構(gòu)化方法又可以分為自頂向下
56、和自底向上開(kāi)發(fā)方法。兩者結(jié)合是實(shí)際開(kāi)發(fā)過(guò)程中常用的方法。</p><p> 結(jié)構(gòu)化方法的主要原則是:</p><p><b> 用戶參與的原則;</b></p><p> “先邏輯,后物理”的原則;</p><p> “自頂向下”的原則;</p><p> 工作成果描述標(biāo)準(zhǔn)化的原則。&l
57、t;/p><p><b> 3.3 系統(tǒng)結(jié)構(gòu)</b></p><p> 判題模塊中在線編譯器和在線判題器的設(shè)計(jì)和實(shí)現(xiàn)。調(diào)用編譯配置腳本,傳入?yún)?shù)題目號(hào)、使用語(yǔ)言,使用語(yǔ)言決定調(diào)用GCC、G++或其他編譯器。然后編譯腳本對(duì)程序進(jìn)行編譯并執(zhí)行,輸出提交程序的結(jié)果文件。在線判題器使用Bash Shell腳本語(yǔ)言實(shí)現(xiàn)。首先檢查由編譯腳本輸出的結(jié)果文件,如果編譯出錯(cuò)則判定Co
58、mpile Error(編譯錯(cuò)誤)并返回。如果程序編譯通過(guò),判題腳本fo水出子進(jìn)程,根據(jù)題目的相應(yīng)限制設(shè)置進(jìn)程運(yùn)行的時(shí)間、空間限制。同時(shí)判題腳本判斷子進(jìn)程運(yùn)行及返回狀態(tài),分別判定Runtime Error(運(yùn)行時(shí)錯(cuò)誤),Time limit exceeded(程序運(yùn)行超時(shí)),Memory limit exceeded(內(nèi)存使用超限),并且返回。</p><p> 3.4 系統(tǒng)結(jié)構(gòu)圖</p>&l
59、t;p> 圖1 系統(tǒng)總體結(jié)構(gòu)圖</p><p> 3.5 系統(tǒng)設(shè)計(jì)目標(biāo)</p><p> 預(yù)期系統(tǒng)應(yīng)達(dá)到的實(shí)施效果:</p><p> 程序設(shè)計(jì)語(yǔ)言熟練程度和程序設(shè)計(jì)能力是計(jì)算機(jī)相關(guān)專業(yè)學(xué)生的最基本的技能。傳統(tǒng)的上機(jī)練習(xí)往往依賴于教師的指導(dǎo),在教師資源有限的情況下,上機(jī)指導(dǎo)教師的工作量普遍較大。設(shè)計(jì)一個(gè)能對(duì)程序設(shè)計(jì)題進(jìn)行在線編譯判題不需任何人工輔助的
60、系統(tǒng),不僅可以給學(xué)生提供一個(gè)訓(xùn)練程序設(shè)計(jì)能力的互動(dòng)平臺(tái)[13]。也使教師能夠通過(guò)系統(tǒng)更能把握學(xué)生對(duì)教學(xué)內(nèi)容掌握程度并可作為監(jiān)督學(xué)生學(xué)習(xí)的重要工具,還可以在一定程度上強(qiáng)化實(shí)踐、激發(fā)自主性;其次,作為一個(gè)網(wǎng)絡(luò)教學(xué)練習(xí)和考試系統(tǒng),提供了在線判題功能,可以有效降低教師的閱卷工作量。</p><p><b> 4 系統(tǒng)詳細(xì)設(shè)計(jì)</b></p><p><b> 4
61、.1 用戶登錄</b></p><p> 系統(tǒng)登錄界面部分,前臺(tái)視覺(jué)設(shè)計(jì)如下圖所示:</p><p><b> 圖2登錄界面設(shè)計(jì)</b></p><p> 4.2 題庫(kù)的具體實(shí)現(xiàn)</p><p> 程序設(shè)計(jì)在線判題系統(tǒng)的題庫(kù)由各類基本程序設(shè)計(jì)題組成,程序設(shè)計(jì)題目是進(jìn)行判題和評(píng)分的單元,是測(cè)試驅(qū)動(dòng)源
62、文件。在本系統(tǒng)中,并不是所有的題目都能夠進(jìn)行在線編譯判題,所以設(shè)計(jì)時(shí)必須針對(duì)程序設(shè)計(jì)題程序設(shè)計(jì)在線判題系統(tǒng)設(shè)計(jì)一個(gè)特定的題目結(jié)構(gòu),這種題目結(jié)構(gòu)的目的在于考核學(xué)生對(duì)于一定的知識(shí)點(diǎn)的掌握并且能夠被正確評(píng)估,一個(gè)切實(shí)可行的方案是限定程序題目的輸入和輸出。在程序中適當(dāng)?shù)牧艨?,在這種條件下系統(tǒng)就能夠有效實(shí)現(xiàn)程序正確性的判定。每一道題目由以下五部分組成:Input(標(biāo)準(zhǔn)輸入),Output(標(biāo)準(zhǔn)輸出),F(xiàn)II.c(程序填空),Text(題目的正文)
63、,Title(題目標(biāo))。對(duì)于一個(gè)考核學(xué)生是否掌握求兩個(gè)數(shù)和與差的題目示例如下:</p><p> (a)Text:題目的內(nèi)容,是對(duì)題目的說(shuō)明。如題:“程序填空,不要改變與輸入輸出有關(guān)的語(yǔ)句。輸入整數(shù)a和b,計(jì)算并輸出a、b的和與差。例:輸入2—8;輸出The sum is一6;The difference is 10” 。</p><p> (b)Title:題目標(biāo)題,如上述的題目標(biāo)題
64、就是“求兩個(gè)數(shù)的和與差”。</p><p> (c)Input:程序的標(biāo)準(zhǔn)輸入。如上述的題目輸入就是“2—8”。</p><p> (d)Output:程序的標(biāo)準(zhǔn)輸出,作為提交程序輸出的語(yǔ)義匹配的模板。如上述的題目輸出就是“The sum is一6:The difference is 10”。</p><p> (c)Fill.c:程序主體,空缺部分需要學(xué)生填
65、寫(xiě)完整(以C語(yǔ)言為例),空缺部分可以是所要考核的知識(shí)點(diǎn)的關(guān)鍵部分。比如:</p><p> #iclude<sldio.h></p><p> int main(){</p><p> int a,b,sum,diff;</p><p> scanf(“%d%d”,&a,&b);</p>&l
66、t;p><b> sum=a+b;</b></p><p> diff=a—b:/*fill_n*/</p><p> printf(“The sum is%d\n”,sum);</p><p> printf(“The difference ls%d\n”,diff);</p><p><b>
67、 }</b></p><p> 程序題目作為記錄存入數(shù)據(jù)庫(kù)中,其中還包括其他的屬性,例如題目類型,知識(shí)點(diǎn),難度,程序進(jìn)程運(yùn)行的時(shí)間、空間限制。題目類型、知識(shí)點(diǎn)、難度用于出卷;程序進(jìn)程運(yùn)行的時(shí)間、空間限制用于控制判題時(shí)服務(wù)器資源。</p><p> 4.3后臺(tái)源程序算法的實(shí)現(xiàn)與分析</p><p> 算法設(shè)計(jì)與分析的基本方法[8]: </p&
68、gt;<p><b> 1).遞推法</b></p><p> 遞推法是利用問(wèn)題本身所具有的一種遞推關(guān)系求問(wèn)題解的一種方法。它把問(wèn)題分成若干步,找出相鄰幾步的關(guān)系,從而達(dá)到目的,此方法稱為遞推法。 </p><p><b> 2).遞歸</b></p><p> 遞歸指的是一個(gè)過(guò)程:函數(shù)不斷引用自身,
69、直到引用的對(duì)象已知。 </p><p><b> 3).窮舉搜索法</b></p><p> 窮舉搜索法是對(duì)可能是解的眾多候選解按某種順序進(jìn)行逐一枚舉和檢驗(yàn),并從眾找出那些符合要求的候選解作為問(wèn)題的解。 </p><p><b> 4).貪婪法</b></p><p> 貪婪法是一種不追求
70、最優(yōu)解,只希望得到較為滿意解的方法。貪婪法一般可以快速得到滿意的解,因?yàn)樗∪チ藶檎易顑?yōu)解要窮盡所有可能而必須耗費(fèi)的大量時(shí)間。貪婪法常以當(dāng)前情況為基礎(chǔ)作最優(yōu)選擇,而不考慮各種可能的整體情況,所以貪婪法不要回溯。 </p><p><b> 5).分治法</b></p><p> 分治法是把一個(gè)復(fù)雜的問(wèn)題分成兩個(gè)或更多的相同或相似的子問(wèn)題,再把子問(wèn)題分成更小的子問(wèn)題
71、……直到最后子問(wèn)題可以簡(jiǎn)單的直接求解,原問(wèn)題的解即子問(wèn)題的解的合并。 </p><p><b> 6).動(dòng)態(tài)規(guī)劃法</b></p><p> 動(dòng)態(tài)規(guī)劃是一種在數(shù)學(xué)和計(jì)算機(jī)科學(xué)中使用的,用于求解包含重疊子問(wèn)題的最優(yōu)化問(wèn)題的方法。其基本思想是,將原問(wèn)題分解為相似的子問(wèn)題,在求解的過(guò)程中通過(guò)子問(wèn)題的解求出原問(wèn)題的解。動(dòng)態(tài)規(guī)劃的思想是多種算法的基礎(chǔ),被廣泛應(yīng)用于計(jì)算機(jī)科學(xué)
72、和工程領(lǐng)域。 </p><p><b> 7).迭代法</b></p><p> 迭代法是數(shù)值分析中通過(guò)從一個(gè)初始估計(jì)出發(fā)尋找一系列近似解來(lái)解決問(wèn)題(一般是解方程或者方程組)的過(guò)程,為實(shí)現(xiàn)這一過(guò)程所使用的方法統(tǒng)稱為迭代法。</p><p><b> 4.4 判題的實(shí)現(xiàn)</b></p><p>
73、 下圖是程序設(shè)計(jì)在線判題系統(tǒng)的實(shí)現(xiàn)原理。</p><p><b> 圖 3 判題原理</b></p><p> 程序設(shè)計(jì)在線判題系統(tǒng)的測(cè)試用例運(yùn)行控制是整個(gè)系統(tǒng)運(yùn)行控制中心,包含調(diào)度編譯和判題兩個(gè)功能。這部分的實(shí)現(xiàn)需要涉及操作系統(tǒng)的部分底層操作,如信號(hào)操作、進(jìn)程間通信和控制等,所以系統(tǒng)測(cè)試用例運(yùn)行控制主程序選擇C++實(shí)現(xiàn)。用戶交互由PHP程序?qū)崿F(xiàn),后臺(tái)數(shù)據(jù)庫(kù)系
74、統(tǒng)采用MySQL。PHP程序負(fù)責(zé)與用戶交互,處理用戶登錄、查看題目、提交答案、比對(duì)輸出和顯示結(jié)果等請(qǐng)求。系統(tǒng)測(cè)試用例運(yùn)行控制具體設(shè)計(jì)流程如下:考生首先在PHP頁(yè)面下載程序題目,完成程序填空部分或者整個(gè)程序,然后提交題目到判題服務(wù),并在數(shù)據(jù)庫(kù)中插入相應(yīng)的記錄,提交要求判題信號(hào),然后主程序收到信號(hào)后讀取數(shù)據(jù)庫(kù)記錄,并且調(diào)用判題主程序。判題主程序是判題系統(tǒng)的核心子系統(tǒng),它主要功能是負(fù)責(zé)接收和分派判題請(qǐng)求,并且調(diào)用判題模塊實(shí)現(xiàn)判題評(píng)分。判題主程
75、序首先主要負(fù)責(zé)從數(shù)據(jù)庫(kù)中讀取所需要的題庫(kù)信息(Input、Output和Fill.c),為每一題目建立臨時(shí)工作目錄,并把這些信息保存到臨時(shí)工作目錄。一旦考生通過(guò)WEB頁(yè)面提交要求被評(píng)估源代碼,判題主程序接收到提交請(qǐng)求并且自動(dòng)查詢數(shù)據(jù)庫(kù),檢查題庫(kù)表中是否有對(duì)應(yīng)題目存在,并同時(shí)查詢題目狀態(tài)是否為可提交到數(shù)據(jù)庫(kù)判題</p><p> 圖 4 在線編譯判題流程</p><p> 判題模塊負(fù)責(zé)
76、處理判題的具體實(shí)現(xiàn),包含在線編譯器和在線判題器兩個(gè)重要部件,是一個(gè)處理用戶、操作系統(tǒng)、數(shù)據(jù)庫(kù)、判題系統(tǒng)多方面交互的過(guò)程:判題模塊首先查詢數(shù)據(jù)庫(kù)判題運(yùn)行表(小ns表)獲得提交詳細(xì)信息,同時(shí)查詢當(dāng)場(chǎng)考試信息表獲得當(dāng)前考試時(shí)間,比較提交時(shí)間是否在考試時(shí)間內(nèi),如果不在考試時(shí)間內(nèi)則判定超時(shí)并返回。如果在考試時(shí)間內(nèi),調(diào)用編譯配置腳本,傳入?yún)?shù)題目號(hào)、使用語(yǔ)言,使用語(yǔ)言決定調(diào)用GCC、G++或其他編譯器。然后編譯腳本對(duì)程序進(jìn)行編譯并執(zhí)行,輸出提交程序
77、的結(jié)果文件。</p><p> 在線判題器使用Bash Shell腳本語(yǔ)言實(shí)現(xiàn)。首先檢查由編譯腳本輸出的結(jié)果文件,如果編譯出錯(cuò)則判定Compile Error(編譯錯(cuò)誤)并返回。如果程序編譯通過(guò),判題腳本fo水出子進(jìn)程,根據(jù)題目的相應(yīng)限制設(shè)置進(jìn)程運(yùn)行的時(shí)間、空間限制。同時(shí)判題腳本判斷子進(jìn)程運(yùn)行及返回狀態(tài),分別判定Runtime Error(運(yùn)行時(shí)錯(cuò)誤),Time Iim計(jì)exceeded(程序運(yùn)行超時(shí)),Mem
78、oryljm計(jì)exceeded(內(nèi)存使用超限),并且返回。最后更新數(shù)據(jù)庫(kù)判題運(yùn)行表(t_runs)寫(xiě)入判題結(jié)果和輸出,刪除工作臨時(shí)文件,進(jìn)行語(yǔ)義匹配,給出分?jǐn)?shù)。</p><p> 系統(tǒng)實(shí)現(xiàn)調(diào)用g++編譯器判斷用戶程序的對(duì)錯(cuò)。</p><p> #include <QtCore></p><p> #include <QtSql><
79、/p><p> #include "daemon.h"</p><p> #include "executer.h"</p><p> #include "compiler.h"</p><p> const int BufferSize = 50;</p><
80、;p> int buffer[BufferSize]; </p><p> bool isJudgeActivated = false;</p><p> QSemaphore freeBuffer(BufferSize); </p><p> QSemaphore usedBuffer;</p><p> void jud
81、ge(int id)</p><p><b> {</b></p><p> QSqlQuery query;</p><p> QString tempString;</p><p> query.prepare("select compiler from status where runID =
82、:id");</p><p> query.bindValue(":id", id);</p><p> query.exec();</p><p> query.first();</p><p> QString languageName = query.value(0).toString();<
83、/p><p> QString compilerName;</p><p> QStringList opt;</p><p> if(languageName == "C++")</p><p><b> {</b></p><p> compilerName = &q
84、uot;g++";</p><p> opt << "-w" << "-o" << "../judge/oexe/temp.exe";</p><p> tempString = "../judge/src/";</p><p> te
85、mpString.append(QString::number(id));</p><p> tempString.append(".cpp");</p><p> opt << tempString;</p><p><b> }</b></p><p> else if(lan
86、guageName == "C")</p><p><b> {</b></p><p> compilerName = "gcc";</p><p> opt << "-w" << "-o" << "../jud
87、ge/oexe/temp.exe";</p><p> tempString = "../judge/src/";</p><p> tempString.append(QString::number(id));</p><p> tempString.append(".c");</p><
88、p> opt << tempString;</p><p><b> }</b></p><p> else if(languageName == "Java")</p><p><b> {</b></p><p><b> }</
89、b></p><p> else// Pascal</p><p><b> {</b></p><p><b> }</b></p><p> Compiler compiler(compilerName);</p><p> // set compile
90、r environment & options</p><p> compiler.setCompilerOption(opt);</p><p> compiler.execute();</p><p> tempString = compiler.getStatus();</p><p> if( tempString =
91、= "Compile Error" )</p><p><b> {</b></p><p> query.prepare("update status set judgeStatus = 'Compile Error', "</p><p> "remarks = :re
92、m where runID = :rid");</p><p> query.bindValue(":rem", compiler.getErrorInfo());</p><p> query.bindValue(":rid", id);</p><p> query.exec();</p>&
93、lt;p> // return this function earlier</p><p><b> return;</b></p><p><b> }</b></p><p> // compile OK, continue</p><p> // first, select t
94、he problem ID.</p><p> Executer executer;</p><p> query.prepare("select problemID from status where runID = :rid");</p><p> query.bindValue(":rid", id);</p
95、><p> query.exec();</p><p> query.first();</p><p> QString pidString = query.value(0).toString();</p><p> tempString = "../judge/cases/in/";</p><
96、p> tempString.append(pidString);</p><p> executer.setInputFile(tempString);</p><p> tempString = "../judge/cases/output/";</p><p> tempString.append(QString::number
97、(id));</p><p> executer.setOutputFile(tempString);</p><p> tempString = "../judge/oexe/";</p><p> tempString.append("temp.exe");</p><p> execute
98、r.setExePath(tempString);</p><p> executer.setTimeLimit();</p><p> executer.setMemoryLimit();</p><p> tempString = "../judge/cases/out/";</p><p> tempStri
99、ng.append(pidString);</p><p> executer.setTestCasePath(tempString);</p><p> executer.execute();</p><p> qDebug() << executer.getStatus();</p><p> const QTime
100、startTime(11, 30, 0); </p><p> query.prepare("update status set judgeStatus = :js where runID = :rid");</p><p> query.bindValue(":js", executer.getStatus());</p>&
101、lt;p> query.bindValue(":rid", id);</p><p> query.exec();</p><p> if( executer.getStatus() == "Accepted" )</p><p><b> {</b></p><p>
102、; qDebug() << "Accepted, updating the database.\n";</p><p> query.prepare("update problemLib set accepted = accepted + 1, ratio = accepted / submited "</p><p> "
103、;where pid = :pid");</p><p> query.bindValue(":pid", pidString.toInt());</p><p> query.exec();</p><p> QString team;</p><p> QTime submitTime;</p&
104、gt;<p> query.prepare("select author,submitTime from status where runID = :rid");</p><p> query.bindValue(":rid", id);</p><p> query.exec();</p><p> w
105、hile(query.next())</p><p><b> {</b></p><p> team = query.value(0).toString();</p><p> submitTime = query.value(1).toTime();</p><p><b> }</b>
106、</p><p> QString passTime, submitTimes;</p><p> passTime = "passTime_" + pidString;</p><p> submitTimes = "submitTimes_" + pidString;</p><p> QS
107、tring queryString;</p><p> queryString.append("select solvedNumber, contestTime, ");</p><p> queryString.append(passTime);</p><p> queryString.append(", ");&l
108、t;/p><p> queryString.append(submitTimes);</p><p> queryString.append(" from rankList where team = '");</p><p> queryString.append(team);</p><p> querySt
109、ring.append("'");</p><p> qDebug() << queryString;</p><p> query.exec(queryString);</p><p> QTime pTime, cTime; //pass time, contest time</p><p>
110、 int sNum(0); //submit times</p><p> int solved(0); //solved number</p><p><b> int temp;</b></p><p> while(query.next())</p><p><b> {</b>&
111、lt;/p><p> solved = query.value(0).toInt();</p><p> cTime = query.value(1).toTime();</p><p> pTime = query.value(2).toTime();</p><p> sNum = query.value(3).toInt();<
112、;/p><p><b> }</b></p><p> solved += 1;</p><p> sNum = 1 + sNum;</p><p> temp = startTime.secsTo(QTime(0, 0, 0));</p><p> submitTime = submitT
113、ime.addSecs(temp);</p><p> temp = (-sNum) * 1200;</p><p> pTime = submitTime.addSecs(temp);</p><p> temp = pTime.secsTo(QTime(0, 0, 0));</p><p> cTime = cTime.addS
114、ecs(-temp);</p><p> qDebug() << "cTime: " << cTime;</p><p> qDebug() << "solved: " << solved;</p><p> qDebug() << "sNum: &q
115、uot; << sNum;</p><p> QString updateString;</p><p> updateString = QString("update rankList set solvedNumber = %1, contestTime = \'").arg(solved);</p><p> upd
116、ateString.append(cTime.toString("HH:mm:ss"));</p><p> updateString.append("\', ");</p><p> updateString.append(passTime);</p><p> updateString.append(&quo
117、t; = \'");</p><p> updateString.append(pTime.toString("HH:mm:ss"));</p><p> updateString.append("\', ");</p><p> updateString.append(submitTimes)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 在線判題系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)【畢業(yè)設(shè)計(jì)】
- 在線判題系統(tǒng)設(shè)計(jì)與開(kāi)發(fā)【文獻(xiàn)綜述】
- 在線判題系統(tǒng)設(shè)計(jì)與開(kāi)發(fā)【開(kāi)題報(bào)告】
- 基于lamp的網(wǎng)絡(luò)在線投票系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)【畢業(yè)設(shè)計(jì)+開(kāi)題報(bào)告+文獻(xiàn)綜述】
- 網(wǎng)絡(luò)考試系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)【開(kāi)題報(bào)告+文獻(xiàn)綜述+畢業(yè)設(shè)計(jì)】
- 圖片文字提取系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)【畢業(yè)設(shè)計(jì)+開(kāi)題報(bào)告+文獻(xiàn)綜述】
- 網(wǎng)上虛擬試衣系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)【畢業(yè)設(shè)計(jì)+開(kāi)題報(bào)告+文獻(xiàn)綜述】
- 高校智能門(mén)禁系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)【畢業(yè)設(shè)計(jì)+開(kāi)題報(bào)告+文獻(xiàn)綜述】
- 泛洪攻擊設(shè)計(jì)與實(shí)現(xiàn)【畢業(yè)設(shè)計(jì)+開(kāi)題報(bào)告+文獻(xiàn)綜述】
- 大學(xué)選課系統(tǒng)的分析、設(shè)計(jì)與實(shí)現(xiàn)【畢業(yè)設(shè)計(jì)+開(kāi)題報(bào)告+文獻(xiàn)綜述】
- 盆花自動(dòng)澆水系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)【畢業(yè)設(shè)計(jì)+開(kāi)題報(bào)告+文獻(xiàn)綜述】
- gps儀的設(shè)計(jì)與實(shí)現(xiàn)【畢業(yè)設(shè)計(jì)+開(kāi)題報(bào)告+文獻(xiàn)綜述】
- linux shell的設(shè)計(jì)與實(shí)現(xiàn)【畢業(yè)設(shè)計(jì)+開(kāi)題報(bào)告+文獻(xiàn)綜述】
- 病房呼叫系統(tǒng)設(shè)計(jì)【開(kāi)題報(bào)告+文獻(xiàn)綜述+畢業(yè)設(shè)計(jì)】
- 網(wǎng)絡(luò)微博系統(tǒng)的設(shè)計(jì)與模擬實(shí)現(xiàn)【畢業(yè)設(shè)計(jì)+開(kāi)題報(bào)告+文獻(xiàn)綜述】
- 基于.net人才招聘系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)【畢業(yè)設(shè)計(jì)+開(kāi)題報(bào)告+文獻(xiàn)綜述】
- 畢業(yè)設(shè)計(jì)開(kāi)題報(bào)告+文獻(xiàn)綜述.doc
- 畢業(yè)設(shè)計(jì)開(kāi)題報(bào)告+文獻(xiàn)綜述.doc
- 梵塔動(dòng)畫(huà)演示的設(shè)計(jì)與實(shí)現(xiàn)【畢業(yè)設(shè)計(jì)+開(kāi)題報(bào)告+文獻(xiàn)綜述】
- 流媒體播放系統(tǒng)設(shè)計(jì)【畢業(yè)設(shè)計(jì)+開(kāi)題報(bào)告+文獻(xiàn)綜述】
評(píng)論
0/150
提交評(píng)論