Tài liệu ÔN TẬP BÀI TẬP THỰC HÀNH LẬP TRÌNH doc

16 723 3
Tài liệu ÔN TẬP BÀI TẬP THỰC HÀNH LẬP TRÌNH doc

Đ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

ÔN TẬP BÀI TẬP THỰC HÀNH LẬP TRÌNH WINDOW ****************************************************** Bài 1: IDC_EDIT_A IDC_EDIT_B IDC_STATIC_KETQUA IDC_BUTTON_TINH chọn BN_CLICKED IDC_RADIO_CONG Chọn Group Radio Button Group Box chọn Tab stop void CBai1_1Dlg::OnButtonTinh() { UpdateData (true); float kq; switch (m_pheptinh) { case 0: kq=m_a + m_b; break; case 1: kq=m_a - m_b; break; case 2: kq=m_a * m_b; break; case 3: kq=m_a / m_b; break; } m_ketqua.Format ("%0.0f",kq); UpdateData (false); } Bài 2: IDC_EDIT_NHAP IDC_LIST 1 IDC_LIST2 IDC_BUTTON_PHAI chọn BN_CLICKED IDC_BUTTON_TRAI chọn BN_CLICKED IDC_BUTTON_NHAP chọn BN_CLICKED void CBai1_2Dlg::OnButtonNhap() { UpdateData (true); m_list1.AddString (m_nhap); m_nhap.Empty (); UpdateData(false); } ****************************************************** void CBai1_2Dlg::OnButtonPhai() //click button chuyen du lieu qua phai { UpdateData (true); CString s; int i; i=m_list1.GetCurSel (); m_list1.GetText (i,s); m_list2.AddString (s); m_list1.DeleteString(i); UpdateData (false); } ****************************************************** void CBai1_2Dlg::OnButtonTrai() //click button chuyen du lieu qua trai { int j,i,tong; CString s; //thuc hien viec chuyen cac gia tri duoc chon qua list1 tong=m_list2.GetCount ();//tinh tong cac dong trong listcontrol for (j=0;j<tong;j++ ) { if (m_list2.GetSel(j)==1) { m_list2.GetText (j,s); m_list1.AddString (s); m_list2.DeleteString (j); } } //thuc hien xoa cac gia tri bi chuyen trong list2 tong=m_list2.GetCount (); for (i=0;i<tong;i++ ) { if (m_list2.GetSel(i)==1) { m_list2.DeleteString (i); } } } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Bài 3: IDC_COMBO1 chọn: à CBN_SELCHANGE à CBN_SELENDOK IDC_STATIC_1 chọn Group Group Box Vào ComboBox chuột phải chọn Properties à Data: nhập dữ liệu vào (chọn Ctrl+Enter để xuống hàng) Trong thẻ General à Type: + DropDown: cho phép lựa chọn + nhập dữ liệu + DropList: không nhập được dữ liệu + Simple: hiển thị giống listbox void CBai1_4Dlg::OnSelendokCombo1() { UpdateData (true); m_ketqua.Empty (); int i=m_combo.GetCurSel (); CString s,s1,s2; m_combo.GetLBText (i,s); int gt=i+1,tinh; for(int j=1;j<=10;j++) { tinh=gt*j; s1.Format ("%.0d",j); s2.Format ("%.0d",tinh); m_ketqua=m_ketqua + s +" x "+ s1 +"= "+ s2 +"\n"; } UpdateData (false); } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Bài 4: IDC_EDIT_at IDC_EDIT_bt IDC_EDIT_kqt IDC_EDIT_a a IDC_EDIT_b a IDC_EDIT_kqa IDC_RADIO_CONG chọn Group IDC_BUTTON_TINH chọn BN_CLICKED Group Box chọn Tab stop Bài này chúng ta phải khai báo thêm lớp COMPLEX Insert à New Class à - ClassType: Generic Class - Name: COMPLEX - FileName: COMPLEX.cpp - Base class(es): + Derived From: CObject + As: public ****************************************************** COMPLEX.h class COMPLEX : public CObject { protected: double thuc; double ao; public: //phuong thuc cap nhat du lieu void SetComplex(double t,double a); //nguyen mau phuong thuc tra ve phan thuc double GetThuc(); //nguyen phuong thuc tra ve phan ao double GetAo(); //nguyen mau phuong thuc cong hai so phuc COMPLEX cong(COMPLEX z); //nguyen mau phuong thuc tru hai so phuc COMPLEX tru(COMPLEX z); //nguyen mau phuong thuc nhan hai so phuc COMPLEX nhan(COMPLEX z); //nguyen mau phuong thuc chia hai so phuc COMPLEX chia(COMPLEX z); //nguyen mau ham tao hai tham so COMPLEX(double t,double a); //nguyen mau ham tao khong tham so COMPLEX(); //nguyen mau ham huy virtual ~COMPLEX(); //nguyen mau ham tao sao chep COMPLEX(COMPLEX& z); //nguyen mau phuong thuc toan tu + COMPLEX operator +(COMPLEX z); //nguyen mau phuong thuc toan tu - COMPLEX operator -(COMPLEX z); //nguyen mau phuong thuc toan tu * COMPLEX operator *(COMPLEX z); //nguyen mau phuong thuc toan tu / COMPLEX operator /(COMPLEX z); //nguyen mau phuong thuc toan tu = COMPLEX& operator =(COMPLEX& z); }; ****************************************************** COMPLEX.cpp //dinh nghia phuong thuc toan tu = COMPLEX& COMPLEX::operator =(COMPLEX& z) { thuc=z.thuc; ao=z.ao; return *this; } //dinh nghia phuong thuc toan tu + COMPLEX COMPLEX::operator +(COMPLEX z) { COMPLEX t(thuc+z.thuc,ao+z.ao); return t; } //dinh nghia phuong thuc toan tu - COMPLEX COMPLEX::operator -(COMPLEX z) { COMPLEX t(thuc-z.thuc,ao-z.ao); return t; } //dinh nghia phuong thuc toan tu * COMPLEX COMPLEX::operator *(COMPLEX z) { COMPLEX t(thuc*z.thuc,ao*z.ao); return t; } //dinh nghia phuong thuc toan tu / COMPLEX COMPLEX::operator /(COMPLEX z) { COMPLEX t(thuc/z.thuc,ao/z.ao); return t; } //dinh nghia ham tao sao chep COMPLEX::COMPLEX(COMPLEX& z) { thuc=z.thuc; ao=z.ao; } //dinh nghia ham huy COMPLEX::~COMPLEX() { } //dinh nghia ham tao khong tham so COMPLEX::COMPLEX() { thuc=0; ao=0; } //dinh nghia ham tao hai tham so COMPLEX::COMPLEX(double t,double a) { thuc=t; ao=a; } //dinh nghia phuong thuc cong hai so phuc COMPLEX COMPLEX::cong(COMPLEX z) { COMPLEX t; t.thuc=thuc+z.thuc; t.ao=ao+z.ao; return t; } //dinh nghia phuong thuc tru hai so phuc COMPLEX COMPLEX::tru(COMPLEX z) { COMPLEX t; t.thuc=thuc-z.thuc; t.ao=ao-z.ao; return t; } //dinh nghia phuong thuc nhan hai so phuc COMPLEX COMPLEX::nhan(COMPLEX z) { COMPLEX t; t.thuc=thuc*z.thuc; t.ao=ao*z.ao; return t; } //dinh nghia phuong thuc chia hai so phuc COMPLEX COMPLEX::chia(COMPLEX z) { COMPLEX t; t.thuc=thuc/z.thuc; t.ao=ao/z.ao; return t; } //dinh nghia phuong thuc cap nhat du lieu void COMPLEX::SetComplex(double t,double a) { //this->thuc=t; //this->ao=a; thuc=t; ao=a; } //dinh nghia phuong thuc tra ve phan thuc double COMPLEX::GetThuc() { return thuc; } double COMPLEX::GetAo() { return ao; } ****************************************************** Viết trong Dialog chính.cpp oid CBai2Dlg::OnButtonTinh() { COMPLEX a,b,kq; UpdateData(true); a.SetComplex(m_a_thuc,m_a_ao); b.SetComplex(m_b_thuc,m_b_ao); switch (m_pheptinh) { case 0: kq=a+b; break; case 1: kq=a-b; break; case 2: kq= a*b; break; case 3: kq=a/b; break; } m_ketqua_thuc=kq.GetThuc(); m_ketqua_ao=kq.GetAo(); UpdateData(false); } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Cách tạo môt ứng dụng trong Microsoft Visual C++ File à New àXuất hiện cửa sổ New, ta chọn thẻ Projects, sau đó chọn đủ 3 bước sau: B1: Chọn MFC AppWizard(exe) B2: Xác định thư mục chứa ứng dụng trong mục Location B3: Đặt tên cho ứng dụng trong mục Project Name àXuất hiện cửa sổ MFC AppWizard àChọn Dialog Based %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Bài 5: Tương tự như bài 4 chúng ta cũng khai báo thêm lớp COMPLEX Viết trong Dialog chính.cpp void CBai3Dlg::OnButtonNhap() { UpdateData(true); COMPLEX* p; p=new COMPLEX(m_thuc,m_ao); ds.Add(p); m_list1.AddString(p->Print()); } void CBai3Dlg::OnButtonCong() { COMPLEX* p; COMPLEX s; for(int i=0;i<ds.GetSize();i++) { p=(COMPLEX*)ds.GetAt(i); s=s+(*p); } m_static_cong=s.Print(); UpdateData(false); } IDC_EDIT_THUC IDC_EDIT_AO IDC_STATIC_CONG IDC_LIST1 IDC_BUTTON_NHAP chọn BN_CLICKED IDC_BUTTON_CONG chọn BN_CLICKED List Box chọn tap stop Bài 6: Editbox Các nút nhớ add BN_CLICKED Group Box List Box chọn Tap stop Khai báo thêm lớp RATIO: RATIO.h class RATIO : public CObject { private: int tuso; int mauso; public: virtual ~RATIO(); // ham huy // ham tao RATIO(); RATIO(int a,int b); RATIO(RATIO& c); // ham tao sao chep void SetPhanSo(int a, int b); // gan gia tri phan so // tra ve tu so va mau so int GetTu(); int GetMau(); // nguyen mau cac toan tu ket hop, co ban, so sach RATIO operator=(RATIO a); RATIO operator+(RATIO a); RATIO operator-(RATIO a); RATIO operator*(RATIO a); RATIO operator/(RATIO a); RATIO operator+=(RATIO a); RATIO operator-=(RATIO a); RATIO operator*=(RATIO a); RATIO operator/=(RATIO a); bool operator==(RATIO a); bool operator>(RATIO a); bool operator>=(RATIO a); // ham rut gon phan so: RATIO Reduce(RATIO a); CString Print(); }; ************************************************************* RATIO.cpp ATIO::RATIO() { tuso=mauso=0; } RATIO::RATIO(int a,int b) { tuso=a; mauso=b; } RATIO::RATIO(RATIO& c) { tuso=c.tuso; mauso=c.mauso; } RATIO:: ~RATIO() { } void RATIO::SetPhanSo(int a, int b) { tuso=a; mauso=b; } int RATIO::GetTu() { return tuso; } int RATIO::GetMau() { return mauso; } RATIO RATIO::operator=(RATIO a) { tuso=a.tuso; mauso=a.mauso; return *this; } RATIO RATIO::operator+(RATIO a) { tuso=tuso*a.mauso+a.tuso*mauso; mauso=mauso*a.mauso; return Reduce(*this); } RATIO RATIO::operator-(RATIO a) { tuso=tuso*a.mauso-a.tuso*mauso; mauso=mauso*a.mauso; return Reduce(*this); } RATIO RATIO::operator*(RATIO a) { tuso=tuso*a.tuso; mauso=mauso*a.mauso; return Reduce(*this); } RATIO RATIO::operator/(RATIO a) { tuso=tuso*a.mauso; mauso=mauso*a.tuso; return Reduce(*this); } RATIO RATIO::operator+=(RATIO a) { *this=a+(*this); return *this; } RATIO RATIO::operator-=(RATIO a) { *this=a-(*this); return *this; } RATIO RATIO::operator*=(RATIO a) { *this=a*(*this); return *this; } RATIO RATIO::operator/=(RATIO a) { *this=a/(*this); return *this; } bool RATIO::operator==(RATIO a) { RATIO b; b= Reduce(*this); a=Reduce(a); if((a.tuso=b.tuso)&&(a.mauso=b.mauso)) return true; return false; } bool RATIO::operator>(RATIO a) { if((((double)tuso/(double)mauso)-((double)a.tuso/(double)a.mauso))>0) return true; return false; } bool RATIO::operator>=(RATIO a) { if(((double)tuso/(double)mauso)>=((double)tuso/(double)mauso)) return true; return false; } RATIO RATIO::Reduce(RATIO p) { int a=abs(p.tuso); int b=abs(p.mauso); while(a!=b) { if(a>b) a-=b; else b-=a; } p.tuso=p.tuso/a; p.mauso=p.mauso/a; return p; } CString RATIO::Print() { CString s_tuso,s_mauso,s; if(tuso>0) { s_tuso.Format("%d",tuso); s_mauso.Format("%d",mauso); s=s_tuso +"/"+s_mauso; } else { s_tuso.Format("%d",tuso); s_mauso.Format("%d",mauso); s="-"+s_tuso +"/"+s_mauso; } return s; } ****************************************************** Viết trong dialog chính .cpp void CBaitapTH_5_PhansoDlg::OnButton1() { UpdateData(true); RATIO* p; p=new RATIO(m_tuso,m_mauso); ds.Add(p); m_list.AddString(p->Print()); UpdateData(false); } void CBaitapTH_5_PhansoDlg::OnButton2() { UpdateData(true); if(ds.GetSize()==0) { MessageBox("Ko co phan tu nao de tin kiem !","Thong bao"); } else { RATIO* p; RATIO s=(*(RATIO*)ds.GetAt(0)); for(int i =0;i<ds.GetSize();i++) { p=(RATIO*)ds.GetAt(i); if(s>(*p)) s=(*p); } m_kq_tuso=s.GetTu(); m_kq_mauso = s.GetMau(); UpdateData(false); } } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Bài 7: IDC_STATIC_CHUCHAY IDC_CHECK1 chọn BN_CLICKED Viết trong BOOL CBai1_3Dlg::OnInitDialog() UpdateData (true); m_chuchay="- DOC LAP - TU DO - HANH PHUC "; i=1; UpdateData (false); ****************************************************** void CBai1_3Dlg::OnCheck1() { UpdateData (true); if(m_check) { SetTimer (1,100,NULL); } else { KillTimer (1); } UpdateData (false); } void CBai1_3Dlg::OnTimer(UINT nIDEvent) { UpdateData (true); switch(nIDEvent ) { case 1: int dodai; CString s,s1,s2; s=m_chuchay; dodai=s.GetLength (); s1=m_chuchay.Left (dodai-1); s2=m_chuchay.Right (1); s.Replace (s,s1); m_chuchay=s2+s; break; } UpdateData (false); CDialog::OnTimer(nIDEvent); } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Bài 8: Tên menu: IDR_MENU1 IDC_EDIT_HOTEN IDC_DATETIMEPICKER_NGAYDE N IDC_DATETIMEPICKER_NGAYDI IDC_EDIT_SONGAY IDC_EDIT_TIENTRA IDC_BUTTON_TINHTIEN IDC_BUTTON_RESET IDC_LIST1 Radio Button Group Box chọn Tap stop ControlID(s) Messages ID_FILE_OPEN COMMAND ID_FILE_EXIT ID_FILE_SAVE IDC_BUTTON_RESET BN_CLICKED IDC_BUTTON_TINHTIEN IDC_LIST1 NM_DBLCLK CKhachsanDlg Serialize Khai báo thêm một lớp thông tin thongtin.h class Cthongtin : public CObject { public: DECLARE_SERIAL(Cthongtin) void Serialize(CArchive& ar); long mtientra; int msongay; int mloai; CString mhoten,mngayden,mngaydi; Cthongtin(); virtual ~Cthongtin(); }; thongtin.cpp void Cthongtin::Serialize(CArchive& ar) { if (ar.IsStoring()) { // storing code ar<<mhoten<<mngayden <<mngaydi <<mloai<<msongay <<mtientra; } else { // loading code ar>>mhoten>>mngayden >>mngaydi >>mloai>>msongay >>mtientra; } } Khachsan.cpp void CKhachsanDlg::OnButtonTinhtien() { UpdateData (true); CString s1,s2,s3,s4,s5; if(m_ngayden >=m_ngaydi || m_hoten.IsEmpty () || m_loai ==-1) MessageBox ("Chua nhap, hay chon gia tri roi? ","Thong bao",MB_ICONEXCLAMATION); else { COleDateTimeSpan giatri; giatri=m_ngaydi - m_ngayden; //todo:phai ep kieu du lieu ngay thang nam khi lay ra //m_static.Format ("%d",(int)giatri.GetTotalDays ()); m_songay=(int)giatri.GetTotalDays (); m_tientra=(long)m_songay * loaiphong ();//co phuong thuc go ham loaiphong() UpdateData (false); s1.Format ("%d",m_songay); s2.Format ("%.0ld",m_tientra); s3.Format ("%ld",loaiphong ()); s4.Format ("%d/%d/%d",m_ngayden.GetDay (),m_ngayden .GetMonth (),m_ngayden .GetYear ()); s5.Format ("%d/%d/%d",m_ngaydi.GetDay (),m_ngaydi .GetMonth (),m_ngaydi .GetYear ()); int n; n=m_list.GetItemCount (); m_list.InsertItem (n,m_hoten); m_list.SetItemText (n,1,s4); //add ngay den vao ListCtrl m_list.SetItemText (n,2,s5); //add ngay di vao ListCtrl m_list.SetItemText (n,3,s3); //add loai phong vao ListCtrl m_list.SetItemText (n,4,s1); //add so ngay thue vao ListCtrl m_list.SetItemText (n,5,s2 +" " "VND"); //add tien tra vao ListCtrl Cthongtin *p=new Cthongtin (); p->mhoten =m_hoten; p->mngayden =s4; p->mngaydi =s5; p->mloai =loaiphong(); p->msongay =m_songay; p->mtientra =m_tientra; mArray.Add (p); m_reset.ShowWindow (true); m_tinhtien.ShowWindow (false); } } long CKhachsanDlg::loaiphong() { switch(m_loai) { case 0: return 100000; break; case 1: return 150000; break; case 2: return 200000; break; case 3: return 250000; break; } return 0; } void CKhachsanDlg::OnFileExit() { exit(1); } void CKhachsanDlg::OnFileOpen() { CFileDialog dlg(true); CFile f; BOOL b; if(dlg.DoModal()==IDOK) { b=f.Open (dlg.GetFileName (),CFile::modeRead|CFile::typeBinary); if(b) { CArchive ar(&f,CArchive::load); mArray.Serialize (ar); Cthongtin *p; int n; CString s1,s2,s3; for(int i=0;i<mArray.GetSize ();i++) { p=(Cthongtin*)mArray.GetAt (i); n=m_list.GetItemCount (); m_list.InsertItem (n,p->mhoten ); m_list.SetItemText (n,1,p->mngayden ); m_list.SetItemText (n,2,p->mngaydi ); s1.Format ("%d",p->mloai ); s2.Format ("%d",p->msongay ); s3.Format ("%ld",p->mtientra ); m_list.SetItemText (n,3,s1); m_list.SetItemText (n,4,s2); m_list.SetItemText (n,5,s3+ " ""VND"); } ar.Close(); }f.Close (); } } void CKhachsanDlg::OnFileSave() { CFileDialog dlg(false); CFile f; if(dlg.DoModal ()==IDOK) { f.Open (dlg.GetFileName(),CFile::modeCreate|CFile::modeWrite|CFile::typeBinary); CArchive ar(&f,CArchive::store); mArray.Serialize (ar); ar.Close(); f.Close (); } } void CKhachsanDlg::Serialize(CArchive& ar) { if (ar.IsStoring()) { // storing code } else { // loading code } } void CKhachsanDlg::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult) { CString s1,s2,s3,s4,s5; for(int i=0;i<m_list.GetItemCount ();i++) { if(m_list.GetItemState (i,LVIS_SELECTED)==LVIS_SELECTED) { m_hoten =m_list.GetItemText (i,0); //lay gia tri ho ten tu ListCtrl va dua len Dlg s1=m_list.GetItemText (i,1);//lay gia tri ngay den s2=m_list.GetItemText (i,2);//lay gia tri ngay di s3=m_list.GetItemText (i,3);//lay gia tri loai phong s4=m_list.GetItemText (i,4);//lay gia tri so ngay thue s5=m_list.GetItemText (i,5);//lay gia tri tien tra //todo: dua gia tri ngay den tu ListCtrl len Dlg CString strngden; int ngden,thden,namden; strngden.Format ("%s",s1); if(strngden.GetLength ()==8) { ngden=atoi(strngden.Left (1)); thden=atoi(strngden.Mid (2,1)); namden=atoi(strngden.Right (4)); } else { if(strngden.GetLength ()==10) { [...]... ///////////////////////////////////////////////////////////////////////////// // CVehinhView drawing void CVehinhView::OnDraw(CDC* pDC) { CVehinhDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); int i; for(i=0;imArray.GetSize ();i++) { CHinh *p=(CHinh *)pDoc ->mArray GetAt (i); mPen.DeleteObject (); mPen.CreatePen (PS_SOLID,p->m_Width,p->m_Color); CPen* pPen=pDC ->SelectObject (&mPen); switch(p->m_Draw... _DEBUG void CVehinhView::AssertValid() const { CView::AssertValid(); } void CVehinhView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CVehinhDoc* CVehinhView::GetDocument() { ASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CVehinhDoc))); return (CVehinhDoc*)m_pDocument; } ///////////////////////////////////////////////////////////////////////////// // CVehinhView message handlers void CVehinhView::OnLButtonDown(UINT... mCur=point; Invalidate(); } CView::OnMouseMove(nFlags, point); } void CVehinhView::OnLButtonUp(UINT nFlags, CPoint point) { CVehinhDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CHinh *p; p=new CHinh; p->m_Old =mOld; p->m_Cur =mCur; p->m_Draw =mDraw; p->m_Width =mWidth; p->m_Color =mColor; pDoc->mArray Add (p); CView::OnLButtonUp(nFlags, point); } void CVehinhView::OnButtonDoanthang() { mDraw=0; } void CVehinhView::OnButtonEllip()... Chọn MFC AppWizard(exe) B2: Xác định thư mục chứa ứng dụng trong mục Location B3: Đặt tên cho ứng dụng trong mục Project Name àXuất hiện cửa sổ MFC AppWizard àChọn Single Document (dùng để vẽ hình) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Bài 9: hinh.cpp CHinh::CHinh() { } CHinh::~CHinh() { } void CHinh::Serialize(CArchive& ar) { if (ar.IsStoring()) { arm_Width;... CDialog::OnHScroll(nSBCode, nPos, pScrollBar); } void CWidth::OnOK() { mWidth=m_slider.GetPos (); CDialog::OnOK(); } Phần này chủ yếu là viết code, ít thiết kế Chỉ thiết kế mỗi phần độ rộng (width) của nét vẽ Đây là bài vẽ hình tổng hợp, có cả màu sắc, độ rộng, và cách vẽ các kiểu Coi kỹ trong phần vehinhView . ÔN TẬP BÀI TẬP THỰC HÀNH LẬP TRÌNH WINDOW ****************************************************** Bài 1: IDC_EDIT_A IDC_EDIT_B IDC_STATIC_KETQUA IDC_BUTTON_TINH. CVehinhDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); int i; for(i=0;i<pDoc->mArray.GetSize ();i++) { CHinh *p=(CHinh *)pDoc ->mArray

Ngày đăng: 19/01/2014, 12:20

Từ khóa liên quan

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

  • Đang cập nhật ...

Tài liệu liên quan