Giáo trình Maple - Chương 3: Các khái niệm và các hàm cơ bản trong lập trình trên Maple
Tên (name) và xâu kí tự
Tên là một xâu hình tự (string of letters) được dùng như một chỉ mục hay một
nhãn để đại diện cho các đối tượng trong Maple có thể thay đổi được (như biến, kí
hiệu toán học, các biểu thức nói chung,.) mà ta có thể gán cho nó. Tên là một
trong các thành phần không thể thiếu được của Maple trong việc tạo ra các biểu
thức. Chiều dài tối đa của tên phụ thuộc vào hệ máy tính mà Maple chạy trên đó
(với máy 32-bit thì chiều dài tối đa của tên là 524275).
Bất cứ biểu thức nào đều có thể được gán cho một cái tên. Nếu không có giá trị
nào được gán cho một tên thì nó sẽ nhận chính tên nó làm giá trị mặc định.
Chương trình Maple sử dụng tên bắt đầu với một dấu gạch dưới ( _ ) làm các
biến toàn cục, và vì thế chúng ta nên tránh sử dụng chúng.
Một xâu ký tự bất kỳ (string of characters) có thể không phải là xâu hình tự (vì
có thể chứa các ký tự đặc biệt như: khoảng trống, dấu chấm than,.) và do đó không87
thể là một tên hợp lệ. Tuy nhiên, Maple cho phép tạo một tên từ một xâu ký tự bất
kỳ bằng cách cho nó vào trong cặp dấu nháy đơn ( ` ) (backquote), thí dụ như xâu
kí tự `a variable!` là một tên biến hợp lệ, và người ta có thể gán cho nó giá trị 10
bằng lệnh `a variable!`:=10.
Một xâu hình tự thường là một tên hợp lệ và được xem là trùng với tên được tạo
bằng cách bao chung quanh xâu này bằng cặp dấu nháy (vì thế mà x và `x` đều chỉ
đến một tên). Tuy nhiên, nếu xâu hình tự mà trùng với từ khóa của Maple thì
không phải là một tên hợp lệ, và muốn cho nó trở thành một tên ta lại phải cho nó
vào trong cặp dấu nháy.
Hai dấu nháy liên tiếp trong một xâu kí tự sẽ được hiểu như là một dấu. Ví dụ
như khi ta viết: print(` I``m a student`); thì kết quả sẽ cho ta xâu: I`m a student.
Trang 1
Trang 2
Trang 3
Trang 4
Trang 5
Trang 6
Trang 7
Trang 8
Trang 9
Trang 10
Tải về để xem bản đầy đủ
Tóm tắt nội dung tài liệu: Giáo trình Maple - Chương 3: Các khái niệm và các hàm cơ bản trong lập trình trên Maple
ác số nguyên cho một biểu thức, ta thu đ−ợc một dãy (hay nói cách khác, trong tr−ờng hợp này có thể xem dãy nh− là tập giá trị của một hàm trên một dải số nguyên nào đó). Xem ví dụ d−ới đây để biết thêm chi tiết. Minh họa Lệnh seq() thực hiện khá giống lệnh sum() trong việc áp dụng mỗi giá trị của chỉ mục trong phạm vi cho tr−ớc vào hàm để thu đ−ợc các phần tử của dãy: [>seq(2*i,i=1..10); , , , , , , , , ,2 4 6 8 10 12 14 16 18 20 [>tong:=sum(i^2,i=1..n); := tong − + + 13 ( ) + n 1 3 1 2 ( ) + n 1 2 1 6 n 1 6 [>seq(op(j,tong),j=1..4); , , ,13 ( ) + n 1 3 − 12 ( ) + n 1 2 1 6 n 1 6 seq() tạo ra một dãy bằng cách tác dụng hàm f lên mỗi thành phần của danh sách cho tr−ớc x: [>x:=[seq(Pi/i,i=1..9)]; := x , , , , , , , ,π 1 2 π 1 3 π 1 4 π 1 5 π 1 6 π 1 7 π 1 8 π 1 9 π [>y:=seq(sin(i)+a,i=x); : , 1= + y a a , 1 . 3 , . 2 2 + +1 2 a a , 2. 5 5− +1 4 a , , sin 7 π + + 1 2 a a , 2 2− +1 2 a , sin 9 π + a 119 3.4.2. Cấu trúc tập hợp và danh sách Tập hợp • Cấu trúc dữ liệu tập hợp (set) trong Maple đ−ợc dùng để gom các đối t−ợng phân biệt vào trong cùng một nhóm gọi là tập hợp. Tập hợp đ−ợc tạo thành bằng cách bao quanh một dãy trong cặp dấu ngoặc móc ('{ }'). Giống nh− hầu hết các đối t−ợng khác trong Maple, ta có thể gán Tập hợp cho các biến, và có thể sử dụng tập hợp nh− là đối số hoặc là kết quả của một số hàm. Tập hợp khác danh sách ở chỗ, các phần tử trong một tập hợp phải phân biệt nhau. • Các phép toán đ−ợc sử dụng cho kiểu tập hợp: union (hợp của hai tập hợp), intersect (giao của hai tập hợp), minus (hiệu của hai tập hợp). Tập hợp rỗng đ−ợc kí hiệu là {}. • Trật tự của các phần tử trong tập hợp đ−ợc quyết định bởi hệ thống. Giống nh− các số hạng trong một tổng, trật tự của một tập hợp thì không thay đổi trong mỗi lần tính toán, nh−ng lại thay đổi giữa các phiên (session) tính toán, và giữa các máy khác nhau. Vì vậy, một tập hợp có thể đ−ợc in là {x,y,z}trong lần tính toán này, trong khi ở lần khác nó có thể xuất hiện d−ới dạng {z,y,x}. Nếu bạn muốn có một trật tự rõ ràng cho các phần tử, hãy dùng một danh sách để l−u dữ liệu. Danh sách • Danh sách (list) là một cấu trúc dữ liệu trong Maple dùng để gom các đối t−ợng (có thể giống nhau hoặc khác nhau) thành một danh sách. • Giống nh− cấu trúc dãy, danh sách l−u giữ dữ liệu theo trật tự nh− khi đ−ợc tạo ra. Hai giá trị giống nhau có thể đ−ợc l−u trữ trong cùng một danh sách, trong khi đó chúng sẽ bị loại bỏ bớt đi một nếu chúng đ−ợc l−u trữ trong cùng một tập hợp. Các toán tử dùng trong cấu trúc tập hợp: union, intersect, minus không đ−ợc định nghĩa cho danh sách. • Một danh sách có thể đ−ợc tạo ra bằng cách bao quanh một dãy bằng cặp dấu ngoặc vuông ([ ]), và khi ấy nó không còn là một dãy. Ng−ời ta th−ờng sử dụng danh sách để nhóm các đối t−ợng với nhau khi mỗi nhóm đ−ợc xem nh− là một đối số đơn của một hàm nào đó. • Để minh hoạ cho sự khác nhau giữa dãy và danh sách trong Maple, ta xét lệnh x:=[a,b],[b,c], khi đó a sẽ đ−ợc gán là dãy của hai danh sách x:=[a,b],[b,c] , trong khi đó x:=(a,b),(b,c) thì kết quả gán cho x sẽ tự động nối lại thành dãy đơn x:=a,b,b,c. • Hàm op() đ−ợc dùng để rút ra một thành phần trong một biểu thức, và do đó ta có thể sử dụng nó để lấy ra một thành phần trong một danh sách: phần tử thứ i do hàm op() cho chính là đối t−ợng thứ i trong danh sách hay tập hợp, theo trật tự phụ thuộc việc bạn thấy tập hợp và danh sách đ−ợc in ra nh− thế nào. Chẳng hạn khi bạn gán x:=[a,b,d,c] thì lệnh này in ra màn hình là x:=[a,b,d,c], khi đó lệnh y:=op(3,x) sẽ cho lại kết quả y:=d. 120 • Việc ghép 2 dãy nhỏ thành một dãy to là khá đơn giản (xem phần trên). Nh−ng để gộp (involving) hai hay nhiều danh sách (hoặc là tập hợp) với nhau để tạo ra một danh sách (hay tập hợp) mới thì không đơn giản nh− vậy. Muốn làm điều này ta tiến hành qua 3 b−ớc: tr−ớc hết ta biến đổi chúng thành các dãy (bằng lệnh seq()), rồi dùng lệnh ghép các dãy nhỏ thành dãy to, sau đó biến đổi dãy thành một danh sách (hoặc tập hợp) bằng cách đ−a chúng vào trong cặp dấu ngoặc thích hợp. Để hiểu rõ thêm, xin xem trong phần ví dụ. • Toán tử [] dùng để tham chiếu đến một phần tử của một danh sách, tập hợp. Ví dụ, ta có ds=[a,b,d,c] là một danh sách, lời gọi y:=ds[2] sẽ cho ta kết quả là y=b. Ta cũng có thể dùng toán tử trên để thay đổi giá trị của một phần tử trong danh sách nh−ng không thể dùng lệnh này để thay đổi bất cứ phần tử nào trong tập hợp. Chẳng hạn đối với danh sách ds=[a,b,d,c] trên, lệnh ds[2]:=e sẽ thay giá trị b của phần tử thứ 2 trong danh sách ds thành e, vì vậy danh sách trở thành x=[a,e,d,c], trong khi đó đối với tập hợp y:={a,b,d,c} thì lệnh y[2]:=e sẽ báo lỗi. • Hàm subsop() đ−ợc dùng để tạo ra một danh sách hay tập hợp mới bằng cách thay thế một hay nhiều phần tử của một danh sách hay một tập hợp đã cho nào đó. Xem cụ thể hơn ở phần sau. Lệnh tạo danh sách và tập hợp • Ta đã biết cách tạo một dãy bằng lệnh seq() hoặc bằng cách liệt kê các phần tử. Một cách thông th−ờng để tạo ra một danh sách (hay là một tập hợp) là tạo từ một dãy bằng cách đ−a nó vào trong một cặp dấu ngoặc t−ơng ứng. • Một cách khác để tạo một danh sách (tập hợp) là tìm cách biến đổi một hay một số phần tử của một danh sách (tập hợp) đã có sẵn. Lệnh supsop đ−ợc mô tả sau đây cho phép thay thế một số thành phần của danh sách đã cho bằng một số thành phần khác: subsop(index = replacement, expression). Trong lệnh này, tham biến expression có thể nhận giá trị là một biểu thức, thành phần tại vị trí index trong biểu thức expression đ−ợc thay bởi giá trị mới là replacement. Nh− vậy, hàm supsop() tạo ra một biểu thức hoàn toàn mới giống biểu thức mẫu, trừ phần tử bị thay thế. Lệnh supsop(i=NULL,ds) dùng để xoá thành phần thứ i trong ds. • Hàm subsop(index1=repl1,...indexn=repln,expr) cho phép tạo ra biểu thức mới bằng cách thay thế n giá trị tại n vị trí trong biểu thức expr. Minh họa [>restart; Khai báo tập hợp: [>taphop1:={a,b,c}; := taphop1 { }, ,a b c [>taphop2:={a,d,e}; 121 := taphop2 { }, ,e a d [>taphop3:={e,f}; := taphop3 { },e f Thực hiện các phép toán trên tập hợp: [>taphop4:=taphop1 union taphop2; := taphop4 { }, , , ,e a b c d [>taphop5:=taphop2 intersect taphop3; := taphop5 { }e [>taphop6:=taphop1 minus taphop2; := taphop6 { },b c [>taphop6[2]; c Khai báo các danh sách: [>list01:=[x,y,z]; := list01 [ ], ,x y z [>list02:=[z,t,u,v]; := list02 [ ], , ,z t u v Thực hiện các phép toán trên danh sách: [>list03:=[list01,list02]; := list03 [ ],[ ], ,x y z [ ], , ,z t u v [>list04:=[op(list01),op(list02)]; := list04 [ ], , , , , ,x y z z t u v Dùng hàm op() để tham chiếu đến phần tử thứ i của danh sách: [>op(3,list04); z listname[i] là cách khác để tham chiếu đến phần tử thứ i: 122 [>list04[3]; z Tạo danh sách mới với một thành phần đ−ợc thay đổi: [>list05:=subsop(5=a,list04); := list05 [ ], , , , , ,x y z z a u v Phép gán không thay đổi phần tử của tập hợp, hơn thế, chúng có thể làm mất dữ liệu l−u trong tập hợp: [>taphop4[4]:=a; Error, cannot assign to a set 3.4.3. Cấu trúc dữ liệu bảng Lệnh tạo bảng Khai báo: table(F,L); F: (tuỳ chọn) Hàm chỉ mục. L: (tuỳ chọn) Danh sách hay tập hợp các giá trị khởi tạo cho bảng. • Hàm table() đ−ợc sử dụng để tạo một bảng trong Maple. Nếu đối số chúng ta truyền cho hàm table() là một danh sách các đẳng thức thể hiện mối quan hệ giữa các chỉ mục và các giá trị của bảng, thì danh sách đó đ−ợc dùng để định rõ phần khởi tạo cho các phần tử của bảng. Nếu hàm table không nhận đ−ợc đối số nào, thì bảng sẽ đ−ợc khởi tạo rỗng. • Bất cứ tên biến ch−ơng trình nào trong Maple cũng có thể nhận giá trị là một bảng. Sau khi gán, tên biến đó trở thành tên của bảng. Nội dung của toàn bộ bảng thì đ−ợc in ra màn hình bằng cách dùng lệnh print. Mô tả • Bảng là cấu trúc dữ liệu đ−ợc Maple dùng để l−u trữ dữ liệu theo từng cặp các chỉ mục và giá trị. Một bảng là một quan hệ t−ơng ứng một-nhiều giữa hai tập dữ liệu rời rạc. Nói cách khác, ta có thể xem nó nh− một ánh xạ đa trị từ tập dữ liệu này vào tập dữ liệu kia. Hai tập dữ liệu này đ−ợc gọi t−ơng ứng là miền xác định (domain) và miền giá trị (range) của bảng, mỗi một giá trị trong miền xác định t−ơng ứng với một hay một số giá trị trong miền giá trị. Các phần tử trong miền xác định của bảng đ−ợc gọi là các khoá (key) (hay còn gọi là các chỉ mục (index) vì miền xác định đ−ợc xem nh− là một dãy). Hàm indices(bang) cho lại kết quả là dãy các khoá này của bảng bang. Còn các phần tử trong miền giá trị của bảng đ−ợc gọi là các giá trị (value) của bảng hay là các phần tử (entries) của bảng. Hàm entries(bang) trong Maple cho lại kết quả là dãy các giá trị của bảng bang. 123 • Trật tự của các chỉ mục và các phần tử của một bảng do hàm indices và hàm entries cho biết không nhất thiết phải trùng với trật tự khi chúng đ−ợc nhập vào bảng. Nguyên nhân là do Maple đã sử dụng một bảng băm (là một kiểu cấu trúc dữ liệu đ−ợc dùng nhiều trong tin học) để l−u trữ các chỉ mục và các phần tử của bảng. Tuy vậy, giữa dãy các chỉ mục do hàm indices và dãy các giá trị do hàm entries cho lại vẫn có sự t−ơng ứng một-một. Với việc sử dụng kĩ thuật bảng băm, bảng sẽ trở thành một cấu trúc dữ liệu rất lợi hại cho việc tìm kiếm và tra cứu. Việc tìm phần tử bảng t−ơng ứng cho một khoá nào đó trong bảng là rất nhanh. Thời gian tìm kiếm gần nh− một hằng số, không phụ thuộc vào cỡ lớn của bảng. Nh− vậy, bảng là công cụ rất thích hợp cho việc thiết lập các sổ tra cứu, thí dụ: thiết lập từ điển giải nghĩa các lệnh trong Maple, và từ điển ng−ợc: tìm các lệnh của Maple thực hiện một chức năng nào đó (trong toán học). • Dùng hàm assigned() để kiểm tra một phần tử đã đ−ợc gán cho bảng hay ch−a. Một phần tử có thể đ−ợc xóa bằng cách gán cho nó chính tên của nó. Minh họa Ví dụ sau là một bảng t−ơng ứng giữa một từ chỉ một màu trong tiếng Việt với hai từ chỉ đến màu t−ơng ứng trong tiếng Anh và tiếng Pháp. [>MAUSAC[maudo]:=red,rouge; := MAUSACmaudo ,red rouge [>MAUSAC[mauxanh]:=blue,bleu; := MAUSACmauxanh ,blue bleu [>MAUSAC[mauvang]:=yellow,jaune; := MAUSACmauvang ,yellow jaune Miền xác định (domain) của bảng là tên màu sắc trong tiếng Việt, còn các phần tử t−ơng ứng trong miền giá trị (range) là các màu sắc t−ơng ứng trong tiếng Anh và tiếng Pháp. Các chỉ mục trong bảng MAUSAC trên là: maudo, mauxanh, mauvang, còn các giá trị của bảng t−ơng ứng với các chỉ mục trên là các cặp red,rouge, blue,bleu và yellow,jaune. Ta có thể sử dụng các hàm indices và hàm entries để liệt kê dãy các chỉ mục và các giá trị của bảng: [>indices(MAUSAC); , ,[ ]mauxanh [ ]mauvang [ ]maudo [>entries(MAUSAC); , ,[ ],blue bleu [ ],yellow jaune [ ],red rouge Ta có thể đọc dữ liệu trong bảng bằng cách gọi tên bảng với chỉ mục t−ơng ứng: [>MAUSAC[maudo]; 124 ,red rouge Xoá một phần tử của bảng bằng cách gán cho chính tên của nó: [>MAUSAC[mauxanh]:='MAUSAC[mauxanh]'; := MAUSACmauxanh MAUSACmauxanh Ta có thể kiểm tra lại xem phần tử có chỉ mục mauxanh đã đ−ợc xoá hay ch−a: [>assigned(MAUSAC[mauxanh]); false [>assigned(MAUSAC[mauvang]); true In ra giá trị của bảng: [>print(MAUSAC); table([ , ]) = mauvang ( ),yellow jaune = maudo ( ),red rouge 3.4.4. Cấu trúc dữ liệu mảng Mô tả • Mảng là một kiểu của cấu trúc dữ liệu bảng, trong đó các chỉ số của một mảng bất kì đều là các số nguyên và phạm vi của các chỉ số mảng phải đ−ợc định rõ khi khai báo mảng thông qua hàm array(). • Để tạo ra một mảng, ta phải định rõ phạm vi chỉ số cho mỗi chiều của mảng. Thêm vào đó, bạn có thể định tr−ớc mảng là th−a, đối xứng, phản đối xứng hay theo một số kiểu định nghĩa riêng của bạn. • Việc thay đổi và sao chép mảng làm việc giống nh− trong bảng. Nói chung việc sử dụng mảng với bảng là giống nhau, trừ việc giới hạn chỉ mục là số nguyên trong mảng và bất cứ sự tham chiếu đến một thành phần của mảng đều đ−ợc kiểm tra xem nó có nằm trong phạm vi chỉ số của mảng hay không. Minh họa Định nghĩa A là một mảng hai dòng hai cột: [>A:=array(1..2,1..2); := A ( )array , ,.. 1 2 .. 1 2 [ ] Các phần tử của A có thể đ−ợc gán giá trị: [>A[1,1]:=1;A[2,1]:=4; 125 := A ,1 1 1 := A ,2 1 4 Giống nh− trong bảng, Maple định giá trị của biến theo tên cuối (last name evaluation) thay cho định giá trị hoàn toàn cho biến ( full evaluation). Dùng lệnh print để xem nội dung mảng: [>A; A [>print(A); 1 A ,1 2 4 A ,2 2 Các chỉ số t−ợng tr−ng tạo nên những tham chiếu đến mảng t−ợng tr−ng. Khi các chỉ số đó đ−ợc gán giá trị , thì sự định giá hoàn toàn sẽ sinh ra một tham chiếu đến mảng thực sự: [>i:='i'; := i i [>B:=A[i,1]; := B A ,i 1 [>i:=2; := i 2 [>B; 4 Một mảng một chiều đ−ợc định nghĩa, với phạm vi chỉ số từ -1 đến 3. Theo nh− cách thức đã làm trong cấu trúc bảng, chúng ta cũng sẽ định nghĩa giá trị b[-1] là t khi ta định nghĩa mảng: [>B:=array(-1..3,[-1=t]); B ..-1 3array( , [ := = ( )-1 t = ( )0 B0 = ( )1 B1 = ( )2 B2 126 = ( )3 B3 ]) [>B[-1]; t 3.4.5. Sparse, symmetric, những giản đồ chỉ định đặc biệt cho mảng và bảng Mô tả • Các hàm chỉ mục cho phép bạn định rõ rằng các phần tử của mảng và bảng sẽ nhận các giá trị mặc định nào đó. Để dùng một trong những hàm chỉ định đã có sẵn đ−ợc cho d−ới đây, ta phải truyền tên các hàm này cho đối số đầu trong lệnh định nghĩa bảng hoặc mảng: 9 sparse: Gán giá trị mặc định bằng 0 cho những phần tử của mảng hay của bảng 9 symmetric: Tất cả các phần tử mà chỉ số của chúng bằng nhau do sự hoán vị thì bằng nhau. (chẳng hạn dùng trong ma trận đối xứng) 9 antisymmetric: Tính phản đối xứng. 9 identity: Tất cả các phần tử trên đ−ờng chéo nhận giá trị 1, các phần tử khác thì bằng 0. • Có thể định nghĩa hàm chỉ định của riêng bạn, ví dụ nh− sắp xếp các phần tử của mảng hay bảng hay có thể khởi tạo mọi phần tử từ rỗng,... Lệnh array(indexing_function,...); Tạo một mảng với một hàm chỉ mục. table(indexing_function,...); Tạo một bảng với một hàm chỉ mục. Minh họa Ta dùng hàm chỉ định sparse trong một bảng để đếm số các đối t−ợng trùng nhau trong một danh sách. Ta định nghĩa một bảng các phần tử và tần suất của chúng. [>restart; [>List:=[a,x,y,y,t,x,b,c,w,b,x,y,y,z,y]; := List [ ], , , , , , , , , , , , , ,a x y y t x b c w b x y y z y 127 [>Frequency:=table(sparse); := Frequency table( , [])sparse [>for i in List do Frequency[i]:=Frequency[i]+1; od: [>indices(Frequency); , , , , , , ,[ ]t [ ]b [ ]c [ ]w [ ]z [ ]a [ ]x [ ]y [>entries(Frequency); , , , , , , ,[ ]1 [ ]2 [ ]1 [ ]1 [ ]1 [ ]1 [ ]3 [ ]5
File đính kèm:
- giao_trinh_maple_chuong_3_cac_khai_niem_va_cac_ham_co_ban_tr.pdf