a. 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 giá trị duy nhất thông qua tên hàm thì thủ tục lại không trả về một giá 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 giá trị từ bàn phím cho các biến x, y, z. Thủ tục Write(x, y, z) in giá 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ều 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ề giá 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:
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ần khai báo VAR và trước BEGIN của thân chương trình chính.
b. Ví dụ về thủ tục Ví dụ 2:
Giải và biện luận phương trình ax+b= 0 với a=3.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 giá trị cụ thể của a, b cho trong giả thiết.
PROGRAM VIDU5_2;
{ 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 a<>0 then Writeln(' Nghiem x=', -b/a:4:2)
else
if b<>0 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 (3.5, 13.5);
For i:=-1 to 1 do
For j:=0 to 2 do Giaipt(i, j); Readln
END.
Khi gọi Giaipt (3.5, 13.5); là ta yêu cầu máy thực hiện thủ tục Giaipt với tham số a=3.5 và b=13.4. Hai vòng lặp For xác định 9 cặp giá 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 giá trị thích hợp để gán cho tên hàm. Vậy kết quả 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.