Bài giảng Kỹ thuật lập trình - Tuần 9: Hàm và việc tổ chức chương trình

pdf 18 trang phuongnguyen 3230
Bạn đang xem tài liệu "Bài giảng Kỹ thuật lập trình - Tuần 9: Hàm và việc tổ chức chương trình", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_ky_thuat_lap_trinh_tuan_9_ham_va_viec_to_chuc_chuo.pdf

Nội dung text: Bài giảng Kỹ thuật lập trình - Tuần 9: Hàm và việc tổ chức chương trình

  1. 10/25/2016 Kỹ thuật lập trình Tuần 9 - Hàm và việc tổ chức chương trình Giáo viên: Hà Đại Dương duonghd@mta.edu.vn 10/25/2016 1 Vấn đề • Các chương trình đã viết (từ đầu môn học): – Ngắn gọn – Dễ hiểu (??) – Dễ quản lý về logic (??) • Chương trình lớn: hàng nghìn, triệu dòng lệnh, có nhiều đoạn tương tự nhau. Làm sao để quản lý được logic chương trình? Không phải viết những đoạn code lặp lại 10/25/2016 2 Modul hoá chương trình • Chia chương trình thành những modul (đoạn) chuyên biệt nhằm thực hiện một công việc nào đó. • Logic trong mỗi modul có thể được kiểm soát dễ dàng hơn • Logic của cả chương trình thông qua việc sử dụng các modul cũng trở nên dễ dàng, tường minh hơn. 10/25/2016 3 1
  2. 10/25/2016 Ví dụ • Viết chương trình nhập vào 2 ma trận A, B tính và in ra ma trận tổng C = A+B. • Có thể chia bài toán trên (chương trình của bài toán đó) thành các modul: – Nhập ma trận A – Nhập ma trận B – Tính ma trận tổng – In ma trận kết quả. 10/25/2016 4 Modul hoá • Ở ví dụ trên có 2 công việc: – Nhập ma trận A – Nhập ma trận B • Có thể nhận thấy chúng tương đối giống nhau. • Làm sao để không phải viết lại? • Modul hoá giúp có thể khái quát hoá vấn đề nào đó (ví dụ là nhập ma trận) thành một vấn đề chung và có thể sử dụng nhiều lần. 10/25/2016 5 Ví dụ • Bài toán xét xem điểm M nằm trong hay ngoài tam giác ABC. • Một phương pháp khả thi là: – Tính sABC, sMAB, sMBC, và sMAC – So sánh Nếu sABC > sMAB+sMBC+sMAC: M ngoài ABC và ngược lại. 10/25/2016 6 2
  3. 10/25/2016 Modul hoá • Như vậy có thể khái quát việc tính diện tích tam giác thành một hàm để tính các diện tích sABC, sMAB, sMBC, và sMAC. 10/25/2016 7 Nội dung bài học • Hàm (function) là gì? • Khai báo (viết hàm) • Gọi (sử dụng) hàm • Một số vấn đề khác: – Hàm không trả về giá trị – Các dạng tham số của hàm – Hàm trùng tên – Hàm với đối mặc định – Khai báo nguyên hàm 10/25/2016 8 Hàm (function) 10/25/2016 9 3
  4. 10/25/2016 Hàm (function) • Trong C mỗi modul được hiểu là 1 hàm • Hàm: – Là một modul (đoạn) nhằm thực hiện một công việc nào đó. – Truyền vào một số tham số – Trả về một giá trị (qua tên hàm) • Khi nào viết hàm: – Cầm tách biệt 1 chức năng nào đó – Khái quát hoá 1 công việc để tránh viết lại 10/25/2016 10 Khai báo hàm 10/25/2016 11 Khai báo hàm • Cú pháp: Kiểu Tên_Hàm(Danh sách tham số đầu vào) { Các lệnh của C return Biểu_Thức; } 10/25/2016 12 4
  5. 10/25/2016 Trong đó • Kiểu: Là kiểu dữ liệu trả về thông qua tên hàm – Là void nếu không trả về kiểu dữ liệu cụ thể (xét sau) • Tên_Hàm: Tên theo qui tắc đặt tên trong C – Tuy nhiên C cho phép đặt tên hàm trùng nhau nhưng phải có sự khác nhau về: số các tham số hoặc/và kiểu dữ liệu của các tham số đó. • return: Lệnh (từ khoá) của C. 10/25/2016 13 Trong đó • Danh sách các tham số đầu vào – Tên, – kiểu và – số lượng các tham số • Biểu_Thức: Giá trị của biểu thức này được trả về qua tên hàm, và có kiểu cùng với Kiểu của hàm. 10/25/2016 14 Ví dụ 1 • Hàm tính khoảng cách khi biết toạ độ 2 điểm (a, b) trong không gian: – Toạ độ của a: (ax, ay) – Toạ độ của b: (bx, by) – Khoảng cách (eclide) từ a đến b là kc = Căn bậc 2 của (ax-bx)2+(ay-by)2 – Trong C hàm lấy căn bậc 2 là sqrt() trong thư viện math.h 10/25/2016 15 5
  6. 10/25/2016 Ví dụ 1 Kiểu Tên hàm Danh sách các tham số đầu vào Các lệnh của C Biểu thức trả về 10/25/2016 16 Gọi hàm 10/25/2016 17 Gọi hàm • Cú pháp: Tên_hàm(Các tham số đầu vào thực) • Ví dụ tính khoảng cách từ (1,2) đến (5,3) kc(1, 2, 5, 3) – 1: Tham số thực tương ứng với ax – 2: Tham số thực tương ứng với ay – 5: Tham số thực tương ứng với bx – 3: Tham số thực tương ứng với by 10/25/2016 18 6
  7. 10/25/2016 Ví dụ 2 • Viết chương trình tính diện tích tam giác ABC (khi biết toạ độ các điểm A, B, C). • Diện tích ABC khi biết độ dài 3 cạnh (l,m,n) SABC = sqrt(p*(p-l)*(p-m)*(p-n)) • Không dùng hàm -> Vẫn làm được, nhưng phải viết các đoạn code lặp lại. • Sử dụng hàm kc() ở ví dụ 1 (15 phút) 10/25/2016 19 Ví dụ 2 Lời gọi hàm kc() 10/25/2016 20 Hàm không trả về giá trị 10/25/2016 21 7
  8. 10/25/2016 Khai báo • Cú pháp: void Tên_Hàm(Danh sách tham số đầu vào) { Các lệnh của C [return;] } • Nhằm thực hiện 1 công việc nào đó. 10/25/2016 22 Ví dụ 3 • Viết hàm in kết quả diện tích của tam giác 10/25/2016 23 10/25/2016 24 8
  9. 10/25/2016 Tham số của hàm 10/25/2016 25 Bài toán đổi giá trị 2 số • Có 2 số a, b viết hàm cho phép đổi chỗ 2 số này. • Sau khi thực hiện a có giá trị của b và ngược lại b có giá trị của a. 10/25/2016 26 Ví dụ 4 10/25/2016 27 9
  10. 10/25/2016 Ví dụ 4 • Kết quả a, b không đổi cho nhau vì sao? 10/25/2016 28 • Trong hàm DoiCho x, y là tham số đầu vào và là 2 biến cục bộ của DoiCho. • Trong lời gọi hàm: – a là tham số thực tương ứng với x – b là tham số thực tương ứng với y. • Biến x nhận giá trị của a và biến y nhận giá trị của b. • Trong DoiCho x, y thực sự đổi chỗ cho nhau nhưng điều đó không ảnh hưởng đến a,b. 10/25/2016 29 Tham số dạng con trỏ • Để hàm DoiCho() thực sự đổi được giá trị của a và b Khai báo x, y dạng con trỏ 10/25/2016 30 10
  11. 10/25/2016 Tham số dạng con trỏ • Để hàm DoiCho() thực sự đổi được giá trị của a và b Thực hiện lời gọi hàm 10/25/2016 31 10/25/2016 32 Tham số dạng tham chiếu • Để hàm DoiCho() thực sự đổi được giá trị của a và b Khai báo x, y dạng tham chiếu (C++) 10/25/2016 33 11
  12. 10/25/2016 Tham số dạng tham chiếu • Để hàm DoiCho() thực sự đổi được giá trị của a và b Thực hiện lời gọi hàm 10/25/2016 34 10/25/2016 35 Hàm với các dạng tham số đầu vào Gọi hàm Ba cách khai báo tham số Tham trị a, b không đổi Con trỏ 10/25/2016 Tham chiếu 36 12
  13. 10/25/2016 Hàm trùng tên 10/25/2016 37 Vấn đề • Đã có hàm DoiCho(x,y) với x, y là số nguyên. • Muốn xây dựng hàm đổi chỗ 2 số thực làm thế nào? – Viết hàm với tên khác: Khả thi, nhưng hơi phiền hà khi sử dụng. – Viết hàm trùng tên, cũng là DoiCho(x,y) nhưng các tham số x, y là thực: C/C++ cho phép làm điều này. • C/C++ cho phép viết các hàm trùng tên nhưng phải khác nhau về số lượng và/hoặc kiểu dữ 10/25/2016liệu của các tham số. 38 Thêm hàm DoiCho 2 số thực 10/25/2016 39 13
  14. 10/25/2016 Thêm hàm DoiCho 2 số thực 10/25/2016 40 Thêm hàm DoiCho 2 số thực • Kết quả 10/25/2016 41 Hàm với đối mặc định 10/25/2016 42 14
  15. 10/25/2016 Vấn đề • C++ cho phép khai báo tham số với giá trị mặc định để khi gọi có thể truyền giá trị cho các tham số này hoặc không. Khi không truyền thì các tham số này nhận giá trị mặc định. 10/25/2016 43 Cú pháp Kiểu Tên_Hàm(Kiểu1 th1, , Kiểu tm1 = gt1, ) { Các lệnh của C return Biểu_Thức; } • Ví dụ: Viết hàm tính luỹ thừa y của x. 10/25/2016 44 Ví dụ 5 - Hàm luythua 10/25/2016 Truyền 2 cho n Không tuyền Truyền 3 cho n 45 15
  16. 10/25/2016 Khai báo nguyên hàm 10/25/2016 46 Vấn đề • Ở ví dụ 5 đưa luythua() về sau main() ?? 10/25/2016 47 Khi biên dịch • Xuất hiện thông báo lỗi 10/25/2016 48 16
  17. 10/25/2016 Khai báo nguyên hàm (prototype) • Ý nghĩa: Khai báo dạng thức của hàm bao gồm tên hàm, số lượng và kiểu các tham số đầu vào, kiểu giá trị trả về của hàm. • Cú pháp Kiểu Tên_Hàm(Danh sách tham số); • Ví trí: Thường đặt trước hàm main() 10/25/2016 49 Ví dụ 6 10/25/2016 50 Bài tập 10/25/2016 51 17
  18. 10/25/2016 Bài tập 1. A, B, C và M là các điểm trên mặt phẳng. Viết chương trình kiểm tra xem M có nằm trong tam giác ABC hay không? Tổ chức thành các hàm: – Tính khoảng cách – Tính diện tích – Nhập dữ liệu từ fie (không trả về giá trị) 10/25/2016 52 Bài tập 2. Viết chương trình nhập 1 mảng n phần tử từ file dữ liệu dạng text, sắp xếp tăng dần và in mảng đó ra màn hình. Tổ chức thành các hàm – Nhập mảng từ file – Sắp xếp – In danh sách 10/25/2016 53 Bài tập về nhà 1. Hàm chuẩn hoá họ tên 2. Hàm tính số ngày giữa 2 ngày 3. Hàm đổi số tiền dạng số thành chữ 4. Hàm tính số tiền taxi 5. Hàm tính số tiền điện 10/25/2016 54 18