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ế

pdf19 trang | Chuyên mục: Pascal | Chia sẻ: dkS00TYs | Lượt xem: 2888 | Lượt tải: 2download
Tóm tắt nội dung 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, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
 (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:

  • pdfGiá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
Tài liệu liên quan