Bài giảng Captech - Chương 9: Hàm

Mục tiêu của bài học

Tìm hiểu cách sử dụng hàm

Tìm hiểu cấu trúc của hàm

Khai báo hàm và các nguyên mẫu hàm

Tìm hiểu các kiểu khác nhau của biến

Hàm được gọi như thế nào

Truyền bằng giá trị

Truyền bằng tham chiếu

Tìm hiểu về các qui tắc về phạm vi của hàm

Các hàm trong các chương trình có nhiều tập tin

Các lớp lưu trữ

Con trỏ hàm

 

ppt20 trang | Chia sẻ: hienduc166 | Lượt xem: 592 | Lượt tải: 0download
Bạn đang xem nội dung tài liệu Bài giảng Captech - Chương 9: Hàm, để tải tài liệu về máy bạn click vào nút TẢI VỀ ở trên
HàmBài 91Mục tiêu của bài họcTìm hiểu cách sử dụng hàmTìm hiểu cấu trúc của hàmKhai báo hàm và các nguyên mẫu hàmTìm hiểu các kiểu khác nhau của biếnHàm được gọi như thế nàoTruyền bằng giá trịTruyền bằng tham chiếuTìm hiểu về các qui tắc về phạm vi của hàmCác hàm trong các chương trình có nhiều tập tinCác lớp lưu trữCon trỏ hàmHàm Hàm là một đoạn chương trình thực hiện một tác vụ được định nghĩa cụ thể Các hàm được sử dụng để rút gọn cho một chuỗi các chỉ thị được thực hiện nhiều lầnHàm dễ viết và dễ hiểuViệc gở lỗi chương trình trở nên dễ dàng hơn khi cấu trúc của chương trình rõ ràng với hình thức lập trình theo module Chương trình cấu tạo từ các hàm cũng dễ dàng bảo trì, bởi vì sự sửa đổi khi có yêu cầu được giới hạn trong từng hàm của chương trìnhCấu trúc hàmCú pháp tổng quát của một hàm trong C như sau:type_specifier xác định kiểu dữ liệu của giá trị mà hàm sẽ trả về.Một tên hàm hợp lệ được gán cho định danh của hàmCác đối số xuất hiện trong cặp dấu ngoặc () được gọi là các tham số hình thức.Các đối số của hàmChương trình tính bình phương của các số từ 1 đến 10Dữ liệu được truyền từ hàm main() đến hàm squarer()Hàm thao tác trên dữ liệu sử dụng các đối sốActual ArgumentsFormal ArgumentsSự trở về từ một hàmLệnh return ngay lập tức chuyển điều khiển từ hàm trở về chương trình gọi.Giá trị đặt trong cặp dấu ngoặc () theo sau lệnh return được trả về cho chương trình gọi.Kiểu dữ liệu của hàm type_specifier không xuất hiện trước hàm squarer(), vì squarer() trả về một giá trị kiểu số nguyên int type_specifier là không bắt buộc nếu kiểu của giá trị trả về là một số nguyên hoặc nếu không có giá trị trả về Tuy nhiên, để tránh sự không nhất quán, một kiểu dữ liệu nên được xác định.Elementary Programming with C/Session 9/ Slide of 20Gọi hàmDấu chấm phẩy được đặt cuối câu lệnh khi gọi hàm, nhưng không dùng cho định nghĩa hàmCặp dấu ngoặc () là bắt buộc theo sau tên hàm, cho dù hàm có đối số hay khôngNhiều nhất một giá trị được trả vềChương trình có thể có nhiều hơn một hàmHàm gọi đến một hàm khác được gọi là hàm gọiHàm đang được gọi đến được gọi là hàm được gọiElementary Programming with C/Session 9/ Slide of 20Khai báo hàmViệc khai báo hàm là bắt buộc khi hàm được sử dụng trước khi nó được định nghĩaHàm address() được gọi trước khi nó được định nghĩaMột số trình biên dịch C sẽ thông báo lỗi nếu hàm không được khai báo trước khi gọiĐiều này còn được gọi là sự khai báo không tường minh#include Main(){		address()	}address(){	}Elementary Programming with C/Session 9/ Slide of 20Xác định kiểu dữ liệu của các đối sốNguyên mẫu hàmchar abc(int x, nt y);Thuận lợi :Bất kỳ sự chuyển kiểu không hợp lệ giữa các đối số được dùng để gọi hàm và kiểu đã được định nghĩa cho các tham số của hàm sẽ được thông báo.	char noparam (void);Elementary Programming with C/Session 9/ Slide of 20Biến cục bộĐược khai báo bên trong một hàm Được tạo tại điểm vào của một khối và bị hủy tại điểm ra khỏi khối đóTham số hình thứcĐược khai báo trong định nghĩa hàm như là các tham sốHoạt động như một biến cục bộ bên trong một hàmBiến toàn cụcĐược khai báo bên ngoài tất cả các hàmLưu các giá trị tồn tại suốt thời gian thực thi của chương trìnhCác biếnElementary Programming with C/Session 9/ Slide of 20Lớp lưu trữ Mỗi biến trong C có một tính chất được gọi là lớp lưu trữLớp lưu trữ định nghĩa hai đặc tính của biến:Thời gian sống của một biến là khoảng thời gian nó duy trì một giá trị xác địnhTầm vực của một biến xác định các phần của một chương trình có thể nhận ra biến đóElementary Programming with C/Session 9/ Slide of 20autoexternstaticregisterLớp lưu trữ - ttElementary Programming with C/Session 9/ Slide of 20Các qui luật phạm vi – là những qui luật quyết định một đoạn mã lệnh có thể truy xuất đến một đoạn mã lệnh hay dữ liệu khác hay khôngMã lệnh bên trong một hàm là cục bộ với hàm đóHai hàm có phạm vi khác nhauHai hàm có cùng mức phạm viMột hàm không thể được định nghĩa bên trong một hàm khácCác qui luật phạm vi của hàmElementary Programming with C/Session 9/ Slide of 20Gọi hàmTruyền tham trị Truyền tham chiếuElementary Programming with C/Session 9/ Slide of 20Truyền bằng giá trịMặc nhiên trong C, tất cả các đối số được truyền bằng giá trịKhi các đối số được truyền đến hàm được gọi, các giá trị được truyền thông qua các biến tạm Mọi sự thao tác chỉ được thực hiện trên các biến tạmCác đối số được gọi là truyền bằng giá trị khi giá trị của biến được truyền đến hàm được gọi và bất kỳ sự thay đổi trên giá trị này không ảnh hưởng đến giá trị gốc của biến được truyềnElementary Programming with C/Session 9/ Slide of 20Truyền bằng tham chiếuVới truyền tham chiếu, hàm cho phép truy xuất đến địa chỉ thực trong bộ nhớ của đối số và vì vậy có thể thay đổi giá trị của các đối số của hàm gọiĐịnh nghĩa 	getstr(char *ptr_str, int *ptr_int);Gọi	getstr(pstr, &var);Elementary Programming with C/Session 9/ Slide of 20Sự lồng nhau của lời gọi hàmmain()	{		palindrome();		}palindrome()	{		getstr();	reverse();	cmp();		}Elementary Programming with C/Session 9/ Slide of 20Các hàm trong chương trình có nhiều tập tinCác hàm cũng có thể được định nghĩa là static hoặc externalCác hàm tĩnh (static) chỉ được nhận biết bên trong tập tin chương trình và phạm vi của nó không vượt ra khỏi tập tin chương trình	static fn _type fn_name (argument list);Hàm ngoại (external) được nhận biết bởi tất cả các tập tin của chương trìnhextern fn_type fn_name (argument list);Elementary Programming with C/Session 9/ Slide of 20Con trỏ hàmLưu địa chỉ bắt đầu của hàmHàm có một vị trí vật lý trong bộ nhớ, vị trí này có thể gán cho một con trỏvoid check(char *a, char *b, int (*cmp)()){printf(“testing for equality \n”);if (!(*cmp)(a,b)) 	printf(“Equal”);else 	printf(“Not Equal”);}#include #include void check(char *a, char *b, int (*cmp)());main() {	char sl[80];	int (*p)();	p = strcmp;	gets(s1);	gets(s2);	check(s1, s2, p);}Elementary Programming with C/Session 9/ Slide of 20

File đính kèm:

  • pptSession 15.ppt