240 likes | 347 Vues
CHÖÔNG 5. CHƯƠNG TRÌNH CON (HÀM). CAÙC NOÄI DUNG ÑAÕ HOÏC. I. KHAÙI NIEÄM - CAÁU TRUÙC CT COÙ HAØM II. PHAÏM VI BIEÁN: TOØAN CUÏC, CUÏC BOÄ III. VIEÁT HAØM KHOÂNG THOÂNG SOÁ IV. VIEÁT HAØM COÙ THOÂNG SOÁ DAÏNG THAM TRÒ. V. VIEÁT HAØM COÙ THOÂNG SOÁ DAÏNG THAM BIEÁN.
E N D
CHÖÔNG 5 CHƯƠNG TRÌNH CON (HÀM)
CAÙC NOÄI DUNG ÑAÕ HOÏC I. KHAÙI NIEÄM - CAÁU TRUÙC CT COÙ HAØM II. PHAÏM VI BIEÁN: TOØAN CUÏC, CUÏC BOÄ III. VIEÁT HAØM KHOÂNG THOÂNG SOÁ IV. VIEÁT HAØM COÙ THOÂNG SOÁ DAÏNG THAM TRÒ. V. VIEÁT HAØM COÙ THOÂNG SOÁ DAÏNG THAM BIEÁN.
Nhaéc laïi: Thöïc thi CT goïi haøm int max() { int soLon; if (a>b) soLon=a; else soLon=b; return soLon; } int a,b; int max(); void main() { int kq; cout<<"Nhap a:"; cin>>a; cout<<"Nhap b:"; cin>>b; kq=max(); cout<<"So lon la "<<kq; getch(); }
IV. VIEÁT HAØM COÙ THOÂNG SOÁ DAÏNG THAM TRÒ. 1. Söï caàn thieát: • Bieán toøan cuïc laøm chöông trình khoù kieåm tra loãi vaø phaù vôõ tính ñoäc laäp cuûa caùc modun chöông trình (haøm). Neân söû duïng bieán cuïc boä vaø caùc haøm khaùc söû duïng thoâng qua thoâng soá. • Coù thoâng soá, haøm ñöôïc söû duïng linh ñoäng hôn.
2. Cuù phaùp ñònh nghóa haøm coù thoâng soá (tham soá - parameter) <kieåu> teân_haøm ( danh saùch thoâng soá ) { Caùc khai baùo bieán cuïc boä; Caùc caâu leänh caøi ñaët haøm; return keát_quaû; }
Trong ñoù: - Moãi thoâng soá laø 1 giaù trò caàn göûi cho haøm töø haøm goïi. - Danh saùch thoâng soá lieät keâ caùc thoâng soá cuûa haøm, moãi thoâng soá caùch nhau baèng daáu phaûy. - Moãi thoâng soá ñöôïc vieát theo cuù phaùp gioáng khai baùo moät bieán. Ví du 1ï: int KiemTraSoNguyenTo ( int n ); void GiaiPTB2 ( float a, float b, float c); int max3so( int a, int b, int c);
Ví duï 2: Vieát chöông trình giaûi vaø bieän luaän phöông trình baäc 1. void GiaiPTB1() { if (a!=0) cout<< "Nghiem x= "<<-b/a; else if (b!=0) cout<<"PT vo nghiem"; else cout<<"PT vs.nghiem"; } ==>loãi cuù phaùp vì khoâng coù a, b a. khoâng coù thoâng soá: void GiaiPTB1(); void main() { float a,b,x; cout<<"Nhaäp a : "; cin>>a; cout<<"Nhaäp b : "; cin>>b; GiaiPTB1(); getch(); } SYNTAX ERROR:
Ví duï 2: Vieát chöông trình giaûi vaø bieän luaän phöông trình baäc 1. b. Coù thoâng soá: void GiaiPTB1(float a, float b); void main() { float a,b; cout<<"Nhaäp a : "; cin>>a; cout<<"Nhaäp b : "; cin>>b; GiaiPTB1(a,b); getch(); } void GiaiPTB1(float a, float b) { if (a!=0) cout<< "Nghiem x= "<<-b/a; else if (b!=0) cout<<"PT vo nghiem"; else cout<<"PT vs.nghiem"; } a, b ñöôïc söû duïng nhö bieán cuïc boä Goïi haøm, truyeàn giaù trò cuûa a vaø b
3. Goïi haøm vaø truyeàn thoâng soá: • Gọi hàm: Một hàm khi định nghĩa thì chúng vẫn chưa được thực thi, hàm chỉ được thực thi khi trong chương trình có một lời gọi đến hàm đó. • Cú pháp gọi hàm: <Tên hàm>([Danh sách các thông số thực])
3. Goïi haøm vaø truyeàn thoâng soá: a. Thoâng soá hình thöùc vaø thoâng soá thöïc: • Thoâng soá hình thöùc (parameter, formal argument): Laø thoâng soá luùc ñònh nghóa haøm. • Thoâng soá thöïc (argument): Laø thoâng soá ñöa vaøo luùc goïi haøm. • Thoâng soá thöïc laø bieåu thöùc cuøng kieåu vôùi thoâng soá hình thöùc. ie. coù theå laø 1 giaù trò, 1 bieán, 1 haèng soá, 1 bieåu thöùc. • Thoâng soá ñöôïc truyeàn baèng trò.
Ví duï 1: void displayValue (int num) { cout<<“The value is ”<<num<<endl; } num laø thoâng soá hình thöùc (formal argument) cuûa haøm displayValue Khi goïi displayValue(5) thì 5 laø thoâng soá thöïc (argument).
Ví duï 2: • Giả sử prototype của hàm addition như sau: int addition(int a, int b); • Xét đọan chương trình gọi hàm int x=5, y=3, z;z = addition ( x , y ); • Các giá trị 5 and 3 được truyền cho hàm, không phải là bản thân các biến.
3. Goïi haøm vaø truyeàn thoâng soá: b. Nguyeân taéc truyeàn thoâng soá: • Ñuû soá löôïng. • Ñuùng thöù töï. • Töông hôïp kieåu. Löu yù: Teân cuûa thoâng soá hình thöùc khoâng quan troïng. Trong prototype coù theå boû ñi: void GiaiPTB1(float, float); int addition(int , int );
2 4 Ví duï 2: Caùc lôøi goïi haøm GiaiPTB1 void GiaiPTB1(float, float); void main() { float a,b; cout<<"Nhaäp a : "; cin>>a; //4 cout<<"Nhaäp b : "; cin>>b; //2 GiaiPTB1(a,b); } void GiaiPTB1(float a, float b) { if (a!=0) cout<< "Nghiem x= "<<-b/a; else if (b!=0) cout<<"PT vo nghiem"; else cout<<"PT vs.nghiem"; }
10 5 Ví duï 2: Caùc lôøi goïi haøm GiaiPTB1 void GiaiPTB1(float, float); void main() { float c,d; c=5; d=10; GiaiPTB1(c,d); getch(); } void GiaiPTB1(float a, float b) { if (a!=0) cout<< "Nghiem x= "<<-b/a; else if (b!=0) cout<<"PT vo nghiem"; else cout<<"PT vs.nghiem"; }
30 10 5 15 Ví duï 2: Caùc lôøi goïi haøm GiaiPTB1 void GiaiPTB1(float, float); void main() { float a,b,c,d; a=5; b=10; c=10; d=15; GiaiPTB1(a,b); GiaiPTB1(a+c, d*2); getch(); } void GiaiPTB1(float a, float b) { if (a!=0) cout<< "Nghiem x= "<<-b/a; else if (b!=0) cout<<"PT vo nghiem"; else cout<<"PT vs.nghiem"; }
Löu yù: • Khi đưa đối số vào cho tham số của hàm, đối số có thể được tự động thay đổi cho phù hợp trong trường hợp kiểu dữ liệu của đối số không phù hợp với kiểu dữ liệu của tham số. Ví dụ : void displayValue(int)//prototype Gọi : displayValue(4.7) //đối số thuộc real
4. Ñoái soá maëc ñònh • Đối số mặc định(default argument) dùng để chuyển tự động cho tham số khi đối số thực sự không xuất hiện trong hàm khi hàm được gọi • Đối số mặc định bắt buộc phải được khai báo liệt kê trong prototype của hàm và ghi trị mặc định. Ví dụ: void evenOrOdd(int = 0); void showArea(float = 20.0, float = 10.0) Hoặc void showArea(float length= 20.0, float width= 10.0)
4. Ñoái soá maëc ñònh • Nếu hàm không được khai báo prototype trước, vẫn có thể khai báo các đối số mặc định khi định nghĩa hàm. • Ví dụ: void showArea(float length= 20.0, float width= 10.0) { float area = length*width; cout<<“The area is ”<< area<<endl; }
4. Ñoái soá maëc ñònh #include<iostream.h> void displayStars(int=10, int=1); void main() { displayStars(); cout<<endl; displayStars(5); cout<<endl; displayStars(7,3); } void displayStars(int cols, int rows) { for (int down=0;down<rows;down++) { for (across=0;across<cols; across++) cout<<“*”; cout<<endl; } }
4. Ñoái soá maëc ñònh • Khi gọi hàm có đối số mặc định, nếu tham số đầu tiên đã không có mặt khi gọi thì các tham số sau cũng không được có mặt. Ví dụ : gọi hàm displayStars (,3)//thiếu đối số cols • Các hàm có sử dụng nhiều tham số, thì có thể một số tham số có đối số mặc định, một số khác thì không int getSum(int, int=0, int=0); • Các tham số không có đối số mặc định bắt buộc phải có giá trị khi hàm được gọi Gọi cout<<getSum(3); cout<<getSum();// SAI
4. Ñoái soá maëc ñònh • Trong hàm vừa có đối số không mặc định, vừa có đối số mặc định, thì bắt buộc các tham số có đối số mặc định phải được khai báo ở sau cùng. int getSum(int, int=0, int=0);// ĐÚNG int getSum(int, int=0, int); // SAI void displayStars(int =10, int)//SAI • Khi một đối số không xuất hiện khi hàm được gọi thì bắt buộc các đối số phía sau cũng không được xuất hiện sum = getSum(num1, num2); // ĐÚNG sum = getSum(num1, , num3); // SAI sum = getSum(num1); // ĐÚNG displayStars(,x);//SAI
5.Haøm khoâng laøm thay ñoåi giaù trò cuûa tham soá thöïc void A(int x) { cout<<"A duoc truyen gia tri "<<x; x= x+5; cout<<"A doi gia tri thong so thanh "<<x; } void main() { int x=5; A(x); cout<<"Tri cua x bay gio la "<<x; }
5.Haøm khoâng laøm thay ñoåi giaù trò cuûa tham soá thöïc • Keát luaän: - Moïi thay ñoåi giaù trò treân tham soá hình thöùc trò khoâng laøm thay ñoåi giaù trò cuûa tham soá thöïc. - Khi thöïc thi haøm, chæ coù giaù trò cuûa thoâng soá thöïc ñöôïc sao cheùp sang cho thoâng soá hình thöùc. - Tham trò chæ ñeå truyeàn giaù trò töø ngoaøi vaøo trong haøm.