Giáo trình Lập trình nâng cao trên ngôn ngữ Pascal - Chương 1: Chương trình con - Thủ tục và hàm
Khái niệm chương trình con ñã ñược trình bày trong môn học Tin học ñại cương, do vậy
trong chương này chúng ta nhắc lại sơqua một sốkhái niệm cũvà dành thời gian cho việc tìm
hiểu sâu vềtham số(tham biến và tham trị), lời gọi chương trình con, cách thức bốtrí
chương trình con trong thân chương trình mẹ. Sau khi học chương này bạn ñọc cần nắm ñược
các nội dung chủyếu sau:
Thếnào là biến toàn cục, biến ñịa phương
Các biến toàn cục và biến ñịa phương ñược bốtrí ở ñâu
Tầm tác dụng của từng loại biến
Thứtựxây dựng các chương trình con có ảnh hưởng thếnào ñến toàn bộchương
trình
Thếnào là tính ñệquy của chương trình con
Lời gọi chương trình con thếnào là ñược phép
Cách khai báo trước ñểgọi chương trình con không theo thứtựthiết kế
(tức là tên chương trình con) có thể tạo nên một câu lệnh, ví dụ: Readln; Gotoxy(5,8); Nếu chương trình con là hàm thì tên hàm không thể tạo nên một câu lệnh, nói khác ñi tên hàm phải nằm trong một biểu thức hay trong một thủ tục nào ñó, ví dụ với hàm khai căn bậc hai SQRT() chúng ta không thể viết sqrt(9); ðiều này là dễ hiểu vì hàm cho ta giá trị vô hướng, giá trị này không phải là một lệnh do ñó Pascal không biết phải làm gì với giá trị ñó. Cách gọi hàm như sau là hợp lệ: a:= sqrt(9) + 5; Witeln('Can bac hai cua 9 bang ',sqrt(9)); 7.2 Gọi chương trình con từ chương trình con khác Các chương trình con cùng cấp có thể gọi tới nhau và truyền tham số cho nhau. Nguyên tắc gọi là: những chương trình con xây dựng sau có thể gọi tới các chương trình con ñã xây dựng trước nó, ñồng thời các chương trình con cấp dưới cũng có thể gọi tới các chương trình con cấp trên nếu chúng cùng một gốc. ðiều này có nghĩa là các chương trình con xây dựng trước không thể gọi tới các chương trình con xây dựng sau nếu không có chỉ báo FORWARD (xem mục 8). Xét một số ví dụ sau: Ví dụ 1.6 Program Goi_ctc; Uses crt; Type dayso=array[1..60] of byte; s1=string[30]; Var Trường ðại học Nông nghiệp 1 - Giáo trình Lập trình nâng cao ..............................................................- 14 a:s1; b:dayso; i,j,n:byte; Procedure nhapso(m:byte; var c:dayso); Begin For i:=1 to m do Begin Write('c[',i,'] = '); readln(c[i]); End; End; Function tinhtong(m:byte; d:dayso):real; var tong:real; Begin tong:=0; for i:= 1 to m do Tong:=tong+d[i]; tinhtong:=tong; End; Procedure viet(k:byte; e:dayso); Begin Write('Tong cac phan tu mang = ',tinhtong(k,e):8:0); readln; End; BEGIN clrscr; write('Nhap so phan tu n '); readln(n); nhapso(n,b); viet(n,b); END. Ví dụ 1.6 thiết kế ba chương trình con là Nhapso, Tinhtong và Viet. Thủ tục Nhapso dùng ñể nhập các phần tử vào mảng một chiều. Hàm Tinhtong dùng ñể tính tổng các phần tử mảng và thủ tục Viet dùng ñể hiện kết quả tính tổng lên màn hình. Chương trình mẹ gọi chương trình con Viet và truyền các tham số là số phần tử mảng n và giá trị của các phần tử của mảng ( mảng b ). Chương trình con Viet lại gọi hàm Tinhtong và truyền các tham số cho hàm này. ðây là trường hợp một chương trình con gọi một chương trình con cùng cấp. Việc các chương trình con gọi tới nhau phải tuân theo quy ñịnh sau ñây: Một chương trình con chỉ có thể gọi tới một chương trình con cùng cấp ñã thiết kế trước chương trình con hiện thời. Trong ví dụ 1.6 nếu chúng ta ñưa hàm Tinhtong xuống dưới thủ tục Viet thì khi chạy chương trình sẽ bị báo lỗi: Unknown Indentifier. Trường ðại học Nông nghiệp 1 - Giáo trình Lập trình nâng cao ..............................................................- 15 Ví dụ 1.7 dưới ñây trình bày cách thức mà một chương trình con cấp dưới gọi tới một chương trình con cấp trên cùng gốc. Ví dụ 1.7 Program goi_ctc; Uses crt; Type dayso=array[1..60] of byte; Var b:dayso; i,n:byte; {Hai chương trình con Nhapso và Tinhtong cùng cấp với thủ tục Xuly} Procedure nhapso(m:byte; var c:dayso); Begin For i:=1 to m do Begin Write('c[',i,'] = '); readln(c[i]); End; End; Function tinhtong(m:byte; d:dayso):real; Var tong:real; Begin tong:=0; for i:= 1 to m do Tong:=tong+d[i]; tinhtong:=tong; End; Procedure xuly(j:byte; ds:dayso); Procedure viet(k:byte; e:dayso); Var i:byte; Begin Writeln('Tong cac phan tu mang = ',tinhtong(k,e):8:0); Writeln('Day so sap xep giam dan '); for i:=1 to k do write(e[i],' '); readln; End; { Kết thúc thủ tục Viet} Procedure sapxep(m:byte; d:dayso); Var p,q:byte; Tg:byte; Begin For p:= 1 to m-1 do Trường ðại học Nông nghiệp 1 - Giáo trình Lập trình nâng cao ..............................................................- 16 For q:=p+1 to m do If d[p]<d[q] then Begin tg:=d[p]; d[p]:=d[q]; d[q]:=tg; End; viet(m,d); End; { Kết thúc thủ tục sapxep} Begin {than thu tuc Xuly} Writeln('Thu tuc xu ly dung de sap xep va viet ket qua'); sapxep(j,ds); end; { Kết thúc thủ tục Xuly} BEGIN {Than chuong trinh me} clrscr; write('Nhap so phan tu n '); readln(n); nhapso(n,b); xuly(n,b); END. Ví dụ 1.7 có ba chương trình con cùng cấp là Nhapso, Tinhtong và Xuly. Trong thủ tục Xuly có hai chương trình con là Viet và Sapxep trong ñó chương trình con Viet ñược thiế kế trước, Sapxep ñược thiết kế sau. Chương trình con Sapxep có lời gọi ñến chương trình con Viet cùng cấp với nó, mục ñích của lời gọi này là truyền cho chương trình con Viet những dữ liệu mảng ñã sắp xếp giảm dần. Chương trình con Viet có lời gọi ñến hàm Tinhtong là một chương trình con cấp cao hơn nó, vì Tinhtong ñã ñược thiết kế trước Xuly nên lời gọi là hợp lý. Nếu ñảo vị trí của hai chương trình con Viet và Sapxep, nghĩa là ñưa chương trình con Viet xuống sau Sapxep thì sẽ bị báo lỗi , về ñiều này chúng ta sẽ nghiên cứu ở mục 8. 8. Khai báo trước bằng Forward Như ñã nêu trong mục 7 việc các chương trình con gọi tới nhau bị hạn chế bởi thứ tự xây dựng các chương trình con ñó. Vì những lý do khác nhau người ta không thể thay ñổi thứ tự xây dựng các chương trình con nhưng lại muốn các chương trình con phải gọi ñược tới nhau không phụ thuộc vào thứ tự xây dựng chúng. ðể làm việc này Pascal cho phép sử dụng từ khoá Forward. Nghĩa ñen của từ Forward là "phía trước" thường ñược dùng ñể báo hiệu một cái gì ñó ta sẽ gặp sau này ví dụ: phía trước 200 mét là công trường. Cú pháp: Tên chương trình con (danh sách tham số); Forward; Trường ðại học Nông nghiệp 1 - Giáo trình Lập trình nâng cao ..............................................................- 17 Dòng khai báo trên ñây phải ñược ñặt trong chương trình trước khi xây dựng tất cả các chương trình con. Khi tên một chương trình con ñã ñược khai báo với cú pháp nêu trên thì việc nó nằm trước hay sau một chương trình con sẽ gọi tới nó là không quan trọng. Số lượng chương trình con khái báo trước với từ khoá Forward là không hạn chế. Cần lưu ý rằng nếu có nhiều chương trình con cần khai báo trước thì mỗi tên chương trình con phải ñi với một từ khoá Forward, không thể ghép nhiều tên chương trình con với cùng một từ Forward. Ví dụ 1.8 Program Tu_khoa_Forward; uses crt; Type dayso=array[1..60] of byte; var a:string; b:dayso; i,j,n:byte; Function c2(m:byte; d:dayso):real; forward; Procedure c4(p:byte; var q:dayso); forward; Procedure c1(m:byte; var c:dayso); Begin For i:=1 to m do Begin Write('c[',i,'] = '); readln(c[i]); End; End; Procedure c3(k:byte; e:dayso); Var i:byte; Begin c4(k,e); writeln('Mang sau khi sap xep'); for i:= 1 to k do write(e[i],' '); writeln; Write('Tong cac phan tu mang = ',c2(k,e):8:0); readln; End; Function c2(m:byte; d:dayso):real; var tong:real; Trường ðại học Nông nghiệp 1 - Giáo trình Lập trình nâng cao ..............................................................- 18 Begin tong:=0; for i:= 1 to m do Tong:=tong+d[i]; c2:=tong; End; Procedure c4(p:byte; var q:dayso); Var i,j:byte; tg:integer; Begin for i:= 1 to (p-1) do for j:= i+1 to p do if q[i]>q[j] then Begin tg:=q[i]; q[i]:=q[j]; q[j]:=tg; End; End; BEGIN clrscr; write('Nhap so phan tu n '); readln(n); c1(n,b); c3(n,b); END. Ví dụ 1.8 có 4 chương trình con trong ñó c1 và c3 thiết kế trước còn c2 và c4 thiết kế sau. Trong c3 có lời gọi ñến c2 và c4 do vậy phải khai báo trước c2 và c4 . Nếu không muốn khai báo trước thì cần ñưa c2 và c4 lên trên c3. Trường ðại học Nông nghiệp 1 - Giáo trình Lập trình nâng cao ..............................................................- 19 Bài tập ứng dụng chương 1 1. Lập chương trình tính diện tích toàn phần và thể tích các hình : Trụ tròn, nón. Yêu cầu: Thiết kế menu theo mẫu sau, Menu có thể dùng con trỏ dịch chuyển ñể chọn các chức năng: Hinh Tru Hinh Non Ket thuc Việc tính toán diện tích, thể tích mỗi hình ứng với một chương trình con Tất cả các hình ñều chung một chương trình con hiện kết quả. Chức năng Ket thuc dùng ñể quay về cửa sổ Pascal. 2. Lập một chương trình tạo thực ñơn với các chức năng: Tính giai thừa Tính tổ hợp Trở về Dùng các chương trình con ñã lập ñể giải bài toán sau: Cho n ñiểm trên màn hình, qua hai ñiểm bất kỳ bao giở cũng nối ñược bởi một ñoạn thảng. Tính xem có bao nhiêu ñoạn thẳng ñược tạo ra. Tìm ñoạn ngắn nhất và dài nhất , chúng nối các ñiểm nào? 3. Thiết kế thực ñơn với các chức năng: 1.giai he pt bac nhat 2. giai pt bac hai 3.Ket thuc Yêu cầu: Bấm số ñể chọn chức năng trên thực ñơn. Chức năng Ket thuc dùng ñể quay về cửa sổ Pascal. Chương trình có 2 chương trình con ñể giải hệ phương trình bậc nhất 2 ẩn và giải phương trình bậc 2 4. A,B là mảng hai chiều của các số thực, số dòng và cột của từng mảng nhập từ bàn phím, lập chương trình bao gồm các chương trình con: nhập dữ liệu vào mảng, kiểm tra xem có thể nhân hai mảng hay không, nếu có thì chạy chương trình con nhân hai mảng, nếu không thì thông báo không thể nhân hai mảng. Hiện kết quả nhân dưới dạng ma trận. 5. Cho hai chuỗi s1, s2, viết chương trình bao gồm các chương trình con: NHAP dùng ñể nhập vào s1, s2 các ký tự của bảng mã gồm cả chữ cái và chữ số, TACH dùng ñể tách riêng các chữ số và chữ cái, những chữ số tách ra lưu vào mảng một chiều theo thứ tự của s1 trước, s2 sau. CONG dùng ñể cộng các chữ số tách ra từ hai chuỗi Thông báo kết quả theo mẫu: Chuỗi s1 sau khi tách:.................. Chuỗi s2 sau khi tách:.................. Tổng các chữ số:......................... 6. Lập chương trình với 4 chương trình con dùng ñể chuyển ñổi các số giữa 4 hệ ñếm: Hệ 10 sang hệ 2, 8, 16 Hệ 2 sang hệ 8, 10, 16 Hệ 8 sang hệ 2, 10, 16 Hệ 16 sang hệ 2, 8, 10
File đính kèm:
- Giáo trình Lập trình nâng cao trên ngôn ngữ Pascal - Chương 1_Chương trình con - Thủ tục và hàm.pdf