Tin học đại cương - Bài 3: Hàm

pdf 31 trang vanle 1890
Bạn đang xem 20 trang mẫu của tài liệu "Tin học đại cương - Bài 3: Hàm", để 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:

  • pdftin_hoc_dai_cuong_bai_3_ham.pdf

Nội dung text: Tin học đại cương - Bài 3: Hàm

  1. BÀI 3: HÀM Nguyễn Mạnh Hiển Khoa Công nghệ thông tin hiennm@tlu.edu.vn
  2. Nội dung bài giảng • Phân rã vấn đề • Định nghĩa hàm • Truyền tham số • Phạm vi của biến • Hàm chung
  3. Phân rã vấn đề • Phân rã một vấn đề lớn, phức tạp thành các vấn đề nhỏ hơn, dễ giải quyết hơn • VD: Phân rã vấn đề tính giá trị biểu thức 푷 = 풙 + 풙 + thành các vấn đề nhỏ hơn − VĐ nhỏ 1: Nhập giá trị cho x − VĐ nhỏ 2: Tính giá trị của P − VĐ nhỏ 3: In giá trị của P ra màn hình
  4. Phân rã vấn đề trong C++ dùng hàm • Phân rã vấn đề: VĐ lớn Chương trình C++ VĐ nhỏ 1 Hàm 1 VĐ nhỏ 1.1 Hàm 1.1 VĐ nhỏ 1.2 Hàm 1.2 VĐ nhỏ 2 Hàm 2 • Các công việc dùng thường xuyên cũng thường được viết thành hàm (như các hàm toán học trong thư viện C++ chuẩn)
  5. Trước đây ta đã biết cách gọi hàm trong thư viện C++ chuẩn #include #include using namespace std; int main() { double x = 1.44; double y = sqrt(1.44); // goi ham sqrt cout << y; // se in ra 1.2 return 0; }
  6. Bây giờ ta sẽ tự viết hàm của mình #include using namespace std; // Viet ham tinh tong cua hai so double tinh_tong(double x, double y) { double z = x + y; return z; } int main() { cout << tinh_tong(1.2, 1.3); // goi ham vua viet return 0; }
  7. Định nghĩa hàm (danh sách tham số) { các câu lệnh } • Danh sách tham số gồm không, một hoặc nhiều tham số (hình thức) − Mỗi tham số có dạng: − Các tham số cách nhau bởi dấu phẩy • Hàm phải trả về một giá trị có kiểu phù hợp với kiểu đã khai báo thông qua câu lệnh sau: return ;
  8. Ví dụ định nghĩa hàm double tinh_tong(double x, double y) { double z = x + y; return z; } • Trong ví dụ này: − Kiểu trả về: double − Tên hàm: tinh_tong − Danh sách tham số hình thức gồm x và y (đều có kiểu double) − Thân hàm (đặt giữa hai dấu ngoặc móc) gồm hai câu lệnh, trong đó có câu lệnh return để trả về giá trị cho hàm
  9. Gọi hàm • Cú pháp lời gọi hàm: (danh sách tham số) • Các tham số trong lời gọi hàm được gọi là tham số thực sự (để phân biệt với tham số hình thức trong định nghĩa hàm) • Vị trí của lời gọi hàm: − Trong phép gán: double tong = tinh_tong(1.2, 1.3); − Trong biểu thức: double x = tinh_tong(1.2, 1.3) + 2;
  10. Hàm không có giá trị trả về • Viết theo cú pháp sau: void (danh sách tham số) { các câu lệnh } • Ở đây, void là kiểu dữ liệu đặc biệt, chỉ ra rằng hàm không trả về giá trị thân của hàm không có câu lệnh return ; • Hàm không có giá trị trả về còn được gọi là thủ tục
  11. Ví dụ hàm không có giá trị trả về #include using namespace std; // Viet ham in loi chao ra man hinh void in_loi_chao() { cout << "Xin chao cac ban"; } int main() { in_loi_chao(); // Ham kieu void dung doc lap // thanh mot cau lenh. return 0; }
  12. Cấu trúc chương trình với hàm định nghĩa hàm 1 định nghĩa hàm 2 int main() { gọi hàm 1 gọi hàm 2 }
  13. Làm việc với hàm Viết hai hàm, một tính tổng và một tính hiệu của hai số thực, sau đó gọi chúng trong hàm main #include using namespace std; double tinh_tong(double x, double y) { double t = x + y; return t; } double tinh_hieu(double x, double y) { double h = x - y; return h; }
  14. Làm việc với hàm (tiếp) int main() { double a, b; cout > a; cout > b; // Chu y: Trong cac dinh nghia ham luc truoc, // x va y la cac tham so hinh thuc, con o day // a va b la cac tham so thuc su. double tong = tinh_tong(a, b); double hieu = tinh_hieu(a, b); cout << "Tong la " << tong << endl; cout << "Hieu la " << hieu << endl; return 0; }
  15. Truyền tham số cho hàm • Tham số hình thức là tham số trong định nghĩa hàm double tinh_tong(double x, double y) { } • Tham số thực sự là tham số trong lời gọi hàm double tong = tinh_tong(a, b); • Truyền tham số là quá trình truyền một tham số thực sự vào một tham số hình thức trong lời gọi hàm − Ví dụ: truyền a vào x và truyền b vào y
  16. Hai kiểu tham số hình thức • Tham trị − Sao chép tham số thực sự sang tham số hình thức. Ví dụ: Gán a cho x và gán b cho y. − Khai báo như thông thường • Tham chiếu − Tham số hình thức và tham số thực sự đồng nhất với nhau − Ví dụ: x và a là một, y và b là một nếu thay đổi x và y trong hàm thì a và b cũng thay đổi theo − Kiểu tham số này có cách khai báo riêng (sẽ xem sau)
  17. Ví dụ về tham số kiểu tham trị #include using namespace std; // n la tham so hinh thuc kieu tham tri void thay_doi(int n) { n += 2; // Tang n len 2 don vi nhung tham so thuc su (k) // truyen vao n se khong bi anh huong. } int main() { int k = 3; // k la tham so thuc su cout << "Truoc khi goi ham: k = " << k << endl; // k = 3 thay_doi(k); // gia tri cua k se duoc gan cho n cout << "Sau khi goi ham: k = " << k << endl; // k = 3 return 0; }
  18. Tham số kiểu tham chiếu • Cách khai báo: & (chú ý dấu & giữa kiểu và tên tham số) • Ví dụ: // n la tham so kieu tham chieu void thay_doi(int & n) { n = n + 2; }
  19. Ví dụ về tham số kiểu tham chiếu #include using namespace std; // n la tham so hinh thuc kieu tham chieu (chu y dau &) void thay_doi(int & n) { n += 2; // Tang n len 2 don vi, do do tham so thuc su (k) // truyen vao n cung se tang len 2 don vi } int main() { int k = 3; // k la tham so thuc su cout << "Truoc khi goi ham: k = " << k << endl; // k = 3 thay_doi(k); // k va n dong nhat voi nhau cout << "Sau khi goi ham: k = " << k << endl; // k = 5 return 0; }
  20. Ví dụ dùng hàm để phân rã vấn đề • Phân rã vấn đề tính giá trị biểu thức 푷 = 풙 + 풙 + thành các vấn đề nhỏ hơn − VĐ nhỏ 1: Nhập giá trị cho x − VĐ nhỏ 2: Tính giá trị của P − VĐ nhỏ 3: In giá trị của P ra màn hình • Mỗi vấn đề nhỏ sẽ được viết thành một hàm, sau đó tất cả được gọi đến trong hàm main
  21. Ví dụ (tiếp) #include #include using namespace std; // Ham nhap gia tri cho x void nhap(double & x) // tham so kieu tham chieu { cout > x; } // Ham tinh gia tri bieu thuc P double tinh(double x) // tham so kieu tham tri { double P = x*x + sqrt(x) + 1; return P; }
  22. Ví dụ (tiếp) // Ham in gia tri bieu thuc P void xuat(double P) // tham so kieu tham tri { cout << "Gia tri cua bieu thuc P la "; cout << P << endl; } int main() { double x, P; nhap(x); P = tinh(x); xuat(P); return 0; }
  23. Phạm vi của biến • Biến chỉ tồn tại và dùng được trong phạm vi của nó • Biến có phạm vi toàn cục (biến toàn cục): − Có thể dùng ở bất cứ đâu trong chương trình − Khai báo trước hàm main và không nằm trong bất kỳ hàm nào • Biến có phạm vi cục bộ (biến cục bộ): − Chỉ dùng được trong phạm vi cục bộ của nó − Khai báo trong một hàm hoặc khối lệnh, gồm các câu lệnh đặt giữa hai dấu ngoặc móc { }
  24. Ví dụ về phạm vi của biến #include using namespace std; int n = 200; // n la bien toan cuc, dung duoc o moi // noi trong chuong trinh. void f() { int k = 10; // k la bien cuc bo, chi dung duoc // trong hàm f. } int main() { n = n * 2; // OK vi n la bien toan cuc k = k / 2; // Loi vi n la bien cuc bo trong ham f return 0; }
  25. Phạm vi của biến và tên biến • Trong cùng phạm vi (toàn cục, hàm, khối lệnh): − Các biến không được phép trùng tên • Khác phạm vi: − Các biến được phép trùng tên • Giả sử có hai biến trùng tên: biến toàn cục x và biến cục bộ x trong phạm vi S: − Ngoài phạm vi S: x có nghĩa là x toàn cục − Trong phạm vi S: x có nghĩa là x cục bộ
  26. Ví dụ về phân giải tên biến #include using namespace std; int n = 200; // n toan cuc void f() { int n = 10; // n cuc bo (khac n toan cuc ben tren) } int main() { f(); // n cuc bo duoc gan gia tri 10. cout << n; // Day la n toan cuc nen se in ra 200. return 0; }
  27. Viết hàm chung cho nhiều kiểu dữ liệu • Xét hàm đổi giá trị của hai biến số thực: void doi_cho(double & x, double & y) { double tg = x; // tg la bien trung gian. x = y; // Gan y cho x, gia tri cu cua x duoc giu trong tg. y = tg; // Lay gia tri cu cua x trong tg gan cho y. } • Tuy nhiên, hàm doi_cho không làm việc được với hai biến có kiểu dữ liệu khác double giải pháp là viết lại hàm này cho tất cả các kiểu?
  28. Định nghĩa hàm chung • C++ cho phép viết một hàm nhưng thao tác được trên nhiều kiểu dữ liệu khác nhau hàm chung • Ví dụ: template // T la kieu chung void doi_cho(T & x, T & y) // doi_cho la ham chung { T tg = x; x = y; y = tg; } • Khi gọi hàm doi_cho, kiểu chung T được xác định tự động thông qua kiểu của các tham số thực sự truyền vào x và y
  29. Ví dụ về hàm chung #include using namespace std; template void doi_cho(T & x, T & y) { T tg = x; x = y; y = tg; } int main() { // xem slide tiep theo }
  30. Ví dụ về hàm chung (tiếp) int main() { double x = 1.2, y = 3.4; int a = 100, b = 200; cout << "Truoc khi doi cho:" << endl; cout << " x = " << x << ", y = " << y << endl; cout << " a = " << a << ", b = " << b << endl; doi_cho(x, y); doi_cho(a, b); cout << "Sau khi doi cho:" << endl; cout << " x = " << x << ", y = " << y << endl; cout << " a = " << a << ", b = " << b << endl; return 0; }
  31. Hết bài 3