Tác giả phạm hồng thái bài giảng ngôn ngữ LẬp trình c/C++



tải về 1.98 Mb.
trang50/55
Chuyển đổi dữ liệu07.07.2016
Kích1.98 Mb.
1   ...   47   48   49   50   51   52   53   54   55

Tên hàm toán tử


Gồm từ khoá operator và tên phép toán.

Ví dụ:


operator+(định nghĩa chồng phép +)

operator- (định nghĩa chồng phép -)


Các đối của hàm toán tử


Với các phép toán có 2 toán hạng thì hàm toán tử cần có 2 đối. Đối thứ nhất ứng với toán hạng thứ nhất, đối thứ hai ứng với toán hạng thứ hai. Do vậy, với các phép toán không giao hoán (phép -) thì thứ tự đối là rất quan trọng.

Ví dụ: Các hàm toán tử cộng, trừ phân số được khai báo như sau:

struct PS

{

int a; //Tử số



int b; // Mẫu số

};


PS operator+(PS p1, PS p2); // p1 + p2

PS operator-(PS p1 , PS p2); // p1 - p2

PS operator*(PS p1, PS p2); // p1 *p2

PS operator/(PS p1, PS p2); // p1/p2

Với các phép toán có một toán hạng, thì hàm toán tử có một đối. Ví dụ hàm toán tử đổi dấu ma trận (đổi dấu tất cả các phần tử của ma trận) được khai báo như sau:

struct MT

{

double a[20][20] ; // Mảng chứa các phần tử ma trận



int m ; // Số hàng ma trận

int n ; // Số cột ma trận

};

MT operator-(MT x) ;


Thân của hàm toán tử


Viết như thân của hàm thông thường. Ví dụ hàm đổi dấu ma trận có thể được định nghĩa như sau:

struct MT

{

double a[20][20] ; // Mảng chứa các phần tử ma trận



int m ; // Số hàng ma trận

int n ; // Số cột ma trận

};

MT operator-(MT x)



{

MT y;


for (int i=1 ;i<= y.m ; ++i)

for (int j =1 ;j<= y.n ; ++j)y.a[i][j] =- x.a[i][j];

return y;

}

Cách dùng hàm toán tử


Có 2 cách dùng:

Cách 1: Dùng như một hàm thông thường bằng cách viết lời gọi

Ví dụ:


PS p, q, u, v ;

u = operator+(p, q) ; // u = p + q

v = operator-(p, q) ; // v= p - q

Cách 2: Dùng như phép toán của C++

Ví dụ:


PS p, q, u, v ;

u = p + q ; // u = p + q

v = p - q ; //v = p - q

Chú ý: Khi dùng các hàm toán tử như phép toán của C++ ta có thể kết hơp nhiều phép toán để viết các công thức phức tạp. Cũng cho phép dùng dấu ngoặc tròn để quy định thứ tự thực hiện các phép tính. Thứ tự ưu tiên của các phép tính vẫn tuân theo các quy tắc ban đầu của C++. Chẳng hạn các phép * và / có thứ tự ưu tiên cao hơn so với các phép + và -

Các ví dụ về định nghĩa chồng toán tử


: Trong ví dụ này ngoài việc sử dụng các hàm toán tử để thực hiện 4 phép tính trên phân số, còn định nghĩa chồng các phép toán << và >> để xuất và nhập phân số.

Hàm operator<< có 2 đối kiểu ostream& và PS (Phân số). Hàm trả về giá trị kiểu ostream& và được khai báo như sau:

ostream& operator<< (ostream& os, PS p);

Tượng tự hàm operator>> được khai báo như sau:

istream& operator>> (istream& is,PS &p);

Dưới đây sẽ chỉ ra cách xây dựng và sử dụng các hàm toán tử.

Chúng ta cũng sẽ thấy việc sử dụng các hàm toán tử rất tự nhiên, ngắn gọn và tiện lợi.

#include

#include

#include

typedef struct

{

int a,b;



} PS;

ostream& operator<< (ostream& os, PS p);

istream& operator>> (istream& is,PS &p);

int uscln(int x, int y);

PS rutgon(PS p);

PS operator+(PS p1, PS p2);

PS operator-(PS p1, PS p2);

PS operator*(PS p1, PS p2);

PS operator/(PS p1, PS p2);

ostream& operator<< (ostream& os, PS p)

{

os << p.a << '/' << p.b ;



return os;

}

istream& operator>> (istream& is,PS &p)



{

cout << "\n Nhap tu va mau: '' ;

is >> p.a >> p.b ;

return is;

}

int uscln(int x, int y)



{

x=abs(x);y=abs(y);

if (x*y==0) return 1;

while (x!=y)

{

if (x>y) x-=y;



else y-=x;

}

return x;



}

PS rutgon(PS p)

{

PS q;


int x;

x=uscln(p.a,p.b);

q.a = p.a / x ;

q.b = p.b/ x ;

return q;

}

PS operator+(PS p1, PS p2)



{

PS q;


q.a = p1.a*p2.b + p2.a*p1.b;

q.b = p1 .b * p2.b ;

return rutgon(q);

}

PS operator-(PS p1, PS p2)



{

PS q;


q.a = p1.a*p2.b - p2.a*p1 .b;

q.b = p1.b * p2.b ;

return rutgon(q);

}

PS operator*(PS p1, PS p2)



{

PS q;


q.a = p1.a * p2.a ;

q.b = p1.b * p2.b ;

return rutgon(q);

}

PS operator/(PS p1 , PS p2)



{

PS q;


q.a = p1.a * p2.b ;

q.b = p1.b * p2.a ;

return rutgon(q);

}

void main()



{

PS p, q, z, u, v ;

PS s;

cout <<"\nNhap cac PS p, q, z, u, v: '' ;



cin >> p >> q >> z >> u >> v ;

s = (p - q*z) / (u + v) ;

cout << "\n Phan so s = " << s;

getch();

}

: Chương trình đưa vào các hàm toán tử:



operator- có một đối dùng để đảo dấu một đa thức

operator+ có 2 đối dùng để cộng 2 đa thức

operator- có 2 đối dùng để trừ 2 đa thức

operator* có 2 đối dùng để nhân 2 đa thức

operator^có 2 đối dùng để tính giá đa thức tại x

ơperator<< có 2 đối dùng để in đa thức

ơperator>> có 2 đối dùng để nhập đa thức

Chương trình sẽ nhập 4 đa thức: p, q, r, s. Sau đó tính đa thức: f = -(p+q)*(r-s)

Cuối cùng tính giá trị f(x), với x là một số thực nhập từ bàn phím.

#include

#include

#include

struct DT

{

double a[20];// Mang chua cac he so da thuc a0, a1,...



int n ;// Bac da thuc

};


ostream& operator<< (ostream& os, DT d);

istream& operator>> (istream& is, DT &d);

DT operator-(const DT& d);

DT operator+(DT d1, DT d2);

DT operator-(DT d1, DT d2);

DT operator*(DT d1, DT d2);

double operator^(DT d, double x);// Tinh gia tri da thuc

ostream& operator<< (ostream& os, DT d)

{

os << " Cac he so (tu ao): '' ;



for (int i=0 ;i<= d.n ;++i)

os << d.a[i] <<" " ;

return os;

}

istream& operator>> (istream& is, DT &d)



{

cout << " Bac da thuc: '' ;

cin >> d.n;

cout << ''Nhap cac he so da thuc:" ;

for (int i=0 ;i<=d.n ;++i)

{

cout << "\n He so bac " << i <<" = '' ;



is >> d.a[i] ;

}

return is;



}

DT operator-(const DT& d)

{

DT p;


p.n = d.n;

for (int i=0 ;i<=d.n ;++i)

p.a[i] = -d.a[i];

return p;

}

DT operator+(DT d1, DT d2)



{

DT d;


int k,i;

k = d1.n > d2.n ? d1.n : d2.n ;

for (i=0;i<=k ;++i)

if (i<=d1.n && i<=d2.n) d.a[i] = d1.a[i] + d2.a[i];

else if (i<=d1.n) d.a[i] = d1.a[i];

else d.a[i] = d2.a[i];

i = k;

while (i>0 && d.a[i]==0.0) --i;



d.n=i;

return d ;

}

DT operator-(DT d1, DT d2)



{

return (d1 + (-d2));

}

DT operator*(DT d1 , DT d2)



{

DT d;


int k, i, j;

k = d.n = d1.n + d2.n ;

for (i=0;i<=k;++i) d.a[i] = 0;

for (i=0 ;i<= d1 .n ;++i)

for (j=0 ;j<= d2.n ;++j)

d.a[i+j] += d1 .a[i]*d2.a[j];

return d;

}

double operator^(DT d, double x)



{

double s=0.0 , t=1.0;

for (int i=0 ;i<= d.n ;++i)

{

s += d.a[i]*t;



t *= x;

}

return s;



}

void main()

{

DT p,q,r,s,f;



double x,g;

clrscr();

cout <<"\n Nhap da thuc P '' ;cin >> p;

cout <<"\n Nhap da thuc Q '' ;cin >> q;

cout <<"\n Nhap da thuc R '' ;cin >> r;

cout <<"\n Nhap da thuc S '' ;cin >> s;

cout << "\n Nhap so thuc x: '' ;cin >> x;

f = -(p+q)*(r-s);

g = f^x;

cout << "\n Da thuc f "<< f ;

cout << "\n x = '' << x;

cout << "\n f(x) = '' << g;

getch();

}
CHƯƠNG 9



CÁC DÒNG NHẬP/XUẤT VÀ FILE

Nhập/xuất với cin/cout

Định dạng

In ra máy in

Làm việc với File

Nhập/xuất nhị phân


Trong C++ có sẵn một số lớp chuẩn chứa dữ liệu và các phương thức phục vụ cho các thao tác nhập/xuất dữ liệu của NSD, thường được gọi chung là stream (dòng). Trong số các lớp này, lớp có tên ios là lớp cơ sở, chứa các thuộc tính để định dạng việc nhập/xuất và kiểm tra lỗi. Mở rộng (kế thừa) lớp này có các lớp istream, ostream cung cấp thêm các toán tử nhập/xuất như >>, << và các hàm get, getline, read, ignore, put, write, flush … Một lớp rộng hơn có tên iostream là tổng hợp của 2 lớp trên. Bốn lớp nhập/xuất cơ bản này được khai báo trong các file tiêu đề có tên tương ứng (với đuôi *.h). Sơ đồ thừa kế của 4 lớp trên được thể hiện qua hình vẽ dưới đây.


ios



istream



ostream



iostream



Đối tượng của các lớp trên được gọi là các dòng dữ liệu. Một số đối tượng thuộc lớp iostream đã được khai báo sẵn (chuẩn) và được gắn với những thiết bị nhập/xuất cố định như các đối tượng cin, cout, cerr, clog gắn với bàn phím (cin) và màn hình (cout, cerr, clog). Điều này có nghĩa các toán tử >>, << và các hàm kể trên khi làm việc với các đối tượng này sẽ cho phép NSD nhập dữ liệu thông qua bàn phím hoặc xuất kết quả thông qua màn hình.

Để nhập/xuất thông qua các thiết bị khác (như máy in, file trên đĩa …), C++ cung cấp thêm các lớp ifstream, ofstream, fstream cho phép NSD khai báo các đối tượng mới gắn với thiết bị và từ đó nhập/xuất thông qua các thiết bị này.

Trong chương này, chúng ta sẽ xét các đối tượng chuẩn cin, cout và một số toán tử, hàm nhập xuất đặc trưng của lớp iostream cũng như cách tạo và sử dụng các đối tượng thuộc các lớp ifstream, ofstream, fstream để làm việc với các thiết bị như máy in và file trên đĩa.


1   ...   47   48   49   50   51   52   53   54   55


Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2016
được sử dụng cho việc quản lý

    Quê hương