Do tách riêng việc giải phương trình ax+b=0 thành một thủ tục nên số 
lệnh trong thân chương trình chính giảm đi, nổi bật được thuật toán chính 
của chương trình.
Ở đây, ta chọn chương trình con Giaipt là thủ tục chứ không phải là hàm 
vì phương trình ax+b=0 có thể vô nghiệm hoặc vô số nghiệm (khi a=0). 
Thành ra ta không tìm được một gía trị thích hợp để gán cho tên hàm. Vậy 
kết qủa giải phương trình phải xuất ra ngay trong chương trình con, đó là 
công việc của thủ tục
                
              
                                            
                                
            
 
            
                 12 trang
12 trang | 
Chia sẻ: maiphuongdc | Lượt xem: 8793 | Lượt tải: 1 
              
            Bạn đang xem nội dung tài liệu Pascal - Thủ tục (procedure), để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
THỦ TỤC (Procedure) 
 12.3.1. Thủ tục và cách khai báo: 
 Giống như hàm, thủ tục cũng là một chương trình con, song thủ tục khác 
hàm ở chỗ: nếu như hàm luôn trả về một gía trị duy nhất thông qua tên hàm 
thì thủ tục lại không trả về?một gía trị nào thông qua tên gọi của nó. 
 Một thủ tục thực chất là một nhóm các lệnh được sắp xếp theo một trình 
tự nhất định có tác dụng giải quyết một nhiệm vụ cụ thể, và được đặt một cái 
tên để gọi. Trong đời sống hàng ngày, ta thường nghe nói đến thủ tục nhập 
học của sinh viên, thủ tục mua bán nhà đất, thủ tục xuất cảnh, thủ tục nhập 
cảnh,.v.v. mỗi thủ tục đó là một dãy có trình tự các công việc phải làm. 
 Thủ tục Readln(x, y, z) có nhiệm vụ nhập các gía trị từ bàn phím cho các 
biến x, y, z. Thủ tục Write(x, y, z) in gía trị của x, y, z . Thủ tục Gotoxy(x, y) 
định vị con trỏ vào toạ độ cột x, dòng y trên màn hình. Thủ tục Clrscr thì chỉ 
đơn giản là xóa màn hình .v.v. . Như vậy thủ tục có thể không có tham số 
hoặc có từ một đến nhiề? tham số. 
 Khi gọi thực hiện một thủ tục, ta viết tên thủ tục đó và thay các tham số 
hình thức bằng các tham số thực sự, kết thúc bằng dấu chấm phẩy ";" . 
 Ví dụ, nếu a, b là hai biến đã được khai báo trong chương trình thì để 
nhập dữ liệu cho hai biến a, b ta viết : 
 Readln(a, b); 
 Ðể in biểu thức 4+5*6 lên màn hình, ta viết : 
 Write(4+5*6); 
 Ðể đặt con trỏ vào vị trí cột 8, dòng 2 trên màn hình ta viết: 
 Gotoxy(8, 2); 
 Như vậy, lời gọi thủ tục là một lệnh đơn giản. 
 Do thủ tục không trả về gía trị nào thông qua tên gọi của nó nên tên thủ 
tục không thể đứng trong các biểu thức. Ví dụ các lệnh sau là sai cú pháp: 
 St1 := Delete( St, 1, 1); 
 Write( Val(‘123’, x, k) ); 
vì Delete và Val là hai thủ tục chứ không phải là hai hàm. 
 Ngoài các thủ tục chuẩn đã có sẵn trong Turbo Pascal, người thảo chương 
có thể tự xây dựng các thủ tục mới nhưng phải khai báo theo cú pháp sau: 
 Procedure Tênthủtục( tênthamsố : kiểuthamsố ) ; 
 { Các khai báo Const, Type, Var dùng trong thủ tục } 
 Begin 
 {Các lệnh của thủ tục } 
 End; 
 Ðoạn khai báo trên phải được đặt sau phầ? khai báo VAR và trước 
BEGIN của thân chương trình chính. 
12.3.2. Các ví dụ về thủ tục : 
 Ví dụ 12.4: 
Giải và biện luận phương trình ax+b= 0 với a=4.5, b=13.5, và với các cặp a, 
b tạo bởi a=-1, a=0, a=1, b=0, b=1, b=2. 
 Ta viết một thủ tục có nhiệm vụ giải và biện luận phương trình ax+b=0 
với hai tham số a, b tùy ý, và gọi thực hiện thủ tục này 10 lần ứng với các 
gía trị cụ thể của a, b cho trong gỉa thiết. 
 PROGRAM VIDU12_4; 
 { Giải phương trình AX+B=0 bằng thủ tục} 
 Uses Crt; 
 Var 
 i, j: integer; 
 Procedure Giaipt (a, b: Real); 
 Begin 
 Writeln(' -Giải phương trình : ' , a:4:1, 'x+' , b:4:1, '=0'); 
 If a0 then Writeln(' Nghiem x=', -b/a:4:2) 
 else 
 if b0 then Writeln(' Vo nghiem') 
 else 
 Writeln(' Vo so nghiem'); 
 End; 
 BEGIN { Thân chương trình chính } 
 Clrscr; 
 Writeln(' KẾT QỦA GIẢI CÁC P.TRÌNH:' ) ; 
 Giaipt (4.5, 13.5); 
 For i:=-1 to 1 do 
 For j:=0 to 2 do Giaipt (i, j); 
 Readln; 
 END. 
 Chạy 
 Chép tập tin nguồn 
 Khi gọi Giaipt (4.5, 13.5); là ta yêu cầu máy thực hiện thủ tục Giaipt với 
tham số a=4.5 và b=13.5. Hai vòng lặp For xác định 9 cặp gía trị i, j cụ thể, 
và cứ mỗi lần như vậy lại gọi thực hiện thủ tục Giaipt với tham số a=i, b=j 
tương ứng : 
 For i:=-1 to 1 do 
 For j:=0 to 2 do Giaipt (i, j); 
 Do tách riêng việc giải phương trình ax+b=0 thành một thủ tục nên số 
lệnh trong thân chương trình chính giảm đi, nổi bật được thuật toán chính 
của chương trình. 
 Ở đây, ta chọn chương trình con Giaipt là thủ tục chứ không phải là hàm 
vì phương trình ax+b=0 có thể vô nghiệm hoặc vô số nghiệm (khi a=0). 
Thành ra ta không tìm được một gía trị thích hợp để gán cho tên hàm. Vậy 
kết qủa giải phương trình phải xuất ra ngay trong chương trình con, đó là 
công việc của thủ tục. 
 Ví dụ 12.5: 
Nhập vào một mảng A1, A2,...,An, sắp xếp dãy tăng rồi in dãy lên màn hình. 
Có thể chia bài toán ra thành ba công việc lớn sau: 
 a-Nhập dãy A1, A2,...,An, 
 b-Sắp xếp dãy A1, A2,...,An, tăng 
 c-In dãy A1, A2,...,An, lên màn hình 
 Mỗi công việc a, b, c thuộc về một lãnh vực riêng nên có thể xây dựng 
thành các thủ tục độc lập với nhau. Ðể liên kết chúng lại, trong chương trình 
chính, ta chỉ cần gọi tên các thủ tục này theo thứ tự a, b, c với các tham số 
thích hợp. 
 Khi thiết kế thủ tục sắp xếp dãy tăng, có một việc phải làm nhiều lần là 
đổi chỗ hai phần tử A[i] và A[j] nên cũng có thể xây dựng thành một thủ tục 
gọi tên là Ðổi chỗ, nó lại là chương trình con của thủ tục sắp xếp. Chương 
trình cụ thể như sau: 
PROGRAM VIDU12_5; 
 { Sắp xếp dãy A tăng dần bằng thủ tục } 
Uses CRT; 
Type 
 Kmang = Array[1..20] of Real; 
Var 
 N : Integer; 
 A: Kmang; 
Procedure Nhap(Var X: Kmang ; N: Integer ; ten: Char ); 
 Var 
 i : Integer; 
 Begin 
 For i:=1 to N do { nhập mảng X } 
 begin 
 Write(‘Nhập ‘, ten , ‘[‘ , i , ‘]: ‘); 
 Readln(X[i]); 
 end; 
 End; 
Procedure SapTang( Var X : Kmang ; N: Integer); 
 { Sắp dãy X tăng} 
 Var 
 i, j : Integer; 
 Procedure Doicho(Var u, v : Real) ; 
 { hoán vị các gía trị của u và v} 
 Var 
 Tam: Real; 
 Begin 
 Tam:=u; u:=v; v:=Tam; 
 End; { Hết Doicho } 
 Begin { Vào Saptang } 
 For i:=1 to N-1 do 
 For j:=i+1 to N do 
 If X[i]>X[j] then Doicho(X[i], X[j]) ; 
 End; { Het Saptang } 
Procedure Inday( Chugiai: String ; X: Kmang ; N: Integer); 
 { In dãy X lên màn hình } 
 Var 
 i : Integer; 
 Begin 
 Writeln(Chugiai); 
 For i:=1 to N do write(X[i]:5:1); 
 writeln; 
 End; 
BEGIN { chương trình chính } 
 Clrscr; 
 Repeat 
 Write(‘ Nhập số phần tử N : ‘); 
 Readln(N); 
 Until (N>0) and ( N<21); 
 Nhap( A, N, ‘A’ ); 
 Inday( ‘ Dãy chưa sắp là: ‘, A, N); 
 SapTang( A, N); 
 Inday( ‘ Dãy đã sắp tăng là: ‘ , A, N); 
 Readln; 
END. 
Chạy 
Chép tập tin nguồn 
 Thủ tục Nhap có ba tham số hình thức là X, N và ten, nhiệm vụ của nó là 
nhập dữ liệu cho mảng X gồm N phần tử. Tương tự, thủ tục Saptang có 
nhiệm vụ sắp xếp N phần tử của dãy X thành dãy tăng. Thủ tục Inday sẽ in 
N phần tử của dãy X sau khi đã in lời giải thích chứa trong tham số chugiai . 
 Thủ tục Saptang chứa một thủ tục con là Doicho, có nhiệm vụ hoán vị 
các gía trị của hai biến u, v bất kỳ. Doicho là chương trình con của thủ tục 
Saptang. 
 Khi một tham số đượ? khai báo trong chương trình con, nó có thể có hoặc 
không có từ khóa Var ở đằng trước. Ví dụ trong thủ tục Saptang, tham số X 
đi sau từ khóa Var, còn tham số N thì không. X gọi là tham số biến còn N 
gọi là tham số trị. Sự khác nhau giữa hai loại tham số này sẽ được trình bày 
kỹ ở phần sau. 
            Các file đính kèm theo tài liệu này:
 thu_tuc_7667.pdf thu_tuc_7667.pdf