Hàm, hàm bạn
6.1. Hàm có các tính chất sau:
+ Phạm vi 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 hạn chế là trong thân 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; // Toa do cua diem
public:
void nhapsl()
{
cout << " Toa do x, y: " ;
cin >> x >> y ;
}
void in()
{
cout << " x = " << x << " y = " << y;
}
};
Dùng lớp DIEM, ta xây dựng hàm tính độ dài của đ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, d1.y, d2.x, d2.y của các đối tượng d1 và d2 thuộc 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 do cua diem
public:
void nhapsl()
{
123 124
cout << " 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 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:
#include <conio.h>
#include <iostream.h>
#include <math.h>
class DIEM
{
private:
double x,y; // Toa do cua diem
public:
void nhapsl()
{
cout << " Toa do x, y: " ;
cin >> x >> y ;
}
125 126
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 << "\nNhap 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\nTam giac co dien tich lon nhat: " ;
cout << "\nDinh 1 - "; d[imax].in();
127 128
cout << "\nDinh 2 - "; d[jmax].in();
cout << "\nDinh 3 - "; d[kmax].in();
cout << "\nDien tich = " << dt_tg(d[imax],d[jmax],d[kmax]) ;
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ì từ 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 hàm có 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] và d[k] . ý tưởng này được thể hiện trong ví dụ
sau.
Ví dụ 2: Chương trình dùng mảng đối tượng ngoài.
Chú ý: Khai báo mảng đối tượng phải đặt sau định nghĩa kiểu đối tượng (định nghĩa lớp).
#include <conio.h>
#include <iostream.h>
#include <math.h>
double dt_tg(int i, int j, int k); // Khai báo hàm dt_tg
class DIEM
{
private:
double x,y; // Toa do cua diem
public:
void nhapsl();
void in();
double do_dai(DIEM d2);
} ;
// Chú ý: Khai báo mảng kiểu DIEM phải đặt sau định nghĩa
// lớp DIEM
DIEM d[50];
void DIEM::nhapsl()
{
cout << " Toa do x, y: " ;
cin >> x >> y ;
}
void DIEM::in()
{
cout << " x = " << x << " y = " << y;
}
double 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 << "\nNhap 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(i,j,k) > dt_tg(imax,jmax,kmax))
{
imax = i ;
jmax = j;
kmax = k;
}
cout << "\n\nTam giac co dien tich lon nhat: " ;
cout << "\nDinh 1 - "; d[imax].in();
cout << "\nDinh 2 - "; d[jmax].in();
cout << "\nDinh 3 - "; d[kmax].in();
cout << "\nDien tich = " << dt_tg(imax,jmax,kmax);
getch();
}
129 130