Lập trình tính toán hình thức SYSBOLIC

32
ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH CHƯƠNG TRÌNH ĐÀO TẠO THẠC SĨ CNTT Tiểu luận : MÔ PHỎNG THUẬT TOÁN HEAP SORT & QUICK SORT TRÊN MAPLE Giảng viên hướng dẫn : PGS.TS Đỗ Văn Nhơn Học viên thực hiện : Đoàn Vũ TP.HCM

description

Đoàn Vũ Ngọc Duy

Transcript of Lập trình tính toán hình thức SYSBOLIC

Page 1: Lập trình tính toán hình thức SYSBOLIC

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH

CHƯƠNG TRÌNH ĐÀO TẠO THẠC SĨ CNTT

Tiểu luận : MÔ PHỎNG THUẬT TOÁN

HEAP SORT & QUICK SORT TRÊN

MAPLE

Giảng viên hướng dẫn : PGS.TS Đỗ Văn Nhơn

Học viên thực hiện : Đoàn Vũ Ngọc Duy

MSSV : CH1101010

TP.HCM 01/01/2013

Page 2: Lập trình tính toán hình thức SYSBOLIC

I. GIỚI THIỆU.................................................................................................2

1. ĐẶC ĐIỂM....................................................................................................3

2. NHỮNG ỨNG DỤNG CHỦ YẾU......................................................................3

II. CẤU TRÚC GIAO DIỆN VÀ TÀI NGUYÊN CỦA MAPLE..................4

1. LÀM QUEN VỚI MAPLE................................................................................4

2. SỬ DỤNG DỊCH VỤ TRỢ GIÚP (HELP) TRONG MAPLE..................................5

3. LƯU TRỮ VÀ TRÍCH XUẤT DỮ LIỆU.............................................................6

III. MÔI TRƯỜNG TÍNH TOÁN VÀ CÁC ĐỐI TƯỢNG LÀM VIỆC.......6

IV. BÀI TẬP VẬN DỤNG................................................................................14

1. THUẬT TOÁN HEAP SORT..........................................................................14

2. Thuật toán quick sort................................................................................20

1

Page 3: Lập trình tính toán hình thức SYSBOLIC

I. GIỚI THIỆU

Lập trình symbolic là lập trình trên cơ sở toán học logic, được thiết kế để giải

quyết các vấn đề liên quan đến trí tuệ nhân tạo. Chương trình là tập hợp các mô

tả logic , lập trình dạng này còn được gọi là ngôn ngữ lập trình ký hiệu

(symbolic programming) tương tự các ngôn ngữ lập trình hàm

(functional programming), hay lập trình  phi số (non-numerical

programming). Lập trình symbolic rất thích hợp để giải quyết các bài toán liên

quan đến các đối tượng (object) và mối quan hệ (relation) giữa chúng

Với các tính năng cơ bản của mình, Maple có thể thực hiện được hầu hết các

phép toán cơ bản trong chương trình toán đại học và phổ thông. Maple là chương

trình tính toán vạn năng rất đồ sộ, không thể nào nắm bắt cho hết (dù chỉ trên

phương diện tính toán và biểu diễn) ở đây em xin trình bày các bước cơ bản về số

học và các vấn đề liên quan, giới thiệu các câu lệnh, các hàm thường sử dụng,

cách viết các thủ tục. Từ đó có thể xây dựng nhiều chương trình khác phục vụ

cho việc học tập và nghiên cứu.

Maple là sản phẩm của Waterloo Maple Inc. (http://www.maplesoft.com). Ra đời

vào những năm 1980 tại đại học Waterloo (Canada), và cho đến thời điểm hiện

nay (những ngày đầu năm 2008) đã phát triển đến phiên bản 11. Cài đặt đơn

giản, không đòi hỏi cấu hình máy mạnh (như Matlab), chạy trên tất cả các hệ

điều hành, không quá khó khăn để tự học cách sử dụng với một trình trợ giúp

(Help) rất tiện lợi.

Maple là một chương trình tính toán mạnh mẽ. Hãy thử làm một phép so sánh

nhỏ với một công cụ tính toán thật quen thuộc với chúng ta: Chiếc máy tính bỏ

túi (một phép so sánh rất khập khiễng). Máy tính bỏ túi thì chỉ có thể tính toán

với số cụ thể (nếu bạn nghĩ nó có thể phân tích đa thức thành nhân tử chẳng 2

Page 4: Lập trình tính toán hình thức SYSBOLIC

hạn ?) nhưng Maple thì khác. Nó có khả năng làm việc với cả những biểu thức

toán học và các phép tính hình thức. Cho phép tính toán ra các giá trị chính xác

(chứ không phải là gần đúng như một số ngôn ngữ lập trình khác – ví dụ : C# hay

C++ không hổ trợ tính chính xác tuyệt đối) Từ rút gọn, khai triển biểu thức, tính

giới hạn, đạo hàm, nguyên hàm (chứ không phải chỉ là tính tích phân) ở bậc phổ

thông. Đến khai triển Taylor, tìm nghiệm phương trình vi phân, tính định thức,

giải hệ phương trình tuyến tính có tham số… Maple xử lý trong tích tắc. Không

chỉ như vậy, Maple còn có thể minh hoạ xuất sắc đồ thị hai chiều lẫn mặt cong

trong không gian ba chiều, đồ thị toạ độ cực, tham số, hàm ẩn.

1. Đặc điểm

Là một hệ thống tính toán trên các ký hiệu và biểu thức toán học.

Có thể thực hiện hầu hết các phép toán cơ bản của chương trình toán đại

học và sau đại học.Tính toán được nghiệm chính xác và gần đúng của một

lớp rộng các bài toán lý thuyết và ứng dụng.

Cung cấp các công cụ minh họa hình học thuận tiện bao gồm: đồ thị, hình vẽ

tĩnh và động của các đường và mặt được cho bởi các hàm tùy ý trong nhiều

hệ tọa độ khác nhau.

Một ngôn ngữ lập trình đơn giản và mạnh mẽ có khả năng chuyển đổi

sang các ngôn ngữ lập trình khác.

Cho phép trích xuất dữ liệu ra các định dạng khác nhau như Latex, Word,

HTML...

Một công cụ biên soạn giáo trình điện tử và trình diễn bài giảng thuận

tiện.

Hỗ trợ theo nhiều mức độ cho sinh viên trong việc học tập.

2. Những ứng dụng chủ yếu

3

Page 5: Lập trình tính toán hình thức SYSBOLIC

Maple như một công cụ hỗ trợ việc dạy và học toán. Ứng dụng này quả thật là quan trọng với những sinh viên sư phạm toán cũng như những người làm công tác nghiên cứu toán học

Ngoài ta Maple còn là một công cụ hỗ trợ cho tin học và lập trình. Hiện nay khi Pascal thiếu nhiều công cụ và không còn phù hợp lắm với kiến thức tin học hiện nay để dạy và học cách lập trình. Với những phần mềm tính toán khoa học đang được phát triển rất mạnh mẽ hiện nay như Maple, Mathematica, Matlab… Ta có thể khai thác ngôn ngữ lập trình của nó để học tin học, nhất là thể hiện các thuật toán và các kiến thức tin học có liên quan. Với việc thể hiện các thuật toán trên các ngôn ngữ thông thường như C#, C++ hay Java cũng có nhiều hạn chế trong lập trình cũng như tính toán chính xác, maple là một công vụ rất mạnh để mô phỏng các thuật toán trong trí tuệ nhân tạo hay các thuật giải mã hóa dữ liệu cho đến việc mô phỏng máy học….

II. CẤU TRÚC GIAO DIỆN VÀ TÀI NGUYÊN CỦA MAPLE

Việc cài đặt và khởi động chương trình Maple trên môi trường Windows không

có gì khác biệt so với các chương trình ứng dụng khác. Giao diện của Maple khá

giống với giao diện làm việc của các chương trình ứng dụng khác trên Windows

và cũng rất “ thân thiện” với người sử dụng.

Khi khởi động Maple, chương trình chỉ tự động kích hoạt nhân của Maple bao

gồm các phép toán và chức năng cơ bản nhất. Phần nhân chiếm khoảng 10%

dung lượng của toàn chương trình.

Các dữ liệu và chương trình còn lại của Maple được lưu giữ trong thư viện Maple

và được chia ra 2 nhóm: nhóm các lệnh cơ bản và nhóm các gói lệnh

1. Làm quen với maple

4

Page 6: Lập trình tính toán hình thức SYSBOLIC

Lệnh được gõ vào trang làm việc (worksheet) tại dấu nhắc lệnh ">" và theo ngầm

định được hiển thị bằng font Courier màu đỏ. Một lệnh đựợc kết thúc bởi dấu " :"

hoặc dấu ";" và được ra lệnh thực hiện bằng việc nhấn Enter khi con trỏ đang ở

trên dòng lệnh.

> factor(2*x^102+x^100-2*x^3-x+60*x^2+30):

Kết quả của lệnh được hiển thị ngay bên dưới dòng lệnh nếu dùng dấu " ;". Có

thể dễ dàng dùng chuột và bàn phím để thực hiện các chức năng bôi đen, copy,

paste, cut, delete...đối với dữ liệu trên dòng lệnh hay kết quả thực hiện.

Trang làm việc (worksheet) : là trang chứa nơi có thể đặt các lệnh , các chương trình , các chú thích ...Trang làm việc sẽ được lưu lại thành file có phần mở rộng *.mws .

Cụm xử lí (Execution Group): [> là nơi có thể đặt 1 lệnh , hay một nhóm lệnh của Maple. Sau khi đánh Enter tòan bộ các lệnh trong cụm xử lí sẽ được thực thi.

Cụm văn bản (Text) : [ là nơi có thể đặt văn bản với mục đích minh họa, chú thích.

Phần (Section) : có thể thu gọn/nới rộng , có thể bao gồm cụm xử lí và cụm văn bản.

Trong một cụm xử lí có thể gồm nhiều lệnh. Các lệnh kết thúc bằng ; hoặc :

Các lệnh kết thúc bằng ; sẽ được thực thi và kết quả hiện ra màn hình.

Các lệnh kết thúc bằng : sẽ được thực thi ngầm và kết quả không hiện ra màn hình.

Muốn thêm một lệnh sau lệnh hiện tại gõ Shift Enter thay vì Enter.

Có thể click vào nút lệnh Help trên Menu Bar của Maple để mở phần tài liệu trợ giúp , tìm kiếm mục thích hợp , nhấn Ctrl + F1 để copy tòan bộ ví dụ , dán ngược lại vào trang để thực thi

5

Page 7: Lập trình tính toán hình thức SYSBOLIC

2. Sử dụng dịch vụ trợ giúp (Help) trong Maple

Maple có dịch vụ trợ giúp khá đầy đủ và thuận lợi bao gồm cú pháp, giải thích

cách dùng và các ví dụ đi kèm. Để nhận được trợ giúp, có thể:

Nếu đã biết tên lệnh thì từ dấu nhắc gõ vào > factor

Nếu dùng một gói lệnh thì khi nạp gói lệnh, Maple sẽ hiển thị toàn bộ lệnh

trong gói đó.

Một cách thông dụng nữa là dùng trình Help|Topic Search rồi gõ vào từ

khóa cần tìm.

3. Lưu trữ và trích xuất dữ liệu

Trang làm việc của Maple sẽ được lưu giữ bằng file có đuôi ".mws". File được

lưu giữ bằng trình File|Save. Một file đó được mở bằng File|Open.

Ngoài việc lưu giữ bằng định dạng của Maple như trên, dữ liệu có thể được trích

xuất thành các định dạng khác như LaTex hay HTML. Trích xuất bằng File|

Export.

III. MÔI TRƯỜNG TÍNH TOÁN VÀ CÁC ĐỐI TƯỢNG LÀM

VIỆC

Maple có 2 môi trường làm việc là toán và văn bản. Sau khi khởi động, Maple tự

động bật môi trường toán. Muốn chuyển sang môi trường văn bản, kích chuột

vào biểu tượng T trên thanh công cụ hay vào trình Insert->Text. Ngược lại, từ

môi trường văn bản, kích chuột vào dấu "[>" trên thanh công cụ hay vào Insert để

chuyển sang môi trường toán.

Một trang làm việc (worksheet) của Maple có thể bao gồm những thành phần cơ

bản như sau:

6

Page 8: Lập trình tính toán hình thức SYSBOLIC

Cụm xử lý (Execution Group)

Lệnh và kết quả tính toán của Maple

Mục (Section)

Đồ thị (Graph)

Siêu liên kết (Hyperlink)

Văn bản và đoạn văn bản (Text và paragraph)

Đầu tiên hãy mở một trang (worksheet) mới bằng cách chọn File/New. Một trang trắng với dấu [> sẽ hiện ra:

>

Dấu trên gọi là prompt, sau dấu đó các bạn có thể gõ các phép tính và yêu cầu

Maple thực hiện. Kết thúc mỗi dòng lệnh là dấu chấm phẩy hai hai chấm, sau đó

là …Enter. Hãy thử:

> 247*3756;

Nếu bạn kết thúc bằng dấu hai chấm, Maple sẽ vẫn tính nhưng không hiển thị kết

quả. Các phép tính cộng, trừ, nhân, chia, luỹ thừa, lần lượt được kí hiệu: +, -,

*, / , ^ (**).

Chú ý một điều là Maple dùng cách tính chính xác, cho nên khi thực hiện :

> 25/27+3/51;

Để có kết quả gần đúng, dùng hàm evalf:

> evalf(%);

7

Page 9: Lập trình tính toán hình thức SYSBOLIC

Maple phân biệt chữ hoa với chữ thường, cho nên Pi khác với pi. Pi là hằng số

= 3.141592654, trong khi đó pi là chữ cái Hi Lạp

Để tìm hiểu thêm một lệnh nào đó chưa biết, bạn có thể đọc phần Help hoặc đơn

giản hơn là nhấn F1 sao khi đã đặt con trỏ vào và với 1 lần Click.

Biến và hàm: phép gán (một hàm số hay một giá trị nào đó cho một biến) được

thực hiện bằng cách dùng kí hiệu :=

> alpha:=5;

Kiểm tra lại:

> 4*alpha+12;

Để trả tự do lại cho biến alpha, bạn dùng lệnh:

> alpha:='alpha';

Định nghĩa hàm (cái này quan trọng!) có hai cách:

Cách 1: gán cho nó một biến số.

> f:=x^2;

Để tính giá trị của f:

8

Page 10: Lập trình tính toán hình thức SYSBOLIC

> x:=1;

> f;

Hoặc:

> subs(x=1,f);

Cách 2 : > f:=x->x^2;

> f(1);

Lúc này ta có thể tính giá trị của hàm tại biến x bằng kí hiệu quen thuộc f(x).Hãy

xem xét khả năng của Maple trong việc biến đổi tính toán các biểu thức đại số:

Lệnh simplify thu gọn một biểu thức

> f:=(1+x)/x+(1-x)/x;

> simplify(f);

Lệnh expand khai triển một biểu thức:

9

Page 11: Lập trình tính toán hình thức SYSBOLIC

> f:=(x^2-4)*(x+1)*(x-2)*(x^2+x+1);

> expand(f);

Lệnh Factor biến đổi biểu thức thành nhân tử:

> factor(sin(x)^3-cos(x)^3);

Giải hệ phương trình dùng lệnh Solve, tuy nhiên trước khi giải phải Restart để trả

tự do cho tất cả các biến.

> restart;

> sol:=solve({2*x-5*y=12,12*x+4*y=17},{x,y});

Đạo hàm và tích phân: dùng lệnh diff:

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

> df:=diff(f,x);

> df2:=diff(f,x$2);#dao ham bac hai cua f

10

Page 12: Lập trình tính toán hình thức SYSBOLIC

Nguyên hàm, tích phân dùng lệnh int

> f:=sin(x);

> int(f,x);#nguyen ham cua f

> int(f,x=0..3);#tich phan xac dinh cua f tu 0 toi 3

> evalf(%);

Tích phân thì luôn tính được, tuy nhiên nguyên hàm thì không phải lúc nào

Maple cũng tính ra. Chẳng hạn trường hợp sau:

> h:=sin(x)/g(x);

> int(h,x);#khong phai bao gio Maple cung tim ra nguyen ham

> evalf(int(h,x=0..1));

Đồ thị hai chiều: ta dùng lệnh Plot để vẽ.

11

Page 13: Lập trình tính toán hình thức SYSBOLIC

> f:=exp(-x)*sin(3*x);

> plot(f,x=0..3);# ve ham f trong khoang tu 0 toi 3

> plot(f,x=0..3,y=-0.3..1,color=blue);# Giới hạn trục y chọn tọa độ màu xanh

12

Page 14: Lập trình tính toán hình thức SYSBOLIC

Đồ thị 3 chiều: Ta xét một minh hoạ hình ảnh tự nhiên của các đường conic như

giao tuyến của mặt nón và một mặt phẳng cắt nó.

> with(plots):

>animate(plot3d,[y/3-10,x=

20..t,y=20..t,color=red,style=PATCHNOGRID],t=18..17,axes=framed,backg

round=plot3d([z*cos(t),z*sin(t),z],z=20..0,t=-Pi..Pi));

Kết quả là một hình 3 chiều mà đặc biết là bạn có thể xoay nó và quan sát theo

mọi góc độ.

13

Page 15: Lập trình tính toán hình thức SYSBOLIC

Bằng cách thay đổi thích hợp phương trình mặt phẳng cắt nó, chúng ta có thể thu

được thiết diện là một trong các đường conic.

Bằng các gói lệnh chuyên nghiệp khác, Maple còn làm được rất nhiều các nghiên

cứu có giá trị 14

Page 16: Lập trình tính toán hình thức SYSBOLIC

IV. BÀI TẬP VẬN DỤNG

1. Thuật toán heap sort

Mô phỏng bài toán

Mỗi mảng a[1..n] có thể xem như một cây nhị phân gần đầy (có trọng số là các

giá trị của mảng), với gốc ở phần tử thứ nhất, con bên trái của đỉnh a[i] là a[2*i]

con bên phải là a[2*i+1] (nếu mảng bắt đầu từ 1 còn nếu mảng bắt đầu từ 0 thì 2

con là a[2*i+1] và a[2*i+2] ) (nếu 2*i<=n hoặc 2*i+1<=n, khi đó các phần tử có

chỉ số lớn hơn không có con, do đó là lá).

Ví dụ mảng (45,23,35,13,15,12,15,7,9) là một đống

Một cây nhị phân, được gọi là đống cực đại nếu khóa của mọi nút không nhỏ hơn

khóa các con của nó. Khi biểu diễn một mảng a[] bởi một cây nhi phân theo thứ

tự tự nhiên điều đó nghĩa là a[i]>=a[2*i] và a[i]>=a[2*i+1] với mọi i =1..int(n/2).

Ta cũng sẽ gọi mảng như vậy là đống. Như vậy trong đống a[1] (ứng với gốc của

cây) là phần tử lớn nhất. Mảng bất kỳ chỉ có một phần tử luôn luôn là một đống.

Một đống cực tiểu được định nghĩa theo các bất đẳng thức ngược lại:

a[i]<=a[2*i] và a[i]<=a[2*i+1]. Phần tử đứng ở gốc cây cực tiểu là phần tử nhỏ

nhất.

Vun đống

Việc sắp xếp lại các phần tử của một mảng ban đầu sao cho nó trở thành đống

được gọi là vun đống.

Vun đống thứ i

Nếu hai cây con gốc 2 * i và 2 * i + 1 đã là đống thì để cây con gốc i trở thành

đống chỉ việc so sánh giá trị a[i] với giá trị lớn hơn trong hai giá trị a[2 * i] và a[2 15

Page 17: Lập trình tính toán hình thức SYSBOLIC

* i + 1], nếu a[i] nhỏ hơn thì đổi chỗ chúng cho nhau. Nếu đổi chỗ cho a[2 * i],

tiếp tục so sánh với con lớn hơn trong hai con của nó cho đên khi hoặc gặp đỉnh

lá. (Thủ tục DownHeap trong giả mã dưới đây)

Vun một mảng thành đống

Để vun mảng a[1..n] thành đống ta vun từ dưới lên, bắt đầu từ phần tử a[j]với j

=Int(n/2) ngược lên tới a[1]. (Thủ tục MakeHeap trong giả mã dưới đây) kho qua

Sắp xếp bằng vun đống

Đổi chỗ (Swap): Sau khi mảng a[1..n] đã là đống, lấy phần tử a[1] trên đỉnh của

đống ra khỏi đống đặt vào vị trí cuối cùng n, và chuyển phần tử thứ cuối cùng

a[n] lên đỉnh đống thì phần tử a[n] đã được đứng đúng vị trí.

Vun lại

Phần còn lại của mảng a[1..n-1] chỉ khác cấu trúc đống ở phần tử a[1]. Vun lại

mảng này thành đống với n-1 phần tử.

Lặp

Tiếp tục với mảng a[1..n-1]. Quá trình dừng lại khi đống chỉ còn lại một phần tử

Mô phỏng heap sort bằng Maple

> parent:=i->floor(i/2);

>

>

16

Page 18: Lập trình tính toán hình thức SYSBOLIC

>

>

17

Page 19: Lập trình tính toán hình thức SYSBOLIC

>

>

>

>

>

>

>

>

18

Page 20: Lập trình tính toán hình thức SYSBOLIC

>

>

> > >

> >

> >

2. Thuật toán quick sort

Mô phỏng bài toán

19

Page 21: Lập trình tính toán hình thức SYSBOLIC

Sắp xếp nhanh (Quicksort), còn được gọi là sắp xếp kiểu phân chia (part sort) là

một thuật toán sắp xếp phát triển bởi C.A.R. Hoare, dựa trên phép phân chia danh

sách được sắp thành hai danh sách con. Phương pháp này là minh họa rõ ràng

nhất Để sắp xếp một danh sách a[1…n] ta chia nó thành hai danh sách bằng cách

so sánh từng phần tử của danh sách với một phần tử được chọn làm phần tử chốt.

Những phần tử nhỏ hơn phần tử chốt được đưa về phía trước và nằm trong danh

sách con thứ nhất, các phần tử lớn hơn chốt được đưa về phía sau và thuộc danh

sách đứng sau. Cứ tiếp tục chia như vậy tới khi các danh sách con đều có độ dài

bằng 1.

Danh sách a[1…n]:

Danh sách 1 gồm: a[1…k] < X

Danh sách 2 gồm: a[(k+1) …n] > X

a < X

a = X

a > X

Ở đây ta thấy xuất hiện 3 danh sách con, trong đó:

Danh sách thứ 2 đã được sắp xếp. Nếu danh sách 1 và 3 chỉ có một phần tử thì

dãy a[i…n] đã được sắp xếp xong. Nếu danh sách 1 và 3 có hơn một phần tử thì

dãy ban đầu chỉ có thứ tự khi các dãy con 1, 3 được sắp. Để sắp xếp dãy con 1 và

3, ta lần lượt tiến hành việc phân hoạch từng dãy con theo cùng phương pháp

phân hoạch dãy ban đầu vừa trình bày.

Giải thuật:

Giải thuật phân hoạch dãy a[1…n] thành hai dãy con gồm 3 bước:

20

Page 22: Lập trình tính toán hình thức SYSBOLIC

Bước 1: chọn tùy ý 1 phần tử a[k] trong dãy làm giá trị mốc.

L ≤ k ≤ R : a[k] =X;

i = L; j = R;

Gợi ý các cách chọn phần tử mốc

Chọn phần tử đứng đầu hoặc đứng cuối làm phần tử chốt.

Chọn phần tử đứng giữa danh sách làm phần tử chốt.

Chọn phần tử trung vị trong 3 phần tử đứng đầu, đứng giữa và đứng cuối làm

phần tử chốt.

Chọn phần tử ngẫu nhiên làm phần tử chốt. (Cách này có thể dẫn đến khả năng

rơi vào các trường hợp đặc biệt)

Bước 2: Phát hiện và hiệu chỉnh cặp phần tử a, a[j] nằm sai chỗ:

Bước 2a: Trong khi (a < X) i++;

Bước 2b: Trong khi (a[j] > X) j++;

Bước 2c: Nếu i < j // a ≥ X ≥ a[j] mà a[j] đứng sau a

Hoán vị ( a, a[j]);

Bước 3: Nếu i < j; Lặp lại Bước 2

// chưa xét hết mảng

Nếu I > j; Dừngcho chiến lược chia để trị.

Mô phỏng quick sort bằng Maple

21

Page 23: Lập trình tính toán hình thức SYSBOLIC

>

22

Page 24: Lập trình tính toán hình thức SYSBOLIC

>

>

>

>

23

Page 25: Lập trình tính toán hình thức SYSBOLIC

>

>

> >

> >

>

>

24

Page 26: Lập trình tính toán hình thức SYSBOLIC

> >

>

>

>

25