計(jì)算機(jī)代數(shù)系統(tǒng)第6章程序設(shè)計(jì)_第1頁(yè)
計(jì)算機(jī)代數(shù)系統(tǒng)第6章程序設(shè)計(jì)_第2頁(yè)
計(jì)算機(jī)代數(shù)系統(tǒng)第6章程序設(shè)計(jì)_第3頁(yè)
計(jì)算機(jī)代數(shù)系統(tǒng)第6章程序設(shè)計(jì)_第4頁(yè)
計(jì)算機(jī)代數(shù)系統(tǒng)第6章程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩117頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第六章3Re程序設(shè)計(jì)

前面,我們使用的是Maple的交互式命令環(huán)境.所謂交互式

命令環(huán)境,就是一次輸入一條或幾條命令,然后按回車,這些命

令就被執(zhí)行了,執(zhí)行的結(jié)果顯示在同一個(gè)可執(zhí)行塊中.對(duì)于大

多數(shù)用戶來(lái)說(shuō),利用交互式命令環(huán)境解決問(wèn)題已經(jīng)足夠了,但

如果要解決一系列同一類型的問(wèn)題或者希望利用Maple編寫(xiě)需

要的解決特定問(wèn)題的函數(shù)和程序,以期更加充分地利用Maple

的強(qiáng)大功能,提高大規(guī)模問(wèn)題的計(jì)算效率,掌握一定的程序設(shè)

計(jì)是必要的.幸運(yùn)的是,Maple自身提供了一套編程工具,即

Maple語(yǔ)言.Maple語(yǔ)言實(shí)際上是由Maple各種命令以及一些

簡(jiǎn)單的過(guò)程控制語(yǔ)句組成的.

1編程基礎(chǔ)

1.1算子

所謂算子,是從一個(gè)抽象空間到另一個(gè)抽象空間的函數(shù).

在數(shù)學(xué)上算子的含義通常是函數(shù)到函數(shù)的映射.在Maple中,

算子常用“箭頭”記號(hào)定義(也稱箭頭操作符):

>f:=x->a*x*exp(x);

f:=xaxeA

>g:=(x,y)->a*x*y*exp(xA2+yA2);

22

(x+y)

g:=(")-"X"

另外,函數(shù)unapply也可以從表達(dá)式建立算子:

>unapply(xA2+1,x);

X->%2+1

>unapply(xA2+yA2,x,y);

(x,y)-x2+y2

當(dāng)我們依次把算子f作用到參數(shù)。,a,xt+a時(shí)即可得平常

意義上的函數(shù)值:

>f:=t->t*sin(t);

/:=r—>/sin(t)

>f(0);

I

>f(a);

asin(〃)

>f(xA2+a);

(x2+〃)sin(x2+〃)

上述結(jié)果是函數(shù)作用的例子.而最后一個(gè)結(jié)果(x2+6t)sin(x2+a)

實(shí)際上是算子f與算子g:=t->t^2+a復(fù)合后再作用到參數(shù)x的

結(jié)果.

從數(shù)學(xué)上講,作用與復(fù)合是不同的,它們產(chǎn)生的結(jié)果是有區(qū)

別的,但在使用它們時(shí),兩者還是有些重疊的.在Maple中,可

以依賴于語(yǔ)法把它們區(qū)分開(kāi):

(1)當(dāng)復(fù)合兩個(gè)算子時(shí),結(jié)果仍是算子,兩個(gè)算子的定義域必

須是相容的;

(2)當(dāng)把一個(gè)算子作用于一個(gè)參數(shù)(參數(shù)必須在算子的定義域

中)時(shí),結(jié)果是一個(gè)表達(dá)式;

⑶在Maple中,函數(shù)作用的語(yǔ)法是使用括號(hào)(),如函數(shù)f作

用到參數(shù)u寫(xiě)作f(u).而復(fù)合算子的符號(hào)是@,多重復(fù)合時(shí)

使用符號(hào)@@.

通過(guò)進(jìn)一步的例子可以清楚區(qū)分作用與復(fù)合的功能:/和g

復(fù)合的結(jié)果是算子/。g:=,-/(g(。),而把這個(gè)算子作用到參

數(shù)x得到表達(dá)式@(刈.例如,

f=t1sin"+(p),g=mexp(w),貝。g:=^—sin(exp(z)+⑼

是一個(gè)算子,而/(g(,)=sin(exp(x)+0)是一個(gè)表達(dá)式,因?yàn)閤是

一個(gè)實(shí)數(shù).試比較下述兩例:

>D(g@f);

((D(g))@f)D(/)

>D(g*h);

D(g)/?+gD(/z)

另外一個(gè)應(yīng)引起注意的問(wèn)題是算子(函數(shù))與表達(dá)式的異同,

在第一章2.2.2中曾探討過(guò)函數(shù)與表達(dá)式的區(qū)別,這里再通過(guò)

幾個(gè)例子說(shuō)明其中的微妙差異:

>fl:=xA2+l;

>f2:=yA2+l;

fl:=x2+1

,f2:=V+1

>f3:=fl+f2;

f3:=依+2+,2

再看下面的例子:

>gl:=x->xA2+l;

>g2:=y->yA2+l;

gl:=x—>x2+1

g2:=yfV+i

>g3:=gl+g2;

g3:=gl+g2

與前面例子不同的是,兩個(gè)算子(函數(shù))gl,g2相加的結(jié)果

依然是函數(shù)名g3,出現(xiàn)這個(gè)問(wèn)題的主要原因是gl與g2分別為

x,y的函數(shù),Maple認(rèn)為它們的定義域不相容.要得到與前例

的結(jié)果,只需稍作改動(dòng):

>g3:=gl(x)+g2(y);

g3:=x24-24-y2

下面的例子想說(shuō)明生成Maple函數(shù)的兩種方式“箭頭操作

符”及“unapply”之間微妙的差異:

>x:='x':a:=l:b:=2:c:=3:

>a*xA2+b*x+c;

x2+2x+3

>f:=unapply(a*xA2+b*x+c,x);

/:=x-?x2+2x4-3

>g:=x->a*xA2+b*x+c;

g:=x—>ax2+bx+c

由此可見(jiàn),f中的a,b,c已經(jīng)作了代換,而g中則顯含a,b,c。

再看下面實(shí)驗(yàn):

>f(x);g(x);

X?+2x+3

產(chǎn)+2x+3

f與g兩者相同,再對(duì)其微分:

>D(f);D(g);

x-2x+2

x—>2ax4-Z?

再改變常數(shù)C的值,觀察f與g的變化:

>c:=15;

c:=15

>f(x);g(x);

X24-2X4-3

x2+2x+15

由此可見(jiàn),在利用Maple進(jìn)行函數(shù)研究時(shí),對(duì)同一問(wèn)題應(yīng)

該用不同方法加以校驗(yàn),而這一切的支撐是數(shù)學(xué)基礎(chǔ)!

1.2編程初體驗(yàn)

利用算子可以生成最簡(jiǎn)單的函數(shù)一單個(gè)語(yǔ)句的函數(shù),但嚴(yán)

格意義上講它并非程序設(shè)計(jì),它所生成的數(shù)據(jù)對(duì)象是子程序.

所謂子程序,簡(jiǎn)單地說(shuō),就是一組預(yù)先編好的函數(shù)命令,我們由

下面的簡(jiǎn)單程序來(lái)看看Maple程序的結(jié)構(gòu):

>plus:=proc(x,y)

x+y;

end;

這個(gè)程序只有2個(gè)參數(shù),在程序內(nèi)部它的名稱是x,y,這是

Maple最簡(jiǎn)單的程序結(jié)構(gòu),僅僅在proc()和end中間加上在計(jì)

算中需要的一條或者多條命令即可,Maple會(huì)把最后一個(gè)語(yǔ)句

的結(jié)果作為整個(gè)子程序的返回結(jié)果,這一點(diǎn)需要引起注意.再

看下例:

>P:=proc(x,y)

x-y;

x*y;

x+y;

end:

>P(3,4);

顯然,盡管程序P有三條計(jì)算命令,但返回的只是最后一個(gè)

語(yǔ)句x+y;的結(jié)果.要想輸出所有的計(jì)算結(jié)果,需要在程序中增

加print語(yǔ)句:

>P:=proc(x,y)

print(x-y);

print(x*y);

print(x+y);

end:

>P(3,4);

再看下面幾個(gè)例子:

>forifrom2to6do

expand((x+y)Ai);

.K+Zxy+V

/+3,y+3xy2+y3

x4+4y+6x2/+4x/+了4

x5+5x4y+10x3y2+10x2y3+5xy4+y5

x6H-6x5y+15x4y2+20x3y3+15x2y4-F6xy54-y6

>F:=proc(n::integer)

ifnmod12=0thentrue

elsefalse

I

end:

>F(123A123),F(1234567890A9);

false,true

從上面幾個(gè)簡(jiǎn)單的例子可以看出Maple子程序主要包含以

下一些內(nèi)容:

⑴把定義的子程序賦值給程序名procname,以后就可以

用子程序名procname來(lái)調(diào)用程序;

(ii)子程序一律以pro”)開(kāi)頭,括號(hào)里是程序的輸入?yún)?shù),

如果括號(hào)中什么都沒(méi)有,表示這個(gè)子程序沒(méi)有任何輸入?yún)?shù);

(iii)子程序中的每一個(gè)語(yǔ)句都用分號(hào)(或冒號(hào))分開(kāi)(這一點(diǎn)

不是主要的,程序設(shè)計(jì)時(shí),在可能的時(shí)候一過(guò)程當(dāng)中的最后一

個(gè)語(yǔ)句、for-循環(huán)、if語(yǔ)句中的最后一個(gè)語(yǔ)句省略終結(jié)標(biāo)點(diǎn)也是

允許的,這并不是為了懶惰,而是因?yàn)樵诮K結(jié)語(yǔ)句后面插入一

個(gè)語(yǔ)句產(chǎn)生的影響要比僅僅執(zhí)行一個(gè)新語(yǔ)句產(chǎn)生的影響大);

(iv)在定義完子程序之后,Maple會(huì)顯示它對(duì)該子程序的

解釋(除非在end后用冒號(hào)結(jié)束),它的解釋和你的定義是等價(jià)

的,但形式上不一定完全相同;

(v)Maple會(huì)自動(dòng)地把除了參數(shù)以外的變量都作為局部變量

(localvariable),這就是說(shuō),它們僅僅在這個(gè)子程序的定義中

有效,和子程序以外的任何同名變量無(wú)關(guān).

在定義了一個(gè)子程序以后,執(zhí)行它的方法和執(zhí)行任何Maple

系統(tǒng)子程序一樣一程序名再加上一對(duì)圓括號(hào)(),括號(hào)中包含要

調(diào)用的參數(shù),如果子程序沒(méi)有參數(shù),括號(hào)也是不能省略的.

除了上面給出的程序設(shè)計(jì)方法外,在Maple中還可以直接由

(箭頭)生成程序,如下例:

>f:=x->ifx>0thenxelse-xfi;

/:=proc(x)optionoperator,arrow;if0<xthenxelse-xendifendproc

>f(-5),f⑸;

5,5

甚至于程序名也可以省略,這種情況通常會(huì)在使用函數(shù)

map時(shí)遇到:

>map(x->ifx>0thenxelse-xfi,[-4,-3,-2,0,1]);

[4,3,2,0,1]

如果需要察看一個(gè)已經(jīng)定義好的子程序的過(guò)程,用eval命令,

查看Maple中源程序(如factor函數(shù))使用下述組合命令:

interface(verboseproc=2);

print(factor);

再看一個(gè)更為有用的簡(jiǎn)單程序:代數(shù)方程的參數(shù)解。該程

序在代數(shù)方程f(x,y)=。求解中使用了一個(gè)巧妙的代換丫=飲得到

了方程的參數(shù)解,它的主要用途是用來(lái)畫(huà)圖、求積分、求微分和

求級(jí)數(shù).程序如下:

>parsolve:=proc(f,xy::{list(name),set(name)},t::name)

localp,x,y;

p:={solve(subs(y=t*x,f),x)}minus{0};

map((xi,u,xx,yy)->{xx=xi,yy=u*xi},p,t,x,y)

end:

調(diào)用該程序可以方便求解:

>parsolve(uA2+vA2=aA2,[u,v],t);

..a_ta_ata

VV

{{〃-/2,~/2},/2,~/2}}

J1+廣v1+rJ1+*J1+廣

>f:=randpoly([x,y],degree=3,sparse);

了:=-53x+85xy+49y2+78爐+17x產(chǎn)+72y3

>parsolve(f,[x,y],t);

1Li-19+85i+72401/4+23594+10829r+16536)_1一49產(chǎn)一85i-,24011+23594/'+10829/+16536

*72/3+78+17t2'A=272Z3+78+17r2一

1-49產(chǎn)-85f+12401/+23594戶+10829/+力536

X=272r34-78+17r2,

_1/(-49戶-851-,2401-+23593+10829產(chǎn)+16536)

-V=272Z3+78+17t2-

1.3局部變量和全局變量

Maple中的全局變量,是指那些在交互式命令環(huán)境中定義和

使用的變量,前面所使用的變量幾乎都屬于全局變量.而在編

寫(xiě)子程序時(shí),需要定義一些只在子程序內(nèi)部使用的變量,稱其

為局部變量.當(dāng)Maple執(zhí)行子程序時(shí),所有和局部變量同名的

全局變量都保持不變,而不管在子程序中給局部變量賦予了何

值.如果要把局部變量定義為全局變量,需要用關(guān)鍵詞global

在程序最開(kāi)始加以聲明,而局部變量則用local聲明,雖然這是

不必要的,但在程序設(shè)計(jì)時(shí),聲明變量是有一定好處的.

下面通過(guò)實(shí)例演示局部變量與全局變量的不同.為了更清楚

地觀察子程序?qū)θ肿兞康挠绊?,在子程序外先設(shè)定一個(gè)變量

a的值:

>a:=l;

a:=1

>f:=proc()

locala;

a:=12345678/4321;

evalf(a/2);

end;

>f();

1428.567230

>a;

>g:=proc()

globala;

a:=12345678/4321;

evalf(a/2);

>g();

1428.567230

>a;

12345678

4321

顯然,在前一個(gè)程序中,由于在子程序外已經(jīng)賦值給a,a是全

局變量,它的值不受子程序中同名局部變量的影響;而在后一個(gè)

子程序中,由于重新把a(bǔ)定義為全局變量,所以子程序外的a隨

著子程序中的a值的變化而變化.

子程序中的輸入?yún)?shù),它既不是全局的,也不是局部的.在子

程序內(nèi)部,它是形式參數(shù),也就是說(shuō),它的具體取值尚未被確定,

它在程序調(diào)用時(shí)會(huì)被替換成真正的參數(shù)值.而在子程序外部,

它們僅僅表示子程序接受的參數(shù)的多少,而對(duì)于具體的參數(shù),rn

沒(méi)有關(guān)系.

1.4變量nargs,args與procname

在所有程序中都有三個(gè)有用的變量:nargs,args與

procname.前兩個(gè)給出關(guān)于調(diào)用參量的信息:nargs變量是調(diào)

用的實(shí)際參量的個(gè)數(shù),args變量是包含參量的表達(dá)式序列,args

的子序列通過(guò)范圍或數(shù)字的參量選取.例如,第i個(gè)參量被調(diào)用

的格式為:args[i].nargs,args變量通常在含有可選擇參量的

程序中使用.下面看一個(gè)例子:

>p:=proc()

locali;

RETURN(nargs,[seq(iA3,i=args)])

endproc:

>p(l,2,3,4,5,6,7,8,9,10);

10,[1,8,27,64,125,216,343,512,729,1000]

該程序利用Maple函數(shù)RETURN返回了輸入?yún)⒘康膫€(gè)數(shù)以

及參量序列的立方列表,RETURN函數(shù)使用時(shí)必須在其后加圓

括號(hào),即使無(wú)結(jié)果返回時(shí)也得如此。下面是一個(gè)關(guān)于求任意序

列最大值的復(fù)雜程序:

>maximum:=proc()

localr,i;

r:=args[l];

forifrom2tonargsdo

ifargs[i]>rthenr:=args[i]

endif

enddo;

r;

endproc:

>maximum(12A4,5A7,69A3,10A4+4.9*1000);

328509

如果變量procname(程序被調(diào)用的名字)存在的話,它可以用

來(lái)直接訪問(wèn)該程序,通常用procname(args)完成調(diào)用:

>f:=proc(a)

ifa>0thenRETURN(aA(l/2))

elseRETURN(*procname(args)1)

endif

endproc:

>f(100-3A6),f(10A2+90-9*4);

f(-629),vl54

2基本程序結(jié)構(gòu)

所有的高級(jí)程序設(shè)計(jì)語(yǔ)言都具有程序結(jié)構(gòu),因?yàn)闉榱送瓿梢?/p>

項(xiàng)復(fù)雜的任務(wù),僅僅按照語(yǔ)句順序依次執(zhí)行是遠(yuǎn)遠(yuǎn)不夠的,更

需要程序在特定的地方能夠跳轉(zhuǎn)、分叉、循環(huán),……,與此同時(shí),

程序結(jié)構(gòu)就產(chǎn)生了.

2.1for循環(huán)

在程序設(shè)計(jì)中,常常需要把相同或者類似的語(yǔ)句連續(xù)執(zhí)行多

次,此時(shí),通過(guò)for循環(huán)結(jié)構(gòu)可以更便捷地編寫(xiě)程序.試看下面

幾個(gè)例子:

①求1至5自然數(shù)的和:

>total:=0:

forifrom1to5do

total:=total+i:

total:=1

total:=3

total:=6

total:=10

total:=15

②列示2,4,6,8,1。及其平方數(shù)、立方數(shù):

>forifrom2to10by2do

'i八2'=2八i,'i八3'=i八3;

d;

j=2,*=4,,3=8

i=4,i2=16,戶=64

i=6,產(chǎn)=64,Z3=216

1=8,=256/3=512

i=10,i2=1024,i3=1000

③列示第100到第108個(gè)素?cái)?shù)(第1個(gè)素?cái)?shù)是2):

>forjfrom100to108do

prime[j]=ithprime(j);

od;

prime1()()=541

prime1()|=547

primeJf)2=557

prime](H=563

prime|()4=569

prime]().=571

prime|()6=577

prime1(17=587

④列示5到10的階乘及其因藪分解:

>forninseq(i!,i=5..1O)do

n=ifactor(n);

d;

120=(2)3(3)(5)

720=(2)4(3)2(5)

5040=(2尸(3/(5)(7)

40320=(2)7(3)2(5)(7)

362880=(2)7(3)4(5)(7)

3628800=(2)8(3)4(5)2(7)

⑤一個(gè)復(fù)雜的騫指函數(shù)生成:

>f:=proc(x,n)

locali,t;

t:=l;

forifrom1tondo

t:=xA(tAx);

od;

t;

end:

>f(x,10);

通過(guò)上述例子可以看出,Maple的for循環(huán)結(jié)構(gòu)很接近于英語(yǔ)

語(yǔ)法.在上面例子中,,稱為循環(huán)變量,用于循環(huán)計(jì)數(shù),do后面

的部分,稱為循環(huán)體,就是需要反復(fù)執(zhí)行的語(yǔ)句,可以是一條語(yǔ)

句,也可以是多條語(yǔ)句.在循環(huán)體中,也可以引用循環(huán)變量.循

環(huán)體的結(jié)束標(biāo)志,也就是整個(gè)for循環(huán)結(jié)構(gòu)的結(jié)束標(biāo)志,是字母

“od”.for循環(huán)結(jié)構(gòu)的語(yǔ)法可總結(jié)為:

for循環(huán)變量from初始值to終止值(by步長(zhǎng))do

循環(huán)體

在for循環(huán)結(jié)構(gòu)中,初始值和終了值必須是數(shù)值型的,而且必

須是實(shí)數(shù),如果初始值是1,可以省略不寫(xiě),而步長(zhǎng)用by引出.

對(duì)于上面程序中的重復(fù)循環(huán)似乎可有可無(wú),但實(shí)際科學(xué)計(jì)算

中,重復(fù)次數(shù)往往成千上萬(wàn),或者重復(fù)的次數(shù)無(wú)法確定,循環(huán)就

必不可少了.下面再看一個(gè)實(shí)用程序一從1到n的自然數(shù)的求

和程序:

>SUM:=proc(n)

locali,total;

total:=0;

forifrom1tondo

total:=total+i;

od;

>SUM(IOOO);

500500

該程序僅僅具有練習(xí)例舉的意義,因?yàn)樵贛aple中像這樣一

個(gè)問(wèn)題只需要一個(gè)簡(jiǎn)單語(yǔ)句就可以完成:

>Sum(n,n=1..1000)=sum(n,n=1..1000);

1000

Z〃=500500

n=I

更一般地,對(duì)于確定的求和可用add命令(該命令無(wú)惰性函數(shù)

形式):

>add(n,n=1..1000);

500500

再看下面一個(gè)動(dòng)畫(huà)制作例子(圖略去):

>forifrom-20to30do

p||i:=plots[implicitplot](xA3+yA3-5*x*y=l-i/8,x=-3??3,y=

-3??3,numpoints=800,

tickmarks=[2,2])

>plots[display](p||(-20..30),insequence=true);

2.2分支結(jié)構(gòu)(條件語(yǔ)句)

所謂分支結(jié)構(gòu),是指程序在執(zhí)行時(shí),依據(jù)不同的條件,分別

執(zhí)行兩個(gè)或多個(gè)不同的程序塊,所以常常稱為條件語(yǔ)句.if條件

結(jié)構(gòu)的語(yǔ)法為:

if邏輯表達(dá)式1(條件1)then程序塊1

elif邏輯表達(dá)式2(條件2)then程序塊2

else程序塊3

I__________________________________

下面是一個(gè)判斷兩個(gè)數(shù)中較大者的例子:

>bigger:=proc(a,b)

ifa>=bthena

elseb

fi

再如下例:

>ABS:=proc(x)

ifx<0then-x

elsex;

fi;

顯然,這個(gè)絕對(duì)值函數(shù)的簡(jiǎn)單程序,對(duì)于任意實(shí)數(shù)范圍內(nèi)的數(shù)

值型變量計(jì)算都是沒(méi)有問(wèn)題的,但對(duì)于非數(shù)值型的參數(shù)則無(wú)能

為力.為此,我們需要在程序中添加一條判斷參數(shù)是否為數(shù)值型

變量的語(yǔ)句:

>ABS:=proc(x)

iftype(x,numeric)th

ifx<0then-xelsex;

fi;

else

,ABS,(x);

fi;

這里,我們用到一個(gè)if語(yǔ)句的嵌套,也就是一個(gè)if語(yǔ)句處于另

一個(gè)if語(yǔ)句當(dāng)中.這樣的結(jié)構(gòu)可以用來(lái)判斷復(fù)雜的條件.我們

還可以用多重嵌套的條件結(jié)構(gòu)來(lái)構(gòu)造更為復(fù)雜的函數(shù),例如下

面的分段函數(shù):

>11毋諦奧的眄蛤!出en

圻x官

els^AT'(x);

fi;

end;

盡管在上面的程序中我們用了不同的縮進(jìn)來(lái)表示不同的層次

關(guān)系,這段程序還是很難懂.對(duì)于這種多分支結(jié)構(gòu),可以用另一

種方式書(shū)寫(xiě),只需在第二層的if語(yǔ)句中使用elif,這樣就可以把

多個(gè)分支形式上寫(xiě)在同一個(gè)層次中,以便于閱讀.

>H整潮en

elAT(x);

end,b

和許多高級(jí)語(yǔ)言一樣,這種多重分支結(jié)構(gòu)理論上可以多到任

意多重.

再來(lái)看看前面的絕對(duì)值函數(shù)的程序,似乎是完美的,但是,對(duì)

于乘積的絕對(duì)值則沒(méi)有辦法,下面用map命令來(lái)修正,注意其

中的type(…,*)是用來(lái)判斷表達(dá)式是否為乘積,進(jìn)而對(duì)其進(jìn)行

化簡(jiǎn).

>ABS:=proc(x)

iftype(x,numeric)th

ifx<0then-xelsexfi;

eliftype(x/*Jthenmap(ABS,x);

else

'ABS'(x);

fi;

end:

>ABS(-l/2*b);

;ABS⑹

分段函數(shù)是一類重要的函數(shù),條件語(yǔ)句在定義分段函數(shù)時(shí)

具有明顯的優(yōu)越性,下面學(xué)習(xí)幾個(gè)實(shí)例:

>f:=proc(x)

ifx<0thenx八2+1elsesin(Pi*x)fi;

end;

x2+Xx<0

(2)gU)Jsin(x)x<37i

x2-6nx+97r2-x+37t3n<x

for循環(huán)在那些已知循環(huán)次數(shù),或者循環(huán)次數(shù)可以用簡(jiǎn)單表達(dá)

式計(jì)算的情況下比較適用.但有時(shí)循環(huán)次數(shù)并不能簡(jiǎn)單地給出,

我們要通過(guò)計(jì)算,判斷一個(gè)條件來(lái)決定是否繼續(xù)循環(huán),這時(shí),可

以使用while循環(huán).while循環(huán)標(biāo)準(zhǔn)結(jié)構(gòu)為:

while條件表達(dá)式do

循環(huán)體

od

Maple首先判斷條件是否成立,如果成立,就一遍遍地執(zhí)行

循環(huán)體,直到條件不成立為止.

下面看一個(gè)簡(jiǎn)單的程序,是用輾轉(zhuǎn)相除法計(jì)算兩個(gè)自然數(shù)

的最大公約數(shù)(Euclidean算法).

>GCD:=proc(a::posint,b::posint)

localp,q,r;

p:=max(a,b);

q:=min(a,b);

r:=irem(p,q);

whiler<>0do

p:=q;

q:=r;

r:=irem(p,q);

od;

q;

end:

>GCD(123456789,987654321);

在上面程序中的參數(shù)a、b后面的雙冒號(hào)“:」指定了輸入

的參數(shù)類型.若類型不匹配時(shí)輸出錯(cuò)誤信息.再看下面一個(gè)擴(kuò)

展Euclidean算法的例子:

>mygcdex:=

proc(a::nonnegint,b::nonnegint,x::name,y::name)

localal,a2,a3,xl,x2,x3,y1,y2,y3,q;

al:=a;a2:=b;

xl:=l;yl:=O;

x2:=0;y2:=l;

while(a2<>0)do

a3:=almoda2;

q:=floor(al/a2);

x3:=xl-q*x2;

y3:=yl-q*y2;

al:=a2;a2:=a3;

xl:=x2;x2:=x3;

yl:=y2;y2:=y3;

od;

x:=xl;y:=yl;

RETURN(al)

end:

>mygcdex(2A10,6A50,,x,/y,);

1024

2.4遞歸子程序

正如在一個(gè)子程序中我們可以調(diào)用其他的子程序一樣(比如系

統(tǒng)內(nèi)部函數(shù),或者已經(jīng)定義好的子程序),一個(gè)子程序也可以在

它的內(nèi)部調(diào)用它自己,這樣的子程序我們稱為遞歸子程序.在

數(shù)學(xué)中,用遞歸方式定義的例子很多,如Fibonacci數(shù)歹ij:

7o=O,/1=l,/n=/fl1+/n2(n>2)

下面我們?cè)贛aple中利用遞歸子程序求Fibonacci數(shù)列的第

n項(xiàng):

>Fibonacci:=proc(n::nonnegint)::list

ifn<=lthenn;

else

Fibonacci(n-1)+Fibonacci(n-2);

fi;

end:

>seq(Fibonacci(i),i=0..19);

0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181

>Fibonacci(20);

6765

但是,應(yīng)用上述程序計(jì)算Fibonacci(2000)時(shí)則不能進(jìn)行,原

因是要計(jì)算F2000,就先得計(jì)算F1999、F1998、??????,無(wú)限

制地遞歸會(huì)耗盡系統(tǒng)的堆??臻g而導(dǎo)致錯(cuò)誤.

由數(shù)據(jù)結(jié)構(gòu)有關(guān)理論知道,遞歸程序理論上都可以用循環(huán)實(shí)

現(xiàn),比如我們重寫(xiě)上面的程序如下:

>Fibonacci:=proc(n::nonnegint)

localtemp,fnew,fold,i;

ifn<=lthenn;

else

fold:=0;

fnew:=l;

forifrom2tondo

temp:=fnew+fold;

fold:=fnew;

fnew:=temp;

od;

fi;

end:

>Fibonacci(2000):

>time(Fibonacci(2000));

.019

利用循環(huán),程序不像前面那么易懂了,但同時(shí)帶來(lái)的好處也

是不可忽視的,循環(huán)結(jié)構(gòu)不僅不會(huì)受到堆棧的限制,而且計(jì)算

速度得到了很大的提高.

我們知道,Maple子程序默認(rèn)情況下把最后一條語(yǔ)句的結(jié)果作

為子程序的結(jié)果返回.我們可以用RETURN命令來(lái)顯式地返回

結(jié)果,比如前面的遞歸結(jié)果可等價(jià)地寫(xiě)成:

>Fibonacci:=proc(n::nonnegint)

optionremember;

ifn<=lthenRETURN(n);

fi;

Fibonacci(n-l)+Fibonacci(n-2);

程序進(jìn)入nv=l的分支中,執(zhí)行到RETURN命令就跳出程序,

而不會(huì)接著執(zhí)行后面的語(yǔ)句了.另外,使用RETURN命令在一

定程度上可以增加程序的可讀性.

在第二章中曾提到Maple的自動(dòng)求導(dǎo)功能,下面通過(guò)實(shí)例說(shuō)

明。第一個(gè)例子是關(guān)于分段函數(shù)求導(dǎo)問(wèn)題:

>F:=x->ifx>0thensin(x)elsearctan(x)fi;

F:=proc(%)

optionoperator,arrow;

if0<xthensin(x)elsearctan(x)endif

endproc

>Fp:=D(F);

Fp:=proc(x)

optionoperator,arrow;

if0<xthencos(x)else1/(1+xA2)endif

endproc

將分段函數(shù)及其導(dǎo)數(shù)的曲線繪制在同一個(gè)坐標(biāo)系中,實(shí)線

為F,虛線為Fp:

>plot({F,Fp},-3*Pi..3*Pi,linestyle=[1,4],color=black);

第二個(gè)例子試圖說(shuō)明Maple能夠完成對(duì)多個(gè)函數(shù)的自動(dòng)求

>f:=proc(x)

locals,t;

s:=ln(x);

t:=xA2;

s*t+3*t;

end;

A

f:=proc(x)locals,f;s:=ln(x);/:=x2;sxt+3義tendproc

>fp:=D(f);

fp:=proc(x)

localtx,s,r,sx;

sx:=1/x;s:=ln(x);tx:=2xx;t:=戈八2;sxxt+txxs+3xtx

endpnoc

程序fp是怎樣構(gòu)造的呢?對(duì)比f(wàn)和fp的源代碼可以幫助我們

了解Maple自動(dòng)求導(dǎo)機(jī)理:

在fp的源代碼中,每一條賦值語(yǔ)句V:=f(vl,v2,…vn)之

前是Vx:=fp(vl,v2,…vn),此處vi是局部變量或形式參數(shù),

fp(vl,v2,…vn)是對(duì)f(vl,v2,…vn)在形式上的微分,用該賦

值語(yǔ)句的的導(dǎo)數(shù)取代最后一條語(yǔ)句或返回值。這種方法被稱為

向前自動(dòng)微分法。在Maple內(nèi)部對(duì)這種方法有一些限制:不能

有遞歸程序,不能有記憶選項(xiàng),不能對(duì)全局變量賦值,只能有

常數(shù)的循環(huán)變量,等。

下面一個(gè)例子說(shuō)明自動(dòng)求導(dǎo)在計(jì)算時(shí)間和存儲(chǔ)空間上的優(yōu)越

性,這是一個(gè)利用遞歸定義的h的幕函數(shù)的自動(dòng)求導(dǎo)問(wèn)

題:

>f:=proc(x,n)

locali,t;

t:=l;

t:=xAt

od;

f:=proc(x,n)localz,t\t:=1;foritondot:=xNenddo;tendproc

>fl3:=D[l$3](f):#求f對(duì)x的三階導(dǎo)數(shù)

>setbytes:=kernelopts(bytesused):#使用寄存器內(nèi)存量

>settime:=time():#開(kāi)始計(jì)時(shí)

>fl3(l.l,22);

18.23670379

>cpu_time:=(time()-settime)*seconds;#計(jì)算時(shí)間

cputbne:=.230seconds

>

memoryused:=evalf((kernelopts(bytesused)-setbytes)/1

024*kbytes,5);#存儲(chǔ)空間大小

memory_iised:=671.86kbytes

再利用符號(hào)微分重復(fù)上述步驟:

>f22:=unapply(f(x,22),x):

>setbytes:=kernelopts(bytesused):

>settime():

>(D@@3)(f22)(l.l);

18.23670379

>cpu_time:=(time()-settime)*seconds;

cputime:=119.160seconds

>

memoryused:=evalf((kernelopts(bytesused)-setbytes)/1

024*kbytes,5);

memoryjLised:=63423.kbytes

顯然Maple自動(dòng)求導(dǎo)在計(jì)算時(shí)間和存儲(chǔ)空間上具有明顯的

優(yōu)越性。巧妙利用自動(dòng)微分解決較復(fù)雜的函數(shù)求導(dǎo)問(wèn)題有十分

現(xiàn)實(shí)的意義。

3子程序求值

在Maple子程序中的語(yǔ)句,求值的方式和交互環(huán)境中的求值

有所不同,這在某種程度上是為了提高子程序的執(zhí)行效率而考

慮的.在交互式環(huán)境中,Maple對(duì)于一般的變量和表達(dá)式都進(jìn)行

完全求值(除了數(shù)組、映射表等數(shù)據(jù)結(jié)構(gòu)外).比如先將b賦給a,

再將c賦給b,則最終a的值也指向c.

>a:=b:

c+1

但在子程序內(nèi)部情況就不一樣了,試看下述實(shí)驗(yàn):

>f:=proc()

locala,b;

a:=b;

b:=c;

結(jié)果居然是:

b+1

這是因?yàn)閍和b都是局部變量,Maple對(duì)于子程序中的局部變

量只進(jìn)行一層的求值.下面,我們針對(duì)子程序中的不同的變量,

系統(tǒng)介紹其求值機(jī)制.

3.1參數(shù)

子程序中的參數(shù),就是那些在proc()的括號(hào)中的變量.參數(shù)

是一類特殊的變量,在調(diào)用子程序時(shí),會(huì)把它們替換成實(shí)際的

參數(shù).

>sqrt1:=proc(x::anything,y::name)

y:=xA2;

end:

>sqrtl(d,ans);

>ans;

我們?cè)賮?lái)試試別的參數(shù),比如前面賦值過(guò)的a作為第一個(gè)

參數(shù),第二個(gè)參數(shù)仍用ans,只不過(guò)加了單引號(hào):

>sqrtl(a,'ans*);

>ans;

H

事實(shí)上,Maple在進(jìn)入子程序以前就已經(jīng)對(duì)參數(shù)進(jìn)行了求值,

因?yàn)槭窃谧映绦蛲膺M(jìn)行求值,所以求值規(guī)則服從調(diào)用時(shí)所在的

環(huán)境.上面是在交互式環(huán)境下調(diào)用sqrtl得到的結(jié)果,作為對(duì)照

看看在子程序內(nèi)部調(diào)用上面的sqrtl子程序會(huì)有什么不同.

>g:=proc()

locala,b,ans;

a:=b;

b:=c;

sqrtl(a,ans);

end:

因?yàn)檫@次調(diào)用是在程序內(nèi)部,所以只進(jìn)行第一層求值,進(jìn)入

sqrtl的參數(shù)值為b.

Maple對(duì)于子程序的參數(shù),都只在調(diào)用之前進(jìn)行一次求值,

而在子程序內(nèi)部出現(xiàn)的地方都用這次求值的結(jié)果替換,而不再

重新進(jìn)行求值.如前所述之sqrtl:

>sqrt1:=proc(x::anything,y::name)

y:=xA2;

end:

>sqrtl(d/ans');

ans+1

可見(jiàn),對(duì)參數(shù)賦值的作用只有一個(gè)一返回一定的信息.因?yàn)?/p>

在子程序內(nèi)部,永遠(yuǎn)不會(huì)對(duì)參數(shù)求值.我們可以認(rèn)為,參數(shù)是一

個(gè)。層求值的變量.

3.2局部變量和全局變量

Maple對(duì)于局部變量只進(jìn)行一層求值,也就相當(dāng)于用eval(a,

1)得到的結(jié)果.這種求值機(jī)制不僅可以提高效率,而且還有著

更重要的作用.比如在程序中,我們往往需要把兩個(gè)變量的,fn

交換,一般地,我們使用一個(gè)中間變量來(lái)完成這樣的交換.但如

果求值機(jī)制和交互式環(huán)境中一樣,將達(dá)不到我們的目的.試看,

在交互式環(huán)境下,我們企圖用這樣的方法交換兩個(gè)未被賦值的

變量會(huì)有什么后果:

>temp:=p:

q:=temp;

q:二q

不管在交互式環(huán)境下還是在程序中,Maple對(duì)于每一個(gè)全局變

量都進(jìn)行完全求值,除非它是數(shù)組、映射表或者子程序.對(duì)于數(shù)

組、映射表和子程序,Maple采用賦值鏈中的上一名稱來(lái)求值.

除了上面這些特殊數(shù)據(jù)對(duì)象及下面一個(gè)特例外,總結(jié)起來(lái),

Maple對(duì)于子程序的參數(shù)進(jìn)行。層求值,對(duì)于局部變量進(jìn)行1

層求值,而對(duì)于全局變量,則進(jìn)行完全求值.

對(duì)于上面說(shuō)的求值規(guī)則,在Maple中還有個(gè)特例,就是“同

上”操作符“%”需要引起注意.就其作用來(lái)說(shuō),它應(yīng)該屬于局

部變量.在進(jìn)入一個(gè)子程序時(shí),Maple會(huì)自動(dòng)地把該子程序中

的%設(shè)置成NULL(空).但是,對(duì)于這個(gè)“局部變量”,Maple

不遵循上面的規(guī)則,無(wú)論在那兒都會(huì)將其完全求值.我們下面

通過(guò)一個(gè)例子說(shuō)明它在子程序中的求值機(jī)制:

>f:=proc()

locala,b,c,d;

print(nAtthebeginning,[%]is",%);

a:=b;

b:=c;

c:=d;

a+1;

print(nNow[%]is",%);

end:

>f();

"Atthebeginning,[%]isM

"Now[%]is”,d+1

可以看出,盡管在子程序內(nèi)部,局部變量a僅進(jìn)行一層求值,

但指代a+1的同上操作符卻進(jìn)行了完全求值,得到d+1的結(jié)果.

3.3環(huán)境變量

所謂環(huán)境變量就是從一個(gè)程序退出時(shí)系統(tǒng)自動(dòng)設(shè)置的全局變

量。Maple中有幾個(gè)內(nèi)建的環(huán)境變量,如Digits,Normalizer,

Testzero,mod,printlevel等.從作用域來(lái)看,它們應(yīng)該算作

是全局變量.在求值上,它們也像其他全局變量一樣,始終都是

完全求值.但是如果在子程序中間對(duì)環(huán)境變量進(jìn)行了設(shè)置,那

么,在退出該子程序時(shí),系統(tǒng)會(huì)自動(dòng)地將其恢復(fù)成進(jìn)入程序時(shí)

的狀態(tài),以保證當(dāng)前行時(shí)的環(huán)境.正因如此,我們稱其為環(huán)境變

量.試看下面程序:

>f:=proc()

print("Enteringf.Digitsis”,Digits);

Digits:=20;

print(nNowDigitshasbecome**,Digits);

>g:=proc()

print("Enteringg.Digitsis",Digits);

Digits:=100;

print(nNowDigitsis",Digits);

f();

print(nBackingfromf,Digitsis”,Digits);

end:

>f();

"Enteringf.Digitsis",10

"NowDigitshasbecome",20

>g();

"Enteringg.Digitsis",10

"NowDigitsis",100

"Enteringf.Digitsis",100

"NowDigitshasbecome",20

"Backingfromf,Digitsis",100

>Digits;

可以看出,從子程序g中返回時(shí),Digits又被自動(dòng)地設(shè)成了原

來(lái)的值(10).如果你需要自己定義一些具有這樣的特性的環(huán)境

變量,也十分簡(jiǎn)單一Maple會(huì)把一切以Env開(kāi)始的變量認(rèn)作是

環(huán)境變量.

4嵌套子程序和記憶表

4.1嵌套子程序

很多情況下,可以在一個(gè)子程序的內(nèi)部定義另一個(gè)子程序.

實(shí)際上,我們?cè)趯?xiě)這樣的程序時(shí)常常沒(méi)有意識(shí)到它是嵌套子程

序.用于對(duì)每一個(gè)元素操作的map命令在嵌套程序設(shè)計(jì)中很有

用.比如,編寫(xiě)一個(gè)子程序,它返回有序表中的每一個(gè)元素都將

被第一個(gè)元素除的結(jié)果.

>nest:=proc(x::list)

localv;

v:=x[l];

map(y->y/v,x);

>lst:=[2,4,8,16,32]:

>nest(lst);

[1,2,4,8,16]

在上面的程序中,我們?cè)谧映绦蛑卸x了另一個(gè)子程序:

y->y/v,這個(gè)子程序中有一個(gè)變量v,Maple根據(jù)有效域的范圍,

認(rèn)為它就是外面的子程序nest中的同名變量v.那么這是一個(gè)

全局變量還是一個(gè)局部變量?顯然兩者都不是,因?yàn)榘焉厦娴?/p>

例子中的內(nèi)部子程序的v聲明成local或者global,都無(wú)法達(dá)到

我們的目的.

那么,Maple究竟是怎么樣來(lái)判斷一個(gè)變量的作用域呢?首先,

它自里向外,一層一層地尋找顯式地用local、global聲明的同

名變量,或者是子程序的參數(shù).如果找到了,它就將其綁定在外

層的同名變量之上,實(shí)際上就是將兩個(gè)變量視為同一,就像上

面例子中的情況.如果沒(méi)有找到,就遵循下面的原則:如果變量

位于賦值運(yùn)算符“:="的左邊,就視其為局部變量,否則均認(rèn)為

它是全局變量.再看下面一個(gè)實(shí)例:

>uniform:=proc(r::constant..constant)

proc()

localintrange,f;

intrange:=map(x->round(x*10ADigits),evalf(r));

f:=rand(intrange);

evalf任()/10八Digits);

end:

end:

>U:=uniform(cos(2)..sin(1)):Digits:=4:

>seq(U(),i=1..10);

.4210,.7449,-.06440,.7386,.7994,-.2166,-.1174,.02740,.2570,.3538

4.2記憶表

記憶表的目的是為了提高計(jì)算效率,它把每一個(gè)計(jì)算過(guò)的結(jié)

果存儲(chǔ)在一個(gè)映射表中,所以在下一次用相同的參數(shù)直接調(diào)用

以避免重復(fù)計(jì)算.

(1)remember選項(xiàng)

在程序中可以加入remember選項(xiàng)來(lái)建立該子程序的記憶表.

remember選項(xiàng)可以把對(duì)時(shí)間和空間的指數(shù)增長(zhǎng)的需求約簡(jiǎn)到

線性增長(zhǎng)。下面再建立一個(gè)Fibonacci子程序:

>Fibonacci:=proc(n::nonnegint)

optionremember;

ifn<=lthenRETURN(n)fi;

Fibonacci(n-l)+Fibonacci(n-2);

在我們計(jì)算了F3之后,它的記憶表中就有了4項(xiàng)(記憶表

中的子程序的第4個(gè)元素一用。p(4,…)來(lái)獲得),可以用。p命

令來(lái)檢查一個(gè)子程序的記憶表:

>Fibonacci(3);

I

>op(4,eval(Fibonacci));

table([O=O,1=1,2=1,3=2])

但是,過(guò)分地使用remember選項(xiàng)也并非全是好事,一方面,

使用remember選項(xiàng)的程序?qū)?nèi)存的需求比正確寫(xiě)出的不使用

remember選項(xiàng)的程序要高,另一方面,remember選項(xiàng)不重

視全局變量和環(huán)境變量的值(除了在evalf中對(duì)Digits特別重視

外),從而可能導(dǎo)致錯(cuò)誤。還有一點(diǎn),remember選項(xiàng)與表、

列、向量不能混用,因?yàn)閞emember無(wú)法注意到表中元素的變

化。

(2)在記憶表中加入項(xiàng)

通常調(diào)用具有記憶表的子程序并且得到計(jì)算結(jié)果,Maple會(huì)自

動(dòng)地把結(jié)果加到記憶表中去,但也可以手動(dòng)在記憶表中添加內(nèi)

容.試看下面的程序:

>F:=proc(n::nonnegint)

optionremember;

F(n-l)+F(n-2);

現(xiàn)在對(duì)記憶表賦值,注意這樣賦值不會(huì)使程序被調(diào)用:

>F(O):=O;F(1):=1;

F(0):=0

F(1):=1

試調(diào)用程序得到想要的結(jié)果:

>F(100);

354224848179261915075

由于程序F的代碼很短,很容易忘記對(duì)初始條件賦初值,這

樣會(huì)導(dǎo)致永不終止的遞歸,從而產(chǎn)生死循環(huán).因此,程序

Fibonacci較F要好一些.

(3)在記憶表中刪除項(xiàng)

記憶表是映射表的一種,可以方便地在其中添加或者刪除特

定的項(xiàng),和一般變量一樣,刪除一個(gè)表項(xiàng)只需要將其名稱用

evaln賦給它本身就行了.假設(shè),因?yàn)檩斎脲e(cuò)誤,我們?cè)谇懊嬉?/p>

個(gè)程序中加入了一個(gè)錯(cuò)誤的項(xiàng):

>Fibonacci(2):=2;

Fibonacci(2):=2

查看記憶表:

>T:=op(4,eval(Fibonacci));

T:=table([2=2])

再將相應(yīng)的項(xiàng)刪除掉,則又回復(fù)原來(lái)的記憶表:

>T[2]:=evaln(T[2]);

>op(4,eval(Fibonacci));

table([O=O,1=1,2=1,3=2])

Maple也可以自動(dòng)刪除子程序的記憶表,如果我們子程序定

義時(shí)聲明system選項(xiàng),系統(tǒng)將會(huì)在回收無(wú)用內(nèi)存時(shí)將記憶表

刪除,就如同大多數(shù)系統(tǒng)內(nèi)部子程序一樣.

對(duì)于記憶表的使用范圍,一般地,它只適用于對(duì)于確定的參

數(shù)具有確定的結(jié)果的程序,而對(duì)于那些結(jié)果不確定的程序,比

如用到環(huán)境變量、全局變量,或者時(shí)間函數(shù)等的程序,就不能,

用,否則將會(huì)導(dǎo)致錯(cuò)誤的結(jié)果.

5返回子程序的子程序

在所有的子程序中,編寫(xiě)返回值為一個(gè)子程序的程序所遇到

的困難也許是最多的了.編寫(xiě)這樣的程序,需要對(duì)Maple的各

種變量的求值規(guī)則、有效語(yǔ)句有透徹的理解.Maple一些內(nèi)部子

程序就有這樣的機(jī)制,比如隨機(jī)函數(shù)rand,返回的就是一個(gè)子

程序,它會(huì)在給定的范圍內(nèi)隨機(jī)地取值.下面以牛頓迭代法和

函數(shù)的平移為例說(shuō)明這種程序設(shè)計(jì)技巧。

5.1牛頓迭代法

牛頓迭代法是用來(lái)求解非線性方程數(shù)值解的常用方法之一.

首先,選擇一個(gè)接近于精確解的初值點(diǎn),接著,在曲線上該初值

點(diǎn)處作切線,求出切線與x軸的交點(diǎn).對(duì)于大部分函數(shù),這個(gè)交

點(diǎn)比初值點(diǎn)更要接近精確解.依次,重復(fù)迭代,就可以得到更精

確的點(diǎn).牛頓迭代法的數(shù)學(xué)過(guò)程為:

對(duì)于方程“小。,選定初值.,然后利用遞推公式”…給;來(lái)逐步

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論