Transcript
Page 1: CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

CÂU HỎICÂU HỎI: Cho biết kết quả thực : Cho biết kết quả thực thi chương trình sau:thi chương trình sau:

void f(int, int&, int);void f(int, int&, int);void main()void main(){{

int a=100, b=200, c=300; int a=100, b=200, c=300; cout<<a<<“ “<<b<<“ “<<c<<endl;cout<<a<<“ “<<b<<“ “<<c<<endl;f(a,b,c);f(a,b,c);cout<<a<<“ “<<b<<“ “<<c<<endl;cout<<a<<“ “<<b<<“ “<<c<<endl;getch();getch();

}}void f(int a, int&b, int c)void f(int a, int&b, int c){{

if (a<b) if (a<b) {{ a=a+50; b=b-50;a=a+50; b=b-50;}}cout<<a<<“ “<<b<<“ “<<c<<endl;cout<<a<<“ “<<b<<“ “<<c<<endl;

}}

Page 2: CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

CHÖÔNG 5CHÖÔNG 5CHƯƠNG TRÌNH CONCHƯƠNG TRÌNH CON

(TIẾP THEO)(TIẾP THEO)

VI. PHẠM VI - THỜI GIAN SỐNG CỦA BIẾN VI. PHẠM VI - THỜI GIAN SỐNG CỦA BIẾN (SCOPE & LIFE TIME)(SCOPE & LIFE TIME)

VII. HÀM ĐỆ QUIVII. HÀM ĐỆ QUI

Page 3: CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

VI. PHẠM VI - THỜI GIAN SỐNG VI. PHẠM VI - THỜI GIAN SỐNG CỦA BIẾN (SCOPE & LIFE TIME)CỦA BIẾN (SCOPE & LIFE TIME)

Định nghĩa phạm vi biếnĐịnh nghĩa phạm vi biến:: Phạm vi của Phạm vi của biến là phần chương trình trong đó việc 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 tham khảo đến biến là hợp lệ. Gồm biến cục bộ và biến tòan cục.cục bộ và biến tòan cục.

ĐN Thời gian sống của biếnĐN Thời gian sống của biến: : Khi thực thi Khi thực thi chương trình, biến được tạo ra và hủy đi. 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 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 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 gian sống phụ thuộc phạm vi và lớp lưu trữ.trữ.

Page 4: CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

VI. PHẠM VI - THỜI GIAN SỐNG CỦA VI. PHẠM VI - THỜI GIAN SỐNG CỦA BIẾN (SCOPE & LIFE TIME)BIẾN (SCOPE & LIFE TIME)

1. 1. Biến tòan cụcBiến tòan cục: : Khai báo bên ngoài các hàm.Khai báo bên ngoài các hàm. Tự động khởi tạo giá trị 0 (không cho phép 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ị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 Có thời gian sống cùng với thời gian chạy

chương trình. chương trình. Nhắc lạiNhắc lại: :

int n; //khai báo biếnint n; //khai báo biếnint a=5; //khai báo biến có khởi tạo trị.int a=5; //khai báo biến có khởi tạo trị.

//không cho phép đ/v tòan cục//không cho phép đ/v tòan cục

Page 5: CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

VI. PHẠM VI - THỜI GIAN SỐNG VI. PHẠM VI - THỜI GIAN SỐNG CỦA BIẾN (SCOPE & LIFE TIME)CỦA BIẾN (SCOPE & LIFE TIME)

2. 2. Biến cục bộBiến cục bộ:: Khai báo bên trong hàm, trong khối lệnh.Khai báo bên trong hàm, trong khối lệnh. Không được tự động khởi tạo giá trị.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 Có phạm vi từ vị trí khai báo đến cuối hàm

hoặc cuối khối lệnh. hoặc cuối khối lệnh. Thời gian sống từ lúc hàm được thực thi 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 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. thúc hàm hoặc chạy xong khối lệnh.

Xét ví dụ sau:Xét ví dụ sau:

Page 6: CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

int n1;int n1;void sub_fun();void sub_fun();void main()void main(){{

int n2=2;int n2=2;int n3;int n3;cout<<“n3=“<<n3<<endl;cout<<“n3=“<<n3<<endl;cout<<“main: n1=”<<n1<<“n2= “<<n2<<endl;cout<<“main: n1=”<<n1<<“n2= “<<n2<<endl;sub_fun();sub_fun();cout<<“main: n1=”<<n1<<“ n2= “<<n2<<endl;cout<<“main: n1=”<<n1<<“ n2= “<<n2<<endl;

}}void sub_fun()void sub_fun(){{

int n2;int n2;n2=30;n2=30;cout<<“sub: n1=”<<n1<<“ n2=“<<n2<<endl;cout<<“sub: n1=”<<n1<<“ n2=“<<n2<<endl;n1=40;n1=40;

}}

n3=4412

main: n1=0 n2=2

sub: n1=0 n2=30

main: n1=40 n2=2

Page 7: CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

VI. PHẠM VI - THỜI GIAN SỐNG VI. PHẠM VI - THỜI GIAN SỐNG CỦA BIẾN (SCOPE & LIFE TIME)CỦA BIẾN (SCOPE & LIFE TIME)

Lưu ý 1Lưu ý 1:: Trong cùng phạm vi, mỗi biến chỉ được Trong cùng phạm vi, mỗi biến chỉ được

khai báo một lần.khai báo một lần. Phạm vi cục bộ che phủ phạm vi toàn cục.Phạm vi cục bộ che phủ phạm vi toàn cục. Trong phạm vi cục bộ, muốn sử dụng biến Trong phạm vi cục bộ, muốn sử dụng biến

tòan cục cùng tên ta dùng tóan tử phạm vi tòan cục cùng tên ta dùng tóan tử phạm vi (::)(::)

Ví dụ:Ví dụ:

Page 8: CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

#include <iostream.h>#include <iostream.h>int n1;int n1;void sub_fun();void sub_fun();void main()void main(){{

int n1=10;int n1=10;cout<<“main: n1=”<<n1<<endl;cout<<“main: n1=”<<n1<<endl;cout<<“Global: “<<“n1= “<<::n1<<endl;cout<<“Global: “<<“n1= “<<::n1<<endl;::n1=40;::n1=40;sub_fun();sub_fun();

}}void sub_fun()void sub_fun(){{

cout<<“Global: n1=”<<n1<<endl;cout<<“Global: n1=”<<n1<<endl;}}

main: n1=10

Global: n1=0

Global: n1=40

Page 9: CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

VI. PHẠM VI - THỜI GIAN SỐNG VI. PHẠM VI - THỜI GIAN SỐNG CỦA BIẾN (SCOPE & LIFE TIME)CỦA BIẾN (SCOPE & LIFE TIME)

Lưu ý 2Lưu ý 2:: Các hàm phải được khai báo toàn cục Các hàm phải được khai báo toàn cục

(Bên trong hàm không được khai báo (Bên trong hàm không được khai báo hàm) hàm)

Các hàm cùng tên, khác thông số được Các hàm cùng tên, khác thông số được gọi là overload.gọi là overload.

Ví dụ:Ví dụ:

Page 10: CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

#include <iostream.h>#include <iostream.h>#include <conio.h>#include <conio.h>void GiaiPhuongTrinh(float, float);void GiaiPhuongTrinh(float, float);void GiaiPhuongTrinh(float,float,float);void GiaiPhuongTrinh(float,float,float);void main()void main(){{

float m=2,n=3,p=-4;float m=2,n=3,p=-4;cout<<“Giai Phuong trinh bac 1: ” <<endl;cout<<“Giai Phuong trinh bac 1: ” <<endl;GiaiPhuongTrinh(m,n);GiaiPhuongTrinh(m,n);cout<<“Giai Phuong trinh bac 2: ” <<endl;cout<<“Giai Phuong trinh bac 2: ” <<endl;GiaiPhuongTrinh(m,n,p);GiaiPhuongTrinh(m,n,p);getch();getch();

}}

Page 11: CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

void GiaiPhuongTrinh(float a, float b)void GiaiPhuongTrinh(float a, float b){{

if (a!=0) cout<<“x=“<<–b/a<<endl;if (a!=0) cout<<“x=“<<–b/a<<endl;elseelse

if (b!=0) cout<<“PTVN”<<endl;if (b!=0) cout<<“PTVN”<<endl;else cout<<“VSN”<<endl;else cout<<“VSN”<<endl;

return;return;}}

Page 12: CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

void GiaiPhuongTrinh(float a, float b, float c)void GiaiPhuongTrinh(float a, float b, float c){{

if (a==0) { GiaiPhuongTrinh(a,b); return;}if (a==0) { GiaiPhuongTrinh(a,b); return;}float d=b*b -4*a*c;float d=b*b -4*a*c;if (d>0)if (d>0){ cout<<“x1=“<<(-b-sqrt(d))/(2*a)<<endl;{ cout<<“x1=“<<(-b-sqrt(d))/(2*a)<<endl; cout<<“x2=“<<(-b+sqrt(d))/(2*a)<<endl;cout<<“x2=“<<(-b+sqrt(d))/(2*a)<<endl;}}else if (d==0) else if (d==0)

cout<<“x1=x2=“<<-b/(2*a)<<endl; cout<<“x1=x2=“<<-b/(2*a)<<endl; else else

cout<<“PTB2 vo nghiem”;cout<<“PTB2 vo nghiem”;return;return;

}}

Page 13: CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

VI. PHẠM VI - THỜI GIAN SỐNG CỦA VI. PHẠM VI - THỜI GIAN SỐNG CỦA BIẾN (SCOPE & LIFE TIME)BIẾN (SCOPE & LIFE TIME)

3. Lớp lưu trữ biến:3. Lớp lưu trữ biến:Có 4 lớp lưu trữ là: auto, static, extern, register.Có 4 lớp lưu trữ là: auto, static, extern, register.a. a. Lớp lưu trữ cho biến cục bộLớp lưu trữ cho biến cục bộ: auto, static hoặc : auto, static hoặc

register. register. Chỉ định lớp khi khai báo một biến cục bộChỉ định lớp khi khai báo một biến cục bộVí dụ: Ví dụ: static int x;static int x;

register float y;register float y; Mặc định là auto, không được khởi động trị.Mặc định là auto, không được khởi động trị.Ví dụ: Ví dụ: int n; //n có một trị bất kỳ khi tạoint 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, Biến thuộc lớp register có đặc tính giống auto,

nhưng được lưu trong thanh ghi (Vùng nhớ CPU).nhưng được lưu trong thanh ghi (Vùng nhớ CPU).

Page 14: CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

VI. PHẠM VI - THỜI GIAN SỐNG VI. PHẠM VI - THỜI GIAN SỐNG CỦA BIẾN (SCOPE & LIFE TIME)CỦA BIẾN (SCOPE & LIFE TIME)

Biến cục bộ auto và register có thời gian Biến cục bộ auto và register có thời gian sống cùng với hàm nên trị mất đi sau mỗi sống cùng với hàm nên trị mất đi sau mỗi lần gọi hàm.lần gọi hàm.

Biến cục bộ staticBiến cục bộ static có thời gian sống cùng có thời gian sống cùng với với chương trìnhchương trình. Được khởi động trị tự . Được khởi động trị tự động nếu ta không khởi động trị cho nó. Và độ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 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 tạo. Nên giữ lại được giá trị của lần gọi hàm trước đó.hàm trước đó.

Ví dụVí dụ

Page 15: CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

#include <iostream.h>#include <iostream.h>#include <conio.h>#include <conio.h>void sub();void sub();void main()void main(){{ int i;int i;

for (i=0; i<5;i++) for (i=0; i<5;i++) sub();sub();

return;return;}}void sub()void sub(){ {

static int num1=1; static int num1=1; int num2=1;int num2=1;

cout <<num1<<" “<<num2<<endl;cout <<num1<<" “<<num2<<endl; num1++; num2++;num1++; num2++; return;return;}}

1 1

2 1

3 1

4 1

5 1

Page 16: CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

VI. PHẠM VI - THỜI GIAN SỐNG VI. PHẠM VI - THỜI GIAN SỐNG CỦA BIẾN (SCOPE & LIFE TIME)CỦA BIẾN (SCOPE & LIFE TIME)

b. Lớp lưu trữ cho biến tòan cục: extern b. Lớp lưu trữ cho biến tòan cục: extern hoặc static. hoặc static. Ví dụ: Ví dụ: extern int n; extern int n;

static float b;static float b; Lớp lưu trữ của biến tòan cục chỉ để thay đổi Lớp lưu trữ của biến tòan cục chỉ để thay đổi

phạm vi sử dụng biến, không đổi thời gian phạm vi sử dụng biến, không đổi thời gian sống:sống:

extern để thông báo (declaration) một biến đã extern để thông báo (declaration) một biến đã được khai báo (definition) ở tập tin khác.được khai báo (definition) ở tập tin khác.

static để ngăn cấm không cho biến sử dụng ở static để ngăn cấm không cho biến sử dụng ở tập tin khác.tập tin khác.

Page 17: CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

FILE1.CPPFILE1.CPP FILE2.CPPFILE2.CPP

int volts;int volts;float current;float current;static double power;static double power;void main()void main(){ fun1();{ fun1(); fun2();fun2(); fun3();fun3(); fun4();fun4();}}extern double factor;extern double factor;void fun1()void fun1(){{

......}}void fun2()void fun2(){{

......}}

double factor;double factor;extern int volts;extern int volts;

void fun3();void fun3();{{

......}}

void fun4()void fun4(){{

......}}

Page 18: CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

VII. HÀM ĐỆ QUIVII. HÀM ĐỆ QUI

1. 1. Định nghĩaĐịnh nghĩa: Hàm đệ qui là hàm có chứa : Hàm đệ qui là hàm có chứa (hoặc ẩn chứa) lời gọi hàm lại chính nó. (hoặc ẩn chứa) lời gọi hàm lại chính nó. Ví dụVí dụ: Hàm in ra n dấu *: Hàm in ra n dấu *void InDauSao(int n)void InDauSao(int n){{

cout<<‘*’;cout<<‘*’;if (n>1) InDauSao(n-1);if (n>1) InDauSao(n-1);

}}

Page 19: CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

VII. HÀM ĐỆ QUIVII. HÀM ĐỆ QUI

2. 2. Phân lọaiPhân lọai: : Đệ qui tuyến tính: Trong hàm chỉ có 1 lời Đệ qui tuyến tính: Trong hàm chỉ có 1 lời

gọi hàm đệ qui.gọi hàm đệ qui. Đệ qui phi tuyến: Có hơn 1 lời gọi hàm Đệ qui phi tuyến: Có hơn 1 lời gọi hàm

đệ qui. Đệ qui nhị phân là trường hợp đệ qui. Đệ qui nhị phân là trường hợp đặc biệt của đệ qui phi tuyến. đặc biệt của đệ qui phi tuyến.

Đệ qui tương hỗ: Không đệ qui trực tiếp, Đệ qui tương hỗ: Không đệ qui trực tiếp, không gọi lại chính mình.không gọi lại chính mình.Ví dụ: A gọi B, B gọi C, C gọi AVí dụ: A gọi B, B gọi C, C gọi A

Page 20: CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

VII. HÀM ĐỆ QUIVII. HÀM ĐỆ QUI3. 3. Sử dụng hàm đệ qui khi nàoSử dụng hàm đệ qui khi nào?? Giải Giải bài tóan có tính đệ quibài tóan có tính đệ qui giúp chương giúp chương

trình ngắn gọn.trình ngắn gọn. Là dạng tóan có thể qui về một bài tóan 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 cùng dạng nhưng với số lượng phép tóan hay công việc giảm đi.tóan hay công việc giảm đi.

Ví dụ:Ví dụ:

Page 21: CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

VII. HÀM ĐỆ QUIVII. HÀM ĐỆ QUI3. Sử dụng hàm đệ qui khi nào?3. Sử dụng hàm đệ qui khi nào? Ví dụ: Ví dụ:

n! = n * (n-1)!n! = n * (n-1)!USC(x,y)= USC(x-y,y) nếu x>yUSC(x,y)= USC(x-y,y) nếu x>ySố chữ số của x= 1 + số chữ số của x/10Số chữ số của x= 1 + số chữ số của x/10fibonacci(n)=fibonacci(n-1)+fibonacci(n-2)fibonacci(n)=fibonacci(n-1)+fibonacci(n-2)

Page 22: CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

VII. HÀM ĐỆ QUIVII. HÀM ĐỆ QUI4. 4. Nguyên tắc viết hàm đệ quiNguyên tắc viết hàm đệ qui: Hàm đệ qui : Hàm đệ qui

cần thỏa 2 đk:cần thỏa 2 đk: Giải quyết được trong trường hợp riêng 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 ứng với giá trị đặc biệt của tham số (tr/h suy biến).suy biến).

Trường hợp tổng quát, bài tóan được Trường hợp tổng quát, bài tóan được định nghĩa đệ qui với giá trị tham số thay định nghĩa đệ qui với giá trị tham số thay đổi.đổi.Ví dụVí dụ: Tính n!: Tính n!

Tổng quát: n!= n*(n-1)!Tổng quát: n!= n*(n-1)!Suy biến: Suy biến: Bằng 1 khi n=0||Bằng 1 khi n=0||

n=1n=1

Page 23: CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

VII. HÀM ĐỆ QUIVII. HÀM ĐỆ QUI Như vậy một hàm đệ qui sẽ có dạngNhư vậy một hàm đệ qui sẽ có dạng

... hàmF (...)... hàmF (...){{

if ( thông_số == trị_đặc_biệt )if ( thông_số == trị_đặc_biệt )return kết_quả;return kết_quả;

........hàmF (...);hàmF (...);........

}}

Page 24: CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

5. Quá trình thực thi hàm đệ qui:5. Quá trình thực thi hàm đệ qui:

Ví dụ 1Ví dụ 1: Đếm số chữ số của một số nguyên n>0: Đếm số chữ số của một số nguyên n>0

int DigitCount(int n)int DigitCount(int n){{

if (n<10) return 1;if (n<10) return 1;elseelse

return 1+DigitCount(n/10);return 1+DigitCount(n/10);}}

Gọi hàm DigitCount(517) ta có quá trình thực thi Gọi hàm DigitCount(517) ta có quá trình thực thi sau:sau:

Page 25: CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

5. Quá trình thực thi hàm đệ qui:5. Quá trình thực thi hàm đệ qui:

DigitCount(517)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

return 1;

}

1

2

3

Page 26: CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

5. Quá trình thực thi hàm đệ qui:5. Quá trình thực thi hàm đệ qui:

Ví dụ 2Ví dụ 2: Tìm ước số chung lớn nhất của 2 số : Tìm ước số chung lớn nhất của 2 số nguyên dương.nguyên dương.

int USCLN(int u, int v)int USCLN(int u, int v){{

if (v==0) return u;if (v==0) return u;elseelse

return USCLN(v, u%v);return USCLN(v, u%v);}}

Gọi hàm USCLN(9,12) ta có quá trình thực thi sau:Gọi hàm USCLN(9,12) ta có quá trình thực thi sau:

Page 27: CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

5. Quá trình thực thi hàm đệ qui:5. Quá trình thực thi hàm đệ qui:

USCLN(9,6)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

return u;

}

3

3

3

3

Page 28: CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

5. Quá trình thực thi hàm đệ qui:5. Quá trình thực thi hàm đệ qui:

Kết luận:Kết luận: Mỗi lần gọi đệ qui tập các biến cục bộ, 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 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.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ì 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.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 Lần gọi hàm sau cùng sẽ thóat ra đầu tiên.tiên.

Hàm đệ qui thực thi cần nhiều không gian Hàm đệ qui thực thi cần nhiều không gian nhớ hơn hàm không đệ qui.nhớ hơn hàm không đệ qui.

Page 29: CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

6. Các ví dụ khác6. Các ví dụ khác

1.1. S= 1 + 2 + 3 + .... + nS= 1 + 2 + 3 + .... + n2.2. S= x + xS= x + x33+ x+ x55 + ... + x + ... + x2n+12n+1

3.3. Tìm USCLN của 2 số bằng thuật tóan trừTìm USCLN của 2 số bằng thuật tóan trừ4.4. Tính số Fibonacci thứ nTính số Fibonacci thứ n5.5. Bài tóan tháp hà nộiBài tóan tháp hà nội


Recommended