Xây dựng các hàm đệ qui tính các biểu thức như cout << "Nhap vao so nguyen duong n : "; cin >> cout << "Nhap he so vao so mu : "; sau: a. 𝑆1 = 1 + 2 + 3 + ⋯ + 𝑛 (n là số nguyên n; cin >> x >> n; dương) b. 𝑆2 = 1^ 2 + 2 ^2 + 3 ^2 + ⋯ + 𝑛 ^2 (n là cout << "Tong cac so tu 1 den " << n << " la : " << cout << x << " ^ " << n << " = " << mu(x, n) << số nguyên dương) c. 𝑆3 = 1 + 1/ 3 + 1 /5 + ⋯ + 1 /𝑛 tong(n) << endl; endl;} (n là số nguyên dương và là số lẻ) d. 𝑆4 = 1! + 2! + cout << "tong binh phuong cac so tu 1 den Bài 5.đếm số chữ số,số đảo ngược,tổng các chữ số 3! + ⋯ + 𝑛! (n là số nguyên dương) " << n << " la : " << tongbp(n) << endl; chẵn/lẻ của một số nguyên không âm #include<cmath> cout << "tong 1 + 1/2 + ....+ 1/" << n << " int dem(int n) int tong(int n) la : " << ps(n) << endl; { { cout << "Tong 1! + 2! +...+ " << n << "! = if (n < 10) if (n == 1) " << tonggt(n) << endl;} return 1; return 1; Bài 3. Viết hàm đệ qui tính giá trị Fibonacci của else else một số nguyên không âm return dem(n / 10) + 1; return tong(n - 1) + n; int fibo(int n) } } { void dao(int n) int tongbp(int n) if (n == 0) { { return 0; if (n < 10) if (n == 1) else cout << n; return 1; if (n == 1 || n == 2) else else return 1; { return tongbp(n - 1) + pow(n, 2); else cout << n % 10; } return fibo(n - 1) + dao(n / 10); double ps(int n) fibo(n - 2); } { } } if (n == 1) int main() return 1; { int tongch(int n) else int n; { return ps(n - 2) + 1 / (double)n; cout << "nhap vao so n : "; if (n == 0) } cin >> n; return 0; int gt(int n) cout << "gia tri fibonaci cua so " << n << " else { la : " << fibo(n) << endl;} if (n % 2 == 0) if (n == 0) Bài 4. Viết hàm đệ qui tính giá trị của x^ n ; với return tongch(n / 10) + return 1; x, n là số nguyên. n % 10; else double mu(int x, int n) else return gt(n - 1) * n; { return tongch(n / 10); } if (n == 0) } int tonggt(int n) return 1; int tongle(int n) { else { if (n == 1) if (n > 0) if (n == 0) return 1; return mu(x, n -1) * x; return 0; else else else return gt(n) + tonggt(n - 1); return mu(n, n +1) / x; if (n % 2 != 0) } } return tongle(n / 10) + int main() int main() n % 10; else cout << "Nhap so he nhi phan : "; else return tongle(n / 10); cin >> n; return(tong(a, n - 1) + a[n - 1]); } cout << "So He thap phan cua so " << n } int main() << " la : " << Bin2Dec(n) << endl;} int min(int a[], int n) { Bài 10. tìm ước số chung lớn nhất của hai số { int n; nguyên. if (n == 1) cout << "Nhap vao so nguyen : "; #include<cmath> return a[0]; cin >> n; int ucln(int a, int b) else cout << "So chu so cua " << n << " la : " { if (a[n - 1] < min(a, n - 1)) << dem(n) << endl; if (a == b) return a[n - 1]; cout << "So dao cua so " << n << " la : "; return a; else dao(n); else return min(a, n - 1); cout << "\nTong cac chu so chan la : " << if (a > b) } tongch(n) << endl; a = a - b; int main() cout << "Tong cac so le la : " << tongle(n) else { << endl;} b = b - a; int a[M], n; Bài 8. chuyển từ hệ thập phân sang nhị phân return ucln(a, b); cout << "Nhap vao so phan tu cau mang : "; int nhiphan(int n) } cin >> n; { int ucln1(int a, int b) cout << "Xuat mang : \n"; int a; { for (int i = 0; i < n; i++) if (n == 0) int r; { return 0; if (b == 0) a[i] = rand() % 20; else return a; cout << " " << a[i];} a = n % 2; { cout << "\nTong cac phan tu : " << tong(a, n) << return nhiphan(n / 2) * 10 + a; r = a % b; endl; a = b; b = r; cout << "Gia tri nho nhat : " << min(a, n) << endl;} } } int main() return ucln1(a, b); { int n; } cout << "Nhap vao so thap phan : "; int main() cin >> n; { cout << "So nhi phan la : " << nhiphan(n) << endl;} int a, b; Bài 9.chuyển nhị phân sang hệ thập phân cout << "Nhap hai so nguyen a b : "; int Bin2Dec(int n) cin >> a >> b; { cout << "UCLN cua " << a << " va " << b if (n == 1) << " la : " << ucln(a, b) << endl;} return 1; Bài 11. qui tính tổng các giá trị và tìm giá trị nhỏ else nhất của một mảng 1 chiều return (n % 10 + 2 * Bin2Dec(n / #include<cstdlib> 10)); const int M = 20; } int tong(int a[], int n) int main() { { if (n == 1) int n; return 1; CHƯƠNG 5 :STRUCT VÀ CLASS { Bài 3. kiểu dữ liệu NhanVien gồm : - Mã - Họ tên Bài 2. Định nghĩa kiểu dữ liệu PhanSo gồm tử số Phanso PC; kiểu string - Năm vào làm ,Năm sinh kiểu int và mẫu số (số nguyên). m tính tổng, hiệu, tích, PC.ts = p1.ts * p2.ms + p2.ts * p1.ms; - Nhập vào đầy đủ thông tin - Xuất lại thông tin . thương của 2 phân số PC.ms = p1.ms * p2.ms; - Tính tuổi và thâm niên : #include<cmath> PC = toigian(PC); #include<string> struct Phanso return PC; struct Nhanvien { } { int ts; Phanso trups(Phanso p1, Phanso p2) string ma; int ms; { string hoten; }; Phanso kq; int ns; void nhap(Phanso& ps) kq.ts= p1.ts * p2.ms - p2.ts * p1.ms; int nvl; { kq.ms = p1.ms * p2.ms; }; cout << "Nhap tu so : "; if (kq.ts != 0) void nhap(Nhanvien& nv) cin >> ps.ts; kq = toigian(kq); { do return kq; cout << "Nhap ma nhan vien : "; { } getline(cin, nv.ma); cout << "Nhap mau so : "; Phanso tichps(Phanso p1, Phanso p2) cout << "Nhap ho ten sinh vien : "; cin >> ps.ms; { getline(cin,nv.hoten); if (ps.ms == 0) Phanso kq; cout << "Nhap nam sinh : "; cout << "Nhap sai nhap lai\n"; kq.ts = p1.ts * p2.ts; cin >> nv.ns; } while (ps.ms == 0); kq.ms = p1.ms * p2.ms; cout << "Nhap nam vao lam viec : "; } kq = toigian(kq); cin >> nv.nvl; void xuat(Phanso ps) return kq; cout << endl; { } } cout << ps.ts << "/" << ps.ms; Phanso thuongps(Phanso p1, Phanso p2) void xuat(Nhanvien nv) } { { int ucln(int a, int b) cout << "----XUAT THONG TIN----\n"; { Phanso kq; cout << "Ma nhan vien : " << nv.ma << endl; a = abs(a); b = abs(b); kq.ts = p1.ts * p2.ms; cout << "Ho va ten : " << nv.hoten << endl; while (a != b) kq.ms = p1.ms * p2.ts; cout << "Nam sinh : " << nv.ns << endl; if (a > b) kq = toigian(kq); cout << "Nam lam viec : " << nv.nvl << endl; a = a - b; return kq; } else } void tuoi(Nhanvien nv) b = b - a; int main() { return a; { int y = 2023; } Phanso a, b, kq; int t = y - nv.ns; Phanso toigian(Phanso ps) cout << "Nhap phan so thu nhat \n "; cout << "Tuoi cua nhan vien : " << t << endl; { nhap(a); } Phanso kq; cout << "Nhap phan so thu hai \n "; void thamnien(Nhanvien nv) int d = ucln(ps.ts, ps.ms); nhap(b); { kq.ts = ps.ts / d; cout << "\nTong hai phan so : "; int y = 2023; kq.ms = ps.ms / d; kq = congps(a, b); int tn = y - nv.nvl; return kq; xuat(a); cout << "+"; xuat(b);cout<< " = "; cout << "Tham nien " << tn << " nam " << endl; } xuat(kq); cout << endl; } Phanso congps(Phanso p1, Phanso p2) TƯƠNG TỰ} int main() { cout << "Dia chi : " << sv.diachi << endl; } Nhanvien nv; cout << "Nam sinh : " << sv.ns << endl; char s; nhap(nv); cout << "Diem mon toan : " << sv.dt << endl; do xuat(nv); cout << "Diem mon van : " << sv.dv << endl; { tuoi(nv); cout << "Diem mon ngoai ngu : " << sv.dnn << int k; thamnien(nv); endl; do cout << endl;} } { Bài 4. kiểu dữ liệu SinhVien gồm : - Mã số Họ tên void diemtb(Sinhvien sv) cout << "Nhap STT - Địa chỉ kiểu string - Năm sinh kiểu int - Điểm { sinh vien muon truy xuat Hien co ( " << n << " sinn toán - Điểm văn - Điểm ngoại ngữ kiểu double : - cout << "DIEM TRUNG BINH\n"; vien trong danh sach )" << endl; Nhập vào thông (sĩ số không quá 45). cout << "MSSV: " << sv.ms << endl; cin >> k; - Xuất người dùng yêu cầu (thông qua việc nhập cout << "Hoo va ten : " << sv.hoten << endl; if (k > n) số thứ tự của sinh viên). double tb = ((sv.dt + sv.dv) * 2 + sv.dnn) / 5; cout << "Nhap sai nhap lai\n"; - Tính điểm trung bình và xuất lại thông tin mã cout << "Diem trung binh la : " << tb << endl; } while (k > n); số sinh viên, họ tên và điểm trung bình của từng } cout << "Xuat thong tin sinh sinh viên và xếp loại G K TB DTB. void xeploai(Sinhvien sv) vien thu : " << k << endl; #include<string> { xuat(sv[k - 1]); struct Sinhvien cout << "XEP LOAI SINH VIEN\n"; diemtb(sv[k - 1]); { double tb = ((sv.dt + sv.dv) * 2 + sv.dnn) / 5; xeploai(sv[k - 1]); string ms, hoten, diachi; if (tb >= 8) cout << "\nTiep tuc truy xuat (Y int ns = 0; cout << "Xep loai GIOI"; hoac N )" << endl; double dt = 0; if (tb >= 6.5 && tb < 8) cin >> s; double dv = 0; cout << "Xep loai KHA"; system("cls"); double dnn = 0; if (tb >= 5 && tb < 6) } while (s != 'N'); }; cout << "Xep loai TRUNG } void nhap(Sinhvien& sv) BINH"; Bài 5. kiểu dữ liệu Sach : - Tên . - Tên tác giả kiểu { if (tb < 5) mảng 1 chiều char, tối đa 20 ký tự. cout << "----NHAP THONG TIN SINH cout << "DUOI TRUNG BINH"; - Ngày tháng năm xuất bản kiểu struct NTN VIEN----\n"; } (ngày, tháng, năm ) cout << "Ma so sinh vien: "; int main() Viết : - Nhập vào thông tin của tối đa 50 quyển cin.ignore(); { sách. - Xuất lại thông tin của quyển sách nào đó getline(cin, sv.ms); int n; #include<string> cout << "\nHo va ten : ";getline(cin, sv.hoten); do struct ntn cout << "Dia chi : ";getline(cin, sv.diachi); { { cout << "Nam sinh : ";cin >> sv.ns; cout << "Nhap so luong sinh vien : "; int d, m, y; cout << "Diem mon toan : ";cin >> sv.dt; cin >> n; }; cout << "Diem mon van : ";cin >> sv.dv; if (n > 45) struct sach cout << "Diem mon ngoai ngu : ";cin >> sv.dnn; cout << "Nhap sai nhap lai\n"; { cout << endl; } while (n > 45); char tensach[20]; } Sinhvien* sv = new Sinhvien[n]; char tentg[20]; void xuat(Sinhvien sv) for (int i = 0; i < n; i++) ntn ngayxb; { { }; cout << "****XUAT THONG TIN****";; cout << "Sinh vien thu " << i + 1 << endl; void nhap(sach* s, int n) cout << "\nMa so sinh vien : " << sv.ms << endl; nhap(sv[i]); { cout << "Ho va ten : " << sv.hoten << endl; system("cls"); cout << "Nhap thong tin cua " << n << " timtg(s, n, tg); } quyen sach " << endl; delete[]s; cout << "\nXuat thong tin san pham : "; for (int i = 0; i < n; i++) s = 0;} for (int i = 0; i < n; i++) { Bài 6. SanPham gồm : - Mã kiểu char (tối đa 10 { cin.ignore(); ký tự) - Tên string. - Đơn giá double - Số lượng cout << "\nMa san pham : " << sp[i].masp; cout << "\nQuyen sach thu " << i + 1 << endl; tồn khoi nt. cout << "\nTen san pham : " << sp[i].tensp; cout << "\nTen sach : "; cin.getline(s[i].tensach, 20); Viết chương trình dùng cấp phát động và ký cout << "\nDon gia : " << sp[i].dongia; cout << "\nTen tac gia : "; cin.getline(s[i].tentg, 20); pháp độ dời để: - Nhập thông tin cho tối đa 30 cout << "\nSo luong ton kho : " << sp[i].sltk; cout << "\nNgay xuat ban : "; cin >> s[i].ngayxb.d; sản phẩm. - Xuất thông tin . - Sửa thông tin của cout << endl; cout << "\nThang xuat ban : "; cin >> s[i].ngayxb.m; một sản phẩm bất kỳ . - Xóa thông tin của một } cout << "\nNam xuat ban : "; cin >> s[i].ngayxb.y; sản phẩm bất kỳ . - Sắp xếp theo trình tự số cin.ignore(); } lượng tồn kho tăng dần. cout << "\nSua thong tin san pham "; cin.ignore(); #include<string> cout << "Nhap ma san pham : "; cin.getline(Ma, 10); } struct sanpham for (int i = 0; i < n; i++) void timtg(sach* s, int n, char* tg) { { { char masp[11]; if (!strcmp(sp[i].masp, Ma)) bool kq = false; string tensp; { cout << "Xuat thong tin tac gia : " << tg << endl; double dongia; cout<<"Ten san pham "<<sp[i].tensp<<" sua lai : "; for(int i=0;i<n;i++) int sltk; getline(cin, sp[i].tensp); if (!strcmp(s[i].tentg, tg)) }; cout << "Don gia " << sp[i].dongia << " sua lai : "; { int main() cin >> sp[i].dongia; cout << "\nTen sach :" << s[i].tensach << endl; { cout << "luong ton kho" << sp[i].sltk << " sua lai : "; cout << "Ngay xuat ban : " << s[i].ngayxb.d << "/" sanpham* sp, temp; cin >> sp[i].sltk; << s[i].ngayxb.m <<"/"<< s[i].ngayxb.y << endl; char Ma[11]; cin.ignore(); kq = true; int n; flag = true; } bool flag = false; break; if (!kq) do } cout << "Khong tim thay tac gia " << tg << endl; { } cout << "Nhap so sa pham : "; int main() cin >> n; } { if (n < 1 || n>30) if (flag) sach* s; cout << "Nhap sai nhap lai !!\n"; cout << "\nKhong tim thay san pham " << Ma; int n; } while (n < 1 || n>30); cout << "\nXoa thong tin san pham "; char tg[20]; sp = new sanpham[n]; cout << "\nNhap ma san pham"; cin.getline(Ma, 10); do cout << "Nhap thong tin san pham : "; for (int i=0;i<n;i++) { for (int i = 0; i < n; i++) if (!strcmp(sp[i].masp, Ma)) cout << "Nhap so luong sach : "; { { cin >> n; cout << "\nSan pham thu : " << i + 1; for (int k = 1; k < n - 1; k++) if (n < 1 || n>50) cin.ignore(); sp[k] = sp[k + 1]; cout << "Nhap sai nhap lai \n"; cout << "\nMa san pham : "; n--; } while (n < 1 || n>50); cin.getline(sp[i].masp, 10); break; s = new sach[n]; cout << "\nTen san pham : "; } nhap(s, n); getline(cin, sp[i].tensp); cout << "\nSap xep san pham theo so cout << "Nhap ten tac gia can tim : "; cout << "\nDon gia : "; cin >> sp[i].dongia; luong ton kho tang dan : "; cin.getline(tg, 20); cout << "\nso luong ton kho : "; cin >> sp[i].sltk; for(int i=0;i<n;i++) for (int j = i + 1; j < n; j++) } while (mauso == 0); phanso p1, p2, p3, p4, p5, p6; { } cout << "\nNhap phan so thu nhat : " << endl; temp = sp[i]; void phanso::xuat() p1.nhap(); sp[i] = sp[j]; { cout << "Nhap phan so thu hai :" << endl; sp[j] = temp; cout << tuso << "/" << mauso; p2.nhap(); } } cout << "\nCac phep toan phan so : " << endl; for (int i = 0; i < n; i++) void phanso::toigian() p3.cong(p1, p2); { { p4.tru(p1, p2); cout << "\nMa san pham : " << sp[i].masp; double a = abs(tuso), b = abs(mauso); p5.nhan(p1, p2); cout << "\nTen san pham : " << sp[i].tensp; while (a != b) p6.chia(p1, p2); cout << "\nDon gia : " << sp[i].dongia; { p1.xuat(); cout << " + "; p2.xuat(); cout << " = "; cout << "\nSo luong ton kho : " << sp[i].sltk << if (a > b) p3.xuat(); cout << endl; endl; a -= b; p1.xuat(); cout << " - "; p2.xuat(); cout << " = "; } else p4.xuat(); cout << endl; delete[]sp; b -= a; p1.xuat(); cout << " * "; p2.xuat(); cout << " = "; sp = 0; }; p5.xuat(); cout << endl; cout << endl;} tuso /= a; p1.xuat(); cout << " : "; p2.xuat(); cout << " = "; Bài 9. Viết lớp PhanSo với 2 biến tử số và mẫu số mauso /= b; p6.xuat(); cout << endl;} 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 ở void phanso::cong(phanso p1,phanso p2) mức public. tính cộng, trừ, nhân, chia giữa 2 { phân số. tuso = p1.tuso * p2.mauso + p2.tuso * p1.mauso; #include<cmath> mauso = p1.mauso * p2.mauso; class phanso toigian(); { } void phanso::tru(phanso p1, phanso p2) private: { double tuso, mauso; tuso = p1.tuso * p2.mauso - p2.tuso * p1.mauso; public: mauso = p1.mauso * p2.mauso; void nhap(); if (tuso != 0) void xuat(); toigian(); void cong(phanso, phanso); } void tru(phanso, phanso); void phanso::nhan(phanso p1, phanso p2) void nhan(phanso, phanso); { void chia(phanso, phanso); tuso = p1.tuso * p2.tuso; void toigian(); mauso = p1.mauso * p2.mauso; }; toigian(); void phanso::nhap() } { void phanso::chia(phanso p1, phanso p2) do { { tuso = p1.tuso * p2.mauso; cout << "Nhap vao tu so : "; cin >> tuso; mauso = p1.mauso * p2.tuso; cout << "Nhap vao mau so : "; cin >> mauso; } if (mauso == 0) int main() cout << "Nhap sai nhap lai !!\n"; {