Trong lập trình, chúng ta thường gặp những đoạn chương trình được lặp đi lặp lại nhiều lần ở những vị trí khác nhau. Để tránh phải viết lại những đoạn chương trình lặp lại đó cũng như giúp việc bổ sung, sửa chữa được thuận lợi hơn thì những đoạn chương trình đó sẽ được thay thế bằng các chương trình con tương ứng. Khi cần thiết, chúng ta chỉ việc sử dụng lời gọi chương trình con đó với các tham số cụ thể tùy vào từng hoàn cảnh sử dụng mà không cần phải viết lại đoạn lệnh đó. Trong Pascal, các chương trình con chuẩn được phân loại và chứa trong các đơn vị chương trình Unit như CRT, DOS, PRINTER...
Một lý do khác để chúng ta xây dựng chương trình con là một bài toán lớn, phức tạp sẽ tương ứng với một chương trình lập trình với số lượng rất lớn các dòng lệnh và rất dài. Do đó, việc nhìn tổng quan cả chương trình cũng như việc gỡ rối, hiệu chỉnh sẽ gặp rất nhiều khó khăn. Chúng ta có thể phân chia bài toán lớn, phức tạp đó thành các bài toán nhỏ, đơn giản hơn, dễ thực hiện hơn để dễ kiểm tra, gỡ rối từng khối và sau đó ghép lại thành chương trình lớn. Việc chia nhỏ một chương trình lớn thành các chương trình con (modul) có thể được hiểu như phương pháp “chia để trị” trong các bài toán thực tế.
Trong khoa học máy tính, một chương trình con (hay còn gọi là subroutine) là một đoạn chương trình được đóng gói thành một đơn vị chương trình, nó thực hiện một số tác vụ cụ thể mà chương trình cần thực hiện nhiều lần từ nhiều nơi trong thời gian chạy của nó.
Trong Pascal có hai loại chương trình con là hàm (Function) và thủ tục (Procedure).
- Thủ tục (hay còn gọi là Procedure) là chương trình con cho phép thực hiện một hay một số công việc nào đó. Thủ tục phải được chương trình chính hoặc chương trình con khác sử dụng lời gọi để thực hiện.
- Hàm (hay còn gọi là Function) là chương trình con cho phép thực hiện một hay một số công việc. Hàm thường trả về giá trị cho một biến được gán cho hàm. Sự khác nhau cơ bản và duy nhất giữa hàm và thủ tục là hàm trả lại một giá trị kết quả vô hướng thông qua tên của hàm và do đó nó được sử dụng trong một biểu thức. Còn thủ tục không trả lại kết quả thông qua tên của nó nên các thủ tục không thể viết trong các biểu thức.
113
Ví dụ: Chương trình con tính cos(x) thuộc loại chương trình con là hàm, hàm có tên là cos với tham số là x. Trong khi đó, chúng ta thường sử dụng lệnh Read, Readln, Write, Writeln là các thủ tục.
Theo quy định của Pascal chuẩn, cấu trúc chung của một chương trình với các cách mô tả và khai báo như sau:
Program Ten_chuong_trinh; Label (* Khai báo các nhãn*); Const (* Khai báo các hằng*);
Type (* Khai báo kiểu dữ liệu người dùng*); Var (* Khai báo biến nhớ*);
(*---Các chương trình con----*)
Procedure Tên_thủ_tục(Khai báo các tham số - nếu cần): kiểu_dữ_liệu;
(* Khai báo Label, Const, Type, Var của riêng Procedure*) Begin
....(* Thân chương trình con – thủ tục*) End;
(*---*)
Function Tên_hàm(Khai báo các tham số - nếu cần): kiểu_dữ_liệu;
(* Khai báo Label, Const, Type, Var của riêng Procedure*) Begin
....(* Thân chương trình con – hàm*) End;
(*---Kết thúc khai báo các chương trình con----*) (*---Phần thân chương trình chính----*)
BEGIN
...(*Thân chương trình chính, lời gọi các chương trình con*) END.
114
Cũng theo quy định này, thứ tự các phần mô tả và khai báo phải theo đúng trật tự như trên, cụ thể các phần khai báo như sau:
1) Khai báo nhãn LABEL;
2) Khai báo hằng CONST;
3) Khai báo kiểu dữ liệu TYPE;
4) Khai báo biến VAR.
Mỗi loại chỉ được xuất hiện một lần, phần nào không có thì bỏ. Sau khi khai báo xong là đến thứ tự các hàm và thủ tục. Trong Turbo Pascal (và FreePascal), còn cho phép phần khai báo được tự do hơn, không nhất thiết phải theo thứ tự bắt buộc nêu trên và không nhất thiết phải khai báo các phần một lần.