1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng C Chuong2

13 99 0

Đ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ội dung

Chương Các kiến thức lập trình C# ₫ã học 2.0 Dẫn nhập 2.1 Cấu trúc ứng dụng C# nhỏ 2.2 Kiểu liệu ₫ịnh sẵn 2.3 Kiểu liệt kê 2.4 Kiểu record 2.5 Kiểu array 2.6 Phân tích top-down theo hướng ₫ối tượng 2.7 Namespace 2.8 Assembly 2.9 Kết chương Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Lập trình hướng ₫ối tượng Chương : Các kiến thức lập trình C# ₫ã học Slide 2.0 Dẫn nhập ‰ ‰ Chương giới thiệu cấu trúc chương trình VC# nhỏ ₫ơn giản gồm số biến liệu số hàm xử lý biến liệu, từ ₫ó tổng kết lại kiểu liệu khác ₫ược dùng chương trình Chương giới thiệu phương pháp ₫ặt tên cho phần tử cấu thành ứng dụng lớn cách khoa học, cách chứa phần tử cấu thành ứng dụng lớn module vật lý Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Lập trình hướng ₫ối tượng Chương : Các kiến thức lập trình C# ₫ã học Slide 2.1 Cấu trúc ứng dụng C# nhỏ Trong môn kỹ thuật lập trình, ₫ã viết ₫ược số ứng dụng C# nhỏ ₫ơn giản Trong trường hợp này, ứng dụng C# class gồm nhiều thuộc tính liệu nhiều hàm chức Chương trình bắt ₫ầu chạy từ hàm Main liệu chương trình Điểm nhập chương trình (Main) liệu cục hàm hàm chức Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Lập trình hướng ₫ối tượng Chương : Các kiến thức lập trình C# ₫ã học Slide 2.1 Cấu trúc ứng dụng C# nhỏ using System; namespace GPTB2 { class Program { //₫ịnh nghĩa biến cần dùng static double a, b, c; static double delta; static double x1, x2; //₫ịnh nghĩa hàm nhập thông số a,b,c phương trình bậc static void NhapABC() { String buf; Console.Write("Nhập a : "); buf= Console.ReadLine(); a = Double.Parse(buf); Console.Write("Nhập b : "); buf = Console.ReadLine(); b = Double.Parse(buf); Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Lập trình hướng ₫ối tượng Chương : Các kiến thức lập trình C# ₫ã học Slide 2.1 Cấu trúc ứng dụng C# nhỏ Console.Write("Nhập c : "); buf = Console.ReadLine(); c = Double.Parse(buf); } //₫ịnh nghĩa hàm tính nghiệm phương trình bậc static void GiaiPT() { //tính biệt số delta phương trình delta = b * b - * a * c; if (delta >= 0) //nếu có nghiệm thực { x1 = (-b + Math.Sqrt(delta)) / / a; x2 = (-b - Math.Sqrt(delta)) / / a; } } Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Lập trình hướng ₫ối tượng Chương : Các kiến thức lập trình C# ₫ã học Slide 2.1 Cấu trúc ứng dụng C# nhỏ //₫ịnh nghĩa hàm xuất kết static void XuatKetqua() { if (delta < 0) //báo vô nghiệm Console.WriteLine("Phương trình vô nghiệm"); else //báo có nghiệm { Console.WriteLine("Phương trình có nghiệm thực : "); Console.WriteLine("X1 = " + x1); Console.WriteLine("X2 = " + x2); } } Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Lập trình hướng ₫ối tượng Chương : Các kiến thức lập trình C# ₫ã học Slide 2.1 Cấu trúc ứng dụng C# nhỏ //₫ịnh nghĩa chương trình (hàm Main) static void Main(string[] args) { NhapABC(); //1 nhập a,b,c GiaiPT(); //2 giải phương trình XuatKetqua(); //3 xuất kết //4 chờ người dùng ấn Enter ₫ể ₫óng cửa sổ Console lại Console.Write("Ấn Enter ₫ể dừng chương trình : "); Console.Read(); } } //kết thúc class } //kết thúc namespace Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Lập trình hướng ₫ối tượng Chương : Các kiến thức lập trình C# ₫ã học Slide 2.1 Cấu trúc ứng dụng C# nhỏ Quan sát cấu trúc chương trình C# nhỏ slide 3, có số nhận xét sau : Dữ liệu chương trình thường phong phú, ₫a dạng chủng loại → Cơ chế ₫ịnh nghĩa kiểu liệu ₫ược dùng ₫ể ₫ảm bảo người lập trình ₫ịnh nghĩa kiểu riêng mà ứng dụng họ cần dùng ? Nếu ứng dụng lớn chứa nhiều hàm chức phải xử lý nhiều liệu khó quản lý chúng class ₫ơn giản → cần cấu trúc phù hợp ₫ể quản lý ứng dụng lớn Chương trình thường phải nhờ hàm chức class khác ₫ể hỗ trợ Thí dụ ta ₫ã gọi hàm Read, Write class Console ₫ể nhập/xuất liệu cho chương trình → Cơ chế nhờ vả ₫ược dùng ₫ể ₫ảm bảo thành phần ứng dụng không “quậy phá” nhau? Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Lập trình hướng ₫ối tượng Chương : Các kiến thức lập trình C# ₫ã học Slide 2.2 Kiểu liệu ₫ịnh sẵn ‰ ‰ Các thuật giải chức chương trình xử lý liệu Dữ liệu chương trình thường phong phú, ₫a dạng chủng loại Trước hết ngôn ngữ C# (hay ngôn ngữ lập trình nào) phải ₫ịnh nghĩa số kiểu ₫ược dùng phổ biến ứng dụng, ta gọi kiểu “kiểu ₫ịnh sẵn” Mỗi liệu thường ₫ược ₫ể biến Phát biểu ₫ịnh nghĩa biến ₫ặc tả thông tin biến ₫ó : tên nhận dạng ₫ể truy xuất kiểu liệu ₫ể xác ₫ịnh giá trị ₫ược lưu biến giá trị ban ₫ầu mà biến chứa Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Lập trình hướng ₫ối tượng Chương : Các kiến thức lập trình C# ₫ã học Slide 2.2 Kiểu liệu ₫ịnh sẵn ‰ ‰ Biến thuộc kiểu ₫ịnh sẳn chứa trực tiếp giá trị, thí dụ biến nguyên chứa trực tiếp số nguyên, biến thực chứa trực tiếp số thực → Ta gọi kiểu ₫ịnh sẵn kiểu giá trị (value type) ₫ể phân biệt với kiểu tham khảo (reference type) lập trình hướng ₫ối tượng chương sau Kiểu tham khảo (hay kiểu ₫ối tượng) ₫ược trình bày chương trở ₫i Đây kiểu ₫ịnh lập trình hướng ₫ối tượng Một biến ₫ối tượng biến có kiểu tên interface hay tên class Biến ₫ối tượng không chứa trực tiếp ₫ối tượng, chứa thông tin ₫ể truy xuất ₫ược ₫ối tượng → Ta gọi kiểu ₫ối tượng kiểu tham khảo (reference type) Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Lập trình hướng ₫ối tượng Chương : Các kiến thức lập trình C# ₫ã học Slide 10 2.2 Kiểu liệu ₫ịnh sẵn ‰ ‰ ‰ ‰ ‰ ‰ ‰ ‰ ‰ ‰ bool : kiểu luận lý, có giá trị true false byte : kiểu nguyên dương byte, có tầm trị từ ₫ến 255 sbyte : kiểu nguyên có dấu byte, có tầm trị từ -128 ₫ến 127 char : kiểu ký tự Unicode byte, có tầm trị từ mã 0000 ₫ến FFFF short : kiểu nguyên có dấu byte, tầm trị từ -32768 ₫ến 32767 ushort : kiểu nguyên dương byte, tầm trị từ ₫ến 65535 int : kiểu nguyên có dấu byte, tầm trị từ -2,147,483,648 ₫ến 2,147,483,647 uint : kiểu nguyên dương byte, tầm trị từ ₫ến 4,294,967,295 long : kiểu nguyên có dấu byte, tầm trị từ -263 ₫ến 263-1 ulong : kiểu nguyên dương byte, tầm trị từ ₫ến 263-1 Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Lập trình hướng ₫ối tượng Chương : Các kiến thức lập trình C# ₫ã học Slide 11 2.2 Kiểu liệu ₫ịnh sẵn ‰ ‰ ‰ ‰ float : kiểu thực xác ₫ơn, dùng byte ₫ể miêu tả giá trị thực, có tầm trị từ ±1.5 × 10−45 to ±3.4 × 1038 Độ xác khoảng ký số thập phân double : kiểu thực xác kép, dùng byte ₫ể miêu tả giá trị thực, có tầm trị từ ±5.0 × 10−324 to ±1.7 × 10308 Độ xác khoảng 15 ký số thập phân decimal : kiểu thực xác cao, dùng 16 byte ₫ể miêu tả giá trị thực, có tầm trị từ ±1.0 × 10−28 to ±7.9 × 1028 Độ xác khoảng 28-29 ký số thập phân object (Object) : kiểu ₫ối tượng bất kỳ, ₫ây class ₫ịnh sẵn ₫ặc biệt Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Lập trình hướng ₫ối tượng Chương : Các kiến thức lập trình C# ₫ã học Slide 12 2.3 Kiểu người lập trình tự ₫ịnh nghĩa - Liệt kê ‰ ‰ Ngoài kiểu ₫ịnh sẵn, C# hỗ trợ người lập trình tự ₫ịnh nghĩa kiểu liệu ₫ặc thù ứng dụng Kiểu liệt kê bao gồm tập hữu hạn nhỏ giá trị ₫ặc thù cụ thể Máy mã hóa giá trị kiểu liệt kê thành kiểu byte, short //₫ịnh nghĩa kiểu chứa giá trị ngày tuần enum DayInWeek {Sat, Sun, Mon, Tue, Wed, Thu, Fri}; //₫ịnh nghĩa kiểu chứa giá trị ngày tuần enum DayInWeek {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri}; //₫ịnh nghĩa biến chứa giá trị ngày tuần DayInWeek day = DayInWeek.Tue; //₫ịnh nghĩa kiểu chứa giá trị nguyên tầm trị ₫ặc thù enum ManAge : byte {Max = 130, Min = 0}; Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Lập trình hướng ₫ối tượng Chương : Các kiến thức lập trình C# ₫ã học Slide 13 2.4 Kiểu người lập trình tự ₫ịnh nghĩa - Record ‰ ‰ Kiểu record bao gồm tập hữu hạn thông tin cần quản lý //₫ịnh nghĩa kiểu miêu tả thông tin sinh viên cần quản lý public struct Sinhvien { public String hoten; public String diachi; //các field khác } Thật kiểu struct trường hợp ₫ặc biệt class ₫ối tượng mà ta trình bày chi tiết từ chương Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Lập trình hướng ₫ối tượng Chương : Các kiến thức lập trình C# ₫ã học Slide 14 2.5 Kiểu người lập trình tự ₫ịnh nghĩa - Array ‰ Trong trường hợp ta có nhiều liệu cần xử lý thuộc kiểu (thường xảy ra), ta ₫ịnh nghĩa biến ₫ơn ₫ể miêu tả liệu nặng nề, thuật giải xử lý chúng gặp nhiều khó khăn Trong trường hợp này, tốt dùng kiểu Array ₫ể quản lý nhiều liệu cần xử lý Array : ƒ array chiều ƒ array nhiều chiều ƒ array "jagged" Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Lập trình hướng ₫ối tượng Chương : Các kiến thức lập trình C# ₫ã học Slide 15 Array chiều int[] intList; //1.₫ịnh nghĩa biến array danh sách số nguyên //2 biết ₫ược số lượng, thiết lập số phần tử cho biến array intList = new int[5]; //3 gán giá trị cho phần tử biết ₫ược giá trị intList[0] = 1; intList[1] = 3; intList[2] = 5; intList[3] = 7; intList[4] = 9; Nếu có ₫ủ thông tin thời ₫iểm lập trình, ta viết lệnh ₫ịnh nghĩa biến array sau : int[] intList = new int[5] {1, 3, 5, 7, 9}; hay ₫ơn giản : int[] intList = new int[] {1, 3, 5, 7, 9}; hay ₫ơn giản : int[] intList = {1, 3, 5, 7, 9}; Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Lập trình hướng ₫ối tượng Chương : Các kiến thức lập trình C# ₫ã học Slide 16 Array nhiều chiều int[,] matran; //1 ₫ịnh nghĩa biến array ma trận số nguyên //2 biết ₫ược số lượng, thiết lập số phần tử cho biến array matran = new int[3,2]; //3 gán giá trị cho phần tử biết ₫ược giá trị matran[0,0] = 1; matran[0,1] = 2; matran[1,0] = 3; matran[1,1] = 4; matran[2,0] = 5; matran[2,1] = 6; Nếu có ₫ủ thông tin thời ₫iểm lập trình, ta viết lệnh ₫ịnh nghĩa biến array sau : int[,] matran = new int[3,2] {{1, 2}, {3, 4}, {5,6}}; hay ₫ơn giản : int[,] matran = new int[,] {{1, 2}, {3, 4}, {5,6}}; hay ₫ơn giản : int[,] matran = {{1, 2}, {3, 4}, {5,6}}; Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Lập trình hướng ₫ối tượng Chương : Các kiến thức lập trình C# ₫ã học Slide 17 Array "jagged" Array "jagged" array mà phần tử array khác, array ₫ược chứa array "jagged" array chiều, n chiều array "jagged' khác int[][] matran; //1 ₫ịnh nghĩa biến array "jagged" //2 biết ₫ược số lượng, thiết lập số phần tử cho biến array matran = new int[3][]; for (int i = 0; i < 3; i++) matran[i] = new int[2+i]; //3 gán giá trị cho phần tử biết ₫ược giá trị matran[0][0] = 1; matran[0][1] = 2; matran[1][0] = 3; matran[1][1] = 4; matran[2][0] = 5; matran[2][1] = 6; Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Lập trình hướng ₫ối tượng Chương : Các kiến thức lập trình C# ₫ã học Slide 18 Array "jagged" Nếu có ₫ủ thông tin thời ₫iểm lập trình, ta viết lệnh ₫ịnh nghĩa biến array sau : int[][] array = new int [3][]; array[0] = new int[] {1, 2}; array[1] = new int[] {3, 4}; array[2] = new int[] {5,6}; hay ₫ơn giản : int[][] array = new int [][] {new int[]{1, 2}, new int[]{3, 4}, new int[] {5,6}}; hay ₫ơn giản : int[][] array = {new int[]{1, 2}, new int[]{3, 4}, new int[] {5,6}}; Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Lập trình hướng ₫ối tượng Chương : Các kiến thức lập trình C# ₫ã học Slide 19 2.6 Phương pháp phân tích từ-trên-xuống ‰ ‰ ‰ Như ₫ã thấy slide trước, ứng dụng lớn chứa nhiều hàm chức phải xử lý nhiều liệu khó quản lý chúng class ₫ơn giản → cần cấu trúc phù hợp ₫ể quản lý ứng dụng lớn Phương pháp ₫ược dùng phổ biến phương pháp phân tích top-down Nội dung phương pháp phân rã class ứng dụng lớn thành n class nhỏ (với n ₫ủ nhỏ ₫ể việc phân rã ₫ơn giản) Mỗi class nhỏ hơn, phức tạp, lại ₫ược phân rã thành m class nhỏ (với m ₫ủ nhỏ), cho ₫ến class tìm ₫ược class ₫ã xây dựng class ₫ơn giản, xây dựng dễ dàng Hình vẽ slide kế cho thấy trực quan việc phân tích topdown theo hướng ₫ối tượng Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Lập trình hướng ₫ối tượng Chương : Các kiến thức lập trình C# ₫ã học Slide 20 2.6 Phương pháp phân tích từ-trên-xuống chia thành nhiều class nhỏ hơn, ₫ơn giản ₫ể giải Ứng dụng cần viết ≡ class ₫ối tượng phức tạp A Class A1 Class A11 Class A12 Các class ₫ủ nhỏ hay ₫ã ₫ược xây dựng Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Class A2 Class A1n Class An1 Class An Class An2 Class Ann Môn : Lập trình hướng ₫ối tượng Chương : Các kiến thức lập trình C# ₫ã học Slide 21 2.7 Namespace ‰ ‰ Trên máy có hệ thống quản lý ₫ối tượng ₫ược dùng nhiều ứng dụng ₫ang chạy Mỗi ứng dụng lớn gồm nhiều class ₫ối tượng khác Mỗi phần tử hệ thống tổng thể ₫ều phải có tên nhận dạng Để ₫ặt tên phần tử hệ thống lớn cho phần tử có tên hoàn toàn khác (₫ể tránh tranh chấp, nhặp nhằng), C# (và ngôn ngữ Net khác) cung cấp phương tiện Namespace (không gian tên) Namespace không gian tên theo dạng phân cấp : namespace chứa nhiều phần tử struct, enum, class, interface namespace Để truy xuất phần tử namespace, ta phải dùng tên dạng phân cấp, thí dụ System.Windows.Forms.Button tên class Button, class miêu tả ₫ối tượng giao diện button form ứng dụng Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Lập trình hướng ₫ối tượng Chương : Các kiến thức lập trình C# ₫ã học Slide 22 2.7 Namespace ‰ Trong file mã nguồn C#, ₫ể truy xuất phần tử không gian tên khác, ta dùng cách : ƒ dùng tên tuyệt ₫ối dạng phân cấp Thí dụ : //₫ịnh nghĩa biến Button System.Windows.Forms.Button objButton; ƒ dùng lệnh using ; Kể từ ₫ây, ta nhận dạng phần tử namespace ₫ó thông qua tên cục Thí dụ : using System.Windows.Forms; Button objButton; //₫ịnh nghĩa biến Button TextBox objText; //₫ịnh nghĩa biến TextBox Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Lập trình hướng ₫ối tượng Chương : Các kiến thức lập trình C# ₫ã học Slide 23 2.7 Namespace ‰ Microsoft ₫ã xây dựng sẵn hàng ngàn class, interface chức phổ biến ₫ặt chúng khoảng 500 namespace khác : ƒ System chứa class interface chức hệ thống Console (nhập/xuất văn bản), Math (các hàm toán học), ƒ System.Windows.Forms chứa ₫ối tượng giao diện phổ dụng Button, TextBox, ListBox, ComboBox, ƒ System.Drawing chứa ₫ối tượng phục vụ xuất liệu thiết bị vẽ class Graphics, Pen, Brush, ƒ System.IO chứa class nhập/xuất liệu file ƒ System.Data chứa class truy xuất database theo kỹ thuật ADO Net ƒ Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Lập trình hướng ₫ối tượng Chương : Các kiến thức lập trình C# ₫ã học Slide 24 2.8 Assembly ƒ ƒ ƒ Ngoài khái niệm namespace phương tiện ₫ặt tên luận lý phần tử theo dạng phân cấp C# cung cấp khái niệm assembly Assembly phương tiện ₫óng gói vật lý nhiều phần tử Một assembly file khả thi (EXE, DLL, ) chứa nhiều phần tử bên Khi lập trình môi trường Visual Studio Net, ta tạo Project ₫ể quản lý việc xây dựng module chức ₫ó (thư viện hay ứng dụng), project chứa nhiều file mã nguồn ₫ặc tả thành phần Project ₫ó Khi máy dịch Project mã nguồn tạo file khả thi, ta gọi file assembly Mỗi assembly chứa nhiều phần tử nằm namespace luận lý khác Ngược lại, namespace chứa nhiều phần tử mà mặt vật lý chúng nằm assembly khác Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Lập trình hướng ₫ối tượng Chương : Các kiến thức lập trình C# ₫ã học Slide 25 2.9 Kết chương ‰ ‰ Chương ₫ã giới thiệu cấu trúc chương trình VC# nhỏ ₫ơn giản gồm số biến liệu số hàm xử lý biến liệu, từ ₫ó tổng kết lại kiểu liệu khác ₫ược dùng chương trình, ₫ặc biệt kiểu liệt kê, kiểu array, kiểu record Chương giới thiệu phương pháp ₫ặt tên cho phần tử cấu thành ứng dụng lớn cách khoa học thông qua khái niệm namespace dạng phân cấp, cách chứa phần tử cấu thành ứng dụng lớn module vật lý ₫ược gọi assembly Khoa Khoa học & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Môn : Lập trình hướng ₫ối tượng Chương : Các kiến thức lập trình C# ₫ã học Slide 26 ... class, interface ch c phổ biến ₫ặt chúng khoảng 500 namespace kh c : ƒ System chứa class interface ch c hệ thống Console (nhập/xuất văn bản), Math (c c hàm toán h c) , ƒ System.Windows.Forms chứa... Class A1 Class A11 Class A12 C c class ₫ủ nhỏ hay ₫ã ₫ư c xây dựng Khoa Khoa h c & Kỹ thuật Máy tính Trường ĐH Bách Khoa Tp.HCM © 2010 Class A2 Class A1n Class An1 Class An Class An2 Class... ĐH Bách Khoa Tp.HCM © 2010 Môn : Lập trình hướng ₫ối tượng Chương : C c kiến th c lập trình C# ₫ã h c Slide 2.2 Kiểu liệu ₫ịnh sẵn ‰ ‰ C c thuật giải ch c chương trình xử lý liệu Dữ liệu chương

Ngày đăng: 29/08/2017, 09:58

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

w