Bài giảng Lập trình cơ bản: Phần 1 - ĐH Sư phạm kỹ thuật Nam Định

125 10 0
Bài giảng Lập trình cơ bản: Phần 1 - ĐH Sư phạm kỹ thuật Nam Định

Đ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

Bài giảng Lập trình cơ bản: Phần 1 cung cấp cho người học những kiến thức như: Tổng quan về .NET và C#, Cơ sở lập trình trong C#, Một số cấu trúc dữ liệu. Mời các bạn cùng tham khảo để nắm chi tiết nội dung giáo trình!

Tập giảng Lập trình MỤC LỤC DANH MỤC CÁC BẢNG .iv DANH MỤC CÁC HÌNH vi LỜI NÓI ĐẦU x CHƢƠNG 1: TỔNG QUAN VỀ NET VÀ C# 1.1 Giới thiệu NET 1.1.1 Tổng quan NET Framework 1.1.2 Giới thiệu Visual Studio NET 1.2 Ngôn ngữ C# 1.2.1 Giới thiệu C# 1.2.2 Các bƣớc chuẩn bị cho chƣơng trình .5 1.2.3 Xây dựng chƣơng trình C# đơn giản .6 1.2.4 Chú thích chƣơng trình C# 1.2.5 Namespace 10 CHƢƠNG 2: CƠ SỞ LẬP TRÌNH TRONG C# 11 2.1 Tên 11 2.2 Từ khóa .12 2.3 Hằng Biến 12 2.3.1 Các kiểu liệu sở 12 2.3.2 Biến 14 2.3.3 Hằng 16 2.4 Biểu thức 17 2.4.1 Biểu thức 17 2.4.2 Lệnh gán biểu thức 17 2.4.3 Các phép toán số học 18 2.4.4 Các phép toán quan hệ logic 19 2.4.5 Phép toán tăng giảm 20 2.4.6 Thứ tựƣu tiên phép toán 22 2.4.7 Chuyển đổi kiểu giá trị 24 2.4.8 Lớp Math .26 2.5 Câu lệnh rẽ nhánh .27 2.5.1 Câu lệnh if 27 2.5.2 Câu lệnh switch 31 2.6 Câu lệnh lặp 34 i Tập giảng Lập trình 2.6.1 Câu lệnh while .34 2.6.2 Câu lệnh while 35 2.6.3 Câu lệnh for 37 2.7 Câu lệnh nhảy .39 2.7.1 Câu lệnh break continue 39 2.7.2 Câu lệnh goto .40 2.7.3 Câu lệnh return 41 2.8 Xử lý ngoại lệ .41 Bài tập 45 CHƢƠNG 3: MỘT SỐ CẤU TRÚC DỮ LIỆU 50 3.1 Mảng 50 3.1.1 Mảng chiều 51 3.1.2 Mảng đa chiều .56 3.2 Xâu ký tự .61 3.3 Xử lý tập tin 71 3.4 Lớp 80 3.5 Cấu trúc 100 Bài tập 103 CHƢƠNG 4: LẬP TRÌNH TRÊN FORM 116 4.1 Giới thiệu lập trình Form 116 4.2 Làm việc với Form 116 4.2.1 Một số khái niệm .116 4.2.2 Các loại Form 123 4.2.3 Thuộc tính Form 124 4.2.4 Sự kiện Form 125 4.2.5 Phƣơng thức Form 125 4.3 Một số điều khiển thông dụng 128 4.3.1 Các thuộc tính kiện chung 128 4.3.2 Nhóm điều khiển Label .129 4.3.3 Nhóm điều khiển TextBox 131 4.3.4 Nhóm điều khiển ComboBox, ListBox .138 4.3.5 Nhóm điều khiển CheckBox, RadioButtom 146 4.3.6 Điều khiển Button 154 4.4 Một số điều khiển đặc biệt 155 4.4.1 Nhóm điều khiển Menu 155 4.4.2 Điều khiển Container 158 ii Tập giảng Lập trình 4.4.3 Điều khiển Dialog 160 Bài tập 167 TAI LIỆU THAM KHẢO 197 iii Tập giảng Lập trình DANH MỤC CÁC BẢNG Bảng 1.1: Từ khóa ngơn ngữ C# Bảng 2.1: Mô tả kiểu liệu xây dựng sẵn 13 Bảng 2.2: Các kiểu ký tự đặc biệt 14 Bảng 2.3: Các phép tốn số học hai ngơi 18 Bảng 2.4: Các toán tử so sánh (giả sử value1 = 100 value2 = 50) 20 Bảng 2.5: Các toán tử logic (giả sử x = 5, y = 7) .20 Bảng 2.6: Mơ tả phép tốn tự gán 20 Bảng 2.7: Một số phép tốn khác có C# 22 Bảng 2.8: Thứ tự ƣu tiên phép toán 23 Bảng 2.9: Một số phƣơng thức lớp Math 27 Bảng 2.10: Một số lớp ngoại lệ .44 Bảng 3.1: Các phƣơng thức thuộc tính System.Array 51 Bảng 3.2: Phƣơng thức thuộc tính lớp String 63 Bảng 3.3: Một số phƣơng thức mở tập tin 73 Bảng 3.4: Giá trị FileMode .77 Bảng 3.5: Các phƣơng thức đọc BinaryReader 80 Bảng 3.6: Thuộc tính truy cập 83 Bảng 3.7: Giá trị mặc định kiểu liệu 85 Bảng 4.1: Một số thuộc tính Form 125 Bảng 4.2: Một số kiện Form 125 Bảng 4.3: Một số phƣơng thức Form 126 Bảng 4.4: Một số thuộc tính chung điều khiển .128 Bảng 4.5: Một số kiện chung điều khiển 129 Bảng 4.6: Một số thuộc tính Label 129 Bảng 4.7: Các thuộc tính LinkLabel .130 Bảng 4.8: Các kiện LinkLabel 130 Bảng 4.9: Một số thuộc tính TextBox 131 Bảng 4.10: Một số kiện TextBox .132 Bảng 4.11: Một số thuộc tính MaskedTextBox 136 Bảng 4.12: Một số kiện MaskedTextBox 137 Bảng 4.13: Một số thuộc tính ComboBox 139 Bảng 4.14: Một số kiện ComboBox 139 Bảng 4.15: Một số thuộc tính ListBox 142 Bảng 4.16: Một số kiện ListBox 142 Bảng 4.17: Một số thuộc tính CheckBox 146 iv Tập giảng Lập trình Bảng 4.18: Một số kiện CheckBox 146 Bảng 4.19: Một số thuộc tính CheckedListBox 150 Bảng 4.20: Một số kiện CheckedListBox 150 Bảng 4.21: Một số thuộc tính RadioButton 152 Bảng 4.22: Một số kiện RadioButton .152 Bảng 4.23: Một số thuộc tính Button 155 Bảng 4.24: Một số kiện Button 155 Bảng 4.25: Một số thuộc tính MenuStrip .155 Bảng 4.26: Một số thuộc tính ToolStripMenuItem .156 Bảng 4.27: Một số kiện ToolStripMenuItem 156 Bảng 4.28: Một số thuộc tính GroupBox 158 Bảng 4.29: Một số thuộc tính TabControl 159 Bảng 4.30: Một số thuộc tính điều khiển ColorDialog 163 Bảng 4.31: Một số thuộc tính điều khiển SaveFileDialog 164 Bảng 4.32: Một số thuộc tính điều khiển OpenFileDialog 166 v Tập giảng Lập trình DANH MỤC CÁC HÌNH Hình 1.1: Cấu trúc Net Framework Hình 1.2: Các bƣớc lựa chọn Project Visual Studio 2010 Hình 1.3: Tập tin Program.cs Hình 1.4: Kết chƣơng trình Vidu 1.1 Hình 1.5: Kết chƣơng trình ví dụ 1.2 10 Hình 2.1: Kết chƣơng trình ví dụ 2.3 15 Hình 2.2: Kết chƣơng trình ví dụ 2.6 17 Hình 2.3: Kết chƣơng trình ví dụ 2.7 19 Hình 2.4: Kết chƣơng trình ví dụ 2.8 22 Hình 2.5: Kết chƣơng trình ví dụ 2.9 24 Hình 2.6: Hoạt động câu lệnh if không đầy đủ .27 Hình 2.7: Kết chƣơng trình ví dụ 2.10 28 Hình 2.8: Hoạt đơng câu lệnh if đầy đủ 29 Hình 2.9: Kết chƣơng trình ví dụ 2.11 29 Hình 2.10: Kết chƣơng trình ví dụ 2.12 .31 Hình 2.11: Kết chƣơng trình ví dụ 2.13 .33 Hình 2.12: Hoạt động vòng lặp while .34 Hình 2.13: Kết chƣơng trình ví dụ 2.14 .35 Hình 2.14: Hoạt động vịng lặp … while 36 Hình 2.15: Kết chƣơng trình ví dụ 2.15 .37 Hình 2.16: Hoạt động vòng lặp for 37 Hình 2.17: Kết chƣơng trình ví dụ 2.16 38 Hình 2.18: Kết chƣơng trình ví dụ 2.18 .39 Hình 2.19: Kết chƣơng trình 2.19 41 Hình 2.20: Kết chƣơng trình ví dụ 2.20 43 Hình 2.21: Kết chƣơng trình ví dụ 2.21 45 Hình 2.22: Kết chƣơng trình 2.1 46 Hình 2.23: Kết chƣơng trình 2.5 .48 Hình 3.1: Kết chƣơng trình ví dụ 3.1 54 Hình 3.2 Kết chƣơng trình ví dụ 3.2 56 Hình 3.3: Kết chƣơng trình ví dụ 3.3 58 Hình 3.4: Kết chƣơng trình ví dụ 3.4 61 Hình 3.5: Kết chƣơng trình ví dụ 65 Hình 3.6: Kết chƣơng trình ví dụ 3.6 70 Hình 3.7: Kết chƣơng trình ví dụ 3.7 71 vi Tập giảng Lập trình Hình 3.8: Kết chƣơng trình ví dụ 3.8 74 Hình 3.9: Kết chƣơng trình ví dụ 3.9 75 Hình 3.10: Nội dung tập tin tapnhiphan.data đƣợc mở WordPad 76 Hình 3.11: Kết chƣơng trình ví dụ 3.11 78 Hình 3.12: Kết chƣơng trình ví dụ 3.12 .82 Hình 3.13: Kết chƣơng trình ví dụ 3.13 84 Hình 3.14: Kết chƣơng trình ví dụ 3.14 86 Hình 3.15: Kết chƣơng trình ví dụ 3.15 .89 Hình 3.16: Kết chƣơng trình ví dụ 3.16 91 Hình 3.17: Kết chƣơng trình ví dụ 3.17 94 Hình 3.18: Kết chƣơng trình ví dụ 3.18 .97 Hình 3.19: Kết chƣơng trình ví du 3.19 .99 Hình 3.20: Kết chƣơng trình ví dụ 3.20 103 Hình 3.21: Kết chƣơng trình 3.1 .105 Hình 3.22: Kết chƣơng trình 3.3 .107 Hình 3.23: Kết chƣơng trình 3.4 .109 Hình 3.24: Kết chƣơng trình 3.7 .112 Hình 3.25: Kết chƣơng trình 3.9 .115 Hình 4.1: Giao diện ví dụ 4.1 117 Hình 4.2: Các bƣớc tạo ứng dụng Windows Forms Application 118 Hình 4.3: Giao diện ứng dụng Windows Forms Application sau tạo 118 Hình 4.4: Cửa sổ Toolbox 119 Hình 4.5: Cửa sổ Solution Explorer .119 Hình 4.6: Cửa sổ Properties Form1 120 Hình 4.7: Thêm điều khiển Label vào Form1 120 Hình 4.8: Thay đổi thuộc tính Text điều khiển label1 .121 Hình 4.9: Kết sau thay đổi thuộc tính Text điều khiển label1 121 Hình 4.10: Cửa sổ Font 121 Hình 4.11: Thay đổi Font màu chữ điều khiển label1 122 Hình 4.12: Chọn kiện Click 123 Hình 4.13: Phƣơng thức btThoat_Click 123 Hình 4.14: Màu MDI Form .123 Hình 4.15: Form sau thay đổi số thuộc tính theo ví dụ 4.4 .125 Hình 4.16: Giao diện Form ví dụ 4.5 126 Hình 4.17: Sử dụng điều khiển Label .129 Hình 4.18: Ví dụ điều khiển LinkLabel .130 vii Tập giảng Lập trình Hình 4.19: Hiển thị trang https://www.google.com.vn/ trình duyệt web 130 Hình 4.20: Ví dụ điều khiển TextBox 132 Hình 4.21: Giao diện ví dụ 4.8 .134 Hình 4.22: Một số định dạng cho thuộc tính Mask .136 Hình 4.23: Ví dụ điều khiển MaskedTextBox 137 Hình 4.24: Ví dụ điều khiển ComboBox 139 Hình 4.25: Cửa sở String Collection Editor 140 Hình 4.26: Ví dụ điều khiển ListBox 143 Hình 4.27: Ví dụ điều khiển CheckBox 147 Hình 4.28: Ví dụ điều khiển CheckedListBox .150 Hình 4.29: Ví dụ điều khiển RadioButton 153 Hình 4.30: Ví dụ điều khiển MenuStrip 155 Hình 4.31: Giao diện ví dụ 4.15 156 Hình 4.32: Ví dụ điểu khiển GroupBox 159 Hình 4.33: Ví dụ điều khiển TabControl 160 Hình 4.34: Hộp thoại MessageBox .160 Hình 4.35: Hộp thoại MessageBox có nội dung 160 Hình 4.36: Hộp thoại MessageBox có thêm tiều đề 161 Hình 4.37: Hộp thoại MessageBox có thêm tùy chỉnh nút bấm 161 Hình 4.38: Hộp thoại MessageBox có thêm tùy chỉnh biểu tƣợng .161 Hình 4.39: Hộp thoạiMessageBox 162 Hình 4.40: Xuất hộp thoại MessageBox click chọn nút Yes 162 Hình 4.41: Giao diện ví dụ 4.16 163 Hình 4.42: Giao diện ví dụ 4.17 tập tin songuyen.txt đƣợc tạo 165 Hình 4.43: Giao diện ví dụ 4.18 166 Hình 4.44: Giải bất phƣơng trình 167 Hình 4.45: Kết chạy chƣơng trình giải bất phƣơng trình .169 HInh 4.46: Giao diện ví dụ tập 170 Hình 4.47: Ứng dụng từ điển đơn giản 170 HÌnh 4.48: Giao diện tập Xếp Ô 170 Hình 4.49: Giao diện tập Bàn phím ký tự 171 Hình 4.50: Giao diện ví dụ Lucky Seven 171 Hình 4.51: Bài tập mảng chiều .172 Hình 4.52: Kết thiết kế Form tập mảng chiều 176 Hình 4.53:Kết chạy chƣơng trình kích vào nút bổ sung 182 Hình 4.54: Kết chạy chƣơng trình kích vào nút loại bỏ 182 viii Tập giảng Lập trình Hình 4.55: Kết chạy chƣơng trình kích vào nút tìm kiếm 183 Hình 4.56: Bài tập mảng hai chiều 184 Hình 4.57: Kết thiết kế Form tập mẫu mảng hai chiều 186 Hình 4.58: Kết chạy chƣơng trình tập mẫu mảng hai chiều 190 Hình 4.59: Chƣơng trình xử lý chuỗi 191 Hình 4.60: Kết thiết kế Form chƣơng trình xử lý xâu 193 Hình 4.61: Kết chạy chƣơng trình xử lý xâu 196 Hình 4.62: Chuẩn hóa đếm từ xâu .196 ix Tập giảng Lập trình LỜI NĨI ĐẦU Ngơn ngữ C# ngôn ngữ đƣợc dẫn xuất từ C C++, nhƣng đƣợc tạo từ tảng phát triển hơnvà thêm vào đặc tính để làm cho ngôn ngữ dễ sử dụng Những đặc tính đƣợc tóm tắt nhƣ sau: C# ngôn ngữ đơn giản, đại, ngôn ngữ hƣớng đối tƣợng, ngơn ngữ mạnh mẽ mềm dẻo, có từ khóa, hƣớng module Ngay từ xuất hiện, C# có sức lơi cuốn, thu hút nhiều ngƣời đƣợc sử dụng nhiều lĩnh vực khác Vì vậy, nhu cầu nghiên cứu, học tập mơn học ngày cao Ở Việt Nam, có vài tài liệu hƣớng dẫn giảng dạy C# nhƣng hầu nhƣ dừng lại mức độ lý thuyết trừu tƣợng, chƣa phù hợp với trình độ sinh viên trƣờng Đại học phạm Kỹ thuật Nam Định, việc biên soạn tập giảng ngôn ngữ C# cụ thể tập giảng Lập trình nhu cầu cấp thiết Tập giảng đƣợc chia làm chƣơng: Chƣơng 1: Tổng quan NET C# Chƣơng 2: Cơ sở lập trình C# Chƣơng 3: Một số cấu trúc liệu nâng cao Chƣơng 4: Lập trình Form Mỗi chƣơng tập giảng hệ thống hóa kiến thức bản, cần thiết Tƣơng ứng với nội dung kiến thức có ví dụ minh họa cụ thể, gắn với ứng dụng thực tiễn Đặc biệt, cuối tập giảng, tác giả đƣa hệ thống tập thực tế để sinh viên vận dụng củng cố lại kiến thức kỹ Với phần lý thuyết chi tiết, đầy đủ đƣợc trình bày cách khoa học, logic phần tập để củng cố kiến, hy vọng tập giảng mang lại cho sinh viên nhiều kiến thứchữu ích Trong q trình biên soạn, tập giảng khơng tránh khỏi sai sót, mong đồng nghiệp em sinh viên góp ý kiến để tập giảng ngày đƣợc hoàn thiện Mọi đóng góp ý kiến xin gửi Văn phịng Khoa Công nghệ thông tin-Trƣờng Đại học Sƣ phạm Kỹ thuật Nam Định-Phƣờng Lộc Hạ-Tp Nam Định Nhóm biên soạn Nguyễn Thế Vinh – Nguyễn Thi ̣ Thu Thủy x Tập giảng Lập trình Định nghĩa cấu trúc Cú pháp để khai báo cấu trúc tƣơng tự nhƣ cách khai báo lớp: [thuộc tính] [bổ sung truy cập] struct [: danh sách giao diện] { [thành viên cấu trúc] } Cách thức thức khai báo biến cấu trúc truy nhập thành phẩn biến cấu trúc tƣơng tự nhƣ với biến kiểu lớp Để hiểu rõ xét ví dụ sau Ví dụ 3.20: Lập chƣơng trình thực cơng việc sau: - Xây dựng cấu trúc Điểm để mô tả điểm khơng gian hai chiều với thuộc tính hồnh độ, tung độ; với phƣơng thức nhập, hiển thị điểm, hàm tạo khơng đối, có hai đối để khởi gán giá trị cho thuộc tính - Xây dựng hàm tính khoảng cách hai điểm khơng gian hai chiều - Nhập dãy điểm gồm n phần tử (với n số nguyên dƣơng nhập từ bàn phím) Hiển thị dãy điểm vừa nhập hình - Đƣa điểm gần điểm có tọa độ (1, 2) Ví dụ 3.20: Cấu trúc Diem namespace Vidu3_20 { public struct Diem { public Diem( int xC, int yC) { _x = xC; _y = yC; } public int x { get { return _x; } set { _x = value; } } public int y { get { 101 Tập giảng Lập trình return _y; } set { _y = value; } } public string ToString() { return (String.Format("{0}, {1}", _x, _y)); } // thuộc tính private lưu toạ độ x, y private int _x; private int _y; } class Program { //Hàm tính khoảng cách hai điểm public static double Khoangcach ( Diem d1, Diem d2) { return Math.Sqrt(Math.Pow(d1.x-d2.x,2) + Math.Pow(d1.y- d2.y,2)); } static void Main(string[] args) { Diem[] a; int n; Console.Write("Nhap n = "); ; n = int.Parse(Console.ReadLine()); a = new Diem[n]; int i; for (i = 0; i < n; i++) { Console.WriteLine("Nhap thong tin diem thu {0}",i); Console.Write("Nhap x = "); a[i].x = int.Parse(Console.ReadLine()); Console.Write("Nhap y = "); a[i].y = int.Parse(Console.ReadLine()); } Console.WriteLine("Day diem: "); for (i = 0; i < n; i++) Console.WriteLine(a[i].ToString()); Diem diem = new Diem( 1, 2); double = Khoangcach(a[0],diem); for (i = 1; i < n; i++) if(min>Khoangcach(a[i],diem))min = Khoangcach(a[i],diem); Console.Write("Cac diem gan diem (1,2) la: "); 102 Tập giảng Lập trình for(i = 0; i < n; i++) if(min==Khoangcach(a[i],diem))Console.Write(a[i].ToString()); Console.ReadLine(); } } } Kết chƣơng trình: Hình 3.20: Kết chương trình ví dụ 3.20 Tạo thể cấu trúc cách sử dụng từ khóa new câu lệnh gán, nhƣ tạo đối tƣợng lớp Nhƣ ví dụ 3.20, lớp Program tạo thể Diem nhƣ sau: Diemdiem = new Diem(1, 2); Ở thể tên diem đƣợc truyền hai giá trị Các thức truy nhập vào thuộc tính hay phƣơng thức tƣơng tự nhƣ với lớp Bài tập Bài 3.1 Lập chƣơng trình thực cơng việc sau: Nhập hiển thị mảng số thực gồm n phần tử (n nguyên dƣơng nhập từ bàn phím) Hiển thị mảng theo thứ tự xếp tăng dần Nhập số nguyên x từ bàn phím Kiểm tra xem mảng có phần tử x khơng? Tìm phần tử có giá trị nhỏ mảng Tính trung bình cộng phần tử dƣơng mảng Hƣớng dẫn thực Bƣớc 1: Tạo ứng dung Console đặt tên Bai3_1 Bƣớc 2: Viết hàm nhập hiển thị mảng static void Nhapmang(ref float[] a, ref int n) { bool kt; 103 Tập giảng Lập trình { Console.Write("Nhap kich thuoc mang n = "); kt = int.TryParse(Console.ReadLine(), out n); if (!kt || n 0) { t += a[i, j]; } return t; } Bƣớc 4: Viết hàm Main() static void Main(string[] args) { int n = 0, m = 0; int[,] a = null; Nhapmatran(ref a, ref n); Console.WriteLine("Ma tran: "); Hienthimatran(a, n); Phantuchantrencheochinh(a, n); Console.WriteLine("\nTong cac phan tu duong ma tran la: {0} ", Tongduong(a, n)); Console.ReadLine(); } Kết chƣơng trình: Hình 3.23: Kết chương trình 3.4 Bài 3.5 Lập chƣơng trình thực công việc sau: Nhập ma trận số thực gồm n hàng, m cột (với n m hai số nguyên dƣơng) Hiển thị ma trận Tìm số âm lớn ma trận 109 Tập giảng Lập trình Sắp xếp hàng ma trận theo thứ tự tăng dần Nhập số nguyên dƣơng k, xóa hàng thứ k ma trận có Tính trung bình cộng phần tử có giá trị âm ma trận Bài 3.6 Tạo ứng dụng Windows Form thực công việc sau: Nhập ma trận số thực vuông cấp n (với n số nguyên dƣơng) Hiển thị ma trận Tính tổng phần tử nằm đƣờng chéo phụ ma trận Tìm số dƣơng nhỏ đƣờng chéo ma trận Đếm phần tử ma trận có giá trị chia hết cho Bài 3.7 Lập chƣơng trình thực cơng việc sau: Khai báo kiểu cấu trúc Diem có hai thuộc tính hoành độ tung độ điểm không gian hai chiều, hàm getter, setter hàm tạo Nhập mảng cấu trúc Diem gồm n phần tử (với n số nguyên dƣơng nhập từ bàn phím) Sắp xếp danh sách điểm theo thứ tự hoành độ tăng dần Hƣớng dẫn thực hiện: Bƣớc 1: Tạo ứng dụng Console đặt tên Bai3_7 Bƣớc 2: Tạo cấu trúc diem struct diem { private int _x; private int _y; public int X { get { return _x; } set { _x = value; } } public int Y { get { return _y; } set { _y = value; } } public diem(int hd, int td) { _x = hd; _y = td; } } 110 Tập giảng Lập trình Bƣớc 3: Viết hàm nhập mảng điểm, hiển thị mảng điểm xếp mảng điểm tăng dần theo hoành độ điểm static void Nhapmang(ref diem[] a, ref int n) { bool kt; { Console.Write("Nhap kich thuoc mang n = "); kt = int.TryParse(Console.ReadLine(), out n); if (!kt || n

Ngày đăng: 08/06/2021, 14:19

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

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

Tài liệu liên quan