Bài giảng Nguyên lý ngôn ngữ lập trình - Chương 4: Chương trình con (SubPrograms) giới thiệu chương trình con, cơ chế gọi chương trình con, truyền tham số cho chương trình con, chương trình con đa năng (overloaded), chương trình con chung (generic).
Chương 4: Chương trình (SubPrograms) Giảng viên: Ph.D Nguyễn Văn Hòa Khoa KT-CN-MT – ðH An Giang Pascal Code Fragment procedure C; procedure A (P : procedure; i : integer); procedure B; begin B write(i); end B; begin A if i = then A(B,2) else P; end A; begin main A(C,1); end main JavaScript Code Fragment function sub1() { var x; function sub2() { alert(x); }; function sub3() { var x; x = 3; sub4(sub2); }; function sub4(subx) { var x; x = 4; subx(); }; x = 1; sub3(); }; Chương trình chung C++ template Type max(Type first, Type second) { return first > second ? first : second; } int max(int first, int second) { return first > second ? first : second; } Nội dung chương Giới thiệu chương trình Cơ chế gọi chương trình Truyền tham số cho chương trình Chương trình đa (overloaded) Chương trình chung (generic) Giới thiệu Có hai cách trù tượng hóa Trù tượng tiến trình (process abstraction): trọng ngày từ sớm Trù tượng liệu (data abstraction): ñược trọng 1980s Chương trình (CTC): Một phép tốn trừu tượng tiến trình (process) định nghĩa người lập trình Khi khối cơng việc lặp lặp lại nhiều lần chương trình → CTC Hoặc CTC ñược dùng ñể tách khối công việc cụ thể, để chương trình đỡ phức tạp Giới thiệu (tt) ðặc tính CTC Mỗi chương trình có điểm vào Chương trình gọi CTC tạm dừng khoảng thời gian thực CTC Ðiều khiển ln trả chương trình gọi kết thúc chương trình Mơ hình Master/Client Hai khía cạnh nói đến CTC ðịnh nghĩa CTC Lời gọi CTC Giới thiệu (tt) CTC truy xuất liệu : Truy xuất biến không cục Truyền tham số Ưu ñiểm CTC Cho phép sử dụng nhiều lần chức năng/khối công việc ~ CTC → tiết kiệm không gian lưu trữ code ẩn giấu chi tiết CT Tăng tính dễ ñọc hiểu CT dễ dàng thấy cấu trúc ñiều khiển CT Phát sữa lỗi dễ dàng Mơ hình cài đặt CTC Mơ hình cài đặt CTC NNLT khác ðiều khiển (Imperative) : Thủ tục : khối câu lệnh ñể thực chức Hàm : khối câu lệnh trả kết Ngôn ngữ C không phân biệt hàm thủ tục Hàm: VD Hàm tính dãy Fibonacci Logic: Mệnh ñề Horn (Horn claus) ðặc tả CTC Tên CTC Số lượng, thứ tự kiểu tham số (đối số) Tham số hình thức: danh sách tham số ñược dùng CTC phần Header CTC Tham số thực: giá trị địa nhớ dùng lời gọi CTC Header CTC = Tên + tham số hình thức Hoạt động CTC hay phần thân (body) Các khối khai báo, câu lệnh, etc Số lượng kết trả kiểu chúng 10 Tham số mãng nhiều chiều: C C++ Yêu câu người dùng phải rõ số cột tham số hình thức mãng chiều void fun(int matrix[][10]); CTC khơng linh hoạt Giải pháp: dùng biến trỏ trỏ đến mãng kích thước chiều truyền cách tham số khác ~ người dùng phải kích thước lưu trữ mãng thông qua tham số VD void(float *mat_ptr, int num_rows, int num_cols); 30 Tham số mãng nhiều chiều : Java C# Mãng đối tượng, tất mãng ñều chiều phần tử mãng Mỗi mãng thừa kế số (length Java, Length C#) ñược xem chiều dài mãng lúc khởi tạo 31 Chọn cách truyền tham số Hai cân nhắc quan trọng Tính hiệu Truyền chiều hay truyền chiều Nghịch lý Người ta khuyên nên hạn chế truy xuất biến, tức nên dùng truyền chiều nhiều Nhưng truyền tham quy chiếu cách hiệu 32 Tham số tên CTC Mội vài NNLT cho phép dùng tên CTC tham số VD hàm integral procedure integrate(function (fun(x : real) : real; lbound, rbound : real); C C++: không hỗ trợ chế dùng tên hàm tham số 33 Tham số tên CTC - javaScript function sub1(){ var x; function sub2(){ alert(x) }; function sub3(){ var x; x = 3; sub4(sub2); } function sub4(subx){ var x; x= 4; subx(); }; x=1; Giá trị x hay ngôn sub3(); ngữ phạm vi ñộng liên kết cạn liên kết sâu }; 34 Chương trình đa Hầu hết NNLT điều có phép tốn đa Chương trình đa CTC có tên với hàm có sẵn phạm vi Tất phiên có chung protocol Trình biên dịch chọn phiên thích hợp dựa tham số hàm Ada, Java, C++, C# cho phép người dùng viết nhiều phiên CTC chùng tên C++, Java, C#, Ada cho phép thêm vào CTC đa (VD tốn tử) 35 Chương trình đa (tt) VD ba hàm trả trị tuyệt ñối tham số int MyAbs(int X) { return abs(X); } long MyAbs(long X){ return labs(X); } double MyAbs(double X){ return fabs(X); } int a; long b; MyAbs(a); MyAbs(b) : trình biên dịch dựa vào kiểu tham số để xác định phiên thích hợp 36 Chương trình chung CTC chung (generic) hay đa hình (polymorphic) tên CTC chấp nhận tham số có nhiều kiểu khác CTC đa trường hợp ñặc biệt CTC chung Các tham số chung dùng để mơ tả kiểu khác gọi tham số đa hình (parametric polymorphism) 37 VD tính đa hình CTC: C++ ðịnh nghĩa template template Type max(Type first, Type second) { return first > second ? first : second; } Template đại diện cho phép tốn so sánh lớn “>” với tất kiểu khác int a,b,c; char c,d,f; C = max(a,b); f=max(d,e); VD so sánh cho kiểu integer thông thường int max (int first, int second) { return first > second? first : second; } 38 VD tính đa hình CTC: C++ (tt) template void generic_sort (Type list[], int len){ int top, bottom; Type temp; for(top=0;top