Tải bản đầy đủ (.pdf) (12 trang)

Tut6 solution

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (316.88 KB, 12 trang )

TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCM
Khoa Khoa ho ̣c & Kỹ thuật Máy tính

KỸ THUẬT LẬP TRÌNH
Bài tập 6 – Tuần 15
Lớp, thao tác đối tượng và tính kế thừa
Bài tập bắt buộc:
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;

Kỹ thuật lập trình 501127 – HK2/2011-2012

1


TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCM
Khoa Khoa ho ̣c & Kỹ thuật Máy tính
}
void Complex::set(float x, float y){
a=x;
b=y;
}
void Complex::print(){
cout<}
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;ic.mul(c);
}
a=c.a;
b=c.b;
}
Kỹ thuật lập trình 501127 – HK2/2011-2012

2


TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCM
Khoa Khoa ho ̣c & Kỹ thuật Máy tính
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()}
bool Complex::gre(Complex c){
Complex c1;
c1.set(a,b);
return c1.mag()>c.mag();
}
Bài 2.
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:

Kỹ thuật lập trình 501127 – HK2/2011-2012


3


TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCM
Khoa Khoa ho ̣c & Kỹ thuật Máy tính
Lệnh
1
2
3
4
5

p
Không xác định
xác định
xác định
xác định
xác định

*p
Không xác định
1
1
1
1

q
Không xác định
Không xác định
xác định

xác định
Không xác định

*q
Không xác định
Không xác định
Không xác định
2
Không xác định

n
1
1
1
1
1

a)
int *p, m, n;
n = 3; //1
m = 2; //2
p = &m; //3
*p = n + 1; //4
p = &n; //5
*p = m + 1; //6
Lệnh
p
1
Không xác định
2

Không xác định
3
xác định
4
xác định
5
xác định
6
xác định

*p
Không xác định
Không xác định
2
4
3
5

m
Không xác định
2
2
4
4
4

n
3
3
3

3
3
5

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
1
Không xác định
2
Không xác định
3
xác định
4
xác định
5
xác định
6
xác định

*p
Không xác định
Không xác định
Không xác định

2
1
3

m
Không xác định
2
2
2
2
2

n
1
1
1
1
1
3

b)

Bài 3. Class Array quản lý mảng 2 chiều như sau.
class Array{
protected:
int m,n;
int ** a;

Kỹ thuật lập trình 501127 – HK2/2011-2012


4


TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCM
Khoa Khoa ho ̣c & Kỹ thuật Máy tính
static int nAssignment ;
static int nCopy;
public:
static int getNumberAss(){
return nAssignment;
}
static int getNumberCopy();
void operator=(const Array& arr){
Array::nAssignment ++;
}
...
}
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;ifor(int j=0;jcout<
Kỹ thuật lập trình 501127 – HK2/2011-2012

5


TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCM
Khoa Khoa ho ̣c & Kỹ thuật Máy tính
}

cout<}
}
Array(int m, int n, int initzero=1){
//constructor
Array::m=m;
Array::n=n;
a=new int*[m];
for(int i=0;ia[i]=new int[n];
if (initzero==1){
//khoi tao zero
for(int j=0;ja[i][j]=0;
}
}else{
//nhap tu ban phim
for(int j=0;jcout<<"Nhap gia tri phan tu
["<cin>>a[i][j];
}
}
}
nAssignment=0;
nCopy=0;
}
~Array(){
//destructor
for(int i=0;i

delete []a[i];
}
delete []a;
}
void setM(int m,int* arr){
for(int i=0;ia[m][i]=arr[i];
}
}
void setN(int n,int* arr){
for(int i=0;ia[i][n]=arr[i];
}
}
int* getM(int m){
int *arr=new int[n];
for(int i=0;iKỹ thuật lập trình 501127 – HK2/2011-2012

6


TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCM
Khoa Khoa ho ̣c & Kỹ thuật Máy tính
arr[i]=a[m][i];
}
return arr;
}
int* getN(int n){
int *arr=new int[m];

for(int i=0;iarr[i]=a[i][n];
}
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;ifor(int j=0;ja[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;ifor(int j=0;jarr.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:"<a.print();
Array b(m,n);
Array c(m,n);
Kỹ thuật lập trình 501127 – HK2/2011-2012

7


TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCM
Khoa Khoa ho ̣c & Kỹ thuật Máy tính
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";
c.print();
cout<<"Nhap hang M (Mlay";
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;icout<<"\nCot N:\n";
for(int i=0;idelete tM;
delete tN;
cout<<"\nSo lan goi ham assign: "<- So lan goi ham copy: "<return 0;
}
Bài tập làm thêm
Bài 4.
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.
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.
Kỹ thuật lập trình 501127 – HK2/2011-2012


8


TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCM
Khoa Khoa ho ̣c & Kỹ thuật Máy tính
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: "<}
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;
}
class Box:Rectangle{
protected:
float depth;
Kỹ thuật lập trình 501127 – HK2/2011-2012


9


TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCM
Khoa Khoa ho ̣c & Kỹ thuật Máy tính
public:
void display();
// print parameters of rectangle
void getInfo();
// request for parameters
float area();
// caculate area
};
void Box::display(){
cout<<"Length: "<"<}
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 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

Kỹ thuật lập trình 501127 – HK2/2011-2012

10


TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCM
Khoa Khoa ho ̣c & Kỹ thuật Máy tính
p = new int; //3
*p = m + 1; //4
delete p; //5
n = *p + 1; //6
Lệnh
p

1
Không xác định
2
Không xác định
3
xác định
4
xác định
5
xác định
6
xác định

*p
Không xác định
Không xác định
Không xác định
3
3
3

m
Không xác định
2
2
2
2
2

n

1
1
1
1
1
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
1
KXĐ
2
KXĐ
3

4

5

6


7

8

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
1
KXĐ
2
KXĐ
3

4


*p
KXĐ
KXĐ
KXĐ

2
2
2
2
2

q
KXĐ








*q
KXĐ
1
1
1
2
2
2
2

n
1
1
1

1
1
3
3
3

*p
KXĐ
KXĐ
1
2

q
KXĐ




*q
KXĐ
1
1
2

n
1
1
1
2


Kỹ thuật lập trình 501127 – HK2/2011-2012

11


TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCM
Khoa Khoa ho ̣c & Kỹ thuật Máy tính
5
6
7
8






KXĐ
KXĐ
2
2






2
KXĐ
2

2

2
2
2
3

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
1
KXĐ
KXĐ
2
KXĐ
KXĐ
3

1
4


1
5

2
6

2
7

1
8

1
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
1

KXĐ

2

1
3

1
4

KXĐ
5

1
6

1
7

1
8

KXĐ

q
KXĐ
KXĐ
KXĐ







*q
KXĐ
KXĐ
KXĐ
2
2
1
1
2

m
KXĐ
2
2
2
2
1
1
1

n
1
1
1
1
2
2
2

2

q
KXĐ
KXĐ







*q
KXĐ
KXĐ
1
1
1
1
KXĐ
KXĐ

m
KXĐ
KXĐ
KXĐ
KXĐ
1
1
1

KXĐ

n
KXĐ
KXĐ
KXĐ
KXĐ
KXĐ
1
1
1

-- Hết -

Kỹ thuật lập trình 501127 – HK2/2011-2012

12



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×