Tải bản đầy đủ (.pdf) (24 trang)

ĐỀ TÀI MÔ PHỎNG CHƯƠNG TRÌNH QUẢN LÍ SÁCH đơn GIẢN

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (463.59 KB, 24 trang )

BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC CẦN THƠ
KHOA CƠNG NGHỆ


BÁO CÁO ĐỒ ÁN
MƠN: LẶP TRÌNH CĂN BẢN
NHĨM 1O
ĐỀ TÀI :”MƠ PHỎNG CHƯƠNG TRÌNH QUẢN LÍ SÁCH ĐƠN GIẢN”

GVHD
Phạm Duy Nghiệp

SINH VIÊN THỰC HIỆN
Lương Thanh Trọng
MSSV:B1907769
Nguyễn Quốc Trung
MSSV:B1907770
Nguyễn Phước Đạt
MSSV: B1907784
Nguyễn Thanh Phong
MSSV:B1907749
Nguyễn Phạm Đức Phương
MSSV:B1907750
Lê Hoàng Thái
MSSV:B1907815
Danh Ngọc Thanh
MSSV:1907757
Châu Tấn Tài
MSSV:B1907755


Cần Thơ , ngày 30 tháng 11 năm 2020
MỤC LỤC


ĐẠ I HỌ C CẦ N THƠ

Mục lục .................................................................................................1
Phần I: Giới thiệu đề tài......................................................................2
1.1 Lí do chọn đề tài ................................................................................2
1.2 Mục đích/Yêu cầu đề tài.....................................................................2
1.3 Phạm vi nghiên cứu và phương pháp nghiên cứu...............................2
Phần II: Thiết kế và viết chương trình.................................................3
2.1 Giải thuật chi tiết................................................................................3
2.1.1 Giải thuật bằng ngơn ngữ tự nhiên..................................................3
2.1.2 Giải thuật bằng lưu đồ.....................................................................4
2.2 Chương trình chi tiết.........................................................................13
Phần III: Kết luận…………………………………………….......21
3.1 Kết quả thiết kế chương trình...........................................................21
3.2 Hướng dẫn sử dụng chương trình.....................................................21
3.3 Nhận xét về ưu điểm và khuyết điểm của chương trình và hướng phát triển
...............................................................................................................22
3.3.1 Ưu điểm chương trình...................................................................22
3.3.2 Khuyết điểm chương trình.............................................................22
Phần IV: Phụ lục và tài liệu tham khảo..............................................23

1


ĐẠ I HỌ C CẦ N THƠ


PHẦN I
GIỚI THIỆU ĐỀ TÀI
1.1 Lí do chọn đề tài
Trong một xã hội phát triển tri thức khơng ngừng như hiện nay thì một người bạn
khơng thể thiếu của mỗi con người đó chính là sách. Hiện nay việc đọc sách khơng
cịn là sở thích riêng của một bộ phận nào mà nó đã trở thành thói quen ăn sâu vào
máu thịt của tất cả con người ở nhiều bộ phận, tầng lớp xã hội khác nhau. Nhờ vào
nhu cầu mua sách ngày càng cao như hiện nay của đọc giả đã thúc đẩy sự ra đời và
phát triển của những nhà sách lớn nhỏ có mặt ở khắp nơi từ thành thị đến nông
thôn với quy mộ lớn nhỏ khác nhau. Tuy nhiên có một hiện trạng thực tế thì ở một
số nhà sách, hiệu sách nhỏ ở các vùng nông thôn, nơi chưa tiếp cận được với sự
phát triển của công nghệ thơng tin thì các chủ nhà sách vẫn sử dụng cách ghi chép
thủ cơng để quản lí số lượng sách ở cửa hàng gây ra những phiền toái về việc nhập
và quản lí sách, khơng thể kiểm sốt được tối đa lượng sách nhập cũng như bán
sách. Vì lí do đó mà nhóm chúng tơi muốn tạo ra một chương trình quản lí sách
đơn giản để có thể đưa đến tay các chủ nhà sách, hiệu sách quy mô nhỏ để giúp họ
có thể quản lí tốt hơn nguồn sách và tiết kiệm thời gian trong việc kiểm tra quản lí
sách.
1.2 Mục đích và yêu cầu đề tài
-Mục đích: Tạo ra một chương trình quản lí sách đơn giản giúp ích cho việc quản
lí và kinh doanh sách ở các nhà sách, hiệu sách quy mô nhỏ.
-Yêu cầu đề tài: Có thể tạo ra một chương trình máy tính đơn giản trên nền tảng
ngơn ngữ lập trình C/C++ với các chức năng sau:
+Thêm sách mới vào bộ nhớ chương trình.
+Sửa đổi thơng tin sách mới.
+Xóa sách.
+Tìm kiếm sách.
+Mục lục.
+Phân loại thể loại sách.
1.3 Phạm vi nghiên cứu –Phương pháp nghiên cứu

Chương trình được lập trình và chạy thử trên phần mềm DEV C/C++ dựa trên
kiến thức cơ bản về các bài học tại lớp và một số nguồn tham khảo qua sách vở,
giáo trình, internet có liên quan đến các ứng dụng thực tế được phát triển dựa trên
nền tảng ngơn ngữ lập trình C.

2


ĐẠ I HỌ C CẦ N THƠ

PHẦN II
THIẾT KẾ VÀ VIẾT CHƯƠNG TRÌNH
Tóm tắt các cơng việc của chương trình “Quản lí sách đơn giản” như sau:
+ Thêm sách mới vào bộ nhớ chương trình.
+ Sửa đổi thơng tin sách.
+ Xóa sách.
+ Tìm kiếm sách.
+ Mục lục.
+ Phân loại thể loại sách.
2.1 Giải thuật chi tiết
2.1.1 Giải thuật bằng ngôn ngữ tự nhiên
- Giải thuật chương trình tổng quát: Chương trình quản lí sách đơn giản có 7 chức
năng tương ứng với 7 lệnh xuất hiện ở màn hình chính của chương trình gồm:
thêm sách mới, xóa sách, sửa sách, tìm kiếm sách, mục lục, thể loại sách, lưu và
thốt chương trình. Ngồi ra chương trình cịn có các chương trình đọc, ghi dữ
liệu, kiểm tra vị trí khơng hiện trên danh sách chính.
-Bước 1: Chương trình chính dùng lệnh switch(c) với c=(0…6), hiển thị ra màn
hình danh sách chức năng:
1. Thêm sách mới.
2. Sửa sách.

3. Xóa sách.
4. Tìm kiếm sách.
5. Mục lục.
6. Thể loại.
7. Lưu và thoát.
-Bước 2: Chọn chức năng cần thiết c=(0…6), nếu c khác từ 0 đến 6 thì quay lại
bước 1. Ngược lại nếu c=1 thực hiện bước 3.2, c=2 thực hiện bước 3.3, c=3 thực
hiện bước 3.4, c=4 thực hiện bước 3.5, c=5 thực hiện bước 3.6, c=6 thực hiện
bước 3.7, c=0 thực hiện bước 3.8.
-Bước 3: Thực hiện các chương trình con:
3.1 Kiểm tra sách: Hàm kiemTraSach(dsSach a) dùng lệnh for gán i, so sánh
chuỗi để xác định mã sách đã tồn tại hay chưa.
3.2 Thêm sách mới: thực hiện vòng lặp for …while, và thực hiện bước 3.1.
Nếu mã sách tồn tại thông báo lỗi, nếu mã sách chưa tồn tại tiếp tục nhập thông
tin sách thứ k+1.

3


ĐẠ I HỌ C CẦ N THƠ

3.3 Sửa sách: Nhập mã sách cần sửa x. Thực hiện bước 3.1 nếu x tồn tại thì
nhập thơng tin mới của sách, ngược lại khơng tìm thấy mã sách quay lại nhập mã
sách khác.
3.4 Xóa sách: Nhập MS x, thực hiện bước 3.1 nếu x tồn tại thì xóa x trong
dsSach a, ngược lại quay lại nhập MS khác.
3.5 Tìm kiếm sách: Nhập MS x, thực hiện bước 3.1, nếu x tồn tại, thực
hiện in thơng tin sách có MS x, ngược lại quay lại bước nhập MS x.
3.6 Mục lục: Đọc file dữ liệu D:\\DuLieu.txt , nếu a=0 thơng báo bạn chưa
có sách, ngược lại in tất cả sách trong dsSach a

3.7 Thể loại: Nhập thể loại sách cần tìm , dùng lệnh lặp for và so sánh
chuỗi. Nếu tìm thấy thể loại thì in liệt kê sách cùng thể loại. Ngược lại thơng báo
khơng có thể loại.
3.8 Lưu và thốt chương trình: thực hiện hàm ghi file và thốt chương trình.
-Bước 4: Kết thúc chương trình.
2.1.2 Giải thuật bằng lưu đồ
a. Lưu đồ chương trình tổng quát

4


ĐẠ I HỌ C CẦ N THƠ

Hình 1: Lưu đồ chương trình tổng quát
b. Lưu đồ các chương trình con:
1. Kiểm tra sách( hàm kiểm tra vị trí của sách thứ i): Dùng lệnh lặp for và
so sánh chuỗi để xác định vị trị mã sách x.

5


ĐẠ I HỌ C CẦ N THƠ

Hình 1: Lưu đồ hàm kiểm tra sách
2. Thêm sách mới:
B1: Nhập số sách thêm n
B2: Khai báo k, gán k=0
B3: So sánh k < n. Nếu sai thì kết thúc chương trình con. Ngược lại in ra
màn hình “ sách thứ k+1”. Thực hiện bước 4.
B4: Nhập Ms x , thực hiện hàm kiemTraSach, nếu đúng quay lại B4, nếu

sai thì nhập thơng tin sách và quay lại B3.

6


ĐẠ I HỌ C CẦ N THƠ

Hình 2: Lưu đồ thêm sách mới
3. Xóa sách :
B1: Nhập mã sách x.
B2. Thực hiện kiemTraSach, nếu x tồn tại ta thực hiện xóa sách với MS x
trong dsSach a, tiến hành ghi file. Ngược lại quay lai bước 1.

7


ĐẠ I HỌ C CẦ N THƠ

Hình 3: Lưu đồ xóa sách
4. Tìm kiếm sách.
B1: Nhập mã sách cần tìm x.
B2: Thực hiện hàm kiemTraSach, nếu x tồn tại thì in thông tin sách với mã
sách x trong dsSach a. Ngược lại quay lại bước 1.

8


ĐẠ I HỌ C CẦ N THƠ

Hình 4: Lưu đồ tìm kiếm sách

5. Mục lục
B1: In số lượng sách bạn đã lưu trong file.
B2: Thực hiên đọc file D:\\ DuLieu.txt, nếu dsSach a=0 thì thơng báo bạn
chưa lưu sách nào. Ngược lại in tất cả sách trong dsSach a.

9


ĐẠ I HỌ C CẦ N THƠ

Hình 5:Lưu đồ mục lục
6. Thể loại sách
B1: Khai báo i và t.
B2: Nhập thể loại sách.
B3: Vòng lặp for, gán i=0, xét điều kiện i<= a.S -1. Nếu đúng thì thực hiện
so sánh chuỗi tìm thể loại sách trong a và in thơng tin, tiếp tục tăng i lên 1 đơn vị,
quay lại xét điều kiện. Ngược lại nếu điều kiện sai , thì thơng báo khơng tìm thấy
sách, quay lại B2.

10


ĐẠ I HỌ C CẦ N THƠ

Hình 6: Lưu đồ thể loại sách
7. Sửa sách:
B1: Nhập MS x cần sửa.
B2: Thực hiện kiemTraSach với x. Nếu x không tồn tại thì thơng báo khơng
tìm thấy mã sách, quay lại bước 1. Ngược lại thì thơng báo nhập thơng tin sách
mới, ghi file.


11


ĐẠ I HỌ C CẦ N THƠ

Hình 7: Lưu đồ sửa sách
8. Chương trình chính
B1: Khai báo c, DSS.
B2: In ra màn hình giao diện chương trình.
B3: Sử dụng cấu trúc lựa chọn switch(c).

12


ĐẠ I HỌ C CẦ N THƠ

Hình 8: Lưu đồ chương trình chính
Ngồi ra chương trình cịn có một số hàm chương trình hỗ trợ những chương trình
con và chương trình chính như đọc file, ghi file...
2.2 Chương trình chi tiết

#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
/* Khai bao */
typedef struct{
char TenSach[50];

char MaSach[50];
char TheLoai[50];
char nxb[50];

13


ĐẠ I HỌ C CẦ N THƠ
}sach;
typedef struct {
sach ds[100];
int S;
}dsSach;
void manhinh();
void themSach(dsSach *a);
void timkiemSach(dsSach a);
void xoaSach(dsSach *a);
void suaSach(dsSach *a);
void sachTheLoai(dsSach a);
void inTatCaSach(dsSach a);
int kiemTraSach(dsSach a,char x[50]);
void docfilemucluc(dsSach *a);
void ghifile(dsSach a);
void insertBook(sach s, dsSach *a);
void docfiledau(dsSach *a);
/*

Cac Ham

*/


int kiemTraSach(dsSach a, char x[50]){
for(int i=0;iif(!strcmp(a.ds[i].MaSach,x))
return i;// ma sach ton tai
}
return a.S+1;// ma sach khong ton tai
}
void insertBook(sach s, dsSach *a){
a->ds[a->S-1]=s;
}
void themSach(dsSach *a){
int n ;
char x[50];
sach s;
printf("Tong so sach ban da luu la: %d\n\n", a->S);
printf("*************** Them Sach ***************\n");
printf(" \nNhap so sach them: ");
scanf("%d",&n);
for(int k=0; kprintf("\nNhap sach thu %d ", k+1);
do{
printf("\nNhap ma sach: ");

14


ĐẠ I HỌ C CẦ N THƠ
scanf("%s",x);
if (kiemTraSach(*a, x)>a->S)

break;
system("cls");
printf("\nMa sach da ton tai. Ban hay nhap lai...");
}
while(1);
strcpy(s.MaSach,x);
printf("\nNhap ten sach ");
fflush(stdin);
gets(s.TenSach);
printf("\nNhap the loai sach ");
gets(s.TheLoai);
printf("\nNhap ten nha xuat ban ");
gets(s.nxb);
a->S++;
insertBook(s, a);
ghifile(*a);
}
}// ham them sach
void timkiemSach(dsSach a){
int vitri;
sach sachtim;
char x[30];
printf("Tong so sach ban da luu la: %d\n", a.S);
printf("\n *************** Tim Kiem Sach ***************");
do{
printf("\nNhap ma sach can tim: ");
scanf("%s",x);
vitri=kiemTraSach(a,x);
if(vitri<=a.S)
break;

system("cls");
printf("\nMa sach khong ton tai. Vui long nhap ma sach khac");
}
while(1);
printf("\n_________________Thong Tin__________________\n\n");
printf(" %20s %20s %20s
%20s\n","Ma Sach", "Ten Sach", "The
Loai", "Nha Xuat Ban");
printf("%20s %20s - %20s - %20s\n",a.ds[vitri].MaSach,
a.ds[vitri].TenSach, a.ds[vitri].TheLoai, a.ds[vitri].nxb);
printf("\nSach o vi tri: %d\n", vitri+1);
}// ham tim kiem sach

15


ĐẠ I HỌ C CẦ N THƠ
void xoaSach(dsSach *a){
sach sachcanxoa;
char x[50];
int vitri,bienlap;
printf("Tong so sach ban da luu la: %d\n", a->S);
printf("\n *************** Xoa Sach ***************");
do{
printf("\nNhap ma sach can xoa: ");
scanf("%s",x);
vitri=kiemTraSach(*a,x);
if(vitri>-1);
break;
system("cls");

printf("\n Khong tim thay ma sach. vui long nhap lai");
}
while (1);
for(bienlap=vitri;bienlap<=a->S-1;bienlap++)
a->ds[bienlap]=a->ds[bienlap+1];
a->S--;
ghifile(*a);
printf("\nDa xoa xong");
} // ham xoa sach
void suaSach(dsSach *a){
int vitri, sosachthem=0;
sach sachcansua;
char x[50];
printf("Tong so sach ban da luu la: %d\n", a->S);
printf("\n*************** Sua Chi Tiet Sach ***************");
printf("\nNhap ma sach can sua: ");
scanf("%s",x);
vitri=kiemTraSach(*a, x);
if(vitri>a->S)
printf("\nKhong tim thay ma sach");
else{
strcpy(a->ds[vitri].MaSach,x);
printf("\nNhap ten sach: ");
fflush(stdin);
gets(x);
strcpy(a->ds[vitri].TenSach,x);
printf("\nNhap the loai: ");
fflush(stdin);
gets(x);
strcpy(a->ds[vitri].TheLoai,x);


16


ĐẠ I HỌ C CẦ N THƠ
printf("\nNhap nha xuat ban: ");
fflush(stdin);
gets(x);
strcpy(a->ds[vitri].nxb,x);
}
ghifile(*a);
}// ham sua sach
void sachTheLoai(dsSach a){
char x[50];
sach s;
int t=0, i;
printf("Tong so sach ban da luu la: %d\n", a.S);
printf("*************** Thong Ke The Loai Sach ***************\n");
printf("\nNhap the loai can thong ke: ");
fflush(stdin);
gets(x);
printf("\n_____________Thong tin sach theo the loai______________\n");
printf("
%20s %20s %20s
%20s\n","Ma Sach", "Ten
Sach", "The Loai", "Nha Xuat Ban");
for(i=0;i<=a.S-1;i++){
if(strcmp(a.ds[i].TheLoai,x)==0){
t++;
printf("\n Sach tim thay thu %d: ",t);

printf("%20s - %20s - %20s - %20s\n", a.ds[i].MaSach,
a.ds[i].TenSach, a.ds[i].TheLoai, a.ds[i].nxb);
}
}
if(!t){
system("cls");
printf("\n Khong co the loai sach nay");
}
}// ham the loai
void inTatCaSach(dsSach a){
docfilemucluc(&a);
}// ham in tu ham docfilemucluc
void docfiledau(dsSach *a){
FILE *f;
sach s;
a->S=0;
int i=0, k;
f=fopen("D:\\Dulieu.txt","r");
17


ĐẠ I HỌ C CẦ N THƠ
rewind(f);
do{
fscanf(f,"%d - %s - %s - %s - %s",&a->S ,a->ds[i].MaSach,
a->ds[i].TenSach, a->ds[i].TheLoai, a->ds[i].nxb);
i++;
}while(!feof(f));
fclose(f);
}// ham doc file

void docfilemucluc(dsSach *a){
FILE *f;
sach s;
int i=0, k;
printf("Tong so sach ban da luu la: %d\n", a->S);
printf("*************** Muc Luc Sach ***************\n\n");
printf(" %s %20s %20s %20s %20s \n", "SoTT", "Ma Sach", "Ten
Sach", "The Loai", "Nha Xuat Ban");
printf("----------------------------------------------------------------------------------------------------\n");
f=fopen("D:\\Dulieu.txt","r");
rewind(f);
if(a->S==0)
printf(" \n Ban Chua Co Sach Nao, Hay Them Sach \n");
else{
do{
fscanf(f,"%d - %s - %s - %s - %s",&a->S ,a->ds[i].MaSach,
a->ds[i].TenSach, a->ds[i].TheLoai, a->ds[i].nxb);
i++;
}while(!feof(f));
fclose(f);
for(int i=0;i<a->S;i++){
printf(" %3d - %20s - %20s - %20s - %20s\n",i+1, a>ds[i].MaSach, a->ds[i].TenSach, a->ds[i].TheLoai, a->ds[i].nxb);
}
}
}// ham docfilemucluc
void ghifile(dsSach a){
FILE *f;
sach s;
int i;
f=fopen("D:\\Dulieu.txt","w");

for(int i=0;i
18


ĐẠ I HỌ C CẦ N THƠ
fprintf(f,"%3d - %30s - %30s - %30s - %30s\n",i+1, a.ds[i].MaSach,
a.ds[i].TenSach, a.ds[i].TheLoai, a.ds[i].nxb);
fclose(f);
}// ham ghi
/*

CT Chinh

*/

int main (){
dsSach DSS;
int c;
docfiledau(&DSS);
manhinhchinh:
printf("\n___________Chuong Trinh quan li sach don
gian_________");
printf("\n1.Them Sach Moi");
printf("\n2. Sua Sach");
printf("\n3. Xoa Sach");
printf("\n4. Tim Kiem Sach");
printf("\n5. Muc Luc");
printf("\n6. The loai sach");
printf("\n0. Thoat");

printf("\n Nhap lua chon cua ban: ");
scanf("%d", &c);
printf("%d", c);
system("cls");
switch(c)
{
case 0:
goto thoatchuongtrinh;
break;
case 1:
themSach(&DSS);
break;
case 2:
suaSach(&DSS);
break;
case 3:
xoaSach(&DSS);
break;
case 4:
timkiemSach(DSS);
break;
case 5:
inTatCaSach(DSS);
break;
19


ĐẠ I HỌ C CẦ N THƠ
case 6:
sachTheLoai(DSS);

break;
default:
printf("\n Chuc nang khong hop le");
}
do{
printf("\n An bat ki de tro ve man hinh chinh");
int manhinhchinh=getch();
break;
}
while(1);
system("cls");
goto manhinhchinh;
thoatchuongtrinh:
do{
printf("\n Ket thuc chuong trinh, chuong trinh da duoc luu");
printf("\n Nhap T de luu va thoat chuong trinh");
fflush(stdin);
int thoat=getch();
if(thoat=='T'||thoat=='t'){
break;
}
}while(1);
return 0;
}
PHẦN III
KẾT LUẬN
3.1 Kết quả đạt được
- Về mục tiêu đề ra: Nhóm đã thiết kế cơ bản thành cơng chương trình quản lí
sách đơn giản dành cho các nhà sách, hiệu sách quy mô nhỏ với đầy đủ những
chức năng cần thiết cơ bản.

- Về yêu cầu: Nhóm đã thiết kế và thực hiện được hầu hết những yêu cầu ban đầu
đã đề ra:
+ Thêm sách mới.
+ Sửa đổi thơng tin sách.
+ Xóa sách khỏi bộ nhớ.
+ Tìm kiếm sách.
+ Mục lục.
+ Thể loại sách.
+ Lưu và thốt chương trình.
20


ĐẠ I HỌ C CẦ N THƠ

3.2 Hướng dẫn sử dụng chương trình
-Bước 1: Phiên dịch và thực thi chương trình chương trình sẽ xuất hiện bảng dưới
đây:

-Bước 2: Chọn 1 trong các tính năng của chương trình theo thứ tự. Nhập các thơng
tin từ bàn phím theo u cầu của chương trình.
-Bước 3: Nhấn chọn 0 để thốt chương trình.
3.3 Nhận xét về ưu điểm và khuyết điểm của chương trình và hướng phát
triển
3.3.1 Ưu điểm của chương trình
Chương trình được tạo ra theo đúng yêu cầu từ đầu đề ra là một chương trình
khơng q phức tạp, dễ sử dụng, có thể tiếp cận được với những người dùng
khơng có nhiều kiến thức về cơng nghệ với giao diện đơn giản, trực quan tuy
nhiên chương trình vẫn thực hiện được tương đối đầy đủ những nhu cầu về quản lí
sách của người sử dụng.Ngồi ra chương trình có thể thu thập và lưu trữ số lượng
lớn sách giúp người dung có thể quản lí được nhiều đầu sách khác nhau trong cửa

hàng
3.3.2 Hạn chế của chương trình
Chương trình vẫn chưa thực hiện được các công việc cần thiết khác như in hóa
đơn bán lẻ, ghi nhận đánh giá của người đọc về sách, thống kê các sách bán chạy,
nhập vào một lần nhiều sách cùng loại, chưa thực hiện được chương trình con đếm
số lần thực hiện chương trình,…
 Hướng phát triển: Trong thời gian tới nhóm sẽ tiếp tục cải tiến và bổ sung
các chức năng cần thiết khác để chương trình có thể hồn thiện hơn. Nhóm
đề ra mục tiêu sẽ them một số chức năng khác vào chương trình như: in hóa

21


ĐẠ I HỌ C CẦ N THƠ
đơn bán lẻ, quản lí số lượng sách bán ra, chức năng ghi nhận đánh giá sách
của người đọc, thống kê các sách có doanh thu cao,…
PHẦN IV
PHỤ LỤC VÀ TÀI LIỆU THAM KHẢO
4.1 Tài liệu tham khảo chương trình quản lí thư viện.
- Link: />- Link chương trình quản lí sinh viên />- />
22


ĐẠ I HỌ C CẦ N THƠ

23




×