Bài 32.5: Bài tập thực hành Struct trong C++

Bài 32.5: Bài tập thực hành Struct trong C++
Bài Tập 2: Struct chứa nhiều kiểu dữ liệu
Mục tiêu: Tạo một struct kết hợp các kiểu dữ liệu khác nhau (int, string, double).
Hãy định nghĩa một struct tên là Product
để lưu thông tin về một sản phẩm, bao gồm:
id
(số nguyên)name
(chuỗi ký tự, dùngstring
)price
(số thực, dùngdouble
)
Tạo một biến kiểu Product
, nhập dữ liệu cho nó (có thể gán trực tiếp hoặc nhập từ bàn phím), và in thông tin sản phẩm đó ra.
#include <iostream>
#include <string>
#include <limits>
struct Product {
int id;
string name;
double price;
};
int main() {
Product sp;
cout << "Nhap ID san pham: ";
cin >> sp.id;
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Nhap ten san pham: ";
getline(cin, sp.name);
cout << "Nhap gia san pham: ";
cin >> sp.price;
cout << "\n--- Thong tin San pham ---" << endl;
cout << "ID: " << sp.id << endl;
cout << "Ten: " << sp.name << endl;
cout << "Gia: " << sp.price << endl;
return 0;
}
Ví dụ nhập liệu:
Nhap ID san pham: 1001
Nhap ten san pham: Dien thoai ABC
Nhap gia san pham: 599.99
Output tương ứng:
--- Thong tin San pham ---
ID: 1001
Ten: Dien thoai ABC
Gia: 599.99
Bài Tập 3: Truyền Struct vào và trả về từ Hàm
Mục tiêu: Hiểu cách truyền struct làm tham số cho hàm và cách hàm có thể trả về một struct.
Hãy sử dụng lại struct Point
. Viết các hàm sau:
void printPoint(Point p)
: Nhận mộtPoint
và in tọa độ của nó. Truyền tham số theo giá trị.Point movePoint(Point p, int dx, int dy)
: Nhận mộtPoint
và dịch chuyển nó đidx
theo trục x,dy
theo trục y. Hàm này sẽ trả về một Point mới đã được dịch chuyển. Truyền tham số theo giá trị và trả về theo giá trị.void movePointByRef(Point& p, int dx, int dy)
: Nhận mộtPoint
tham chiếu và dịch chuyển nó đidx
,dy
. Hàm này sẽ thay đổi đối tượng Point gốc được truyền vào. Truyền tham số theo tham chiếu.
#include <iostream>
struct Point {
int x;
int y;
};
void inDiem(Point p) {
cout << "(" << p.x << ", " << p.y << ")";
}
Point dichChuyenDiem(Point p, int dx, int dy) {
Point diemMoi;
diemMoi.x = p.x + dx;
diemMoi.y = p.y + dy;
return diemMoi;
}
void dichChuyenDiemThamChieu(Point& p, int dx, int dy) {
p.x = p.x + dx;
p.y = p.y + dy;
}
int main() {
Point p1 = {5, 8};
cout << "Diem ban dau: ";
inDiem(p1);
Point p2 = dichChuyenDiem(p1, 2, -3);
cout << "\nDiem sau khi di chuyen (dichChuyenDiem): ";
inDiem(p2);
cout << " (Diem p1 goc van la: ";
inDiem(p1);
cout << ")" << endl;
cout << "Diem ban dau truoc khi dichChuyenDiemThamChieu: ";
inDiem(p1);
dichChuyenDiemThamChieu(p1, -1, 5);
cout << "\nDiem sau khi di chuyen (dichChuyenDiemThamChieu): ";
inDiem(p1);
cout << endl;
return 0;
}
Output:
Diem ban dau: (5, 8)
Diem sau khi di chuyen (dichChuyenDiem): (7, 5) (Diem p1 goc van la: (5, 8))
Diem ban dau truoc khi dichChuyenDiemThamChieu: (5, 8)
Diem sau khi di chuyen (dichChuyenDiemThamChieu): (4, 13)
Bài Tập 4: Mảng và Vector chứa Struct
Mục tiêu: Lưu trữ nhiều đối tượng struct trong mảng hoặc vector và xử lý chúng.
Sử dụng lại struct Product
. Tạo một vector
để lưu trữ danh sách các sản phẩm. Thêm một vài sản phẩm vào vector và sau đó lặp qua vector để in thông tin chi tiết của từng sản phẩm.
#include <iostream>
#include <string>
#include <vector>
struct Product {
int id;
string name;
double price;
};
int main() {
vector<Product> kho;
kho.push_back({101, "Laptop Dell", 1200.50});
kho.push_back({102, "Mouse Logitech", 25.99});
kho.push_back({103, "Keyboard Corsair", 80.00});
cout << "--- Danh sach San pham trong kho ---" << endl;
for (const auto& sp : kho) {
cout << "ID: " << sp.id
<< ", Ten: " << sp.name
<< ", Gia: " << sp.price << endl;
}
if (!kho.empty()) {
cout << "\nSan pham dau tien: " << kho[0].name << endl;
}
return 0;
}
Output:
--- Danh sach San pham trong kho ---
ID: 101, Ten: Laptop Dell, Gia: 1200.5
ID: 102, Ten: Mouse Logitech, Gia: 25.99
ID: 103, Ten: Keyboard Corsair, Gia: 80
San pham dau tien: Laptop Dell
Bài Tập 5: Struct lồng nhau
Mục tiêu: Tạo một struct mà một trong các thành viên của nó lại là một struct khác.
Hãy định nghĩa một struct Address
với các thành viên street
, city
, zipCode
(đều là string
hoặc phù hợp). Sau đó, định nghĩa một struct Person
với các thành viên name
(string
) và homeAddress
có kiểu là Address
. Tạo một biến kiểu Person
và nhập/in thông tin, bao gồm cả thông tin địa chỉ.
#include <iostream>
#include <string>
#include <limits>
struct DiaChi {
string duong;
string thanhPho;
string maBuuDien;
};
struct Nguoi {
string ten;
DiaChi nha;
};
int main() {
Nguoi nguoi1;
cout << "Nhap ten nguoi: ";
getline(cin, nguoi1.ten);
cout << "Nhap duong: ";
getline(cin, nguoi1.nha.duong);
cout << "Nhap thanh pho: ";
getline(cin, nguoi1.nha.thanhPho);
cout << "Nhap ma buu dien: ";
getline(cin, nguoi1.nha.maBuuDien);
cout << "\n--- Thong tin Nguoi ---" << endl;
cout << "Ten: " << nguoi1.ten << endl;
cout << "Dia chi: " << nguoi1.nha.duong
<< ", " << nguoi1.nha.thanhPho
<< ", " << nguoi1.nha.maBuuDien << endl;
return 0;
}
Ví dụ nhập liệu:
Nhap ten nguoi: Nguyen Van A
Nhap duong: 123 Duong ABC
Nhap thanh pho: Ha Noi
Nhap ma buu dien: 100000
Output tương ứng:
--- Thong tin Nguoi ---
Ten: Nguyen Van A
Dia chi: 123 Duong ABC, Ha Noi, 100000
Bài Tập 6: Tính toán với dữ liệu trong Struct
Mục tiêu: Sử dụng dữ liệu từ các thành viên của struct để thực hiện các phép tính.
Sử dụng lại struct Point
. Viết một hàm double calculateDistance(Point p1, Point p2)
để tính khoảng cách giữa hai điểm trong mặt phẳng sử dụng công thức khoảng cách Euclid: $\sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2}$.
#include <iostream>
#include <cmath>
struct Point {
int x;
int y;
};
double tinhKhoangCach(Point p1, Point p2) {
double dx = p2.x - p1.x;
double dy = p2.y - p1.y;
return sqrt(pow(dx, 2) + pow(dy, 2));
}
int main() {
Point diemA = {1, 2};
Point diemB = {4, 6};
double kc = tinhKhoangCach(diemA, diemB);
cout << "Diem A: (" << diemA.x << ", " << diemA.y << ")" << endl;
cout << "Diem B: (" << diemB.x << ", " << diemB.y << ")" << endl;
cout << "Khoang cach giua A va B: " << kc << endl;
return 0;
}
Output:
Diem A: (1, 2)
Diem B: (4, 6)
Khoang cach giua A va B: 5
Bài tập ví dụ: C++ Bài 19.B2: Quyết định ăn đồ ngọt
Quyết định ăn đồ ngọt
FullHouse Dev đang chuẩn bị cho Halloween bằng cách mua đồ ngọt!
Cửa hàng bán cả sô cô la và kẹo.
- Mỗi thanh sô cô la có độ ngon là X.
- Mỗi viên kẹo có độ ngon là Y.
- Một gói sô cô la chứa 2 thanh, trong khi một gói kẹo chứa 5 viên.
FullHouse Dev chỉ có thể mua một gói đồ ngọt, và phải quyết định: nên mua gói nào để tối đa hóa tổng độ ngon của món đồ mua?
In ra "Chocolate" nếu gói sô cô la ngon hơn, "Candy" nếu gói kẹo ngon hơn, và "Either" nếu chúng có cùng độ ngon.
INPUT FORMAT
- Dòng đầu tiên chứa một số nguyên T, biểu thị số lượng bộ test.
- Mỗi bộ test gồm một dòng chứa hai số nguyên X và Y cách nhau bởi dấu cách — lần lượt là độ ngon của một thanh sô cô la và một viên kẹo.
OUTPUT FORMAT
Với mỗi bộ test, in ra trên một dòng mới câu trả lời:
- "Chocolate" nếu gói sô cô la ngon hơn.
- "Candy" nếu gói kẹo ngon hơn.
- "Either" nếu chúng có cùng độ ngon.
Bạn có thể in mỗi ký tự của output bằng chữ hoa hoặc chữ thường.
CONSTRAINTS
- 1 ≤ T ≤ 100
- 1 ≤ X, Y ≤ 10
Ví dụ
Input
4
5 1
5 2
5 3
3 10
Output
Chocolate
Either
Candy
Candy
Giải thích:
- Test 1: Gói sô cô la có độ ngon là 2 × 5 = 10, trong khi gói kẹo có độ ngon là 5 × 1 = 5. Sô cô la ngon hơn.
- Test 2: Gói sô cô la có độ ngon là 2 × 5 = 10, trong khi gói kẹo có độ ngon là 5 × 2 = 10. Chúng có cùng độ ngon.
- Test 3: Gói sô cô la có độ ngon là 2 × 5 = 10, trong khi gói kẹo có độ ngon là 5 × 3 = 15. Kẹo ngon hơn.
- Test 4: Gói sô cô la có độ ngon là 2 × 3 = 6, trong khi gói kẹo có độ ngon là 5 × 10 = 50. Kẹo ngon hơn. Chào bạn, đây là hướng dẫn để giải bài tập này bằng C++:
Bao gồm thư viện cần thiết: Bạn sẽ cần thư viện để xử lý nhập/xuất dữ liệu.
<iostream>
là lựa chọn tiêu chuẩn cho việc này (cin
vàcout
).Đọc số lượng bộ test: Bắt đầu bằng cách đọc giá trị
T
từ đầu vào.Vòng lặp xử lý các bộ test: Sử dụng một vòng lặp (ví dụ:
while
hoặcfor
) để chạyT
lần. Mỗi lần lặp sẽ xử lý một bộ test. Một cách phổ biến và ngắn gọn là dùngwhile (T--)
.Đọc dữ liệu cho mỗi bộ test: Bên trong vòng lặp, đọc hai số nguyên
X
vàY
cho bộ test hiện tại.Tính toán tổng độ ngon:
- Tính tổng độ ngon của gói sô cô la: Mỗi gói có 2 thanh, mỗi thanh ngon X. Tổng ngon là
2 * X
. - Tính tổng độ ngon của gói kẹo: Mỗi gói có 5 viên, mỗi viên ngon Y. Tổng ngon là
5 * Y
.
- Tính tổng độ ngon của gói sô cô la: Mỗi gói có 2 thanh, mỗi thanh ngon X. Tổng ngon là
So sánh và in kết quả: Dùng cấu trúc điều khiển
if-else if-else
để so sánh hai giá trị tổng độ ngon vừa tính được:- Nếu tổng độ ngon sô cô la lớn hơn tổng độ ngon kẹo, in ra "Chocolate".
- Nếu tổng độ ngon kẹo lớn hơn tổng độ ngon sô cô la, in ra "Candy".
- Nếu hai tổng độ ngon bằng nhau, in ra "Either".
Xuống dòng sau mỗi kết quả: Đảm bảo rằng sau khi in kết quả của mỗi bộ test, bạn in một ký tự xuống dòng (
'\n'
hoặcendl
) để kết quả của bộ test tiếp theo xuất hiện trên dòng mới.
Tóm tắt logic:
Đọc T
Trong khi T > 0:
Đọc X, Y
tinh_do_ngon_socola = 2 * X
tinh_do_ngon_keo = 5 * Y
Nếu tinh_do_ngon_socola > tinh_do_ngon_keo:
In "Chocolate"
Nếu tinh_do_ngon_keo > tinh_do_ngon_socola:
In "Candy"
Ngược lại (bằng nhau):
In "Either"
In ký tự xuống dòng
Giảm T đi 1
Đây là hướng đi chính. Bạn chỉ cần chuyển các bước này sang cú pháp C++ sử dụng các hàm và cấu trúc điều khiển cơ bản. Chú trọng sử dụng cin
và cout
từ thư viện <iostream>
.
#include <iostream> // Bao gồm thư viện nhập/xuất
int main() {
ios_base::sync_with_stdio(false); // Tối ưu tốc độ nhập/xuất
cin.tie(NULL); // Bỏ đồng bộ cin/cout
int t; // Số lượng bộ test
cin >> t;
while (t--) { // Vòng lặp xử lý từng bộ test
int x, y; // Độ ngon của sô cô la và kẹo
cin >> x >> y;
int ngon_socola = 2 * x; // Tổng độ ngon gói sô cô la
int ngon_keo = 5 * y; // Tổng độ ngon gói kẹo
if (ngon_socola > ngon_keo) {
cout << "Chocolate\n";
} else if (ngon_keo > ngon_socola) {
cout << "Candy\n";
} else {
cout << "Either\n";
}
}
return 0;
}
Output cho ví dụ:
Chocolate
Either
Candy
Candy
Comments