Tài liệu Kĩ thuật lập trình - Chương 6: Hàm (function): CHƯƠNG 6: HÀM (FUNCTION)Mục tiêuGiới thiệu các kiến thức về hàm: khái niệm, cách khai báo và định nghĩa hàm, cách truyền tham số; hàm đệ quy, ...Nội dungHàmHàm và mảng dữ liệuHàm và cấu trúcĐệ quy Khái niệmKhai báo và định nghĩaLời gọi và sử dụng hàmBiến và truyền tham sốKhai báo hàm trùng tên6.1 Hàm- Hàm là một chương trình con, hàm có thể trả về hay không trả về giá trị; truyền hay không truyền các tham số. Một chương trình trong C++ có thể gồm nhiều hàm. Nhưng có một hàm chính với tên gọi là hàm main(). Khi thực thi chương trình, nó luôn bắt đầu từ hàm main(). Hàm giúp cho việc phân đoạn chương trình một cách riêng rẽ. Hàm có thể được sử dụng nhiều lần trong một chương trình hoặc sử dụng ở nhiều chương trình khác nhau. Hàm có một số đặc điểm sau:Khái niệm Nằm trong hoặc ngoài chương trình có lời gọi đến hàm. Trong một chương trình có thể chứa nhiều hàm. Một hàm có thể được gọi từ hàm main(), từ một hàm khác hay được gọi bởi chính nó (trường hợp đệ quy). Không có hàm lồng nhau. Có 3 ...
56 trang |
Chia sẻ: Khủng Long | Lượt xem: 1267 | Lượt tải: 0
Bạn đang xem trước 20 trang mẫu tài liệu Kĩ thuật lập trình - Chương 6: Hàm (function), để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
CHƯƠNG 6: HÀM (FUNCTION)Mục tiêuGiới thiệu các kiến thức về hàm: khái niệm, cách khai báo và định nghĩa hàm, cách truyền tham số; hàm đệ quy, ...Nội dungHàmHàm và mảng dữ liệuHàm và cấu trúcĐệ quy Khái niệmKhai báo và định nghĩaLời gọi và sử dụng hàmBiến và truyền tham sốKhai báo hàm trùng tên6.1 Hàm- Hàm là một chương trình con, hàm có thể trả về hay không trả về giá trị; truyền hay không truyền các tham số. Một chương trình trong C++ có thể gồm nhiều hàm. Nhưng có một hàm chính với tên gọi là hàm main(). Khi thực thi chương trình, nó luôn bắt đầu từ hàm main(). Hàm giúp cho việc phân đoạn chương trình một cách riêng rẽ. Hàm có thể được sử dụng nhiều lần trong một chương trình hoặc sử dụng ở nhiều chương trình khác nhau. Hàm có một số đặc điểm sau:Khái niệm Nằm trong hoặc ngoài chương trình có lời gọi đến hàm. Trong một chương trình có thể chứa nhiều hàm. Một hàm có thể được gọi từ hàm main(), từ một hàm khác hay được gọi bởi chính nó (trường hợp đệ quy). Không có hàm lồng nhau. Có 3 cách truyền tham số cho hàm: Truyền theo tham biến.Truyền theo tham trị.Truyền theo tham trỏ.Khái niệmHàm được chia làm 2 loại: + Hàm định nghĩa sẵn + Hàm do người lập trình tự định nghĩa.Khai báo và định nghĩa hàmKhai báo hàm: Hàm định nghĩa sẵn: có trong tệp thư viện *.h. Để sử dụng được các hàm này ta cần phải khai báo tệp tiêu đề theo cú pháp #includeVí dụ: #include #include Khai báo và định nghĩa hàm Hàm do người lập trình tự định nghĩa: có thể được khai báo ở đầu chương trình theo cú pháp: Kieu_du_lieu Ten_ham(Danh_sach_kieu_doi_so);Trong đó:Kieu_du_lieu: là kiểu trả về của hàm int, float, char, ... Trường hợp hàm không trả về giá trị thì khai báo kiểu void. Trường hợp không chỉ rõ kieu_tra_ve thì ngầm định là kiểu int.Ten_ham: được đặt theo quy tắc đặt tên.Danh_sach_kieu_doi_so: có thể có hoặc không. Trường hợp không có thì gọi là hàm không có đối số.Khai báo và định nghĩa hàmĐịnh nghĩa hàm: * Hàm trả về giá trị: Cú pháp: kieu_du_lieu Ten_ham(Ds_tham_so_hinh_thuc) { Khai báo các biến cục bộ; Các câu lệnh; return(biểu thức); } Khai báo và định nghĩa hàmĐịnh nghĩa hàm: Ví dụ: Định nghĩa hàm tính luỹ thừa n (với n nguyên) của một số thực x>0 . Hàm này có hai đầu vào (đối thực x và số mũ nguyên n) và đầu ra (giá trị trả lại) là một số thực xn. double luythua(double x, int n) //x,n là các tham số hình thức { int i ; // i là biến cục bộ double kq = 1 ; // kq để lưu kết quả for (i=1; i> x; f = 2*luythua(x,3)-5*luythua(x,2)-4*x + 1; } Lời gọi và sử dụng hàm- Phân loại biến: + Biến thường + Biến con trỏ (với dấu * trước tên biến) + Biến tham chiếu: Thực chất là một bí danh được gán cho một biến nào đó. Lúc này, chỗ nào xuất hiện biến thì cũng tương đương dùng bí danh và ngược lại. Cú pháp khai báo biến tham chiếu:Kieudulieu &ten_bien_tham_chieu=ten_bien_duoc_tham_chieu;Biến và truyền tham sốVí dụ:int a, b;int &a1=a, &b1=b;a=2; b=3;cout b) ? a: b ; } float max(float a, float b) { return (a > b) ? a: b ; } char max(char a, char b) { return (a > b) ? a: b ; } Khi đó, tùy thuộc vào giá trị của đối số trong lời gọi hàm để chạy hàm thích hợp. Chẳng hạn, max(3, 5), max(3.0, 5.0), max(‘O’,‘K’), Khai báo hàm trùng tên- Như vậy, đặc điểm của các hàm trùng tên là trong danh sách đối của chúng phải có ít nhất một cặp đối khác kiểu nhau, hoặc số lượng các đối khác nhau. Tóm lại, điều kiện để các hàm có thể định nghĩa chồng là: + Số lượng các đối trong hàm là khác nhau + Hoặc có ít nhất 1 đối có kiểu khác nhau giữa các hàmKỹ thuật chồng tên còn có thể áp dụng cả cho các toán tử: +, -, *, /, Khai báo hàm trùng tên Hàm làm việc với mảng cần có 2 thông tin + Điạ chỉ bắt đầu của mảng (địa chỉ cơ sở) + Số phần tử xử lý trong mảng Truyền mảng một chiều cho hàm Truyền mảng hai chiều cho hàm6.2 Hàm và mảng dữ liệu Khi đó, TSHT của hàm sẽ là các mảng dữ liệu và số phần tử của mảng. Ta có 2 cách khai báo TSHTCách 1: Đối số được khai báo bình thường như khai báo biến mảng nhưng không chỉ ra số phần tử. Chẳng hạn, int x[]; float A[];Cách 2: Đối số được khai báo như con trỏ kiểu mảng, chẳng hạn: int *p; float *q;Hàm và mảng một chiềuVí dụ 1: Hàm nhập và hiển thị ra màn hình giá trị mảng một chiềuvoid nhap(int x[], int n) // n: số phần tử { int i; for (i=0; i> x[i]; // hoặc cin >> *(x+i) } void in(int *p, int n) { int i; for (i=0; i> x.thuc >> x.ao ; cout > y.thuc >> y.ao ; cout =3int Fibo(int n){ if (n==1||n==2) return 1; else return Fibo(n-1) + Fibo(n-2);}Ví dụ Các loại biến và tác dụng của nó: + Biến cục bộ (local variable): là các biến được khai báo trong thân của hàm và nó chỉ có tác dụng trong hàm chứa nó. Kể cả các biến được khai báp trong hàm main() thì cũng chỉ có tác dụng trong hàm đó mà thôi. Biến cục bộ chỉ tồn tại trong thời gian hàm chứa nó còn thực thi. Nghĩa là được cấp phát khi hàm chứa nó được gọi tới (hoạt động) và hủy bỏ khi hàm kết thúc. Đối số của các hàm cũng được xem như là biến cục bộ. Ta có thể khai báo các biến giống nhau ở các hàm khác nhau.Tổ chức chương trình Các loại biến và tác dụng của nó: + Biến toàn cục (global variable): là các biến được khai báo bên ngoài tất cả các hàm. Nó thường được khai báo ở đầu chương trình (trước hàm main) Biến toàn cục tồn tại trong suốt quá trình thực thi chương trình Tất cả các hàm đều sử dụng được các biến này nếu trong hàm đó không có biến khai báo trùng tên. Một hàm nếu có biến trùng tên với biến ngoài thì biến ngoài bị che đối với hàm này. Có nghĩa nếu i được khai báo như một biến ngoài và ngoài ra trong một hàm nào đó cũng có biến i, lúc này có 2 biến i độc lập với nhau và khi hàm truy nhập đến i thì có nghĩa là i của hàm chứ không phải i của biến ngoài. Tổ chức chương trình Các loại biến và tác dụng của nó: + Một số nguyên tắc sử dụng biến: Nếu một biến chỉ sử dụng vì mục đích riêng của một hàm thì nên khai báo biến đó như biến cục bộ trong hàm. Với các biến mang tính chất sử dụng chung rõ nét mà nhiều hàm cùng sử dụng chúng với mục đích giống nhau thì nên khai báo chúng như biến ngoài. Tóm lại, nguyên tắc tổng quát nhất là cố gắng tạo hàm một cách độc lập, khép kín, không chịu ảnh hưởng của các hàm khác và không gây ảnh hưởng đến hoạt động của các hàm khác đến mức có thể Tổ chức chương trình Các chỉ thị tiền xử lý: Chỉ thị bao hàm tệp #includeCho phép tham chiếu tới nội dung các tệp đã có (tệp tiêu đề) và ghép nội dung các tệp này vào chương trình trước khi dịch.Việc khai báo các tệp này được thực hiện theo cú pháp: #includeHoặc #include “duong_dan\tep”Ví dụ: #include #includeTổ chức chương trình Các chỉ thị tiền xử lý: Chỉ thị macro #define: Cú pháp: #define macroName StringValueTác dụng: trước khi dịch, bộ tiền xử lý sẽ tìm trong chương trình và thay thế bất kỳ vị trí xuất hiện nào của macroName bởi StringName.Macro thường được sử dụng để định nghĩa các hằng hoặc thay cụm từ này thành một cụm từ khác dễ nhớ hơnTổ chức chương trìnhVí dụ: xét chương trìnhNhận xét: Trước khi dịch bộ tiền xử lý sẽ chuyển begin, end thành { và } Max sẽ được thay bởi 10 true sẽ được thay bởi 1#include using namespace std;#define begin {#define end }#define Max 10#define true 1int main()begin int ok, i; for(i=1;i(b)? (a): (b))Khi đó, nếu chương trình có câu lệnh: kq = Max(x, y) thì nó sẽ được thay bởi kq = ((a)>(b) ? (a) : (b))Tổ chức chương trình1. Sử dụng hàm, viết chương trình tìm giá trị lớn nhất và giá trị nhỏ nhất của 3 số bất kỳ được nhập vào từ bàn phím.2. Sử dụng hàm, viết chương trình kiểm tra một số bất kỳ nhập vào từ bàn phím có phải là số nguyên tố hay không? Sau đó hiển thị lên màn hình tất cả các số nguyên tố 210. Sử dụng hàm đệ quy, viết chương trình tìm ƯCLN của 2 số nguyên dương x, y theo công thức sau: x nếu x = yUCLN(x,y) = UCLN(x-y,y) nếu x > y UCLN(x,y-x) nếu x < yBÀI TẬP THỰC HÀNH11. Sử dụng hàm đệ quy, viết chương trình tìm ƯCLN của 2 số nguyên dương x, y theo công thức sau: UCLN(x,y) = x nếu y = 0 UCLN(y, x%y) nếu y khác 012. Viết chương trình nhập vào một số bất kỳ rồi hiển thị ra màn hình theo thứ tự ngược lại. Chẳng hạn, số nhập vào là 1234 thì kết quả xuất ra là 432113. Sử dụng hàm đệ quy, viết chương trình tính x lũy thừa n. Với x là số thực, n là số nguyên được nhập vào từ bàn phím.14. Xây dựng hàm đệ quy tính S(n) = (2n)! với n được nhập vào từ bàm phím.BÀI TẬP THỰC HÀNH15. Sử dụng hàm đệ quy, viết chương trình tính tổng P(n) = 13 + 23 + + n3 với n được nhập vào từ bàn phím.16. Viết chương trình tính tổ hợp chập k của n với k, n nguyên dương được nhập vào từ bàn phím theo công thức sau: n!/(k!*(n-k)!)17. Xây dựng hàm đệ quy đếm số chữ số có trong một số nguyên bất kỳ được nhập vào từ bàn phím. 18. Viết chương trình tìm tất cả các số tự nhiên có 4 chữ số mà trong đó mỗi số không có 2 chữ số nào giống nhau.19. Sử dụng hàm đệ quy viết chương trình tính tổng S(n)¬ = 1! + 2! + 3! + + n!. Với n nguyên dương được nhập vào từ bàn phím.BÀI TẬP THỰC HÀNH
Các file đính kèm theo tài liệu này:
- tailieu.ppt