Bài 9 Biến cục bộ và biến toàn cục

 Khai báo một hàm Kiểu trả về Tên hàm (kiểu tham số, kiểu tham số.);  Tham số là tùy chọn

pdf20 trang | Chia sẻ: lylyngoc | Lượt xem: 1982 | Lượt tải: 0download
Bạn đang xem nội dung tài liệu Bài 9 Biến cục bộ và biến toàn cục, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Bài 9 BIẾN CỤC BỘ VÀ BIẾN TOÀN CỤC Khai Báo Hàm  Khai báo một hàm Kiu tr v Tên hàm (kiểu tham số, kiểu tham số....);  Tham số là tùy chọn Tầm vực  Tầm vực xác định phạm vi mà một biến có thể được truy xuất.  Tầm vực cũng xác định thời gian tồn tại của một biến  Có ba loại biến: biến cục bộ, tham số hình thức và biến toàn cục. Biến cục bộ  Biến được khai báo bên trong một hàm được gọi là biến cục bộ  C++ cũng cho phép khái niệm biến cục bộ bên trong một khối mã.  Biến cục bộ chỉ có thể được dùng bên trong khối mã mà nó được khai báo.  Biến cục bộ bên trong một khối mã chỉ tồn tại khi khối mã đó đang thực thi  Khối mã phổ biến nhất là hàm.  Thân hàm là ẩn đối với phần còn lại của chương trình và vì vậy chúng không ảnh hưởng hay bị ảnh hưởng bởi các phần khác.  Dữ liệu và mã của hàm không thể tương tác với dữ liệu và mã của hàm khác vì hai hàm có tầm vực khác nhau.  Các biến được khai báo bên trong một hàm không ảnh hửong đến biến trong một hàm khác, ngay cả khi chúng có tên trùng nhau. ví dụ #include using namespace std; void f1(); int main() { char str[] = "this is str in main()"; cout << str << '\n'; f1(); cout << str << '\n'; return 0; } void f1() { char str[80]; cout << "Enter something: "; cin >> str; cout << str << '\n'; }  Khi một biến cục bộ trùng tên với một biến bên ngoài khối mã mà nó được khai báo thì biến bên ngoài không bị ảnh hưởng trong khối mã đó. Ví dụ: int main() { int i=10, j =100; if (j>0) { int i; i = j/2; cout<<" giá trị i bên trong: "<<i<<'\n'; } cout<<"giá trị i bên ngoài :"<<i<<'\n'; return 0; } Biến toàn cục  Biến toàn cục được khai báo bên ngoài các hàm  Biến toàn cục có ảnh hưởng toàn bộ chương trình, ngoại trừ bị phủ quyết bởi biến cục bộ có cùng tên trong một hàm. Ví dụ: void drill(); int count; // count and num_right are global int num_right; int main() { cout << "Thử bao nhiêu lần: "; cin >> count; num_right = 0; do { drill(); count--; } while(count); cout << "Bạn có " << num_right << " lần đúng.\n"; return 0; } void drill() { int count, a, b, ans; // Phát sinh số ngẫu nhiên giữa 0 và 99. a = rand() % 100; b = rand() % 100; for(count=0; count<3; count++) { cout << "Tổng " << a << " + " << b << "? "; cin >> ans; if(ans==a+b) { cout << "Đúng\n"; num_right++; return; } } cout << "Đáp án là " << a+b << '\n'; } Các tham số hình thức  Nếu hàm dùng các tham số thì phải khai báo các biến để nhận giá trị của các tham số này. Các biến này được gọi là tham số hình thức.  Các tham số hình thức tác động như biến cục bộ bên trong một hàm. Tầm vực của tham số là phạm vi trong hàm chứa nó. Ví dụ: test(int a, int b) Gọi hàm với con trỏ #include using namespace std; void f(int *j); int main() { int i; int *p; p = &i; // p trỏ i f(p); cout << i; // i = 100 return 0; } void f(int *j) { *j = 100; /*biến được trỏ bởi j được gán 100*/ } có thể thay f(&i) Viết hàm có hai tham số cube(int *n, int m) để tính m giá trị: (*n)3 (*n+1)3 (*n+2)3.......(*n+m-1)3 void cube(int *n, int num) { while(num) { *n = *n * *n * *n; num--; n++; } } Tham số argc và argv  Muốn truyền thông tin vào một chương trình khi chạy nó, dùng các tham số dòng lệnh truyền vào cho hàm main(). Một tham số dòng lệnh là thông tin theo sau dòng lệnh của hệ điều hành. Ví dụ muốn biên dịch chương trình C++ từ giao diện dòng lệnh của hệ điều hành, dùng cl tên chng trình  C++ định nghĩa hai tham số tùy chọn của hàm main() là argc và argv, chúng nhận tham số dòng lệnh.  Tham số argc là một số integer chỉ ra số tham số trên dòng lệnh. Nó luôn có giá trị nhỏ nhất là 1 (tham số tên của chương trình)  Tham số argv là một con trỏ chỉ đến một mảng của các con trỏ kiểu ký tự. Mỗi con trỏ trong mảng chỉ dến một chuỗi chứa một tham số dòng lệnh. Tên của chương trình được trỏ bởi argv[0], argv[1] chỉ đến tham số thứ nhất và argv[2] chỉ đến tham số thứ 2,...  Tất cả các tham số dòng lệnh được chuyển vào chương trình dưới dạng chuỗi, như vậy các tham số là con số sẽ phải được chuyển đổi bên trong chương trình. #include using namespace std; int main(int argc, char *argv[]) { if(argc!=2) { cout << "You forgot to type your name.\n"; return 1; } cout << "Hello " << argv[1] << '\n'; return 0; } #include #include using namespace std; int main(int argc, char *argv[]) { double a, b; if(argc!=3) { cout << "Usage: add num num\n"; return 1; } a = atof(argv[1]); b = atof(argv[2]); cout << a + b; return 0; } Câu lệnh return  Có hai hoạt động quan trọng:  Khiến cho thực thi trong một hàm quay về chương trình gọi nó ngay tức thời  Có thể được dùng để trả về một giá trị ví dụ #include using namespace std; int find_substr(char *sub, char *str); int main() { int index; index = find_substr("three", "one two three four"); cout << "Index của three là " << index; // index là 8 return 0; } int find_substr(char *sub, char *str) { int t; char *p, *p2; for(t=0; str[t]; t++) { p = &str[t]; p2 = sub; while(*p2 && *p2==*p) { p++; p2++; } if(!*p2) return t; // return index } return -1; // không có }