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ã đó... Biến toàn cụchàm trình, ngoại trừ bị phủ quyết
Trang 1Bài 9
BIẾN CỤC BỘ VÀ BIẾN TOÀN CỤC
Trang 2Khai Báo Hàm
tham số );
Trang 3Tầm vực
thể được truy xuất
một biến
thức và biến toàn cục
Trang 4Biến cục bộ
gọi là biến cục bộ
bên trong một khối mã
khối mã mà nó được khai báo
khi khối mã đó đang thực thi
Trang 5Thâ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
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
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
Trang 6ví dụ
#include <iostream>
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';
}
Trang 7Khi 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;
}
Trang 8Biến toàn cục
hàm
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ụ:
Trang 9void 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';
}
Trang 10Các tham số hình thức
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 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)
Trang 11Gọi hàm với con trỏ
#include <iostream>
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)
Trang 12Viết hàm có hai tham số cube(int *n, int m) để tính m giá trị:
Trang 13void cube(int *n, int num) {
while(num) {
*n = *n * *n * *n;
num ;
n++;
}
}
Trang 14Tham 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
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.
Trang 15Tham 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.
Trang 16#include <iostream>
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;
}
Trang 17#include <iostream>
#include <cstdlib>
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;
}
Trang 18Câu lệnh return
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ị
Trang 19ví dụ
#include <iostream>
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;
}
Trang 20int 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ó }