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 dovµ odkhi 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 nh−ng 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
T− t−ëng cña thuËt to¸n:
- Khai b¸o 2 sè a,b
- T×m phÇn d− trong 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 d− b»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 nh− sau :
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 dovµ od
, 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 dovµ od®−î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 vµ 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 nh− trong 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.
L−u ý 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 ch−a 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 + 2x−1= 0
ta chØ cÇn ra mét lÖnh:
[>gpt(1,2,-1);
Phuong trinh co 2 nghiem phan biet la:
−1+ 2 , −1− 2
TÝnh c¸c ®a thøc Trªbysev
C¸c ®a thøc Trebysev ®−îc x¸c ®Þnh nh− sau:
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 nnh− sau:
[>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è l−u ý
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ó ý Tõ 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 nh− c©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 nh− nextlµ 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 l−u 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 nh− cã 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, nh−ng 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 nh−ng 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, nh−ng
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 nh− biÕ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¶, nh− c¸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 nh− mé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, nh−ng 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ù nh− vË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. Nh−ng 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 +3x−1), 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 +3x−1
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 := Fn−1 + Fn−2
.
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í ®Ó l−u
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 ch−a, nÕu ®·
cã th× hµm kÕt qu¶ ®−îc l−u trong b¶ng nhí, nÕu ch−a cã th× nã thùc hiÖn c¸c lÖnh
cã trong hµm F víi tham sè n sau ®ã tù ®éng l−u 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 đủ
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:
- bai_giang_maple_chuong_4_lap_trinh_tren_maple.pdf