文章編號:1672-5913(2008)20-0148-03
摘 要:本文簡要介紹了當前VFP教學和NCRE考試的現狀,通過具體實例詳細闡述NCRE二級VFP機試中部分邏輯陷阱,探討VFP教學的特點,并由此深入分析如何及時發現并避免犯錯。
關鍵詞:NCRE;VFP;邏輯陷阱;實踐教學;數據校驗
中圖分類號:G642 文獻標識碼:B
全國計算機等級考試(National Computer Rank Examin-
ation,簡稱NCRE)是由教育部考試中心主辦,面向社會考查計算機應用知識與能力的全國性計算機水平考試體系。NCRE二級證書是具有基本計算機使用能力的社會通用標準,是職務晉升、職稱評定、崗位競聘的重要依據。VFP是NCRE二級考試語種之一,由于部分VFP上機考題中隱藏了很深的邏輯陷阱,所以它成了阻礙獲取證書的主要因素,因此認真分析考題、反復校驗結果來避免落入邏輯陷阱已經成為數據處理的基本方法。
1 VFP教學和考試現狀簡介
1.1 VFP教學現狀
數據庫技術是計算機專業的基礎課程之一,它所研究的問題就是如何科學地組織和存儲數據,如何高效地獲取和處理數據,如何更廣泛、更安全地共享數據。VFP是目前最流行的數據庫管理系統之一,是一種支持面向對象程序設計的可視化高級程序設計語言,是大學非工科專業學生必修的計算機課程,也是目前NCRE二級報考人數最多的語種。
1.2 VFP二級考試特點
報考VFP的絕大部分是非工科的考生,他們普遍缺乏計算機編程思維,部分考生在考試結束后自我感覺良好,最終卻沒有通過考試,除了粗心大意犯低級錯誤以外,如何及時發現并避免邏輯錯誤成為能否通過考試的重要因素。
在VFP二級考試中,SQL語句占了很大的比例,部分考題在需要用SQL語句處理的綜合大題中設置了很多邏輯陷阱。很多同學很容易落入陷阱,原因是這部分同學均用固定的思維去解題,沒有深入理解知識點,再加上邏輯錯誤不像語法錯誤那樣有錯誤提示,往往他們會認定初步得到的結果一定會是正確結果。但是在部分有邏輯陷阱的考題中,初步求出的結果并非正確的結果,這種解題思路很不科學。下面,我們用兩個具體實例來加以說明。
2 實例及其邏輯陷阱分析
實例一:在選課表Sc.dbf(見圖1)中查詢既選修了kc0001課程,又選修了kc0002課程的學生的學號。

圖1 選課表Sc.dbf
從題意經過初步分析,考生會認為這是一個對課程求條件的邏輯“與”關系,由此運用平時所學知識馬上就可以得到以下代碼:
select 學號 from Sc where 課程號=\"kc0001\" and 課程號=\"kc0002\"
執行這段代碼的結果是一個空表,即沒有一個學生同時選修了kc0001和kc0002這兩門課。然而,回頭再去仔細地去觀察一下選課表Sc,從表的第一條和第二條記錄發現學號為“010303”的學生明顯同時選修了kc0001和kc0002這兩門課,所以這是一段有邏輯陷阱的錯誤的代碼,如果不仔細校驗分析的話,很有可能會落入一個事先設計好的邏輯陷阱中。下面再來分析一下代碼的執行過程,在VFP的查詢過程中記錄指針是從第一條記錄掃描到最后一條的,當記錄指針指向第一條記錄時,條件“課程號=’kc0001’”滿足,但是條件“課程號=’kc0002’”并不滿足,兩個條件只滿足一個,不符合代碼中的and“與”條件,所以沒有查詢結果;同理,記錄指針掃描到第二條時也只滿足“課程號=’kc0002’”這一個條件,同樣會沒有查詢結果。于是學號為“010303”的這個同學就被忽略掉,所以這種解題思路是完全錯誤的。正確的解題思路是分別查找出選修了kc0001和kc0002這兩門課的學生,得到兩個查詢結果集合,如果有一個學號同時在兩個集合中出現的話就證明這個學生一定選修了這兩門課。具體可以用以下這個SQL嵌套語句來實現以上思路:
Select 學號 from sc where 課程號=\"kc0001\" and 學號 in (select 學號 from sc where 課程號=\"kc0002\")
運行以上代碼,查詢得到學號為“010303”的這個同學滿足考題要求。
實例二:用SQL語句查詢訂單表Orders.dbf(見圖2)中每個職工所經手的具有最高金額的訂單信息。

圖2 訂單表Orders.dbf
對于這個考題,首先會想到將所有數據按職工號進行分組,然后在每個小組內利用最大值函數max()求出小組內最高金額的相關記錄信息,經過簡單的分析,寫出下列代碼:
select 職工號,供應商號,訂購單號,訂購日期,max(金額) as 金額 from orders group by 職工號
運行代碼后得到圖3的查詢結果。現在回到圖2訂單表Orders中去觀察一下,好像查詢結果沒有任何的錯誤,訂單表中只有兩種職工號,而且查詢得到的結果也是每個職工的最高金額。的確,職工號為e1的職工記錄沒有問題,但是經過仔細對比查詢結果和訂單表就會發現e2的最高金額為23000,是訂單表的第二條記錄,這條記錄所對應的元組是(e2,s1,or18,2000/07/20,23000),在查詢結果中e2所對應的元組卻是(e2,s2,or11,2001/02/10,23000),可以清楚地看出兩個元組中供應商號、訂購單號、訂購日期是不匹配的,而查詢結果中的這個元組記錄在訂單表里根本就沒有出現過,所以在這個錯誤的查詢結果中也有一個很深的邏輯陷阱。

圖3 查詢結果
現在來分析一下,已知VFP查詢時記錄指針是從第一條記錄掃描到最后一條的,在分組以后,每個小組內,記錄指針同理也是從第一條記錄掃描到最后一條,所以,最后的查詢結果中顯示的“職工號,供應商號,訂購單號,訂購日期”相關信息一定是小組內最后一條記錄的相關信息,即是訂單表Orders中第四條記錄的部分信息,而max(金額)則是選出職工e3的所有記錄中金額字段的最大值23000,然后與前面的查詢出來的部分信息拼合成了一條元組,很明顯,如果最大金額不存在于組內的最后一條記錄中時,查詢出來的結果一定是一個錯誤的拼合元組。
正確的解題思路是,首先查出每個職工的最高金額生成一個臨時表temp(見圖4),然后用這個臨時表和原來的訂單表作一個內聯結查詢(見圖5)。代碼如下:
select 職工號,max(金額) as 最高金額 from orders group by 職工號 into table temp

圖4 臨時表temp.dbf
select orders.* from orders inner join temp on orders.職工號= temp.職工號 where 金額=最高金額

圖5 查詢結果
3 經驗總結
從以上兩個實例分析發現,在開始的錯誤代碼中是沒有語法錯誤的,它也會得到一個結果,而且這個結果和正確的結果很近似,但在考試中這個錯誤的結果會使整個大題全部丟分,而在今后的工作生活中,錯誤的結果會使生產蒙受巨大損失,因此為了發現代碼中的這些邏輯陷阱,避免在數據處理時犯錯,應從以下幾個方面進行改進。
3.1 保障學風,提高學生學習興趣
好的開端是成功的一半!在VFP這門課開課之初老師必須告訴學生,這門課和其他課程不一樣,對待它不能只是期末考試60分萬歲,要正確認識這門課和NCRE之間的關系,端正學習態度,樹立優良的學風,在學習這門課的伊始就抱著去參加NCRE的心態去學習基礎知識。同時還要告訴學生這門課程對于絕大部分人來說起點都是一樣的,很多內容大家都是從零開始學習,不存在基礎好壞的因素,通過鼓勵來調動學生學習的主動性和自覺性,以達到學生能真正用心、主動地自主學習。有條件的學校還可以嘗試在學校利用評優、課程免修等多個方面的行政方式去進一步激勵學生的學習興趣。
3.2 加強實踐練習,提高學生邏輯思維能力
這門課除了要學習課本上的基礎知識點外,還必須注重上機實踐能力的練習,這樣才能與二級考試的特點實踐性、操作性相吻合。在NCRE中程序設計和SQL語句已是考試的難點,再用其解決實際問題更是不易,唯有通過大量的練習反復的上機實踐操作才能真正地理解掌握。
在平時實踐教學課中,提醒學生在每次上機實踐課前必須先復習學過的知識點,預習本次上機實踐的相關知識點,做到有的放矢,不浪費上機實踐的每一分鐘。在充分利用實踐課的同時,在課外也要加強實踐課程的練習,對上課時沒學懂的知識加以理解深化,分析錯誤原因,總結編程的經驗,這樣就一定能夠學好這門課程。除此之外,老師還應該系統地引入與本次實踐課相關聯的部分NCRE二級考試真題,用剛剛教學的知識去詳細地加以歸納講解,讓學生在學習各個章節的內容時就有了解決具體問題的邏輯思維能力,在課程教學結束后能夠綜合各方面的知識,用獨立的思路去嘗試解決相類似的問題,提高邏輯思維能力。
3.3 學會檢查,養成良好習慣
從前面的兩個實例中還可以看出數據處理是一項非常重要的工作,必須小心謹慎,稍不留神就會造成非常嚴重的錯誤,特別是在用SQL語句處理多個表的數據時會有一些意想不到的邏輯錯誤隱藏在語句中。由于數據模型的原因,非常有經驗的程序員都可能會陷入這些邏輯陷阱中,更別說剛剛才學VFP的學生,這個邏輯錯誤會使最終的數據表發生錯誤,這就是為什么有很多考生自我感覺良好卻沒有及格的原因。因此,為了有效地避免落入這些邏輯陷阱,只有先分析羅列出數據的不同組織形態,然后對算出的結果進行反復地校驗,這樣才能確保代碼的正確性。
在具體的NCRE二級考題中,數據表的數量有限、內容也不龐大,可以先打開考題所涉及到的幾個表,然后通過仔細觀察分析得到一個正確的結果。經過仔細地對比分析兩種結果后,如果發現通過執行代碼生成的結果和分析的結果不一樣,那就可以確定這段代碼一定有邏輯陷阱隱藏在里面,這時考生就可以重新分析這幾個表的結構,通過觀察代碼的執行過程,結合平時所學知識分析邏輯陷阱的位置,更新代碼以獲得正確結果。
總的來說,數據處理的步驟分以下兩步:先靜觀默察,嫻熟于心,一揮而就;再仔細校驗結果,避免落入邏輯陷阱!
參考文獻
[1] 薩師煊,王珊.數據庫系統概論[M].北京:高等教育出版社,1997.
[2] 王利.全國計算機等級考試二級教程—VFP程序設計[M].北京:高等教育出版社,2005.
[3] 張洪舉.Visual FoxPro程序設計參考手冊[M].北京:人民郵電出版社,2004.