Giáo án Tin học 11 - Bài 7: Lập trình trong Visual Foxpro

Giáo án Tin học 11 - Bài 7: Lập trình trong Visual Foxpro

I. Tạo và chạy một chương trình

 Visual Foxpro làm việc ở hai chế độ:

o Cửa sổ lệnh - Các lệnh được đưa vào cửa sổ lệnh và thực thi.

o Chương trình - Tập các lệnh được thực hiện theo một thứ tự nào đó.

 Chương trình trong Visual Foxpro được lưu trong các file có phần mở rộng là PRG.

• Tạo một chương trình

Lệnh (từ cửa sổ lệnh)

 

doc 11 trang Người đăng quocviet Lượt xem 2124Lượt tải 0 Download
Bạn đang xem tài liệu "Giáo án Tin học 11 - Bài 7: Lập trình trong Visual Foxpro", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Bài 7 - lập trình trong Visual Foxpro 
I. Tạo và chạy một chương trình 
Visual Foxpro làm việc ở hai chế độ:
Cửa sổ lệnh - Các lệnh được đưa vào cửa sổ lệnh và thực thi. 
Chương trình - Tập các lệnh được thực hiện theo một thứ tự nào đó. 
Chương trình trong Visual Foxpro được lưu trong các file có phần mở rộng là PRG.
Tạo một chương trình
Lệnh (từ cửa sổ lệnh)
MODIFY COMMAND ¿
Trong đó: là tên chương trình
Khi đó xuất hiện cửa sổ soạn thảo cho phép soạn thảo văn bản chương trình.
Kết thúc soạn: Nhấn Ctrl+W để ghi lại.
Sửa chương trình: cũng dùng lệnh MODI COMM 
Một chương trình đơn giản
Chương trình trong Visual Foxpro không qui định theo một cấu trúc nhất định. 
Xét một ví dụ đơn giản sau đây:
* Phần 1 : Bắt đầu
*	 Dùng các lệnh SET để thiết lập môi trường làm việc ...
SET CENTURY ON	&& Hiển thị năm dạng yyyy
SET DATE FREN	&& Hiển thị ngày tháng dạng dd/mm/yyyy
SET EXCLUSIVE ON 	&& Đặt chế độ mở bảng dạng dùng riêng
* Phần 2:	Chuẩn bị dữ liệu
*	Mở các bản cần thiết, đặt quan hệ ....
CLOSE ALL 
SELECT 0
USE Hososv ALIAS SINHVIEN
SET ORDER TO MASV 
SELECT 0
USE diem
SET RELATION TO masv INTO SINHVIEN
* Phần 3: Chương trình chính 
*	Xử lý các yêu cầu đặt ra
BROWSE 	FIELDS masv,SINHVIEN.HOTEN,MAMON,DIEM1 	;
	FOR malop="3H-04" AND mamon="GT101"	;
	TITLE "Bảng điểm môn GT101 - Lớp 3H-04" ;
	NOEDIT
* Phần 4: Kết thúc
*	Đóng các bảng đả mở, thiết lập lại chế độ làm việc ...
USE IN SINHVIEN
USE IN DIEM
RETURN 
Như trên ta thấy chương trình được tổ chức thành 4 phần:
Phần 1: Bắt đầu - chuẩn bị môi trường (sử dụng các lệnh SET)
Phần 2: Chuẩn bị dự liệu (mở các bảng, đặt quan hệ ...)
Phần 3: Thân chương trình (xử lý các yêu cầu đặt ra)
Phần 4: Kết thúc (Đóng các bảng đã mở, trả lại trạng thái ...)
Chạy (thực thi) một chương trình
Lệnh (thực hiện từ cửa sổ lệnh)
DO ¿
II. lệnh có cấu trúc
1. Lệnh IF .. ENDIF
Thực hiện có điều kiện một tập các lệnh dựa vào giá trị của biểu thức logic
Cú pháp:
	IF [THEN]
	Lệnh1
	[ELSE
Lệnh2]
	ENDIF
Trong đó: 
BieuThucLG - Biểu thức logic
BieuThucLG = TRUE Thì các Lệnh1 được thực hiện
BieuThucLG = FALSE và sử dụng mệnh đề ELSE khi đó các Lệnh2 được thực hiện.
Ví dụ 1: Kiểm tra xem có ai sinh nhật vào hôm nay hay không? Nếu có thì hiển thị họ tên người đó. 
SET CENTURY ON	
SET DATE FREN	
SET EXCLUSIVE ON 	
CLOSE ALL 
SELECT 0
USE HOSOSV ALIAS HSSV
LOCA FOR DAY(DATE())=DAY(Ngaysinh) and MONT(DATE())=MONT(Ngaysinh)
IF Found() THEN
 WAIT WIND “Hom nay:”+DTOC(Date()) “la sinh nhat cua:”+HSSV.hoten
ELSE
 WAIT WIND “Khong co ai sinh nhat vao hom nay:”+DTOC(Date())
ENDIF
USE IN HOSOSV
RETURN 
Chú ý: Có thể sử dụng cấu trúc IF ENDIF lồng nhau. 
IF BT1 THEN 	&& IF thứ 1
	....
	IF BT2 THEN	&& IF thứ 2
	....
	ELSE	
	....
	ENDIF	&& Kết thúc IF thứ 2
ELSE
	....
ENDIF	&& Kết thúc IF thứ nhất.
2. Lệnh DO CASE ... ENDCASE
Kiểm tra nhiều điều kiện logic, và thực hiện tập lệnh đầu tiên mà biểu thức logic có giá trị TRUE.
Cú pháp:
	DO CASE
	CASE BieuThucLogic1
	Lệnh 1
	CASE BieuThucLogic2
Lệnh 2
	...
	CASE BieuThucLogicN
Lệnh N
	[ OTHERWISE
	Lệnh N+1 ]
	ENDCASE
Trong đó: 
BieuThucLogicK - Biểu thức logic
Thực hiện lệnh: Kiểm tra từ BieuThucLogic1 đến N nếu tồn tại một BieuThucLogicK =TRUE thì chương trình sẽ thực hiện các câu Lệnh K và kết thúc, trường hợp tất cả các BieuThucLogic=FALSE và sử dụng mệnh đề OTHERWISE thì các Lệnh N+1 được thực hiện.
Ví dụ 2: Tính điểm trung bình chung và tính xếp loại của một sinh viên nào đó.
SET TALK OFF 
CLOSE ALL 
SELECT 0
USE monhoc
SET ORDER TO Ma
SELECT 0
USE diem
SET RELATION TO mamon INTO Monhoc
SUM monhoc.sodvht*diem.diem1,monhoc.sodvht TO tongdiem,tongdvht FOR masv="SV-0624 "
DTBC=tongdiem/tongdvht
DO CASE 
	CASE dtbc>9
	WAIT WINDOW "Xep loai: Xuat sac"
	CASE dtbc>8
	WAIT WINDOW "Xep loai: Gioi"
	CASE dtbc>7
	WAIT WINDOW "Xep loai: Kha"
	CASE dtbc>6
	WAIT WINDOW "Xep loai: Trung Binh Kha"
	CASE dtbc>5
	WAIT WINDOW "Xep loai: Trung Binh"
	OTHERWISE 
	WAIT WINDOW "Xep loai: Yeu"
ENDCASE 
USE IN monhoc
USE IN diem
RETURN 
3. Lệnh DO WHILE ... ENDDO
Thực hiện một tập các lệnh trong vòng lặp có điều kiện.
Cú pháp:
	DO WHILE 
	Lệnh 1 
	[LOOP]
	[EXIT]
	Lệnh 2
	ENDDO
Trong đó: 
BieuThucLogic - Biểu thức logic
Thực hiện: Nếu BieuThucLogic=TRUE sẽ thực các Lệnh 1, Lệnh 2, khi đến ENDDO sẽ quay trở lại kiểm tra BieuThucLogic; trường hợp BieuThucLogic=FALSE sẽ kết thúc lệnh. 
Lệnh LOOP cho phép (ngay lập tức) trở lại bắt đầu vòng lặp (Kiểm tra BieuThucLogic), bỏ qua các lệnh giữa LOOP và ENDDO. Lệnh LOOP có thể đặt vào bất cứ đâu giữa DO WHILE và ENDDO.
Lệnh EXIT cho phép (ngay lập tức) kết thúc lệnh DO WHILE ...ENDDO và bỏ qua các lệnh giữa EXIT và ENDDO. Lệnh EXIT có thể đặt vào bất cứ đâu giữa DO WHILE và ENDDO.
Ví dụ 3: Tìm xem trong danh sách sinh viên có bạn Nữ (Gioi=.T.) nào có điểm trung binhg chung đạt >=8.0?
SET TALK OFF 
CLEAR 
CLEAR ALL 
CLOSE ALL 
SELECT 0
USE monhoc
SET ORDER TO MONLOP && MA+MALOP 
SELECT 0
USE diem
SET RELATION TO mamon+malop INTO Monhoc
SELECT 0
USE Hososv 
GO TOP 
DO WHILE !EOF()
	IF hososv.gioi=.F. Then
	SKIP 
	LOOP 
	ENDIF 
	SELECT diem
	SUM monhoc.sodvht*diem.diem1,monhoc.sodvht ;
 TO tdiem,tdvht FOR masv=Hososv.masv
	dtbc=tongdiem/tongdvht
	IF dtbc>=8 THEN 
	WAIT WINDOW "SV: "+ hososv.hoten +" DTBC: "+ STR(dtbc)
	EXIT 	
	ENDIF 
	SELECT hososv
	SKIP 
ENDDO 
USE IN hososv
USE IN monhoc
USE IN diem
RETURN 
4. Lệnh FOR ... ENDFOR
Thực hiện một tập các lệnh với số lần lặp xác định.
Cú pháp:
	FOR Bien = initValue TO FinalValue [STEP K]	
	Lệnh 1 
	[LOOP]
	[EXIT]
	Lệnh 2
	ENDFOR
Trong đó: 
Bien - Đóng vai trò như một biến đếm, initValue - Giá trị đầu, FinalValue - Giá trị cuối.
Thực hiện: Thực hiện các lệnh giữa FOR và ENDFOR khi biến Bien có giá trị từ initValue đến FinalValue. 
Tham số STEP K qui định bước thay đổi của biến Bien bằng K (K có thể âm), mặc định (khi không thên tùy chọn STEP K) K =1.
Lệnh LOOP cho phép (ngay lập tức) trở lại bắt đầu vòng FOR, bỏ qua các lệnh giữa LOOP và ENDFOR. Lệnh LOOP có thể đặt vào bất cứ đâu giữa FOR và ENDFOR.
Lệnh EXIT cho phép (ngay lập tức) kết thúc lệnh FOR ...ENDFOR và bỏ qua các lệnh giữa EXIT và ENDFOR. Lệnh EXIT có thể đặt vào bất cứ đâu giữa FOR và ENDFOR.
Ví dụ 4: Tính điểm trung bình chung học kỳ 1 năm 2004-2005 của lớp 3E-04.
SET TALK OFF 
SET SAFETY OFF
CLEAR 
CLEAR ALL 
CLOSE ALL 
SELECT 0
USE monhoc
SET ORDER TO MONLOP && MA+MALOP 
SELECT 0
USE diem
SET RELATION TO mamon+malop INTO Monhoc
SET FILTER TO monhoc.hocky=1 AND monhoc.namhoc=2004
SELECT 0
USE Hososv 
COPY TO c:\temp\HOSOLOP FOR malop="3E-04"
USE IN hososv
SELECT 0
USE c:\temp\HOSOLOP ALIAS Hososv EXCLUSIVE 
ALTER table c:\temp\HOSOLOP ADD COLUMN Dtbc N(5,2)
n=RECCOUNT()
FOR i=1 TO n
	SELECT diem
	SUM monhoc.sodvht*diem.diem1,monhoc.sodvht ;
TO tongdiem,tongdvht FOR masv=Hososv.masv
	SELECT hososv
	REPLACE dtbc WITH IIF(tongdvht>0,tongdiem/tongdvht,0)
	SKIP 
ENDFOR 
SELECT Hososv
BROWSE FIELDS masv,hoten,ngaysinh,dtbc ;
 TITLE "Tong ket ket qua hoc ky 1, 2004-2005"
USE IN hososv
USE IN monhoc
USE IN diem
RETURN 
5. Lệnh SCAN ... ENDSCAN
Di chuyển con trỏ bản ghi trên một vùng làm việc nào đó, tương ứng với mỗi bản ghi tìm thấy sẽ thực hiện một tập các lệnh.
Cú pháp:
	SCAN [Scope] [FOR BieuthucLogic]	
	Lệnh 1 
	[LOOP]
	[EXIT]
	Lệnh 2
	ENDSCAN
Trong đó: 
Tùy chọn Scope cho phép xác định phạm vi tác động của lệnh (ALL, NEXT n, RECORD n, REST).
Tùy chọn [FOR BieuThucLogic] cho phép lệnh SCAN duyệt trên các bản ghi thỏa mãn BieuThucLogic. Nếu không đưa tham số này vào thì lệnh SCAN sẽ duyệt trên tất cả các bản ghi.
Thực hiện: (*) Nếu còn bản ghi (trong phạm vi Scope và thỏa mãn BieuThucLogic) trong vùng làm việc -> Thực hiện các lệnh giữa SCAN và ENDSCAN, tiếp đến dịch chuyển con trỏ bản ghi đi 1 vị trí (SKIP 1) rồi trở lại (*); Nếu không còn bản ghi nào-> Kết thúc lệnh SCAN.
Lệnh LOOP cho phép (ngay lập tức) trở lại bắt đầu vòng SCAN bỏ qua các lệnh giữa LOOP và ENDSCAN. Lệnh LOOP có thể đặt vào bất cứ đâu giữa SCAN và ENDSCAN.
Lệnh EXIT cho phép (ngay lập tức) kết thúc lệnh SCAN ...ENDSCAN và bỏ qua các lệnh giữa EXIT và ENDSCAN. Lệnh EXIT có thể đặt vào bất cứ đâu giữa SCAN và ENDSCAN.
Ví dụ 5: Tính điểm trung bình chung học kỳ 1 năm 2004-2005 của lớp 3E-04 (như ví dụ 4 nhưng thay FOR bằng SCAN).
SET SAFETY OFF 
SET TALK OFF 
CLEAR 
CLEAR ALL 
CLOSE ALL 
SELECT 0
USE monhoc
SET ORDER TO MONLOP && MA+MALOP 
SELECT 0
USE diem
SET RELATION TO mamon+malop INTO Monhoc
SET FILTER TO monhoc.hocky=1 AND monhoc.namhoc=2004
SELECT 0
USE Hososv 
COPY TO c:\temp\HOSOLOP FOR malop="3E-04"
USE IN hososv
SELECT 0
USE c:\temp\HOSOLOP ALIAS Hososv EXCLUSIVE 
ALTER table c:\temp\HOSOLOP ADD COLUMN Dtbc N(5,2)
GO TOP
SCAN
	SELECT diem
	SUM monhoc.sodvht*diem.diem1,monhoc.sodvht ;
TO tongdiem,tongdvht FOR masv=Hososv.masv
	SELECT hososv
	REPLACE dtbc WITH IIF(tongdvht>0,tongdiem/tongdvht,0)
ENDSCAN 
SELECT Hososv
BROWSE 	FIELDS masv,hoten,ngaysinh,dtbc ;
TITLE "Tong ket ket qua hoc ky 1, 2004-2005"
USE IN hososv
USE IN monhoc
USE IN diem
RETURN 
III. Chương trình con 
1. Thủ tục (PROCEDURE)
Người sử dụng có thể tạo ra các thủ tục riêng bằng cách sử dụng khai báo PROCEDURE
Cú pháp:
	PROCEDURE 	
	[PARAMETERS ] 
	Lệnh
	[ENDPROC]
Trong đó: 
ProcName: Tên thủ tục (do người sử dụng tự đặt)
Tùy chọn PARAMETERS cho phép khai báo các tham số “hình thức”, các tham số này sẽ nhận giá trị thực từ chương trình chính khi thực hiện lời gọi thủ tục, para1, para2 ,..., paraN là tên các tham số hình thức.
Lời gọi thủ tục: Các thủ tục sau khi hoàn tất có thể được gọi từ một chương trình nào đó. Lời gọi chương trình con có dạng như sau.
DO [With value1, value2 ... valueN]	[IN ProgName]
Trong đó: ProcName là tên thủ tục cần gọi; value1, value ... valueN là giá trị thực được truyền tương ứng cho các tham số hình thức của chương trình con; tùy chọn IN ProgName cho phép xác định file chương trình chứa thủ tục cần gọi (mặc định là trong bản thân chương trình đang thực hiện).
Ví dụ 6: Viết thủ tục cho phép hiển thị thứ (trong tuần) của một ngày nào đó.
CLEAR ALL 
CLOSE ALL 
CLEAR
DO HienThiThu WITH DATE()
* --------------- Khai bao thu tuc -------------------
PROCEDURE HienThiThu
	PARAMETERS date1
	WAIT WINDOW CDOW(Date1)
ENDPROC 
Trong ví dụ trên, date1 là tham số “hình thức” trong thủ tục HienThiNgay và nhận tham số thực là Date() trong lời gọi thủ tục trong chương trình chính. 
Giả sử ví dụ 6 được lưu vào file Vidu6.PRG, khi đó trong một chương trình khác có thể thực hiện lời gọi thủ tục HienThiThu như sau:
DO HienThiThu WITH DATE() IN Vidu6.PRG
Chú ý: Với các tham số hình thức Para1, para2 ... có thể không truyền giá trị cho các tham số này khi thực hiện lời gọi thủ tục, tuy nhiên các tham số khi đó sẽ nhận giá trị FALSE (giá trị Logic) và như vậy rất có thể dẫn đến lỗi.
2. Hàm (FUNCTION)
Ngoài các hàm do Visual Foxpro cung cấp sẵn, người sử dụng có thể tạo ra các thủ tục riêng bằng cách sử dụng khai báo FUNCTION
Cú pháp:
	FUNCTION 	
	[PARAMETERS ] 
	Lệnh
	RETURN 
	[ENDFUNC]
Trong đó: 
FuncName: Tên hàm (do người sử dụng tự đặt)
Tùy chọn PARAMETERS cho phép khai báo các tham số “hình thức”, các tham số này sẽ nhận giá trị thực từ chương trình chính khi thực hiện lời gọi hàm para1, para2 ,..., paraN là tên các tham số hình thức.
BieuThuc: Giá trị của biểu thức này là giá trị trả về của hàm.
Lời gọi hàm: Các hàm tự tạo hoặc hàm do Visual Foxpro cung cấp đều được gọi như sau:
 FuncName(With value1, value2 ... valueN) 
Trong đó: FuncName là tên hàm cần gọi; value1, value ... valueN là giá trị thực được truyền tương ứng cho các tham số hình thức của chương trình con. Lời gọi hàm chỉ tham gia vào trong các biểu thức.
Ví dụ 7: Viết hàm tính tổng của 2 số.
CLEAR ALL 
CLOSE ALL 
CLEAR
a=10
b=20
WAIT WINDOW STR(a)+"+"+STR(b)+"="+STR(tong(a,b))
* --------------- Khai bao ham -------------------
FUNCTION Tong
	PARAMETERS x,y
	RETURN x+y
ENDPROC 
Ví dụ 8: Viết hàm trả về thứ (tiếng việt) của một ngày nào đó.
CLEAR ALL 
CLOSE ALL 
CLEAR
WAIT WINDOW “Hom nay la: ”+ ThuVN(DATE())
* --------------- Khai bao thu tuc -------------------
FUNCTION ThuVN
	PARAMETERS d
	kq=""
	i=DOW(d)
	DO CASE 
	CASE i=1
	kq="Chu Nhat"
	CASE i=2
	kq="Thu Hai"
	CASE i=3
	kq="Thu Ba"
	CASE i=4
	kq="Thu Tu"
	CASE i=5
	kq="Thu Nam"
	CASE i=6
	kq="Thu Sau"
	CASE i=7
	kq="Thu Bay"
	ENDCASE 
	RETURN kq
ENDPROC 
Bài tập
Thực hiện các ví dụ trong bài.
Hoàn thành hàm TENVN đẽ nêu trong bài 3.

Tài liệu đính kèm:

  • docFoxpro bai 7.doc