Bài giảng Lập trình cơ bản - Chương 5: Thủ tục và hàm - Lê Đức Long

pdf 39 trang huongle 3090
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình cơ bản - Chương 5: Thủ tục và hàm - Lê Đức Long", để 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_lap_trinh_co_ban_chuong_5_thu_tuc_va_ham_le_duc_lo.pdf

Nội dung text: Bài giảng Lập trình cơ bản - Chương 5: Thủ tục và hàm - Lê Đức Long

  1. THỦ TỤC VÀ HÀM NGÔ QUỐC VIỆT TP.HCM-2011
  2. NỘI DUNG 1. Khái niệm thủ tục và hàm. 2. Cách khai báo và sử dụng hàm 3. Khái niệm prototype 4. Cách truyền tham số, tham biến. 5. Biến cục bộ, toàn cục Ngô Quốc Việt-Lập trình cơ bản 2
  3. SỰ CẦN THIẾT CỦA TÁCH NHỎ  Thực tế: luôn tách vấn đề lớn thành các vấn để nhỏ hơn. Vấn đề “nhỏ hơn” lại có thể tách thành các “nhỏ hơn nữa”.  Mỗi “nhỏ không chia nữa” đảm nhiệm một nhiệm vụ/chức năng thuật ngữ task/function  Các task/function ghép lại để có được bộ phận lớn hơn. Nnlt gọi là hàm-function.  Khái niệm hàm trong nnlt đóng vai trò tương tự.  Mỗi “hàm” đảm nhiệm một vai trò.  Kết nối các hàm để thành một chương trình. Ngô Quốc Việt-Lập trình cơ bản 3
  4. SỰ CẦN THIẾT CỦA TÁCH NHỎ  Nhắc lại hàm main trong ngôn ngữ C.  Chứa điểm bắt đầu và lệnh kết thúc của chương trình (lệnh return cuối hàm main).  Mọi ngôn ngữ đều có quy ước tương tự như hàm main() nhưng tên có thể khác.  Tất cả lệnh đặt trong “main” ?  Ưu điểm: ???  Nhựợc điểm: quá dài; không dễ đọc; khó bảo trì ?  Không thể hiệu quả nếu tất cả đặt trong main.  Cần tách “main” thành những phần nhỏ  hàm.  Đơn giản nhất: mỗi hàm thực hiện một phần code của main(). Ngô Quốc Việt-Lập trình cơ bản 4
  5. THỦ TỤC VÀ HÀM  Thủ tục – procedure. Hàm – function.  Phần lớn nnlt sử dụng thuật ngữ ‘hàm’.  Hàm là một “đoạn mã” được “đóng gói” thực hiện một khối công việc nhất định của chương trình.  “Đóng gói” : mỗi hàm có tên và viết theo quy cách nhất định tuỳ theo nnlt.  Ví dụ: hàm main() trong C/C++ là một hàm. Là hàm chính trong kiểu chương trình Console. Ngô Quốc Việt-Lập trình cơ bản 5
  6. CÁCH KHAI BÁO MỘT HÀM (arg1, arg2, )  Tên hàm: đặt theo quy cách đặt tên của nnlt. Theo cách đặt tên biến/hằng.  Kiểu trả về: các kiểu dữ liệu cơ bản của nnlt hoặc các kiểu dữ liệu có cấu trúc (thảo luận sau). Mỗi hàm chỉ trả về một giá trị mỗi lần thực hiện. Một hàm chỉ có một OUTPUT.  (arg1, arg2, ): danh sách các tham số dùng làm INPUT cho hàm. Không có ba dấu chấm.  Không có dấu chấm phẩy sau tên hàm, phải có cặp dấu ngoặc ( ) sau tên hàm nếu hàm không có tham số truyền vào. Ngô Quốc Việt-Lập trình cơ bản 6
  7. CÁCH KHAI BÁO MỘT HÀM  Chú thích đầu hàm  Name: tên hàm  Description: hàm làm gì – what  Tham số: xác định từng tham số của hàm  Giá trị trả về: mô tả output của hàm  Tên hàm cùng các tham số  Thân hàm: phần nằm giữa cặp dấu { }. Lệnh cuối cùng của hàm là return. Ngô Quốc Việt-Lập trình cơ bản 7
  8. CÁCH KHAI BÁO MỘT HÀM Ngô Quốc Việt-Lập trình cơ bản 8
  9. Hàm không có tham số ()  Ví dụ khai báo hàm không tham số int get_value() ; hoặc int get_value(void); //chỉ dùng trong nnlt C  Hàm không có OUTPUT được gọi là thủ tục. Ví dụ void print_answer(int answer) ; Usage print_answer(45); //gọi hàm print_answer Ngô Quốc Việt-Lập trình cơ bản 9
  10. KHAI BÁO VÀ SỬ DỤNG HÀM  Hàm có thể không cần trả về kết quả. Mục tiêu cần thực hiện một tác vụ nhưng hàm gọi không cần lấy kết quả.  Sử dụng kiểu trả về void. void myGioPhut(int phut) Không có lệnh { return trước int gio; dấu } ??? gio = phut/60; phut = phut % 60; printf(“Bay gio la %d:%d”, gio, phut); }  Cuối hàm kiểu trả về void có thể có hay không lệnh return. Ngô Quốc Việt-Lập trình cơ bản 10
  11. KHAI BÁO VÀ SỬ DỤNG HÀM int myFunction(int arg1) //Hàm myFunction đặt trên main. Có cách //nào để đặt ở bất kỳ chỗ nào? { arg1++ ; return arg1; Hàm main gọi hàm myFunction. Lúc này, } hàm main được gọi là hàm gọi. int main(int argc, char* argv[ ]) { int x, y ; y = 0; x = myFunction(y); //Giá trị y trả về là y++ (=1). return 0; Hàm myFunction chạy } xong, chạy tiếp lệnh kế trong main. Lúc này, myFunction là hàm bị gọi Ngô Quốc Việt-Lập trình cơ bản 11
  12. KHAI BÁO VÀ SỬ DỤNG HÀM #include #include int power(int ix, int in) { int i, ip = 1; for(i = 1; i <= in; i++) ip *= ix; return ip; } int main(int argc, char *argv[]) { printf("2 mu 2 = %d.\n", power(2, 2)); printf("2 mu 3 = %d.\n", power(2, 3)); getch(); } Ngô Quốc Việt-Lập trình cơ bản 12
  13. KHAI BÁO VÀ SỬ DỤNG HÀM void main(void) Truyền tham số { printf("2 mu 2 = %d.\n", power(2, 2)); int power(int ix, int in) Gọi hàm power printf("2 mu 3 = %d.\n", power(2, 3)); { int i, ip = 1; getch(); } Kết thúc lần chạy. for(i = 1; i <= in; i++) Lệnh return quay ip *= ix; về hàm main. return ip; } Lệnh return để kết thúc một hàm và quay về hàm gọi Ngô Quốc Việt-Lập trình cơ bản 13
  14. PROTOTYPE HÀM  Prototype: phần khai báo hàm không chứa phần mã nguồn bên trong  Thường được đặt trên đầu tập tin mã nguồn. Có dấu ; int myFunction(int arg1); int main(int argc, char* argv[ ]) Hàm main gọi hàm { myFunction nên int y = myFunction(x); được đặt sau return 0; } int myFunction(int arg1) Hàm myFunction đặt { sau hàm main. }  Đối với nnlt C, các khai báo hàm được viết trong tập tin .H có cùng tên. Ngô Quốc Việt-Lập trình cơ bản 14
  15. PROTOTYPE CỦA HÀM  Các nnlt hướng đối tượng không sử dụng khái niệm “prototype”.  Mọi hàm đều bao gồm thân hàm.  Thảo luận trong học phần “Lập trình hướng đối tượng”. Ngô Quốc Việt-Lập trình cơ bản 15
  16. TẬP TIN .H TRONG NNLT C/C++  Chứa khai báo các prototype (không có mã nguồn bên trong).  Được #include từ các tập tin CPP. ptbac2.h ptbac2. cpp #include “ptbac2.h” double tinhDelta(int a, b, c); double tinhDelta(int a, int b, int c) { main.cpp return b*b-4*a*c; } #include “ptbac2.h” int main() Không viết hàm { tinhDelta ở đây int a, b, c; scanf(“% %d $d”, &a, &b, &c); double delta = tinhDelta(a, b, c); } Ngô Quốc Việt-Lập trình cơ bản 16
  17. SỬ DỤNG THƢ VIỆN BUILT-IN  Sử dụng #include trong C/C++ cho các tập mã nguồn .CPP để sử dụng các hàm có sẵn.  Ví dụ #include “conio.h” //dùng các hàm nhập xuất #include “stdio.h” //một số hàm chuẩn #include “math“ //các hàm toán học: sqrt, pow  Sinh viên đọc thêm các tài liệu về các hàm setw, printf, scanf, sqrt, pow, và một số hàm toán học khác.  Sử dụng import trong ngôn ngữ JAVA. Sử dụng using trong C#. Sinh viên đọc thêm tài liệu. Ngô Quốc Việt-Lập trình cơ bản 17
  18. THAM SỐ  Tham số - Parameters.  Dùng để truyền và nhận giữa hàm gọi và hàm bị gọi.  Tham số! Nhưng không phải chỉ truyền/nhận số.  Truyền: OK. Vì hàm bị gọi cần có INPUT để xử lý.  Nhận: ???. Mỗi hàm chỉ trả về một OUTPUT. Nếu cần nhiều hơn? Thảo luận sau.  Số lượng tham số của hàm: không nên nhiều quá. Ngô Quốc Việt-Lập trình cơ bản 18
  19. THAM TRỊ  Các giá trị đầu vào cho một hàm. Giá trị có thể là  Một hằng tường minh.  Một biến đã được gán giá trị.  Giá trị của biến (nếu được sử dụng) sẽ không bị thay đổi bởi bất cứ lệnh nào trong hàm bị gọi.  Cách khai báo (style1 arg1, style2 arg2) Ngô Quốc Việt-Lập trình cơ bản 19
  20. THAM TRỊ int myFunction(int x) { x +=10 ; return x; } int main(int argc, char* argv[ ]) { int x = 0, y ; int y = myFunction(x); //Giá trị y trả về là 10. printf(“Gia tri cua x va y la” %d %d”, x, y); //x vẫn là zero y = myFunction(5); //Giá trị y trả về là 15. printf(“Gia tri cua x va y la” %d %d”, x, y); //x vẫn là zero return 0; } Ngô Quốc Việt-Lập trình cơ bản 20
  21. NHÌN SÂU HƠN VỀ THAM TRỊ int myFunction(int x) Vùng nhớ dành cho { biến x và tham trị x x +=10 ; khác nhau. Hai “x” return x; này không liên quan. } int main(int argc, char* argv[ ]) Hai hàm khác nhau { có thể dùng cùng int x, y ; hoặc khác tên biến x = 0; cục bộ. int y = myFunction(x); //Giá trị y trả về là 10. printf(“Gia tri cua x va y la” %d %d”, x, y); //x vẫn là zero y = myFunction(5); //Giá trị y trả về là 15. printf(“Gia tri cua x va y la” %d %d”, x, y); //x vẫn là zero return 0; } Ngô Quốc Việt-Lập trình cơ bản 21
  22. THAM TRỊ HẰNG SỐ (const style1 arg1, style2 arg2)  Các tham trị hằng số không thể thay đổi trong hàm bị gọi. int myFunction(const int x) { x +=10 ; //error compiler int y = x; //OK return (y + 5); //OK }  Dùng trong trường hợp bảo đảm không thay đổi giá trị tham trị trong toàn bộ hàm bị gọi. Ngô Quốc Việt-Lập trình cơ bản 22
  23. THAM BIẾN  Tham biến – Reference parameters  Nhu cầu cần nhận nhiều hơn một kết quả trả về khi gọi hàm (vì mỗi hàm chỉ trả về một output).  Nhu cầu cần tác động thay đổi lên tham số truyền cho hàm.  Tham biến: là cách hiệu quả để trả về nhiều hơn một giá trị, hoặc cần thay đổi giá trị tham số của hàm gọi. Ngô Quốc Việt-Lập trình cơ bản 23
  24. KHAI BÁO VÀ SỬ DỤNG THAM BIẾN  NNLT C/C++: đặt dấu & trước tên tham số cần thay đổi hay nhận giá trị từ hàm bị gọi.  NNLT C#: đặt từ khóa ref trước tên tham số. void thamtri(int ix, int iy) void thambien(int &ix, int &iy) { { ix += 2; ix += 2; iy +=2; iy +=2; } } int main() Dấu & đặt { trước tên tham int ia = 5, ib = 6; số Ia = 5, ib= 7 thamtri(ia, ib); printf(“ia = %d, ib = %d”, ia, ib); Kiểu truyền thambien(ia, ib); tham số không printf(“ia = %d, ib = %d”, ia, ib); Ia = 7, ib= 9 thay đổi } Ngô Quốc Việt-Lập trình cơ bản 24
  25. BIẾN CỤC BỘ  Chỉ “sống” trong một hàm hoặc một khối lệnh. Không có ý nghĩa ngoài hàm đó.  Mục tiêu sử dụng: dùng làm biến tạm thời trong khối lệnh hay hàm để giải quyết công việc tạm thời. int tinhCount() { int iCount1; //biến iCount1 cục bộ trong hàm tinhCount { int count; //cục bộ trong khối lệnh count = 1; } count = 0; //error compiler, biến count không tồn tại ở đây return 0; }  Tham trị là các biến cục bộ trong hàm bị gọi. Ngô Quốc Việt-Lập trình cơ bản 25
  26. BIẾN TOÀN CỤC  Tồn tại khi chương trình còn hoạt động.  Khai báo ở một chỗ ngoài tất cả các hàm (đ/v C/C++).  Có thể sử dụng ở nhiều tập tin mã nguồn khác nhau.  Mục tiêu là chia sẻ thông tin dùng chung cho mọi hàm. Ví dụ: giờ bắt đầu chạy chương trình.  Ưu điểm: dễ viết chương trình. Chia sẻ thông tin chung của toàn bộ chương trình.  Nhược điểm: dễ nhầm lẫn, do có nhiều chỗ sử dụng.  Không nên tận dụng biến toàn cục vì rất dễ sai sót. Ngô Quốc Việt-Lập trình cơ bản 26
  27. Biến toàn cục và biến cục bộ Ngô Quốc Việt-Lập trình cơ bản 27
  28. Biến toàn cục và biến cục bộ int total; //total number of entries – global variable int count; //count of total entries - global variable int main() { Biến count toàn total = 0; cục bị che- count = 0; hidden trong đoạn này { int count; //local variable count = 1; printf(“Count cho nay la: %d”, count); } count = 2; //what is count? Không nên viết return 0; chƣơng trình kiểu này. Tại sao? } Ngô Quốc Việt-Lập trình cơ bản 28
  29. Tóm tắt các kiễu tham số Ngô Quốc Việt-Lập trình cơ bản 29
  30. Các câu hỏi ngắn 1. Các tham số nào có thể thay đổi trong hàm sau void onetwothree(int one, const int two, int &three, const int &four); 2. Sự khác nhau giữa hai hàm sau là gì int funct1(void); const int funct2(); Sinh viên đọc thêm kiểu static cho biến và tham số. Sinh viên đọc thêm khái niệm namespace. Sinh viên đọc thêm khai báo inline trong C/C++. Ngô Quốc Việt-Lập trình cơ bản 30
  31. Sử dụng #define trong C/C++  Từ khoá #define – còn gọi là macro. Dùng để định nghĩa hằng, hàm đơn giản thường sử dụng trong chương trình.  Định nghĩa hằng số (hạn chế sử dụng trong các nnlt mới)  #define SIZE 20  #define PASSWORD “12345”  Định nghĩa hàm  #define SQR(x) (x*x) Ngô Quốc Việt-Lập trình cơ bản 31
  32. Lập trình có cấu trúc Structured Programming  Xây dựng outline  Thay thế từng bước trong outline bằng các lệnh chi tiết hơn.  Tiếp tục thay thế các lệnh bằng các lệnh chi tiết hơn.  Lặp lại cho đến khi không chi tiết nữa.  Viết version đơn giản. Chưa quan tâm đến tất cả mọi chức năng cùng một lúc.  Viết từng hàm còn thiếu theo ouline  Tiếp tục viết hàm cho đến khi đầy đủ. Ngô Quốc Việt-Lập trình cơ bản 32
  33. Lập trình bottom-up  Thiết kế tổng thể chương trình, danh sách các hàm.  Viết trước mọi hàm nhỏ thực hiện các chức năng cần thiết.  Tiếp tục viết các hàm nhỏ (trên một mức-tổng quát hơn) thực hiện các chức năng cơ bản  Lắp ghép để thành các hàm tổng quát hơn.  Tiếp tục cho đến khi xong chương trình. Ngô Quốc Việt-Lập trình cơ bản 33
  34. Lập trình top-down  Thiết kế tổng thể chương trình.  Chia nhỏ dần từ hàm tổng quát đến chi tiết. Từ phức tạp đến đơn giản  Viết các hàm chính trước.  Xem các yêu cầu của các hàm chính, tiếp tục viết các hàm nhỏ hơn khi cần.  Tiếp túc cho đến khi hoàn thành Ngô Quốc Việt-Lập trình cơ bản 34
  35. Tóm tắt xây dựng hàm  Để xây dựng một hàm ta phải xác định mục đích của hàm là dùng để làm gì, trên cơ sở đó, ta mới xác định được các thành phần của hàm.  Mỗi hàm phải thực hiện một chức năng độc lập và tách biệt với các hàm khác.  Đối với hàm có giá trị trả về phải lưu ý kiểu dữ liệu phải tương ứng kiểu dữ liệu cả giá trị trả về và kiểu dữ liệu của biến được gán khi gọi hàm  Trường hợp hàm trả về từ hai loại giá trị trở lên thì phải có dòng chú thích cho trường hợp tương ứng để khi gọi hàm biết được kết quả  Đặt tên hàm sao cho gợi nhớ được chức năng  Gọi hàm phải truyền đủ tham số, đúng kiểu dữ liệu và đúng thứ tự của tham số Ngô Quốc Việt-Lập trình cơ bản 35
  36. Bài tập 1. Viết lại chương trình giải pt bậc 2 với hàm tính delta được tách riêng. 2. Viết chương trình cho phép nhập vào một số bất kỳ. Viết hàm kiểm tra một số là số nguyên tố . Chương trình ngừng khi số nhập vào là zero. 3. Viết chương trình thực hiện yêu cầu:  Nhập một số từ bàn phím, lưu biến iN. Nhập số vào biến x.  Nhập ký tự từ bàn phím, kiểm tra nếu phím ESC (giá trị ASCII = 26) thì ngừng lại.  Nếu ‘A’ hoặc ‘a’: gọi hàm tính x x x x  Nếu ‘F’ hoặc ‘f’: gọi hàm tính giai thừa của iN.  Nếu ‘P’ hoặc ‘p’: gọi hàm tính số nguyên tố lớn nhất mà nhỏ hơn iN. In số nguyên tố này ra. Ngô Quốc Việt-Lập trình cơ bản 36
  37. Bài tập 4. Viết chương trình theo yêu cầu sau  Khai báo biến float fMyfloat, double dMydouble  Nhập từ bàn phím (ngừng khi nhấn ESC) giá trị cho hai biến này.  Gọi hàm để in ra dạng IEEE754 cho số thập phân dMydouble đã nhập  Gọi hàm để in số thập phân fMyfloat đã nhập Ngô Quốc Việt-Lập trình cơ bản 37
  38. Bài tập 5. Viết chương trình nhập 2 số nguyên dương a, b. Tìm USCLN và BSCNN của hai số nguyên đó. 6. Viết chương trình nhập số nguyên dương n gồm k chữ số (0 < k ≤ 5) , tìm ước số lẻ lớn nhất của n 7. Nhập vào 3 số thực a, b, c và kiểm tra xem chúng có thành lập thành của một tam giác hay không. Nếu có hãy tính diện tích, chiều dài mỗi đường cao của tam giác và in kết quả ra màn hình.  Công thức tính diện tích s = sqrt(p*(p-a)*(p-b)*(p-c) ).  Công thức tính các đường cao: ha = 2s/a, hb=2s/b, hc=2s/c. Ngô Quốc Việt-Lập trình cơ bản 38
  39. CÁM ƠN ĐÃ THEO DÕI NGÔ QUỐC VIỆT TP.HCM - 2011