Bài giảng Maple - Chương 4: Lập trình trên Maple

Ch¬ng 4  
LËp tr×nh trªn Maple  
4.1. C¸c lÖnh lËp tr×nh c¬ b¶n..................................................................127  
4.1.1. Vßng lÆp while................................................................................ 129  
4.1.2. Vßng lÆp for..................................................................................... 130  
4.1.3. LÖnh ®iÒu kiÖn if................................................................................. 132  
4.1.4. LÖnh break........................................................................................ 136  
4.1.5. LÖnh next........................................................................................... 137  
4.2. ThiÕt lËp mét chu tr×nh (Procedure).................................................138  
4.2.1. Giíi thiÖu............................................................................................ 138  
4.2.2. Khai b¸o chu tr×nh............................................................................. 138  
4.2.3. Tham biÕn .......................................................................................... 139  
4.2.4. Ph¹m vi c¸c biÕn (biÕn toµn côc, biÕn côc bé vµ tham biÕn).... 140  
BiÕn toµn côc............................................................................................................. 140  
BiÕn côc bé................................................................................................................ 140  
Tham biÕn ................................................................................................................. 141  
4.2.5. §Þnh gi¸ trªn c¸c biÕn...................................................................... 141  
§Þnh gi¸ tªn hµm vµ tham biÕn................................................................................. 141  
§Þnh gi¸ biÕn côc bé vµ biÕn toµn côc...................................................................... 142  
Minh ho¹ ................................................................................................................... 142  
4.2.6. Xö lý c¸c chu tr×nh ®Ö qui (tuú chän remember)............................ 143  
Ch¹y tõng bíc chu tr×nh.......................................................................................... 144  
VÝ dô.......................................................................................................................... 146  
4.2.7. Sö dông c¸c hµm RETURN, ERROR ................................................... 148  
127  
4.2.8. Mét sè vÝ dô vÒ chu tr×nh................................................................... 149  
1. Chu tr×nh t×m c¸c thµnh phÇn tèi ®¹i trong mét m¶ng ......................................... 149  
2. Chu tr×nh tÝnh khai triÓn Fourier cña hµm sè ....................................................... 151  
4.3. T×m lçi trong chu tr×nh .....................................................................154  
4.3.1. Printlevel (LÇn theo c¸c bíc cña chu tr×nh)................................ 154  
4.3.2. Trace (dß tõng lÖnh trong chu tr×nh).......................................... 157  
4.3.3. Xem m· nguån mét chu tr×nh .......................................................... 158  
4.3.4. Xem mét chu tr×nh b»ng lÖnh print.................................................. 161  
4.3.5. ChÆn b¾t lçi ....................................................................................... 161  
4.4. Lµm viÖc trªn c¸c tÖp trong Maple ...................................................164  
4.4.1. C¸c thao t¸c c¬ b¶n ........................................................................ 164  
Më mét tÖp................................................................................................................ 164  
§ãng mét tÖp ®· ®îc më......................................................................................... 166  
X¸c ®Þnh vÞ trÝ cuèi tÖp.............................................................................................. 166  
LÊy vµ ®Æt l¹i vÞ trÝ hiÖn thêi trong tÖp ..................................................................... 168  
Xo¸ mét tÖp............................................................................................................... 169  
§Èy d÷ liÖu tõ vïng ®Öm vµo ®Üa.............................................................................. 170  
Më mét tÖp ®Ó ®äc/ghi mµ kh«ng dïng vïng ®Öm................................................... 171  
§ãng tÖp ®îc më kh«ng dïng vïng nhí ®Öm ........................................................ 173  
LÖnh ghi d÷ liÖu ........................................................................................................ 174  
LÖnh ®äc d÷ liÖu read............................................................................................. 175  
4.4.2. §äc d÷ liÖu tõ tÖp vµo ...................................................................... 176  
§äc mét dßng tõ tÖp.................................................................................................. 176  
§äc mét sè bytes tõ tÖp ............................................................................................ 177  
§äc lÖnh tõ bµn phÝm................................................................................................ 178  
§äc d÷ liÖu cã sè cét vµ kiÓu cè ®Þnh....................................................................... 179  
§äc d÷ liÖu ®Þnh râ kiÓu ........................................................................................... 180  
4.4.3. Ghi d÷ liÖu vµo tÖp............................................................................ 181  
Giao diÖn cña c«ng viÖc ghi...................................................................................... 181  
Ghi b»ng lÖnh in (print) ............................................................................................ 182  
LÖnh lprint()............................................................................................................. 183  
4.4.4. VÝ dô vÒ thao t¸c trªn tÖp................................................................. 184  
128  
4.1. C¸c lÖnh lËp tr×nh c¬ b¶n  
4.1.1. Vßng lÆp while  
CÊu tróc có ph¸p:  
while  
condition  
do  
sequence expressions  
od;  
Chøc n¨ng:  
Vßng lÆp whilecho phÐp lÆp chuçi c¸c c©u lÖnh n»m gi÷a doodkhi mµ  
®iÒu kiÖn condition vÉn cßn ®óng (tøc lµ biÓu thøc ®iÒu kiÖn cho gi¸ trÞ true).  
§iÒu kiÖn condition®îc kiÓm tra ngay t¹i ®Çu mçi vßng lÆp, nÕu nã tháa m·n  
(gi¸ trÞ cña nã lµ ®óng) th× c¸c c©u lÖnh bªn trong ®îc thùc hiÖn, sau ®ã l¹i tiÕp tôc  
kiÓm tra ®iÒu kiÖn condition cho ®Õn khi ®iÒu kiÖn kh«ng cßn tháa m·n  
n÷a.Vßng lÆp whilethêng ®îc sö dông khi sè lÇn lÆp mét hay mét chuçi biÓu  
thøc lµ kh«ng x¸c ®Þnh râ, ®ång thêi ta muèn c¸c biÓu thøc ®ã cÇn ®îc lÆp trong  
khi mét ®iÒu kiÖn nµo ®ã cßn ®îc tháa m·n.  
§iÒu kiÖn condition trong vßng lÆp ph¶i lµ mét biÓu thøc boolean, tøc lµ  
gi¸ trÞ cña nã chØ cã thÓ lµ ®óng hoÆc sai, nÕu kh«ng th× sÏ sinh ra lçi.  
Trong trêng hîp muèn tho¸t ra khái vßng lÆp ngay tõ trong gi÷a vßng lÆp, ta  
cã thÓ thùc hiÖn b»ng c¸ch dïng c©u lÖnh RETURN, breakhoÆc quit.  
Chó ý r»ng vßng lÆp while-do-od; kh«ng b¾t buéc ph¶i n»m trªn nhiÒu dßng  
lÖnh nhng ngêi ta thêng viÕt trªn nhiÒu dßng ®Ó c©u lÖnh dÔ ®äc vµ dÔ hiÓu h¬n.  
Minh ho¹  
T×m íc sè chung lín nhÊt cña 2 sè nguyªn theo thuËt to¸n Eulid  
Ttëng cña thuËt to¸n:  
- Khai b¸o 2 sè a,b  
- T×m phÇn dtrong phÐp chia cña acho b, gäi ®ã lµ d  
- Sau ®ã ®Æt a:=b(cho amang gi¸ trÞ cña b), vµ t¬ng tù b:=d  
- Vßng lÆp cø tiÕp tôc cho ®Õn khi b=0(Tøc lóc ®ã phÇn db»ng  
0)  
V× kh«ng x¸c ®Þnh tríc sè vßng ph¶i lÆp, ta dïng vßng lÆp kh«ng x¸c ®Þnh  
(While)  
[>a:=20;b:=15;  
129  
a := 20  
b := 15  
while b<>0 do  
d:=irem(a,b);  
a:=b;  
b:=d;  
od:  
print(`Uoc so chung lon nhat cua hai so la:`);  
value(a);  
Uoc so chung lon nhat cua hai so la:  
5
Chó ý:  
- od: cã nghÜa lµ chØ in ra kÕt qu¶ cuèi cïng  
In ra 11 sè liªn tiÕp trong d·y sè Fibonacci , tõ sè thø 5 ®Õn sè thø 15  
D·y sè nµy cã tÝnh chÊt sè sau b»ng tæng 2 sè ngay tríc nã (kÓ tõ sè thø 3 trë  
®i). Cô thÓ lµ nã ®îc x¸c ®Þnh nhsau :  
F(0) = 1; F(1) = 1; F(n) = F(n 1) + F(n 2)  
2 n  
)
(víi  
[>F(0):=1:  
F(1):=1:  
n:=2:  
while n<=15 do  
F(n):=F(n-1)+F(n-2);  
n:=n+1;  
od:  
seq(F(i),i=5..15);  
8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987  
4.1.2. Vßng lÆp for  
CÊu tróc có ph¸p:  
for name from  
do  
start by  
change to  
finish  
statement sequence  
od;  
130  
hoÆc d¹ng ph¸t biÓu kh¸c:  
for name in expression  
do  
statement sequence  
od;  
Chøc n¨ng:  
Vßng lÆp for ®îc dïng ®Ó lÆp mét chuçi c¸c biÓu thøc ®îc ®Æt gi÷a dood  
, mçi lÇn lÆp t¬ng øng víi mét gi¸ trÞ ph©n biÖt cña biÕn chØ sè name ®øng sau tõ  
kho¸ for. Ban ®Çu, gi¸ trÞ start ®îc g¸n cho biÕn chØ sè. NÕu gi¸ trÞ cña biÕn name  
nhá h¬n hay b»ng gi¸ trÞ finish th× chuçi lÖnh n»m gi÷a dood®îc thùc hiÖn,  
sau ®ã biÕn name ®îc g¸n gi¸ trÞ tiÕp theo b»ng c¸ch céng thªm vµo nã gi¸ trÞ  
change (name:=name+change). Sau ®ã, biÕn name ®îc so s¸nh víi finish ®Ó  
quyÕt ®Þnh xem viÖc thùc hiÖn chuçi lÖnh cã ®îc tiÕp tôc n÷a kh«ng. Qu¸ tr×nh so  
s¸nh biÕn chØ sè name vµ thùc hiÖn chuçi lÖnh ®îc lÆp liªn tiÕp cho ®Õn khi gi¸ trÞ  
cña biÕn name lín h¬n gi¸ trÞ finish. Gi¸ trÞ cuèi cïng cña biÕn name sÏ lµ gi¸ trÞ  
vît qu¸ finish ®Çu tiªn.  
Chó ý: nÕu c¸c tõ khãa from start hoÆc by change bÞ bá qua th× mÆc ®Þnh from  
1 by1 ®îc dïng.  
Vßng lÆp for-in-do-od thùc hiÖn viÖc lÆp víi mçi gi¸ trÞ mµ biÕn chØ sè  
name lÊy tõ biÓu thøc expression ®· cho. Ch¼ng h¹n vßng lÆp nµy ®îc sö dông  
hiÖu qu¶ khi mµ gi¸ trÞ cña biÕn name lµ mét phÇn tö cña mét tËp hîp hoÆc danh  
s¸ch.  
Trong trêng hîp muèn tho¸t khái tõ gi÷a vßng lÆp, ta cã thÓ dïng c¸c c©u lÖnh  
break,quit,RETURNgièng nhtrong vßng lÆp while.  
Minh ho¹  
T¹o ma trËn Hibert bËc 4. C¸c thµnh phÇn cña ma trËn nµy ®îc x¸c ®Þnh theo  
1
i + j  
ai, j =  
c«ng thøc  
[>a:=array(1..4,1..4):  
for i to 4 do  
for j to 4 do  
a[i,j]:=1/(i+j);  
od;  
od;  
print(a);  
131  
1
2
1
3
1
4
1
5
1
3
1
4
1
5
1
6
1
4
1
5
1
6
1
7
1
5
1
6
1
7
1
8
2) Cho mét danh s¸ch c¸c sè nguyªn. TÝnh tæng b×nh ph¬ng c¸c sè ch½n cã mÆt  
trong danh s¸ch ®ã.  
Ta ph¶i duyÖt tõ ®Çu danh s¸ch vµ kiÓm tra xem nÕu sè ®ã lµ sè ch½n th× tÝnh  
tæng b×nh ph¬ng  
Chó ý LÖnh ford¹ng nµy hay dïng khi danh s¸ch cho kh«ng biÕt tríc sè phÇn tö  
[>restart;  
[>aList:=[1,4,6,2,3,7,4,9]:  
tong:=0:  
for i in aList do  
if irem(i,2)=0 then  
tong:=tong+i^2;  
fi:  
od:  
print(`Tong binh phuong cac so chan la :`);tong;  
Tong binh phuong cua cac so chan la :  
72  
4.1.3. LÖnh ®iÒu kiÖn if  
CÊu tróc có ph¸p:  
ifcondition then  
statement sequence  
| elifcondition thenstatement sequence |  
| else statement sequence |  
fi;  
(Ghi chó: C¸c c©u lÖnh trong cÆp dÊu ngoÆc ®øng lµ c¸c lÖnh tuú chän. ThÝ dô:  
biÓu thøc | statement | cho biÕt r»ng statement lµ mét c©u lÖnh tuú chän.)  
132  
Chøc n¨ng:  
NÕu b¹n muèn mét d·y biÓu thøc ®îc thùc hiÖn khi ®iÒu kiÖn nµo ®ã ®îc  
tho¶ m·n vµ mét d·y biÓu thøc kh¸c ®îc thùc hiÖn nÕu tr¸i l¹i th× cã thÓ dïng c©u  
lÖnh if-then-else-fi. Trong c©u lÖnh trªn, nÕu ®iÒu kiÖn condition lµ ®óng th×  
chuçi biÓu thøc ®øng sau then®îc thùc hiÖn, nÕu tr¸i l¹i th× ®iÒu kiÖn condition  
sau tõ kho¸ elifsÏ ®îc kiÓm tra, nÕu nã ®óng th× chuçi lÖnh t¬ng øng sau then  
®îc thùc hiÖn, cø tiÕp tôc cho ®Õn khi c¸c ®iÒu kiÖn condition ®Òu kh«ng tháa  
m·n, th× c¸c biÓu thøc sau lÖnh else®îc thùc hiÖn.  
Lu ý r»ng cÊu tróc lÖnh (tuú chän) elif...then...®îc lÆp l¹i víi sè lÇn tuú  
ý. Tõ kho¸ elif lµ d¹ng viÕt t¾t cña else if.  
C¸c biÓu thøc ®iÒu kiÖn (condition) ®îc sö dông trong c©u lÖnh if ph¶i ®îc t¹o  
thµnh tõ c¸c bÊt ®¼ng thøc, c¸c ®¼ng thøc ( c¸c phÐp to¸n quan hÖ ), c¸c biÕn sè,  
c¸c phÐp to¸n logic, c¸c hµm cã gi¸ trÞ tr¶ l¹i lµ gi¸ trÞ logic. NÕu tr¸i l¹i th× sÏ g©y  
ra lçi.  
Minh ho¹  
S¾p xÕp m¶ng sè theo thø tù t¨ng dÇn  
®Ó s¾p xÕp m¶ng sè theo thø tù t¨ng dÇn ta dïng thuËt to¸n ®æi chç c¸c phÇn tö cho  
nhau: lÊy mét phÇn tö so s¸nh víi c¸c phÇn tö kh¸c ®øng sau nã vµ nÕu thÊy phÇn tö  
nµo bÐ h¬n nã th× ra lÖnh ®æi chç (tøc lµ ®æi chØ sè) cho nhau.  
Chó ý: NÕu cha cã s½n mét m¶ng sè ta cã thÓ dïng lÖnh t¹o sè ngÉu nhiªn cña  
Maple (rand(a..b)) ®Ó sinh mét sè nguyªn nµo ®ã kh«ng bÐ h¬n a vµ kh«ng lín  
h¬n b . Víi 10 lÇn chän (ngÉu nhiªn) ta sinh ®îc mét m¶ng gåm 10 sè. Sau ®ã ta  
¸p dông thuËt to¸n ®· nªu trªn ®Ó s¾p xÕp l¹i m¶ng nµy (theo thø tù t¨ng dÇn).  
[>a:=array(1..10):  
for i to 10 do  
ngau_nhien := rand(-5..15);  
a[i]:=ngau_nhien():  
od:  
for i to 9 do  
for j from i+1 to 10 do  
if a[i]>a[j] then  
#Doi cho cac phan tu  
temp:=a[j];  
a[j]:=a[i];  
a[i]:=temp;  
fi:  
od:  
133  
od:  
print(`Day sau khi sap xep lai la : `);  
seq(a[i],i=1..10);  
Day sau khi sap xep lai la :  
-2, -2, -1, 1, 4, 4, 4, 7, 14, 15  
T×m phÇn tö lín nhÊt cña m¶ng (hoÆc mét danh s¸ch)  
Cho tríc mét danh s¸ch ta ph¶i t×m phÇn tö lín nhÊt cña danh s¸ch. Cã thÓ  
thùc hiÖn ®iÒu nµy b»ng c¸ch s¾p xÕp l¹i m¶ng (theo chu tr×nh ®· lµm ë trªn) vµ lÊy  
ra phÇn tö cuèi cïng cña m¶ng (sau khi s¾p). Mét c¸ch kh¸c lµ: Gäi Mlµ mét phÇn  
tö bÊt k× cña danh s¸ch, sau ®ã duyÖt toµn bé danh s¸ch nÕu phÇn tö nµo cña danh  
s¸ch lín h¬n nã th× l¹i lÊy tªn Mg¸n cho phÇn tö ®ã, vµ lÆp l¹i qu¸ tr×nh cho ®Õn  
khi kh«ng cßn phÇn tö nµo lín h¬n M.  
Chó ý Ta dïng lÖnh op(i,ds)®Ó lÊy ra thµnh phÇn thø i trong danh s¸ch ds,  
vµ dïng lÖnh nops(ds) ®Ó x¸c ®Þnh sè lîng c¸c thµnh phÇn trong danh s¸ch ds.  
[>aList:=[1,-10,3,-40,5]:  
M:=op(1,aList):  
for i to nops(aList) do  
if op(i,aList)>M then  
M:=op(i,aList)  
fi:  
od:  
print(`Gia tri lon nhat cua danh sach la :`); M;  
Gia tri lon nhat cua danh sach la :  
5
Chu tr×nh gi¶i ph¬ng tr×nh bËc hai  
a x2 + b x + c = 0  
[>gpt:=proc(a,b,c)  
local delta,x1,x2;  
delta:=b^2-4*a*c;  
if delta<0 then  
print(`phuong trinh vo nghiem `);  
elif delta=0 then  
x1:=-b/(2*a);  
134  
print(`Pt co nghiem kep `,x1);  
else  
x1:=(-b+sqrt(delta))/(2*a);  
x2:=(-b-sqrt(delta))/(2*a);  
print(`Phuong  
trinh  
co  
2
nghiem  
phan  
biet  
la:`);print(x1,x2);  
fi;  
end:  
Sau khi thiÕt lËp xong chu tr×nh nµy, muèn gi¶i ph¬ng tr×nh x2 + 2x1= 0  
ta chØ cÇn ra mét lÖnh:  
[>gpt(1,2,-1);  
Phuong trinh co 2 nghiem phan biet la:  
1+ 2 , 12  
TÝnh c¸c ®a thøc Trªbysev  
C¸c ®a thøc Trebysev ®îc x¸c ®Þnh nhsau:  
T(0) := 1; T(1) := x; T(n) := 2 x T(n 1) T(n 2)  
Ta lËp chu tr×nh thiÕt lËp sinh c¸c ®a thøc Trebysev cho ®Õn bËc nnhsau:  
[>dathucTBS:=proc(n)  
local T,i;  
T[0]:=1:  
T[1]:=x:  
if n<=1 then  
RETURN(eval(T))  
fi:  
for i from 2 to n do  
T[i]:=expand(2*x*T[i-1]-T[i-2])  
od:  
RETURN(eval(T))  
end:  
Sau ®ã, muèn cã c¸c ®a thøc ®Þnh s½n nµo ®ã chØ cÇn gäi thñ thôc nµy cho nã  
sinh ®a thøc (bËc cao h¬n bËc cña c¸c ®a thøc ta cÇn chän) vµ ra lÖnh in danh s¸ch  
c¸c ®a thøc ®· ®Þnh. ThÝ dô, muèn cã c¸c ®a thøc T(4), T(7), T(8) ta dïng c¸c lÖnh  
sau:  
[>a:=dathucTBS(10):#Goi thu tuc sinh da thuc TBS den bac 10  
135  
[>seq(a[i],i=[4,7,8]);  
8 x4 8 x2 + 1, 64x7 112x5 + 56x3 7 x, 128x8 256x6 + 160x4 32x2 + 1  
4.1.4. LÖnh break  
CÊu tróc vµ mét sè lu ý  
Có ph¸p: break  
Chøc n¨ng:  
Trong lóc vßng lÆp while/for ®ang ®îc thùc hiÖn, nÕu lÖnh break®îc gäi th×  
ch¬ng tr×nh sÏ tho¸t ngay lËp tøc ra khái vßng lÆp while/for tËn trong cïng  
nhÊt mµ cã chøa lÖnh break(v× còng cã thÓ cã nhiÒu vßng lÆp while/for®îc  
lång nhau). Mét vÝ dô kh¸ ®iÓn h×nh trong viÖc sö dông lÖnh break lµ trong qu¸  
tr×nh t×m kiÕm (search), râ rµng lµ b¹n sÏ muèn dõng qu¸ tr×nh quÐt l¹i ngay khi  
b¹n t×m thÊy ®èi tîng cÇn t×m. Khi ®ã, ngay t¹i thêi ®iÓm t×m thÊy, b¹n dïng lÖnh  
break ®Ó nh¶y ra khái vßng lÆp t×m kiÕm. Tríc lÖnh breakthêng cã mét c©u  
lÖnh ®iÒu kiÖn if... then...  
NÕu lÖnh breakdïng ngoµi c¸c vßng lÆp while/forth× sÏ sinh ra lçi.  
Chó ý break kh«ng ph¶i lµ tõ kho¸ (tõ dµnh riªng cho Maple), v× vËy ta cã  
thÓ g¸n trÞ cho biÕn cã tªn lµ break mµ kh«ng hÒ sinh ra lçi (mÆc dï ®iÒu nµy lµ  
kh«ng nªn).  
Minh ho¹  
Dïng break®Ó dõng khi gÆp phÇn tö ch½n cña m¶ng (ta duyÖt tÊt c¶ c¸c phÇn  
tö cña m¶ng nÕu gÆp phÇn tö ch½n ®Çu tiªn th× dõng l¹i ).  
[>a:=array(1..10):  
for i to 10 do  
ngau_nhien := rand(3..20):  
a[i]:=ngau_nhien():  
od:  
print(a); # in mang a xem co nhung phan tu ngau  
nhien nao  
for i to 10 do  
if a[i]mod 2=0 then  
print(`Phan tu chan dau tien cua mang la:`);  
a[i];  
break;  
fi;  
od;  
136  
[17, 7, 15, 7, 12, 4, 17, 3, 19, 3]  
Phan tu dau tien cua mang la:  
12  
4.1.5. LÖnh next  
CÊu tróc vµ chøc n¨ng  
Còng gièng nhc©u lÖnh break, lÖnh next ®îc thùc hiÖn trong vßng lÆp  
while/forvíi môc ®Ých bá qua mét sè lÖnh bªn trong vßng lÆp ®Ó nh¶y qua lÇn  
lÆp tiÕp theo. Khi gÆp lÖnh nexttrong vßng lÆp, ch¬ng tr×nh bá qua c¸c lÖnh tiÕp  
theo cña vßng lÆp tËn cïng nhÊt chøa next cho ®Õn khi gÆp tõ kho¸ x¸c ®Þnh kÕt  
thóc vßng lÆp ( ë ®©y lµ lÖnh od). §Õn ®©y vßng lÆp tiÕp tôc nh¶y qua lÇn lÆp tiÕp  
theo (nÕu cã thÓ) b»ng c¸ch t¨ng chØ sè hoÆc kiÓm tra ®iÒu kiÖn ®Ó quyÕt ®Þnh xem  
cã nªn thùc hiÖn vßng lÆp tiÕp theo.  
LÖnh nextsinh ra lçi nÕu nã ®îc gäi ngoµi vßng lÆp while/for. T¬ng tù nh−  
break, nextcòng kh«ng ph¶i lµ tõ khãa , do ®ã ta hoµn toµn cã thÓ g¸n cho next  
mét gi¸ trÞ (xem nhnextlµ mét biÕn). Ngay tríc lÖnh next còng thêng lµ mét  
c©u lÖnh ®iÒu kiÖn if... then...  
Minh ho¹  
Dïng next®Ó tÝnh tæng c¸c sè ch½n trong mét m¶ng sè. Sau khi cho m¶ng sè  
(thÝ dô b»ng ph¬ng ph¸p ngÉu nhiªn nh®· dïng ë trªn) ta duyÖt tÊt c¶ c¸c phÇn  
tö cña m¶ng: nÕu gÆp phÇn tö lÎ th× bá qua (b»ng lÖnh next) cßn ngîc l¹i th× tÝnh  
tæng b»ng biÕn s  
[>a:=array(1..15):  
for i to 15 do  
batky := rand(1..20):  
a[i]:=batky():  
od:  
print(a); #xem noi dung mang so (sinh ra mot cach  
ngau nhien)  
s:=0:  
for i to 15 do  
if a[i]mod 2=1 then  
next;  
fi;  
s:=s+a[i];  
od:  
print(`Tong cac so chan trong mang la:`); s;  
137  
[17, 12, 20, 20, 8, 11, 11, 7, 2, 1, 1, 19, 18, 2, 18]  
Tong cac so chan trong mang la:  
100  
4.2. ThiÕt lËp mét chu tr×nh (Procedure)  
4.2.1. Giíi thiÖu  
Maple lµ mét ng«n ng÷ lËp tr×nh híng chu tr×nh (procedure). Chóng ta cã thÓ lµm  
viÖc víi Maple b»ng hai chÕ ®é kh¸c nhau: ChÕ ®é t¬ng t¸c trùc tiÕp th«ng qua  
viÖc nhËp tõng lÖnh ®¬n lÎ ngay t¹i dÊu nh¾c lÖnh cña Maple vµ nhËn ®îc ngay kÕt  
qu¶ cña lÖnh ®ã. ChÕ ®é chu tr×nh ®îc thùc hiÖn b»ng c¸ch ®ãng gãi mét d·y c¸c  
lÖnh xö lÝ cïng mét c«ng viÖc vµo trong mét chu tr×nh (procedure) duy nhÊt, sau  
®ã ta chØ cÇn gäi chu tr×nh nµy vµ Maple tù ®éng thùc hiÖn c¸c lÖnh cã trong chu  
tr×nh ®ã mét c¸ch tuÇn tù vµ sau ®ã tr¶ l¹i kÕt qu¶ cuèi cïng.  
Maple chøa mét lîng rÊt lín c¸c hµm t¹o s½n ®¸p øng cho nh÷ng yªu cÇu tÝnh to¸n  
kh¸c nhau trong nhiÒu lÜnh vùc. C¸c hµm nµy ®îc lu tr÷ trong c¸c gãi chu tr×nh  
(package) vµ ngêi sö dông cã thÓ dÔ dµng gäi ®Õn mçi khi cÇn thiÕt. Tuy nhiªn,  
ngêi dïng Maple cã thÓ tù t¹o cho riªng m×nh nh÷ng gãi chu tr×nh còng nhcã thÓ  
trao ®æi dïng chung nh÷ng gãi chu tr×nh nµo ®Êy, phôc vô cho c«ng viÖc mang tÝnh  
®Æc thï riªng cña m×nh.  
C¸c kh¸i niÖm c¬ b¶n cÇn ph¶i n¾m v÷ng ®Ó t¹o ra mét chu tr×nh (procedure) lµ:  
CÊu tróc proc()..end; cïng víi c¸c khai b¸o trong cÊu tróc nµy  
(global, local, option,...)  
C¸c cÊu tróc d÷ liÖu vµ c¸c hµm cã liªn quan (d·y-sequence, tËp hîp-  
set, danh s¸ch-list, m¶ng-array, b¶ng-table).  
C¸c hµm lËp tr×nh c¬ b¶n (®· nªu ë trªn) vµ c¸c hµm liªn quan ®Õn  
viÖc xö lÝ d÷ liÖu (eval, evalf, subs, map, convert,...).  
C¸c hµm gì lçi vµ c¸ch bÉy lçi.  
4.2.2. Khai b¸o chu tr×nh  
Lêi gäi khai b¸o mét chu tr×nh:  
procedure_name:=proc(parameter_sequence)  
[locallocal_sequence]  
[globalglobal_sequence]  
[optionsoptions_sequence]  
statements_sequence;  
end;  
138  
Gi¶i thÝch c¸c khai b¸o:  
parameter_name: Lµ mét d·y c¸c kÝ hiÖu, ng¨n c¸ch nhau bëi c¸c dÊu phÈy, chøa  
tªn c¸c tham biÕn truyÒn cho chu tr×nh.  
local_sequence: Lµ mét d·y c¸c tªn ®îc khai b¸o lµ biÕn côc bé trong chu tr×nh,  
nã chØ cã gi¸ trÞ sö dông trong ph¹m vi chu tr×nh ®ang xÐt (local ®îc sö dông ®Ó  
khai b¸o cho c¸c biÕn chØ sö dông bªn trong mét chu tr×nh).  
global_sequen: D·y c¸c tªn biÕn toµn côc cã gi¸ trÞ sö dông ngay c¶ bªn ngoµi chu  
tr×nh.  
options_sequence: D·y c¸c tuú chän cho mét chu tr×nh.  
statements_sequence: D·y c¸c c©u lÖnh do ngêi lËp tr×nh ®a vµo.  
4.2.3. Tham biÕn  
Tham biÕn (parameter) lµ c¸c biÕn ®îc ®Æt gi÷a hai dÊu ngoÆc trong biÓu thøc  
proc(...). Tham biÕn ®îc dïng ®Ó nhËn d÷ liÖu truyÒn cho chu tr×nh khi gäi  
chu tr×nh ®ã. VÝ dô ta cã khai b¸o chu tr×nh tÝnh tæng cña 2 sè:  
tong:=proc(x,y) x+y; end, th× khi gäi chu tr×nh nµy ®Ó tÝnh tæng cña hai sè  
10 vµ 5 ta ph¶i truyÒn c¸c d÷ liÖu nµy cho c¸c tham biÕn (cho x nhËn gi¸ trÞ lµ 10,  
y nhËn gi¸ trÞ lµ 5), tøc lµ t¹i dÊu nh¾c lÖnh ta ph¶i viÕt tong(10,5); vµ sau khi  
thùc hiÖn chu tr×nh tr¶ l¹i kÕt qu¶ lµ 15.  
Tham biÕn cã tÝnh côc bé: chóng chØ ®îc sö dông bªn trong chu tr×nh ®· ®îc  
khai b¸o, bªn ngoµi chu tr×nh nµy chóng kh«ng mang ý nghÜa g×.  
KiÓu cña tham biÕn cã thÓ ®îc khai b¸o trùc tiÕp.  
Minh ho¹  
Ta lËp mét chu tr×nh kiÓm tra xem mét phÇn tö x cã lµ thµnh viªn trong mét  
danh s¸ch Lhay kh«ng. Trong vÝ dô nµy ta khai b¸o trùc tiÕp kiÓu cña tham biÕn  
L lµ danh s¸ch.  
[>thanhvien:=proc(x,L::list)  
local i;  
for i to nops(L) do  
if x=L[i] then  
RETURN(true);  
fi;  
od;  
false;  
end:  
Sau khi thiÕt lËp xong chu tr×nh nµy ta cã thÓ dïng nã ®Ó kiÓm tra  
[>thanhvien(2,[4,3.4,b,a,2,7]);  
139  
true  
[>thanhvien(c,[4,3.4,b,a,2,7]);  
false  
4.2.4. Ph¹m vi c¸c biÕn (biÕn toµn côc, biÕn côc bé vµ  
tham biÕn)  
BiÕn toµn côc  
BiÕn toµn côc ®îc khai b¸o sau tõ kho¸ global trong khai b¸o chu tr×nh.  
BiÕn toµn côc ®îc khai b¸o bªn trong mét chu tr×nh, nhng cã ph¹m vi gi¸ trÞ  
trong toµn bé ch¬ng tr×nh, tøc lµ bªn ngoµi ph¹m vi cña chu tr×nh mµ nã ®îc khai  
b¸o trong ®ã.  
Ph©n tÝch vÝ dô sau, trong ®ã chu tr×nh fchøa biÕn toµn côc x ®îc g¸n gi¸ trÞ lµ  
10, chu tr×nh gthùc hiÖn viÖc in ra mµn h×nh gi¸ trÞ cña biÕn x. Râ rµng biÕn x  
kh«ng ®îc khai b¸o trong chu tr×nh g nhng v× nã ®îc khai b¸o lµ toµn côc  
(global) trong chu tr×nh f nªn g cã thÓ t¸c ®éng lªn x(in gi¸ trÞ cña nã) bªn  
ngoµi ph¹m vi chu tr×nh f:  
[>restart;  
[>f:=proc() global x;x:=10;end;  
[>g:=proc() print(x);end;  
[>f();  
10  
[>g();  
10  
BiÕn côc bé  
BiÕn côc bé ®îc khai b¸o sau tõ kho¸ local trong khai b¸o chu tr×nh.  
BiÕn côc bé chØ cã gi¸ trÞ bªn trong chu tr×nh mµ nã ®îc khai b¸o. Ngoµi chu tr×nh  
nµy nã kh«ng mang ý nghÜa g×.  
VÝ dô vÒ chu tr×nh f trong ®ã biÕn côc bé a chØ cã gi¸ trÞ trong chu tr×nh, nhng  
kh«ng cã gi¸ trÞ sau khi chu tr×nh kÕt thóc (tøc lµ nã kh«ng cßn hiÖu lùc víi c¸c  
lÖnh n»m ngoµi chu tr×nh):  
[>f:=proc()local a;global b;a:=10;b:=a+5;end;  
[>f();  
15  
[>b;  
140  
15  
[>a;  
a
Tham biÕn  
Còng gièng nhbiÕn côc bé, c¸c tham biÕn chØ cã gi¸ trÞ bªn trong ph¹m vi cña chu  
tr×nh mµ nã ®îc khai b¸o. Sau khi chu tr×nh kÕt thóc, chóng kh«ng cßn gi¸ trÞ.  
Tham biÕn cßn ®îc sö dông ®Ó tr¶ l¹i kÕt qu¶, nhc¸c ng«n ng÷ lËp tr×nh truyÒn  
thèng. Ngoµi ra, do Maple cã nh÷ng hµm cã kh¶ n¨ng tr¶ l¹i nhiÒu h¬n mét gi¸ trÞ.  
Ta cã thÓ gép c¸c gi¸ trÞ nµy vµo mét danh s¸ch ®Ó tr¶ l¹i nhmét phÇn tö.  
Sau ®©y ta lËp l¹i chu tr×nh kiÓm tra xem mét phÇn tö x cã thuéc mét danh s¸ch L  
hay kh«ng, nhng ta ®a thªm mét biÕn n÷a tr¶ l¹i kÕt qu¶ cho biÕt vÞ trÝ cña x  
trong danh s¸ch L. Trong vÝ dô nµy ta sö dông mét tªn riªng cña Maple lµ nargs  
(chØ biÕn sè lîng c¸c biÕn trong chu tr×nh). NÕu cã tham biÕn chØ vÞ trÝ th× ta cã  
nargs=3.  
[>thanhvien:=proc(x,L::list,p::name) local i;  
for i to nops(L) do  
if x=L[i] then  
if nargs=3 then p:=i;fi;  
RETURN(true);  
fi;  
od;  
false;  
end:  
thanhvien(2,[4,3.4,a,2,7],'vitri');  
true  
[>vitri;  
4
4.2.5. §Þnh gi¸ trªn c¸c biÕn  
§Þnh gi¸ tªn hµm vµ tham biÕn  
Nh®· ®Ò cËp tríc ®©y, c¸c tªn biÕn trong mét biÓu thøc ®îc Maple ®Þnh gi¸  
tríc khi thùc hiÖn c¸c phÐp tÝnh trªn chóng. §èi víi viÖc thùc hiÖn c¸c hµm còng  
t¬ng tù nhvËy. Tríc tiªn lµ tªn chu tr×nh ®îc ®Þnh gi¸. Sau ®ã lÇn lît ®Õn c¸c  
®èi sè trong danh s¸ch c¸c ®èi sè truyÒn cho chu tr×nh (®îc ®Þnh gi¸ tõ tr¸i sang  
ph¶i). NÕu tªn chu tr×nh ®îc ®Þnh gi¸ trá ®Õn mét chu tr×nh, th× chu tr×nh Êy ®îc  
141  
thùc thi trªn c¸c ®èi sè ®· ®îc ®Þnh gi¸. Tuy nhiªn vÉn cã mét sè chu tr×nh ngo¹i  
lÖ: ®ã lµ c¸c hµm eval, assigned, seq.  
§Þnh gi¸ biÕn côc bé vµ biÕn toµn côc  
C¸c biÕn côc bé vµ tham biÕn truyÒn cho chu tr×nh ®îc ®Þnh gi¸ mét cÊp (®Þnh  
gi¸ mét lÇn), cßn c¸c biÕn toµn côc th× ®îc ®Þnh gi¸ hoµn toµn (full evaluation).  
Hµm eval()®îc dïng ®Ó Ðp ®Þnh gi¸ hoµn toµn cho biÕn côc bé vµ tham biÕn, vµ  
®Þnh gi¸ mét møc cho c¸c biÕn toµn côc.  
Minh ho¹  
C¸c biÕn toµn côc ®îc ®Þnh gi¸ hoµn toµn:  
[>y:=x^3-5*x+12;  
y := x3 5x +12  
[>x:=2;  
x:=2  
[>y;  
10  
Gi¸ trÞ cña y ®îc tÝnh b»ng c¸ch thay biÕn x (trong y) b»ng 2, sau ®ã thùc hiÖn  
c¸c phÐp tÝnh trªn y, cô thÓ lµ: y=2^3-5*2+12=10.  
XÐt chu tr×nh sau:  
[>restart; #khoi dong lai chuong trinh de xoa cac bien toan  
cuc da khai bao o phan truoc  
[>f:=proc()local p;global x;x:=2; p:=x^2+3*x-1; p; end;  
[>f();  
9
Râ rµng, ®a thøc p ®îc ®Þnh gi¸ theo x víi gi¸ trÞ x:=2, vµ ®îc ®Þnh gi¸ thµnh  
p=2^2+3*2-1=9 tríc khi ®îc tr¶ l¹i cho f. Nhng nÕu ta ®æi vÞ trÝ cña x:=2th×  
gi¸ trÞ tr¶ l¹i hoµn toµn kh¸c:  
[>restart;  
[>f:=proc()local p;global x;p:=x^2+3*x-1;x:=2; p; end;  
[>f();  
x2 + 3x 1  
142  
V× Maple chØ ®Þnh gi¸ biÕn côc bé p ®óng 1 lÇn (®Þnh gi¸ thµnh biÓu thøc:  
x2 +3x1), cho nªn khi ®äc ®Õn lÖnh cuèi cïng, p;, nã kh«ng ®Þnh gi¸ l¹i (theo  
x:=2) mµ gi÷ nguyªn gi¸ trÞ ®· ®îc ®Þnh gi¸ tríc ®ã.  
Còng t¬ng tù víi tham biÕn:  
[>restart;  
[>g:=proc(p)global x; x:=2; print(exp(p)); RETURN(p);end;  
kq:=g(x^2+3*x-1);  
2
ex +3x1  
kq := x2 + 3x 1  
[>kq;  
9
Tham biÕn p còng chØ ®îc ®Þnh gi¸ ®óng mét lÇn (tríc khi ®Þnh gi¸ x).  
Ta cã thÓ dïng hµm eval ®Ó thay ®æi møc ®Þnh gi¸:  
[>restart;  
[>g:=proc(p)global x;x:=2;eval(p);end;  
[>g(x^2+3*x-1);  
9
4.2.6. Xö lý c¸c chu tr×nh ®Ö qui (tuú chän remember)  
C¸c ng«n ng÷ lËp tr×nh truyÒn thèng cho phÐp gäi c¸c hµm ®Ö quy, tøc lµ c¸c  
hµm trong qu¸ tr×nh thùc hiÖn cã gäi ®Õn chÝnh nã. VÝ dô sau tr×nh bµy mét hµm ®Ö  
quy tÝnh sè Fibonacci ®îc ®Þnh nghÜa:  
F0 = 0 , F =1, Fn := Fn1 + Fn2  
.
1
[>F:=proc(n)  
if n=0 then 0  
elif n=1 then 1  
else F(n-1)+F(n-2) fi;  
end;  
Víi chu tr×nh nµy, ta cã thÓ tÝnh ®îc c¸c thµnh phÇn trong d·y Fibonacci, sau ®©y  
lµ 15 sè ®Çu tiªn :  
[>seq(F(i),i=1..15);  
143  
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610  
Tuy nhiªn, ®©y kh«ng ph¶i lµ c¸ch hiÖu qu¶ ®Ó tÝnh c¸c sè Fibonacci. Thñ tôc nµy  
chØ cã thÓ tÝnh víi c¸c sè Fibonacci ®Çu tiªn trong d·y, cßn víi nh÷ng sè Fibonacci  
lín h¬n th× kh«ng thÓ tÝnh to¸n ®îc. LÝ do lµ v× víi mçi F(i), Maple l¹i tÝnh to¸n l¹i  
c¸c gi¸ trÞ F(i-1), F(i-2), ..., F(1), F(0). Víi n cµng lín th× sè c¸c phÐp tÝnh t¨ng lªn  
rÊt nhanh, ta cã thÓ kiÓm tra ®iÒu nµy b»ng c¸ch dïng biÕn printlevel ®Ó kiÓm tra:  
Ch¹y tõng bíc chu tr×nh  
Muèn in ra mµn h×nh c¸c "vßng lÖnh Èn" ta sö dông biÕn printlevel. ThÝ dô  
muèn cho m¸y cã thÓ in ra c¸c vßng lÖnh ®ñ s©u ta g¸n cho biÕn nµy gi¸ trÞ:  
[>printlevel:=50;  
printlevel := 50  
Ta h·y in ra ®©y c¸c vßng lÖnh ph¶i thùc hiÖn ®Ó tÝnh sè thø 5 trong d·y (theo  
chu tr×nh trªn)  
[>F(5);  
{--> enter F, args = 5  
{--> enter F, args = 4  
{--> enter F, args = 3  
{--> enter F, args = 2  
{--> enter F, args = 1  
1
<-- exit F (now in F) = 1}  
{--> enter F, args = 0  
0
<-- exit F (now in F) = 0}  
1
<-- exit F (now in F) = 1}  
{--> enter F, args = 1  
1
<-- exit F (now in F) = 1}  
2
<-- exit F (now in F) = 2}  
{--> enter F, args = 2  
{--> enter F, args = 1  
1
<-- exit F (now in F) = 1}  
{--> enter F, args = 0  
144  
0
<-- exit F (now in F) = 0}  
1
<-- exit F (now in F) = 1}  
3
<-- exit F (now in F) = 3}  
{--> enter F, args = 3  
{--> enter F, args = 2  
{--> enter F, args = 1  
1
<-- exit F (now in F) = 1}  
{--> enter F, args = 0  
0
<-- exit F (now in F) = 0}  
1
<-- exit F (now in F) = 1}  
{--> enter F, args = 1  
1
<-- exit F (now in F) = 1}  
2
<-- exit F (now in F) = 2}  
5
<-- exit F (now at top level) = 5}  
5
H·y cho m¸y tÝnh in thö c¸c bíc cÇn thiÕt ®Ó tÝnh sè thø 10 ta sÏ thÊy kh«ng thÓ  
chÞu næi.  
§Ó gi¶i quyÕt khã kh¨n nµy, Maple sö dông mét b¶ng gäi lµ b¶ng nhí ®Ó lu  
c¸c gi¸ trÞ mµ hµm võa tÝnh ®îc. C¸c chØ môc cña b¶ng lµ ®èi sè cña hµm cßn c¸c  
phÇn tö cña b¶ng lµ c¸c gi¸ trÞ hµm tÝnh ®îc víi chØ môc t¬ng øng. Mçi khi hµm  
F(n) ®îc gäi, tríc hÕt Maple kiÓm tra gi¸ trÞ F(n) ®· cã trong b¶ng cha, nÕu ®·  
cã th× hµm kÕt qu¶ ®îc lu trong b¶ng nhí, nÕu cha cã th× nã thùc hiÖn c¸c lÖnh  
cã trong hµm F víi tham sè n sau ®ã tù ®éng lu cÆp n/F(n) vµo trong b¶ng. §Ó yªu  
cÇu Maple sö dông b¶ng nhí, ta sö dông tuú chän remember ngay ®Çu chu tr×nh.  
Sau ®©y lµ vÝ dô sö dông tuú chän nµy:  
[>restart;  
145  
[>F:=proc(n) options remember;  
if n=0 then 0  
elif n=1 then 1  
else F(n-1)+F(n-2)  
fi;  
end;  
Víi chu tr×nh nµy, ta cã thÓ nhanh chãng tÝnh ®îc sè Fibonacci thø 100 vµ thÊy  
r»ng sè bíc tÝnh to¸n kh«ng ®Õn nçi nhiÒu:  
VÝ dô  
[>printlevel:=100;  
printlevel := 100  
[>F(100);  
{--> enter F, args = 100  
{--> enter F, args = 99  
{--> enter F, args = 98  
{--> enter F, args = 97  
{--> enter F, args = 96  
{--> enter F, args = 95  
{--> enter F, args = 94  
{--> enter F, args = 93  
{--> enter F, args = 92  
{--> enter F, args = 91  
{--> enter F, args = 90  
{--> enter F, args = 89  
{--> enter F, args = 88  
{--> enter F, args = 87  
{--> enter F, args = 86  
{--> enter F, args = 85  
259695496911122585  
<-- exit F (now in F) = 259695496911122585}  
value remembered (in F): F(84) ->  
160500643816367088  
420196140727489673  
<-- exit F (now in F) = 420196140727489673}  
value remembered (in F): F(85) ->  
259695496911122585  
679891637638612258  
<-- exit F (now in F) = 679891637638612258}  
value remembered (in F): F(86) ->  
420196140727489673  
1100087778366101931  
146  
Tải về để xem bản đầy đủ
pdf 58 trang yennguyen 13/04/2022 4240
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Maple - Chương 4: Lập trình trên Maple", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_giang_maple_chuong_4_lap_trinh_tren_maple.pdf