• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
3 Function
 

3 Function

on

  • 1,232 views

 

Statistics

Views

Total Views
1,232
Views on SlideShare
1,227
Embed Views
5

Actions

Likes
0
Downloads
41
Comments
0

2 Embeds 5

http://www.slideshare.net 4
http://webcache.googleusercontent.com 1

Accessibility

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    3 Function 3 Function Presentation Transcript

    • 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 double Power(double x, int n) { double result; for(result = 1; n; n--) result *= x; return result; } nhận vào 2 tham số khi được gọi kiểu của giá trị trả về giá trị được trả về qua lệnh return
    • Ví dụ: gọi thực hiện hàm Power #include <stdio.h> double Power(double, int); int main() { double m = Power(2, 3); printf(“3.5 ^ 4 = %lf”, Power(3.5, 4)); return 0; } Chỉ thị cho chương trình biết prototype của hàm Power 3.5 và 4: 2 tham số thực sự
    • Một số lỗi thường gặp #include <stdio.h> int main() { int m = Power(2, 3); printf(“3.5 ^ 4 = %lf”, Power(4)); return 1.0; } Compiler không hiểu được hàm Power giá trị trả về không khớp kiểu hàm Power thiếu tham số
    • 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 kiểu trả về tên hàm(danh sách tham số hình thức) { //khai báo các biến của hàm //các lệnh thực thi return giá trị trả về; //hàm void không có giá trị trả về } header của hàm thân (body) hàm
    • Tầm tác dụng của biến
      • Biến toàn cục: Không thuộc khối nào, có tác dụng trong toàn chương trình kể từ khi khai báo
      • Biến cục bộ: khai báo trong một khối, chỉ có tác dụng trong khối này
      float g=6.5; void main() { int i = 5, j, k = 2; float f = 2.8F ; d = 3.7; } void F(int v) { double d, e = 0.0, f; i++; g--; f = 0.0; } compiler không chấp nhận “d”, “i” “ 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 <stdio.h> void change(int v); int main() { int var = 5; change(var); printf(&quot;main: var = %i &quot;, var); return 0; } void change(int v) { v *= 100; printf(&quot;change: v = %i &quot;, v); } change: v = 500 main: var = 5 hàm change không thay đổi giá trị của “var”
    • 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, …); function inputs outputs
    • Truyền địa chỉ - ví dụ #include <stdio.h> void change(int *v); int main() { int var = 5; change(&var); printf(&quot;main: var = %i &quot;, var); return 0; } void change(int *v) { (*v) *= 100; printf(&quot;change: *v = %i &quot;, (*v)); } change: *v = 500 main: var = 500 v: tham số địa chỉ của số int, khai báo với dấu * truyền địa chỉ của “var” vào hàm change
    • 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 <stdio.h> void change(int &v); int main() { int var = 5; change(var); printf(&quot;main: var = %i &quot;, var); return 0; } void change(int &v) { v *= 100; printf(&quot;change: v = %i &quot;, v); } change: v = 500 main: var = 500 v: tham số tham chiếu, khai báo với dấu & truyền “var” vào hàm change
    • Truyền tham số - ví dụ #include <stdio.h> void function(int a, int *b, int &c); int main() { int x = 3, y = 4, z = 5; function(x, &y, z); printf(&quot;%i %i %i &quot;, x, y, z); return 0; } void function(int a, int *b, int &c) { a *= 2; (*b) += a; c = a + (*b); printf(&quot;%i %i %i &quot;, a, *b, c); } 6 10 16 3 10 16 main function a b 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 <stdio.h> double power(int, int); int main(void) { int x = 2; double d; d = power(x, 5); printf(&quot;%lf &quot;, d); return 0; } double power(int n, int p) { double result = n; while(--p > 0) result *= n; return result; } main: x 2 main: d ? power: p 5 power: n 2 power: result 32.0 32.0
    • 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ẽ đượ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 đoạn dữ liệu (data segment) khi chương trình được gọi thực hiện, tự động bị hủy khi chương trình kết 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.
      Heap Data segment Stack
    • Tóm lược
      • Khai báo và gọi thực hiện hàm
      • Khai báo prototypes
      • Tầm tác dụng của biến
      • Truyền tham số cho hàm
      • Vấn đề tổ chức dữ liệu trong chương trình