Thực hành c++ phan 2
Chia sẻ bởi Đặng Anh Tuấn |
Ngày 29/04/2019 |
51
Chia sẻ tài liệu: thực hành c++ phan 2 thuộc Tin học 9
Nội dung tài liệu:
CHƯƠNG 2: NHỮNG VẤN ĐỀ CƠ BẢN TRONG C++
Nội dung chính
Cấu trúc chương trình
Biến
Toán tử
Các câu lệnh
Structure
Hàm
1. Cấu trúc chương trình
Xét ví dụ sau:
#include
using namespace std;
int main()
{
cout << “Hello world ”;
return 0;
}
Hàm
Câu lệnh: kết thúc bởi dấu “;”
#include: yêu cầu chương trình dịch chèn thêm file vào mã nguồn.
using namespace
cout nằm trong namespace std;
Câu chú thích: Câu chú thích bắt đầu bằng dấu // hoặc nằm trong /* */.
2. Biến
Phải khai báo biến trước khi sử dụng
Có thể khai báo biến ở mọi nơi trong chương trình
Tên biến
Phân biệt chữ hoa, chữ thường
Sử dụng các ký tự từ a-z, 0-9 và dấu “_”
Ví dụ:
int var1;
int var2=10;
Kiểu dữ liệu đơn giản
Kiểu nguyên: int, long, short
Kiểu ký tự: char – lưu mã ASCII của ký tự
Ký tự nằm trong dấu ‘’. Ví dụ: ‘a’
Ký tự đặc biệt: , ab, \, ’, ”, …
Kiểu không dấu: unsigned char, unsigned int, unsigned short, unsigned long
Kiểu dấu phẩy động: float, double, long double
Kiểu bool: có giá trị True/False
Kiểu dữ liệu đơn giản …
Ép kiểu
C++ là ngôn ngữ định kiểu mạnh ().
Ví dụ:
double pi=3.14; // đúng
double x=”Hello”; // sai
Ép kiểu tự động
Ví dụ:
int i = 17;
float x = i; // gán 17 cho x
int j = 2;
float y = i/j; // gán 17/2 = 8 cho y, không phải là 8.5
Thực hiện phép toán trên 2 toán hạng có kiểu khác nhau thì toán hạng có kiểu thấp hơn sẽ tự động bị ép về kiểu cao hơn.
Tự ép kiểu
Ví dụ:
float z = static_cast(i)/j; // ép i thành kiểu float trước khi chia
Biến hằng (Constant Variables)
Giá trị của hằng không thay đổi.
Có 2 cách khai báo hằng:
const float PI=3.14;
#define PI 3.14
Định nghĩa ở đầu chương trình
Không xác định kiểu của PI
Sử dụng cout
cout là một đối tượng được định nghĩa trước trong C++, tương ứng với luồng ra chuẩn (standard output stream).
Toán tử << là toán tử chèn, định hướng nội dung cần hiển thị.
Ví dụ:
string str=”Hello world”;
int i=8;
cout << str << endl; // endl (hoặc ) là dấu hiệu xuống dòng.
cout << ”i=” << i << endl;
Để định dạng nội dung hiển thị, sử dụng setw (nằm trong iomanip)
cout<< setw(12) << str << setw(5) << i;
Kết quả: Hello world 8
Sử dụng cin
cin là toán tử được định nghĩa trước trong C++, tương ứng với luồng vào chuẩn (standard input stream).
Toán tử >> đưa nội dung từ luồng vào chuẩn vào biến.
Ví dụ:
int temperature;
cout << ”Enter temperature in Celsius: ”;
cin >> temperature;
Header File và Library File
Một số nhiệm vụ được thực hiện bởi Library Function.
Header File chứa khai báo các hàm mà ta cần sử dụng trong chương trình.
Ví dụ:
#include
#include ”myprog.h”
<>: yêu cầu chương trình dịch tìm từ thư mục chuẩn.
” ” : yêu cầu chương trình dịch tìm từ thư mục hiện tại.
Nếu không include Header File thích hợp thì chương trình dịch sẽ báo lỗi.
3. Toán tử
Toán tử toán học
Toán tử quan hệ
Toán tử logic
Toán tử toán học
+, -, *, /, %
Ví dụ:
int i = 1/3; // kết quả i = 0
float x = 1.0/3; // kết quả x=0.3333
int j = 7 % 3; // kết quả j=1
++, --
Ví dụ:
int i=3;
int j=7;
cout << 10 * i++; // hiển thị 30, sau đó i=4
cout << 10 * ++j; // hiển thị 80, sau đó j=8
+=, -=, *=, /=
Ví dụ:
float x=6.0;
x+=3.5; tương tự x=x+3.5;
Toán tử quan hệ
So sánh 2 giá trị.
Kết quả trả về là true hoặc false
>, <, ==, !=, >=, <=
Ví dụ:
int x=44;
int y=12;
(x == y) // false
(x >= y) // true
(x != y) // true
Toán tử logic
logical and : &&
(x >= 5) && ( x <= 15) // true nếu x nằm trong [5,15]
logical or : ||
(x == 5) || ( x == 10) // true nếu x=5 hoặc x=10
logical negation : !
! (x == 5) // true nếu x khác 5
Tương tự x != 5
Toán tử điều kiện (conditional operator) : ? … :
? : < false expression>
Ví dụ:
min = (alphaTương tự
if (alpha < beta)
min = alpha;
else
min = beta;
4. Các câu lệnh
Vòng lặp
Rẽ nhánh
Một số lệnh điều khiển khác
Vòng lặp for
increment expression
test expression
initialization expression
for ( i=0; i<15; i++ )
Có thể đặt nhiều biểu thức trong các phần của vòng for ( ; ; ); các biểu thức đó cách nhau bởi dấu phẩy.
Ví dụ:
for(int j=0, float alpha=100.0; j<50; j++, alpha--)
{
// body for
}
Vòng lặp for ...
int i;
for (i=1; i<=15; i++) // thân vòng lặp for có 1 lệnh
cout << i*i << ” ”;
cout << endl;
for (i=1; i<=15; i++) // thân vòng lặp for có nhiều lệnh
{
cout << setw(4) << i << ” ”;
// setw(n) gán kích thước của trường hiển thị bằng n
int cube = i*i*i;
cout << setw(6) << cube << endl;
}
Vòng lặp while
Vòng lặp while được sử dụng khi không biết trước số lần lặp.
Lặp cho đến khi biểu thức kiểm tra vẫn có giá trị True.
Ví dụ:
char c=’n’;
while ( c != ’y’)
{
cout << ”Do you want to continue: (y/n)” << endl;
cin >> c;
}
Vòng lặp while ...
Vòng lặp do
Trong vòng lặp do, biểu thức kiểm tra được đánh giá ở cuối vòng lặp.
Thân vòng lặp được thực hiện ít nhất một lần.
Ví dụ:
char c;
do
{
cout << ”Do you want to continue: (y/n)” << endl;
cin >> c;
}
while ( c != ’y’);
Vòng lặp do ...
If … Else
Phụ thuộc vào điều kiện kiểm tra là true hay false
để quyết định nhánh thực hiện
Ví dụ:
int x;
cout << ”Enter a number: ”;
cin >> x;
if ( x > 100)
cout << x << ” is greater than 100” << endl;
else
cout << x << ” is not greater than 100” << endl;
If … Else
Lệnh switch
Lệnh switch được sử dụng khi có nhiều nhánh rẽ
phụ thuộc vào giá trị của cùng một biến.
switch()
{
case:
…
break;
case:
…
break;
default :
…
}
Lệnh switch ...
char c;
cout << ”Enter your choice (a/b/c) : ”;
cin >> c;
switch (c)
{
case ’a’:
cout << ”You picked a!” << endl;
break;
case ’b’:
cout << ”You picked b!” << endl;
break;
case ’c’:
cout << ”You picked c!” << endl;
break;
default:
cout << ”You picked neither a,b,c !” << endl;
}
Lệnh switch ...
Một số lệnh điều khiển khác
break: thoát khỏi vòng lặp hoặc switch
continue: trở lại đầu vòng lặp.
goto: nhảy tới một nhãn xác định
5. Structure
Structure là một tập hợp các biến đơn giản, tương tự như record trong Pascal.
Khai báo Structure:
struct part
{
int modelnumber;
int partnumber;
float cost;
};
Định nghĩa biến kiểu Structure:
part part1;
Khởi tạo các thành phần của Structure:
part part1={6244, 373, 217.55};
Truy cập vào các thành phần của Structure
part1.modelnumber = 6244;
part.modelnumber = 6244; //sai
Hai biến cùng kiểu structure có thể gán cho nhau
part part2;
part2=part1;
Structure lồng
Thành phần của Structure có thể là một structure khác.
struct Distance struct Room
{ {
int feet; Distance length;
float inches; Distance width;
}; };
Truy cập vào các thành phần của Structure lồng
Room dining;
dining.length.feet=13;
Khởi tạo Structure lồng:
Room dining = {{13, 6.5}, {10, 0.0}};
Enumeration
Định nghĩa enum:
enum days_of_week {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
Khai báo biến kiểu enum
days_of_week day1, day2;
Giá trị của các biến kiểu enum là những giá trị mà enum đã định nghĩa trước.
Các giá trị của enum được lưu dưới dạng số nguyên, bắt đầu từ 0.
Ta có thể thay đổi giá trị nguyên của giá trị đầu trong enum
enum days_of_week {Sun=1, Mon, Tue, Wed, Thu, Fri, Sat};
days_of_enum day=Mon;
cout << day; // Hiển thị 2
6. Hàm
Khai báo hàm xác định tên hàm, kiểu trả về, và các tham số cần thiết trong lời gọi hàm.
Khai báo hàm thường nằm trong Header File (.h)
Định nghĩa hàm chứa thân hàm.
Định nghĩa hàm thường nằm trong source file (.cpp)
Ví dụ
int fac(int n); // function declaration
int fac(int n) // function definition
{
int result=1;
for (int i=1; i<=n; i++)
result*=i;
return result;
}
int x=7;
cout << ”fac(” << x <<”)=” << fac(x); // call to a function;
Truyền trị (Passing by Value)
Khi truyền trị, hàm sẽ tạo ra một biến cục bộ để lưu giá trị của biến được truyền.
Giá trị của biến được truyền không thay đổi.
Ví dụ:
void f(int val)
{
val++;
}
int x=4;
f(x);
cout << x; // x = 4
Truyền tham chiếu (Passing by Reference)
Tham chiếu cung cấp bí danh (alias) cho biến.
Khi truyền tham số theo kiểu tham chiếu thì biến cục bộ là bí danh của biến được truyền.
Địa chỉ của biến được truyền cho hàm.
Hàm có thể truy cập trực tiếp trên biến được truyền.
Ví dụ:
void swap (int & a, int& b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
int x=3; int y=5;
swap(x,y); // a,b là bí danh của x,y
Tham số hằng
Tham chiếu hằng không cho phép hàm thay đổi giá trị của biến được truyền.
Ví dụ:
void f( int& a, const int& b ) // b là tham số hằng
{
a=5; // ok
b=7; // fail
}
Chồng hàm (Overloaded Function)
Hàm chồng thực hiện các nhiệm vụ khác nhau phụ thuộc vào các tham số truyền.
Ví dụ:
void print(int a) // in số nguyên
{
cout << ”integer : ” << a;
}
void print(string s) // in xâu ký tự
{
cout << ”string : ” << s;
}
Inline Fuction
….
….
….
….
inline float Function1(int a, int b);
float Function1(int a, int b);
Hàm có tham số mặc định
#include
double logn (double x, double base=10) // mặc định gán base = 10
{
return log(x)/log(base);
}
double y=5.6;
cout << ”log(y) = ” << logn(y) << endl; // sử dụng giá trị mặc định
cout << ”ln(y) = ” << logn(y,2.71828) << endl; // base = e
cout << ”ld(y) = ” << logn(y,2) << endl; // base = 2
Phạm vi của biến
Một khối lệnh (block) nằm trong dấu { … }
Phạm vi của biến là khối lệnh mà biến được khai báo
Biến được khai báo ở ngoài hàm là biến toàn cục (global variable).
Khai báo biến ở block trong sẽ ẩn khai báo biến trùng tên ở block ngoài.
Phạm vi của biến …
int x; // global variable
int main()
{
int i=3; // local variable
{
int j=5; // local variable
int i=7; // local i ẩn biến i ở ngoài
cout << i; // hiển thị 7
} // kết thúc phạm vi của j và i ở trong
cout << i; // hiển thị 3
} // kết thúc phạm vi của i ở ngoài
Nội dung chính
Cấu trúc chương trình
Biến
Toán tử
Các câu lệnh
Structure
Hàm
1. Cấu trúc chương trình
Xét ví dụ sau:
#include
using namespace std;
int main()
{
cout << “Hello world ”;
return 0;
}
Hàm
Câu lệnh: kết thúc bởi dấu “;”
#include: yêu cầu chương trình dịch chèn thêm file vào mã nguồn.
using namespace
cout nằm trong namespace std;
Câu chú thích: Câu chú thích bắt đầu bằng dấu // hoặc nằm trong /* */.
2. Biến
Phải khai báo biến trước khi sử dụng
Có thể khai báo biến ở mọi nơi trong chương trình
Tên biến
Phân biệt chữ hoa, chữ thường
Sử dụng các ký tự từ a-z, 0-9 và dấu “_”
Ví dụ:
int var1;
int var2=10;
Kiểu dữ liệu đơn giản
Kiểu nguyên: int, long, short
Kiểu ký tự: char – lưu mã ASCII của ký tự
Ký tự nằm trong dấu ‘’. Ví dụ: ‘a’
Ký tự đặc biệt: , ab, \, ’, ”, …
Kiểu không dấu: unsigned char, unsigned int, unsigned short, unsigned long
Kiểu dấu phẩy động: float, double, long double
Kiểu bool: có giá trị True/False
Kiểu dữ liệu đơn giản …
Ép kiểu
C++ là ngôn ngữ định kiểu mạnh ().
Ví dụ:
double pi=3.14; // đúng
double x=”Hello”; // sai
Ép kiểu tự động
Ví dụ:
int i = 17;
float x = i; // gán 17 cho x
int j = 2;
float y = i/j; // gán 17/2 = 8 cho y, không phải là 8.5
Thực hiện phép toán trên 2 toán hạng có kiểu khác nhau thì toán hạng có kiểu thấp hơn sẽ tự động bị ép về kiểu cao hơn.
Tự ép kiểu
Ví dụ:
float z = static_cast
Biến hằng (Constant Variables)
Giá trị của hằng không thay đổi.
Có 2 cách khai báo hằng:
const float PI=3.14;
#define PI 3.14
Định nghĩa ở đầu chương trình
Không xác định kiểu của PI
Sử dụng cout
cout là một đối tượng được định nghĩa trước trong C++, tương ứng với luồng ra chuẩn (standard output stream).
Toán tử << là toán tử chèn, định hướng nội dung cần hiển thị.
Ví dụ:
string str=”Hello world”;
int i=8;
cout << str << endl; // endl (hoặc ) là dấu hiệu xuống dòng.
cout << ”i=” << i << endl;
Để định dạng nội dung hiển thị, sử dụng setw (nằm trong iomanip)
cout<< setw(12) << str << setw(5) << i;
Kết quả: Hello world 8
Sử dụng cin
cin là toán tử được định nghĩa trước trong C++, tương ứng với luồng vào chuẩn (standard input stream).
Toán tử >> đưa nội dung từ luồng vào chuẩn vào biến.
Ví dụ:
int temperature;
cout << ”Enter temperature in Celsius: ”;
cin >> temperature;
Header File và Library File
Một số nhiệm vụ được thực hiện bởi Library Function.
Header File chứa khai báo các hàm mà ta cần sử dụng trong chương trình.
Ví dụ:
#include
#include ”myprog.h”
<>: yêu cầu chương trình dịch tìm từ thư mục chuẩn.
” ” : yêu cầu chương trình dịch tìm từ thư mục hiện tại.
Nếu không include Header File thích hợp thì chương trình dịch sẽ báo lỗi.
3. Toán tử
Toán tử toán học
Toán tử quan hệ
Toán tử logic
Toán tử toán học
+, -, *, /, %
Ví dụ:
int i = 1/3; // kết quả i = 0
float x = 1.0/3; // kết quả x=0.3333
int j = 7 % 3; // kết quả j=1
++, --
Ví dụ:
int i=3;
int j=7;
cout << 10 * i++; // hiển thị 30, sau đó i=4
cout << 10 * ++j; // hiển thị 80, sau đó j=8
+=, -=, *=, /=
Ví dụ:
float x=6.0;
x+=3.5; tương tự x=x+3.5;
Toán tử quan hệ
So sánh 2 giá trị.
Kết quả trả về là true hoặc false
>, <, ==, !=, >=, <=
Ví dụ:
int x=44;
int y=12;
(x == y) // false
(x >= y) // true
(x != y) // true
Toán tử logic
logical and : &&
(x >= 5) && ( x <= 15) // true nếu x nằm trong [5,15]
logical or : ||
(x == 5) || ( x == 10) // true nếu x=5 hoặc x=10
logical negation : !
! (x == 5) // true nếu x khác 5
Tương tự x != 5
Toán tử điều kiện (conditional operator) : ? … :
Ví dụ:
min = (alpha
if (alpha < beta)
min = alpha;
else
min = beta;
4. Các câu lệnh
Vòng lặp
Rẽ nhánh
Một số lệnh điều khiển khác
Vòng lặp for
increment expression
test expression
initialization expression
for ( i=0; i<15; i++ )
Có thể đặt nhiều biểu thức trong các phần của vòng for ( ; ; ); các biểu thức đó cách nhau bởi dấu phẩy.
Ví dụ:
for(int j=0, float alpha=100.0; j<50; j++, alpha--)
{
// body for
}
Vòng lặp for ...
int i;
for (i=1; i<=15; i++) // thân vòng lặp for có 1 lệnh
cout << i*i << ” ”;
cout << endl;
for (i=1; i<=15; i++) // thân vòng lặp for có nhiều lệnh
{
cout << setw(4) << i << ” ”;
// setw(n) gán kích thước của trường hiển thị bằng n
int cube = i*i*i;
cout << setw(6) << cube << endl;
}
Vòng lặp while
Vòng lặp while được sử dụng khi không biết trước số lần lặp.
Lặp cho đến khi biểu thức kiểm tra vẫn có giá trị True.
Ví dụ:
char c=’n’;
while ( c != ’y’)
{
cout << ”Do you want to continue: (y/n)” << endl;
cin >> c;
}
Vòng lặp while ...
Vòng lặp do
Trong vòng lặp do, biểu thức kiểm tra được đánh giá ở cuối vòng lặp.
Thân vòng lặp được thực hiện ít nhất một lần.
Ví dụ:
char c;
do
{
cout << ”Do you want to continue: (y/n)” << endl;
cin >> c;
}
while ( c != ’y’);
Vòng lặp do ...
If … Else
Phụ thuộc vào điều kiện kiểm tra là true hay false
để quyết định nhánh thực hiện
Ví dụ:
int x;
cout << ”Enter a number: ”;
cin >> x;
if ( x > 100)
cout << x << ” is greater than 100” << endl;
else
cout << x << ” is not greater than 100” << endl;
If … Else
Lệnh switch
Lệnh switch được sử dụng khi có nhiều nhánh rẽ
phụ thuộc vào giá trị của cùng một biến.
switch(
{
case
…
break;
case
…
break;
default :
…
}
Lệnh switch ...
char c;
cout << ”Enter your choice (a/b/c) : ”;
cin >> c;
switch (c)
{
case ’a’:
cout << ”You picked a!” << endl;
break;
case ’b’:
cout << ”You picked b!” << endl;
break;
case ’c’:
cout << ”You picked c!” << endl;
break;
default:
cout << ”You picked neither a,b,c !” << endl;
}
Lệnh switch ...
Một số lệnh điều khiển khác
break: thoát khỏi vòng lặp hoặc switch
continue: trở lại đầu vòng lặp.
goto: nhảy tới một nhãn xác định
5. Structure
Structure là một tập hợp các biến đơn giản, tương tự như record trong Pascal.
Khai báo Structure:
struct part
{
int modelnumber;
int partnumber;
float cost;
};
Định nghĩa biến kiểu Structure:
part part1;
Khởi tạo các thành phần của Structure:
part part1={6244, 373, 217.55};
Truy cập vào các thành phần của Structure
part1.modelnumber = 6244;
part.modelnumber = 6244; //sai
Hai biến cùng kiểu structure có thể gán cho nhau
part part2;
part2=part1;
Structure lồng
Thành phần của Structure có thể là một structure khác.
struct Distance struct Room
{ {
int feet; Distance length;
float inches; Distance width;
}; };
Truy cập vào các thành phần của Structure lồng
Room dining;
dining.length.feet=13;
Khởi tạo Structure lồng:
Room dining = {{13, 6.5}, {10, 0.0}};
Enumeration
Định nghĩa enum:
enum days_of_week {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
Khai báo biến kiểu enum
days_of_week day1, day2;
Giá trị của các biến kiểu enum là những giá trị mà enum đã định nghĩa trước.
Các giá trị của enum được lưu dưới dạng số nguyên, bắt đầu từ 0.
Ta có thể thay đổi giá trị nguyên của giá trị đầu trong enum
enum days_of_week {Sun=1, Mon, Tue, Wed, Thu, Fri, Sat};
days_of_enum day=Mon;
cout << day; // Hiển thị 2
6. Hàm
Khai báo hàm xác định tên hàm, kiểu trả về, và các tham số cần thiết trong lời gọi hàm.
Khai báo hàm thường nằm trong Header File (.h)
Định nghĩa hàm chứa thân hàm.
Định nghĩa hàm thường nằm trong source file (.cpp)
Ví dụ
int fac(int n); // function declaration
int fac(int n) // function definition
{
int result=1;
for (int i=1; i<=n; i++)
result*=i;
return result;
}
int x=7;
cout << ”fac(” << x <<”)=” << fac(x); // call to a function;
Truyền trị (Passing by Value)
Khi truyền trị, hàm sẽ tạo ra một biến cục bộ để lưu giá trị của biến được truyền.
Giá trị của biến được truyền không thay đổi.
Ví dụ:
void f(int val)
{
val++;
}
int x=4;
f(x);
cout << x; // x = 4
Truyền tham chiếu (Passing by Reference)
Tham chiếu cung cấp bí danh (alias) cho biến.
Khi truyền tham số theo kiểu tham chiếu thì biến cục bộ là bí danh của biến được truyền.
Địa chỉ của biến được truyền cho hàm.
Hàm có thể truy cập trực tiếp trên biến được truyền.
Ví dụ:
void swap (int & a, int& b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
int x=3; int y=5;
swap(x,y); // a,b là bí danh của x,y
Tham số hằng
Tham chiếu hằng không cho phép hàm thay đổi giá trị của biến được truyền.
Ví dụ:
void f( int& a, const int& b ) // b là tham số hằng
{
a=5; // ok
b=7; // fail
}
Chồng hàm (Overloaded Function)
Hàm chồng thực hiện các nhiệm vụ khác nhau phụ thuộc vào các tham số truyền.
Ví dụ:
void print(int a) // in số nguyên
{
cout << ”integer : ” << a;
}
void print(string s) // in xâu ký tự
{
cout << ”string : ” << s;
}
Inline Fuction
….
….
….
….
inline float Function1(int a, int b);
float Function1(int a, int b);
Hàm có tham số mặc định
#include
double logn (double x, double base=10) // mặc định gán base = 10
{
return log(x)/log(base);
}
double y=5.6;
cout << ”log(y) = ” << logn(y) << endl; // sử dụng giá trị mặc định
cout << ”ln(y) = ” << logn(y,2.71828) << endl; // base = e
cout << ”ld(y) = ” << logn(y,2) << endl; // base = 2
Phạm vi của biến
Một khối lệnh (block) nằm trong dấu { … }
Phạm vi của biến là khối lệnh mà biến được khai báo
Biến được khai báo ở ngoài hàm là biến toàn cục (global variable).
Khai báo biến ở block trong sẽ ẩn khai báo biến trùng tên ở block ngoài.
Phạm vi của biến …
int x; // global variable
int main()
{
int i=3; // local variable
{
int j=5; // local variable
int i=7; // local i ẩn biến i ở ngoài
cout << i; // hiển thị 7
} // kết thúc phạm vi của j và i ở trong
cout << i; // hiển thị 3
} // kết thúc phạm vi của i ở ngoài
* Một số tài liệu cũ có thể bị lỗi font khi hiển thị do dùng bộ mã không phải Unikey ...
Người chia sẻ: Đặng Anh Tuấn
Dung lượng: |
Lượt tài: 0
Loại file:
Nguồn : Chưa rõ
(Tài liệu chưa được thẩm định)