Khái niệm và tính chất
Dạng tổng quát của hàm
Lời gọi hàm
Nguyên tắc hoạt động của hàm
Truyền tham số cho hàm
Tham số mặc định
Biến cục bộ, biến toàn cục
Nguyên mẫu hàm
Đệ qui
Một số bài toán đệ qui thông thường
80 trang |
Chia sẻ: candy98 | Lượt xem: 526 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Bài giảng Phương pháp lập trình - Chương 3: Hàm (Function), để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Chương 3HÀM (Function)Nội dung trình bàyKhái niệm và tính chấtDạng tổng quát của hàmLời gọi hàmNguyên tắc hoạt động của hàmTruyền tham số cho hàmTham số mặc địnhBiến cục bộ, biến toàn cụcNguyên mẫu hàmĐệ quiMột số bài toán đệ qui thông thườngKhái niệm và tính chấtTrong những chương trình lớn, có những đoạn chương trình cần lặp lại nhiều lầnĐể tránh sự lặp lại và để việc kiểm tra chương trình được thuận lợi, khi viết chương trình người ta thường phân chia chương trình thành nhiều module, mỗi module giải quyết một công việcCác module như vậy gọi là các hàmHàm là một khối lệnh được đặt tên và có thể được thực thi nhiều lần trong chương trình khi được gọiKhái niệm và tính chấtHàm có thể được gọi từ chương trình chính (hàm main) hoặc từ một hàm khácHàm có thể được gọi nhiều lần trong chương trìnhHàm có thể trả về giá trị cho chương trình gọi hoặc khôngHàm còn gọi là chương trình con (subroutine)Khái niệm và tính chấtCó hai loại hàmHàm thư việnLà những hàm đã được xây dựng sẵn trong C/C++Muốn sử dụng các hàm thư viện phải khai báo thư viện chứa nó trong phần khai báo #includeVí dụ:Hàm do người lập trình định nghĩaNội dung trình bàyKhái niệm và tính chấtDạng tổng quát của hàmLời gọi hàmNguyên tắc hoạt động của hàmTruyền tham số cho hàmTham số mặc địnhBiến cục bộ, biến toàn cụcNguyên mẫu hàmĐệ quiMột số bài toán đệ qui thông thườngDạng tổng quát của hàmreturnType: Kiểu dữ liệu trả về của hàmNếu hàm không trả về giá trị thì returnType là voidfunctionName: Tên hàm, cách đặt giống như tên biếnparameterList: Danh sách các tham số hình thức, có thể để trốngMỗi tham số gồm kiểu dữ liệu và tên biến, các tham số phân cách nhau bởi dấu phẩyThân hàm (nội dung hàm) nằm trong cặp dấu ngoặc { }returnType functionName ( [parameterList] ){ // body of the function}Tiêu đề hàm (header)Ví dụ: Hàm tính cv, dt hình trònvoid CV_DT_HTron(float bk){ float cv, dt; cv = 2*3.14*bk; dt = 3.14*bk*bk; coutb) max = a; else max = b; return max; }void TimMax(int a, int b) { int max; if (a>b) max = a; else max = b; coutvoid divide(float arg1, float arg2){ if(arg2==0.0){ cout>num1>>num2; divide(num1,num2);}Ví dụ: Dùng return để trả về giá trị#includeint square(int num){ return num*num;}void main(){ int number, result; cout>number; result = square(number); coutvoid displayMessage(){ coutvoid max(int a, int b){ coutb) cout>a; cout>b; max(a, b); //gọi hàm}Ví dụ 3: Định nghĩa và gọi hàm#includeint max(int a, int b){ if (a>b) return a; else return b;}void main(){ int a, b; //chuẩn bị tham số gọi hàm cout>a; cout>b; int m; //2.1 khai báo biến m = max(a, b); //2.2 gọi hàm và lấy giá trị cout>a>>b; USC = uscln(a,b); coutb) a-=b; else b-=a; } return a;}Nguyên tắc hoạt động của hàm (tt)Nội dung trình bàyKhái niệm và tính chấtDạng tổng quát của hàmLời gọi hàmNguyên tắc hoạt động của hàmTruyền tham số cho hàmTham số mặc địnhBiến cục bộ, biến toàn cụcNguyên mẫu hàmĐệ quiMột số bài toán đệ qui thông thườngTruyền tham số cho hàmTham số hình thứcLà các tham số được khai báo trong cặp dấu ( ) sau tên hàmKhông cần biết giá trị thậtChỉ cần biết ý nghĩa và kiểu dữ liệu của từng tham sốTham số thựcLà các giá trị thật được gán cho các tham số hình thức khi gọi hàmVí dụ: Tham số hình thức và tham số thựcĐể tìm giá trị nhỏ nhất của 15 và 7, ta có thể gọi hàm trên như sau (2 cách): int minAB = min(15, 7); hoặc Như vậy: 15 được sao chép cho biến a, 7 được sao chép cho biến bTham số hình thứcint min(int a, int b){ if (aint tong(int a, int b){ return a+b;}void main(){ int x=5, y=3, z; z=tong(x,y); coutvoid displayValue(int num){ coutvoid GapDoi(int a){ a = a*2; coutvoid Foo (int num){ num = 0; coutvoid GapDoi(int &a){ a = a*2; coutvoid GapDoi(int *a){ *a = (*a)*2; coutvoid CV_DT_HTron(float bk, float &cv, float &dt){ cv = 2*3.14*bk; dt = 3.14*bk*bk; }void main(){}Ví dụ: Truyền tham số kiểu tham chiếu#includevoid swap(int &a, int &b){ int temp; temp = a; a = b; b = temp;}void main(){ int x = 20, y = 40; swap(x, y); cout void displayStars(int cot=10, int dong=1){ for (int i=0; ivoid func();void main(){ int num=1; coutvoid showStatic();void main(){ for (int count=0; countint N;void sub_fun();void main(){ int n2; N=10; n2=20; //n2 là biến cục bộ của hàm main coutvoid func();int num=2; // khai báo biến toàn cụcvoid main(){ int num=1; coutfloat n=42.8;void sub();void main(){ float n=30.5; cout float n=42.8;void sub();void main(){ float n=30.5; cout // Khai báo thư viện iostream.hint max(int x, int y); // khai báo nguyên mẫu hàm maxvoid main() //hàm main{int a, b;cout>a>>b;couty) ? x : y;}Cấu trúc chung của 1 chương trình58Cấu trúc chung của 1 chương trình59Ví dụ: Biến toàn cục và cục bộ#include int i =0; // Global variable void f1(){ int i=0; // local variable for f1 i = 50; }void main(){ int i ; // local variable for main f1() ; i =0; cout<<"value of i in main "<< i<<endl; f1(); cout<<"value of i after call "<< i<<endl; }60Kết quả???Nội dung trình bàyKhái niệm và tính chấtDạng tổng quát của hàmLời gọi hàmNguyên tắc hoạt động của hàmTruyền tham số cho hàmTham số mặc địnhBiến cục bộ, biến toàn cụcNguyên mẫu hàmĐệ quiMột số bài toán đệ qui thông thườngĐệ qui (Recursion)Một hàm được gọi là đệ qui nếu một lệnh trong thân hàm gọi đến chính hàm đóVí dụ: void Test() { Test(); }Một chương trình đệ quy hoặc một định nghĩa đệ quy thì không thể gọi đến chính nó mãi mãi mà phải có một điểm dừng đến một trường hợp đặc biệt nào đó, mà ta gọi là trường hợp suy biến (degenerate case)Ví dụ: Ta định nghĩa n! như sau:Ví dụ: hàm đệ quiHoặcint GiaiThua(int n) {int t;if (n==0) return 1;t = n*GiaiThua(n-1); // gọi đệ quireturn t;}int GiaiThua(int n) {if (n==0) return 1; return n*GiaiThua(n-1); // gọi đệ qui}Phương pháp thiết kế một giải thuật đệ quy:Tham số hoá bài toánPhân tích trường hợp chung : đưa bài toán dưới dạng bài toán cùng loại nhưng có phạm vi giải quyết nhỏ hơn theo nghiã dần dần sẽ tiến đến trường hợp suy biếnTìm trường hợp suy biến64Đệ qui: PP thiết kếĐệ qui: PP thiết kếChương trình đệ quy gồm hai phần chính:Phần cơ sở: Điều kiện thoát khỏi đệ quy (điểm dừng)Phần đệ quy: Trong phần thân chương trình có lời gọi đến chính bản thân chương trình với giá trị mới của tham số nhỏ hơn giá trị ban đầu65 Quy trình hoạt động hàm đệ quiVí dụ: Lập hàm tính n! bằng đệ quy int GT(int n) { if (n==0) // điểm dừng return 1; else return n*GT(n-1); }6667 Quy trình hoạt động hàm đệ quiGọi hàm answer <- GT(5)CT chính: Chưa xong: answer <- GT(5)Minh họa68 Quy trình hoạt động hàm đệ quiCT chính: Chưa xong: answer <- GT(5) GT. 1st: N=5, Chưa xong: 5*GT(4)Minh họa69 Quy trình hoạt động hàm đệ quiCT chính: Chưa xong: answer <- GT(5)GT. 1st: N=5, Chưa xong: 5*GT(4)GT. 2nd: N=4, Chưa xong: 4*GT(3)Minh họa70 Quy trình hoạt động hàm đệ quiCT chính: Chưa xong: answer <- GT(5)GT. 1st: N=5, Chưa xong: 5*GT(4)GT. 2nd: N=4, Chưa xong: 4*GT(3)GT. 3rd: N=3, Chưa xong: 3*GT(2)Minh họa71 Quy trình hoạt động hàm đệ quiCT chính: Chưa xong: answer <- GT(5)GT. 1st: N=5, Chưa xong: 5*GT(4)GT. 2nd: N=4, Chưa xong: 4*GT(3)GT. 3rd: N=3, Chưa xong: 3*GT(2)GT. 4th: N=2, Chưa xong: 2*GT(1)Minh họa72 Quy trình hoạt động hàm đệ quiCT chính: Chưa xong: answer <- GT (5)GT. 1st: N=5, Chưa xong: 5*GT(4)GT. 2nd: N=4, Chưa xong: 4*GT(3)GT. 3rd: N=3, Chưa xong: 3*GT(2)GT. 4th: N=2, Chưa xong: 2*GT(1)GT. 5th: N=1, Chưa xong: 1*GT(0)Minh họa73 Quy trình hoạt động hàm đệ quiCT chính: Chưa xong: answer <- GT(5)GT. 1st: N=5, Chưa xong: 5*GT(4)GT. 2nd: N=4, Chưa xong: 4*GT(3)GT. 3rd: N=3, Chưa xong: 3*GT(2)GT. 4th: N=2, Chưa xong: 2*GT(1)GT. 5th: N=1, Chưa xong: 1*GT(0)GT. 6th: N=0, xong: returns 1Minh họa74 Quy trình hoạt động hàm đệ quiCT chính: Chưa xong: answer <- GT(5)GT. 1st: N=5, Chưa xong: 5*GT(4)GT. 2nd: N=4, Chưa xong: 4*GT(3)GT. 3rd: N=3, Chưa xong: 3*GT(2)GT. 4th: N=2, Chưa xong: 2*GT(1)GT. 5th: N=1, xong: returns 1*1Minh họa75 Quy trình hoạt động hàm đệ quiCT chính: Chưa xong: answer <- GT(5)GT. 1st: N=5, Chưa xong: 5*GT(4)GT. 2nd: N=4, Chưa xong: 4*GT(3)GT. 3rd: N=3, Chưa xong: 3*GT(2)GT. 4th: N=2, xong: returns 2*1Minh họa76 Quy trình hoạt động hàm đệ quiCT chính: Chưa xong: answer <- GT(5)GT. 1st: N=5, Chưa xong: 5*GT(4)GT. 2nd: N=4, Chưa xong: 4*GT(3)GT. 3rd: N=3, xong: returns 3*2Minh họa77 Quy trình hoạt động hàm đệ quiCT chính: Chưa xong: answer <- GT(5)GT. 1st: N=5, Chưa xong: 5*GT(4)GT. 2nd: N=4, xong: returns 4*6Minh họa78 Quy trình hoạt động hàm đệ quiCT chính: Chưa xong: answer <- GT(5)GT. 1st: N=5, xong: returns 5*24Minh họa79 Quy trình hoạt động hàm đệ quiCT chính: xong: answer <- 120Minh họaMột số bài toán đệ qui thông thường