Bài giảng Nhập môn lập trình - Chủ đề 4: Hàm
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Nhập môn lập trình - Chủ đề 4: 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:
- bai_giang_nhap_mon_lap_trinh_chu_de_4_ham.pdf
Nội dung text: Bài giảng Nhập môn lập trình - Chủ đề 4: Hàm
- NHẬP MÔN LẬP TRÌNH HÀM 1
- Nội dung 1 Khái niệm và cú pháp 2 Tầmvực 3 Tham số và lờigọihàm 4 Đệ quy Hàm 2
- Đặtvấn đề Viếtchương trình tính S = a! + b! + c! với a, b, c là 3 số nguyên dương nhậptừ bàn phím. Chương trình chính Nhập Tính Xuất a, b, c > 0 S = a! + b! + c! kếtquả S Nhập Nhập Nhập Tính Tính Tính a > 0 b > 0 c > 0 s1=a! s2=b! s3=c! Hàm 3
- Đặtvấn đề 3 đoạnlệnh nhập a, b, c > 0 do { printf(“Nhap mot so nguyen duong: ”); scanf(“%d”, &a); } while (a <= 0); do { printf(“Nhap mot so nguyen duong: ”); scanf(“%d”, &b); } while (b <= 0); do { printf(“Nhap mot so nguyen duong: ”); scanf(“%d”, &c); } while (c <= 0); Hàm 4
- Đặtvấn đề 3 đoạnlệnh tính s1 = a!, s2 = b!, s3 = c! { Tính s1 = a! = 1 * 2 * * a } s1 = 1; for (i = 2; i <= a ; i++) s1 = s1 * i; { Tính s2 = b! = 1 * 2 * * b } s2 = 1; for (i = 2; i <= b ; i++) s2 = s2 * i; { Tính s3 = c! = 1 * 2 * * c } s3 = 1; for (i = 2; i <= c ; i++) s3 = s3 * i; Hàm 5
- Đặtvấn đề Giải pháp => Viết1 lầnvàsử dụng nhiềulần Đoạnlệnh nhậptổng quát, với n = a, b, c do { printf(“Nhap mot so nguyen duong: ”); scanf(“%d”, &n); } while (n <= 0); Đoạnlệnh tính giai thừatổng quát, n = a, b, c { Tính s = n! = 1 * 2 * * n } s = 1; for (i = 2; i <= n ; i++) s = s * i; Hàm 6
- Hàm Khái niệm Một đoạnchươngtrìnhcótên, đầu vào và đầu ra. Có chứcnăng giải quyếtmộtsố vấn đề chuyên biệtchochương trình chính. Được gọi nhiềulầnvới các tham số khác nhau. Được sử dụng khi có nhu cầu: •Táisử dụng. •Sửalỗivàcảitiến. Hàm 7
- Hàm Cú pháp ([ ]) { [return ;] } Trong đó • : kiểubấtkỳ củaC (char, int, long, float, ). Nếu không trả về thì là void. • : theo quy tắc đặt tên định danh. • : tham số hình thức đầu vào giống khai báo biến, cách nhau bằng dấu , • : trả về cho hàm qua lệnh return. Hàm 8
- Các bước viếthàm Cầnxácđịnh các thông tin sau đây: Tên hàm. Hàm sẽ thựchiện công việcgì. Các đầuvào(nếucó). Đầura(nếucó). Đầuvào1 Tên hàm Đầuvào2 Đầura(nếucó) Các công việc Đầuvàon sẽ thựchiện Hàm 9
- Hàm Ví dụ 1 Tên hàm: XuatTong Công việc: tính và xuấttổng 2 số nguyên Đầu vào: hai số nguyên x và y Đầura: không có void XuatTong(int x, int y) { int s; s = x + y; printf(“%d cong %d bang %d”, x, y, s); } Hàm 10
- Hàm Ví dụ 2 Tên hàm: TinhTong Công việc: tính và trả về tổng 2 số nguyên Đầu vào: hai số nguyên x và y Đầura: mộtsố nguyên có giá trị x + y int TinhTong(int x, int y) { int s; s = x + y; return s; } Hàm 11
- Chương trình con - Function Ví dụ 3 Tên hàm: NhapXuatTong Công việc: nhậpvàxuấttổng 2 số nguyên Đầu vào: không có Đầura: không có void NhapXuatTong() { int x, y; printf(“Nhap 2 so nguyen: ”); scanf(“%d%d”, &x, &y); printf(“%d cong %d bang %d”, x, y, x + y); } Hàm 12
- Tầmvực Khái niệm Là phạmvi hiệuquả củabiếnvàhàm. Biến: • Toàn cục: khai báo trong ngoài tấtcả các hàm (kể cả hàm main) và có tác dụng lên toàn bộ chương trình. • Cụcbộ: khai báo trong hàm hoặckhối { } và chỉ có tác dụng trong bản thân hàm hoặckhối đó(kể cả khối con nó). Biếncụcbộ sẽ bị xóa khỏibộ nhớ khi kết thúc khối khai báo nó. Hàm 13
- Tầmvực int a; int Ham1() { int a1; } int Ham2() { int a2; { int a21; } } void main() { int a3; } Hàm 14
- Mộtsố lưu ý Thông thường người ta thường đặt phần tiêu đề hàm/nguyên mẫu hàm (prototype) trên hàm main và phần định nghĩa hàm dưới hàm main. void XuatTong(int x, int y); // prototype void main() { } void XuatTong(int x, int y) { printf(“%d cong %d bang %d”, x, y, x + y); } Hàm 15
- Các cách truyền đối số Truyền Giá trị (Call by Value) Truyền đối số cho hàm ở dạng giá trị. Có thể truyềnhằng, biến, biểuthứcnhưng hàm chỉ sẽ nhậngiátrị. Được sử dụng khi khôngcónhucầuthayđổi giá trị củathamsố sau khi thựchiện hàm. void TruyenGiaTri(int x) { x++; } Hàm 16
- Các cách truyền đối số Truyền Địachỉ (Call by Address) Truyền đối số cho hàm ở dạng địa chỉ (con trỏ). Không được truyềngiátrị cho tham số này. Được sử dụng khi có nhu cầu thay đổi giá trị của tham số sau khi thựchiệnhàm. void TruyenDiaChi(int *x) { *x++; } Hàm 17
- Các cách truyền đối số Truyền Tham chiếu (Call by Reference) (C++) Truyền đối số cho hàm ở dạng địa chỉ (con trỏ). Được bắt đầu bằng & trong khai báo. Không được truyềngiátrị cho tham số này. Được sử dụng khi có nhu cầu thay đổi giá trị của tham số sau khi thựchiệnhàm. void TruyenThamChieu(int &x) { x++; } Hàm 18
- Lưu ý khi truyền đối số Lưu ý Trong một hàm, các tham số có thể truyền theo nhiềucách. void HonHop(int x, int &y) { x++; y++; } Hàm 19
- Lưu ý khi truyền đối số Lưu ý Sử dụng tham chiếulàmộtcáchđể trả về giá trị cho chương trình. int TinhTong(int x, int y) { return x + y; } void TinhTong(int x, int y, int &tong) { tong = x + y; } void TinhTongHieu(int x, int y, int &tong, int &hieu) { tong = x + y; hieu = x – y; 20 } Hàm
- Lờigọihàm Cách thựchiện Gọitêncủa hàm đồng thờitruyềncácđối số (hằng, biến, biểuthức) cho các tham số theo đúng thứ tựđã được khai báo trong hàm. Các biếnhoặctrị này cách nhau bằng dấu , Các đối số này được được đặt trong cặpdấu ngoặc đơn () ( , , ); Hàm 21
- Lờigọihàm Ví dụ Hàm 22
- Lờigọichương trình con Ví dụ Hàm 23
- Đệ quy Khái niệm Mộtchương trình con có thể gọimộtchương trình con khác. Nếu gọi chính nó thì được gọilàsựđệquy. Số lầngọinàyphảicógiớihạn (điểmdừng) Ví dụ Tính S(n) = n! = 1*2* *(n-1)*n Ta thấy S(n) = S(n-1)*n Vậy thay vì tính S(n) ta sẽđi tính S(n-1) Tương tự tính S(n-2), , S(2), S(1), S(0) = 1 Hàm 24
- Đệ quy Ví dụ int GiaiThua(int n) { if (n == 0) return 1; else return GiaiThua(n – 1) * n; } int GiaiThua(int n) { if (n > 0) return GiaiThua(n – 1) * n; else return 1; } Hàm 25
- Bài tập 1. Bài tậpchương câu lệnh điềukiệnvàrẽ nhánh a. Viết hàm đổi mộtkýtự hoa sang ký tự thường. b. Viếtthủ tụcgiảiphương trình bậcnhất. c. Viếtthủ tụcgiảiphương trình bậchai. d. Viết hàm trả về giá trị nhỏ nhấtcủa4 số nguyên. e. Viếtthủ tục hoán vị hai số nguyên. f. Viếtthủ tụcsắpxếp4 số nguyên tăng dần. Hàm 26
- Bài tập 2. Bài tậpchương câu lệnh lặp. Hàm nhậnvàomột số nguyên dương n và thựchiện: a. Trả về sốđảo củasốđó. b. Có phảilàsốđối xứng (Trả về True/False) c. Có phảilàsố chính phương. d. Có phảilàsố nguyên tố. e. Tổng các chữ số lẻ. f. Tổng các chữ số nguyên tố. g. Tổng các chữ số chính phương. Hàm 27
- Bài tập 3. Bài tậpchương Câu lệnh lặp. Hàm nhậnvàomột số nguyên dương n và thựchiện: a. S = 1 + 2 + + n b. S = 12 + 22 + + n2 c. S = 1 + 1/2 + + 1/n d. S = 1 * 2 * * n e. S = 1! + 2! + + n! 4. Hàm trả về USCLN của2 số nguyên. 5. In ra n phầntử của dãy Fibonacy. Hàm 28