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

BÀI TẬP THỰC HÀNH CHƯƠNG 5: Struct và Class

A. BÀI TẬP VỚI Struct.


Bài 1. Định nghĩa kiểu dữ liệu PhongBan gồm các thông tin: mã phòng ban kiểu
string, tên phòng ban kiểu string. Sau đó viết chương trình cho phép nhập và xuất
thông tin của 1 phòng ban cụ thể.
#include <iostream>
#include <string>
using namespace std;
struct PhongBan
{
string MaPB;
string TenPB;
};

int main()
{
void nhap(PhongBan & PB);
void xuat(PhongBan PB);
PhongBan PB;
cout << "Nhap ma phong ban: ";
getline(cin, PB.MaPB);
cout << "Nhap ten phong ban: ";
getline(cin, PB.TenPB);

cout << "Thong tin Phong Ban la:\nMa PB: " << PB.MaPB << "\nTen Phong
Ban la: " << PB.TenPB << endl;
system("pause");
return 0;
}

Bài 2. Định nghĩa kiểu dữ liệu PhanSo gồm tử số và mẫu số (số nguyên). Sau đó viết
chương trình dùng kiểu mới định nghĩa này để xây dựng các hàm tính tổng, hiệu,
tích, thương của 2 phân số. Lưu ý: phân số chỉ có nghĩa khi mẫu số khác 0.
#include<iostream>
#include<string>
using namespace std;
struct PhanSo
{
int TS;
int MS;
};
void NhapPS(PhanSo &PS)
{
cout << "Nhap tu so: ";
cin >> PS.TS;
do
{
cout << "Nhap mau so: ";
cin >> PS.MS;
if (PS.MS == 0)
cout << "Nhap sai! Hay nhap lai!";
} while (PS.MS == 0);
}
void XuatPS(PhanSo PS)
{
cout << PS.TS << "/" << PS.MS;
}

int UCLN(int a, int b)


{
a = abs(a);
b = abs(b);
while (a != b)
if (a > b)
a = a - b;
else
b = b - a;
return a;
}

PhanSo ToiGian(PhanSo PS)


{
PhanSo kq;
int d = UCLN(PS.TS, PS.MS);
kq.TS = PS.TS / d;
kq.MS = PS.MS / d;
return kq;
}

PhanSo CongPS(PhanSo P1, PhanSo P2)


{
PhanSo kq;
kq.TS = (P1.TS*P2.MS + P2.TS*P1.MS);
kq.MS = P1.MS * P2.MS;
kq=ToiGian(kq);
return kq;
}

PhanSo TruPS(PhanSo P1, PhanSo P2)


{
PhanSo kq;
kq.TS = (P1.TS*P2.MS - P2.TS*P1.MS);
kq.MS = P1.MS * P2.MS;
if (kq.TS!=0)
kq=ToiGian(kq);
return kq;
}

PhanSo NhanPS(PhanSo P1, PhanSo P2)


{
PhanSo kq;
kq.TS =P1.TS*P2.TS;
kq.MS = P1.MS * P2.MS;
kq = ToiGian(kq);
return kq;
}

PhanSo ChiaPS(PhanSo P1, PhanSo P2)


{
PhanSo kq;
kq.TS = P1.TS*P2.MS;
kq.MS = P1.MS * P2.TS;
kq = ToiGian(kq);
return kq;
}

int main()
{
PhanSo a, b, kq;
cout << "Nhap phan so thu nhat: " << endl;
NhapPS(a);
cout << "Nhap phan so thu hai: " << endl;
NhapPS(b);

cout << "\nTong hai phan so: ";


kq = CongPS(a, b);
XuatPS(a);
cout << " + ";
XuatPS(b);
cout << " = ";
XuatPS(kq);
cout << endl;

cout << "\nHieu hai phan so: ";


kq = TruPS(a, b);
XuatPS(a);
cout << " - ";
XuatPS(b);
cout << " = ";
XuatPS(kq);
cout << endl;

cout << "\nNhan hai phan so: ";


kq = NhanPS(a, b);
XuatPS(a);
cout << " * ";
XuatPS(b);
cout << " = ";
XuatPS(kq);
cout << endl;

cout << "\nChia hai phan so: ";


kq = ChiaPS(a, b);
XuatPS(a);
cout << " / ";
XuatPS(b);
cout << " = ";
XuatPS(kq);
cout << endl;
system("pause");
return 0;
}

Bài 4. Định nghĩa kiểu dữ liệu SinhVien gồm các thông tin:
- Mã số sinh viên kiểu string - Họ tên kiểu string - Địa chỉ kiểu string
- Năm sinh kiểu int - Điểm toán kiểu double - Điểm văn kiểu double
- Điểm ngoại ngữ kiểu double
Viết các hàm:
- Nhập vào thông tin của sinh viên trong 1 lớp học (sĩ số không quá 45).
- Xuất lại thông tin của sinh viên nào do người dùng yêu cầu (thông qua việc nhập số thứ tự
của sinh viên).
- Tính điểm trung bình và xuất lại thông tin mã số sinh viên, họ tên và điểm trung bình của
từng sinh viên.
Biết: điểm trung bình = ( (điểm toán + điểm văn) * 2 + điểm ngoại ngữ)/5
- Xếp loại sinh viên: Nếu điểm trung bình từ 8 trở lên thì xếp loại là “Giỏi”. Nếu điểm trung
bình từ 6.5 đến < 8 thì xếp loại là “Khá”. Nếu điểm trung bình từ 5 đến < 6.5 thì xếp loại là
“TB”. Nếu điểm dưới 5 thì xếp loại “Dưới TB”
- Viết hàm main kiểm chứng chương trình.

#include <iostream>
#include <string>
using namespace std;
struct SinhVien
{
string MaSV, HoTen, DiaChi;
int NamSinh;
double DToan, DVan, DNNgu;
};

void NhapLop(SinhVien* SV, int n)


{
cout << " Nhap thong tin sinh vien:\n";
for (int i = 0; i < n; i++)
{
cin.ignore();
cout << " Sinh vien thu " << i + 1 << ":\n";
cout << " Ma so: "; getline(cin,SV[i].MaSV);
cout << " Ho ten: "; getline(cin, SV[i].HoTen);
cout << " Dia chi: "; getline(cin, SV[i].DiaChi);
cout << " Nam sinh: "; cin >> SV[i].NamSinh;
cout << " Diem Toan: "; cin >> SV[i].DToan;
cout << " Diem Van: "; cin >> SV[i].DVan;
cout << " Diem Ngoai Ngu: "; cin >> SV[i].DNNgu;
cout << endl;
}
}

void Xuat1SV(SinhVien* SV, int n, int TT)


{
int i = TT - 1;
cout << " Sinh vien thu " << TT << ": ";
cout << "\nMa so siinh vien: " << SV[i].MaSV;
cout << "\nHo ten: " << SV[i].HoTen;
cout << "\nDia chi: " << SV[i].DiaChi;
cout << "\nNam sinh: " << SV[i].NamSinh;
cout << "\niem Toan: " << SV[i].DToan;
cout << "\nDiem Van: " << SV[i].DVan;
cout << "\nDiem ngoai ngu: " << SV[i].DNNgu;
cout << endl;
}

string XepLoai(double DTB)


{
string XL;
if (DTB >= 8)
XL = "Gioi";
else
if (DTB >= 6.5)
XL = "Kha";
else
if (DTB >= 5)
XL = "TB";
else
XL = "Duoi TB";
return XL;
}

void TinhTB(SinhVien* SV, int n)


{
double DTB;
cout << "\nXuat thong tin xep loai sinh vien: ";
for (int i = 0; i < n; i++)
{
cout << "\nSinh vien thu " << i + 1;
cout << "\n Ma so sinh vien: " << SV[i].MaSV;
cout << "\nHo ten: " << SV[i].HoTen;
DTB = ((SV[i].DToan + SV[i].DVan) * 2 + SV[i].DNNgu) / 5;
cout << "\nDiem trung binh: " << DTB;
cout << "\nXep loai: " << XepLoai(DTB);
cout << endl;
}
}

int main()
{
SinhVien* SV;
int n, TT;
do
{
cout << "Nhap so sinh vien: ";
cin >> n;
if (n < 1 || n>45)
cout << "Nhap sai! Nhap lai\n";
} while (n < 1 || n>45);
SV = new SinhVien[n];
NhapLop(SV, n);
cout << "Nhap so thu tu SV: ";
cin >> TT;
cout << "\nXuat ket qua sinh vien: \n";
TinhTB(SV, n);
delete[ ]SV;
SV = 0;
system("pause");
return 0;
}

Bài 5. Định nghĩa kiểu dữ liệu Sach gồm các thông tin sau:
- Tên sách kiểu mảng 1 chiều char, tối đa 20 ký tự.
- Tên tác giả kiểu mảng 1 chiều char, tối đa 20 ký tự.
- Ngày tháng năm xuất bản kiểu struct NTN (ngày, tháng, năm đều là số nguyên)
Viết các hàm sau:
- Nhập vào thông tin của tối đa 50 quyển sách.
- Xuất lại thông tin của quyển sách nào có tên tác giả là “Tran Dung”.
#include <iostream>
#include <string>
using namespace std;
struct Date
{
int d, m, y;
};

struct Sach
{
char TenSach[20];
char TenTG[20];
Date NgayXB;
};

void NHAP(Sach*S,int n)
{
cout << "\nNhap thong tin cua " << n << " quyen sach: " << endl;
for(int i=0;i<n;i++)
{
cin.ignore();
cout << "\nSach thu " << i + 1 << " : ";
cout << "\nTen sach: "; cin.getline(S[i].TenSach,20);
cout << "\nTen tac gia: "; cin.getline(S[i].TenTG, 20);
cout << "Ngay xuat ban: "; cin >> S[i].NgayXB.d;
cout << "Thang xuat ban: "; cin >> S[i].NgayXB.m;
cout << "Nam xuat ban: "; cin >> S[i].NgayXB.y;
}
cin.ignore();
}

void TimTG(Sach *S, int n, char *TG)


{
bool kq = false;
cout << "\nXuat thong tin tac gia: " << TG;
for (int i = 0; i < n; i++)
if (!strcmp(S[i].TenTG, TG))
{
cout << "\nTen sach: " << S[i].TenSach;
cout << "\nNgay xuat ban: " << S[i].NgayXB.d << "/" <<
S[i].NgayXB.m << "/" << S[i].NgayXB.y;
kq = true;
}
if (!kq)
cout << "Khong tim thay tac gia " << TG << endl;
}

int main()
{
Sach* S;
char TG[30];
int n;
do
{
cout << "Nhap so luong sach: ";
cin >> n;
if (n < 1 || n>30)
cout << "Nhap sai!Hay nhap lai!\n";
} while (n < 1 || n>30);
S = new Sach[n];
NHAP(S, n);
cout << "\nNhap ten tac gia tim thong tin: ";
cin.getline(TG, 30);
TimTG(S, n, TG);
delete[]S;
S = 0;
system("pause");
return 0;
}

Bài 6. Định nghĩa kiểu dữ liệu SanPham gồm các thông tin như sau:
- Mã sản phẩm kiểu char (tối đa 10 ký tự)
- Tên sản phẩm kiểu string.
- Đơn giá kiểu double
- Số lượng tồn kho kiểu int
Viết chương trình dùng cấp phát động và ký pháp độ dời để:
- Nhập thông tin cho tối đa 30 sản phẩm.
- Xuất thông tin của các sản phẩm vừa nhập.
- Sửa thông tin của một sản phẩm bất kỳ do người dùng yêu cầu.
- Xóa thông tin của một sản phẩm bất kỳ do người dùng yêu cầu.
- Sắp xếp lại toàn bộ sản phẩm theo trình tự số lượng tồn kho tăng dần.
#include <iostream>
#include <string>
using namespace std;

struct SanPham
{
char MaSP[11];
string TenSP;
double DonGia;
int SLtonkho;
};

int main()
{
SanPham* SP,temp;
char Ma[11];
int n;
bool flag = false;
do
{
cout << "Nhap so luong san pham: ";
cin >> n;
if (n < 1 || n>30)
cout << "Nhap sai!Hay nhap lai!\n";
} while (n < 1 || n>30);
SP = new SanPham[n];
cout << "Nhap thong tin san pham: ";
for (int i = 0; i < n; i++)
{
cin.ignore();
cout << "\nSan pham thu " << i + 1 << " : ";
cout << "\nMa san pham: "; cin.getline(SP[i].MaSP,10);
cout << "\nTen san pham: "; getline(cin,SP[i].TenSP);
cout << "Don gia: "; cin >> SP[i].DonGia;
cout << "So luong ton kho: "; cin >> SP[i].SLtonkho;
}
cout << "\nXuat thong tin san pham: ";
for (int i = 0; i < n; i++)
{
cout << "\nMa san pham: " << SP[i].MaSP;
cout << "\nTen san pham: " << SP[i].TenSP;
cout << "\nDon gia: " << SP[i].DonGia;
cout << "\nSo luong ton kho: " << SP[i].SLtonkho;
cout << endl;
}
cin.ignore();
cout << "\nSua thong tin san pham: ";
cout << "\nNhap ma san pham: "; cin.getline(Ma, 10);
for (int i = 0; i < n; i++)
{
if (!strcmp(SP[i].MaSP, Ma))
{
cout << "Ten san pham " << SP[i].TenSP << " sua lai: ";
getline(cin, SP[i].TenSP);
cout << "Don gia: " << SP[i].DonGia << " sua lai: ";
cin >> SP[i].SLtonkho;
cin.ignore();
flag = true;
break;
}
}
if (!flag)
cout << "\nKhong tim thay ma san pham " << Ma;
cout << "\nXoa thong tin san pham: ";
cout << "\nNhap ma san pham: ";
cin.getline(Ma, 10);
for (int i = 0; i < n; i++)
if (!strcmp(SP[i].MaSP, Ma))
{
for (int k = i; k < n - 1; k++)
SP[k] = SP[k + 1];
n--;
break;
}
cout << "\nSap xep san pham theo so luong ton kho tang dan: ";
for (int i = 0; i < n - 1; i++)
for (int j = i + 1; j < n; j++)
if (SP[i].SLtonkho > SP[j].SLtonkho)
{
temp = SP[i];
SP[i] = SP[j];
SP[j] = temp;
}
for (int i = 0; i < n; i++)
{
cout << "\nMa san pham: " << SP[i].MaSP;
cout << "\nTen san pham: " << SP[i].TenSP;
cout << "\nDon gia: " << SP[i].DonGia;
cout << "\nSo luong ton kho: " << SP[i].SLtonkho << endl;
}
delete[]SP;
SP = 0;
cout << endl;
system("pause");
return 0;
}

Bài 8. Định nghĩa kiểu dữ liệu MaTran gồm các thông tin:
- Số dòng, số cột kiểu int
- Con trỏ kiểu trỏ đến mảng 2 chiều lưu trữ số nguyên.
Viết chương trình thực hiện các việc sau:
- Phát sinh ngẫu nhiên giá trị cho 1 biến kiểu MaTran.
- Xuất giá trị đang lưu trữ trong mảng 2 chiều của biến kiểu MaTran.
- Tính tổng các phần tử nào là số đối xứng trong mảng 2 chiều của biến kiểu MaTran.

#include <iostream>
#include <cstdlib>
#include <string>
#include <iomanip>
using namespace std;

struct MaTran
{
int m, n;
int **a;
};
int main()
{
MaTran A;
int tong = 0;
cout << "Nhap so dong, so cot cua ma tran: ";
cin >> A.m >> A.n;
A.a = new int* [A.m];
for (int i = 0; i < A.m; i++)
A.a[i] = new int[A.n];
cout << "Xuat ma tran : \n";
for (int i = 0; i < A.m; i++)
{
for (int j = 0; j < A.n; j++)
{
A.a[i][j] = rand() % 20;
cout << setw(4) << A.a[i][j];
}
cout << endl;
}
for (int i = 0; i < A.m; i++)
delete[ ]A.a[i];
delete[ ]A.a;
system("pause");
return 0;
}

B. BÀI TẬP VỚI Class


Bài 9. Viết lớp PhanSo với 2 biến tử số và mẫu số có mức độ truy xuất là private. Các
hàm tính toán và trả dữ liệu đều truy xuất ở mức public. Thực hiện các phép tính
cộng, trừ, nhân, chia giữa 2 phân số.
Lưu ý: toàn bộ định nghĩa class chuyển sang lưu trữ ở header file.
#include <iostream>
#include <cmath>
using namespace std;

class PhanSo
{
private:
int tuso, mauso;
public:
void Nhap();
void Xuat();
void Cong(PhanSo, PhanSo);
void Tru(PhanSo, PhanSo);
void Nhan(PhanSo, PhanSo);
void Chia(PhanSo, PhanSo);
void ToiGian();
};

void PhanSo::Nhap()
{
do
{
cout << "Nhap vao tu so: "; cin >> tuso;
cout << "Nhap vao mau so: "; cin >> mauso;
if (mauso == 0)
cout << "Nhap sai!Hay nhap lai!\n";
} while (mauso == 0);
}

void PhanSo::Xuat()
{
cout << tuso << "/" << mauso;
}

void PhanSo::ToiGian()
{
double a = abs(tuso), b = abs(mauso);
while (a != b)
{
if (a > b)
a -= b;
else
b -= a;
};
tuso /= a;
mauso /= b;
}

void PhanSo::Cong(PhanSo p1, PhanSo p2)


{
tuso = p1.tuso * p2.mauso + p2.tuso * p1.mauso;
mauso = p1.mauso * p2.mauso;
ToiGian();
}

void PhanSo::Tru(PhanSo p1, PhanSo p2)


{
tuso = p1.tuso * p2.mauso - p2.tuso * p1.mauso;
mauso = p1.mauso * p2.mauso;
if (tuso != 0)
ToiGian();
}

void PhanSo::Nhan(PhanSo p1, PhanSo p2)


{
tuso = p1.tuso * p2.tuso;
mauso = p1.mauso * p2.mauso;
ToiGian();
}

void PhanSo::Chia(PhanSo p1, PhanSo p2)


{
tuso = p1.tuso * p2.mauso;
mauso = p1.mauso * p2.tuso;
ToiGian();
}

int main()
{
PhanSo p1, p2, p3, p4, p5, p6;
cout << "\nNhap phan so thu nhat: " << endl;
p1.Nhap();
cout << "\nNhap phan so thu hai: " << endl;
p2.Nhap();
cout << "\nCac phep toan phan so: " << endl;
p3.Cong(p1, p2);
p3.Tru(p1, p2);
p3.Nhan(p1, p2);
p3.Chia(p1, p2);
p1.Xuat(); cout << " + "; p2.Xuat(); cout << " = "; p3.Xuat(); cout << endl;
p1.Xuat(); cout << " - "; p2.Xuat(); cout << " = "; p4.Xuat(); cout << endl;
p1.Xuat(); cout << " x "; p2.Xuat(); cout << " = "; p5.Xuat(); cout << endl;
p1.Xuat(); cout << " : "; p2.Xuat(); cout << " = "; p6.Xuat(); cout << endl;
system("pause");
return 0;
}

You might also like