môn lập trình hướng đối tượng bài tập thực hành x

37 0 0
Tài liệu đã được kiểm tra trùng lặp
môn lập trình hướng đối tượng bài tập thực hành x

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNGNỘI DUNG BÀI LÀMBài tập 1: Xây dựng lớp ngày tháng năm bao gồm:• Thuộc tính: iNgay, iThang, iNam• Phương thức: Nhap, Xuat, NgayThangNamTiepTheoYêu cầu: T

Trang 1

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINHTRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN

Trang 2

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN

Trang 3

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

Trang 4

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

B)Xuat() 36C)TinhCongThemMotGiay() 37

Trang 5

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

NỘI DUNG BÀI LÀM

Bài tập 1: Xây dựng lớp ngày tháng năm bao gồm:• Thuộc tính: iNgay, iThang, iNam

• Phương thức: Nhap(), Xuat(), NgayThangNamTiepTheo()

Yêu cầu: Thực hiện xây dựng lớp, vẽ class diagram và khai báo các thuộctính, phương thức Viết nội dung vào các phương thức đã khai báo Gọi cácphương thức trong hàm main().

Diagram của lớp NgayThangNam:

Hình 1: Diagram của lớp NgayThangNamCode của lớp NgayThangNam:

intiNgay iThang iNam,,;public:

Trang 6

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

while(iNgay>31||iThang>12){cout<<"Nhap lai: "<< endl;

while(iNgay>28&&iThang==2&&(iNam% != ||4 0(iNam%100==0&&iNam%4

cout<<"Nhap lai: "<< endl;cin>>iNgay>>iThang>>iNam;}

cout<<"Nhap lai: "<< endl;cin>>iNgay>>iThang>>iNam;}

cout<< setw(2)<< setfill('0')<<iNgay<<"/"<< setw(2)<<setfill('0')<<iThang<<"/"<<iNam<< endl;

set<int>se={1,3,5,7,8,10 12,};if(iThang!=2&&se.find(iThang)!=se.end()) {

if(iNgay==31&&iThang==12) {iNam++;

if(iNgay==31) {iThang++;iNgay=1;return;}elseiNgay++;}

if(iThang!=2&&se.find(iThang)==se.end()) {if(iNgay==30) {

if(iThang==2) {

ifiNgay==29&&(iNam%4==0&&iNam%100!=0))) {iThang++;

else if(iNgay==28&&iNam%400==0){iThang++;

else if((iNgay==28&& !(iNam%4==0&&iNam%100!=0))) {iThang++;

iNgay=1;return;}elseiNgay++;}

Trang 7

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG}

Phương thức của lớp NgayThangNam:+Nhap():

Hình 2: Mô tả phương thức nhập+ Vòng lặp đầu tiên: Kiểm tra ngày trong tháng 2.Nếu ngày lớn hơn 29 (và tháng là 2), yêu cầu nhập lại.+ Vòng lặp thứ hai: Kiểm tra ngày và tháng.

Nếu ngày lớn hơn 31 hoặc tháng lớn hơn 12, yêu cầu nhập lại.+ Vòng lặp thứ ba: Kiểm tra ngày trong tháng 2 cho năm nhuận.

Nếu ngày lớn hơn 28, tháng là 2 và năm không nhuận (hoặc năm chia hếtcho 100 và chia hết cho 4), yêu cầu nhập lại.

+ Vòng lặp thứ tư: Kiểm tra ngày trong các tháng có 30 ngày.Nếu ngày lớn hơn 30 và tháng là 2, 4, 6, hoặc 8, yêu cầu nhập lại.

Trang 8

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

Hình 3: Mô tả hàm xuất

+ Hàm Xuat() sử dụng cout để xuất ngày, tháng, năm theo thứ tự.

+ Hàm sử dụng setw(2) và setfill('0') để định dạng ngày, tháng có 2 chữ số.- setw(2): Đặt độ rộng của trường xuất là 2 ký tự.

- setfill('0'): Ký tự '0' được sử dụng để lấp đầy các khoảng trống nếungày, tháng có 1 chữ số.

- Hàm NgayThangNamTiepTheo() có chức năng tính toán ngày tháng tiếptheo dựa trên ngày tháng hiện tại Hàm sử dụng các biến iNgay, iThang,iNam để biểu diễn ngày, tháng, năm.

2 Thuật toán:

Hàm hoạt động dựa trên thuật toán sau:

Xác định trường hợp:

Tháng không phải tháng 2 và các tháng có 31 ngày:

- Ta sẽ sử dụng vector để lưu các tháng có 31 ngày và sử dụng hàmfind để tìm các tháng đó so sánh với iThang.

- Nếu ngày bằng 31 và tháng bằng 12, tăng năm, đặt lại ngày vàtháng thành 1.

- Nếu ngày bằng 31, tăng tháng và đặt lại ngày thành 1.- Nếu ngày chưa bằng 31, tăng ngày.

Trang 9

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

Hình 4: Mô tả thuật toán tính Ngày Tháng Năm tiếp theo trongtrường hợp tháng khác 2

Tháng 2:

Hình 5: Mô tả thuật toán tính Ngày Tháng Năm tiếp theo trongtrường hợp tháng bằng 2

Trang 10

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

- Nếu ngày bằng 29 và năm nhuận, tăng tháng và đặt lại ngày thành 1.- Nếu ngày bằng 28 và năm nhuận hoặc năm chia hết cho 400, tăng thángvà đặt lại ngày thành 1.

- Nếu ngày bằng 28 và năm không nhuận, tăng tháng và đặt lại ngày thành1.

- Nếu ngày chưa bằng 28, tăng ngày.3 Xử lý chi tiết:

Trang 11

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

Xử lý năm nhuận:

Sử dụng thuật toán kiểm tra năm nhuận:

Hình 7: Các thuật toán kiểm tra năm nhuận

Năm chia hết cho 4 là năm nhuận, trừ các năm chia hết cho 100 nhưngkhông chia hết cho 400.

Kiểm tra năm hiện tại có phải năm nhuận hay không.+ Sử dụng toán tử % để kiểm tra chia hết.

- Kiểm tra điều kiện theo thứ tự:Chia hết cho 400: Là năm nhuận.Chia hết cho 100: Không phải năm nhuận.Chia hết cho 4: Là năm nhuận.

Nếu không thỏa mãn bất kỳ điều kiện nào, năm đó không phải là nămnhuận.

Trang 12

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

Ngày tháng hiện tại: 31/12/2023iNgay bằng 31 và iThang bằng 12.

Do đó, iNam được tăng lên 2024, iNgay và iThang được đặt lại thành 1.Ngày tháng tiếp theo: 01/01/2024

Hình 8.2: Đầu ra của trường hợp ví dụNgày tháng hiện tại: 28/02/2024

iNgay bằng 28 và iThang bằng 2.Năm 2024 là năm nhuận.Do đó, iNgay được tăng lên 29.Ngày tháng tiếp theo: 29/02/2024

Hình 8.3: Đầu ra của trường hợp ví dụ- Năm 2023:

Tháng 2 chỉ có 28 ngày.

Sau ngày 28/02/2023, ngày tiếp theo là 01/03/2023.

Hình 8.4: Đầu ra của trường hợp ví dụ

Bài tập 2: Xây dựng lớp phân số:• Thuộc tính: iTu, iMau

• Phương thức: Nhap(), Xuat(), RutGon(), Tong(), Hieu(), Tich(), Thuong(),SoSanh()

Trang 13

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

Yêu cầu: Thực hiện xây dựng lớp, vẽ class diagram và khai báo cácthuộc tính, phương thức Viết nội dung vào các phương thức đã khaibáo Gọi các phương thức trong hàm main().

Diagram của lớp PhanSo

Code của lớp PhanSo:

#include<bits/stdc++.h>usingnamespacestd;#definell long longint gcd(inta,intb){

if(b==0)returna;return gcd( ,b a b%);}

int lcm(inta,intb){return(a*)/ gcd( , );a b

private:intiTu iMau,;public:

voidNhap();voidXuat();voidRutGon();

Trang 14

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNGPhanSoTong(PhanSo);

if(iTu==iMau)cout<<1<< endl;

else if(iMau<)cout<<-iTu<<<<-iMau<< endl;else

cout<<iTu<<<<iMau<< endl;}

PhanSo PhanSo::Tong(PhanSoa){PhanSotong;

intmc= lcm(this->iMau a iMau, );

tong.iTu=mc/this->iMau*this->iTu+mc a/.iMau a iTu*.;

PhanSo PhanSo::Tich(PhanSoa){PhanSotong;

tong.iMau=this->iMau*a iMau.;//tong.RutGon();

PhanSo PhanSo::Hieu(PhanSoa){PhanSohieu;

Trang 15

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNGintmc= lcm(this->iMau a iMau, );

hieu.iTu=mc/this->iMau*this->iTu-mc a/.iMau a iTu*.;

PhanSo PhanSo::Thuong(PhanSoa){PhanSothuong;

boolPhanSo::SoSanh(PhanSoa){if(this->iTu/this->iMau>a.iTu a/.iMau){

intmain(){PhanSoa b, ;

Giải thích các phương thức:

Input: Nhập vào giá trị của tử số và mẫu số lần lượt vào 2 biến iTu, iMau.

Trang 16

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

Hình 9: Mô tả hàm nhập+Xuat():

Ouput: Xuất ra phân số dưới dạng iTu/iMau đã rút gọn.Xử lý các trường hợp đặc biệt:

- Nếu tử số và mẫu số bằng nhau, in 1.- Nếu mẫu số bằng 1, in ra tử số.

- Nếu mẫu số âm, in giá trị tuyệt đối của tử số và mẫu số với dấu âm trướctử số.

- Nếu không, in tử số tiếp theo là dấu gạch chéo (/) và mẫu số.

Trang 17

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

Hàm RutGon() sử dụng thuật toán Euclid để tìm ước số chung lớn nhất(GCD) của tử số và mẫu số của phân số Sau khi tìm được GCD, hàm chiacả tử số và mẫu số cho GCD để thu được phân số tối giản.

Hình 11: Mô tả hàm rút gọn

Hình 12: Mô tả hàm GCD và LCM2 Các bước thực hiện:

Bước 1: Sử dụng thuật toán Euclid để tìm GCD của tử số và mẫu số.Bước 2: Chia cả tử số và mẫu số cho GCD.

Bước 3: Trả về phân số mới với tử số và mẫu số đã được rút gọn.Giả sử ta có phân số 5/10.

Bước 1: Tìm GCD của 5 và 10:GCD(5, 10) = 5.

Bước 4: Chia cả tử số và mẫu số cho 5:Tử số mới: 5 / 5 = 1.

Mẫu số mới: 10 / 5 = 2.

Bước 5: Trả về phân số mới: 1/2.

Trang 18

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

Hình 12.1: Output của ví dụ+Tong():

Hàm Tong() được sử dụng để tính tổng của hai phân số Dưới đây làmô tả chi tiết cách thức hoạt động của hàm:

Hình 13: Mô tả hàm tính tổng.1 Thuật toán:

Hàm Tong() thực hiện các bước sau:1 Biến và khởi tạo:

Hàm Tong() nhận một đối tượng PhanSo tên a làm tham số.Khai báo một biến PhanSo mới tên tong để lưu trữ kết quả.2 Tìm bội số chung nhỏ nhất (LCM):

Gọi hàm lcm với hai tham số là mẫu số của this (iMau) và mẫu số của a(a.iMau).

Gán giá trị trả về của lcm (LCM của hai mẫu số) cho biến mc.3 Tính toán tử số mới:

Chia tử số của this (iTu) cho mẫu số của this (iMau) và nhân với mc.Chia tử số của a (a.iTu) cho mẫu số của a (a.iMau) và nhân với mc.Cộng hai giá trị thu được để có được tử số mới của phân số tổng.Gán giá trị này cho tong.iTu.

Trang 19

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

4 Gán mẫu số cho phân số tổng:Gán giá trị mc (LCM) cho tong.iMau.5 Rút gọn phân số tổng:

Gọi hàm RutGon (giả sử được định nghĩa sẵn) để rút gọn tong.6 Trả về kết quả:

Trả về đối tượng PhanSo tong sau khi đã được rút gọn.Ví dụ: Ta có 2 phân số 1/2 và 3/4:

- Tìm LCM:

Gọi hàm lcm(2, 4) -> trả về 4.Gán 4 cho mc.

- Tính toán tử số mới:4*1/2+4*3/4 = 5;- Gán 5 cho tong.iTu.- Gán mẫu số:

- Gán 4 cho tong.iMau.- Rút gọn:

Gọi hàm RutGon (giả sử) -> trả về 5/4.

Hình 13.1: Ouput của ví dụ

+Hieu(): Hàm Hieu() được sử dụng để tính hiệu của hai phân số.

Hình 14: Mô tả hàm hiệu

Trang 20

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

1 Biến và khởi tạo:

Hàm Hieu() nhận một đối tượng PhanSo tên a làm tham số và khởi tạomột biến PhanSo mới tên hieu để lưu trữ kết quả.

4 Gán mẫu số cho phân số hiệu:Gán giá trị mc (LCM) cho hieu.iMau.5 Rút gọn phân số hiệu:

Gọi hàm RutGon (giả sử được định nghĩa sẵn) để rút gọn hieu.6 Trả về kết quả:

Trả về đối tượng PhanSo hieu sau khi đã được rút gọn.Ví dụ: Ta có 2 phân số 1/2 và 3/4:

Tìm LCM:

Gọi hàm lcm(2, 4) -> trả về 4.Gán 4 cho mc.

Tính toán tử số mới:4*1/2-4*3/4 = -1Gán -1 cho hieu.iTu.Gán mẫu số:

Gán 4 cho hieu.iMau.

Trang 21

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

Rút gọn:

Gọi hàm RutGon (giả sử) -> trả về -1/4.

Hình 14.1: Ouput của ví dụ+Tich(): được sử dụng để tính tích của hai phân số.PhanSo PhanSo::Tich(PhanSoa){

tong.iMau=this->iMau*a iMau.;returntong;

Hình 15: Mô tả hàm tính tíchHàm Tich() thực hiện tính tích của hai phân số bằng cách:- Nhân tử số của hai phân số.

- Nhân mẫu số của hai phân số.Giả sử ta có hai phân số 1/2 và 3/4.Tính toán:

Tử số: 1 * 3 = 3.Mẫu số: 2 * 4 = 8.Output: 3/8

Hình 15.1: Output của ví dụ

+Thuong(): được sử dụng để tính thương của hai phân số.

Hình 16: Mô tả hàm tính thương

Trang 22

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

2 Các bước thực hiện:Khởi tạo:

Hàm khởi tạo một biến PhanSo mới tên thuong để lưu trữ kết quả.Tính toán tử số:

Gán giá trị tích của tử số của this (iTu) và mẫu số của a (a.iMau) chothuong.iTu.

Tử số: 1 * 4 = 4.Mẫu số: 2 * 3 = 6.

Output : 2/3 sau khi rút gọn.

Hình 16.1: Output của ví dụ

Trang 23

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

+SoSanh(): được sử dụng để so sánh hai phân số.

2 Các bước thực hiện:

- Chuyển đổi thành giá trị thập phân:

- Chia tử số của this (iTu) cho mẫu số của this (iMau).- Chia tử số của a (a.iTu) cho mẫu số của a (a.iMau).- So sánh giá trị thập phân:

- So sánh hai giá trị thập phân thu được.

Nếu giá trị thập phân của this lớn hơn giá trị thập phân của a, trả vềtrue.

Ngược lại, trả về false.

Ví dụ: Giả sử ta có hai phân số 1/2 và 3/4.Tính toán:

Giá trị thập phân của 1/2: 0.5.Giá trị thập phân của 3/4: 0.75.So sánh:

Vì 0.5 < 0.75, hàm SoSanh() trả về false.

Hình 17.1: Output của ví dụ

Trang 24

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

Bài tập 3: Xây dựng lớp số phức bao gồm:• Thuộc tính: iThuc, iAo

• Phương thức: Nhap(), Xuat(), Tong(), Hieu(), Tich(), Thuong()Yêu cầu: Thực hiện xây dựng lớp, vẽ class diagram và khai báo cácthuộc tính, phương thức Viết nội dung vào các phương thức đã khaibáo Gọi các phương thức trong hàm main().

Diagram của class SoPhuc:

Code của class SoPhuc:#include<bits/stdc++.h>

usingnamespacestd;#definell long longclassSoPhuc{

private:floatiThuc iAo,;public:

voidNhap();voidXuat();SoPhucTong(SoPhuc);

Trang 25

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNGSoPhucHieu(SoPhuc);

cout<<iThuc<<((iAo>=0)?" + ":" - ")<< abs(iAo)<<"i"<< endl;};

SoPhuc SoPhuc::Tong(SoPhuca){SoPhuctong;

tong.iAo=this->iAo+a iAo.;returntong;

SoPhuc SoPhuc::Hieu(SoPhuca){SoPhuchieu;

hieu.iAo=this->iAo-a iAo.;returnhieu;

SoPhuc SoPhuc::Tich(SoPhuca){SoPhuctich;

tich.iThuc=this->iThuc*a.iThuc-this->iAo*a iAo.;

SoPhuc SoPhuc::Thuong(SoPhuca){SoPhucthuong;

thuong.iThuc=(this->iThuc*a.iThuc+this->iAo*a iAo.)(pow( aiThuc,2)+pow( a iAo, ));2

thuong.iAo=(a.iThuc*this->iAo-this->iThuc*a iAo.)(pow( a iThuc,2)+pow(a iAo., ));2returnthuong;

intmain(){SoPhuca b, ;

a.Tong(b).Xuat();

Trang 26

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

Input: Nhập vào giá trị của tử số và mẫu số lần lượt vào 2 biến iTu, iMau.

Hình 18: Mô tả hàm nhập+Xuat(): được sử dụng để xuất một số phức ra màn hình.

Hình 19: Mô tả hàm xuất2 Các bước thực hiện:

Kiểm tra phần ảo:

Nếu phần ảo (iAo) lớn hơn hoặc bằng 0, in "+" trước giá trị tuyệt đối củaphần ảo.

Nếu phần ảo (iAo) nhỏ hơn 0, in "-" trước giá trị tuyệt đối của phần ảo.In ra từng phần:

In ra phần thực (iThuc).

In ra ký hiệu "+" hoặc "-" (tùy theo kết quả kiểm tra phần ảo).In ra giá trị tuyệt đối của phần ảo (abs(iAo)).

In ra "i".

Trang 27

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

Ví dụ: Giả sử ta có số phức 3 + 4i.

Hình 19.1: Output của ví dụ+Tong(): được sử dụng để tính tổng của hai số phức.

Hình 20: Mô tả hàm xuấtKhởi tạo:

Hàm khởi tạo một biến SoPhuc mới tên tong để lưu trữ kết quả.Tính toán phần thực:

Gán giá trị tổng của phần thực (iThuc) của this và a cho tong.iThuc.Tính toán phần ảo:

Gán giá trị tổng của phần ảo (iAo) của this và a cho tong.iAo.Trả về kết quả:

Trả về biến tong lưu trữ tổng của hai số phức.Ví dụ: Giả sử ta có hai số phức 3 + 4i và 5 + 6i.Tính toán:

Phần thực: 3 + 5 = 8.Phần ảo: 4 + 6 = 10.Kết quả:

Hàm Tong() trả về số phức 8 + 10i.

Trang 28

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

Hình 20.1: Output của ví dụ+Hieu(): được sử dụng để tính hiệu của hai số phức.

Hình 21: Mô tả hàm hiệuCác bước thực hiện:

Phần ảo: 4 - 6 = -2.Kết quả:

Hàm Hieu() trả về số phức (-2 - 2i).

Hình 21.1: Output của ví dụ

Trang 29

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

Hình 22: Mô tả hàm tíchCác bước thực hiện:

Hàm Tich() trả về số phức (-14 + 23i).

Hình 22.1: Output của ví dụ+Thuong(): được sử dụng để tính thương của hai số phức.

Trang 30

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

Hình 23: Mô tả hàm thươngCác bước thực hiện:

Phần ảo:

Tính tích của phần thực (a.iThuc) và phần ảo (this->iAo) của hai số phức,trừ đi tích của phần thực (this->iThuc) và phần ảo (a.iAo) của hai số phức.Chia kết quả này cho bình phương độ lớn của số phức a (pow(a.iThuc,2) +pow(a.iAo,2)) Gán giá trị tính được cho phần ảo (thuong.iAo) của kết quả.Trả về:

Trả về biến thuong lưu trữ kết quả (thương của hai số phức).Ví dụ:

Giả sử ta có hai số phức (3 + 4i) và (2 + 5i).

Phần thực: ((3 * 2) + (4 * 5)) / ((2^2) + (5^2)) = 0.896552.Phần ảo: ((2 * 4) - (3 * 5)) / ((2^2) + (5^2)) = - 0.241379.Kết quả:

Hàm Thuong() trả về số phức (0.896552- 0.241379i).

Hình 23.1: Output của ví dụ

Trang 31

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

Bài tập 4: Xây dựng lớp giờ phút giây:• Thuộc tính: iGio, iPhut, iGiay

• Phương thức: Nhap(), Xuat(), TinhCongThemMotGiay()

Yêu cầu: Thực hiện xây dựng lớp, vẽ class diagram và khai báo cácthuộc tính, phương thức Viết nội dung vào các phương thức đã khaibáo Gọi các phương thức trong hàm main().

Diagram của class GioPhutGiay

Code của class GioPhutGiay:#include<bits/stdc++.h>

intgio phut giay,,;public:

Trang 32

IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

cout<<"Nhap lai: ";

cout<< setfill('0')<< setw(2)<<gio<<":"<< setw(2)<<phut<<":"<< setw(2)<<

giay<< endl;}

a.Nhap();

Ngày đăng: 16/05/2024, 16:23

Tài liệu cùng người dùng

Tài liệu liên quan