tut6 solution
TRANSCRIPT
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
-- ế -