Download as pdf or txt
Download as pdf or txt
You are on page 1of 41

LẬP TRÌNH VỚI

MATLAB
Hạn gửi mail xét điểm giữa kỳ dựa vào xếp hạng Cody: 14:00 T3 15/10/2019
- Họ và tên
- Mã số SV:
- Cody rank:
- Badges:
- Screenshot xếp hạng hiện tại
• Các phép toán quan hệ và logic
• Câu lệnh điều kiện if - end
• Câu lệnh chia nhánh switch – case - end
• Vòng lặp for - end
• Vòng lặp while - end
• Vòng lặp con và câu lệnh điều kiện con
• Lệnh break và lệnh continue
• Ví dụ
CÁC PHÉP TOÁN QUAN HỆ VÀ LOGIC

Các phép toán quan hệ

< Nhỏ hơn


> Lớn hơn
<= Nhỏ hơn hoặc bằng
>= Lớn hơn hoặc bằng
== Bằng
~= Không bằng

Kết quả của các phép toán quan hệ là giá trị logic 0 và 1,
bằng 1 (nếu đúng) và bằng 0 (nếu sai)
CÁC PHÉP TOÁN QUAN HỆ VÀ LOGIC

- Khi hai số so sánh với nhau, kết quả sẽ bằng 1 nếu đúng, và
bằng 0 nếu sai

- Khi hai mảng cùng kích thước được so sánh, phép toán sẽ
thực hiện trên từng phần tử. Kết quả trả lại một mảng giá trị
logic

- Khi một số được so sánh với một mảng, số đó sẽ được so


sánh với từng phần tử của mảng. Kết quả trả lại một mảng
giá trị logic
CÁC PHÉP TOÁN QUAN HỆ VÀ LOGIC

>> 5>8 >> b =[ 7 3 4 8 4 2], c = [6 3 8 9 3 5]


ans = 0 b= 7 3 4 8 4 2
>> a = 5<10 c= 6 3 8 9 3 5
a= 1
>> y = (6<10) + (7>8) + (5*3==60/4) >> d = c>=b
y= 2 d= 0 1 1 1 0 1

>> b == c
ans = 0 1 0 0 0 0

>> b ~= c
ans = 1 0 1 1 1 1

>> f = b - c > 0
f= 1 0 0 0 1 0

>> g = b > 5
g= 1 0 0 1 0 0
CÁC PHÉP TOÁN QUAN HỆ VÀ LOGIC
- Kết quả của các phép toán quan hệ là các véc tơ hoặc mảng giá
trị logic gồm các giá trị 0 và 1, có thể sử dụng để truy cập các
phần tử của véc tơ hoặc mảng

>> a = [5 6 8 4 3 6] >> a = [5 6 8 4 3 6]
a= a=
5 6 8 4 3 6 5 6 8 4 3 6

>> b = a >= 5 >> b = [1 1 1 0 0 1]


b= b=
1 1 1 0 0 1 1 1 1 0 0 1

>> c = a(b) >> a(b)


c= ??? Subscript indices must either be real
5 6 8 6 positive integers or logicals.

>> d= a(a >= 5) >>


d=
5 6 8 6
CÁC PHÉP TOÁN QUAN HỆ VÀ LOGIC
- Các mảng giá trị số gồm các phần tử 0 và 1 thì không thể sử
dụng để truy cập phần tử giống như các mảng giá trị logic.
Ngược lại, các mảng giá trị logic vẫn có thể tham gia các phép
toán cộng trừ nhân chia giống như các mảng giá trị số.

- Thứ tự ưu tiên giữa các phép toán logic và phép toán tính
toán: các phép toán tính toán (+,-,*,/,\) được thực hiện trước
các phép toán logic

>> 3 + 4 < 16/2


ans =
1
>> 3 + (4 < 16)/2
ans =
3.5000
CÁC PHÉP TOÁN QUAN HỆ VÀ LOGIC

Các toán tử quan hệ logic

AND A&B bằng 1 nếu A và B cùng đúng,


bằng 0 trong các trường hợp còn lại

OR A|B bằng 0 nếu A và B cùng sai,


bằng 1 trong các trường hợp còn lại

NOT ~A bằng 1 nếu A sai


bằng 0 nếu A đúng
CÁC PHÉP TOÁN QUAN HỆ VÀ LOGIC

Các toán tử quan hệ logic

- Output: các mảng giá trị 0 (nếu sai) và 1 (nếu đúng)

- Input: là các số hoặc mảng. Input khác 0 sẽ trả lại output bằng 1 (đúng),
input bằng 0 trả lại output bằng 0 (sai)

- Các toán tử quan hệ cũng có thể được sử dụng kết hợp với các phép toán
logic và các phép toán tính toán

- Hai toán tử AND và OR có thể thực thi trên 2 đối tượng cùng là mảng,
cùng là số, hoặc 1 là mảng, 1 là số. Nếu 2 đối tượng cùng là mảng thì kết
quả trả lại mảng giá trị logic 0 và 1. Nếu 2 đối tượng 1 là mảng, 1 là số, thì
toán tử thực thi số đó với từng phần tử của mảng, và kết quả trả lại cũng
là mảng giá trị logic 0 và 1.
CÁC PHÉP TOÁN QUAN HỆ VÀ LOGIC

>> 3 & 7 >> x = [1 0 2 3 0 4 5], y = [0 3 4 5 0 5 0]


ans = 1
x= 1 0 2 3 0 4 5
>> a = 5|0 y= 0 3 4 5 0 5 0
a= 1
>> z = x|y
>> ~25 z= 1 1 1 1 0 1 1
ans = 0
>> t = x & y
>> t = 25*( (12&0) + (~0) + (0|5) ) t= 0 0 1 1 0 1 0
t = 50
>> ~(x + y)
ans = 0 0 0 0 1 0 0
CÁC PHÉP TOÁN QUAN HỆ VÀ LOGIC

Thứ tự ưu tiên giữa các phép toán


>> x = -2; y = 5;
>> -5 < x < -1
1 Dấu ngoặc ans = 0
2 Phép lũy thừa
>> (-5 < x) & (x < -1)
3 Toán tử NOT ans = 1

4 Phép nhân, chia >> ~(y < 7)


5 Phép cộng, trừ ans = 0

6 Phép toán quan hệ >> ~y < 7


ans = 1
(>,<,>=,<=,==,~=)
7 Toán tử AND >> ~((y >= 8) | (x < -1))
ans = 0
8 Toán tử OR
>> ~ (y >= 8) | (x < -1)
ans = 1
CÁC PHÉP TOÁN QUAN HỆ VÀ LOGIC

Các hàm quan hệ logic có sẵn của MATLAB

and(A,B) A&B

or(A,B) A|B

not(A) ~A
CÁC PHÉP TOÁN QUAN HỆ VÀ LOGIC

Các hàm quan hệ logic có sẵn của MATLAB

Lệnh Mô tả Ví dụ

xor(a,b) Hàm or chặt, bằng 1 nếu


a và b có 1 đúng và 1 sai

all(A) Nếu A là véc tơ, bằng 1


nếu mọi phần tử của A
khác 0, bằng 0 nếu
ngược lại
Nếu A là ma trận, sẽ coi
các cột của A là véc tơ,
và trả lại véc tơ giá trị 0,1
CÁC PHÉP TOÁN QUAN HỆ VÀ LOGIC

Các hàm quan hệ logic có sẵn của MATLAB

Lệnh Mô tả Ví dụ
any(A) Nếu A là véc tơ, bằng 0
nếu mọi phần tử của A
bằng 0, bằng 1 nếu
ngược lại
Nếu A là ma trận, sẽ coi
các cột của A là véc tơ,
và trả lại véc tơ giá trị 0,1

find(A) Nếu A là véc tơ, trả lại


các vị trí phần tử khác 0
của A
find(A > d) Nếu A là véc tơ, trả lại
các vị trí phần tử lớn hơn
d của A
CÁC PHÉP TOÁN QUAN HỆ VÀ LOGIC

Các hàm quan hệ logic có sẵn của MATLAB

INPUT OUTPUT
A B AND OR XOR NOT NOT
A&B A|B (A,B) ~A ~B
F F 0 0 0 1 1
F T 0 1 1 1 0
T F 0 1 1 0 1
T T 1 1 0 0 0
CÁC PHÉP TOÁN QUAN HỆ VÀ LOGIC

Ví dụ: Tạo một véc tơ gồm 30 phần tử là So ngay co nhiet do tren 25 la 11


các số nguyên ngẫu nhiên trong khoảng
[20,30] minh họa nhiệt độ 30 ngày trong So ngay co nhiet do trong khoang [24,26] la 8
1 tháng.
Cac ngay co nhiet do trong khoang [24,26] la
Hãy tìm 3 7 8 14 16 21 27 30

a) Số ngày có nhiệt T = round(rand(1,30)*10) + 20;


độ cao hơn 25
b) Số ngày có nhiệt a1 = sum(T>25);
độ nằm giữa 24 a2 = (T>=24)&(T<=26);
và 26 a3 = sum(a2);
c) Các ngày có a4 = find((T>=24)&(T<=26));
nhiệt độ nằm
giữa 24 và 26 fprintf('So ngay co nhiet do tren 25 la %d \n\n',a1)
fprintf('So ngay co nhiet do trong khoang [24,26] la %d \n\n',a3)
fprintf('Cac ngay co nhiet do trong khoang [24,26] la \n')
disp(a4)
CÂU LỆNH ĐIỀU KIỆN if

Cấu trúc cơ bản

if - end

if - else - end

if - elseif - else - end

Sau if, else, elseif là các biểu thức quan hệ hoặc logic
CÂU LỆNH ĐIỀU KIỆN if

if - end

Sai Điều
kiện IF

Đúng

Lệnh thực thi


CÂU LỆNH ĐIỀU KIỆN if

if - else - end

Sai Điều
kiện IF

Đúng

Lệnh thực thi 2 Lệnh thực thi 1


CÂU LỆNH ĐIỀU KIỆN if

if - elseif - else - end

Sai Điều
kiện IF

Sai Điều kiện Đúng


ELSEIF Lệnh
thực thi 1
Đúng
Lệnh Lệnh
thực thi 3 thực thi 2
CÂU LỆNH ĐIỀU KIỆN if

Ví dụ: Viết m-file nhập vào số n, báo lỗi nếu n không nguyên, nếu n là số nguyên,
kiểm tra xem n chẵn hay lẻ và hiển thị thông báo kết quả.

n = input('Nhap n di em '); Nhap n di em 5


Day la so le
if rem(n,2)==1
disp('Day la so le') Nhap n di em 8
elseif rem(n,2)==0 Day la so chan
disp('Day la so chan')
else Nhap n di em 3.4
disp('Error: n khong la so nguyen ') Error: n khong la so nguyen
end >>
CÂU LỆNH CHIA NHÁNH switch - case

Cấu trúc cơ bản


switch
case 1
case 2
...
case n
otherwise (có thể có hoặc không)
end

Cách thức thực thi


- Nếu có hơn một case thỏa mãn: sẽ thực thi case đầu tiên
- Nếu không có case nào thỏa mãn, và có otherwise: thực thi cụm lệnh trong otherwise
- Nếu không có case nào thỏa mãn, và không có otherwise: không thực thi bất kỳ lệnh nào
CÂU LỆNH CHIA NHÁNH switch - case
CÂU LỆNH CHIA NHÁNH switch - case

Ví dụ: Viết m-file nhập vào số n, báo lỗi nếu n không nguyên, nếu n là số nguyên,
kiểm tra xem n chẵn hay lẻ và hiển thị thông báo kết quả.

n = input('Nhap n di em '); Nhap n di em 5


Day la so le
k = rem(n,2);
switch k Nhap n di em 6
case 1 Day la so chan
disp('Day la so le')
case 0 Nhap n di em 5.4
disp('Day la so chan') Error: n khong la so nguyen
otherwise >>
disp('Error: n khong la so nguyen ')
end
CÂU LỆNH CHIA NHÁNH switch - case

Ví dụ: Viết m-file có input là điểm môn học theo thang ABCD và số tín chỉ tương
ứng, output là điểm trung bình theo quy tắc A = 4, B = 3, C = 2, D = 1

diem = input('Nhap diem di em ','s') Nhap diem di em ABCDCB


tinchi = input('Nhap tin chi di em ')
tong = 0; diem = ABCDCB
for k = 1:length(diem)
switch diem(k) Nhap tin chi di em [2 4 3 3 4 2]
case 'A'
tong = tong + 4 *tinchi(k); tinchi = 2 4 3 3 4 2
case 'B'
tong = tong + 3 *tinchi(k); GPA = 2.3889
case 'C'
tong = tong + 2 *tinchi(k);
case 'D'
tong = tong + 1 *tinchi(k);
end
end
GPA = tong/sum(tinchi)
VÒNG LẶP for - end

Sử dụng để lặp đi lặp lại một cụm lệnh theo một số lần xác định trước

Giá trị của k trong Bước nhảy của k


Chỉ số chạy bước lặp đầu tiên

Giá trị của k trong


bước lặp cuối

Một số lưu ý
- Mỗi một vòng for đều phải có một kết thúc end tương ứng
- Giá trị của k mặc định là không hiển thị khi thực hiện các lần lặp
- Khi vòng lặp kết thúc, k sẽ nhận giá trị của lần lặp cuối cùng
VÒNG LẶP for - end

for k = 1:3:10
x = k^2
end

x= 1

x = 16

x = 49

x = 100
>>
VÒNG LẶP for - end
( −1)
k
n
k
Ví dụ: Viết m-file tính tổng của n số hạng đầu của tổng 
k =1 2k
n = input('Nhap n di em ');
S = 0;
for k = 1:n
S = S + (-1)^k*k/2^k;
end
fprintf('Ket qua la: %.5f \n',S)

Nhap n di em 5
Ket qua la: -0.28125

Nhap n di em 10
Ket qua la: -0.21875

Nhap n di em 100
Ket qua la: -0.22222

Nhap n di em 1000
Ket qua la: -0.22222
VÒNG LẶP for - end

Ví dụ: Viết chương trình nhập vào một ma trận và tính tổng các phần tử dương
của ma trận đó
A = [-1 3 5; -2 -4 -6; 1 2 1]
[m,n] = size(A);
S = 0;
for p = 1:m
for q = 1:n
if A(p,q)>0
S = S + A(p,q);
end
end
end A=
fprintf('Tong cac phan tu duong cua A la %d \n',S) -1 3 5
-2 -4 -6
1 2 1
A = [-1 3 5; -2 -4 -6; 1 2 1] Tong cac phan tu duong cua A la 12
S = sum(A(A>0)); >>
fprintf('Tong cac phan tu duong cua A la %d \n',S)
VÒNG LẶP while - end

Sử dụng để lặp đi lặp lại một cụm lệnh theo một số lần không xác định trước.
Cụm lệnh lặp sẽ được thực hiện lặp cho đến khi một biểu thức điều kiện được
thỏa mãn

Một số lưu ý
- Biểu thức điều kiện của lệnh while phải chưa ít nhất 1 biến
- Biến trong biểu thức điều kiện phải được gán giá trị khi MATLAB thực hiện lệnh while
lần đầu tiên
- Ít nhất 1 trong các biến của biểu thức điều kiện phải được gán giá trị mới khi thực thi
cụm lệnh của while, nếu không vòng lặp sẽ lặp vô hạn lần
VÒNG LẶP while - end

x=1
while x <= 15
x = x*2
end

x= 1

x= 2

x= 4

x= 8

x = 16
>>
VÒNG LẶP while - end

Người lập trình cần chắc chắn rằng với thuật toán của mình, các biến được gán
lại giá trị mới trong while chắc chắn sau một số bước lặp sẽ làm biểu thức điều
kiện không thỏa mãn để vòng lặp được có thể được kết thúc.

Nếu tình trạng lặp vô hạn lần xảy ra, MATLAB cho phép người dùng cưỡng bức
dừng vòng lặp bằng lệnh Ctrl + C hoặc Ctrl + Break, hai lệnh này sẽ không chỉ
thoát khỏi vòng lặp mà còn dừng hẳn chương trình, không thực hiện tiếp các câu
lệnh tiếp theo. Vì thế nên hai lệnh này không tham gia vào thuật toán.

Hai biện pháp để tránh cho vòng lặp chạy vô hạn lần là đếm và đặt giá trị cận
trên cho số lần lặp, hoặc sử dụng lệnh break. Lệnh break sẽ thoát khỏi vòng lặp
hiện hành và tiếp tục thực hiện tiếp m-file hoặc các câu lệnh tiếp theo của
function. Vì thế lệnh break có thể tham gia thuật toán.
VÒNG LẶP while - end

xn x2 x3
Ví dụ: Cho hàm e mũ biểu diễn theo chuỗi Taylor e =  = 1 + x + + + ...
x

n =0 n ! 2! 3!
Sử dụng chuỗi này, tính ex gần đúng cho đến khi sai số nhỏ hơn 0.0001. Sử dụng
giới hạn số vòng lặp là 30 lần. Nếu sau 30 lần lặp mà chưa đạt được sai số 0.0001
thì hiển thị thông báo rằng cần phải sử dụng nhiều hơn 30 lần lặp.
x = input('Nhap x di em '); Nhap x di em 2
n = 1; an = 1; S = an; e^x = 7.389
So luong so hang la: 12
while (abs(an)>=0.0001) & (n<=30)
an = x^n/factorial(n); Nhap x di em 2000
S = S + an; Can hon 30 so hang
n = n + 1;
end

if n>30
disp('Can hon 30 so hang')
else
fprintf('e^x = %.3f \n',S)
fprintf('So luong so hang la: %i \n',n)
end
VÒNG LẶP CON VÀ CÂU LỆNH ĐIỀU KIỆN CON

Mỗi khi k tăng lên


1, thì vòng lặp của
h được thực hiện
m lần. Tổng cộng
cụm lệnh sẽ được
thực hiện m x n lần

Lưu ý : mỗi câu lệnh if, switch, for, while phải có một lệnh end tương ứng (nằm cùng cấp)
VÒNG LẶP CON VÀ CÂU LỆNH ĐIỀU KIỆN CON
Ví dụ: Viết chương trình tạo ma trận kích thước m x n có các phần tử như sau:
- Hàng đầu tiên có các phần tử bằng với vị trí của cột tương ứng
- Cột đầu tiên có các phần tử bằng với vị trí của hàng tương ứng
- Các phần tử còn lại có giá trị bằng tổng của phần tử nằm kề trên và kề trái của
phần tử đó
format rat
m = input('Nhap so hang cua ma tran ');
n = input('Nhap so cot cua ma tran ');
A = [];
for p = 1:m
for q = 1:n
Nhap so hang cua ma tran 5 if p ==1
Nhap so cot cua ma tran 3 A(p,q) = q;
elseif q == 1
A= A(p,q) = p;
1 2 3 else
2 4 7 A(p,q) = A(p-1,q) + A(p,q-1);
3 7 14 end
4 11 25 end
5 16 41 end
>> A
LỆNH break VÀ LỆNH continue

Lệnh break
- Nếu gặp break xuất hiện trong một vòng lặp, MATLAB sẽ thoát khỏi vòng lặp
đó
- Nếu gặp break xuất hiện bên ngoài tất cả các vòng lặp trong một m-file,
MATLAB sẽ kết thúc thực thi file đó

Lệnh continue
- Nếu gặp continue xuất hiện trong một vòng lặp, MATLAB sẽ kết thúc lần lặp
hiện tại và lập tức chuyển đến thực hiện lần lặp tiếp theo
LỆNH break VÀ LỆNH continue

Ví dụ: Viết m-file nhập vào một số tự nhiên và kiểm tra xem số đó có phải là số
nguyên tố hay không

n = input('Nhap n di em '); Nhap n di em 4


kt=1; Khong la so nguyen to
for k = 2:floor(sqrt(n))
if rem(n,k) == 0 Nhap n di em 3
kt = 0; La so nguyen to
break
end
end
switch kt
case 1
disp('La so nguyen to')
case 0
disp('Khong la so nguyen to')
end
VÍ DỤ 1

Tam giác Sierpinski được tạo ra bằng m = [1e1, 1e2, 1e3, 1e4];
cách vẽ đồ thị nối các điểm được tạo ra for k = 1:length(m)
theo một trong ba cách sau, với xác suất x(1) = 0; y(1) = 0;
for n = 1: (m(k) - 1)
chọn lựa ngẫu nhiên.
pp = round(rand * 2) + 1;
switch pp
case 1
x(n + 1) = 0.5*x(n);
y(n + 1) = 0.5*y(n);
case 2
Hãy viết m-file vẽ các véc tơ x và y như là x(n + 1) = 0.5*x(n) + 0.25;
các điểm rời rạc (plot (x,y,’^’)), với x1 = 0, y(n + 1) = 0.5*y(n) + sqrt(3)/4;
case 3
y1 = 0. Chạy chương trình 10, 100, 1000,
x(n + 1) = 0.5*x(n) + 0.5;
10000 lần. y(n + 1) = 0.5*y(n);
end
end
subplot(2,2,k)
plot(x,y,'^')
title (['Tam giac Sierpinski ', num2str(m(k)), ' diem'])
end
VÍ DỤ 1
Tam giac Sierpinski 10 diem Tam giac Sierpinski 100 diem
0.8 1

0.8
0.6

0.6
0.4
0.4

0.2
0.2

0 0
0 0.1 0.2 0.3 0.4 0.5 0 0.2 0.4 0.6 0.8 1

Tam giac Sierpinski 1000 diem Tam giac Sierpinski 10000 diem
1 1

0.8 0.8

0.6 0.6

0.4 0.4

0.2 0.2

0 0
0 0.2 0.4 0.6 0.8 1 0 0.2 0.4 0.6 0.8 1
VÍ DỤ 2
Viết chương trình trả lại tiền cho khách hàng siêu thị. Chương trình sẽ tạo một số nguyên
trong khoảng 1 đến 100 làm số tiền cần thanh toán, và sau đó yêu cầu khách hàng nhập vào
số tiền thanh toán, với các mức thanh toán có thể là 1,5,10,20,50,100. Nếu số tiền thanh
toán ít hơn số tiền cần thanh toán thì báo lỗi. Nếu số tiền thanh toán vượt quá số tiền cần
thanh toán thì máy sẽ trả lại cho khách tiền thừa, yêu cầu tính toán để trả lại với số tờ tiền
tối thiểu, nếu giả thiết trong máy cũng có các tờ tiền mệnh giá 1,5,10,20,50,100. Ví dụ: nếu
máy báo 33 mà khách trả 100, thì máy sẽ trả lại 67 gồm 1 tờ 50, 1 tờ 10, một tờ 5 và 2 tờ 1.
Hoadon = round(rand*100) Hoadon = 21
x = input('Nhap so tien thanh toan di em '); Nhap so tien thanh toan di em 20
while x < Hoadon Thanh toan them di em
fprintf('Thanh toan them di em \n\n')
x = input('Nhap so tien thanh toan di em '); Nhap so tien thanh toan di em 100
end Tralai = 79
m = [100, 50, 20, 10, 5, 1]; So tien tra lai la
Tralai = x - Hoadon
for k = 1:length(m) Menh gia 50 : 1 to
soto(k) = floor(Tralai/m(k)); Menh gia 20 : 1 to
Tralai = Tralai - soto(k) * m(k); Menh gia 5 : 1 to
end Menh gia 1 : 4 to
kq = [m;soto]; kq = kq(:,kq(2,:)~=0); >>
fprintf('So tien tra lai la \n\n')
fprintf('Menh gia %d : %d to \n',kq)
VÍ DỤ 3
Viết m-file tính toán vị trí tâm và bán kính của đường tròn đi qua 3 điểm cho trước.
Chương trình yêu cầu người dùng nhập vào tọa độ 3 điểm, và trả lại giá trị tọa độ tâm,
bán kính và đồ thị của đường tròn với 3 điểm được đánh dấu trên hình vẽ. Chạy chương
trình với ví dụ (13,15),(4,18),(19,3).

A = [13, 15]; B = [4, 18]; C = [19, 3]; O= 4 3


ABC = [A;B;C]; R= 15
a = [A(1) - B(1), A(2) - B(2); A(1) - C(1), A(2) - C(2)]; >>
b = [ (A(1)^2 - B(1)^2)/2 + (A(2)^2 - B(2)^2)/2;...
(A(1)^2 - C(1)^2)/2 + (A(2)^2 - C(2)^2)/2];
O = [inv(a) * b]' 20

R = sqrt(sum((O - A).^2)) 15

t = linspace(0,2*pi,100);
10
x = O(1) + R*cos(t); y = O(2) + R*sin(t);
plot(x,y,'-k','linewidth',2), hold on 5

fill(ABC(:,1),ABC(:,2), 'm') 0

plot(O(1), O(2),'xk')
hold off -5

axis equal -10

axis ([O(1) - R - 3, O(1) + R + 3, O(2) - R - 3, O(2) + R + 3])


-15
-10 -5 0 5 10 15 20

You might also like