SlideShare a Scribd company logo
TP.HCM 
Kỹ thuật lập trình 501127 – HK2/2011-2012 1 
Ỹ UẬ LẬP Ì 
ài p 6 – ầ 15 
Lớp, thao tác đối tượng và tính kế thừa 
ài p bắ b ộ : 
Bài 1. 
Cho class biểu diễn số phức a + bi như sau: 
class Complex{ 
protected: 
float a,b; 
public: 
... 
} 
Yêu cầu: 
- Tạo constructor khởi trị a = b = 0. 
- Tạo hàm set giá trị a, b. 
- Hiện thực các operator =; +; -; *; /, ^(luỹ thừa) 
- Viết hàm tính magnitude 
- Viết các operator ==, !=, <=, >=, <, > dựa trên độ lớn magnitude. 
- Viết hàm in ra số phức dạng x+iy 
class Complex{ 
protected: 
float a,b; 
public: 
Complex(); // constructor 
void set(float, float); //set a Complex 
void print(); // print a Complex 
void sva(Complex); // set value = Complex 
void add(Complex); // + Complex 
void sub(Complex); // - 
void mul(Complex); // * 
void div(Complex); // / 
void exp(int); // exponentiation 
float mag(); // |z| 
bool equ(Complex); // equal a Complex 
bool neq(Complex); // not equal 
bool leq(Complex); // less than or equal 
bool geq(Complex); // greater than or equal 
bool les(Complex); // less than 
bool gre(Complex); // greater than 
}; 
Complex::Complex(){ 
a=b=0;
TP.HCM 
Kỹ thuật lập trình 501127 – HK2/2011-2012 2 
} 
void Complex::set(float x, float y){ 
a=x; 
b=y; 
} 
void Complex::print(){ 
cout<<a<<"+i"<<b; 
} 
void Complex::sva(Complex c){ 
a=c.a; 
b=c.b; 
} 
void Complex::add(Complex c){ 
a+=c.a; 
b+=c.b; 
} 
void Complex::sub(Complex c){ 
a-=c.a; 
b-=c.b; 
} 
void Complex::mul(Complex c){ 
float t1,t2; 
t1 = a*c.a - b*c.b; 
t2 = a*c.b + c.a*b; 
a = t1; 
b = t2; 
} 
void Complex::div(Complex c){ 
if (c.a!=0&&c.b!=0){ 
float t1,t2; 
t1=(a*c.a+b*c.b)/(c.a*c.a+c.b*c.b); 
t2=(c.a*b-a*c.b)/(c.a*c.a+c.b*c.b); 
a = t1; 
b = t2; 
} 
} 
void Complex::exp(int n){ 
Complex c; 
c.set(a,b); 
for (int i=1;i<n;i++){ 
c.mul(c); 
} 
a=c.a; 
b=c.b; 
}
TP.HCM 
Kỹ thuật lập trình 501127 – HK2/2011-2012 3 
float Complex::mag(){ 
return sqrt(a*a+b*b); 
} 
bool Complex::equ(Complex c){ 
Complex c1; 
c1.set(a,b); 
return c1.mag()==c.mag(); 
} 
bool Complex::neq(Complex c){ 
Complex c1; 
c1.set(a,b); 
return c1.mag()!=c.mag(); 
} 
bool Complex::leq(Complex c){ 
Complex c1; 
c1.set(a,b); 
return c1.mag()<=c.mag(); 
} 
bool Complex::geq(Complex c){ 
Complex c1; 
c1.set(a,b); 
return c1.mag()>=c.mag(); 
} 
bool Complex::les(Complex c){ 
Complex c1; 
c1.set(a,b); 
return c1.mag()<c.mag(); 
} 
bool Complex::gre(Complex c){ 
Complex c1; 
c1.set(a,b); 
return c1.mag()>c.mag(); 
} 
Bài 2. 
Hiện thực lớp hình chữ nhật Rectangle theo các miêu tả về thuộc tính dữ liệu và hàm 
thành viên như sau: 
Có hai thuộc tính chiều dài (length) và chiều rộng (width). 
Định nghĩa hàm khởi tạo có hai thông số ứng với hai thông tin chiều dài và chiều rộng, 
giá trị mặc định cho hai thông số này lần lượt là 20 và 10. 
Định nghĩa thủ tục display để hiển thị các thuộc tính ra màn h.nh. 
Định nghĩa thủ tục getInfo để yêu cầu người dùng nhập các thông tin cho thuộc tính. 
Định nghĩa các thủ rục set để gán giá trị cho các thuộc tính. 
Định nghĩa các hàm get để truy xuất giá trị của các thuộc tính. 
Định nghĩa hàm area để tính diện tích của h.nh chữ nhật.
TP.HCM 
Kỹ thuật lập trình 501127 – HK2/2011-2012 4 
Hiện thực lớp hình hộp Box theo miêu tả sau: 
Thừa kế lớp Rectangle ở trên. 
Có thêm thuộc tính chiều sâu depth. 
Định nghĩa đè (override) các thủ tục display, getInfo và hàm area của lớp Rectangle. 
class Rectangle{ 
protected: 
float length,width; 
public: 
Rectangle(float=20,float=10); // instructor 
void display(); // print parameters of rectangle 
void getInfo(); // request for parameters 
void setL(float); // setup length 
void setW(float); // setup width 
float getL(); // get length 
float getW(); // get width 
float area(); // caculate area 
}; 
Rectangle::Rectangle(float l, float w){ 
length=l; 
width=w; 
} 
void Rectangle::display(){ 
cout<<"Length: "<<length<<" - Width: "<<width; 
} 
void Rectangle::getInfo(){ 
cout<<"Input length:"; 
cin>>length; 
cout<<"Input width:"; 
cin>>width; 
} 
void Rectangle::setL(float l){ 
length=l; 
} 
void Rectangle::setW(float w){ 
width=w; 
} 
float Rectangle::getL(){ 
return length; 
} 
float Rectangle::getW(){ 
return width; 
} 
float Rectangle::area(){ 
return length*width; 
}
TP.HCM 
Kỹ thuật lập trình 501127 – HK2/2011-2012 5 
class Box:Rectangle{ 
protected: 
float depth; 
public: 
void display(); // print parameters of rectangle 
void getInfo(); // request for parameters 
float area(); // caculate area 
}; 
void Box::display(){ 
cout<<"Length: "<<length<<" - Width: "<<width<<" - Depth: 
"<<depth; 
} 
void Box::getInfo(){ 
cout<<"Input length:"; 
cin>>length; 
cout<<"Input width:"; 
cin>>width; 
cout<<"Input depth:"; 
cin>>depth; 
} 
float Box::area(){ 
return 2*length*width+2*width*depth+2*depth*length; 
} 
Bài 3. 
Cho biết giá trị của *p, *q, m và n tương ứng với các dòng lệnh sau khi chương trình thực 
thi. Kiểm tra lại bằng chương trình. 
Ví dụ: 
int *p,*q, n; 
n = 1; //1 
p = &n; //2 
q = new int; //3 
*q = 2; //4 
delete q; //5 
Trả lời: 
Lệnh p *p q *q n 
1 Không xác định Không xác định Không xác định Không xác định 1 
2 xác định 1 Không xác định Không xác định 1 
3 xác định 1 xác định Không xác định 1 
4 xác định 1 xác định 2 1 
5 xác định 1 Không xác định Không xác định 1 
a) 
int *p, m, n;
TP.HCM 
Kỹ thuật lập trình 501127 – HK2/2011-2012 6 
n = 3; //1 
m = 2; //2 
p = &m; //3 
*p = n + 1; //4 
p = &n; //5 
*p = m + 1; //6 
Lệnh p *p m n 
1 Không xác định Không xác định Không xác định 3 
2 Không xác định Không xác định 2 3 
3 xác định 2 2 3 
4 xác định 4 4 3 
5 xác định 3 4 3 
6 xác định 5 4 5 
b) 
int *p, m, n; 
n = 1; //1 
m = 2; //2 
p = new int; //3 
*p = n + 1; //4 
p = &n; //5 
*p = m + 1; //6 
Lệnh p *p m n 
1 Không xác định Không xác định Không xác định 1 
2 Không xác định Không xác định 2 1 
3 xác định Không xác định 2 1 
4 xác định 2 2 1 
5 xác định 1 2 1 
6 xác định 3 2 3 
Bài p làm thêm 
Bài 4. Class Array quản lý mảng 2 chiều như sau. 
class Array{ 
protected: 
int m,n; 
int ** a; 
static int nAssignment ; 
static int nCopy; 
public: 
static int getNumberAss(){ 
return nAssignment; 
} 
static int getNumberCopy(); 
void operator=(const Array& arr){ 
Array::nAssignment ++; 
}
TP.HCM 
Kỹ thuật lập trình 501127 – HK2/2011-2012 7 
... 
} 
int Array::nAssignment = 0; 
... 
Yêu cầu: 
- Hiện thực constructor, destructor. 
- Hiện thực set/get M/N, và set/get 1 phần tử at(int m, int n, int value) 
- Hiện thực operator =/copy constructor. 
- 2 biến static dùng để lưu lại tổng số lần gọi các tác vụ operator= và copy constructor 
- Viết một chương trình sử dụng mảng bằng class Array. Khi kết thúc in ra màn hình số 
lần các hàm operator và copy constructor được chạy. 
#include<iostream> 
using namespace std; 
class Array{ 
protected: 
int m,n; 
int ** a; 
static int nAssignment ; 
static int nCopy; 
public: 
static int getNumberAss(){ 
return Array::nAssignment; 
} 
static int getNumberCopy(){ 
return Array::nCopy; 
} 
void operatorassign(){ 
Array::nAssignment ++; 
} 
void copyconstructor(){ 
Array::nCopy ++; 
} 
void print(){ 
for(int i=0;i<m;i++){ 
for(int j=0;j<n;j++){ 
cout<<a[i][j]<<"t"; 
} 
cout<<endl; 
} 
} 
Array(int m, int n, int initzero=1){ 
//constructor 
Array::m=m; 
Array::n=n; 
a=new int*[m];
TP.HCM 
Kỹ thuật lập trình 501127 – HK2/2011-2012 8 
for(int i=0;i<m;i++){ 
a[i]=new int[n]; 
if (initzero==1){ //khoi tao zero 
for(int j=0;j<n;j++){ 
a[i][j]=0; 
} 
}else{ //nhap tu ban phim 
for(int j=0;j<n;j++){ 
cout<<"Nhap gia tri phan tu 
["<<i+1<<"]["<<j+1<<"]:"; 
cin>>a[i][j]; 
} 
} 
} 
nAssignment=0; 
nCopy=0; 
} 
~Array(){ //destructor 
for(int i=0;i<m;i++){ 
delete []a[i]; 
} 
delete []a; 
} 
void setM(int m,int* arr){ 
for(int i=0;i<n;i++){ 
a[m][i]=arr[i]; 
} 
} 
void setN(int n,int* arr){ 
for(int i=0;i<m;i++){ 
a[i][n]=arr[i]; 
} 
} 
int* getM(int m){ 
int *arr=new int[n]; 
for(int i=0;i<n;i++){ 
arr[i]=a[m][i]; 
} 
return arr; 
} 
int* getN(int n){ 
int *arr=new int[m]; 
for(int i=0;i<m;i++){ 
arr[i]=a[i][n]; 
}
TP.HCM 
Kỹ thuật lập trình 501127 – HK2/2011-2012 9 
return arr; 
} 
void setat(int m,int n,int value){ 
a[m][n]=value; 
} 
int getat(int m,int n){ 
return a[m][n]; 
} 
void assignArray(Array &arr){ 
if(Array::m==arr.m&&Array::n==arr.n){ 
for(int i=0;i<m;i++) 
for(int j=0;j<n;j++) 
a[i][j]=arr.getat(i,j); 
Array::operatorassign(); 
} 
} 
void copytoArray(Array &arr){ 
if(Array::m==arr.m&&Array::n==arr.n){ 
for(int i=0;i<Array::m;i++) 
for(int j=0;j<Array::n;j++) 
arr.setat(i,j,a[i][j]); 
Array::copyconstructor(); 
} 
} 
}; 
int Array::nAssignment = 0; 
int Array::nCopy = 0; 
int main(){ 
cout<<"Nhap m,n:"; 
int m,n; 
cin>>m>>n; 
Array a(m,n,0); 
cout<<"Ma tran A:"<<endl; 
a.print(); 
Array b(m,n); 
Array c(m,n); 
cout<<"nMa tran B ban dau:n"; 
b.print(); 
a.copytoArray(b); 
cout<<"nMa tran B sau khi copy:n"; 
b.print(); 
cout<<"nMa tran C ban dau:n"; 
c.print(); 
c.assignArray(b); 
cout<<"nMa tran C sau khi gan:n";
TP.HCM 
Kỹ thuật lập trình 501127 – HK2/2011-2012 10 
c.print(); 
cout<<"Nhap hang M (M<m) va cot N (N<n) muon trich 
lay"; 
int M,N; 
cin>>M>>N; 
int *tM,*tN; 
tM=a.getM(M); 
tN=a.getN(N); 
cout<<"Hang M:n"; 
for(int i=0;i<n;i++) cout<<tM[i]<<" "; 
cout<<"nCot N:n"; 
for(int i=0;i<m;i++) cout<<tN[i]<<" "; 
delete tM; 
delete tN; 
cout<<"nSo lan goi ham assign: "<<a.getNumberAss()<<" 
- So lan goi ham copy: "<<a.getNumberCopy()<<endl; 
return 0; 
} 
Bài 5. 
Cho biết giá trị của *p, *q, m và n tương ứng với các dòng lệnh sau khi chương trình thực 
thi. Kiểm tra lại bằng chương trình. 
a) 
int *p, m, n; 
n = 1; //1 
m = 2; //2 
p = new int; //3 
n = *p; //4 
p = &m; //5 
n = *p + 1; //6 
Lệnh p *p m n 
1 Không xác định Không xác định Không xác định 1 
2 Không xác định Không xác định 2 1 
3 xác định Không xác định 2 1 
4 xác định Không xác định 2 Không xác định 
5 xác định 2 2 Không xác định 
6 xác định 2 2 3 
b) 
int *p, m, n; 
n = 1; //1 
m = 2; //2 
p = new int; //3 
*p = m + 1; //4 
delete p; //5 
n = *p + 1; //6
TP.HCM 
Kỹ thuật lập trình 501127 – HK2/2011-2012 11 
Lệnh p *p m n 
1 Không xác định Không xác định Không xác định 1 
2 Không xác định Không xác định 2 1 
3 xác định Không xác định 2 1 
4 xác định 3 2 1 
5 xác định 3 2 1 
6 xác định 3 2 4 
c) 
int *p, *q, n; 
n = 1; //1 
q = &n; //2 
p = new int; //3 
*p = n + 1; //4 
q = p; //5 
n = *q + 1; //6 
delete q; //7 
n = *p + 1; //8 
Lệnh p *p q *q n 
1 KXĐ KXĐ KXĐ KXĐ 1 
2 KXĐ KXĐ XĐ 1 1 
3 XĐ KXĐ XĐ 1 1 
4 XĐ 2 XĐ 1 1 
5 XĐ 2 XĐ 2 1 
6 XĐ 2 XĐ 2 3 
7 XĐ 2 XĐ 2 3 
8 XĐ 2 XĐ 2 3 
d) 
int *p, *q, n; 
n = 1; //1 
q = &n; //2 
p = q; //3 
*q = *p + 1; //4 
p = new int; //5 
q = p; //6 
*p = n; //7 
n = *q + 1; //8 
Lệnh p *p q *q n 
1 KXĐ KXĐ KXĐ KXĐ 1 
2 KXĐ KXĐ XĐ 1 1 
3 XĐ 1 XĐ 1 1 
4 XĐ 2 XĐ 2 2 
5 XĐ KXĐ XĐ 2 2 
6 XĐ KXĐ XĐ KXĐ 2 
7 XĐ 2 XĐ 2 2 
8 XĐ 2 XĐ 2 3
TP.HCM 
Kỹ thuật lập trình 501127 – HK2/2011-2012 12 
e) 
int *p, *q, n, m; 
n = 1; //1 
m = 2; //2 
p = &n; //3 
q = &m; //4 
n++; //5 
m--; //6 
p = q; //7 
q = &n; //8 
Lệnh p *p q *q m n 
1 KXĐ KXĐ KXĐ KXĐ KXĐ 1 
2 KXĐ KXĐ KXĐ KXĐ 2 1 
3 XĐ 1 KXĐ KXĐ 2 1 
4 XĐ 1 XĐ 2 2 1 
5 XĐ 2 XĐ 2 2 2 
6 XĐ 2 XĐ 1 1 2 
7 XĐ 1 XĐ 1 1 2 
8 XĐ 1 XĐ 2 1 2 
f) 
int *p, *q, n, m; 
p = new int; //1 
*p = 1; //2 
q = p; //3 
p = &m; //4 
m = *q; //5 
n = 1; //6 
delete q; //7 
m = *q + *p; //8 
Lệnh p *p q *q m n 
1 XĐ KXĐ KXĐ KXĐ KXĐ KXĐ 
2 XĐ 1 KXĐ KXĐ KXĐ KXĐ 
3 XĐ 1 XĐ 1 KXĐ KXĐ 
4 XĐ KXĐ XĐ 1 KXĐ KXĐ 
5 XĐ 1 XĐ 1 1 KXĐ 
6 XĐ 1 XĐ 1 1 1 
7 XĐ 1 XĐ KXĐ 1 1 
8 XĐ KXĐ XĐ KXĐ KXĐ 1 
-- ế -

More Related Content

What's hot

giao trinh c++ Chuong1
giao trinh c++ Chuong1giao trinh c++ Chuong1
giao trinh c++ Chuong1Bễ Nguyễn
 
Nmlt c05 cau_lenhlap
Nmlt c05 cau_lenhlapNmlt c05 cau_lenhlap
Nmlt c05 cau_lenhlap
Minh Ngoc Tran
 
Lap trinh c++ có lời giải 3
Lap trinh c++ có lời giải 3Lap trinh c++ có lời giải 3
Lap trinh c++ có lời giải 3Minh Ngoc Tran
 
C đến C++ phần 1
C đến C++ phần 1C đến C++ phần 1
C đến C++ phần 1
TechMaster Vietnam
 
Lap trinh c++ có lời giải 1
Lap trinh c++ có lời giải 1Lap trinh c++ có lời giải 1
Lap trinh c++ có lời giải 1Minh Ngoc Tran
 
Ctdl C05
Ctdl C05Ctdl C05
Ctdl C05giang
 
Nmlt c11 con_trocoban-
Nmlt c11 con_trocoban-Nmlt c11 con_trocoban-
Nmlt c11 con_trocoban-
Minh Ngoc Tran
 
Ctdl C01
Ctdl C01Ctdl C01
Ctdl C01giang
 
Nmlt c09 chuoi_kytu
Nmlt c09 chuoi_kytuNmlt c09 chuoi_kytu
Nmlt c09 chuoi_kytu
Minh Ngoc Tran
 
Lập trình c++ có lời giải 2
Lập trình c++ có lời giải 2Lập trình c++ có lời giải 2
Lập trình c++ có lời giải 2Minh Ngoc Tran
 
Nmlt c06 ham
Nmlt c06 hamNmlt c06 ham
Nmlt c06 ham
Minh Ngoc Tran
 
Nmlt c04 cau_lenhdieukienvarenhanh
Nmlt c04 cau_lenhdieukienvarenhanhNmlt c04 cau_lenhdieukienvarenhanh
Nmlt c04 cau_lenhdieukienvarenhanh
Minh Ngoc Tran
 
Basic C programming
Basic C programmingBasic C programming
Basic C programming
TechMaster Vietnam
 
Control structure in C
Control structure in CControl structure in C
Control structure in C
TechMaster Vietnam
 
Lap trinh huong_doi_tuong_cpp_dhct_lesson08
Lap trinh huong_doi_tuong_cpp_dhct_lesson08Lap trinh huong_doi_tuong_cpp_dhct_lesson08
Lap trinh huong_doi_tuong_cpp_dhct_lesson08xcode_esvn
 
Nmlt c16 ky_thuatlaptrinhdequy
Nmlt c16 ky_thuatlaptrinhdequyNmlt c16 ky_thuatlaptrinhdequy
Nmlt c16 ky_thuatlaptrinhdequy
Minh Ngoc Tran
 

What's hot (19)

Lab4
Lab4Lab4
Lab4
 
Bai de quy
Bai de quyBai de quy
Bai de quy
 
giao trinh c++ Chuong1
giao trinh c++ Chuong1giao trinh c++ Chuong1
giao trinh c++ Chuong1
 
Nmlt c05 cau_lenhlap
Nmlt c05 cau_lenhlapNmlt c05 cau_lenhlap
Nmlt c05 cau_lenhlap
 
Lap trinh c++ có lời giải 3
Lap trinh c++ có lời giải 3Lap trinh c++ có lời giải 3
Lap trinh c++ có lời giải 3
 
C đến C++ phần 1
C đến C++ phần 1C đến C++ phần 1
C đến C++ phần 1
 
Lap trinh c++ có lời giải 1
Lap trinh c++ có lời giải 1Lap trinh c++ có lời giải 1
Lap trinh c++ có lời giải 1
 
Ctdl C05
Ctdl C05Ctdl C05
Ctdl C05
 
Nmlt c11 con_trocoban-
Nmlt c11 con_trocoban-Nmlt c11 con_trocoban-
Nmlt c11 con_trocoban-
 
Ctdl C01
Ctdl C01Ctdl C01
Ctdl C01
 
Nmlt c09 chuoi_kytu
Nmlt c09 chuoi_kytuNmlt c09 chuoi_kytu
Nmlt c09 chuoi_kytu
 
Lập trình c++ có lời giải 2
Lập trình c++ có lời giải 2Lập trình c++ có lời giải 2
Lập trình c++ có lời giải 2
 
Nmlt c06 ham
Nmlt c06 hamNmlt c06 ham
Nmlt c06 ham
 
Nmlt c04 cau_lenhdieukienvarenhanh
Nmlt c04 cau_lenhdieukienvarenhanhNmlt c04 cau_lenhdieukienvarenhanh
Nmlt c04 cau_lenhdieukienvarenhanh
 
Chuong1 c
Chuong1 c Chuong1 c
Chuong1 c
 
Basic C programming
Basic C programmingBasic C programming
Basic C programming
 
Control structure in C
Control structure in CControl structure in C
Control structure in C
 
Lap trinh huong_doi_tuong_cpp_dhct_lesson08
Lap trinh huong_doi_tuong_cpp_dhct_lesson08Lap trinh huong_doi_tuong_cpp_dhct_lesson08
Lap trinh huong_doi_tuong_cpp_dhct_lesson08
 
Nmlt c16 ky_thuatlaptrinhdequy
Nmlt c16 ky_thuatlaptrinhdequyNmlt c16 ky_thuatlaptrinhdequy
Nmlt c16 ky_thuatlaptrinhdequy
 

Similar to Tut6 solution

Cq lt hdt-th2011-02-tuan04
Cq lt hdt-th2011-02-tuan04Cq lt hdt-th2011-02-tuan04
Cq lt hdt-th2011-02-tuan04. .
 
C10 generic algorithms
C10 generic algorithmsC10 generic algorithms
C10 generic algorithmsHồ Lợi
 
Nmlt c13 con_tronangcao_in
Nmlt c13 con_tronangcao_inNmlt c13 con_tronangcao_in
Nmlt c13 con_tronangcao_in
Huy Nguyễn
 
Sang tao4
Sang tao4Sang tao4
Sang tao4hieusui
 
Bai tap java
Bai tap javaBai tap java
Bai tap java
Phan van giap
 
Bài tập ôn lập trình
Bài tập ôn lập trìnhBài tập ôn lập trình
Bài tập ôn lập trình
Thai Hoc Vu
 
Powerpoint dạy hoc
Powerpoint dạy hocPowerpoint dạy hoc
Powerpoint dạy hocLong Tibbers
 
C8 object-oriented thinking
C8 object-oriented thinkingC8 object-oriented thinking
C8 object-oriented thinking
Tiến Quang Phan
 
C8 object-oriented thinking
C8 object-oriented thinkingC8 object-oriented thinking
C8 object-oriented thinkingHồ Lợi
 
C9 templates
C9 templatesC9 templates
C9 templates
Tiến Quang Phan
 
Lập trình hướng đối tượng - p3
Lập trình hướng đối tượng - p3Lập trình hướng đối tượng - p3
Lập trình hướng đối tượng - p3
Học viện đào tạo CNTT NIIT iNET
 
Lap trinh huong_doi_tuong_cpp_dhct_lesson07
Lap trinh huong_doi_tuong_cpp_dhct_lesson07Lap trinh huong_doi_tuong_cpp_dhct_lesson07
Lap trinh huong_doi_tuong_cpp_dhct_lesson07xcode_esvn
 
Chương Trình Con
Chương Trình Con Chương Trình Con
Chương Trình Con
Nguyễn Thiên Ý
 
Stl vector nguyen_trihai_11520094_khmt06
Stl vector nguyen_trihai_11520094_khmt06Stl vector nguyen_trihai_11520094_khmt06
Stl vector nguyen_trihai_11520094_khmt06
Quach Long
 
Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)
Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)
Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)Thanh Minh Hoang
 

Similar to Tut6 solution (20)

Lesson08
Lesson08Lesson08
Lesson08
 
Cq lt hdt-th2011-02-tuan04
Cq lt hdt-th2011-02-tuan04Cq lt hdt-th2011-02-tuan04
Cq lt hdt-th2011-02-tuan04
 
C10 generic algorithms
C10 generic algorithmsC10 generic algorithms
C10 generic algorithms
 
C10 generic algorithms
C10 generic algorithmsC10 generic algorithms
C10 generic algorithms
 
Nmlt c13 con_tronangcao_in
Nmlt c13 con_tronangcao_inNmlt c13 con_tronangcao_in
Nmlt c13 con_tronangcao_in
 
Lesson08
Lesson08Lesson08
Lesson08
 
Sang tao4
Sang tao4Sang tao4
Sang tao4
 
Bai tap oop c++
Bai tap oop c++Bai tap oop c++
Bai tap oop c++
 
Bai tap java
Bai tap javaBai tap java
Bai tap java
 
Bài tập ôn lập trình
Bài tập ôn lập trìnhBài tập ôn lập trình
Bài tập ôn lập trình
 
Powerpoint dạy hoc
Powerpoint dạy hocPowerpoint dạy hoc
Powerpoint dạy hoc
 
C8 object-oriented thinking
C8 object-oriented thinkingC8 object-oriented thinking
C8 object-oriented thinking
 
C8 object-oriented thinking
C8 object-oriented thinkingC8 object-oriented thinking
C8 object-oriented thinking
 
C9 templates
C9 templatesC9 templates
C9 templates
 
C9 templates
C9 templatesC9 templates
C9 templates
 
Lập trình hướng đối tượng - p3
Lập trình hướng đối tượng - p3Lập trình hướng đối tượng - p3
Lập trình hướng đối tượng - p3
 
Lap trinh huong_doi_tuong_cpp_dhct_lesson07
Lap trinh huong_doi_tuong_cpp_dhct_lesson07Lap trinh huong_doi_tuong_cpp_dhct_lesson07
Lap trinh huong_doi_tuong_cpp_dhct_lesson07
 
Chương Trình Con
Chương Trình Con Chương Trình Con
Chương Trình Con
 
Stl vector nguyen_trihai_11520094_khmt06
Stl vector nguyen_trihai_11520094_khmt06Stl vector nguyen_trihai_11520094_khmt06
Stl vector nguyen_trihai_11520094_khmt06
 
Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)
Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)
Một số vấn đề thường gặp trong lập trình - Đăng Bình Phương (ĐH KHTN)
 

More from Trần Văn Nam

Phan 2 chuong 8 (chuoi ky tu)
Phan 2   chuong 8 (chuoi ky tu)Phan 2   chuong 8 (chuoi ky tu)
Phan 2 chuong 8 (chuoi ky tu)Trần Văn Nam
 
Phan 2 chuong 9 (cau truc)
Phan 2   chuong 9 (cau truc)Phan 2   chuong 9 (cau truc)
Phan 2 chuong 9 (cau truc)Trần Văn Nam
 
Phan 2 chuong 10 (tap tin)
Phan 2   chuong 10 (tap tin)Phan 2   chuong 10 (tap tin)
Phan 2 chuong 10 (tap tin)Trần Văn Nam
 
Giáo trình cấu trúc dữ liệu và giải thuật phần 1 tài liệu, ebook, giáo trình
Giáo trình cấu trúc dữ liệu và giải thuật phần 1   tài liệu, ebook, giáo trìnhGiáo trình cấu trúc dữ liệu và giải thuật phần 1   tài liệu, ebook, giáo trình
Giáo trình cấu trúc dữ liệu và giải thuật phần 1 tài liệu, ebook, giáo trìnhTrần Văn Nam
 
Bg chuong trinh dich chuong 3
Bg chuong trinh dich chuong 3Bg chuong trinh dich chuong 3
Bg chuong trinh dich chuong 3Trần Văn Nam
 
Bài giảng ngôn ngữ lập trình c++ chương 7 ra vào dữ liệu tài liệu, ebook, ...
Bài giảng ngôn ngữ lập trình c++ chương 7  ra vào dữ liệu   tài liệu, ebook, ...Bài giảng ngôn ngữ lập trình c++ chương 7  ra vào dữ liệu   tài liệu, ebook, ...
Bài giảng ngôn ngữ lập trình c++ chương 7 ra vào dữ liệu tài liệu, ebook, ...Trần Văn Nam
 

More from Trần Văn Nam (19)

Pointer
PointerPointer
Pointer
 
Phan 2 chuong 8 (chuoi ky tu)
Phan 2   chuong 8 (chuoi ky tu)Phan 2   chuong 8 (chuoi ky tu)
Phan 2 chuong 8 (chuoi ky tu)
 
Phan 2 chuong 9 (cau truc)
Phan 2   chuong 9 (cau truc)Phan 2   chuong 9 (cau truc)
Phan 2 chuong 9 (cau truc)
 
Phan 2 chuong 10 (tap tin)
Phan 2   chuong 10 (tap tin)Phan 2   chuong 10 (tap tin)
Phan 2 chuong 10 (tap tin)
 
Lect09 string
Lect09 stringLect09 string
Lect09 string
 
Lect05 array
Lect05 arrayLect05 array
Lect05 array
 
Huong dan thao_tac_file
Huong dan thao_tac_fileHuong dan thao_tac_file
Huong dan thao_tac_file
 
Cam bien gia toc
Cam bien gia tocCam bien gia toc
Cam bien gia toc
 
Bai tap c
Bai tap cBai tap c
Bai tap c
 
Giáo trình cấu trúc dữ liệu và giải thuật phần 1 tài liệu, ebook, giáo trình
Giáo trình cấu trúc dữ liệu và giải thuật phần 1   tài liệu, ebook, giáo trìnhGiáo trình cấu trúc dữ liệu và giải thuật phần 1   tài liệu, ebook, giáo trình
Giáo trình cấu trúc dữ liệu và giải thuật phần 1 tài liệu, ebook, giáo trình
 
Ctdlgt
CtdlgtCtdlgt
Ctdlgt
 
Chuong 05
Chuong 05Chuong 05
Chuong 05
 
Bg chuong trinh dich chuong 3
Bg chuong trinh dich chuong 3Bg chuong trinh dich chuong 3
Bg chuong trinh dich chuong 3
 
Chapter07 io
Chapter07 ioChapter07 io
Chapter07 io
 
C++ 2011 april_draft
C++ 2011 april_draftC++ 2011 april_draft
C++ 2011 april_draft
 
Bài giảng ngôn ngữ lập trình c++ chương 7 ra vào dữ liệu tài liệu, ebook, ...
Bài giảng ngôn ngữ lập trình c++ chương 7  ra vào dữ liệu   tài liệu, ebook, ...Bài giảng ngôn ngữ lập trình c++ chương 7  ra vào dữ liệu   tài liệu, ebook, ...
Bài giảng ngôn ngữ lập trình c++ chương 7 ra vào dữ liệu tài liệu, ebook, ...
 
Tailieuvkt hk3
Tailieuvkt hk3Tailieuvkt hk3
Tailieuvkt hk3
 
Lenh tat auto_cad hk3
Lenh tat auto_cad hk3Lenh tat auto_cad hk3
Lenh tat auto_cad hk3
 
Nhung ad
Nhung adNhung ad
Nhung ad
 

Tut6 solution

  • 1. TP.HCM Kỹ thuật lập trình 501127 – HK2/2011-2012 1 Ỹ UẬ LẬP Ì ài p 6 – ầ 15 Lớp, thao tác đối tượng và tính kế thừa ài p bắ b ộ : Bài 1. Cho class biểu diễn số phức a + bi như sau: class Complex{ protected: float a,b; public: ... } Yêu cầu: - Tạo constructor khởi trị a = b = 0. - Tạo hàm set giá trị a, b. - Hiện thực các operator =; +; -; *; /, ^(luỹ thừa) - Viết hàm tính magnitude - Viết các operator ==, !=, <=, >=, <, > dựa trên độ lớn magnitude. - Viết hàm in ra số phức dạng x+iy class Complex{ protected: float a,b; public: Complex(); // constructor void set(float, float); //set a Complex void print(); // print a Complex void sva(Complex); // set value = Complex void add(Complex); // + Complex void sub(Complex); // - void mul(Complex); // * void div(Complex); // / void exp(int); // exponentiation float mag(); // |z| bool equ(Complex); // equal a Complex bool neq(Complex); // not equal bool leq(Complex); // less than or equal bool geq(Complex); // greater than or equal bool les(Complex); // less than bool gre(Complex); // greater than }; Complex::Complex(){ a=b=0;
  • 2. TP.HCM Kỹ thuật lập trình 501127 – HK2/2011-2012 2 } void Complex::set(float x, float y){ a=x; b=y; } void Complex::print(){ cout<<a<<"+i"<<b; } void Complex::sva(Complex c){ a=c.a; b=c.b; } void Complex::add(Complex c){ a+=c.a; b+=c.b; } void Complex::sub(Complex c){ a-=c.a; b-=c.b; } void Complex::mul(Complex c){ float t1,t2; t1 = a*c.a - b*c.b; t2 = a*c.b + c.a*b; a = t1; b = t2; } void Complex::div(Complex c){ if (c.a!=0&&c.b!=0){ float t1,t2; t1=(a*c.a+b*c.b)/(c.a*c.a+c.b*c.b); t2=(c.a*b-a*c.b)/(c.a*c.a+c.b*c.b); a = t1; b = t2; } } void Complex::exp(int n){ Complex c; c.set(a,b); for (int i=1;i<n;i++){ c.mul(c); } a=c.a; b=c.b; }
  • 3. TP.HCM Kỹ thuật lập trình 501127 – HK2/2011-2012 3 float Complex::mag(){ return sqrt(a*a+b*b); } bool Complex::equ(Complex c){ Complex c1; c1.set(a,b); return c1.mag()==c.mag(); } bool Complex::neq(Complex c){ Complex c1; c1.set(a,b); return c1.mag()!=c.mag(); } bool Complex::leq(Complex c){ Complex c1; c1.set(a,b); return c1.mag()<=c.mag(); } bool Complex::geq(Complex c){ Complex c1; c1.set(a,b); return c1.mag()>=c.mag(); } bool Complex::les(Complex c){ Complex c1; c1.set(a,b); return c1.mag()<c.mag(); } bool Complex::gre(Complex c){ Complex c1; c1.set(a,b); return c1.mag()>c.mag(); } Bài 2. Hiện thực lớp hình chữ nhật Rectangle theo các miêu tả về thuộc tính dữ liệu và hàm thành viên như sau: Có hai thuộc tính chiều dài (length) và chiều rộng (width). Định nghĩa hàm khởi tạo có hai thông số ứng với hai thông tin chiều dài và chiều rộng, giá trị mặc định cho hai thông số này lần lượt là 20 và 10. Định nghĩa thủ tục display để hiển thị các thuộc tính ra màn h.nh. Định nghĩa thủ tục getInfo để yêu cầu người dùng nhập các thông tin cho thuộc tính. Định nghĩa các thủ rục set để gán giá trị cho các thuộc tính. Định nghĩa các hàm get để truy xuất giá trị của các thuộc tính. Định nghĩa hàm area để tính diện tích của h.nh chữ nhật.
  • 4. TP.HCM Kỹ thuật lập trình 501127 – HK2/2011-2012 4 Hiện thực lớp hình hộp Box theo miêu tả sau: Thừa kế lớp Rectangle ở trên. Có thêm thuộc tính chiều sâu depth. Định nghĩa đè (override) các thủ tục display, getInfo và hàm area của lớp Rectangle. class Rectangle{ protected: float length,width; public: Rectangle(float=20,float=10); // instructor void display(); // print parameters of rectangle void getInfo(); // request for parameters void setL(float); // setup length void setW(float); // setup width float getL(); // get length float getW(); // get width float area(); // caculate area }; Rectangle::Rectangle(float l, float w){ length=l; width=w; } void Rectangle::display(){ cout<<"Length: "<<length<<" - Width: "<<width; } void Rectangle::getInfo(){ cout<<"Input length:"; cin>>length; cout<<"Input width:"; cin>>width; } void Rectangle::setL(float l){ length=l; } void Rectangle::setW(float w){ width=w; } float Rectangle::getL(){ return length; } float Rectangle::getW(){ return width; } float Rectangle::area(){ return length*width; }
  • 5. TP.HCM Kỹ thuật lập trình 501127 – HK2/2011-2012 5 class Box:Rectangle{ protected: float depth; public: void display(); // print parameters of rectangle void getInfo(); // request for parameters float area(); // caculate area }; void Box::display(){ cout<<"Length: "<<length<<" - Width: "<<width<<" - Depth: "<<depth; } void Box::getInfo(){ cout<<"Input length:"; cin>>length; cout<<"Input width:"; cin>>width; cout<<"Input depth:"; cin>>depth; } float Box::area(){ return 2*length*width+2*width*depth+2*depth*length; } Bài 3. Cho biết giá trị của *p, *q, m và n tương ứng với các dòng lệnh sau khi chương trình thực thi. Kiểm tra lại bằng chương trình. Ví dụ: int *p,*q, n; n = 1; //1 p = &n; //2 q = new int; //3 *q = 2; //4 delete q; //5 Trả lời: Lệnh p *p q *q n 1 Không xác định Không xác định Không xác định Không xác định 1 2 xác định 1 Không xác định Không xác định 1 3 xác định 1 xác định Không xác định 1 4 xác định 1 xác định 2 1 5 xác định 1 Không xác định Không xác định 1 a) int *p, m, n;
  • 6. TP.HCM Kỹ thuật lập trình 501127 – HK2/2011-2012 6 n = 3; //1 m = 2; //2 p = &m; //3 *p = n + 1; //4 p = &n; //5 *p = m + 1; //6 Lệnh p *p m n 1 Không xác định Không xác định Không xác định 3 2 Không xác định Không xác định 2 3 3 xác định 2 2 3 4 xác định 4 4 3 5 xác định 3 4 3 6 xác định 5 4 5 b) int *p, m, n; n = 1; //1 m = 2; //2 p = new int; //3 *p = n + 1; //4 p = &n; //5 *p = m + 1; //6 Lệnh p *p m n 1 Không xác định Không xác định Không xác định 1 2 Không xác định Không xác định 2 1 3 xác định Không xác định 2 1 4 xác định 2 2 1 5 xác định 1 2 1 6 xác định 3 2 3 Bài p làm thêm Bài 4. Class Array quản lý mảng 2 chiều như sau. class Array{ protected: int m,n; int ** a; static int nAssignment ; static int nCopy; public: static int getNumberAss(){ return nAssignment; } static int getNumberCopy(); void operator=(const Array& arr){ Array::nAssignment ++; }
  • 7. TP.HCM Kỹ thuật lập trình 501127 – HK2/2011-2012 7 ... } int Array::nAssignment = 0; ... Yêu cầu: - Hiện thực constructor, destructor. - Hiện thực set/get M/N, và set/get 1 phần tử at(int m, int n, int value) - Hiện thực operator =/copy constructor. - 2 biến static dùng để lưu lại tổng số lần gọi các tác vụ operator= và copy constructor - Viết một chương trình sử dụng mảng bằng class Array. Khi kết thúc in ra màn hình số lần các hàm operator và copy constructor được chạy. #include<iostream> using namespace std; class Array{ protected: int m,n; int ** a; static int nAssignment ; static int nCopy; public: static int getNumberAss(){ return Array::nAssignment; } static int getNumberCopy(){ return Array::nCopy; } void operatorassign(){ Array::nAssignment ++; } void copyconstructor(){ Array::nCopy ++; } void print(){ for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ cout<<a[i][j]<<"t"; } cout<<endl; } } Array(int m, int n, int initzero=1){ //constructor Array::m=m; Array::n=n; a=new int*[m];
  • 8. TP.HCM Kỹ thuật lập trình 501127 – HK2/2011-2012 8 for(int i=0;i<m;i++){ a[i]=new int[n]; if (initzero==1){ //khoi tao zero for(int j=0;j<n;j++){ a[i][j]=0; } }else{ //nhap tu ban phim for(int j=0;j<n;j++){ cout<<"Nhap gia tri phan tu ["<<i+1<<"]["<<j+1<<"]:"; cin>>a[i][j]; } } } nAssignment=0; nCopy=0; } ~Array(){ //destructor for(int i=0;i<m;i++){ delete []a[i]; } delete []a; } void setM(int m,int* arr){ for(int i=0;i<n;i++){ a[m][i]=arr[i]; } } void setN(int n,int* arr){ for(int i=0;i<m;i++){ a[i][n]=arr[i]; } } int* getM(int m){ int *arr=new int[n]; for(int i=0;i<n;i++){ arr[i]=a[m][i]; } return arr; } int* getN(int n){ int *arr=new int[m]; for(int i=0;i<m;i++){ arr[i]=a[i][n]; }
  • 9. TP.HCM Kỹ thuật lập trình 501127 – HK2/2011-2012 9 return arr; } void setat(int m,int n,int value){ a[m][n]=value; } int getat(int m,int n){ return a[m][n]; } void assignArray(Array &arr){ if(Array::m==arr.m&&Array::n==arr.n){ for(int i=0;i<m;i++) for(int j=0;j<n;j++) a[i][j]=arr.getat(i,j); Array::operatorassign(); } } void copytoArray(Array &arr){ if(Array::m==arr.m&&Array::n==arr.n){ for(int i=0;i<Array::m;i++) for(int j=0;j<Array::n;j++) arr.setat(i,j,a[i][j]); Array::copyconstructor(); } } }; int Array::nAssignment = 0; int Array::nCopy = 0; int main(){ cout<<"Nhap m,n:"; int m,n; cin>>m>>n; Array a(m,n,0); cout<<"Ma tran A:"<<endl; a.print(); Array b(m,n); Array c(m,n); cout<<"nMa tran B ban dau:n"; b.print(); a.copytoArray(b); cout<<"nMa tran B sau khi copy:n"; b.print(); cout<<"nMa tran C ban dau:n"; c.print(); c.assignArray(b); cout<<"nMa tran C sau khi gan:n";
  • 10. TP.HCM Kỹ thuật lập trình 501127 – HK2/2011-2012 10 c.print(); cout<<"Nhap hang M (M<m) va cot N (N<n) muon trich lay"; int M,N; cin>>M>>N; int *tM,*tN; tM=a.getM(M); tN=a.getN(N); cout<<"Hang M:n"; for(int i=0;i<n;i++) cout<<tM[i]<<" "; cout<<"nCot N:n"; for(int i=0;i<m;i++) cout<<tN[i]<<" "; delete tM; delete tN; cout<<"nSo lan goi ham assign: "<<a.getNumberAss()<<" - So lan goi ham copy: "<<a.getNumberCopy()<<endl; return 0; } Bài 5. Cho biết giá trị của *p, *q, m và n tương ứng với các dòng lệnh sau khi chương trình thực thi. Kiểm tra lại bằng chương trình. a) int *p, m, n; n = 1; //1 m = 2; //2 p = new int; //3 n = *p; //4 p = &m; //5 n = *p + 1; //6 Lệnh p *p m n 1 Không xác định Không xác định Không xác định 1 2 Không xác định Không xác định 2 1 3 xác định Không xác định 2 1 4 xác định Không xác định 2 Không xác định 5 xác định 2 2 Không xác định 6 xác định 2 2 3 b) int *p, m, n; n = 1; //1 m = 2; //2 p = new int; //3 *p = m + 1; //4 delete p; //5 n = *p + 1; //6
  • 11. TP.HCM Kỹ thuật lập trình 501127 – HK2/2011-2012 11 Lệnh p *p m n 1 Không xác định Không xác định Không xác định 1 2 Không xác định Không xác định 2 1 3 xác định Không xác định 2 1 4 xác định 3 2 1 5 xác định 3 2 1 6 xác định 3 2 4 c) int *p, *q, n; n = 1; //1 q = &n; //2 p = new int; //3 *p = n + 1; //4 q = p; //5 n = *q + 1; //6 delete q; //7 n = *p + 1; //8 Lệnh p *p q *q n 1 KXĐ KXĐ KXĐ KXĐ 1 2 KXĐ KXĐ XĐ 1 1 3 XĐ KXĐ XĐ 1 1 4 XĐ 2 XĐ 1 1 5 XĐ 2 XĐ 2 1 6 XĐ 2 XĐ 2 3 7 XĐ 2 XĐ 2 3 8 XĐ 2 XĐ 2 3 d) int *p, *q, n; n = 1; //1 q = &n; //2 p = q; //3 *q = *p + 1; //4 p = new int; //5 q = p; //6 *p = n; //7 n = *q + 1; //8 Lệnh p *p q *q n 1 KXĐ KXĐ KXĐ KXĐ 1 2 KXĐ KXĐ XĐ 1 1 3 XĐ 1 XĐ 1 1 4 XĐ 2 XĐ 2 2 5 XĐ KXĐ XĐ 2 2 6 XĐ KXĐ XĐ KXĐ 2 7 XĐ 2 XĐ 2 2 8 XĐ 2 XĐ 2 3
  • 12. TP.HCM Kỹ thuật lập trình 501127 – HK2/2011-2012 12 e) int *p, *q, n, m; n = 1; //1 m = 2; //2 p = &n; //3 q = &m; //4 n++; //5 m--; //6 p = q; //7 q = &n; //8 Lệnh p *p q *q m n 1 KXĐ KXĐ KXĐ KXĐ KXĐ 1 2 KXĐ KXĐ KXĐ KXĐ 2 1 3 XĐ 1 KXĐ KXĐ 2 1 4 XĐ 1 XĐ 2 2 1 5 XĐ 2 XĐ 2 2 2 6 XĐ 2 XĐ 1 1 2 7 XĐ 1 XĐ 1 1 2 8 XĐ 1 XĐ 2 1 2 f) int *p, *q, n, m; p = new int; //1 *p = 1; //2 q = p; //3 p = &m; //4 m = *q; //5 n = 1; //6 delete q; //7 m = *q + *p; //8 Lệnh p *p q *q m n 1 XĐ KXĐ KXĐ KXĐ KXĐ KXĐ 2 XĐ 1 KXĐ KXĐ KXĐ KXĐ 3 XĐ 1 XĐ 1 KXĐ KXĐ 4 XĐ KXĐ XĐ 1 KXĐ KXĐ 5 XĐ 1 XĐ 1 1 KXĐ 6 XĐ 1 XĐ 1 1 1 7 XĐ 1 XĐ KXĐ 1 1 8 XĐ KXĐ XĐ KXĐ KXĐ 1 -- ế -