PHẠM VI - THỜI GIAN SỐNG CỦA BIẾN SCOPE & LIFE TIME Định nghĩa phạm vi biến: Phạm vi của biến là phần chương trình trong đó việc tham khảo đến biến là hợp lệ.. ĐN Thời gian sống của
Trang 1CÂU HỎI: Cho biết kết quả thực
thi chương trình sau:
void f(int, int&, int);
Trang 2CHÖÔNG 5
CHƯƠNG TRÌNH CON
(TIẾP THEO)
VI PHẠM VI - THỜI GIAN SỐNG CỦA BIẾN
(SCOPE & LIFE TIME) VII HÀM ĐỆ QUI
Trang 3VI PHẠM VI - THỜI GIAN SỐNG
CỦA BIẾN (SCOPE & LIFE TIME)
Định nghĩa phạm vi biến: Phạm vi của
biến là phần chương trình trong đó việc
tham khảo đến biến là hợp lệ Gồm biến
cục bộ và biến tòan cục
ĐN Thời gian sống của biến: Khi thực thi chương trình, biến được tạo ra và hủy đi Thời gian sống là thời gian tồn tại của biến
từ lúc được tạo ra đến lúc hủy đi Thời
gian sống phụ thuộc phạm vi và lớp lưu
Trang 4VI PHẠM VI - THỜI GIAN SỐNG CỦA
BIẾN (SCOPE & LIFE TIME)
1 Biến tòan cục:
Tự động khởi tạo giá trị 0 (không cho phép viết lệnh khai báo khởi tạo trị )
Có thời gian sống cùng với thời gian chạy chương trình
Nhắc lại:
int n; //khai báo biến
int a=5; //khai báo biến có khởi tạo trị
Trang 5VI PHẠM VI - THỜI GIAN SỐNG CỦA BIẾN (SCOPE & LIFE TIME)
Khai báo bên trong hàm, trong khối lệnh
Không được tự động khởi tạo giá trị
Có phạm vi từ vị trí khai báo đến cuối hàm hoặc cuối khối lệnh
Thời gian sống từ lúc hàm được thực thi hoặc khối lệnh được thực thi đến lúc kết thúc hàm hoặc chạy xong khối lệnh
Trang 6cout<<“main: n1=”<<n1<<“ n2= “<<n2<<endl; }
Trang 7VI PHẠM VI - THỜI GIAN SỐNG CỦA BIẾN (SCOPE & LIFE TIME)
Ví dụ:
Trang 9VI PHẠM VI - THỜI GIAN SỐNG CỦA BIẾN (SCOPE & LIFE TIME)
Trang 11void GiaiPhuongTrinh(float a, float b){
if (a!=0) cout<<“x=“<<–b/a<<endl;else
if (b!=0) cout<<“PTVN”<<endl;else cout<<“VSN”<<endl;
return;
}
Trang 12void GiaiPhuongTrinh(float a, float b, float c) {
if (a==0) { GiaiPhuongTrinh(a,b); return;} float d=b*b -4*a*c;
if (d>0)
{ cout<<“x1=“<<(-b-sqrt(d))/(2*a)<<endl; cout<<“x2=“<<(-b+sqrt(d))/(2*a)<<endl; }
Trang 13VI PHẠM VI - THỜI GIAN SỐNG CỦA
BIẾN (SCOPE & LIFE TIME)
3 Lớp lưu trữ biến:
Có 4 lớp lưu trữ là: auto, static, extern, register.
a Lớp lưu trữ cho biến cục bộ: auto, static hoặc register.
Chỉ định lớp khi khai báo một biến cục bộ
Ví dụ: static int x;
register float y;
Mặc định là auto, không được khởi động trị.
Ví dụ: int n; //n có một trị bất kỳ khi tạo
Biến thuộc lớp register có đặc tính giống auto,
Trang 14VI PHẠM VI - THỜI GIAN SỐNG CỦA BIẾN (SCOPE & LIFE TIME)
sống cùng với hàm nên trị mất đi sau mỗi lần gọi hàm.
Biến cục bộ static có thời gian sống cùng với chương trình Được khởi động trị tự động nếu ta không khởi động trị cho nó Và chỉ khởi động trị 1 lần duy nhất khi được
tạo Nên giữ lại được giá trị của lần gọi hàm trước đó.
Trang 16VI PHẠM VI - THỜI GIAN SỐNG CỦA BIẾN (SCOPE & LIFE TIME)
b Lớp lưu trữ cho biến tòan cục: extern
hoặc static
static float b;
phạm vi sử dụng biến, không đổi thời gian
sống:
được khai báo (definition) ở tập tin khác.
Trang 17}
Trang 18VII HÀM ĐỆ QUI
(hoặc ẩn chứa) lời gọi hàm lại chính nó
Trang 19VII HÀM ĐỆ QUI
2 Phân lọai:
Đệ qui tuyến tính: Trong hàm chỉ có 1 lời
gọi hàm đệ qui
Đệ qui phi tuyến: Có hơn 1 lời gọi hàm
đệ qui Đệ qui nhị phân là trường hợp
đặc biệt của đệ qui phi tuyến
Đệ qui tương hỗ: Không đệ qui trực tiếp,
không gọi lại chính mình
Trang 20VII HÀM ĐỆ QUI
3 Sử dụng hàm đệ qui khi nào?
Giải bài tóan có tính đệ qui giúp chương
trình ngắn gọn
Là dạng tóan có thể qui về một bài tóan
cùng dạng nhưng với số lượng phép
tóan hay công việc giảm đi
Ví dụ:
Trang 22VII HÀM ĐỆ QUI
4 Nguyên tắc viết hàm đệ qui: Hàm đệ qui
cần thỏa 2 đk:
Giải quyết được trong trường hợp riêng
ứng với giá trị đặc biệt của tham số (tr/h suy biến)
Trường hợp tổng quát, bài tóan được
định nghĩa đệ qui với giá trị tham số thay đổi
Ví dụ: Tính n!
Tổng quát: n!= n*(n-1)!
Trang 245 Quá trình thực thi hàm đệ qui:
Trang 255 Quá trình thực thi hàm đệ qui:
DigitCount(517)
Thực thi DigitCount(517)
Khởi tạo biến cục bộ và tham trị
n=517 {
if (n<10) //false return 1+DigitCount(51);
}
Thực thi DigitCount(51)
Khởi tạo biến cục bộ và tham trị
n=51 {
if (n<10) //false return 1+ DigitCount(5);
Thực thi DigitCount(5)
Khởi tạo biến cục bộ và tham trị
n=5 {
if (n<10) //true
1 2
3
Trang 265 Quá trình thực thi hàm đệ qui:
Ví dụ 2: Tìm ước số chung lớn nhất của 2 số
Trang 275 Quá trình thực thi hàm đệ qui:
USCLN(9,6)
Thực thi USCLN(9,6)
Khởi tạo biến cục bộ và tham trị
u=9, v=6 {
if (v=0) //false return USCLN(6,3);
}
Thực thi USCLN(6,3)
Khởi tạo biến cục bộ và tham trị
u=6, v=3 {
if (v==0) //false return USCLN(3,0);
Thực thi USCLN(3,0)
Khởi tạo biến cục bộ và tham trị
u=3, v=0 {
if (v==0) //true
3 3
3
3
Trang 285 Quá trình thực thi hàm đệ qui:
Kết luận:
Mỗi lần gọi đệ qui tập các biến cục bộ,
tham trị được tạo ra độc lập với tập các
biến tạo ra cho lần gọi hàm trước
Mỗi lần thóat ra khỏi hàm của 1 lần gọi thì
tập biến cục bộ tương ứng bị xóa
Lần gọi hàm sau cùng sẽ thóat ra đầu
tiên