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

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.

pdf53 trang | Chia sẻ: maiphuongtl | Lượt xem: 2328 | Lượt tải: 3download
Bạn đang xem trước 20 trang tài liệu Bài giảng Tin học đại cương - Hàm, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Nội dung Khái niệm hàm1 Cách xây dựng hàm2 Cách thức gọi hàm3 Nguyên tắc hoạt động hàm4 Đệ quy5 Đặ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 a, b, c > 0 Tính S = a! + b! + c! Xuất kết quả S Nhập a > 0 Nhập b > 0 Nhập c > 0 Tính s1=a! Tính s2=b! Tính s3=c! Đặ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); Đặ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; Đặ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  Đoạn lệnh tính giai thừa tổng quát, n = a, b, c do { printf(“Nhap mot so nguyen duong: ”); scanf(“%d”, &n); } while (n <= 0); { Tính s = n! = 1 * 2 * … * n } s = 1; for (i = 2; i <= n ; i++) s = s * i; 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. 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 [];] } Cú pháp 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ị) Khái niệm Hàm 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 Tên hàm Đầu vào 1 Đầu vào 2 Đầu vào n Đầu ra (nếu có) Các công việc sẽ thực hiện 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 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 int TinhTong(int a, int b) { int kq; kq= a+b; return kq; } Tên hàm Danh sách tham số hình thức Trả về kết quả cho hàm Kiểu của kết quả trả về 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) Cách xây dựng một hàm int TimGTLN(int a,int b) { int max; if(a>=b) max=a; else max=b; return max; } 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. 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) 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"); } Cách xây dựng một hàm Cách thức gọi hàm  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 ( ) (,… , ) Cú pháp Ví dụ 4: Định nghĩa hàm tính hiệu 2 số nguyên 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: int kq= Tinhhieu(m,n); a,b là tham số hình thức m,n là tham số thực 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. Cách thức gọi hàm int Tinhhieu (int a, int b) { return a-b; } int kq= Tinhhieu(n,m); Để tính hiệu n-m. Gọi hàm Tinhhieu: 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); 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); Cách thức gọi 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. Nguyên tắc hoạt động của hàm Nguyên tắc hoạt động của hàm //Phần định nghĩa hàm void Xuat_loichao() { printf("\nXin chao\n"); } void Xuat_sao() { printf("****************"); } Nguyên tắc hoạt động của hàm #include "stdio.h" #include "conio.h" void Xuat_loichao(); void Xuat_sao(); void main() { int n; Xuat_sao(); Xuat_loichao(); Xuat_sao(); } Các cách truyền tham số Truyền tham số bằng tham trị Truyền tham số bằng tham biến −Đượ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. Ví dụ −Hàm tính diện tích hình chữ nhật (chiều dài, chiều rộng là tham số) −Hàm tính tổng 2 số nguyên a,b (với a,b là tham số) −Hàm tính tiền lương (với ngày công,đơn giá là tham số) − Đượ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. Ví dụ −Hàm hoán vị 2 số a,b (với a,b là tham số) −Hàm nhập số nguyên dương n (với n là 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; } 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; } Các cách truyền tham số 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); } Các cách truyền tham số 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); } Ví dụ 10 Lưu ý Các cách truyền tham số 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; } 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 ([ ][,][…]); 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); 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); } Nguyên mẫu (Prototype) của hàm 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 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ộ Phạm vi của biến // khai bao prototype void TTT(); void MMM(); int a=8; void main() { TTT(); printf("Gia tri a la:%d",a); MMM(); printf("\nGia tri a la:%d",a); } void TTT() { int a=5; a--; } void MMM() { a--; } Ví dụ 13 Biến cục bộ Phạm vi của biến Biến toàn cục −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. Đệ 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. Đệ Quy Đệ Quy Ví dụ 14. Tính 4! như sau: 1! = 1 n! = n*(n-1) !  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); } Đệ Quy 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 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 CÂU HỎI TRẮC NGHIỆM… 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 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 <= n; i++){ kq = kq*i; if(kq>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 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 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 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 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 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 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 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 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. Company Logo

Các file đính kèm theo tài liệu này:

  • pdfthdc_ham_7375.pdf
Tài liệu liên quan