intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Bài giảng Kỹ thuật lập trình: Chương 3.3 - TS. Vũ Thị Hương Giang

Chia sẻ: Minh Nguyệt | Ngày: | Loại File: PDF | Số trang:49

33
lượt xem
4
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Phần 3 bài giảng "Kỹ thuật lập trình - Chương 3: Các kỹ thuật xây dựng chương trình phần mềm" cung cấp cho người học các kiến thức về các chương trình hàm/ thủ tục bao gồm: Một số khái niệm thường gặp, nguyên tắc chung, các quy tắc tăng tốc độ, kỹ thuật chồng/ đa năng hóa các hàm/toán tử. Mời các bạn cùng tham khảo.

Chủ đề:
Lưu

Nội dung Text: Bài giảng Kỹ thuật lập trình: Chương 3.3 - TS. Vũ Thị Hương Giang

  1. • Với mỗi bài toán, làm thế nào để: – Thiết kế giải thuật nhằm giải quyết bài toán đó – Cài đặt giải thuật bằng một chương trình máy tính - Hãy làm cho chương trình chạy đúng trước khi tăng tính hiệu quả của chương trình - Hãy tăng tính hiệu quả của chương trình và đồng thời thể hiện tốt phong cách lập trình của cá nhân
  2. CHƯƠNG III. CÁC KỸ THUẬT XÂY DỰNG CHƯƠNG TRÌNH PHẦN MỀM I. Mở đầu II. Làm việc với biến III. Viết mã chương trình hiệu quả IV. Thiết kế chương trình V. Xây dựng hàm/thủ tục
  3. V. CÁC KỸ THUẬT XÂY DỰNG HÀM/THỦ TỤC 1. Một số khái niệm thường gặp 2. Nguyên tắc chung 3. Các quy tắc tăng tốc độ 4. Kỹ thuật chồng/ đa năng hóa các hàm/toán tử
  4. 1. Một số khái niệm thường gặp • Biểu thức (expression): tính toán giá trị đích dựa trên giá trị nguồn • Lệnh gán (assigment): lưu trữ giá trị của biểu thức hoặc của biến nguồn vào trong 1 biến đích
  5. a. Hàm định nghĩa sẵn • Được định nghĩa trong các thư viện • Cần khai báo thư viện ở đầu chương trình để có thể dùng các hàm này • Ví dụ: trong thư viện cmath, hàm sqrt tính căn bậc hai của một số • the_root = sqrt(9.0); – 9.0 : tham số, cũng có thể là một biến hoặc là một biểu thức – the_root : biến lưu kết quả trả về (3.0) – sqrt(9.0) : lời gọi hàm (kích hoạt việc thực hiện hàm sqrt), cũng có thể được sử dụng như một biểu thức bonus = sqrt(sales) / 10; cout
  6. b. Hàm do LTV định nghĩa • Khai báo hàm: – Chỉ ra cách thức gọi hàm – Phải khai báo trước khi gọi hàm – Cú pháp Kiểu_trả_về Tên_hàm (Kiểu_1 tên_tham_số_1,.., Kiểu_n tên_tham_số_n); Kiểu_trả_về Tên_hàm (Kiểu_1,.., Kiểu_n); //Chú thích: hàm dùng để làm gì • Ví dụ: khai báo hàm cho phép tính tổng chi phí theo công thức: tổng chi phí = số lượng hàng * giá mỗi mặt hàng + 5% thuế giá trị gia tăng double total_cost(int number_par, double price_par); double total_cost(int, double);
  7. b. Hàm do LTV định nghĩa • Định nghĩa hàm: – Chỉ ra cách thức thực hiện nhiệm vụ của hàm – Định nghĩa trước hoặc sau khi gọi hàm đều được – Cú pháp: Kiểu_trả_về Tên_hàm (Danh_sách_tham_số) { //code return kết_quả; } • Ví dụ: double total_cost(int number_par, double price_par) { const double TAX_RATE = 0.05; //5% tax double subtotal; subtotal = price_par * number_par; return (subtotal + subtotal * TAX_RATE); }
  8. c. Gọi hàm • Tên_hàm(tham_số_1, …, tham_số_n) • Giá trị được truyền vào các tham số của hàm sẽ được sử dụng trong phần thân hàm. – Pass by value: giá trị truyền vào là bản sao của giá trị lưu trữ trong biến đóng vai trò tham số đầu vào • Giá trị tham số không thay đổi khi được sử dụng trong thân hàm • Gọi hàm tham trị loại bỏ các thay đổi ngoài ý muốn lên các tham số – Pass by reference: giá trị truyền vào là địa chỉ của tham số đầu vào • Giá trị tham số có thể thay đổi khi được sử dụng trong thân hàm, do truyền biến gốc chứ không phải bản sao • Thay đổi giá trị của đối số trong hàm sẽ ảnh hưởng hoặc thay đổi trực tiếp lên biến gốc
  9. Ví dụ void square_num (int *); Khai báo hàm int main() { int p = 5; printf ("P is now %d\n", p); square_num (&p); Truyền địa chỉ của p vào hàm square_num printf ("P is now %d\n", p); Hàm thay đổi giá trị của p thành 25 return 0; } void square_num (int *num) Định nghĩa hàm, tham số vào là { con trỏ num trỏ điến giá trị kiểu int (*num)= (*num) * (*num); } * biểu diễn giá trị mà con trỏ num trỏ đến
  10. Viết hàm để hoán đổi giá trị hai biến? void trao_doi(int so1, int so2) { int temp; temp = so1; so1 = so2; so2 = temp; } void sap_xep_mang(int *a, int n) { int i, j, temp; for (i=0; i
  11. Viết hàm để hoán đổi giá trị hai biến? void trao_doi(int *so1, int *so2) { int temp; temp = *so1; *so1 = *so2; *so2 = temp; } void sap_xep_mang(int *a, int n) { int i, j; for (i=0; i
  12. d. Biến tham chiếu trong C++ • Cú pháp: – kieuDL &ten_bien; • Bí danh của biến khác – Thay đổi biến tham chiếu (bí danh) sẽ làm thay đổi giá trị của biến được tham chiếu • Ví dụ: – int count = 1; – int &ref = count; //ref là bí danh của count – ++ref; //tăng count lên 1,sử dụng bí danh ref
  13. e. Tham số kiểu tham chiếu trong C++ • Giống tham số được khai báo var trong Pascal • Thay đổi tham số kiểu tham chiếu (tham số hình thức) trong thân hàm sẽ làm thay đổi tham số thực khi truyền. void trao_doi(int &x, int &y) { int temp = x; x = y; y = temp; } • Gọi hàm: int a=5, b=8; trao_doi(a, b); • Với cách gọi hàm này, C++ tự gửi địa chỉ của a và b làm tham số cho hàm trao_doi().
  14. Ví dụ - Hàm tham chiếu #include int x = 4; int & myFunc() { return x; } int main() { cout
  15. 2. Nguyên tắc chung • Mỗi CTC đều phải được thiết kế tốt, có khả năng cài đặt và kiểm thử độc lập: – Giao diện được tối thiểu hóa – Phân tách phần giao diện và phần cài đặt – Bao gói dữ liệu – Quản lý tài nguyên trước sau như một – Thiết lập các hợp đồng và thông báo lỗi đến cho người dùng
  16. 2. Nguyên tắc chung • Tuân thủ các quy tắc đặt ra. – Chỉ nên vi phạm 1 quy tắc nếu được đền bù bằng thứ đáng để mạo hiểm • Phong cách lập trình cần phải nhất quán. – Nếu bạn chấp nhận một quy tắc như cách thức đặt tên hàm hay biến, hằng thì hãy tuân thủ nó trong toàn bộ chương trình. • Mỗi chương trình con (CTC) phải có một nhiệm vụ rõ ràng. – Có 2 loại CTC: functions và procedures. Functions chỉ nên tác động tới duy nhất 1 giá trị - giá trị trả về của hàm – Một CTC phải đủ ngắn để người đọc có thể nắm bắt được chức năng của nó: tính toán, đánh giá hay biến đổi dữ liệu – Tối thiểu hóa số các tham số của CT con. • > 6 tham số cho 1 CTC là quá nhiều
  17. 2. Nguyên tắc chung • Đơn giản hóa vấn đề - Problem Simplification: – Để tăng hiệu quả của chương trình, hãy đơn giản hóa vấn đề mà nó giải quyết. • Đơn giản hóa mã nguồn – Code Simplification : – Hầu hết các chương trình chạy nhanh là đơn giản. – Vì vậy, hãy đơn giản hóa chương trình để nó chạy nhanh hơn. • Không ngừng nghi ngờ - Relentless Suspicion: – Đặt câu hỏi về sự cần thiết của mỗi đoạn mã nguồn, mỗi thuộc tính và mỗi dữ liệu thành viên trong cấu trúc dữ liệu. • Liên kết sớm - Early Binding: – Hãy thực hiện ngay công việc để tránh thực hiện nhiều lần sau này.
  18. a. Đặt tên • Tên hàm / thủ tục: – Phải ngắn gọn và có tính chất gợi nhớ – Phải là động từ hoặc cụm động từ – Bắt đầu bằng chữ in hoa/in thường một cách thống nhất • Tên tham số: bất kỳ tên hợp lệ nào – Không nên trùng với tên của các biến trong CT
  19. b. Trừu tượng hóa quy trình nghiệp vụ • “Black Box”: hộp đen tham chiếu tới thứ mà ta biết cách sử dụng, nhưng ta không biết phương thức hoạt động hay thao tác chi tiết của nó • Người dùng chương trình không cần biết chương trình được viết như thế nào, nhưng cần biết chương trình đó dùng để làm gì • Xây dựng hàm/thủ tục như là các hộp đen: – LTV – người sử dụng hàm – cần biết hàm đó làm gì, không cần biết làm thế nào – LTV cần biết nếu đưa đúng các tham số vào hộp đen thì hộp đen sẽ trả ra kết quả gì
  20. c. Che giấu thông tin • Thiết kế các hàm/thủ tục dưới dạng các hộp đen chính là ví dụ của việc che giấu thông tin – Hàm được sử dụng mà không cần biết nó được viết như thế nào – Thân hàm được giấu đi • Điều này cho phép LTV – Thay đổi hoặc nâng cao hiệu quả của hàm bằng cách viết lại phần định nghĩa hàm – Đọc phần khai báo hàm và các chú thích tương ứng để biết cách sử dụng hàm
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2