Professional Documents
Culture Documents
BTTuan 3
BTTuan 3
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ú :
• 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ử.
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ố :
𝑏𝑏
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).
• 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.
• 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 :
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.
o Các thành phần giờ, phút, giây là các số nguyên không âm.
• 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
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ệ.
• 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.
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ú :
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 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ệ.
• 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.
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”).
• 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ú :
• 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 đó.
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ú :
• 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.
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...