Minh họa cấu trúc của chương trình chính và chương trình con: Program Tên_chương_trình_chính; Lebel – Const- Type Var Khai báo Các biến chung Các khai báo chung của CT chính Functio
Trang 1TRƯỜNG ĐẠI HỌC XÂY DỰNG KHOA CÔNG NGHỆ THÔNG TIN
- -
GIÁO TRÌNH
PHẦN III – NGÔN NGỮ LẬP TRÌNH PASCAL -2
Bộ môn : TIN HỌC XÂY DỰNG
Hà nội 2012 -
Trang 2Chương 4 CHƯƠNG TRÌNH CON
I Khái niệm chung – đặc điểm
1 Khái niệm chung:
Ở những chương trước chúng ta mới làm quen với cấu trúc của chương trình chính, trong đó
để giải quyết một hoặc nhiều vấn đề, tất cả các lệnh đều nằm trong một chương trình và thực hiện các lệnh từ trên xuống dưới Với những bài toán lớn, theo cấu trúc này chương trình chính rất dài, cồng kềnh, khó kiểm soát và không thể phân chia cho nhiều nhóm thực hiện đồng thời một lúc
Từ đó hình thành ý tưởng xây dựng chương trình con là một mô đun độc lập, kết nối với
chương trình chính và các chương trình con khác qua “đầu vào” và “đầu ra”, chia nhỏ chức
năng và cấu trúc chương trình chính thành nhiều mô đun nhỏ, trong đó chương trình chính
là chương trình điều khiển quá trình tính toán của chương trình con
Trong những năm đầu khi bắt đầu xuất hiện ngôn ngữ lập trình, người ta chưa thiết lập được
cấu trúc Chương trình con Trong quá trình phát triển các ngôn ngữ đã có, cùng với nhu cầu
của người sử dụng, những tiện lợi mà chương trình con mang lại, sự phát triển các ngôn ngữ
đã có và khi xây dựng ngôn ngữ lạp trình mới đều hướng đến việc tổ chức chương trình con
Ưu điểm khi sử dụng cấu trúc chương trình con:
- Cấu trúc chương trình chính trở nên gọn, mạch lạc, dễ hiểu
- Không lặp lại các phần tương tự
- Vì là một mô đun độc lập, chương trình con có thể sử dụng nhiều lần trong một chương trình hoặc ở các chương trình khác nhau
- Dễ kiểm tra, theo dõi trong quá trình thử nghiệm
2 Đặc điểm của Chương trình con:
- Là một đơn vị chương trình độc lập, hoàn chỉnh, cũng bao gồm 3 phần: tên chương trình, phần khai báo và phần thân Chương trình con có thể giải quyết một vấn đề trọn vẹn và được sử dụng nhiều lần qua lời gọi nó trong chương trình chính
- Toàn bộ các Chương trình con đặt ở cuối phần khai báo trong chương trình chính
- Các biến trong chương trình con chỉ có tính chất cục bộ (chỉ có tác dụng trong bản thân chương trình đó) Trong chương trình con có thể sử dụng tất cả các lệnh như chương trình chính
- Thứ tự khai báo các chương trình con không quan trọng nếu các chương trình độc lập với nhau Khi các chương trình con gọi đến nhau thì phải xếp theo một trật tự nào đó nếu Ví dụ chương trình con A gọi đến chương trình con B thì B phải khai báo trước A
- Trong Pascal có 2 loại chương trình con: chương trình con dạng hàm (Function) và chương trình con dạng thủ tục (Procedurre)
- Chương trình con chỉ được tham chiếu đến nếu nó được gọi từ chương trình chính
Trang 3- Mỗi lần gặp lời gọi chương trình con, chương trình chính chuyển đến chương trình con và thực hiện chúng, sau khi thực hiện, nó quay trở về chương trình chính thực hiện câu lệnh ngay sau lời gọi chương trình con
Minh họa cấu trúc của chương trình chính và chương trình con:
Program Tên_chương_trình_chính;
Lebel – Const- Type
Var (Khai báo Các biến chung )
Các khai báo chung của CT chính
Function Tên_hàm ( Danh_sách_tham_số_hình thức) :
kiểu_hàm ;
{ Phần khai báo các biến cục bộ của hàm}
Begin
Các câu lệnh của chương trình con ạng hàm
End;
Procedure Tên_Thủ_tục (Dsach_Tham_số_hình_thức);
{ Phần khai báo các biến cục bộ của thủ tục}
Begin
Các câu lệnh của chương trình con thủ tục;
End;
Khai báo các Chương trình con
-
Nội dung các chương trình con
Phần khai báo của chương trình chính
BEGIN
Các lệnh ;
Lời gọi chương trình con;
……
END
Phần thân của chương trình chính
II Thủ tục và hàm – cách khai báo
1 Hàm – Function: Chương trình con dạng hàm dùng để tính cho các hàm hoặc xử lý cho những bài toán chỉ tính và xuất một kết quả
Đặc điểm của chương trình con dạng hàm:
- Tên chương trình con là tên biến chứa kết quả
- Dùng cho các bài toán chỉ tính 1 kết quả
- Trong phần thân của chương trình con phải có một phép gán có chứa tên của CTC
- Lời gọi chương trình con hàm phải nằm trong thành phần của biểu thức hoặc phép gán
và kết quả của chương trình con được lấy ra từ đó
Cấu trúc chương trình con dạng hàm:
Function Tên_hàm ( Danh_sách_tham_số_hình thức) : kiểu_hàm ;
{ Phần khai báo các biến cục bộ của hàm}
Begin
Trang 4Các câu lệnh;
Tên_hàm:= Biểu_Thức
End;
Ví dụ: Để tính các hàm:
F1 = a.x + 5b x2 – (a+b) xy
F2 = (7.a-c).x + b2 2 + (a-b) xy
F3 = c.x + (a+c) x2 – (a2+b2) xy
F4 = (a/2).x + 5b x2 – 120.b xy
- Chúng ta nhận thấy các hàm có 1 cấu trúc giống nhau có thể tổng quát hóa qua công thức :
F= a1.x + a2 x2 +a3 xy Trong đó a1, a2, a3 có các giá trị khác nhau trong các hàm F1, F4 Chúng ta thiết lập một chương trình con dạng Function để tính cho một hàm “đại diện”, và sau đó gọi chúng ra tính cho các hàm F1 F4 như sau:
- Chương tình con tính cho một hàm F bất kỳ:
Function F ( a1, a2, a3 : real) : real; a1,a2, Ten : các tham số hình
thức
trùng với tên trong CT chính Begin
F := a1* + a2* x2 +a3* x*y ;
Writeln ( ‘ Gia tri cua ham ’);
End;
Thân của chương trình con, tính cho hàm F bất kỳ và sau
đó in kết quả
- Để tính toán cho các hàm F1, F4 ta viết đoạn chương trình
chính sau:
Program Tinh_ham; Chương trình chính
Var a,b,c, F1,F2,F3,F4,x,y : real ; Khai báo các tham số thực sự BEGIN
Writeln (‘ Nhap du lieu ’);
Write ( ‘ Nhap cac gia tri a,b,c ’); Readln ( a,b,c);
Write ( ‘ Nhap cac gia tri x,y ’); Readln ( x,y);
Nhập dữ liệu cho chương trình chính
Writeln (‘ KET QUA ’);
F1:= F ( a, 5*b, - (a+b) ) ; Writeln (’F1= ’ , F1:8:2 );
F2:= F ( 7*a-c , sqr(b), (a-b) ) ; Writeln (’F2= ’, F2:8:2 );
F3:= F ( c, (a+c), - (a*a+b*b)) ; Writeln (’F3= ’ , F3:8:2 );
F4:= F ( a/2, 5*b, - 120*b ) ; Writeln (’F4= ’ , F4:8:2 );
Gọi 4 lần CTcon tính hàm, mỗi lời gọi tính cho một hàm,
ví dụ để tính F1 thay các tham
số hình thức bằng các tham số thực sự như sau: a1= a;
a2=5*b ;a3=a+b;
Readln ;
END
Trang 52 Thủ tục - Procedure:
Đặc điểm của thủ tục: có thể dùng để tính cho bài toán bất kỳ
- Tên của chương trình con là một tên bất kỳ, theo cách đặt tên của Pascal
- Thủ tục có thể tính và xuất cho nhiều kết quả
Cấu trúc chương trình con dạng thủ tục:
Procedure Tên_thủ_tục ( Danh_sách_tham_số_hình thức) ;
{ Phần khai báo các biến cục bộ của thủ tục}
Begin
Các câu lệnh;
End;
Ví dụ: Viết chương trình con nhập dữ liệu cho ma trận X bất kỳ có kích thước m hàng, n cột
Procedure Nhap_ma_tran ( Var m,n: integer; Var X :MT) ;
Var i,j :integer;
Begin
Write (' m, n = '); Readln (n,m);
for i:=1 to m do
for j:=1 to n do
begin
write (' X[', i, ',' , j ,']= ' ); readln (X [i,j]);
end
End;
Chú ý: trong tham số hình thức đối với mảng, không được khai báo trực tiếp, do vậy, để
khai báo cho X, trong chương trình chính phải mô tả trước kiểu, dùng lệnh Type ví dụ: Type MT=array[1 15,1 15] of real;
(Tham khảo thêm ví dụ của chương trình con trong các ví dụ tổng hợp ở phần sau)
3 Biến toàn cục và biến cục bộ:
Biến toàn cục (tổng thể) là các biến của chương trình chính, các biến thực sự của chương
trình và chỉ được đặt trong phần khai báo của chương trình chính
Biến cục bộ (đại phương) là các biến của chương trình con, nó chỉ có tác dụng trong chương
trình con Biến cục bộ cũng có thể dùng chung với biến toàn cục Khai báo biến cục bộ, có thể qua một trong số các vị trí trong chương trình:
- Đặt trong phần khai báo của chương trình con
- Khai báo qua các tham số hình thức
- Dùng chung với các biến toàn cục (tên phải giống nhau ở CT chính và CT con)
III Tham số
1 Tham số hình thức: Chương trình con có thể có tham số hoặc không có tham số
Việc truyền tham số là cách kiểm soát các dữ liệu vào/ ra chương trình con, dễ dàng
điều khiển các biến nằm ngoài và các trị liên quan đến chứng trong chương trình con
Trang 6Khi sử dụng và tạo ra tham số chúng ta cần phải xác định:
- Các dữ liệu nào từ bên ngoài cần truyền đến chương trình con hoặc các dữ liệu mà chương
trình con sau khi tính toán cần lấy ra sử dụng tiếp
- Đặt tên cho tham số
- Những dữ liệu nào sẽ bị chương trình con thay đổi
- Loại tham số trong danh sách (tham trị hay tham biến)
Tham số hình thức là các tham số được khai báo ngay sau tên của hàm và thủ tục, đặt
trong cặp ngoặc tròn Nó là các tên giả định đại diện cho các đại lượng nào đó của các biến/trị đưa vào hoặc các trị cần đưa ra trong chương trình, nó là các biến cục bộ của CT Con
Danh sách tham số hình thức là tập hợp của nhiều nhóm, mỗi nhóm phải cùng loại và kiểu, các nhóm ngăn cách nhau bởi dấu chấm phẩy; còn trong một nhóm có thể có nhiều tên ngăn cách nhau bằng dấu phẩy
Dạng : (Nhóm 1 :kiểu; Nhóm 2: kiểu …);
Ví dụ: Procedure Tong_MT ( m,n: interger; A,B: VT2; var C: VT2);
Trong ví dụ trên, danh sách tham số hình thức có 3 nhóm, nhóm 1 và 2 là tham trị, nhóm 3
là tham biến Nhóm 1 có kiểu nguyên, nhóm 2 và nhóm 3 có kiểu VT2, là một kiểu loại mảng đã khai báo trước đó
Trong danh sách tham số hình thức chỉ có 2 loại : Tham biến và tham trị
Tham biến: là các tên trong phần khai báo của tham số hình thức có chữ Var ở
trước, đó là các tham số truyền theo kiểu biến Với kiểu truyền này, địa chỉ chứa các biến trước khi truyền vào CTCon và sau khi ra khỏi CTCon chung một vùng, do vậy nếu trong chương trình con làm thay đổi giá trị của nó thì ra khỏi CTC nó vẫn giữ nguyên giá trị đã bị thay đổi
Thông thường, tham biến dùng khai báo cho các dữ liệu cần chương trình con thay đổi và giữ lại sự thay đổi đó, ví dụ các dữ liệu, kết quả cần tính toán Sử dụng tham biến sẽ tiết kiệm bộ nhớ
Tham trị: là các tên trong phần khai báo của tham số hình thức không có chữ Var ở
trước Với tham trị, Pascal sử dụng 2 ô nhớ, một ô nhớ để chứa giá trị của biến trước khi truyền vào chương trình con và một ô nhớ chứa bản sao của tham trị dùng để tính toán trong chương trình con, do vậy các tác động trong chương trình con đến tham trị chỉ có tác dụng trong nội bộ CTCon Khi kết thúc và ra khỏi chượng trình con, giá trị của tham trị sẽ lấy theo giá trị ban đầu, trước khi truyền vào CTCon nên giá trị của
nó không bị thay đổi
Do vậy tham trị thường dùng để khai báo cho các dữ liệu cần truyền vào chương trình con
mà ra khỏi CTC, các dữ liệu này không được thay đổi
Chú ý:
- Trong danh sách tham số hình thức, khi khai báo mảng, tệp phải khai báo gián tiếp
Trang 7- Chỉ những dữ liệu cần truyền vào, lấy ra mới đưa vào danh sách, tránh khai báo các biến không cần thiết ( ví dụ các chỉ số, biến đếm, các biến tính toán, xử lý trung gian…)
2 Tham số thực sự và cách truyền tham số: Chương trình con chỉ được thực hiện khi
có lời gọi nó từ chương trình chính Trong lời gọi chương trình con, các tham số thực tế của
chương trình thay thế cho danh sách tham số hình thức gọi là Tham số thực sự Tham số
thực sự dùng để truyền dữ liệu vào chương trình con, thay các biến giả định bằng các hằng, biến, hàm hoặc biểu thức đơn giản (tùy thuộc vào nó thay cho tham biến hay tham trị)
Tham số thực sự là các đại lượng đã được khai báo trong chương trình chính, các đại lượng dùng thực sự trong chương trình chính
Dạng: ( Danh_sách_tham_số_thực sự);
Danh sách tham số thực sự có thể là các hằng, biến, hàm,bản ghi, tệp, biểu thức ngăn cách
nhau bằng dấu phẩy Việc thay thế danh sách này trong tham số thực sự gọi là truyền tham
số
Danh sách truyền phải phù hợp với danh sách trong tham số hình thức về số lượng, thứ tự
và kiểu
- Với tham trị : có thể truyền theo hằng, biến,biểu thức
- Với tham biến: chỉ truyền dữ liệu theo kiểu biến
- Tên của tham số hình thức và tham số thực sự có thể giống nhau
Ví dụ:
( m,n: interger; A,B: VT2; var C: VT2); ( m, n, A, B, C);
(10, 5, X, Y, Z)
III Lời gọi chương trình con
Chương trình con được dùng (tham chiếu đến) qua lời gọi của chương trình chính tại những chỗ cần thực hiện chương trình con Số lần gọi là tùy ý, và mỗi lần gọi, danh sách tham số thực sự truyền vào danh sách tham số hình thức có thể khác nhau Lời gọi CTC là một câu lệnh độc lập
Dạng : Tên_chương trình_con ( Danh_sách_tham_số_thực_sự);
Chú ý : Lời gọi hàm có thể đứng độc lập hoặc tham gia trong một vế của biểu thức gán ( lời
gọi hàm)
Khi gặp lời gọi chương trình con, chương trình chính sẽ chuyển đến thực hiện CTCon, thay tham số thực sự tương ứng với tham số hình thức và thực hiện CTCon, sau khi thực hiện xong, kết quả trả về chương trình chính thông qua các tham số và trở về chương trình chính tại câu lệnh ngay sau lời gọi chương trình con
Ví dụ: Minh họa cho tham biến, tham trị và thực hiện lời gọi chương trình con
Program Tham_bien;
Var X,Y : integer ;
{ Chương trinh con}
Trang 8Procedure Cong (Var A,B : integer);
Begin
A:= A+1 ; B:= B+ 2 ;
Writeln ( ‘ Gia tri cua X, Y trong chương trinh con : ’ , A,B );
End;
BEGIN { Chuong trinh chinh }
X:=1 ; Y :=1 ;
Writeln ( ‘ Gia tri cua X,Y truoc khi goi chuong trinh con ’, X, Y );
Cong (X,Y) ;
Writeln ( ‘ Gia tri cua X,Ysau khi goi chuong trinh con ’, X, Y );
Readln
END
-
Program Tham_tri;
Var X,Y : integer ;
{ Chương trinh con}
Procedure Cong ( A,B : integer); Begin
A:= A+1 ; B:= B+ 2 ;
Writeln ( ‘ Gia tri cua X, Y trong chương trinh con : ’ , A,B );
End;
BEGIN { Chuong trinh chinh }
X:=1 ; Y :=1 ;
Writeln ( ’ Gia tri cua X,Y truoc khi goi chuong trinh con ’, X, Y );
Cong (X,Y) ;
Writeln (’ Gia tri cua X,Ysau khi goi chuong trinh con ’, X, Y );
Readln
END
-
Nội dung của 2 chương trình trên hoàn toàn giống nhau cả chương trình chính và chương trình con, sự khác nhau duy nhất là hai tham số hình thức A,B mà sau này được truyền vào bằng X,Y, ở chương trình con 1 khai báo dạng tham biến, còn ở chương trình con 2 khai báo là tham trị
Kết quả sau khi chạy 2 chương trình trên:
Chương trình Tham biến Chương trình Tham trị
Gia tri cua X,Y truoc khi goi chuong trinh con 1 1 1 1
Gia tri cua X,Y trong chuong trinh con 2 3 2 3
Gia tri cua X,Y truoc khi goi chuong trinh con 2 3 1 1
Từ đó có thể thấy việc khai báo tham biến hay tham trị là rất quan trọng và ảnh hưởng đến kết quả tính toán
Trang 9Sơ đồ điều khiển giữa chương trình chính và chương trình con
Program Chuong_trinh_chinh;
…
Chương trình chính Phần khai báo chương trình chính
Procudere CTC1 ( Danh_sach);
thực hiện
End;
Khai báo- Toàn bộ CT con 1
Procedure CTC2 (Danh_sach);
… thực hiện
End;
Khai báo- Toàn bộ CT con 2
BEGIN
…
CTC1 ( Tham_so_thuc_su);
Phần thân Chương trình chính Lời gọi chương trình con 1
…
CTC2 (Tham_so_thuc_su);
…
Lời gọi chương trình con 2
3 Các bài tập áp dụng:
Bài 1: Cho 2 véc tơ A, B có m phần tử Viết chương trình con tính các véc tơ C= A+B;
D=A+C; E= B+D , trong đó viết 2 chương trình con, một chương trình con nhập dữ liệu cho một véc tơ và một chương trình con tính tổng 2 véc tơ
Bài 2: Cho một ma trận A vuông (mảng 2 chiều) có m hàng, n cột
- Tính trung bình cộng từng hàng của ma trận
- Tìm giá trị lớn nhất của từng cột của ma trận
trong đó viết 3 chương trình con, một chương trình con nhập dữ liệu cho ma trận, một chương trình con tính tổng từng hàng của ma trận và chương trình con tính giá trị lớn nhất từng cột của ma trận
Bài 3: Cho dữ liệu của một phường dân cư có m người Biết các thông tin Tên chủ hộ, Địa
chỉ, Tổng số điện tiêu thụ mỗi tháng của mỗi nhà trong 12 tháng
- Nhập các thông tin của từng hộ
- Tính tổng số điện tiêu thụ trong cả năm của mỗi nhà
- Tính tiền điện của từng hộ trong cả năm theo lũy tiến như sau:
Tổng số điện cả năm < 100 số: 3000đ/ số; từ 101 đến 150 số :4000đ/số; > 150 số : 5000đ/ số
- Tính số lượng những hộ phải trả tiền điện trong cả năm > X đồng
Viết 2 chương trình con: một chương trình con nhập dữ liệu và một chương trình con tính tiền điện cho từng hộ
Chương 5 TỆP VĂN BẢN
Trang 10I Khái niệm về tệp (File)
1 Lý do dùng tệp
Trong quá trình tạo lập biến và các dữ liệu đưa vào theo danh sách biến cũng như quá trình lưu trữ các kết quả tính được trong chương trình Pascal ở các chương trước gặp nhiều tổn thất, đó là khi mất điện hoặc tắt máy, chuyển chương trình… các dữ liệu đã nhập và kết quả đang hiện trên màn hình sẽ mất hết Bên cạnh đó khi làm các bài toán lớn, khối lượng dữ liệu nhiều, quá trình nhập dữ liệu mất nhiều thời gian và dữ liệu cần lưu lại hoặc có thể sử dụng cho những mục đích khác thì cách nhập-xuất trực tiếp không hiệu quả
Vấn đề là cần một phương pháp để lưu trữ các dữ liệu đã nhập và có thể thêm – xóa - sửa chúng một cách dễ dàng, đó là mục đích sử dụng cấu trúc tệp dữu liệu
2 Cấu trúc tệp:
Tệp là một kiểu dữ liệu có cấu trúc, tập hợp các dữ liệu có liên quan đến nhau được chứa trong một thiết bị nhớ ngoài (băng, đĩa,…) với một tên nào đó, do vậy dữ liệu trong tệp được lưu trữ và sử dụng nhiều lần Khác với các tệp chương trình, tệp văn bản,… tệp dữ liệu trong Pascal có thể tạo ra từ các câu lệnh của chương trình Pascal hoặc từ một phần mềm soạn thảo văn bản
Tệp dữ liệu là một tập hợp các loại dữ liệu dưới dạng Văn bản hoặc Bản ghi và được tổ chức theo một cách nào đó, được đặt một tên và lưu trong đĩa
Việc tổ chức và sử dụng tệp được gắn bó với nhau và gọi chung là phương pháp truy nhập tệp Có 2 phương pháp truy nhập là truy nhập tuần tự và truy nhập trực tiếp Truy nhập tuần
tự là tệp được tổ chức để nhập dữ liệu vào và lấy ra một cách tuần tự, từ đầu đến cuối tệp hoặc từ bản ghi đầu đến bản ghi cuối Truy nhập trực tiếp hay ngẫu nhiên là tổ chức dữ liệu
và nhập – lấy dữ liệu từ tệp theo một địa chỉ bất kỳ (kiểu cấu trúc bản ghi và truy nhập đến địa chỉ của bản ghi)
3 Các loại tệp
Có 3 loại tệp : Tệp mã, Tệp văn bản và Tệp không định kiểu
Trong nội dung chương trình, chúng ta chỉ đề cập đến Tệp văn bản
Tệp văn bản là tệp dữ liệu được lưu trữ dưới dạng mã ASCII và xếp theo dòng Các dòng
ngăn cách nhau bằng tín hiệu EOLN (End of line),và đánh dấu ở vị trí cuối tệp là ký hiệu EOF (end of file) Độ dài của các dòng trong tệp có thể thay đổi
Đặc điểm: - Dữ liệu ghi trong tệp dạng ký tự do đó có thể đọc và hiểu được
- Muốn truy nhập tệp văn bản (nhập dữ liệu – lấy dữ liệu) phải tiến hành tuần tự.Ví dụ muốn lấy 1 dữ liệu ở giữa tệp thì cũng phải đọc các dữ liệu từ đầu đến vị trí muốn lấy DL (giữa tệp)
- Có thể sử dụng bất cứ phần mềm soạn thảo văn bản nào để soạn nội dung của tệp
- Tệp văn bản đơn giản, dễ tạo và sử dụng