Professional Documents
Culture Documents
Chapter 6 - Lập Trình Với MATLAB - Slides
Chapter 6 - Lập Trình Với MATLAB - Slides
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
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
>> 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
- 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
- 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
and(A,B) A&B
or(A,B) A|B
not(A) ~A
CÁC PHÉP TOÁN QUAN HỆ VÀ LOGIC
Lệnh Mô tả Ví dụ
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
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
if - end
if - 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
if - else - end
Sai Điều
kiện IF
Đúng
Sai Đ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ả.
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ả.
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
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
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
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
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).
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