Bài giảng Nhập môn Lập trình: Phần 3 - Hàm - Function
lượt xem 14
download
Bài giảng Nhập môn Lập trình: Phần 3 - Hàm - Function bao gồm những nội dung về một số nguyên tắc; một số lỗi thường gặp; dạng tổng quát của hàm; truyền tham số cho hàm; truyền giá trị; truyền tham chiếu; phương thức trao đổi dữ liệu.
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Bài giảng Nhập môn Lập trình: Phần 3 - Hàm - Function
- Hàm Function
- Hàm Function Một số nguyên tắc Cách khai báo và gọi thực hiện Prototype của hàm Truyền tham số cho hàm Biến toàn cục, biến cục bộ, biến static, biến thanh ghi, … Cách thức C thực hiện các lời gọi hàm – stack.
- Một số nguyên tắc Các hàm trong NNLT C đều ngang cấp với nhau: Hàm không được khai báo lồng nhau. Thứ tự khai báo không quan trọng. Hàm có thể nhận và xử lý nhiều tham số hoặc không có tham số nào Hàm có thể trả về một giá trị hoặc không. Biến khai báo trong hàm F chỉ có giá trị trong F, không sử dụng được biến này trong các hàm khác được.
- Ví dụ: hàm tính x n kiểu của giá trị trả nhận vào 2 tham số khi được gọi về double double Power(double Power(double x, x, int int n) n) {{ double double result; result; for(result for(result == 1; 1; n; n; n--) n--) result result *= *= x; x; return return result; result; }} giá trị được trả về qua lệnh return
- Ví dụ: gọi thực hiện hàm Power Chỉ thị cho chương trình biết prototype của hàm Power #include #include double double Power(double, Power(double, int); int); int int main() main() {{ double double mm == Power(2, Power(2, 3); 3); printf(“3.5 printf(“3.5 ^^ 44 == %lf”, %lf”, Power(3.5, Power(3.5, 4)); 4)); return return 0; 0; }} 3.5 và 4: 2 tham số thực sự
- Một số lỗi thường gặp Compiler không hiểu được hàm Power #include #include hàm Power thiếu tham số int int main() main() {{ int int mm == Power(2, Power(2, 3); 3); printf(“3.5 printf(“3.5 ^^ 44 == %lf”, %lf”, Power(4)); Power(4)); return return 1.0; 1.0; }} giá trị trả về không khớp kiểu
- Prototypes Dòng khai báo double Power(double, int); được hiểu là khai báo prototype của hàm Power Được dùng khi chương trình sử dụng một hàm trước khi khai báo. Khai báo prototype thông báo cho trình biên dịch biết kiểu của giá trị trả về và mô tả chi tiết về các tham số của hàm. Các hàm thư viện chuẩn được khai báo prototype trong các tập tin header (stdio.h, conio.h, …). Các hàm do lập trình viên tự xây dựng phải tự khai báo prototype.
- Hàm: dạng tổng quát header của hàm kiểểu tr ki u trảả v về tên hàm(danh sách tham sốố hình th ề tên hàm(danh sách tham s hình thứứcc)) {{ //khai báo các biếến c //khai báo các bi n củủa hàm a hàm //các lệệnh th //các l nh thựực thi c thi return giá trịị tr return giá tr trảả v về; //hàm void không có giá tr ề; //hàm void không có giá trịị tr trảả v vềề } } thân (body) hàm
- Tầm tác dụng của biến Biến toàn cục: float float g=6.5; g=6.5; Không thuộc khối void void main() main() nào, có tác dụng {{ trong toàn chương int int ii == 5,5, j,j, kk == 2; 2; trình kể từ khi khai float ff == 2.8F float 2.8F;; báo dd == 3.7; 3.7; }} compiler không Biến cục bộ: khai void F(int void F(int v)v) chấp nhận “d”, “i” báo trong một khối, {{ chỉ có tác dụng double double d, d, ee == 0.0, 0.0, f;f; trong khối này i++; i++; g--; g--; ff == 0.0; 0.0; “f” của hàm F, không }} phải của main
- Truyền tham số cho hàm C hỗ trợ 2 cách truyền tham số: Truyền tham số bởi giá trị (truyền giá trị call by value) Truyền tham số bởi địa chỉ (truyền địa chỉ call by address) Mở rộng với C++ Truyền tham chiếu (call by reference)
- Truyền giá trị Hàm sẽ xử lý trên bản sao của tham số Hàm không thể thay đổi giá trị của tham số được. Được dùng trong các trường hợp cần chuyển dữ liệu vào bên trong hàm để xử lý, tính toán Các ví dụ trên đều dùng kiểu truyền tham số bởi giá trị Ví dụ hàm có sẵn của C truyền giá trị: float sqrt(float); double pow(double, double);
- Truyền giá trị ví dụ #include #include void void change(int change(int v); v); hàm change không thay đổi int int main() main() giá trị của “var” {{ int int var var == 5; 5; change(var); change(var); printf("main: printf("main: varvar == %i\n", %i\n", var); var); return return 0;0; }} change: change: vv == 500 500 void voidchange(int change(int v) v) main: main: var var == 55 {{ vv *= *= 100; 100; printf("change: printf("change: vv == %i\n", %i\n", v); v); }}
- Truyền địa chỉ Hàm sẽ xử lý trên chính tham số nhờ vào địa chỉ của chúng Hàm có thể thay đổi giá trị của tham số. Được dùng trong các trường hợp cần chuyển dữ liệu là kết quả xử lý được bên trong hàm ra “ngoài” cho các hàm khác sử dụng. Ví dụ hàm có sẵn của C truyền địa chỉ: int scanf(const char *format, adr1, adr2, …); inputs function outputs
- Truyền địa chỉ ví dụ #include #include v: tham số địa chỉ void void change(int change(int *v); *v); của số int, khai báo với dấu * int int main() main() {{ truyền địa chỉ của “var” int int var var == 5; 5; vào hàm change change(&var); change(&var); printf("main: printf("main: var var == %i\n", %i\n", var); var); return return 0; 0; }} change: change: *v *v == 500 500 void voidchange(int change(int *v)*v) main: main: var var == 500 500 {{ (*v) (*v) *= *= 100; 100; printf("change: printf("change: *v *v == %i\n", %i\n", (*v)); (*v)); }}
- Truyền tham chiếu Hàm sẽ xử lý trên bản sao tham số và cập nhật lại bản chính ngay trước khi hàm kết thúc. Hàm có thể thay đổi giá trị của tham số. Được dùng trong các trường hợp cần chuyển dữ liệu là kết quả xử lý được bên trong hàm ra “ngoài” cho các hàm khác sử dụng. Chỉ áp dụng được với các trình biên dịch C++
- Truyền tham chiếu ví dụ #include #include v: tham số tham void void change(int change(int &v); &v); chiếu, khai báo với dấu & int int main() main() {{ int int var var == 5; 5; truyền “var” vào hàm change change(var); change(var); printf("main: printf("main: var var == %i\n", %i\n", var); var); return return 0;0; }} change: change: vv == 500 500 void voidchange(int change(int &v)&v) main: main: var var == 500 500 {{ vv *= *= 100; 100; printf("change: printf("change: vv == %i\n", %i\n", v); v); }}
- Truyền tham số ví dụ #include #include void void function(int function(int a, a, int int *b, *b, int int &c); &c); int int main() main() {{ main int main int xx == 3,3, yy == 4, 4, zz == 5; 5; function(x, function(x, &y, &y, z); z); printf("%i printf("%i %i %i %i\n", %i\n", x, x, y,y, z); z); return a b c return 0; 0; }} void void function(int function(int a, a, int int *b, *b, int int &c) &c) {{ function function aa *= *= 2; 2; 66 10 10 16 16 (*b) (*b) +=+= a;a; 33 10 10 16 16 cc == aa ++ (*b); (*b); printf("%i printf("%i %i %i %i\n", %i\n", a, a, *b, *b, c); c); }}
- Phương thức trao đổi dữ liệu C dùng 1 stack để lưu trữ các biến cục bộ và các chuyển các tham số cho hàm với mỗi lần gọi hàm thực hiện Hàm gọi (O) cất các tham số vào stack. Gọi thực hiện hàm được gọi (F). F nhận lấy các tham số từ stack F tạo các biến cục bộ ứng với các tham số trên stack Khi kết thúc, F cập nhật giá trị các tham số (ref) và trả điều khiển cho O O nhận lấy các giá trị mới của tham số cũng như giá trị trả về
- Phương thức trao đổi dữ liệu #include #include double double power(int, power(int, int); int); int int main(void) main(void) {{ int int xx == 2; 2; double doubled; d; dd == power(x, power(x, 5);5); printf("%lf\n", printf("%lf\n", d); d); 32.0 power: result return return 0; 0; }} 2 power: n double double power(int power(int n, n, int int p) p) 5 {{ power: p double doubleresult result == n;n; ? 32.0 main: d while(--p while(--p >> 0) 0) result 2 main: x result *=*= n; n; return return result; result; }}
- Bài đọc thêm: tổ chức dữ liệu Dữ liệu trong chương trình được lưu trữ trong các biến. Khi hàm được gọi thực hiện, các biến cục bộ sẽ Heap được khởi tạo trên vùng nhớ stack và tự động bị hủy khi hàm kết thúc. Các biến toàn cục sẽ được tạo trên vùng nhớ phân Data đoạn dữ liệu (data segment) khi chương trình được segment gọi thực hiện, tự động bị hủy khi chương trình kết Stack thúc. Có thể sử dụng các từ khóa để chỉ định vị trí của biến: auto stack (default) static data segment register thanh ghi của CPU Dữ liệu còn có thể được đặt trong vùng nhớ heap.
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài giảng Nhập môn Lập trình: Phần 1
43 p | 132 | 21
-
Bài giảng Nhập môn lập trình: Phần 2 - Cấu trúc điều khiển
23 p | 112 | 15
-
Bài giảng Nhập môn lập trình C: Chương 3 - Trần Thị Kim Chi
76 p | 104 | 11
-
Bài giảng Nhập môn lập trình Java: Bài 4 - Võ Tấn Dũng
74 p | 68 | 8
-
Bài giảng Nhập môn lập trình Java: Bài 10 - Võ Tấn Dũng
46 p | 66 | 8
-
Bài giảng Nhập môn lập trình: Chương 2 - Trần Minh Thái
86 p | 106 | 8
-
Bài giảng Nhập môn lập trình: Chương 1 - Trần Minh Thái
58 p | 102 | 7
-
Bài giảng Nhập môn lập trình: Bài 5 - Cấu trúc lặp
58 p | 62 | 6
-
Bài giảng Nhập môn lập trình khoa học dữ liệu: Bài 2 - Trương Xuân Nam
26 p | 45 | 6
-
Bài giảng Nhập môn lập trình: Mở đầu - Trần Phước Tuấn
22 p | 91 | 6
-
Bài giảng Nhập môn lập trình: Chương 3 - Trường Đại học Ngoại ngữ - Tin học, TP.HCM
79 p | 17 | 6
-
Bài giảng Nhập môn lập trình: Bài 1 - Trần Duy Thanh
70 p | 188 | 5
-
Bài giảng Nhập môn lập trình - Bài 2: Giới thiệu ngôn ngữ lập trình C
18 p | 108 | 5
-
Bài giảng Nhập môn lập trình - Bài 5: Câu lệnh lặp
49 p | 99 | 4
-
Bài giảng Nhập môn lập trình - Bài 1: Các khái niệm cơ bản về lập trình
21 p | 127 | 4
-
Bài giảng Nhập môn lập trình: Bài 1 - TS. Ngô Hữu Dũng
47 p | 79 | 3
-
Bài giảng Nhập môn lập trình: Bài 2 - TS. Ngô Hữu Dũng
53 p | 63 | 3
-
Bài giảng Nhập môn lập trình: Bài 3 - Trần Duy Thanh
16 p | 94 | 3
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn