1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Giáo trình ngôn ngữ lập trình pascal

89 62 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

Thông tin cơ bản

Định dạng
Số trang 89
Dung lượng 745,08 KB

Nội dung

Để gọi ch-ơng trình đã có trên đĩa: ấn F3 Sau đó cho tên File cả đ-ờng dẫn nếu không nhớ tên ấn phím  Trên màn hình sẽ xuất hiện các File PAS và các th- thoại mục, dùng các phím   để

Trang 1

Phần mở đầu

ĐBài 1 khởi động, cấu trúc cơ bản, kiểu dữ liệu

Khái niệm: Ngôn ngữ lập trình PASCAL là ngôn ngữ lập trình bậc cao:

Quản lý, kỹ thuật, hệ thống (cho phép giải các bài toán trong thực tế)

* Tính lôgic cao thuận tiện cho mô tả thuật toán

I Khởi động và soạn thảo ch-ơng trình

Ch-ơng trình ngoài của File PASCAL có phần mở rộng là PAS

- Ta có sử dụng trên TURBO PASCAL

B-ớc 1: Khởi động PASCAL

Giả sử PASCAL l-u trong th- mục: C:\TP\BIN

Để khởi động yêu cầu tối thiểu 3 File: TURBO.EXE

TURBO.TPL TURBO.TP

Từ môi tr-ờng MSDOS vào th- mục TB\BIN rồi gõ TURBO 

C:>CD TB\BIN 

C:\ TB\BIN> TURBO 

Sau khi gõ TURBO thì xuất hiện màn hình soạn thảo ch-ơng trình

B-ớc 2: Soạn thảo ch-ơng trình: Nh- soạn thảo băn bản

Máy yêu cầu cho biết tên File: Enter File Name VD: :\NAM\Gpt 

(Nếu ch-ơng trình có lỗi thông báo trên màn hình rồi đ-a con trỏ đến dòng

có lỗi)

Nếu còn lỗi nó lại dừng ở dòng có lỗi

Để gọi ch-ơng trình đã có trên đĩa: ấn F3

Sau đó cho tên File (cả đ-ờng dẫn) nếu không nhớ tên ấn phím 

Trên màn hình sẽ xuất hiện các File (PAS) và các th- thoại mục, dùng các phím   để chọ nh- của NC

Trang 2

B-ớc 6: Dịch ch-ơng trình ra File có phần mở rộng EXE

+ Gọi Menu Compiler (Alt + C)

Ban đầu ở Memory, đ-a vệt sáng đến Distination ấn 

{Distination: Memory (DISK)}

+ Sau đó ấn Alt + F9 ch-ơng trình sẽ dịch lên EXE

B-ớc 7: Ra khỏi môi tr-ờng PASCAL ấn Alt + x

(Nếu quên ch-a ghi, máy hỏi có ghi không)

II Cấu trúc cơ bản của ch-ơng trình PASCAL

1 Program Tên ch-ơng trình

2 Uses Khai báo các Unit

3 Const Khai báo các hằng

4 Label Khai báo các nhãn

5 Var Khai báo các biến

6 BEGIN

Các lệnh quảng cáo Các lệnh nhâp dữ liệu Các lệnh tính toán Các lệnh in kết quả

END

* Tên ch-ơng trình: Không phải là tên File, có thể đặt hoặc không đặt

cũng đ-ợc, đặt tên ch-ơng trình là 1 xâu ký tự bất kỳ bắt đầu bằng các chữ cái dài tuỳ ý, không có dấu cách

* Các Unit: Là các đơn vị ch-ơng trình có sẵn của phần mềm TURBO

PASCAL mà ng-ời lập trình đ-ợc phép sử dụng nó

Unit CRT: Chứa tất cả các ch-ơng trình giao diện với màn hình xoá, di chuyển con trỏ

* Các hằng và biến:

+ Hằng: các giá trị của hằng cố định trong suốt quá trình tính toán, PI là

hằng có sẵn trong PASCAL Tất cả các hằng khác dùng phải khai báo

Ví dụ: Const C = 2;

S: = 2 * PI * R; S: = C * PI * R;

Trang 3

+ Biến: Dùng để l-u giữ tạm thời các giá trị trong quá trình tính toán

Tất cả các hằng và biến dùng ở trong ch-ơng trình đều phải khai báo ở đầu ch-ơng trình

- Bắt đầu bằng các chữ cái dài tuỳ ý, ví dụ: CHUVI

- Không đ-ợc dùng từ khoá làm tên biến

- Tên biến không đ-ợc trùng với tên ch-ơng trình

- Cách khai báo:

Var Tên biến: Tên kiểu dữ liệu;

Ví dụ: Var n: Integer (n là biến nguyên)

n: = 3 n

n: = n + 1 (n: mới, vế phải n cũ)  n

- Cấu trúc điều khiển

III Kiểu dữ liệu

a) Kiểu dữ liệu là 1 bộ đôi (M, P) trong đó M là 1 tập các giá trị; P là 1 tập

Trang 4

Khai b¸o Var n, i Integer;

+ C¸c phÐp to¸n: +, -, *, /

* C¶ sè thùc vµ sè nguyªn ®-îc trang bÞ c¸c hµm sè

SQRT (x) (x: lµ sè thùc kh«ng ©m)

Trang 5

VD3: ~ Ln   b /Ln a

Lna

Lnblogb

VD4:

VD5: ab eLnab eb.Lna ~ EXPb*Ln a 

d) Kiểu dữ liệu BOOLEAN

- Khai báo Var b: Boolean;

Biến Boolean là 1 biến lôgic chỉ nhận 1 trong 2 giá trị đúng sai

M

Các phép toán với giá trị Boolean:

P: AND, OR, NOT, XOR

A B A and B A or B Not A A xor B

True False False True False True

False False False False True False

Var A,B :Boolean;

* ODD(n) = True (đúng) nếu n là số lẻ

= False (sai) nếu n là số chẵn VD:

=SQRT(ABS(x-5)+x*x+2)/(EXP(y*ln(2))+sin(x+7))

 

 x * Ln a 

EXP

~ e

e

ax  Lnax  x.Lna

x 7

sin2

2 x5-x

2y  y 

True False

Trang 6

ĐBài 2 Các lệnh in, nhập dữ liệu, xoá màn hình, lệnh gán

1 Lệnh in dữ liệu WRITE, WRITELN

*Cú pháp: Write(gt1, gt2, , gtn);

Gt: - Biểu thức

- Có thể là 1 biến

- Có thể là 1 hằng Tác dụng: In các giá trị lên màn hình và con trỏ không chuyển xuống dòng tiếp theo

Biến, biểu thức mà các giá trị là các số thực để in ở dạng dấu phẩy tĩnh thì

ta phải chỉ ra số ký tự cần thiết và chữ số sau dấu phẩy

Write(a:n:m) nghĩa là in các biến số thực a với n ký tự trong đó có m chữ

số sau dấu phẩy

VD: a:=82.156

Write(a:8:2) kết quả: 82.16 L-u ý: m<n

Các hằng xâu ký tự phải đ-ợc đặt sau dấu nháy đơn

Trang 7

Đặc biệt: Readln: Mục đích dừng màn hình cho đến khi ng-ời dùng gõ 1 phím bất kỳ

Thông th-ờng dùng ngay tr-ớc lệnh End

3 Lệnh CLRSCR

Tác dụng: Xoá màn hình đ-a con trỏ về dòng đầu tiên

Phải sử dụng Unit: Uses Crt tr-ớc khi gõ CLRSCR

Trang 8

C¸c bµi tËp minh ho¹ Bµi 1: ViÕt ch-¬ng tr×nh tÝnh chu vi h×nh trßn khi biÕt b¸n kÝnh

CV:=2*PI*R; {tÝnh chu vi}

Writeln('Chu vi=',CV:8:2); {in kÕt qu¶}

END

Bµi 2: ViÕt ch-¬ng tr×nh tÝnh S tam gi¸c khi hÕt 3 c¹nh

) )(

)(

(p a p b p c p

Trang 9

Bµi 3 Cho c¸c sè thùc x, y, z H·y tÝnh a, b nÕu:

42

x1

y-1-xa

e 3 a

1 -

x -

y x

-y 1

b 3

3 2

y -

x x -

y Ln a

x -

x b 5

5 3

1/3

Trang 11

3 1 2

1

2 2

3 1

2 2

3 1 3

x-dxcx

tg14 3 x

dxcx

-cd-dxcx

2

x

Trang 13

Phần II các cấu trúc điều khiển

Có 3 cấu trúc điều khiển:

- Các lệnh gán và lệnh vào ra dữ liệu đều là lệnh đơn

- Lệnh kép: Nhiều lệnh đơn viết trong một cặp

End Gọi là lệnh kép

Chỗ nào viết đ-ợc lệnh đơn thì chỗ ấy viết đ-ợc lệnh kép

2, Cấu trúc điều khiển: IF

Trang 14

IF b > max Then max: = b;

IF c > max Then max: = c;

Writeln ('max = ', max: 8:2);

Trang 16

Bµi tËp: Cho sè thùc x TÝnh hµm f(x) nh- sau:

Trang 17

If b<>0 Then Writeln(' Ph-¬ng tr×nh v« nghiÖm')

Else Writeln('Ph-¬ng tr×nh v« sè nghiÖm');

y

Trang 19

Writeln('Ph-¬ng tr×nh cã 2 nghiÖm ph©n biÖt');

If DT=0 Then Begin

Writeln('Ph-¬ng tr×nh cã 1 nghiÖm kÐp');

x:=(-b/(2*a));

Writeln('x= ', x:8:2);

End Else Writeln(' Ph-¬ng tr×nh v« nghiÖm');

a

b x

2

2

2 1

a

b x

2

Trang 20

Bµi tËp 6: Cho 1 sè tù nhiªn n<=100

Chuc: = (n - 100 * Tram) div 10;

Donvi:= n - 100 * Tram - 10 * Chuc;

If n = 100 Then Writen (n,' lµ sè cã 3 ch÷ sè') Else

If n > 10 then Writeln (n,' lµ sè cã hai ch÷ sè') Else Writeln (n,' lµ sè cã 1 ch÷ sè');

Writeln (' Tæng c¸c ch÷ sè = ', Tram + Chuc + Donvi);

Trang 21

Else

If (ABS(C1 - C2) = 2) and (ABS(H1 - H2)=1)

or (ABS(C1 - C2) = 1) and (ABS(H1 - H2) = 2) Then

Writeln ('an duoc nhau');

Else Writeln (' kh«ng ¨n ®-îc nhau');

Readln;

END

Trang 22

Bµi tËp 8: Cho 3 sè thùc bÊt kú ABC h·y thay sè lín nhÊt b»ng trung b×nh céng

cña 3 sè lµ, sè nhá nhÊt; 1/2 trung b×nh céng cña 3 sè, nÕu 3 sè b»ng nhau th× gi÷ nguyªn

IF b > max Then max: = b;

IF c > max Then max: = c;

min: = a;

IF b < min Then min: = b;

IF c < min Then min: = c;

IF min <> max Then Begin

Trang 23

ĐBài 2 Cấu trúc tuyển chọn

1, Kiểu miền con

Khai báo: Chỉ ra giá trị cận trên, cận d-ới của các miền

Ví dụ: Var chuso: 0 9;

Tập đếm đ-ợc Var a : 0.3 0.5

Nếu biến thuộc tập hằng 1 thì S1 đ-ợc thực hiện còn các lệnh khác thì bỏ qua

Nếu không thuộc tập hằng 1 kiểm tra xem có thuộc tập hằng 2 hay không?

Nếu tập hằng i là tập đầu tiên chứa giá trị của biến thì lệnh Si đ-ợc thực hiện

Nếu không tập hằng nào chứa giá trị của biến thì không lệnh nào đựơc thực hiện

S1  Sn có thể là lệnh đơn hoặc kép

Các cấu trúc Case cũng đ-ợc coi là một lệnh

Program Xem boi;

2: Writeln ('Chỉ yêu một mình anh');

3: Writeln ('Chỉ yêu anh và bạn của anh');

4: Writeln ('Yêu tất cả những ai hỏi');

End;

Readln;

END

Trang 24

Bài 2: Cho một số có 3 chữ số viết ch-ơng trình in ra 1 dòng chữ tiếng việt

không dấu biểu diễn số đó

Trang 25

Case DV of 1: Write ('Mot ');

NÕu biÕn kh«ng thuéc tËp h»ng nµo th× lÖnh (Sn + 1) ®-îc thùc hiÖn

ë d¹ng 2 bao giê còng cã duy nhÊt mét lÖnh ®-îc thùc hiÖn

Dv: = n mod 10;

Case dv of

0, 5: Writeln (n,' Chia hÕt cho 5');

Else Writeln (n,' Kh«ng chia hÕt cho 5');

END;

Trang 26

Begin Write ('a='); Readln (a);

Write ('b='); Readln (b);

S: = a * b Write ('S=',S : 8 : 2);

End;

3:

Begin Write ('R = '); Readln (R);

Trang 27

ĐBài 3: Cấu trúc lặp với lệnh For Dạng 1:

Biến chạy: Là 1 biến thuộc biến đếm đ-ợc (kiểu số nguyên) (Byte, Integer) Gt1, gt2 là thuộc cùng 1 kiểu với biến chạy

S có thể là lệnh đơn hoặc lệnh kép

Đầu tiên biến đ-ợc gán bằng

Gt1 sau đó máy kiểm tra BTLG nếu

vẫn ch-a v-ợt quá Gt2 thì S đ-ợc thực hiện, thực hiện xong lệnh S biến

đ-ợc tự động nhận giá trị tiếp theo

Sau đó lại quay về kiểm tra BTLG và vòng lặp kết thúc khi biến lớn hơn GT 2

Giả sử I: = 1 to 5 do S;

Nếu Gt1 <= Gt2 thì vòng lặp S đựơc thực hiện gt2 - gt1 + 1 lần

Nếu Gt1 > Gt2 thì S không thực hiện lần nào

Cả cấu trúc For cũng đ-ợc coi là một lệnh

Trong S có thể chứa cấu trúc For khác khi đó ta đ-ợc các cấu trúc For

lồng nhau

Sau mỗi lần lặp biến chạy tự động nhận giá trị tiếp theo do đó trong số các

lệnh của S không đ-ợc có lệnh nào làm thay đổi giá trị của biến chạy

(Biến chạy không đựơc phép có mặt ở vế trái bất kỳ lệnh gán nào trong số

các lệnh của S)

INC(I) ~ I:=I+1 PRED(I) ~ I:=I-1

FOR Biến chạy:= Gt1 TO Gt2 DO S

Trang 28

Trang 29

n 1

1

4

13

12

11

Trang 30

Dạng 2:

Biến đ-ợc gán bằng GT1 sau đó kiểm tra điều kiện nếu Biến vẫn lớn hơn

hoặc bằng GT2 thì lệnh S đ-ợc thực hiện Sau đó Biến đ-ợc giảm đi 1 rồi lại quay về kiểm tra điều kiện vòng lặp kết thúc khi Biến nhỏ hơn GT2

Nếu gt1 < gt2 thì vòng lặp không đ-ợc thực hiện lần nào

Gt1 > gt2 vòng lặp thực hiện với số lần: gt1 - gt2 + 1

Cả cấu trúc For cũng đựơc coi là một lệnh

(1) Tính

 For i:=1 to n do T: =T * (1+ 1/(i * i))

FOR biến: = Gt1 DOWNTO Gt2 DO S

3

112

111

11

n n

11

i T

T(i-1)

Trang 31

2 2

T2

2 2

Trang 32

(3) T = Sin (1) + Sin(2) + + Sin(n)

Trang 33

) 1 (

Cos Sin

) 2 ( )

1 (

) 2 ( )

1 (

Cos Cos

Sin Sin

!

)(

!2

)2(

!1

)1(

n

n Sin Sin

Sin

Trang 34

12 9

6

Ti-1

Trang 35

Writeln (‘T =’, T : 10 : 8);

Readln;

END

Trang 36

1

1 1

a

Trang 37

ĐBài 4: Cấu trúc lặp với lệnh While

Đầu tiên BTLG đ-ợc kiểm tra nếu đúng, lệnh S đ-ợc thực hiện, thực hiện xong lại quay về kiểm tra BTLG Vòng lặp kết thúc khi BTLG sai Nếu lúc đầu

BTLG sai thì lệnh S không đ-ợc thực hiện lần nào

Nếu BTLG đúng thì trong số các lệnh của S phải có một lệnh làm cho

BTLG đến 1 lúc nào đó trở thành sai, nếu không thì vòng lặp thực hiện vô hạn

lần

* Dữ liệu ký tự

Khai báo

Var Tên biến : Char;

Ví dụ: Var TL: Char;

Trong đó Pascal có tất cả 256 ký tự khác nhau mỗi ký tự có 1 mã gọi là mã ASCII, mã ASCII của các ký tự nhận giá trị từ 0 -> 255

Các giá trị của ký tự được đặt trong ‘A’, ‘b’, ‘9’

Trang 38

‘ ‘ 32 (chữ hoa và chữ thường cách nhau ‘ ‘ 32)

(97 - 65 = 32) Các chữ cái la tinh đ-ợc xắp xếp liên tiếp mã ASCII

n là một biến của Byte

Hàm này cho ta ký tự có mã ASCII = n

Trang 40

Integer: BiÕn sè nguyªn VD: n, d, i: Integer

Trang 41

ĐBài 5: Cấu trúc lặp với lệnh REPEAT REPEAT

S;

Until BTLG;

Đầu tiên lệnh S đ-ợc thực

hiện sau đó máy kiểm tra

BTLG, sai lại quay về thực

hiện S Vòng lặp kết thúc khi BTLG đúng

Sự khác nhau giữa Repeat Until và While:

+ ở While BTLG đ-ợc kiểm tra tr-ớc (kiểm tra biểu thức lôgic tr-ớc) rồi

mới thực hiện S;

+ Còn ở Repeat thì thực hiện S rồi mới kiểm tra BTLG

Cho nên ở vòng lặp While S không đ-ợc thực hiện lần nào nếu nh- biểu thức lôgic ban đầu là sai, còn ở Repeat thì S đ-ợc thực hiện ít nhất 1 lần Vì vậy khi nào cần vòng lặp thực hiện ít nhất 1 lần nên dùng Repeat

- ở vòng While: Vòng While kết thúc khi biểu thức lôgic sai

- Còn vòng Repeat kết thúc khi biểu thức lôgic đúng

- ở cấu trúc Repeat nếu S là lệnh kép cũng không cần phải viết trong

cặp Begin - End

S

s

Trang 42

VD: ViÕt ch-¬ng tr×nh tÝnh chu vi ®-êng trßn

Trang 44

Hàm: GOTOXY(Cột, hàng)

Đ-a con trỏ tới toạ độ đ-ợc xác định bởi cột và hàng

VD: GOTOXY(5,10); đ-a con trỏ tới cột 5 và hàng 10 trên màn hình

Hàm: Where X

Cho biết toạ độ cột con trỏ trên màn hình

Hàm: Where Y: Tọa độ hàng của con trỏ trên màn hình

Trang 45

Bµi tËp: Cho 2 sè tù nhiªn n, m t×m -íc chung lín nhÊt cña n, m

ThuËt to¸n ¬ c¬ lit

r=15; n=30; m=15;

r=0; n= 15; m= 0;

Trang 46

TÝnh BSCNN cña n vµ m

BSCNN: 15, 9

d = UCLN(15,9) = 3 BCNN = 15 * 9 div 3

Trang 47

Bµi t©p:

TÝnh n!!= 1.3.5 n nÕu n lÎ

= 2.4.6 n nÕu n ch½n (0!! = 2; 0! = 1)

Trang 48

Kiểu Boolean

(m, p)

Các biến của BOOLEAN chỉ nhận 1trong 2 giá trị

True (đúng) False (sai) P: Các phép toán: AND, OR, NOT, XOR

Var A, B: BOOLEAN

Mỗi biến Boolean cũng đ-ợc coi là 1 biểu thức lôgic

Var A: Boolean Var A: Boolean

Trang 49

If n mod i = 0 Then NT: = False Else i: = i + 1;

If NT then Writeln (n, ‘ Lµ sè nguyªn tè’);

i: = 2; NT: = True;

While (i<= SQRT(n)) and NT do

If n mod i = 0 then NT: = False Else i: = i + 1;

If NT then Write (n, ‘ ‘);

End;

Readln;

END

Trang 50

If k*(k+1)*(k+2) = m then Writeln (K, ‘ ‘; k+1, ‘ ', k + 2);

Trang 51

ĐBài 6: Mảng

Mảng là một tập hợp các giá trị thuộc cùng 1 kiểu dữ liệu

- Mảng có hai loại mảng 1 chiều và mảng nhiều chiều

- Miền chỉ số: Chỉ ra cận d-ới và cận trên của các chỉ số

- Kiểu dữ liệu: Kiểu dữ liệu các phần tử của mảng

VD: Var A:ARRAY [1 100] of Real;

A là 1 mảng chứa tối đa 100 ký tự

Các phép toán đối với mảng: Truy nhập theo chỉ số

Trang 52

Bµi 1: Cho n sè thùc bÊt kú a 1 , a 2 , a n

Trang 53

Bµi 2: ViÕt ph-¬ng tr×nh tÝnh tÝch v« h-íng cña 2 vÐc t¬: X, Y;

Write('X [', i, ']=');

Readln(X[i]);

End;

For i: = 1 to n do Begin Write ('Y[',i,']=');

Readln (Y[i]);

End;

T: = 0 For i: = 1 to n do T:=T+X[i]*Y[i];



Trang 54

Bµi 3: ViÕt ch-¬ng tr×nh tÝnh trung b×nh céng c¸c sè thùc

Readln (X[I]);

End;

T = 0;

For i: = 1 to n do T:=(T+X[i]);



Trang 55

Readln (A[i]);

End;

TA: = 0; TD: = 0; SA: =0; SD: = 0;

For i: = 1 to n do Begin

If A[i] < 0 then Begin SA: = SA + 1;

TA:=TA+A[i];

End;

If A[i] > 0 then Begin SD: = SD + 1;

TD: = TD + A[i];

End;

End;

If SA > 0 then Begin TA: = TA/SA;

Writeln(‘TBC các số âm =’, TA : 8 : 2);

End Else Writeln (‘Không có số âm’);

If SD > 0 then Begin TD: = TD/SD;

Writeln(‘TBC các số dương =’, TD : 8 : 2);

End Else Writeln(‘Không có số dương’);

Readln;

END

Trang 56

Bµi 5: Cho n sè thùc a1, a2, an vµ 2 sè thùc x, y (x<=y) tÝnh Trung b×nh céng

Writeln (‘T=’, T: 8 : 2);

Else Writeln (‘ Kh«ng cã sè nµo trong [x, y]’) Readln;

END

Trang 57

ThuËt to¸n t×m phÇn tö nhá nhÊt (lín nhÊt)

Cho mét d·y sè thø tù a 1 , a 2 , a n T×m phÇn tö nhá nhÊt

Var A [1 max] of Real;

Trang 58

VÝ dô: Cho n sè thùc a1, a2, an vµ 2 sè thùc x, y H·y t×m phÇn tö lín nhÊt trong

For i: = 2 to d do

IF B[i] > LN then LN:=B[i];

Writeln('Gi¸ trÞ lín nhÊt',LN:8:2);

End Else Writeln('Kh«ng cã sè nµo trong [x,y]');

Readln;

END

Trang 59

2 sin 1 sin

21

a i

a

sin 1 sin

1

1 sin

Trang 60

Bài 2 Cho n số tự nhiên k1, k2, kn

Tính tổng các số nguyên tố trong số đó (các chỉ số của mảng k1 kn)

Write(‘K[‘,i,‘]=’); Readl (K[i]);

End;

For i: = 1 to n do Begin

j: = 2; NT: = True;

While (J<=SQRT(K[i])) and NT do

If K[i] mod J = 0 then NT: = False Else j: = j + 1;

End;

Begin T: = 0;

Trang 61

ThuËt to¸n s¾p xÕp

Cho phÇn tö a1, a2, an

S¾p xÕp l¹i phÇn tö nµy theo thø tù t¨ng dÇn vµ gi¶m dÇn

ThuËt to¸n sñi bät (Buble Sort)

For i: =1 to n-1 do For j:= i+1 to n do

If A[i]>A[j] then Begin

Var k: Array [1 100] of Integer;

i, j, n: Integer; Temp: Real;

BEGIN

CLRSCR;

Write(‘n=’); Readln (n);

For i:=1 to n do Begin Write(‘A [‘,i,‘j =’); Readln(A[i]);

End;

For i: =1 to n-1 do For j:= i+1 to n do

IF A[i]>A[j] then Begin

Ngày đăng: 13/09/2019, 10:24

TỪ KHÓA LIÊN QUAN

w