Lập trình C: Lời gọi hàm (Call Function)
Giải phóng thời gian, khai phóng năng lực
Các hàm thường giao tiếp hay gọi đến nhau bằng lời gọi hàm (call function). Việc giao tiếp hay gọi đến nhau của các hàm thông qua cách truyền tham số.
Các tham số được truyền theo một trong hai cách sau đây:
Truyền bằng tham trị (hay giá trị)
Ý nghĩa: Đây là lời gọi hàm mà trong đó đối số thực sự không thay đổi giá trị sau khi hàm được gọi thực hiện xong công việc. Truyền bằng tham trị là lời gọi mặc định của các chương trình C.
* Bản chất của truyền bằng tham chiếu là truyền địa chỉ của biến.
* Ý nghĩa: cách gọi hàm bằng truyền tham chiếu có thể làm thay đổi giá trị của đối số thực sự. Việc truyền tham chiếu được thực hiện thông qua biện pháp con trỏ.
Cú pháp:
Ví dụ:
Ví dụ 1: Viết một hàm có nhiệm vụ hoán đổi giá trị của hai số x và y cho nhau với x và y nhập vào từ bàn phím.
+ Nếu không dùng phương pháp tham chiếu thì chương trình sẽ không thực hiện được mục đích, tức là hai số x và y vẫn giữ nguyên giá trị sau lời gọi hàm. Chương trình được viết như sau:
#include<stdio.h> void hoanVi(float x, float y) { int z; z=x; //Cách khác: x=x+y; x=y; //y=x-y; //y= (x+y)-y = x y=z; //x=x-y; //x= (x+y)-x = y } int main() { float x, y; printf("Nhap 2 so x, y: "); scanf("%f %f",&x,&y); hoanVi(x, y); printf("\nSau khi tien hanh doi, ta duoc: x=%f va y=%f", x, y); return 0; }
+ Nếu dùng phương pháp tham chiếu thì chương trình sẽ thực hiện được mục đích, x và y sẽ hoán đổi giá trị cho nhau. Chương trình được viết như sau:
#include<stdio.h> void DoiGT(float *x, float *y) { int z; z=*x; //Cách khác: *x=*x+*y; *x=*y; //*y=*x-*y; //*y= (*x+*y)-*y = *x *y=z; //*x=*x-*y; //*x= (*x+*y)-*x = *y } int main() { float x, y; printf("\nNhap 2 so x, y: "); scanf("%f %f", &x, &y); DoiGT(&x,&y); printf("\nSau khi tien hanh hoan vi, ta duoc: x=%g va y=%g", x, y); return 0; }
Kết quả:
Ví dụ 2: Viết chương trình nhập vào 3 giá trị kiểu thực (float hoặc double), sau đó tìm giá trị lớn nhất trong 3 giá trị đó. Yêu cầu:
· Phải viết chương trình dưới dạng các hàm.
· Không được sử dụng các biến tổng thể (biến toàn cục).
+ Theo yêu cầu trên thì ta phải có 3 biến để lưu 3 giá trị muốn so sánh và các biến này phải là các biến địa phương khai báo trong các hàm. Vì hàm main() là hàm chính của chương trình nên ta sẽ khai báo các biến trong hàm main(), và vì chương trình được viết dưới dạng các hàm nên ta khai báo thêm các con trỏ ứng với các biến đó.
+ Chương trình được viết như sau:
#include<stdio.h> void nhap(float *a, float *b, float *c) { //hàm nhập các số a, b và c printf("\nNhap a: "); scanf("%f", a); printf("\nNhap b: "); scanf("%f", b); printf("\nNhap c: "); scanf("%f", c); } float sosanh(float a, float b, float c) { //hàm tìm giá trị lớn nhất float max; //biến lưu lại giá trị lớn nhất max = a; //giả sử a là số lớn nhất if(max < b) //nếu b lớn hơn max max = b; //thì gán b cho max if(max < c) //nếu c lớn hơn max max = c; //thì gán c cho max return max; //trả lại giá trị lớn nhất lưu trong biến max } int main() { float a, b, c; //khai báo 3 biến a, b, c float max; //khai báo biến lưu trữ giá trị lớn nhất nhap(&a,&b,&c); //Gọi hàm nhap() truyền đối số ở dạng tham chiếu max=sosanh(a,b,c); //Gọi và gán giá trị trả về của hàm sosanh() cho biến max printf("\nSo lon nhat trong 3 so nhap vao la: %g", max); return 0; }
Kết quả:
Chú ý: Mọi hàm nhập giá trị cho các biến địa phương (cục bộ) đều được truyền theo phương pháp tham chiếu theo mẫu chương trình như trên.
Giải phóng thời gian, khai phóng năng lực