Hàm có các tính chất sau:

Một phần của tài liệu Lập trinh C cơ bản (Trang 64 - 67)

Phạm vi hoạt động của hàm là toàn bộ chương trình,vì vậy hàm có thể được gọi tới từ bất kì chỗ nào. Như vậy trong các phương thức có thể sử dụng hàm

đối của hàm có thể là các đối tượng, tuy nhiên có một số hạn chế là trong than hàm không cho phép truy nhập tới thuộc tính của các đối này.Ví dụ giả sử đã định nghĩa lớp:

class DIEM {

private:

double x,y; //toạ độ cuẩ điểm public :

void nhapsl() {

cout<< « \n toa do x,y : « ; cin>>x>>y ; } void in() { cout<< « x= »<<x<< y= »<<y ; } } ;

Dùng lớp DIEM ta xây dựng 1 hàm tính độ dài đoạn thẳng đi qua 2 điểm như sau :

double do_dai(DIEM d1,DIEM d2) {

return sqrt(pow(d1.x-d2.x,2)+pow(d1.y-d2.y,2)) ; }

Hàm này sẽ bị báo lỗi khi dịch, vì trong thân hàm không cho phép sử dụng các thuộc tính d1.x,d2.x,d1.y,d2.y của các đối tượng d1,d2 của lớp DIEM

+ Phạm vi sử dụng của các phương thức (public) là toàn chương trình, vì vậy trong thân hàm có thể gọi tới các phương thức. Ví dụ : giả sử đã định nghĩa lớp :

class DIEM {

private :

double x,y ;// Toa độ của điểm public :

void nhapsl() {

cout<< »\n Toa do x,y : « ; cin>>x>>y ; } void in() { cout<< » x= « <<x<< » y= « <<y ; } double do_dai(DIEM d2) { return sqrt(pow(x-d2.x,2)+pow(y-d2.y,2)) ; } } ;

Khi đó bằng cách dùng phương thức do_dai,ta có thể viết hàm tính diện tích của tam giác có đỉnh là các đối tượng d1,d2,d3 của lớp DIEM như sau :

double dt_tg(DIEM d1,DIEM d2,DIEM d3) { double a,b,c,p,s ; a=d1.do_dai(d2) ; b=d2.do_dai(d3) ; c=d3.do_dai(d1) ; p=(a+b+c)/2 return sqrt(p*(p-a)*(p-b)*(p-c)) ; }

Bằng cách dùng hàm dt_tg có thể tổ chức lại chương trình tìm tam giác có diện tích lớn nhất(ở mục trên) một cách đơn giản hơn(bỏ đi lớp TAM_GIAC) như ví dụ sau :

Ví dụ 1 : Code: #include<conio.h> #include<iostream.h> #include<math.h> class DIEM { private :

double x,y ; //Toa do cua diem public :

void nhapsl() {

cout<< »\n Toa do x,y : « ; cin>>x>>y ; } void in() { cout<< » x= « <<x<< » y= « <<y ; } double do_dai(DIEM d2) { return sqrt(pow(x-d2.x,2)+pow(y-d2.y,2)) ; } } ;

double dt_tg(DIEM d1,DIEM d2,DIEM d3) {

double a,b,c,p,s ; a=d1.do_dai(d2) ;

b=d2.do_dai(d3) ; c=d3.do_dai(d1) ; p=(a+b+c)/2 ; return sqrt(p*(p-a)*(p-b)*(p-c)) ; } void main() { DIEM d[50] ; int n,i,j,k,imax,jmax,kmax ; clrscr() ; cout<< »\n so diem = « ; cin>>n ;

for(i=1 ;i<=n ;i++) {

cout<< »\n Nhap diem « <<i<< » : « ; d[i].nhapsl() ;

}

imax=1 ;jmax=2 ;kmax=3 ; for(i=1 ;i<=n-2 ;i++) for(j=i+1 ;j<=n-1 ;j++) for(k=j+1 ;k<=n ;k++) if(dt_tg(d[i],d[j],d[k])>dt_tg(d[imax],d[jmax],d[kmax]) { imax=i ; jmax=j ; kmax=k ; }

cout<< »\n tam giac co dien tich lon nhat : « ; cout<< »\n Dinh 1 : « ;d[imax].in() ;

cout<< »\n Dinh 2 : « ;d[jmax].in() ; cout<< »\n Dinh 3 : « ;d[kmax].in() ; getch() ;

}

Nhận xét : Chương trình trên làm việc trên mảng d kiểu DIEM. Bây giờ nếu ta dùng mảng ngoài thì số thứ tự sẽ suy ra phần tử của mảng. Như vậy hàm :

double dt_tg(DIEM d1,DIEM d2,DIEM d3) ;

có 3 đối kiểu DIEM có thể thay bằng 3 đối nguyên : double dt_tg(int i,int j,int k) ;

để tính diện tích tam giác có đỉnh là d[i],d[j],d[k]. Ý tưởng này được thực hiên trong ví dụ sau :

Code:

#include<iostream.h> #include<conio.h> #inlcude<math.h>

double dt_tg(int i,int j,int k) ; // Khai bao ham dt_tg class DIEM

{

private :

double x,y ; //Toa do cua diem public :

void nhapsl() ; void in() ;

} ;

// Khi khai bao mang kieu DIEM thi phai khai bao sau dinh nghia lop DIEM DIEM d[50] ;

void DIEM ::nhapsl() {

cout<< » toa do x,y : « ; cin>>x>>y ;

}

void DIEM ::in() {

cout<< » x= « << x<<» y= «<< ; }

void DIEM ::do_dai(DIEM d2) {

return sqrt(pow(x-d2.x,2)+pow(y-d2.y,2)) ; }

double dt_tg(int i,int j,int k) { double a,b,c,p,s ; a=d[i].do_dai(d[j]) ; b=d[j].do_dai(d[k]) ; c=d[k].do_dai(d[i]) ; p=(a+b+c)/2 ; return sqrt(p*(p-a)*(p-b)*(p-c)) ; } void main() { int n,i,j,k,imax,jmax,kmax ; clrscr() ; cout<< »\n So diem : « ; cin>>n ;

for(i=1 ;i<=n ;i++) {

cout<< »\n nhap diem thu « <<i<< » : » ; d[i].nhapsl() ;

}

imax=1 ;jmax=2 ;kmax=3 ; for(i=1 ;i<=n-2 ;i++)

for(j=i+1 ;j<=n-1 ;j++) for(k=j+1 ;k<=n ;k++) if(dt_tg(i,j,k)>dt_tg(imax,jmax,kmax)) { imax=i ; jmax=j ; kmax=k ; }

cout<< »\n tam giac co dien tich lon nhat la : « ; cout<< »\n dinh 1 : « ;d[imax].int() ;

cout<< »\n dinh 2 : « ;d[jmax].in() ; cout<< »\n dinh 3 : « ;d[kmax].in() ;

cout<< »\n voi dien tich la : « <<dt_tg(imax,jmax,kmax) ; getch() ;

}

Một phần của tài liệu Lập trinh C cơ bản (Trang 64 - 67)

Tải bản đầy đủ (DOC)

(91 trang)
w