intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Bài giảng Nhập môn Lập trình: Phần 3 - Hàm - Function

Chia sẻ: Lavie Lavie | Ngày: | Loại File: PPT | Số trang:21

121
lượt xem
14
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

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.

Chủ đề:
Lưu

Nội dung Text: Bài giảng Nhập môn Lập trình: Phần 3 - Hàm - Function

  1. Hàm ­ Function
  2. 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.
  3. 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.
  4. 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
  5. 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ự
  6. 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
  7. 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.
  8. 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
  9. 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
  10. 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)
  11. 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);
  12. 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); }}
  13. 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
  14. 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)); }}
  15. 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++
  16. 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); }}
  17. 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); }}
  18. 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ề
  19. 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; }}
  20. 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.
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2