C++: Bài 18. Biến toàn cục và biến cục bộ
Giải phóng thời gian, khai phóng năng lực
Các biến được sử dụng trong một chương trình có thể có những phạm vi hoạt động khác nhau, tùy thuộc vào từng loại. Ta có hai loại biến cơ bản như sau:
+ Có phạm vi hoạt động trong tất cả các hàm được định nghĩa hoặc khai báo sau nó.
+ Được khai báo ở ngoài tất cả các hàm, kể cả hàm main().
+ Ở mọi vị trí của chương trình biến này đều có thể được sử dụng, được gọi đến.
+ Tất cả các hàm của chương trình đều có quyền sử dụng biến tổng thể này.
+ Biến tổng thể thường được khai báo sau các #include .
+ Ví dụ: Viết chương trình giải phương trình bậc nhất ax + b = 0.
--> Khai báo 2 biến a, b (là 2 hệ số của phương trình) là 2 biến tổng thể.
--> Viết 2 hàm, một hàm dùng để nhập hai hệ số a và b, hàm kia dùng để hiển thị kết quả nghiệm của phương trình ứng với 2 giá trị a và b.
--> Chương trình được viết như sau:
#include<iostream> using namespace std; float a, b; //Khai báo 2 biến tổng thể a và b //Sau khi hàm này được gọi xong a và b sẽ nhận các giá trị nhập vào từ bàn phím void nhapHeSo() { cout<<"Nhap he so a: "; cin>>a; cout<<"Nhap he so b: "; cin>>b; } void xacDinhNghiem() { if(a==0){ if(b==0){ cout<<"Phuong trinh co vo so nghiem!"; }else{ cout<<"Phuong trinh vo nghiem!"; } }else{ cout<<"Phuong trinh co nghiem x = "<<-b/a; } } main() { nhapHeSo(); xacDinhNghiem(); return 0; }
Kết quả:
+ Được khai báo bên trong các hàm.
+ Đối số của hàm cũng là biến cục bộ của hàm. Vì vậy, biến cục bộ và đối số của một hàm không được trùng tên nhau.
+ Có phạm vi hoạt động chỉ trong hàm khai báo chúng.
+ Các hàm khác không có khả năng sử dụng chúng (kể cả hàm main()).
+ Sau khi hàm chứa nó thực hiện xong, giá trị của các biến này sẽ bị hủy đi.
Ví dụ 1:
Tính giai thừa : S = n! (=1*2*3*4*…*n). Chương trình được viết như sau:
#include<iostream> using namespace std; float giaiThua(int n) { //n: tham số có phạm vi hoạt động chỉ trong hàm giaiThua int i; //i: biến cục bộ chỉ hoạt động được trong hàm giaiThua float KQ=1.0; //KQ: cũng là biến cục bộ của giaiThua for(i=1; i<=n ; i++) KQ = KQ * i; return KQ; } main() { int n; //n là biến cục bộ chỉ hoạt động được trong hàm main() cout<<"Nhap n: "; cin>>n; cout<<"Giai thua cua "<<n<<" bang "<<giaiThua(n); return 0; }
Ví dụ 2:
Viết lại chương trình giải phương trình bậc nhất, trong đó các hệ số a, b của phương trình phải là các biến cục bộ trong hàm (nghĩa là không được khai báo a, b là các biến tổng thể).
Sau đây là đoạn code demo chương trình:
#include<iostream> using namespace std; //Sau khi hàm này được gọi xong a và b ở hàm main() sẽ nhận các giá trị nhập vào từ bàn phím void nhapHeSo(float *pa, float *pb) { cout<<"Nhap he so a: "; cin>>*pa; cout<<"Nhap he so b: "; cin>>*pb; } void xacDinhNghiem(float a, float b) { if(a==0){ if(b==0){ cout<<"Phuong trinh co vo so nghiem!"; }else{ cout<<"Phuong trinh vo nghiem!"; } }else{ cout<<"Phuong trinh co nghiem x = "<<-b/a; } } main() { float a, b, *pa, *pb; //Khai báo 2 hệ số a, b là các biến cục bộ của hàm main() pa=&a; //*pa và *pb là 2 con trỏ của 2 biến a và b nhằm mục đích pb=&b; //truyền đối số cho các hàm theo tham chiếu nhapHeSo(pa, pb); xacDinhNghiem(a,b); return 0; }
Giải phóng thời gian, khai phóng năng lực