Bài giảng Tin học đại cương - Phần 3, Chương 7: Hàm
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Tin học đại cương - Phần 3, Chương 7: 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_tin_hoc_dai_cuong_phan_3_chuong_7_ham.pptx
Nội dung text: Bài giảng Tin học đại cương - Phần 3, Chương 7: Hàm
- Phần 3: Lập trình C Nội dung chính • Chương 1: Tổng quan về ngôn ngữ C • Chương 2: Kiểu dữ liệu và biểu thức trong C • Chương 3: Vào ra dữ liệu • Chương 4: Cấu trúc điều khiển • Chương 5: Mảng, con trỏ và xâu ký tự • Chương 6: Cấu trúc • Chương 7: Hàm • Chương 8: Tệp dữ liệu 01-Jan-16 404
- Chương 7: Hàm Nội dung chính 1. Khái niệm hàm • Khái niệm chương trình con • Phân loại: hàm và thủ tục 2. Khai báo và sử dụng hàm • Khai báo và sử dụng 3. Phạm vi của biến • Toàn cục và địa phương • Biến static, biến register 4. Truyền tham số • Truyền theo giá trị, truyền theo địa chỉ 01-Jan-16 405
- Chương 7: Hàm 7.1 Khái niệm hàm Khái niệm & Vai trò • Khái niệm – Là một chương trình nằm trong một chương trình lớn hơn nhằm thực hiện một nhiệm vụ cụ thể • Vai trò – Chia nhỏ chương trình ra thành từng phần để quản lý • Phương pháp lập trình có cấu trúc – Có thể sử dụng lại nhiều lần: printf(), scanf() – Chương trình dễ dàng đọc và bảo trì hơn 01-Jan-16 406
- Chương 7: Hàm 7.1 Khái niệm hàm Phân loại Hàm chuẩn – Có Hàm trong thư viện (function) Hàm (người dùng) Chương Có trả về giá trị tự định nghĩa trình con Thủ tục (procedure) Không trả về giá trị Ngôn ngữ lập trình C • Chỉ cho phép khai báo chương trình con là hàm. • Sử dụng kiểu “void” với ý nghĩa “không là kiểu dữ liệu nào cả” để chuyển thủ tục về dạng hàm 01-Jan-16 407
- Chương 7: Hàm Nội dung chính 1. Khái niệm hàm • Khái niệm chương trình con • Phân loại: hàm và thủ tục 2. Khai báo và sử dụng hàm • Khai báo và sử dụng 3. Phạm vi của biến • Toàn cục và địa phương • Biến static, biến register 4. Truyền tham số • Truyền theo giá trị, truyền theo địa chỉ 01-Jan-16 408
- Chương 7: Hàm 7.2 Khai báo và sử dụng hàm Ví dụ #include int bp(int x){ Khai báo int y; chương y = x * x; trình con return y; } void main(){ int i; Gọi chương for (i=1; i< 20; i+=2) trình con ra printf("%4d\n", bp(i)); thực hiên printf("\n"); } 01-Jan-16 409
- Chương 7: Hàm 7.2 Khai báo và sử dụng hàm Định nghĩa hàm Cú pháp Dòng đầu hàm Kiểu_hàm Tên_hàm(DS khai báo tham số) { [ ] hàm [ ] } Thân 01-Jan-16 410
- Chương 7: Hàm 7.2 Khai báo và sử dụng hàm Dòng đầu hàm Kiểu_hàm Tên_hàm(DS khai báo tham số) • Mô tả các thông tin được trao đổi giữa bên trong và bên ngoài hàm. – Tên của hàm, – Các tham số đầu vào • Hàm cần những thông tin gì để hoạt động – Tham số đầu ra và giá trị trả về • Hàm cung cấp những thông tin gì cho môi trường • Dùng phân biệt các hàm với nhau, – không tồn tại 2 hàm có dòng đầu hàm giống nhau. 01-Jan-16 411
- Chương 7: Hàm 7.2 Khai báo và sử dụng hàm Dòng đầu hàm→Tên hàm Là tên do người sử dụng tự định nghĩa • Tuân theo quy tắc đặt tên đối tượng • Nên mang ý nghĩa gợi ý chức năng của hàm 01-Jan-16 412
- Chương 7: Hàm 7.2 Khai báo và sử dụng hàm Dòng đầu hàm→Khai báo các tham số hình thức • Khai báo các thông tin cần cho hoạt động của hàm và các thông tin, kết quả tính toán được hàm trả lại. – Tham số chứa dữ liệu vào cung cấp cho hàm – Tham số chứa dữ liệu ra mà hàm tính toán được. • Các tham số sử dụng trong khai báo hàm là tham số hình thức. – Nguyên tắc khai báo tham số hình thức như giống như khai báo một biến kiểu_dữ_liệu_của_tham_số tên_của_tham_số 01-Jan-16 413
- Chương 7: Hàm 7.2 Khai báo và sử dụng hàm Dòng đầu hàm→Khai báo các tham số hình thức • Các tham số cung cấp cho hàm trong quá trình thực hiện hàm là tham số thực sự – Kiểu dữ liệu của tham số thực phải giống kiểu dữ liệu của tham số hình thức tương ứng với tham số thực sự đó,. • Một hàm có thể có một, nhiều hoặc không có tham số nào cả – Nếu có nhiều tham số, phải được phân cách với nhau bằng dấu phẩy. – không có tham số vẫn phải có cặp dấu ngoặc đơn sau tên hàm 01-Jan-16 414
- Chương 7: Hàm 7.2 Khai báo và sử dụng hàm Dòng đầu hàm→Kiểu dữ liệu trả về • Thông thường hàm sau khi được thực hiện sẽ trả về một giá trị kết quả tính toán nào đó. • Để sử dụng được giá trị đó cần phải biết nó thuộc kiểu dữ liệu gì. – Kiểu dữ liệu của đối tượng tính toán được hàm trả về được gọi là kiểu dữ liệu trả về của hàm. 01-Jan-16 415
- Chương 7: Hàm 7.2 Khai báo và sử dụng hàm Dòng đầu hàm→Kiểu dữ liệu trả về • Trong C, kiểu dữ liệu trả về của hàm có thể là kiểu dữ liệu bất kì (kiểu dữ liệu có sẵn hoặc kiểu dữ liệu do người dùng tự định nghĩa) nhưng không được là kiểu dữ liệu mảng. • Nếu kiểu dữ liệu trả về là kiểu void thì hàm không trả về giá trị nào cả. • Nếu không khai báo kiểu dữ liệu trả về thì chương trình dịch của C sẽ ngầm hiểu rằng kiểu dữ liệu trả về của hàm là kiểu int. 01-Jan-16 416
- Chương 7: Hàm 7.2 Khai báo và sử dụng hàm Thân hàm • Danh sách các câu lệnh • Thường có ít nhất một lệnh return Họat động của hàm • Thực hiện lần lượt các lệnh cho đến khi – Thực hiện xong tất cả các câu lệnh có trong thân hàm – Gặp lệnh return • Cú pháp chung return [biểu_thức]; 01-Jan-16 417
- Chương 7: Hàm 7.2 Khai báo và sử dụng hàm Thân hàm (tiếp) Khi gặp lệnh return biểu_thức • Tính toán giá trị của biểu_thức, • Lấy kết quả tính toán được làm giá trị trả về cho lời gọi hàm • Kết thúc việc thực hiện hàm, trở về chương trình đã gọi nó. Nếu return không có phần biểu_thức, – Kết thúc thực hiện hàm mà không trả về giá trị nào cả. • Dùng khi hàm được khai báo có kiểu trả về là void 01-Jan-16 418
- Chương 7: Hàm 7.2 Khai báo và sử dụng hàm Sử dụng hàm Tên_hàm (DS_tham_số_thực _sự); Ví dụ: N = bp(1);N= bp(3);, Lưu ý: • Gọi hàm thông qua tên hàm và các tham số được cung cấp thực sự cho hàm (tham số thực sự). • Nếu hàm nhận nhiều tham số thì các tham số ngăn cách nhau bởi dấu phẩy • Các tham số hình thức của hàm sẽ nhận các giá trị từ tham số truyền vào • Sau khi thực hiện xong, trở về điểm mà hàm được gọi 01-Jan-16 419
- Chương 7: Hàm 7.2 Khai báo và sử dụng hàm Ví dụ: Cho biết kết quả thực hiện chương trình #include 3 int fun(int a){ fun(3) a++; 4 return a; fun(4) } 5 int main(){ fun(5) printf("%d\n", fun(fun(fun(3)))); return 0; 6 } 01-Jan-16 420
- Chương 7: Hàm 7.2 Khai báo và sử dụng hàm Ví dụ: Cho biết kết quả thực hiện chương trình #include fun(5) int fun(int n){ 5 * fun(4) if(n==0) return 1; 4 * fun(3) else return n*fun(n-1); } 3 * fun(2) int main(){ 2 * fun(1) printf("%d\n", fun(5)); 1 * fun(0) return 0; } 120 1 01-Jan-16 421
- Chương 7: Hàm 7.2 Khai báo và sử dụng hàm Ví dụ 1: Tính TBC f(a),f(b), f(c) nếu f(x) = f (x) = x5 + 5 x #include #include float f(float x){ if(x==0.0) return 0; else return pow(x,5)+x/fabs(x) * pow(fabs(x), 0.2); } void main(){ float a, b, c; printf("So 3 so thuc : "); scanf("%f%f%f",&a,&b,&c); printf("Ket qua %f \n",(f(a)+f(b)+f(c))/3); }01-Jan-16 422
- Chương 7: Hàm 7.2 Khai báo và sử dụng hàm Ví dụ 2: Tìm ƯSCLN của dãy số 1. # include 2. int uscln(int a, int b) { 3. while (a !=b){ 4. if(a > b) a = a- b; 5.else b = b - a; 6. } 7. return a; 8. } 9. void main(){ 10. int A[100], N, i, r; 11. printf("So phan tu : "); scanf("%d",&N); 12. for(i=0; i < N; i++){ 13. printf("A[%d] = ",i+1); scanf("%d",&A[i]); 14. } 15. r = A[0]; 16. for(i = 1; i < N; i++) 17. r = uscln(r,A[i]); 18. printf("Ket qua %d \n",r); 1019-.Jan-}16 423
- Chương 7: Hàm 7.2 Khai báo và sử dụng hàm Giải phương trình f(x)=0 trên đoạn [a,b] 1. #include Giải phương trình x3-x-1=0 2. #include y 3. float f(float x){ 4.return x*x*x-x-1; 5. 1 2 } x 6. void main(){ 7. float a =1.0, b= 2.0, c, eps = 1.0e-6; 8. do{ 9. c =(a+b)/2; 10. if( f(a) * f(c) eps); 13.printf("Nghiem la : %.6f",(b+a)/2); 14.} 01-Jan-16 424
- Chương 7: Hàm 7.2 Khai báo và sử dụng hàm VD Đọc tọa độ 3 điểm A,B,C và đưa ra d/tích ABC #include #include typedef struct{ float x, y; }Point; float kc(Point A, Point B){ return sqrt(pow(A.x-B.x,2)+pow(A.y-B.y,2)); } 01-Jan-16 425
- Chương 7: Hàm 7.2 Khai báo và sử dụng hàm VD Đọc tọa độ 3 điểm A,B,C và đưa ra d/tích ABC void main(){ Point A, B, C; float AB,BC,CA,p,S; printf("Toa do A (x,y) :"); scanf("%f%f",&A.x,&A.y); printf("Toa do B (x,y) :"); scanf("%f%f",&B.x,&B.y); printf("Toa do C (x,y) :"); scanf("%f%f",&C.x,&C.y); AB = kc(A,B); BC = kc(B,C); CA = kc(C,A); p= (AB + BC + CA)/2; S = sqrt(p*(p-AB)*(p-BC)*(p-CA)); printf("Dien tich ABC %f",S); } 01-Jan-16 426
- Chương 7: Hàm Nội dung chính 1. Khái niệm hàm • Khái niệm chương trình con • Phân loại: hàm và thủ tục 2. Khai báo và sử dụng hàm • Khai báo và sử dụng 3. Phạm vi của biến • Toàn cục và địa phương • Biến static, biến register 4. Truyền tham số • Truyền theo giá trị, truyền theo địa chỉ 01-Jan-16 427
- Chương 7: Hàm 7.3 Phạm vi của biến Phạm vi • Phạm vi: #include #include – Khối lệnh, chương trìnhcon, int i; chương trình chính int binhphuong(int x){ • Biến chỉ có tác dụng trong int y; phạm vi được khai báo y = x * x; • Trong cùng một phạm vi return y; } các biến phải có tên khác void main(){ nhau. int y; Tình huống for (i=0; i<= 10; i++){ • Trong hai phạm vi khác nhau có y = binhphuong(i); hai biến cùng tên. Trong đó một printf(“%d ”, y); phạm vi này nằm trong phạm vi } kia? } 01-Jan-16 428
- Chương 7: Hàm 7.3 Phạm vi của biến Phân loại biến • Biến toàn cục: – Biến được khai báo trong chương trình chính, được đặt sau khai báo tệp tiêu đề. • Biến cục bộ: – biến được khai báo trong lệnh khối hoặc chương trình con, được đặt trước các câu lệnh. Ghi chú – Hàm main() cũng là một chương trình con nhưng là nơi chương trình được bắt đầu – Biến khai báo trong hàm main() cũng là biến cục bộ, chỉ có phạm vi trong hàm main(). 01-Jan-16 429
- Chương 7: Hàm 7.3 Phạm vi của biến Biến static • Biến cục bộ ra khỏi phạm vi thì bộ nhớ dành cho biến được giải phóng • Yêu cầu lưu trữ giá trị của biến cục bộ một cách lâu dài => sử dụng từ khóa static Cú pháp: static tên_biến; 01-Jan-16 430
- Chương 7: Hàm 7.3 Phạm vi của biến Ví dụ→Kết quả #include # include void fct() { static int count = 1; printf("\n Day la lan goi ham fct lan thu %2d", count++); } void main(){ int i; for(i = 0; i < 10; i++) fct(); getch(); } 01-Jan-16 431
- Chương 7: Hàm 7.3 Phạm vi của biến Ví dụ 01-Jan-16 432
- Chương 7: Hàm 7.3 Phạm vi của biến Biến register • Thanh ghi có tốc độ truy cập nhanh hơn RAM, bộ nhớ ngoài • Lưu biến trong thanh ghi sẽ tăng tốc độ thực hiện chương trình Cú pháp register tên_biến; Lưu ý: – số lượng biến register không nhiều và thường chỉ với kiểu dữ liệu nhỏ như int, char 01-Jan-16 433
- Chương 7: Hàm Nội dung chính 1. Khái niệm hàm • Khái niệm chương trình con • Phân loại: hàm và thủ tục 2. Khai báo và sử dụng hàm • Khai báo và sử dụng 3. Phạm vi của biến • Toàn cục và địa phương • Biến static, biến register 4. Truyền tham số • Truyền theo giá trị, truyền theo địa chỉ 01-Jan-16 434
- Chương 7: Hàm 7.4 Truyền tham sô Ví dụ # include void swap(int a, int b) { int x = a; a = b; b = x; return; } void main(){ int a = 5, b = 100; printf("Truoc: a=%d, b=%d \n\n",a,b); swap(a,b); printf("Sau : a=%d, b=%d\n\n",a,b); return; } 01-Jan-16 435
- Chương 7: Hàm 74 Truyền tham sô Truyền theo giá trị và truyền theo biến • Truyền theo trị – Dựa trên nguyên tắc truyền những bản sao của biến được truyền – Những câu lệnh thay đổi giá trị tham số hình thức sẽ không ảnh hưởng tới biến được truyền • Truyền theo biến – Tham số được truyền sẽ thực sự là biến và các thao tác sẽ thi hành trực tiếp với biến – Những câu lệnh thay đổi giá trị tham số hình thức sẽ ảnh hưởng tới biến được truyền 01-Jan-16 436
- Chương 7: Hàm 7.4 Truyền tham sô Truyền theo biến • Thực chất là truyền theo địa chỉ của biến • Khi khai báo hàm [tham số có kiểu “địa chỉ”]: – Khai báo là một con trỏ, trỏ tới một đối tượng có kiểu muốn truyền vào – Ví dụ: void swap (int *pa, int *pb); • Khi truyền tham số – Địa chỉ của biến được truyền Ví dụ: swap(&a,&b) – Có thể truyền tên của mảng • Tên mảng là hằng địa chỉ 01-Jan-16 437
- Chương 7: Hàm 7.4 Truyền tham sô Ví dụ 1: Truyền theo địa chỉ của biến # include # include void swap(int * pa, int * pb) { int x = *pa; *pa = *pb; *pb = x; return; } void main(){ int a = 5, b = 100; printf("Truoc: a=%d, b=%d \n\n",a,b); swap(&a,&b); printf("Sau : a=%d, b=%d\n\n",a,b); return; } 01-Jan-16 438
- Ví dụ 2: Nhập danh sách các xâu cho tới khi gặp xâu rỗng Đưa ra xâu có tần xuất xuất hiện nguyên âm lớn nhất 01-Jan-16 439
- Chương 6: Cấu trúc 6.3 Xử lý dư liệu cấu trúc Câu hỏi 1: Kết quả đưa ra màn hình #include a 0 2 1 0 void fun(int n){ b 0 1 0 2 if(n > 0) { c 1 1 2 0 fun( n); d 0 1 2 0 printf("%d ", n); e 0 2 0 1 fun( n); } } int main(){ fun(3); return 0; } 01-Jan-16 440
- Chương 6: Cấu trúc 6.3 Xử lý dư liệu cấu trúc Câu hỏi 2: Kết quả đưa ra màn hình #include a 5, 2 void fun(int *i, int *j){ b 2, 5 *i = *i * *i; c 10, 4 *j = *j * *j; d 4, 25 } e 25, 4 int main(){ int i=5, j=2; fun(&i, &j); printf("%d, %d", i, j); return 0; } 01-Jan-16 441
- Chương 6: Cấu trúc 6.3 Xử lý dư liệu cấu trúc Câu hỏi 3: Kết quả đưa ra màn hình #include a AB void fun(char*); b AC int main(){ c BC char a[10]="ABCDEF"; d BD fun(&a[0]); e CD return 0; } void fun(char *a){ printf("%c", *++a); a++; printf("%c", *a); } 01-Jan-16 442