1. Trang chủ
  2. » Giáo án - Bài giảng

DE CUONG ON TIN 6

14 350 0
Tài liệu đã được kiểm tra trùng lặp

Đ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 14
Dung lượng 74,5 KB

Nội dung

Tiết 29 Bài toán, thuật toán và giải thuật I. Thuật giải và chơng trình 1. Thuật giải Giáo s Wirth, ngời sáng tác ra Pascal đã viết một cuốn sách với một câu triết lý ALGOIRTHMS + DATA STRUCTUES = PROGRAMS Nghĩa là Thuật giải + Cấu trúc dữ liệu = Chơng trình - Định nghĩa: Thuật giải ( thuật toán ) là một tập hợp hữu hạn các thao tác (các công việc, các phép toán .) có thể đặt tên đợc và đợc thực hiện theo một trình tự thích hợp đối với một số đối tợng nào đó để đạt đợc điều mong muốn. 2. Chơng trình - Định nghĩa: Chơng trình là tập hợp các dãy lệnh điều khiển máy tính thực hiện. Nh vậy có thể nói một chơng trình là một cách diễn tả thuật giải trong một ngôn ngữ chính xác để máy có thể hiểu đợc. 3. Các cách diễn đạt thuật giải a. bằng lời thí dụ:Thuật giải nấu cơm có thể viết nh sau: Bớc 1: Lấy gạo theo định lợng cần thiết Bớc 2: Vo gạo và đổ gạo nớc vào nồi Bớc 3: Đun sôi cạn nớc Bớc 4: Giữ lửa nhỏ Bớc 5: Các 5 phút một: nếm cơm xem chín cha Nếu cha chín quay về bớc 5 Nếu chín thì chuyển sang bớc 6 Bớc 6: Tắt lửa và bắc nồi cơm ra. Kết thúc b. Bằng ngôn ngữ lập trình Pascal là một trong những ngôn ngữ thuật giải, nghĩa là tự nó đã diễn tả thuật giải cần tiến hành. Đây là một u điểm nổi trội của Pascal giúp cho ngời lập trình có ngay t duy xây dựng thuật giải mà không cần dùng lu đồ. c. Bằng lu đồ II.Các khái niệm cơ bản của ngôn ngữ Turbo pascal 1. Bộ kí tự: Bao gồm: - Các chữ cái ( chữ thờng, chữ hoa) - Các chữ số thập phân - Các dấu toán học thông thờng - Dấu gạch nối - Các kí hiệu đặc biệt: .,;? % @ $ # ^ 2. Từ khoá Là các từ riêng của Pascal ( từ tiếng anh), có nghĩa đợc xác định, không đợc dùng nó vào việc khác hoặc đặt tên mới trùng với các từ khoá. Có các loại từ khoá: - Từ khoá chung: PROGRAM, BEGIN, END, 1 - Từ khoá để khai báo: CONST, VAR, TYPE, ARRAY, STRING . - Từ khoá của lệnh lựa chọn: IF THEN .ELSE, CASE OF - Từ khoá của lệnh lặp: FOR TO DO, FOR . DOWNTO DO - Từ khóa điều khiển: WITH, GOTO - Từ khoá toán tử: AND, OR, NOT, IN, DIV, MOD 3. Tên chuẩn: Là tên đã đợc định nghĩa sẵn trong PascaLdùng để chỉ các hằng, các biến. Sự khác nhau giữa các từ khoá và tên chuẩn là tên chuẩn có thể đặt lại và dùng vào việc khác nếu muốn, còn từ khoá phải dùng đúng với qui định của Pascal. 4. Tên: Là danh hiệu từ đặt cho tên biến, tên hằng, và tên kiểu dữ liệu, tên chơng trình con. Tên là một dãy kí tự đợc bắt đầu bằng một chữ cái, sau đó là các chữ cái, chữ số hay dấu nối Ví dụ: Tên đúng: x, Biến_đếm, S1, PT_Bậc 2 Tên sai: PT bậc 2, 3ABC, g(x). Pascal không phân biệt chữ hoa hay chữ thờng trong một danh hiệu. Chú ý: Khi viết chơng trình ta nên đặt các danh hiệu sao cho nói lên đợc ý nghĩa các đối tợng mà chúng biểu thị nhng đồng thời phải ngắn gon. III. Cấu trúc của một chơng trình Pascal 1. Cấu trúc tổng quát:Một chơng trình Pascal đầy đủ phải gồm 3 phần sau: Phần 1: Phần tiêu đề của chơng trình PROGRAM Tên_Chơng_Trình; Phần 2: Phần khai báo để mô tả các đối tợng của chơng trình, các kiểu dữ liệu USES ; {Khai báo các unit} CONST .; {Khai báo các hằng} TYPE ; {Khai báo các kiểu dữ liệu mới} VAR .;{Khai báo các biến} Phần 3: Phần thân chơng trình chứa các lệnh để máy tính thực hiện BEGIN (*Các lệnh của chơng trình*) END. Chú ý: - Phần 1: Có thể có hoặc không. Tên chơng trình do ngời lập trình tự đặt và sau nó phải có dấu chấm phẩy - Phần 2: Tuỳ theo chơng trình cụ thể mà khai báo có thể có hay không và có thể lặp lại một số lần. - Phần 3: Phần này bắt buộc phải có đối với mọi chơng trình. Cuối chơng trình có dấu chấm. - Lời giải thích: Trong chơng trình có thể đa vào các lời giải thích, ghi chú để dễ đọc, dễ hiểu hơn mà không ảnh hởng đén sự làm việc của chơng trình. Các lời giải thích đợc đặt trong dấu{} hay (* .*) 2 - Dấu chấm phẩy dùng để ngăn cách các câu lệnh của Pascal. Trớc END. Không có dấu chấm phẩy - Câu lệnh: Một chơng trình gồm các câu lệnh, mỗi câu lệnh thực hiện một công việc nào đó. Trên một dòng có thể viết 1 hoặc nhiều câu lệnh 2. Các bớc để chạy một chơng trình Ví dụ: Tạo lập và in ra màn hình hai dòng thông báo sau TURBO PASCAL XIN chào các bạn yêu thích tin học Bớc 1: Khởi động Pascal Bớc 2: Lập trình a. Đặt tên chơng trình Đa hộp sáng tới menu File ấn ENTER hoặc nhấn tổ hợp phím ALT+F sẽ xuất hiện bảng chọn dọc, trong bảng chọn này ta chọn vào mục SAVE hoặc ấn tổ hợp phím F2 màn hình xuất hiện hộp đối thoại, ghi tên tệp vào mục FILE NAME rồi ấn ENTER. b. Soạn thảo văn bản chơng trình Program VD1; Uses CRT; Begin CLRSCR; Writeln(TURBO PASCAL); Writeln(XIN chào các bạn yêu thích tin học); END. Soạn thảo xong muốn ghi văn bản nhấn F2 Bớc 3: Dịch chơng trình ấn ALT+ F9 Bớc 4: Biên dịch và thực hiện chơng trình: CTRL+ F9 Khi dịch, máy sẽ kiểm tra ngữ pháp của từng lệnh, gặp lệnh nào sai hay nhập sai máy dừng lại, trên màn hình có thông báo nguyên nhân sai của lỗi, tiến hành sửa lỗi và gõ lại CTRL+ F9 để chạy tiếp. Bớc 5: Thoát khỏi Pascal: ALT+X 3 Tiết 30 Bảng kí tự và các kiểu dữ kiệu đơn giản chuẩn của Pascal I. Các kiểu dữ liệu cơ sở 1. Kiểu lôgíc Kiểu lôgíc chỉ có hai giá trị: TRUE (Đ), FALSE(S) Các phép toán của kiểu lôgíc: AND, OR, NOT, XOR Tác dụng của các phép toán thể hiện trong bảng sau: A B NOT A A AND B A OR B A XOR B TRUE TRUE FALSE FALSE TRUE FALSE TRUE FALSE FALSE FALSE TRUE TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE FALSE FALSE TRUE TRUE FALSE 2. Kiểu số nguyên - Có năm kiểu số nguyên: shortint, byte, Integer, Word, Longint. - Kích thớc và phạm vi biểu diễn của chúng nh sau: Tên Miền trị Yêu cầu bộ nhớ shortint -128 đến 127 1 byte Integer -32768 đến 32767 2 byte Longint -2147483648 đến 2147483647 4 byte byte 0 đến 255 1 byte Word 0 đến 65553 2 byte - Các phép toán: +, -, *( nhân), /( chia), DIV( chia lấy phần nguyên), MOD ( chia lấy phần d). Chú ý: - Các giá trị kiểu Byte và Word là số nguyên không dấu - Cho phép sử dụng các số nguyên có độ lớn trong phạm vi Longint - Khi viết số nguyên phải tuân theo qui định sau o Các chữ số viết phải liền nhau o Dấu + hay phải đặt ngay trớc chữ số đầu tiên o Không đợc sử dụng chữ số thập phân 3. Kiểu số thực - Có năm kiểu số thực: Single, Real, Doule,extended và Comp. - Kích thớc và phạm vi biểu diễn của chúng đợc biểu diễn nh sau: Tên Miền trị Yêu cầu bộ nhớ Single 1.5*10 -45 đến 3.4*10 38 4 byte Real 2.9*10 -39 đến 1.7*10 38 6 byte Doule 5.0*10 -324 đến 1.7*10 308 8 byte extended 3.4* 10 -4932 đến 1.1*10 4932 10 byte Comp -9.2*10 18 đến 9.2*10 18 8 byte - Các phép toán: +, -, *, / - Cách viết số thực: Các giá trị thực đợc viết theo 2 cách 4 + Cách 1: Số đợc viết theo cách thông thờng, ví dụ 234.56, -125.5 + Cách 2: Số đợc tách ra thành 2 phần chính là định trị và bậc. Phần định trị là một số nguyên hoặc thực. Phần bậc là một số nguyên. Hai phần này đợc cách nhau bởi chữ E hoặc e Chú ý: - Các kí tự biểu diễn một số thực phải liền nhau 4. Kiểu kí tự ( Char) Một giá trị kiểu Char chiếm 1 byte và biểu diễn một kí tự thông qua bảng mã ACSII. Mã của một kí tự chính là số thứ tự của nó trong bảng mã (xem phần biểu diễn cuối sách). Có tất cả 256 kí tự đánh số từ 0 đến 255 Để biểu diễn kí tự ta dùng 1 trong các ba cách sau: - Đặt kí tự trong 2 dấu nháy đơn: Ví dụ A, B, * . - Dùng hàm Chr(n) trong đó n là mã của kí tự cần biểu diễn. Ví dụ chr(65) là A. - Dùng #n Ví dụ #65 Kiểu kí tự chỉ có phép toán so sánh, sự so sánh dựa vào mã kí tự ch. Ví dụ A < a Hàm Upcase(ch): Cho ra kí tự hoa tơng ứng với kí tự ch. Ví dụ Upcase(a) = Avà Upcase(B) = B 5. Kiểu xâu kí tự( String) Một giá trị kiểu string là một dãy kí tự bất kì đặt trong hai dấu nháy đơn. Số kí tự trong dãy không quá 255. Xâu không có kí tự gọi là xâu rỗng. Ví dụ Ho va ten: 9 kí tự : Xâu rỗng Lu ý: Việc dùng kiểu dữ liệu nào là phải phù hợp với bài toán đó sao cho chiếm dụng bộ nhớ là tối u. II. Khai báo hằng, biến, kiểu dữ liệu, biểu thức và các hàm chuẩn 1. Khai báo hằng Hằng là một đại lợng có giá trị xác định và không thay đổi. Hằng đợc khai báo bằng từ khoá CONST nh sau CONST Tên_hằng=giá_trị_hằng; Hay CONST Tên_hằng=biểu_thức_hằng; Ví dụ Const g=9,81; Q=2*g; 2. Khai báo biến Biến là đại lợng mà trị của nó có thể thay đổi khi thực hiện chơng trình, mỗi biến phải thuộc về một kiểu dữ liệu nhất định. Biến của chơng trình là tên một vùng nhớ lu trữ dữ liệu. Vùng bộ nhớ của biến kiểu Integer chỉ chứa các giá trị integer. Tơng tự kiểu biến Real chỉ chứa đợc các giá trị Real . Mọi biến trứơc khi sử dụng trong chơng trình cần đợc khai báo sau từ khoá VAR nh sau: VAR Tên_biến:kiểu_dữ_liệu_của_biến Trong đó: Tên biến do ngời lập trình đặt 5 Kiểu dữ liệu là kiểu dữ liệu đã xét Ví dụ Var x,y,z:Real; a: Integer; Các biến đợc cấp phát bộ nhớ khi khai báo Chú ý: - Có thể vừa khai báo vừa gán giá trị cho các biến nh sau: Const H=56.0 X:real=25.58; Địa chỉ: String[30]=dai tu thai nguyen; - Cần phần biệt giữa h và x; h là hằng thực còn x là biến thực. Trong chơng trình có thể thay đổi giá trị của x nhng không thể thay đổi giá trị của h. 3. Khai báo kiểu dữ liệu mới bằng cách sử dụng từ khoá TYPE TYPE Tên kiểu dữ liệu = kiểu dữ liệu mới; Trong đó kiểu dữ liệu mới do ngời lập trình tự đặt. Sau đó khai báo các biến thuộc kiểu dữ liệu này. Ví dụ Type Color =do; Xedap = viha; Var Màu: color; Xe: xedap; 4. Biểu thức Một biểu thức đợc tạo bởi phép toán và các toán hạng dùng để thể hiện một công thức toán học. Toán hạng có thể là các hằng, biến, phần tử mảng. Ví dụ a. Biểu thức số học: X1= (-b+SQRT(b*b 4*a*c)/(2*a)); b. Biểu thức logic: x+b < 5-a; c. Biểu thức chuỗi: Thành phố + Hà Nội= Thành phố Hà Nội Chú ý: Một hằng, một biến, một hàm cũng đợc xem là biểu thức, đó là biểu thức đơn giản. Thứ tự u tiên các phép toán đợc thể hiện qua bảng sau: Thứ tự u tiên Phép toán Giải thích 1 2 3. 4. 5. ( .) Not, +, - *,/, DIV, MOD, AND +,-,Or, xor >,>=,<,<=,=,<> Phép toán trong ngoặc, trong hàm Phép toán 1 toán hạng Phép toán có tính nhân Phép toán có tính cộng Phép toán quan hệ 5. Các hàm chuẩn 6 Trong Pascal có các hàm chuẩn sau Hàm số học Tên hàm Kiểu của đối số Kiểu của hàm x 2 SQR(x) Nguyên hay thực Giống đối x ABS(x) Nguyên hay thực Giống đối arctanx ARCTAN(x) Nguyên hay thực Thực cosx cos(x) Nguyên hay thực Thực sinx sin(x) Nguyên hay thực Thực x SQRT(x) Nguyên hay thực Thực lnx Ln(x) Nguyên hay thực Thực e x EXP(x) Nguyên hay thực Thực Lấy phần nguyên Trunc(x) Nguyên hay thực Nguyên INT(x) Nguyên hay thực Nguyên Lấy phần thập phân Fra(x) Thực Thực Làm tròn Round(x) Nguyên hay thực Nguyên pred Nguyên, logíc, kí tự Giống đối số Succ Nguyên, logic, kí tự Giống đối số Ord Kí tự Nguyên Chr Nguyên Kí tự Logíc Odd Nguyên logíc Giải thích ý nghĩa của các hàm thứ tự và logíc - Nếu i là một giá trị nguyên thì Ord(i)=i pred(i)=i-1 Succ(i)=i+1 - Nếu ch là một kí tự thì Ord(ch)= mã ASCII của ch pred(ch)= chr(Ord(ch)-1) Succ(ch)=chr(Ord(ch)+1) - Với giá trị logíc thì Ord(False)= 0 Ord(True)=1 Fred(True)=False succ(False)=true 5. Câu lệnh Câu lệnh trong chơng trình Pascal xác định các công việc mà chơng trình phải thực hiẹn để xử lý dữ liệu đã đợc khai báo Câu lệnh đợc chia làm hai loại: Câu lệnh đơn giản và lệnh có câu trúc - Lệnh đơn giản là lệnh không chứa các lệnh khác, bao gồm: + Vào dữ liệu: Readl, readln; + Ra dữ liệu: Write, Writeln + Lệnh gán giá trị: := + Lệnh nhảy: goto + Lời gọi chơng trình con - Lệnh có cấu trúc gồm các loại lệnh + Lệnh rẽ nhánh: IF THEN ELSE 7 + LÖnh lùa chän: Case .of + LÖnh lÆp: FOR .TO .DO + lÖnh ghÐp: Begin .End TiÕt 31 8 Các lệnh và các hàm cơ bản của Pascal I. Các thủ tục xuất nhập dữ liệu 1. Thủ tục nhập dữ liệu Chức năng: Dùng để vào dữ liệu từ bàn phím cho các biến Cú pháp: READ(Biến 1, biến 2, biến 3 .); READLN(Biến 1, biến 2, biến 3 .); READLN; ở đây biến1, biến 2, biến 3 . là các biến( hay phần tử mảng)nguyên, thực, ký tự hay chuỗi. Chú ý: Các biến ở đây thuộc kiểu nguyên, thực, kí tự hay xâu kí tự. Do đó chỉ nhập từ bàn phím các giá trị số và kí tự. Khôn đợc nạp giá trị True hay False cho một biến Boolean. a. Sự hoạt động của Readln(biến1, biến 2, biến 3 .) Khi gặp câu lệnh này máy dừng để đợi nạp dữ liệu. Quy tắc thu nhận kí tự của từng kiểu biến nh sau: - Mỗi phím đợc bấm sẽ cho một kí tự, riêng phím Enter cho 2 kí tự: CR(mã 13) và LF(mã 10). - Biến số (nguyên, thực) bỏ qua CR, LF và dấu cách Space. Sau khi đã nhận đợc một chữ số thì Space hoặc Enter sẽ kết thúc việc nhận số liệu của biến số. Chú ý: *)Biến nguyên chỉ nhận đợc dãy kí tự biểu diễn một giá trị nguyên trong phạm vị biểu diễn của nó. - Biến thực có thể nhận đợc dãy kí tự biểu diễn một giá trị nguyên hay thực. - Biến kí tự chỉ nhận đúng một kí tự. Các ký tự còn lại dành cho các biến tiếp theo. - Biến chuỗi nhận đợc một số kí tự không vợt qua độ dài của nó. Các kí tự còn lại dành cho các biến tiếp theo. Phím Enter kết thúc việc nhận số liệu của một dãy liên tiếp các biến chuỗi. Biến nào cha kịp nhận sẽ chứa xâu rỗng. *) Ra khỏi Readln: Máy chỉ ra khỏi lệnh này khi đã bấm đủ để cung cấp giá trị cho các biến và phải bấm thêm phím Enter. Các kí tự d thừa sẽ bị bỏ qua ( không đợc xét đến trong thủ tục Readln tiếp theo). Ví dụ Read(a,b); Read(x); ở đây a, b là hai biến nguyên, x là biến thực. Nếu bấm phím 19 15 25.6 23 thì a nhận số 19, b nhận giá trị 15 còn các giá trị khác bị bỏ qua và không đợc xét trong các thủ tuc Readln tiếp theo. Máy sẽ dừng lại ở câu lệnh Read(x) để đợi nạp dữ liệu. b. Thủ tục READLN(Biến 1, biến 2, biến 3 .); Thủ tục này khác thủ tục trên ở chỗ là các giá trị đợc nạp từ bàn phím sau khi lần lợt đã gán cho các biến thì các kí tự d thừa sẽ dành cho thủ tục Read hay Readln tiếp theo. Ví dụ: Xét lại ví dụ trên nếu dùng thủ tục Readln thay cho thủ tục Read trong câu lệnh thứ nhất tức là ta có: Readln(a,b); Read(x) và vẫn bấm các phím nh trên thì 9 kết quả sẽ là: a nhận giá trị 19, b nhận 15, x nhận 25.6. Máy thoát khỏi cả hai câu lệnh. Còn lại ký tự 23 sẽ đợc dành cho câu lệnh tiếp theo. 2. Thủ tục xuất dữ liệu a. lệnh xuất (in) dữ liệu ra màn hình: chức năng: Lệnh này cho phép chơng trình in lên màn hình các dữ liệu, kết quả hay thông báo cần thiết Cú pháp: Write(biểu_thức1, , biểu_thứcn); (1) Writeln(Biểu_thức1, ,biểu_thứcn); (2) Writeln; (3) Trong đó biểu_thức1, biểu_thứcn là các biểu thức mà giá trị cuả chúng cần đa ra màn hình. Dạng 1: in lên màn hình giá trị của biểu thức tại vị trí hiện hành của con trỏ theo thứ tự viết trong lệnh và sau lệnh này con trỏ ở vị trí sau giá trị của biểu_thức_n. Dạng 2: Giống nh dạng 1 nhng sau khi in giá trị cuối cùng con trỏ xuống dòng Dạng 3: Đa con trỏ về đầu dòng tiếp theo. b. Các cách xuất dữ liệu ra màn hình *) Viết ra không quy cách: Dữ liệu xuất ra sẽ căn theo lề trái của màn hình. *) Viết ra có quy cách: Dữ liệu xuất ra sẽ căn theo lề phải của màn hình - Đối với số nguyên: Số nguyên: số cột - Đối với số thực: số thực: số cột; số số lẻ thập phân Chú ý: Đối với giá trị kiểu logíc và kiểu kí tự có thể tiến hành xuất ra giống nh kiểu nguyên theo cả 2 cách. 3. Kết hợp Write và Readln Ngời ta thờng dùng phối hợp giữa Write và readln. Write cho phép hiện lên màn hình lời chỉ dẫn nhắc nhở, những điều cần thiết để nhập dữ liệu và các kiểu dữ liệu. Sau đó Readln cho phép nhập dữ liệu gõ vào từ bàn phím cho các biến. Ví dụ: Write('Nhap cac so a, b,c'); Readln(a,b,c); II. Các cấu trúc dữ liệu 1. Cấu trúc tuần tự a. lệnh gán Chức năng: Dùng để gán giá trị của một biểu thức cho biến Cú pháp: Biến:=Biểu_thức; Chú ý: Vế trái của phép gán chỉ có thể là biến mà thôi. kiểu của biểu thức phải trùng với kiểu của biến,trừ trờng hợp một biến thực có thể nhận giá trị nguyên. Ví dụ: x:=a; Trảlời:=k; Nếu viết x+y:=7 là sai. Vì sao? b. Câu lệnh ghép Lệnh ghép là một nhóm các câu lệnh đợc đặt giữa hai từ khoá Begin và end. Dạng tổng quát Begin <câu lệnh1>; <câu lệnh 2>; . 10 [...]... CRt; Const c:='*'; Var i, dài,rộng:Integer; Begin Clrscr; Write('Nhap vao chieu dai:'); Readln(dai); Write('Nhap vao chieu rong:');readln(rong); Clrscr {in cạnh trên} For i:=1 to dai do write(c:3); Writeln; {in hai cạnh bên}; For i:=1 to rộng-2 do writeln(c:3,c:(dai-1)*3); For i:=1 to dai do write(c:3); {in cạnh dới} Readln; End b Câu lệnh While - Chức năng: dùng để lặp đi lặp lại một công việc trong...; End Trong một câu lệnh ghép ta có thể lồng ghép các lệnh ghép với nhau, xong các lệnh ghép bên trong hoặc lồng nhau, hoặc tách nhau không đợc cắt nhau 2 Cấu trúc rẽ nhánh a Câu lệnh IF ( rẽ nhánh theo điều kiện) có hai dạng Dạng đầy đủ Dạng không đầy đủ... sau đó thoát khỏi Case of + Trong trờng hợp không có tập hằng i nào chứa giá trị của biểu thức thì không có else máy sẽ thoát khỏi lệnh case of còn nếu có else máy thực hiện rồi máy thoát khỏi vòng lặp Ví dụ: Viết chơng trình nhập vào điểm kiểm tra từ bàn phím và in kết quả xếp loại ra màn hình theo qui định: 11 Các điểm . -128 đến 127 1 byte Integer -32 768 đến 32 767 2 byte Longint -214748 364 8 đến 214748 364 7 4 byte byte 0 đến 255 1 byte Word 0 đến 65 553 2 byte - Các phép toán:. kí tự trong 2 dấu nháy đơn: Ví dụ A, B, * . - Dùng hàm Chr(n) trong đó n là mã của kí tự cần biểu diễn. Ví dụ chr (65 ) là A. - Dùng #n Ví dụ #65 Kiểu kí

Ngày đăng: 18/10/2013, 02:11

Xem thêm

TỪ KHÓA LIÊN QUAN

w