摘要:VFP等級考試作為普通高校大學生計算機水平測試的標準,越來越受到同學的重視,程序設計又是考察的重點,通過對典型例題的分析,來提高大家的程序設計能力。
關鍵詞:SQL;程序設計;函數
中圖分類號:TP311文獻標識碼:A 文章編號:1009-3044(2008)36-2951-02
The Discussion of VFP Test
WANG Nan
(Department of Electronic information of Professional Technical institute,Anqing 246000,China)
Abstract: College Students pay more attention to the test of VFP which is the standard of the computer level ,and the programming is the focus of the test. The typical example of the analysis is to increase our programming capacity .
Key words: SQL; Progrmming; function
筆者作為一名高校教師,從事了多年的VFP等級考試教學工作,在教學工作中碰到許多程序設計的問題,細細思考之余,通過自己的歸納總結在這里做個小小的分享。
1 SQL查詢之GROUP BY 子句
結構化查詢語言SQL(Stuture Query Language),以其簡單的格式、快捷的速度和強大的查詢功能深受用戶的喜愛 。VFP(Visual Foxpro)是一般數據庫應用系統最常用的開發工具,它支持較為完整的SQL。由于VFP的特殊性以及SQL自身的編程難點,在VFP中利用某些SQL命令查詢時,語法上的錯誤可以通過查閱資料解決,但是由對命令作用范圍的把握不清,由此造成的邏輯錯誤卻很難發現。
例題1:
現有CHENGJI.DBF表(姓名,課程,成績),用于記錄學生的考試成績,其中一個學生可以有多條記錄(登記一個學生的多門成績);KECHENG.DBF表為空表,表(課程,姓名,最高成績)。請先編寫符合下列要求的程序PROG1,PRG:根據CHENGJI表計算每門課程的最高分,并將相應的課程、姓名、最高成績存入kecheng.dbf。
錯解:
SELE 課程,姓名,max(成績)as 最高成績 FROM chengji INTO TABLE kechengGROUP; BY課程
分析:這是典型的SQL類型考題,很多同學和一些對SQL不熟悉的年輕老師都會想當然的認為以上的做法是完全正確的,其實不然。GROUP BY 的意思是按給定的字段進行分組,所謂分組就是將一組類似的記錄壓縮成一個結果記錄,這樣就可以完成基于一組記錄的計算;但是,GROUP BY 子句應該包含SELECT 列表中每個字段,除非列表當中的字段包含在列函數中。由此,可以看出姓名這個字段出現是多余的。舉例:有表1,結構如圖1。
COMMAND窗口執行了如下命令:
SELE 課程,姓名,max(成績)as 最高成績 FROM 表1;
INTO TABLE kechengGROUP BY 課程
打開生成的新表test,對比兩表表如圖2。
由此可知上述命令錯誤。在命令執行的過程,首先按照第一條記錄的課程的字段值’C’來進行組統計,記錄的指針最后指向的是第五條記錄,姓名字段的值由tom變化為jerry,最高成績由MAX()函數求出,但是姓名卻并不是對應的tom,關鍵就是指針發生了變化!對于課程VFP也是這樣。
參考答案如下:
SET TALK OFF
USE chengji IN1
USE kecheng IN2
SELE DIST 課程 FROM chengji INTO ARRAYa
FOR I=1 TOALEN(a)
SELE 1
cj=0
SCAN FOR 課程=a(i)
IF cj<成績
cj=成績
xm=姓名
kc=課程
ENDIF
ENDS
SELE 2
INSERT INTO kecheng VALUE(kc,xm,cj)
ENDF
CLOSE ALL
SET TALK ON
2 隨機函數RAND()
近兩年的上級考試和理論考試中都加強了對RAND()函數的考查,RAND()函數返回是到0到1之間的數,也就是函數的值域是(0,1),開區間:不包含0和1本身。
例題2 (2007年(安徽省)理論考試真題)
請編寫程序產生100個1——50之間的整數,包含1和50本身并求出它們的和。
錯解一:
SET TALK OFF
s=0
FOR I=1 TO 100
x=INT(50*RAND())+1
?x
s=s+x
ENDF
?’100個整數的總和為:’,s
SET TALK ON
分析:INT(50*RAND())+1的取值范圍是(1,51),所以1本身取不到,不符合題意。
錯解二:
SET TALK OFF
s=0
FOR I=1 TO 100
x=INT(60*RAND())
IF x<=50
?x
s=s+x
ENDIF
ENDF
?’100個整數的總和為:’,s
SET TALK ON
分析:x=INT(60*RAND())的取值范圍是[0,59],當取到0的時候不符合題意。
參考答案:
SET TALK OFF
s=0
FOR I=1 TO 100
x=INT(60*RAND())
IF x>=1 .and. x<=50
?x
s=s+x
ELSE
I=I-1
ENDIF
ENDF
?’100個整數的總和為:’,s
SET TALK ON
說明:我們不能保證每次的取值都在1和50之間,FOR循環一共執行100次,所以當取值失敗時,I的值必須回溯的開始的值。即:I=I-1,這樣方能取到100個整數。
3 結束語
通過以上兩個典型例題的分析,讓我們知道只有掌握全面扎實的基礎知識并且多動手,勤思考,才能讓自己的程序設計的能力穩步提高。
參考文獻:
[1] 匡松.Visual FoxPro程序設計教程[M].成都:四川大學出版社.2003.
[2] 史濟民,湯觀全.Visu Foxpro及其應用系統開發[M].北京:清華大學出版社.2002.
[3] 毛一心,等.VisualFoxpm6.0應用爰實倒集錦[M].北京:人民郵電出社.2003.
注:“本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文。”