文章編號(hào):1672-5913(2008)20-0148-03
摘 要:本文簡(jiǎn)要介紹了當(dāng)前VFP教學(xué)和NCRE考試的現(xiàn)狀,通過(guò)具體實(shí)例詳細(xì)闡述NCRE二級(jí)VFP機(jī)試中部分邏輯陷阱,探討VFP教學(xué)的特點(diǎn),并由此深入分析如何及時(shí)發(fā)現(xiàn)并避免犯錯(cuò)。
關(guān)鍵詞:NCRE;VFP;邏輯陷阱;實(shí)踐教學(xué);數(shù)據(jù)校驗(yàn)
中圖分類(lèi)號(hào):G642 文獻(xiàn)標(biāo)識(shí)碼:B
全國(guó)計(jì)算機(jī)等級(jí)考試(National Computer Rank Examin-
ation,簡(jiǎn)稱NCRE)是由教育部考試中心主辦,面向社會(huì)考查計(jì)算機(jī)應(yīng)用知識(shí)與能力的全國(guó)性計(jì)算機(jī)水平考試體系。NCRE二級(jí)證書(shū)是具有基本計(jì)算機(jī)使用能力的社會(huì)通用標(biāo)準(zhǔn),是職務(wù)晉升、職稱評(píng)定、崗位競(jìng)聘的重要依據(jù)。VFP是NCRE二級(jí)考試語(yǔ)種之一,由于部分VFP上機(jī)考題中隱藏了很深的邏輯陷阱,所以它成了阻礙獲取證書(shū)的主要因素,因此認(rèn)真分析考題、反復(fù)校驗(yàn)結(jié)果來(lái)避免落入邏輯陷阱已經(jīng)成為數(shù)據(jù)處理的基本方法。
1 VFP教學(xué)和考試現(xiàn)狀簡(jiǎn)介
1.1 VFP教學(xué)現(xiàn)狀
數(shù)據(jù)庫(kù)技術(shù)是計(jì)算機(jī)專業(yè)的基礎(chǔ)課程之一,它所研究的問(wèn)題就是如何科學(xué)地組織和存儲(chǔ)數(shù)據(jù),如何高效地獲取和處理數(shù)據(jù),如何更廣泛、更安全地共享數(shù)據(jù)。VFP是目前最流行的數(shù)據(jù)庫(kù)管理系統(tǒng)之一,是一種支持面向?qū)ο蟪绦蛟O(shè)計(jì)的可視化高級(jí)程序設(shè)計(jì)語(yǔ)言,是大學(xué)非工科專業(yè)學(xué)生必修的計(jì)算機(jī)課程,也是目前NCRE二級(jí)報(bào)考人數(shù)最多的語(yǔ)種。
1.2 VFP二級(jí)考試特點(diǎn)
報(bào)考VFP的絕大部分是非工科的考生,他們普遍缺乏計(jì)算機(jī)編程思維,部分考生在考試結(jié)束后自我感覺(jué)良好,最終卻沒(méi)有通過(guò)考試,除了粗心大意犯低級(jí)錯(cuò)誤以外,如何及時(shí)發(fā)現(xiàn)并避免邏輯錯(cuò)誤成為能否通過(guò)考試的重要因素。
在VFP二級(jí)考試中,SQL語(yǔ)句占了很大的比例,部分考題在需要用SQL語(yǔ)句處理的綜合大題中設(shè)置了很多邏輯陷阱。很多同學(xué)很容易落入陷阱,原因是這部分同學(xué)均用固定的思維去解題,沒(méi)有深入理解知識(shí)點(diǎn),再加上邏輯錯(cuò)誤不像語(yǔ)法錯(cuò)誤那樣有錯(cuò)誤提示,往往他們會(huì)認(rèn)定初步得到的結(jié)果一定會(huì)是正確結(jié)果。但是在部分有邏輯陷阱的考題中,初步求出的結(jié)果并非正確的結(jié)果,這種解題思路很不科學(xué)。下面,我們用兩個(gè)具體實(shí)例來(lái)加以說(shuō)明。
2 實(shí)例及其邏輯陷阱分析
實(shí)例一:在選課表Sc.dbf(見(jiàn)圖1)中查詢既選修了kc0001課程,又選修了kc0002課程的學(xué)生的學(xué)號(hào)。
圖1 選課表Sc.dbf
從題意經(jīng)過(guò)初步分析,考生會(huì)認(rèn)為這是一個(gè)對(duì)課程求條件的邏輯“與”關(guān)系,由此運(yùn)用平時(shí)所學(xué)知識(shí)馬上就可以得到以下代碼:
select 學(xué)號(hào) from Sc where 課程號(hào)=\"kc0001\" and 課程號(hào)=\"kc0002\"
執(zhí)行這段代碼的結(jié)果是一個(gè)空表,即沒(méi)有一個(gè)學(xué)生同時(shí)選修了kc0001和kc0002這兩門(mén)課。然而,回頭再去仔細(xì)地去觀察一下選課表Sc,從表的第一條和第二條記錄發(fā)現(xiàn)學(xué)號(hào)為“010303”的學(xué)生明顯同時(shí)選修了kc0001和kc0002這兩門(mén)課,所以這是一段有邏輯陷阱的錯(cuò)誤的代碼,如果不仔細(xì)校驗(yàn)分析的話,很有可能會(huì)落入一個(gè)事先設(shè)計(jì)好的邏輯陷阱中。下面再來(lái)分析一下代碼的執(zhí)行過(guò)程,在VFP的查詢過(guò)程中記錄指針是從第一條記錄掃描到最后一條的,當(dāng)記錄指針指向第一條記錄時(shí),條件“課程號(hào)=’kc0001’”滿足,但是條件“課程號(hào)=’kc0002’”并不滿足,兩個(gè)條件只滿足一個(gè),不符合代碼中的and“與”條件,所以沒(méi)有查詢結(jié)果;同理,記錄指針掃描到第二條時(shí)也只滿足“課程號(hào)=’kc0002’”這一個(gè)條件,同樣會(huì)沒(méi)有查詢結(jié)果。于是學(xué)號(hào)為“010303”的這個(gè)同學(xué)就被忽略掉,所以這種解題思路是完全錯(cuò)誤的。正確的解題思路是分別查找出選修了kc0001和kc0002這兩門(mén)課的學(xué)生,得到兩個(gè)查詢結(jié)果集合,如果有一個(gè)學(xué)號(hào)同時(shí)在兩個(gè)集合中出現(xiàn)的話就證明這個(gè)學(xué)生一定選修了這兩門(mén)課。具體可以用以下這個(gè)SQL嵌套語(yǔ)句來(lái)實(shí)現(xiàn)以上思路:
Select 學(xué)號(hào) from sc where 課程號(hào)=\"kc0001\" and 學(xué)號(hào) in (select 學(xué)號(hào) from sc where 課程號(hào)=\"kc0002\")
運(yùn)行以上代碼,查詢得到學(xué)號(hào)為“010303”的這個(gè)同學(xué)滿足考題要求。
實(shí)例二:用SQL語(yǔ)句查詢訂單表Orders.dbf(見(jiàn)圖2)中每個(gè)職工所經(jīng)手的具有最高金額的訂單信息。
圖2 訂單表Orders.dbf
對(duì)于這個(gè)考題,首先會(huì)想到將所有數(shù)據(jù)按職工號(hào)進(jìn)行分組,然后在每個(gè)小組內(nèi)利用最大值函數(shù)max()求出小組內(nèi)最高金額的相關(guān)記錄信息,經(jīng)過(guò)簡(jiǎn)單的分析,寫(xiě)出下列代碼:
select 職工號(hào),供應(yīng)商號(hào),訂購(gòu)單號(hào),訂購(gòu)日期,max(金額) as 金額 from orders group by 職工號(hào)
運(yùn)行代碼后得到圖3的查詢結(jié)果?,F(xiàn)在回到圖2訂單表Orders中去觀察一下,好像查詢結(jié)果沒(méi)有任何的錯(cuò)誤,訂單表中只有兩種職工號(hào),而且查詢得到的結(jié)果也是每個(gè)職工的最高金額。的確,職工號(hào)為e1的職工記錄沒(méi)有問(wèn)題,但是經(jīng)過(guò)仔細(xì)對(duì)比查詢結(jié)果和訂單表就會(huì)發(fā)現(xiàn)e2的最高金額為23000,是訂單表的第二條記錄,這條記錄所對(duì)應(yīng)的元組是(e2,s1,or18,2000/07/20,23000),在查詢結(jié)果中e2所對(duì)應(yīng)的元組卻是(e2,s2,or11,2001/02/10,23000),可以清楚地看出兩個(gè)元組中供應(yīng)商號(hào)、訂購(gòu)單號(hào)、訂購(gòu)日期是不匹配的,而查詢結(jié)果中的這個(gè)元組記錄在訂單表里根本就沒(méi)有出現(xiàn)過(guò),所以在這個(gè)錯(cuò)誤的查詢結(jié)果中也有一個(gè)很深的邏輯陷阱。
圖3 查詢結(jié)果
現(xiàn)在來(lái)分析一下,已知VFP查詢時(shí)記錄指針是從第一條記錄掃描到最后一條的,在分組以后,每個(gè)小組內(nèi),記錄指針同理也是從第一條記錄掃描到最后一條,所以,最后的查詢結(jié)果中顯示的“職工號(hào),供應(yīng)商號(hào),訂購(gòu)單號(hào),訂購(gòu)日期”相關(guān)信息一定是小組內(nèi)最后一條記錄的相關(guān)信息,即是訂單表Orders中第四條記錄的部分信息,而max(金額)則是選出職工e3的所有記錄中金額字段的最大值23000,然后與前面的查詢出來(lái)的部分信息拼合成了一條元組,很明顯,如果最大金額不存在于組內(nèi)的最后一條記錄中時(shí),查詢出來(lái)的結(jié)果一定是一個(gè)錯(cuò)誤的拼合元組。
正確的解題思路是,首先查出每個(gè)職工的最高金額生成一個(gè)臨時(shí)表temp(見(jiàn)圖4),然后用這個(gè)臨時(shí)表和原來(lái)的訂單表作一個(gè)內(nèi)聯(lián)結(jié)查詢(見(jiàn)圖5)。代碼如下:
select 職工號(hào),max(金額) as 最高金額 from orders group by 職工號(hào) into table temp
圖4 臨時(shí)表temp.dbf
select orders.* from orders inner join temp on orders.職工號(hào)= temp.職工號(hào) where 金額=最高金額
圖5 查詢結(jié)果
3 經(jīng)驗(yàn)總結(jié)
從以上兩個(gè)實(shí)例分析發(fā)現(xiàn),在開(kāi)始的錯(cuò)誤代碼中是沒(méi)有語(yǔ)法錯(cuò)誤的,它也會(huì)得到一個(gè)結(jié)果,而且這個(gè)結(jié)果和正確的結(jié)果很近似,但在考試中這個(gè)錯(cuò)誤的結(jié)果會(huì)使整個(gè)大題全部丟分,而在今后的工作生活中,錯(cuò)誤的結(jié)果會(huì)使生產(chǎn)蒙受巨大損失,因此為了發(fā)現(xiàn)代碼中的這些邏輯陷阱,避免在數(shù)據(jù)處理時(shí)犯錯(cuò),應(yīng)從以下幾個(gè)方面進(jìn)行改進(jìn)。
3.1 保障學(xué)風(fēng),提高學(xué)生學(xué)習(xí)興趣
好的開(kāi)端是成功的一半!在VFP這門(mén)課開(kāi)課之初老師必須告訴學(xué)生,這門(mén)課和其他課程不一樣,對(duì)待它不能只是期末考試60分萬(wàn)歲,要正確認(rèn)識(shí)這門(mén)課和NCRE之間的關(guān)系,端正學(xué)習(xí)態(tài)度,樹(shù)立優(yōu)良的學(xué)風(fēng),在學(xué)習(xí)這門(mén)課的伊始就抱著去參加NCRE的心態(tài)去學(xué)習(xí)基礎(chǔ)知識(shí)。同時(shí)還要告訴學(xué)生這門(mén)課程對(duì)于絕大部分人來(lái)說(shuō)起點(diǎn)都是一樣的,很多內(nèi)容大家都是從零開(kāi)始學(xué)習(xí),不存在基礎(chǔ)好壞的因素,通過(guò)鼓勵(lì)來(lái)調(diào)動(dòng)學(xué)生學(xué)習(xí)的主動(dòng)性和自覺(jué)性,以達(dá)到學(xué)生能真正用心、主動(dòng)地自主學(xué)習(xí)。有條件的學(xué)校還可以嘗試在學(xué)校利用評(píng)優(yōu)、課程免修等多個(gè)方面的行政方式去進(jìn)一步激勵(lì)學(xué)生的學(xué)習(xí)興趣。
3.2 加強(qiáng)實(shí)踐練習(xí),提高學(xué)生邏輯思維能力
這門(mén)課除了要學(xué)習(xí)課本上的基礎(chǔ)知識(shí)點(diǎn)外,還必須注重上機(jī)實(shí)踐能力的練習(xí),這樣才能與二級(jí)考試的特點(diǎn)實(shí)踐性、操作性相吻合。在NCRE中程序設(shè)計(jì)和SQL語(yǔ)句已是考試的難點(diǎn),再用其解決實(shí)際問(wèn)題更是不易,唯有通過(guò)大量的練習(xí)反復(fù)的上機(jī)實(shí)踐操作才能真正地理解掌握。
在平時(shí)實(shí)踐教學(xué)課中,提醒學(xué)生在每次上機(jī)實(shí)踐課前必須先復(fù)習(xí)學(xué)過(guò)的知識(shí)點(diǎn),預(yù)習(xí)本次上機(jī)實(shí)踐的相關(guān)知識(shí)點(diǎn),做到有的放矢,不浪費(fèi)上機(jī)實(shí)踐的每一分鐘。在充分利用實(shí)踐課的同時(shí),在課外也要加強(qiáng)實(shí)踐課程的練習(xí),對(duì)上課時(shí)沒(méi)學(xué)懂的知識(shí)加以理解深化,分析錯(cuò)誤原因,總結(jié)編程的經(jīng)驗(yàn),這樣就一定能夠?qū)W好這門(mén)課程。除此之外,老師還應(yīng)該系統(tǒng)地引入與本次實(shí)踐課相關(guān)聯(lián)的部分NCRE二級(jí)考試真題,用剛剛教學(xué)的知識(shí)去詳細(xì)地加以歸納講解,讓學(xué)生在學(xué)習(xí)各個(gè)章節(jié)的內(nèi)容時(shí)就有了解決具體問(wèn)題的邏輯思維能力,在課程教學(xué)結(jié)束后能夠綜合各方面的知識(shí),用獨(dú)立的思路去嘗試解決相類(lèi)似的問(wèn)題,提高邏輯思維能力。
3.3 學(xué)會(huì)檢查,養(yǎng)成良好習(xí)慣
從前面的兩個(gè)實(shí)例中還可以看出數(shù)據(jù)處理是一項(xiàng)非常重要的工作,必須小心謹(jǐn)慎,稍不留神就會(huì)造成非常嚴(yán)重的錯(cuò)誤,特別是在用SQL語(yǔ)句處理多個(gè)表的數(shù)據(jù)時(shí)會(huì)有一些意想不到的邏輯錯(cuò)誤隱藏在語(yǔ)句中。由于數(shù)據(jù)模型的原因,非常有經(jīng)驗(yàn)的程序員都可能會(huì)陷入這些邏輯陷阱中,更別說(shuō)剛剛才學(xué)VFP的學(xué)生,這個(gè)邏輯錯(cuò)誤會(huì)使最終的數(shù)據(jù)表發(fā)生錯(cuò)誤,這就是為什么有很多考生自我感覺(jué)良好卻沒(méi)有及格的原因。因此,為了有效地避免落入這些邏輯陷阱,只有先分析羅列出數(shù)據(jù)的不同組織形態(tài),然后對(duì)算出的結(jié)果進(jìn)行反復(fù)地校驗(yàn),這樣才能確保代碼的正確性。
在具體的NCRE二級(jí)考題中,數(shù)據(jù)表的數(shù)量有限、內(nèi)容也不龐大,可以先打開(kāi)考題所涉及到的幾個(gè)表,然后通過(guò)仔細(xì)觀察分析得到一個(gè)正確的結(jié)果。經(jīng)過(guò)仔細(xì)地對(duì)比分析兩種結(jié)果后,如果發(fā)現(xiàn)通過(guò)執(zhí)行代碼生成的結(jié)果和分析的結(jié)果不一樣,那就可以確定這段代碼一定有邏輯陷阱隱藏在里面,這時(shí)考生就可以重新分析這幾個(gè)表的結(jié)構(gòu),通過(guò)觀察代碼的執(zhí)行過(guò)程,結(jié)合平時(shí)所學(xué)知識(shí)分析邏輯陷阱的位置,更新代碼以獲得正確結(jié)果。
總的來(lái)說(shuō),數(shù)據(jù)處理的步驟分以下兩步:先靜觀默察,嫻熟于心,一揮而就;再仔細(xì)校驗(yàn)結(jié)果,避免落入邏輯陷阱!
參考文獻(xiàn)
[1] 薩師煊,王珊.?dāng)?shù)據(jù)庫(kù)系統(tǒng)概論[M].北京:高等教育出版社,1997.
[2] 王利.全國(guó)計(jì)算機(jī)等級(jí)考試二級(jí)教程—VFP程序設(shè)計(jì)[M].北京:高等教育出版社,2005.
[3] 張洪舉.Visual FoxPro程序設(shè)計(jì)參考手冊(cè)[M].北京:人民郵電出版社,2004.