
69
end
start=datenum(start+7); % skip to the next Friday
end
if nargout==0
disp(['Friday,'datestr(start,1)]) % Display the
% the result
else
m=start; % or return the resulting date
end % number
Sau khi ch¹y ch−¬ng tr×nh ta ®−îc kÕt qu¶:
>> friday
Friday,13-Aug-1999
NÕu b¹n muèn ®−îc c¶nh b¸o cho toµn bé n¨m, xem hµm fridays:
function F=fridays(ynum)
% FRIDAY List the Friday the 13ths in the year ynum.
% M=FRIDAY return the date numbers found.
%
if nargin==0
[ynum dummy]=datevec(now); % use the current date if
end % non was supplied
MM=[];
trynum=datenum(ynum,1,13,0,0,0);
% check January 13 first
trynum=friday(trynum); % find the first one
[tyr dummy]=datevec(trynum);
while tyr==ynum % May be there are more this year
MM=[MM;trynum];
trynum=friday(trynum+7); % skip to the next week
[tyr dummy]=datevec(trynum);
end
if nargout==0
disp('Fridays'); % Display the results
disp(datestr(MM,1)) % Display the result
else
F=MM; % or return the vector of
end % date number
-------------------oOo-------------------
ch−¬ng 11
VßNG LÆP §IÒU KHIÓN
C¸c ng«n ng÷ lËp tr×nh vµ m¸y tÝnh cã kh¶ n¨ng lËp tr×nh ®Òu ®Ò cËp ®Õn mét ®Æc ®iÓm lµ cho phÐp
b¹n ®iÒu khiÓn vßng lÆp cña c¸c c©u lÖnh dùa trªn nh÷ng cÊu tróc cña nã. NÕu b¹n ®· tõng sö dông

70
nh÷ng ®Æc ®iÓm nµy th× phÇn nµy sÏ rÊt ®¬n gi¶n ®èi víi b¹n. MÆt kh¸c nÕu vßng lÆp ®iÒu khiÓn lµ
míi ®èi víi b¹n th× nã sÏ rÊt r¾c rèi, nÕu nh vËy, th× b¹n h·y nghiªn cøu nã tõ tõ.
Vßng lÆp ®iÒu khiÓn rÊt h÷u Ých vµ cã øng dông rÊt réng r·i, nã lµm cho c¸c phÐp to¸n ®−îc thùc
hiÖn mét c¸ch thuËn tiÖn h¬n vµ nhanh h¬n. MATLAB ®a ra c¸c d¹ng vßng lÆp cã ®iÒu khiÓn lµ: vßng
lÆp
for
, vßng lÆp
while
, cÊu tróc
if-else-end
vµ cÊu tróc
switch-case
. V× c¸c cÊu tróc th−êng hoµn
thiÖn c¸c lÖnh cña MATLAB, nªn chóng th−êng xuÊt hiÖn trong M_file, h¬n lµ trong c©u lÖnh ®¸nh
trùc tiÕp t¹i dÊu nh¾c cña MATLAB.
11.1 Vßng lÆp for
Vßng lÆp
for
cho phÐp mét nhãm lÖnh thùc hiÖn lÆp l¹i mét sè lÇn cè ®Þnh. Có ph¸p cña vßng lÆp
for
nh sau:
for x = array
commands % Khèi c¸c lÖnh
end
C¸c c©u lÖnh gi÷a hai tr¹ng th¸i
for
vµ
end
®−îc thùc hiÖn mét lÇn cho tÊt c¶ c¸c cét cña m¶ng
(array). T¹i mçi lÇn lÆp l¹i, x ®îc g¸n cho phÇn tö cét tiÕp theo nh− trong suèt n lÇn cña vßng lÆp, x =
array(:, n).
VÝ dô:
>> for n = 1:10
x(n) = sin(n*pi/10);
end
>> x
x =
Columns 1 through 7
0.3090 0.5878 0.8090 0.9511 1.0000 0.9511 0.8090
Columns 8 through 10
0.5878 0.3090 0.0000
Nãi mét c¸ch kh¸c, tr¹ng th¸i thø nhÊt yªu cÇu: Cho n b»ng tõ 1 ®Õn 10, tÝnh gi¸ trÞ cña tÊt c¶ c¸c
tr¹ng th¸i cho ®Õn tr¹ng th¸i kÕ tiÕp tr¹ng th¸i
end
. §Çu tiªn trong vßng lÆp
for
n=1, tiÕp theo n=2, vµ
cø nh vËy cho ®Õn tr−êng hîp n=10. Sau tr−êng hîp n=10, vßng lÆp for kÕt thóc, vµ tÊt c¶ c¸c lÖnh sau
tr¹ng th¸i
end
cña vßng lÆp ®−îc thùc hiÖn.
Vßng lÆp
for
kh«ng thÓ bÞ kÕt thóc b»ng c¸ch g¸n l¹i biÕn ®iÒu khiÓn n trong vßng lÆp:
>> for n = 1:10
x(n) = sin(n*pi/10);
n = 10;
end
>> x
x =
Columns 1 through 7
0.3090 0.5878 0.8090 0.9511 1.0000 0.9511 0.8090
Columns 8 through 10
0.5878 0.3090 0.0000

71
Tr¹ng th¸i 1:10 lµ mét tr¹ng th¸i t¹o lªn m¶ng MATLAB tiªu chuÈn. BÊt cø kiÓu m¶ng nµo cña
MATLAB ®Òu ®−îc chÊp nhËn trong vßng lÆp
for
:
>> data = [3 9 45 6; 7 16 -1 5]
data =
3 9 45 6
7 16 -1 5
>> for n = data
x = n(1)-n(2)
end
x =
-4
x =
-7
x =
46
x =
1
B×nh th−êng vßng lÆp
for
cã thÓ lång vµo nhau:
>> for n = 1:5
for m = 5:-1:1
A(n,m) = n^2+m^2;
end
disp(n)
end
1
2
3
4
5
>> A
A =
2 5 10 17 26
5 8 13 20 29
10 13 18 25 34
17 20 25 32 41
26 29 34 41 50
Kh«ng nªn dïng vßng lÆp
for
khi mµ t−¬ng ®−¬ng víi viÖc ta dïng m¶ng ®Ó tÝnh to¸n. Nh− trong vÝ
dô tr−íc ta còng cã thÓ dïng m¶ng ®Ó tÝnh to¸n:
>> n = 1: 10;
>> x = sin(n*pi/10)
x =
Columns 1 through 7
0.3090 0.5878 0.8090 0.9511 1.0000 0.9511 0.8090
Columns 8 through 10
0.5878 0.3090 0.0000
Trong hai tr−êng hîp nh− trªn, tr−êng hîp thø hai ta dïng m¶ng ®Ó tÝnh to¸n còng ®−îc kÕt qu¶
nh− vËy, nh−ng nã nhanh h¬n vµ c¸c th¸o t¸c còng Ýt h¬n.

72
§Ó t¨ng tèc ®é tÝnh to¸n, m¶ng cÇn ph¶i ®−îc khëi t¹o tr−íc khi thùc hiÖn vßng lÆp
for
(hoÆc vßng
lÆp
while
). Trong vÝ dô tr−íc cø mçi lÇn lÖnh trong vßng lÆp
for
®−îc tÝnh, kÝch cì cña biÕn x l¹i t¨ng
lªn 1. §iÒu nµy lµm cho MATLAB mÊt thêi gian ®Ó cËp nhËt thªm bé nhí cho x trong mçi vßng. §Ó
rót ng¾n b−íc nµy, vÝ dô vÒ vßng lÆp
for
ë tr−íc viÕt l¹i nh− sau:
>> x = zeros(1,10); % Khëi t¹o bé nhí cho x
>> for n = 1: 10
x = sin(n*pi/10);
end
B©y giê chØ cÇn thay ®æi gi¸ trÞ cña c¸c phÇn tö cña x.
11.2 Vßng lÆp while
Vßng lÆp
while
thùc hiÖn lÆp l¹i mét nhãm lÖnh mét sè lÇn cè ®Þnh, nh−ng kh«ng biÕt tríc ®-
−îc sè lÇn lÆp l¹i.
Có ph¸p cña vßng lÆp
while
nh− sau:
while biÓu thøc ®iÒu kiÖn
khèi c¸c lÖnh..
end
“khèi c¸c lÖnh..” gi÷a hai tr¹ng th¸i
while
vµ
end
®−îc thùc hiÖn lÆp ®i lÆp l¹i khi tÊt c¶ c¸c “biÓu thøc
®iÒu kiÖn” lµ ®óng. Th«ng th−êng gi¸ trÞ cña ®iÒu kiÖn ®−a ra kÕt qu¶ lµ mét sè, nh−ng nÕu c¸c kÕt
qu¶ ®a ra lµ mét m¶ng th× vÉn hîp lÖ. Trong tr−êng hîp m¶ng, tÊt c¶ c¸c phÇn tö trong m¶ng kÕt qu¶
®a ra ph¶i lµ True (®óng). Cã thÓ tham kh¶o vÝ dô d−íi ®©y:
>> num = 0; ESP = 1;
>> while (1+ESP) > 1
ESP = ESP/ 2;
num = num + 1;
end
>> num
num=
53
>> ESP = 2*ESP
ESP=
2.2204e-16
VÝ dô nµy ®−a ra c¸ch tÝnh gi¸ trÞ ®Æc biÖt eps cña MATLAB, nã lµ mét sè d−¬ng nhá nhÊt, cã thÓ
céng víi 1 ®Ó ®−îc mét sè lín h¬n 1 dïng cho giíi h¹n ®é chÝnh x¸c. ë ®©y chóng ta dïng ch÷ hoa
EPS ®Ó ch¾c ch¾n r»ng gi¸ trÞ eps cña MATLAB kh«ng ghi ®Ì lªn. Trong vÝ dô nµy, gi¸ trÞ cña EPS
b¾t ®Çu b»ng 1, trong khi ®iÒu kiÖn (1+EPS)>1 lµ True (®Ó cho nã kh¸c kh«ng), c¸c lÖnh trong vßng
lÆp
while
®−îc tÝnh, gi¸ trÞ cña EPS tiÕp tôc ®−îc chia ®«i, gi¸ trÞ cña EPS nhá ®i, mµ céng EPS víi 1
th× nã lµ sè nhá nhÊt mµ lín h¬n 1. Do m¸y tÝnh sö dông sè cè ®Þnh cã 16 ch÷ sè nªn khi gi¸ trÞ nhá
qu¸ th× nã lµm trßn b»ng 0, vµ khi ®ã ®iÒu kiÖn (EPS+1)> 1 False (sai) vµ vßng lÆp while dõng l¹i.
Cuèi cïng EPS ®−îc nh©n víi 2 v× sau lÇn chia cuèi cïng cho 2 th× vßng lÆp dõng l¹i.
11.3 CÊu tróc if-else-end
NhiÒu khi chóng ta cÇn nh÷ng c©u lÖnh ®−îc thùc hiÖn theo mét ®iÒu kiÖn nµo ®ã. Trong ng«n ng÷
lËp tr×nh, logic nµy ®−îc cung cÊp bëi cÊu tróc
if-else-end
. Có ph¸p cña cÊu tróc nµy nh− sau:
if biÓu thøc ®iÒu kiÖn
khèi c¸c lÖnh...

73
end
Khèi c¸c lÖnh gi÷a hai tr¹ng th¸i
if
vµ
end
®−îc thùc hiÖn khi tÊt biÓu thøc ®iÒu kiÖn lµ ®óng.
Trong tr−êng hîp ®iÒu kiÖn bao gåm c¸c ®iÒu kiÖn con, th× tÊt c¶ c¸c ®iÒu kiÖn con ®−îc tÝnh vµ tr¶ vÒ
mét tr¹ng th¸i logic cña ®iÒu kiÖn. VÝ dô:
>> apple = 10 % sè t¸o
>> cost = apple*25
cost=
250
>> if apple > 5
cost = (1-20/100)*cost; % bá ®i 20%
end
>> cost
cost
200
Trong tr−êng hîp cã hai ®iÒu kiÖn thay ®æi, cÊu tróc
if-else-end
lµ:
if biÓu thøc ®iÒu kiÖn
khèi c¸c lÖnh ®−îc thùc hiÖn nÕu ®iÒu kiÖn lµ ®óng
else
khèi c¸c lÖnh ®−îc thùc hiÖn nÕu ®iÒu kiÖn lµ sai
end
Khi cã ba hoÆc nhiÒu ®iÒu kiÖn thay ®æi, cÊu tróc cña nã sÏ lµ:
if biÓu thøc ®iÒu kiÖn 1
khèi c¸c lÖnh ®−îc thùc hiÖn nÕu ®iÒu kiÖn 1 lµ ®óng
elseif biÓu thøc ®iÒu kiÖn 2
khèi c¸c lÖnh ®−îc thùc hiÖn nÕu ®iÒu kiÖn 2 lµ ®óng
elseif biÓu thøc ®iÒu kiÖn 3
khèi c¸c lÖnh ®−îc thùc hiÖn nÕu ®iÒu kiÖn 3 lµ ®óng
elseif biÓu thøc ®iÒu kiÖn 4
.
.
.
else
khèi c¸c lÖnh ®−îc thùc hiÖn nÕu kh«ng cã ®iÒu kiÖn nµo ®óng.
End
Trong mÉu d¹ng nµy th× khi biÓu thøc ®iÒu kiÖn ®Çu tiªn ®óng th× c¸c c©u lÖnh sau kh«ng ®−îc
kiÓm tra n÷a, c¸c cÊu tróc
if-else-end
cßn l¹i ®−îc bá qua. H¬n n÷a c©u lÖnh
else
ë cuèi cã thÓ kh«ng
cÇn cho vµo.
§èi víi cÊu tróc
if-else-end
, chóng ta còng cã thÓ lång vµo c¸c vßng lÆp
for
vµ
while
:
>> EPS = 1;
>> for num = 1:100
EPS = EPS/ 2;
if (1+EPS)< 1
EPS = EPS*2