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

pdf 53 trang ngocly 3800
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Tin học đại cương - Chương: 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:

  • pdfbai_giang_mon_tin_hoc_dai_cuong_chuong_ham.pdf

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

  1. Nội dung 1 Khái niệm hàm 2 Cách xây dựng hàm 3 Cách thức gọi hàm 4 Nguyên tắc hoạt động hàm 5 Đệ quy
  2. Đặt vấn đề Viết chương trình tính S = a! + b! + c! với a, b, c là 3 số nguyên dương nhập từ 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ết quả 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!
  3. Đặt vấn đề 3 đoạn lệ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);
  4. Đặt vấn đề 3 đoạn lệ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;
  5. Đặt vấn đề Giải pháp => Viết 1 lần và sử dụng nhiều lần . Đoạn lệnh nhập tổng quát, với n = a, b, c do { printf(“Nhap mot so nguyen duong: ”); scanf(“%d”, &n); } while (n <= 0); . Đoạn lệnh tính giai thừa tổ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;
  6. Khái niệm Hàm Khái niệm . Một đoạn chương trình có tên, đầu vào và đầu ra. . Có chức năng giải quyết một số vấn đề chuyên biệt cho chương trình chính. . Được gọi nhiều lần với các tham số khác nhau. . Được sử dụng khi có nhu cầu: • Tái sử dụng. • Sửa lỗi và cải tiến.
  7. Khái niệm Hàm Cú pháp Tên hàm ([ ][, ][ ]) { [Khai báo biến cục bộ và các câu lệnh thực hiện hàm] [return [ ];] }
  8. Khái niệm Hàm . Kiểu dữ liệu của hàm: Là kiểu dữ liệu của kết quả trả về, có thể là: int, byte, char, float, void . Tham số: là dữ liệu đầu vào của hàm. . Kiểu tham số: Là kiểu dữ liệu của tham số. . Sử dụng câu lệnh return để trả về kết quả cho hàm (nếu hàm có trả về giá trị)
  9. Cách xây dựng một hàm Cần xác định các thông tin sau đây: . Tên hàm. . Hàm sẽ thực hiện công việc gì. . Các đầu vào (nếu có). . Đầu ra (nếu có). . Thuật toán Đầu vào 1 Tên hàm Đầu vào 2 Đầu ra (nếu có) Các công việc Đầu vào n sẽ thực hiện
  10. Cách xây dựng một hàm Ví dụ 1: Viết hàm tính tổng 2 số nguyên a,b . Tên hàm: TinhTong . Công việc: tính tổng 2 số nguyên . Đầu vào: hai số nguyên a và b . Đầu ra: tổng của 2 số (int) . Thuật toán: • Tổng=a+b
  11. Cách xây dựng một hàm Ví dụ 1: Viết hàm tính tổng 2 số nguyên a,b Kiểu của kết quả trả về Tên hàm int TinhTong(int a, int b) { int kq; Danh sách tham số hình kq= a+b; thức return kq; } Trả về kết quả cho hàm
  12. Cách xây dựng một hàm Ví dụ 2. Viết hàm tìm giá trị lớn nhất của 2 số nguyên a,b .Tên hàm: TimGTLN .Công việc: tìm giá trị lớn nhất của 2 số nguyên a,b .Đầu vào: hai số nguyên a và b .Đầu ra: giá trị lớn nhất của 2 số a,b (kiểu trả về: int)
  13. Cách xây dựng một hàm .Thuật toán: Nếu a> b thì max là a, ngược lại thì max là b. int TimGTLN(int a,int b) { int max; if(a>=b) max=a; else max=b; return max; }
  14. Cách xây dựng một hàm Ví dụ 3. Viết hàm xuất n chữ hello . Tên hàm: Xuatloichao . Công việc: Xuất n chữ Hello . Đầu vào: số nguyên dương n (int) . Đầu ra: Không có giá trị trả về ( kiểu dữ liệu của hàm là void)
  15. Cách xây dựng một hàm .Thuật toán Dùng vòng lặp for để xuất n câu Hello void Xuatloichao(int n) { for(int i=1;i<=n;i++) printf("Hello\n"); }
  16. Cách thức gọi hàm Cú pháp ( , , ) . Gọi tên của hàm đồng thời truyền các tham số thực (hằng, biến, biểu thức) cho các tham số hình thức theo đúng thứ tự đã được khai báo trong hàm. . Các biến hoặc trị này cách nhau bằng dấu , . Các tham số này được được đặt trong cặp dấu ngoặc đơn ( )
  17. Cách thức gọi hàm Ví dụ 4: Định nghĩa hàm tính hiệu 2 số nguyên a,b là tham số hình thức int Tinhhieu (int a, int b) { return a-b; } Khi có nhu cầu tính hiệu 2 số nguyên m,n (m-n) thì gọi hàm như sau: m,n là tham số thực int kq= Tinhhieu(m,n);
  18. Cách thức gọi hàm - Kiểu dữ liệu của các tham số thực phải cùng kiểu với các tham số hình thức. - Số lượng và thứ tự của các tham số thực phải giống như của các tham số hình thức. int Tinhhieu (int a, int b) { return a-b; } Để tính hiệu n-m. Gọi hàm Tinhhieu: int kq= Tinhhieu(n,m);
  19. Cách thức gọi hàm Ví dụ 5: Ta có định nghĩa hàm tính lũy thừa xy long luythua(int x, int y) { long kq=1; for(int i = 1; i <= y; i++) kq=kq*x; return kq; } Cần tính tổng: ab + ba (với a,b là số nguyên) long kq= luythua(a,b)+luythua(b,a);
  20. Cách thức gọi hàm Ví dụ 6: Định nghĩa hàm xuất n dòng chữ Hello void Xuat_Hello(int n) { for (int i=1;i<=n;i++) printf("Hello\n"); } Cần xuất 100 dòng chữ hello Xuat_Hello(100);
  21. Nguyên tắc hoạt động của hàm − Các tham số sẽ được gán giá trị thực tương ứng (TH. Hàm có tham số) − Thực hiện các câu lệnh trong thân hàm − Khi gặp lệnh return hoặc dấu } cuối cùng trong thân hàm thoát khỏi hàm để trở về chương trình gọi nó và thực hiện tiếp tục những câu lệnh của chương trình này.
  22. Nguyên tắc hoạt động của hàm
  23. Nguyên tắc hoạt động của hàm #include "stdio.h" //Phần định nghĩa hàm #include "conio.h" void Xuat_loichao() void Xuat_loichao(); { void Xuat_sao(); printf("\nXin chao\n"); void main() } { void Xuat_sao() int n; { Xuat_sao(); printf(" "); Xuat_loichao(); } Xuat_sao(); }
  24. Các cách truyền tham số Truyền tham số bằng Truyền tham số bằng tham trị tham biến −Được sử dụng khi không có − Được sử dụng khi có nhu nhu cầu thay đổi giá trị của cầu thay đổi giá trị của tham tham số sau khi thực hiện số sau khi thực hiện hàm. hàm. Ví dụ Ví dụ −Hàm tính diện tích hình chữ −Hàm hoán vị 2 số a,b (với a,b nhật (chiều dài, chiều rộng là là tham số) tham số) −Hàm tính tổng 2 số nguyên −Hàm nhập số nguyên dương a,b (với a,b là tham số) n (với n là tham số) −Hàm tính tiền lương (với ngày công,đơn giá là tham số)
  25. Các cách truyền tham số Truyền tham số bằng tham trị − Được sử dụng khi không có nhu cầu thay đổi giá trị của tham số sau khi thực hiện hàm. − Truyền đối số cho hàm ở dạng giá trị. − Có thể truyền hằng, biến, biểu thức nhưng hàm chỉ sẽ nhận giá trị.  Ví dụ 7 float DT_HCN(float a,float b) { return a*b; }
  26. Các cách truyền tham số Truyền tham số bằng tham biến − Được sử dụng khi có nhu cầu thay đổi giá trị của tham số sau khi thực hiện hàm. −Truyền đối số cho hàm ở dạng địa chỉ. Được bắt đầu bằng & trong khai báo. − Không được truyền giá trị cho tham số này.  Ví dụ 8 void HoanVi (int &a,int &b) { int tam; tam=a;a=b ;b=tam; }
  27. Các cách truyền tham số Ví dụ 9 void Thamtri(int x, int y) { x++; y++; } void main() { int a=5, b=5; Thamtri(a,b); printf("a=%d,b=%d",a,b); }
  28. Các cách truyền tham số Ví dụ 10 void Thambien(int &x, int &y) { x++; y++; } void main() { int a=5,b=5; Thambien(a,b); printf("a=%d,b=%d",a,b); }
  29. Các cách truyền tham số Lưu ý void Hoanvi(int &a,int &b); void main() { Hoanvi(2,3); int x=2,y=3; Hoanvi(x,y); } void Hoanvi(int &a,int &b) { int tam=a; a=b; b=tam; }
  30. Nguyên mẫu (Prototype) của hàm Nguyên mẫu của hàm là dòng khai báo cho chương trình dịch biết các thông tin về hàm bao gồm: tên hàm, kiểu hàm và kiểu các tham số (đầu vào) của hàm. Cú pháp ([ ][, ][ ]);
  31. Nguyên mẫu (Prototype) của hàm Ví dụ 11 Khai báo prototype của hàm TimMax, có hai tham số kiểu int, kết quả trả về kiểu int int TimMax(int , int ); hoặc viết: int TimMax(int a, int b);
  32. Nguyên mẫu (Prototype) của hàm 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. #include "stdio.h" void XuatTong(int x, int y); // prototype void main() { int a,b; a=2;b=4; XuatTong(a,b); } // Định nghĩa hàm void XuatTong(int x, int y) { printf(“%d cong %d bang %d”, x, y, x + y); }
  33. Phạm vi của biến − Biến toàn cục (global): là biến khai báo trong ngoài tất cả các hàm (kể cả hàm main) và có tác dụng lên toàn bộ chương trình − Biến cục bộ (Local): Là biến khai báo bên trong một hàm. Biến này chỉ tồn tại khi hàm đang được thực thi. Vùng nhớ của biến cục bộ sẽ bị thu hồi khi hàm thực hiện xong
  34. Phạm vi của biến Ví dụ 12. Cho sơ đồ khai báo biến như sau: a: biến toàn cục a1,a2,a3,a21:biến cục bộ
  35. Phạm vi của biến Ví dụ 13 // khai bao prototype void TTT(); void MMM(); Biến toàn cục int a=8; void main() { TTT(); printf("Gia tri a la:%d",a); MMM(); printf("\nGia tri a la:%d",a); } void TTT() { Biến cục bộ int a=5; a ; } void MMM() { a ; }
  36. Đệ Quy −Một thuật toán được gọi là đệ quy nếu nó giải bài toán bằng cách rút gọn liên tiếp bài toán ban đầu tới bài toán giống như vậy nhưng có dữ liệu đầu vào nhỏ hơn. −Một hàm được gọi là có tính đệ qui nếu trong thân của hàm đó có lệnh gọi lại chính nó một các tường minh hay tiềm ẩn.
  37. Đệ Quy Một thuật toán đệ quy gồm hai phần + Phần dừng: là phần khởi đầu tính toán hoặc điểm kết thúc của thuật toán, không chứa phần đang được định nghĩa. + Phần đệ qui: là phần có chứa khái niệm đang được định nghĩa.
  38. Đệ Quy Ví dụ 14. Tính 4! như sau: 1! = 1 n! = n*(n-1) !
  39. Đệ Quy  Ví dụ 15: Tính n! Điều kiện dừng: n=1 Gọi đệ qui: Giaithua=n*Giaithua(n-1) float giai_thua(int n) { if (n==0) return 1; return n*giai_thua(n -1); }
  40. CÂU HỎI TRẮC NGHIỆM Câu 33. Cho biết kết quả xuất trên màn hình int Tinh (int x, int y) { int kq = 1; for (int i=x;i<y;i++) kq =kq * i; return kq; } void main() { int a = 2 ; int b = 4; int kq=1; kq = Tinh(a,b); printf("%d",kq); } a. 1 b. 6 c. 14 d. 15
  41. CÂU HỎI TRẮC NGHIỆM Câu 34. Cho biết kết quả xuất trên màn hình void ham (int a, int b, int kq) { kq = a - b; } void main() { int a = 2 ; int b = 1000; int kq =1; ham(a, b, kq); printf("%d",kq); } a. 13 b.1 c. 42 d.14
  42. CÂU HỎI TRẮC NGHIỆM Câu 35. Cho biết kết quả xuất trên màn hình: int TTT (int &a, int b) { int kq =0; a ; for (int i=1; i <= b; i++) kq = kq*a; return kq; } void main() { int a = 4; int b = 4; int kq = TTT(a, b); printf("%d,%d",a,kq); } a. 2,3 b. 3,0 c. 5,7 d. 13
  43. CÂU HỎI TRẮC NGHIỆM Câu 36. Cho biết kết quả xuất trên màn hình: int tinhtich (int n) { int kq =1; for (int i=1; i 10) return kq; } return kq; } void main() { int a = 5; int kq = tinhtich(a); printf("%d”,kq); } a. 6 b. 24 c. 124 d. 120
  44. CÂU HỎI TRẮC NGHIỆM Câu 37. Cho biết kết quả xuất trên màn hình: int TT(int n) { int s =0; for (int i=1; i <= n; i++){ for(int j=1;j<=n;j++){ s+=i*j; if(j==4) break; } if(i==3) break; } return s; } void main() { int n = 5; int kq = TT(n); printf("%d”,kq); } a. 0 b. 60 c. 14 d. 120
  45. CÂU HỎI TRẮC NGHIỆM Câu 38. Cho biết kết quả xuất trên màn hình: int MM (int n) { if((n==0)||(n==1)) return 1; else return MM(n-2) + 2*MM (n-1); } void main() { int a = 4; int kq = MM(a); printf("%d",kq); getch(); } a. 5 b. 10 c. 17 d. 13
  46. CÂU HỎI TRẮC NGHIỆM Câu 39. Cho biết kết quả xuất trên màn hình: void ham(int a,int b, int &kq) { kq= a-b++; } void main() { int a=2; int b=10; int kq=1; ham(a,b,kq); printf(“%d”,kq); } a. -8 b. -10 c. -9 d. -11
  47. CÂU HỎI TRẮC NGHIỆM Câu 40. Cho biết kết quả xuất trên màn hình: void Tinh(int a,int &b) { if(a>0) b+=5; } void main() { int a=103;int b=1; Tinh(a,b); printf(“%d”,b); getch(); } a. 4 b. 6 c. 8 d. 10
  48. CÂU HỎI TRẮC NGHIỆM Câu 41. Cho biết kết quả xuất trên màn hình: int b=10; void ham(int a,int b, int kq) { b=0; kq= a+b++; } void main() { int a=2;int kq=1; ham(a,b,kq); printf(“%d”,b); } a. 8 b. 10 c. 9 d. 11
  49. CÂU HỎI TRẮC NGHIỆM Câu 42. Cho biết kết quả xuất trên màn hình: void MMM(int n) { int kq=1; for(int i=1;i<=n;i++){ kq=kq*I; if(kq<5) continue; } return kq; } void main() { int a=4; int kq=MMM(a); printf(“%d”,kq); } a. 1 b. 6 c. 24 d. 26
  50. CÂU HỎI TRẮC NGHIỆM Câu 43. Cho biết kết quả xuất trên màn hình: int Tinh(int a,int &b) { a ; b+=5; return a*b; } void main() { int a=3;int b=1;int kq=1; kq=Tinh(a,b); printf(“%d,%d”,b,kq); } a. 3, 7 b. 6,12 c. 5,9 d. Thông báo lỗi
  51. BÀI TẬP 60. Viết hàm tính n! 61. Viết hàm tính tổng S = 1+2+ .+n. 62. Viết hàm tìm số lớn nhất trong 2 số nguyên 63. Viết hàm trả về giá trị nhỏ nhất của 4 số nguyên. 64. Viết hàm giải phương trình bậc nhất.
  52. Company Logo