tut6 solution

12
TP.HCM Kỹ thuật lập trình 501127 – HK2/2011-2012 1 Ỹ UẬ LẬP Ì ài p 6 15 Lp, thao tác đối tượng và tính kế tha ài p bắ bộ: Bài 1. Cho class biu din sphc a + bi như sau: class Complex{ protected: float a,b; public: ... } Yêu cu: - To constructor khi tra = b = 0. - To hàm set giá tra, b. - Hin thc các operator =; +; -; *; /, ^(luỹ thừa) - Viết hàm tính magnitude - Viết các operator ==, !=, <=, >=, <, > da trên độ ln 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;

Upload: tran-van-nam

Post on 28-Jul-2015

118 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Tut6 solution

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;

Page 2: Tut6 solution

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;

}

Page 3: Tut6 solution

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.

Page 4: Tut6 solution

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;

}

Page 5: Tut6 solution

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;

Page 6: Tut6 solution

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 ++;

}

Page 7: Tut6 solution

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];

Page 8: Tut6 solution

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];

}

Page 9: Tut6 solution

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";

Page 10: Tut6 solution

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

Page 11: Tut6 solution

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

Page 12: Tut6 solution

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

-- ế -