Download as pdf or txt
Download as pdf or txt
You are on page 1of 8

Trường ĐH Công Nghệ Thông Tin – Khoa Công Nghệ Phần Mềm

Môn PPLTHĐT
Bài tập thực hành tuần 3 - Bài tập overloading

1. Làm lại bài số phức với một constructor duy nhất cho phép xem một số thực như
một số phức đặc biệt (phần ảo bằng 0). Định nghĩa các phép toán +, -, *, /, = =, !=,
>, >=, <, <= trên số phức. Định nghĩa phép toán << và >> để xuất và nhập dữ liệu
vào số phức.

Ghi chú :

• Constructor nêu trên nhận vào một số thực.

• So sánh hai số phức dựa trên giá trị module của nó.

• Nhập dữ liệu : Hiện thực các hàm nhập phần thực, phần ảo bên trong phương thức overload
toán tử.

• Xuất dữ liệu : Theo định dạng như sau, giả sử ta có 1 số phức a + bi :

o Nếu a = 0 thì chỉ xuất bi.

o Nếu b = 0 thì chỉ xuất a.

o Nếu b = 1 thì xuất a + i.

o Các TH còn lại xuất ra : a + bi.

2. Làm lại bài phân số với các phương thức thiết lập (constructor) cho phép sử dụng
một số nguyên như một phân số đặc biệt (phân số với mẫu số bằng 1). Định nghĩa
các phép toán +, -, *, /, = =, != , >, >=, <, <= trên phân số. Định nghĩa phép toán
<< và >> để xuất và nhập dữ liệu vào phân số.

Ghi chú :

• Sau khi thực hiện các phép tính (cộng, trừ, nhân, chia) trên phân số, kết quả trả về phải là 1
phân số và phải được rút gọn. In ra màn hình thông báo lỗi phù hợp khi thực hiện phép tính
không hợp lệ (ví dụ chia cho 0).

• Phân số luôn luôn tồn tại ở dạng tối giản, đồng thời phải hợp lệ (mẫu ≠ 0).

• Nhập dữ liệu :
Trường ĐH Công Nghệ Thông Tin – Khoa Công Nghệ Phần Mềm

o Hiện thực việc nhập tử số, mẫu số ngay bên trong phương thức Overload toán tử.

o Khi nhập phải kiểm tra phân số hợp lệ (mẫu ≠ 0), nếu không hợp lệ yêu cầu người
dùng nhập lại.

o Sau khi nhập phân số, bắt buộc phải rút gọn ngay để đưa về phân số tối giản.

𝑎𝑎
• Xuất dữ liệu : Theo định dạng như sau, giả sử ta có phân số :
𝑏𝑏

o Nếu a = 0 thì xuất ra màn hình : 0.

o Nếu b = 0 thì xuất ra màn hình : inf.

o Nếu b = 1 thì xuất ra màn hình : a.

o Các TH còn lại xuất ra màn hình : a/b.

3. Định nghĩa class CTimeSpan để biểu diễn khái niệm một khoảng thời gian, các
hàm thành phần và các phép toán (operator) cần thiết (+, -, ==, !=, >, >=, <, <=,
>>, <<).

Ghi chú :

• Một khoảng thời gian có thể là vài giây, vài phút, vài ngày (tối đa đến vài ngày).

o VD : 3 ngày 13 giờ 4 phút 2 giây là một khoảng thời gian.

• Một khoảng thời gian tồn tại ở dạng chuẩn, với khoảng thời gian đạt dạng chuẩn là khoảng
thời gian thoả mãn các tính chất sau :

o Các thành phần ngày, giờ, phút, giây là các số nguyên không âm.

o Thành phần giây có giá trị tối đa là 59.

o Thành phần phút có giá trị tối đa là 59.

o Thành phần giờ có giá trị tối đa là 23.

o Thành phần ngày không có giá trị tối đa.

• Phép toán thực hiện trên khoảng thời gian phải hợp lệ.

o Kết quả của phép toán phải được chuyển sang dạng chuẩn.

o In ra màn hình thông báo lỗi phù hợp nếu như phép toán không hợp lệ (ví dụ trừ đi
một khoảng thời gian lớn hơn khoảng thời gian hiện tại).
Trường ĐH Công Nghệ Thông Tin – Khoa Công Nghệ Phần Mềm

• Hai khoảng thời gian bằng nhau khi và chỉ khi các thành phần ngày, giờ, phút, giây của nó
bằng nhau.

• Nhập dữ liệu :

o Hiện thực việc nhập các thành phần của CTimeSpan ngay trong phương thức
overload operator.

o Kiểm tra các dữ liệu nhập vào, nếu không hợp lệ phải in ra màn hình thông báo lỗi
phù hợp và yêu cầu người dùng nhập lại (VD nhập vào số âm, số thập phân,…).

o Sau khi nhập dữ liệu vào, tự động chuyển qua dạng chuẩn.

• Xuất dữ liệu : Theo định dạng như sau, giả sử ta có khoảng thời gian a ngày b giờ c phút d
giây :

o Nếu a = 0 xuất ra màn hình : b giờ c phút d giây.

o Nếu a = 0, b = 0 xuất ra màn hình : c phút d giây.

o Nếu a = 0, b = 0, c = 0 xuất ra màn hình : d giây.

o Nếu a = 0, b = 0, c = 0, d = 0 xuất ra màn hình : 0 giây.

o Các TH khác xuất ra màn hình : a ngày b giờ c phút d giây.

4. Định nghĩa lớp CTime biểu diễn khái niệm thời điểm có các thành phần giờ, phút,
giây. Định nghĩa các phép toán +, - (cộng thêm, trừ bớt một số nguyên giây), -
(phép trừ hai CTime để được một CTimeSpan), ++, -- (thêm, bớt một giây). Phép
toán <<, >> để xuất, nhập dữ liệu loại CTime.

Ghi chú :

• Tất cả thời điểm CTime được định nghĩa đều cùng thuộc một ngày.

• Một thời điểm CTime phải tồn tại ở dạng chuẩn.

o Các thành phần giờ, phút, giây là các số nguyên không âm.

o Thành phần giờ có giới hạn tối đa là 23.

o Thành phần phút có giới hạn tối đa là 59.

o Thành phần giây có giới hạn tối đa là 59.

• Một thời điểm CTimeSpan phải tồn tại ở dạng chuẩn (đã được định nghĩa ở câu 4 trên).
Trường ĐH Công Nghệ Thông Tin – Khoa Công Nghệ Phần Mềm

• Phép toán thực hiện trên CTime phải hợp lệ.

o Phép cộng một số nguyên giây và phép toán ++ : Nếu kết quả trả ra vượt quá 24 giờ,
ta reset lại trở về thời điểm bắt đầu của ngày. VD nếu CTime là 23 giờ 59 phút 59
giây, cộng 2 giây sẽ trở thành 0 giờ 0 phút 1 giây.

o Phép trừ một số nguyên giây và phép toán -- : Nếu kết quả trả ra thấp hơn 0 giờ, ta
reset lại trở về thời điểm kết thúc của ngày. VD nếu CTime là 0 giờ 0 phút 1 giây, trừ
2 giây sẽ trở thành 23 giờ 59 phút 59 giây.

o Phép trừ hai CTime phải trả về một CTimeSpan hợp lệ. Một thời điểm sớm hơn không
được trừ cho một thời điểm trễ hơn. Nếu phép toán không hợp lệ, in ra màn hình
thông báo phép toán không thực hiện được vì không hợp lệ.

 VD : CTime a là 15 giờ 0 phút 0 giây, CTime b là 13 giờ 0 phút 0 giây. A –


B là hợp lệ, B – A là không hợp lệ.

• Nhập dữ liệu :

o Hiện thực việc nhập các thành phần của CTime trong phương thức overload operator
của nó.

o Kiểm tra dữ liệu nhập vào phải hợp lệ (dữ liệu nhập vào phải đạt dạng chuẩn). Nếu
không hợp lệ yêu cầu người dùng nhập lại.

• Xuất dữ liệu theo định dạng : a giờ b phút c giây.

5. Định nghĩa lớp CDate biểu diễn khái niệm ngày, tháng, năm với các phép toán +,
- (cộng, trừ thêm một số ngày), ++, -- (thêm bớt một ngày), - (khoảng cách giữa
hai CDate, tính bằng ngày). Phép toán <<, >> để xuất, nhập dữ liệu loại CDate.

Ghi chú :

• Một ngày CDate phải tồn tại ở dạng chuẩn.

o Các thành phần ngày, tháng, năm là các số nguyên không âm, lớn hơn 1.

o Thành phần ngày có giới hạn tối đa là 28,29,30 hoặc 31 (tuỳ vào tháng và năm
nhuận/không nhuận).

o Thành phần tháng có giới hạn tối đa là 12.

o Thành phần năm không có giới hạn tối đa.

• Phép toán thực hiện trên CDate phải hợp lệ.


Trường ĐH Công Nghệ Thông Tin – Khoa Công Nghệ Phần Mềm

o Phép cộng một số nguyên ngày và phép toán ++, phép trừ một số nguyên ngày và
phép toán -- : Sau khi thực hiện các phép toán trên phải chuyển CDate về dạng chuẩn.

o Phép trừ hai CDate phải trả về một số lượng ngày hợp lệ (số nguyên không âm). Một
ngày sớm hơn không được trừ cho một ngày trễ hơn. Nếu phép toán không hợp lệ, in
ra màn hình thông báo phép toán không thực hiện được vì không hợp lệ.

 VD : CDate a là Ngày 31 tháng 12 năm 2020, CTime b là Ngày 1 tháng 1


năm 2020. A – B là hợp lệ, B – A là không hợp lệ.

• Nhập dữ liệu :

o Hiện thực việc nhập các thành phần của CDate trong phương thức overload operator
của nó.

o Kiểm tra dữ liệu nhập vào phải hợp lệ (dữ liệu nhập vào phải đạt dạng chuẩn). Nếu
không hợp lệ yêu cầu người dùng nhập lại.

• Xuất dữ liệu theo định dạng : Ngày a tháng b năm c.

6. Hãy định nghĩa lớp CString biểu diễn khái niệm chuỗi ký tự với các phương thức
thiết lập (constructor), huỷ bỏ (destructor), overload các operator nhập xuất
(<<,>>) và các phép toán cần thiết (+, gán, so sánh hai chuỗi).

Ghi chú :

• Constructor cho phép tạo một chuỗi trực tiếp từ source code. VD CString(“A new String”).

• Phép + (concatenate) CString a và CString b : Nối b vào cuối a.

o VD : a = “123”, b = “456” thì a + b là “123456”. Ngược lại, b + a là “456123”.

• Phép gán a = b : Chép tất cả các ký tự của chuỗi b vào chuỗi a.

• So sánh 2 chuỗi : Hai chuỗi bằng nhau khi tất cả các ký tự của chuỗi đều bằng nhau.

7. Định nghĩa lớp biểu diễn khái niệm đa thức có bậc bất kỳ với các hàm thành phần
và phép toán cần thiết (+, -, ==, !=, <<,>>).

Ghi chú :

• Ở trong nội dung bài này, ta chỉ xét đa thức 1 biến.

• Các hằng số của đa thức là số thực.

• Nhập dữ liệu :
Trường ĐH Công Nghệ Thông Tin – Khoa Công Nghệ Phần Mềm

o Cho phép người dùng nhập dữ liệu trực tiếp trong phương thức overload của
operator >>.

• Xuất dữ liệu : Giả sử ta có đa thức 𝑎𝑎𝑥𝑥 2 + 𝑏𝑏𝑏𝑏 + 𝑐𝑐 (tương tự cho các bậc khác) :

o Xuất theo thứ tự bậc giảm dần, từ bậc lớn đến bậc bé đến hằng số.

o Nếu một đơn thức có hệ số bằng 0, ta không xuất đơn thức đó.

o Nếu một đơn thức có hệ số bằng 1 hoặc -1, ta xuất đơn thức nhưng không cần kèm
theo hệ số của đơn thức đó.

o Các TH còn lại, ta in ra màn hình : 𝑎𝑎𝑥𝑥 2 + 𝑏𝑏𝑏𝑏 + 𝑐𝑐.

8. Định nghĩa lớp CVector biểu diễn khái niệm vector trong không gian có số chiều
bất kỳ với các hàm thành phần và các phép toán cần thiết (<<,>>).

Định nghĩa lớp CMatrix biểu diễn khái niệm ma trận có kích thước bất kỳ với các
hàm thành phần và các phép toán cần thiết.
Viết hàm tính tích của một ma trận và một vector. Tích của hai ma trận.

9. Hãy định nghĩa lớp INTEGER là lớp bao (Wrapper class) của lớp int nguyên thuỷ
trong C++ (tìm hiểu thêm về các khái niệm wrapper class, boxing, autoboxing,
unboxing), với các phương thức và phép toán cần thiết (+, -, *, /, ==, !=, ++,--
<<,>>).

Ghi chú :

• Cách hoạt động của lớp INTEGER sau khi được implement sẽ giống hoàn toàn với cách hoạt
động của kiểu dữ liệu nguyên thuỷ int.

Đọc thêm :

• Kiểu dữ liệu nguyên thuỷ (primitive) là các kiểu dữ liệu nền tảng, cơ bản nhất cấu tạo nên
các kiểu dữ liệu phức tạp hơn và các class của chúng ta. Các kiểu dữ liệu nguyên thuỷ trong
C/C++ bao gồm : int, float, double, boolean, void, wchar, char,…

• Một lớp bao (Wrapper class) của một kiểu dữ liệu nguyên thuỷ cho phép thực hiện nhiều thao
tác hơn trên một kiểu dữ liệu nguyên thuỷ, mà đồng thời vẫn giữ nguyên tính chất của nó.
Điều đó giúp chúng ta tiện dụng hơn trong việc sử dụng các kiểu dữ liệu này.

• Ví dụ : Giả sử ta có một INTEGER a. Trong kiểu dữ liệu nguyên thuỷ int, ta không thể chuyển
trực tiếp giá trị của nó thành một chuỗi. Nhưng nếu ta khai báo kiểu dữ liệu INTEGER là lớp
Trường ĐH Công Nghệ Thông Tin – Khoa Công Nghệ Phần Mềm

bao của int, ta dễ dàng tạo thêm một phương thức toString(). Khi đó, ta chỉ việc gọi đến
phương thức trên (a.toString()) là có thể lấy được giá trị chuỗi của a.

10. Hãy định nghĩa lớp MYINT hoạt động tương tự kiểu dữ liệu 'int' nhưng phép cộng
hai MYINT hoạt động như phép trừ hai int và ngược lại.

11. Định nghĩa lớp CExpr để biểu diễn một biểu thức toán học ở dạng trung tố với các
phép toán thông dụng +, -, *, / và cho phép có dấu ngoặc. Có thể tham khảo cấu
trúc mẫu như sau :

class CExpr {
char *expr;
public:
CExpr();
CExpr(char *s);
~CExpr();
double eval();
//...
};
void main() {
CExpr("2 + 3 * 5 - (3 + (7 + 2) * 3) / 2");
cout << "Gia tri cua bieu thuc: " << expr->eval();
}

Ghi chú :

• CExpr có constructor nhận vào một chuỗi các ký tự char*.

• Trong nội bộ CExpr sẽ tiến hành xử lý (parse) chuỗi này thành các thành phần để thực hiện
lưu trữ và tính toán.

• Hàm eval() là hàm tính giá trị của biểu thức toán học được đưa vào trong Constructor.

Đọc thêm :

• Ký pháp tiền tố (ký pháp Ba Lan) : Đưa các toán tử lên trước các toán hạng (chẳng hạn a+b
là trung tố, +ab là tiền tố). https://vi.wikipedia.org/wiki/K%C3%AD_ph%C3%A1p_Ba_Lan

• Ký pháp Trung tố : Giống như cách viết biểu thức chúng ta thường sử dụng.

• Ký pháp Hậu tố : Nghịch đảo của ký pháp tiền tố (Reversed Polish Notation).
https://vi.wikipedia.org/wiki/Reverse_Polish_notation.

12. Cho đoạn chương trình sau:


#include <iostream.h>
main(){
Trường ĐH Công Nghệ Thông Tin – Khoa Công Nghệ Phần Mềm

cout << "Hello, world.\n";


}

Hãy sửa lại chương trình trên, nhưng không sửa chữa gì hàm main, để chương
trình có thể tạo ra kết xuất:
Entering the Hello program saying...
Hello, world.
Then exiting...

You might also like