Giáo trình Maple - Chương 4: Lập trình trên Maple

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 while cho phép lặp chuỗi các câu lệnh nằm giữa do và od khi 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 while thườ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, break hoặ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.

 

Giáo trình Maple - Chương 4: Lập trình trên Maple trang 1

Trang 1

Giáo trình Maple - Chương 4: Lập trình trên Maple trang 2

Trang 2

Giáo trình Maple - Chương 4: Lập trình trên Maple trang 3

Trang 3

Giáo trình Maple - Chương 4: Lập trình trên Maple trang 4

Trang 4

Giáo trình Maple - Chương 4: Lập trình trên Maple trang 5

Trang 5

Giáo trình Maple - Chương 4: Lập trình trên Maple trang 6

Trang 6

Giáo trình Maple - Chương 4: Lập trình trên Maple trang 7

Trang 7

Giáo trình Maple - Chương 4: Lập trình trên Maple trang 8

Trang 8

Giáo trình Maple - Chương 4: Lập trình trên Maple trang 9

Trang 9

Giáo trình Maple - Chương 4: Lập trình trên Maple trang 10

Trang 10

Tải về để xem bản đầy đủ

pdf 58 trang duykhanh 6340
Bạn đang xem 10 trang mẫu của tài liệu "Giáo trình 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

Tóm tắt nội dung tài liệu: Giáo trình Maple - Chương 4: Lập trình trên Maple

Giáo trình Maple - Chương 4: Lập trình trên Maple
ột tệp để ghi: 
[>f:=open(`close.txt`,WRITE); 
:= f 0 
[>writeline(f,`dong thu nhat`,`dong thu hai`); 
27 
Dùng lệnh close() đóng tệp lại: 
[>close(f); 
Việc đóng một tệp đã tồn tại trên đĩa mà ch−a đ−ợc mở không hề gây ra lỗi: 
[>close(`close.txt`); 
Để đảm bảo chắc chắn tệp close.txt đã hoàn toàn đóng tr−ớc khi mở lại, ta gọi 
close() tr−ớc, sau đó mới dùng lệnh open(): 
[>close(`close.txt`); 
[>f:=open(`close.txt`,READ); 
174 
[>readline(f); 
[>close(f); 
:= f 0 
dong thu nhat 
Lệnh ghi dữ liệu 
Cú pháp 
Khai báo: 
save filename; 
save name01, name02,...name0n, filename; 
Tham số: 
filename: Tên tệp cần l−u dữ liệu. 
name01, name02,... name0n: tên của n biến cần 
l−u giá trị. 
Mô tả 
Hàm save dùng để l−u các tên (bao gồm tên biến, tên biểu thức,...) trong một 
phiên tính toán của Maple vào trong một tệp. 
Dạng phát biểu thứ nhất trong phần khai báo, câu lệnh save filename sẽ ghi tất 
các tên hiện có trong phiên làm việc của Maple (Maple session) vào trong tệp có 
tên đ−ợc xác định bởi filename. 
Trong dạng phát biểu thứ hai, các biến xác định name01, name02, ...name0n 
sẽ đ−ợc viết vào trong tệp có tên là filename nh− là một chuỗi các câu lệnh gán. 
Nếu một tên name0i không đ−ợc gán một giá trị thì phép gán name0i:=name0i 
đ−ợc viết vào tệp. 
Nếu filename có chứa những kí tự không bình th−ờng ( ví dụ:"/",".",...) thì tên 
phải đ−ợc đóng trong dấu ngoặc. 
Nếu filename kết thúc bằng kí tự ".m" thì các biến cùng với các giá trị đ−ợc gán 
cho chúng đ−ợc ghi vào tệp theo dạng thức nội tại của Maple. Nếu không thì chúng 
đ−ợc ghi theo dạng thức ngôn ngữ của Maple thông th−ờng. 
Minh hoạ 
Tạo một số dòng lệnh và ghi vào một tệp bằng lệnh save. 
[>read `save.m`; 
[>a; 
200 
175 
[>n; 
3628800 
Lệnh đọc dữ liệu read 
Cú pháp 
Khai báo: 
read filename; 
Tham biến: 
filename: Tên tệp cần đọc dữ liệu. 
Mô tả 
Chúng ta dùng lệnh read để đọc các tệp có dạng thức nội bộ và dạng thức ngôn 
ngữ của Maple vào trong máy. Nếu tên tệp có kết thúc bằng kí tự ".m" hoặc ".mws" 
thì tệp đ−ợc đọc vào theo dạng nội bộ của Maple, khi đó các đối t−ợng ghi trong tệp 
đ−ợc đ−ợc đọc vào trong bộ nhớ và sẵn sàng đ−ợc sử dụng. Nếu tên tệp chứa các kí 
tự lạ nh− ".", "/",.. thì tên tệp đấy phải đ−ợc đặt trong cặp dấu ngoặc. 
Nếu tệp có dạng thức ngôn ngữ (language format), các câu lệnh trong tệp đ−ợc đọc 
và thực thi giống nh− là khi chúng đ−ợc gõ vào. Tuy nhiên , các câu lệnh không 
đ−ợc hiện trên màn hình trừ tr−ờng hợp lệnh interface(echo) đ−ợc đặt bằng 2 
hay cao hơn. 
Dạng thức của các tệp do lệnh save quy định. 
Minh hoạ 
Khởi động lại phiên làm việc. 
[>restart; 
Ghi các lệnh sau vào tệp theo định dạng ngôn ngữ của Maple: 
[>u:=proc(n) 
local a,b,c,i; 
a:=1;b:=1; 
if n<0 then 
print(`Khong co gia tri`); 
elif n<=1 then a; 
else 
for i from 2 to n do 
c:=a+b;a:=b;b:=c; 
od; 
c; 
176 
fi; 
end: 
[>a:=u(1000): 
[>save `test`; 
Sau đó ta có thể đọc tệp này vào bằng lệnh read: 
[>read `test`; 
u nproc ( ) := 
local ;, , ,a b c i
 := a 1;
 := b 1;
 < n 0 ( )print `Khong co gia tri`if then 
 ≤ n 1 aelif then
;for from to do end doi 2 n ; ; := c + a b := a b := b c celse
end if
end proc 
[>fremove(`test`); 
4.4.2. Đọc dữ liệu từ tệp vào 
Đọc một dòng từ tệp 
Cú pháp 
Khai báo: 
readline(filename); 
readline(); 
Tham biến: 
filename: Tên của một tập tin hay là kí hiệu nhận dạng (descriptor). 
Mô tả 
Ta sử dụng hàm readline() để đọc dòng dữ liệu tiếp theo từ tệp đã chỉ rõ. Hàm 
readline cho lại kết quả là một xâu kí tự (string) chứa cả dòng dữ liệu đọc đ−ợc 
từ tệp. Kí tự xuống dòng đọc đ−ợc từ tệp sẽ bị xoá tr−ớc khi dòng dữ liệu gán cho 
xâu kí tự đó. 
Nếu không còn dòng dữ liệu nào để đọc nữa, hàm readline cho kết quả là số 0 
(thay vì một xâu kí tự) để báo rằng đã đến cuối tệp. Nếu nh− tệp đ−ợc chỉ rõ bằng 
tên của nó (tức là đối số truyền cho hàm readline là tên tệp) thì Maple tự động 
đóng tệp đó lại. 
Khi không có tệp nào đ−ợc mở, nếu sử dụng lệnh readline() không có đối số thì 
177 
lệnh này sẽ trực tiếp đọc một dòng lệnh đ−ợc gõ vào tại vị trí dấu đợi lệnh tiếp theo 
của Maple và Maple sẽ không thực hiện dòng lệnh này nữa. Khi có tệp đang đ−ợc 
mở, lệnh readline() sẽ đọc dòng tiếp theo của tệp. 
 Khi ta gọi lệnh readline với đối số là tên tệp mà tệp đó ch−a đ−ợc mở, thì lệnh 
này sẽ mở tệp theo chế độ READ với kiểu là TEXT. 
Minh hoạ 
Tạo một tệp có một dòng văn bản sau đó dùng readline để đọc. 
[>f:=fopen(`example.txt`,WRITE,TEXT); 
[>fprintf(f,`chao ban`); 
[>fclose(f); 
:= f 2 
8 
[>str:=readline(`example.txt`); 
:= str chao ban 
[>str:=readline(`example.txt`); 
:= str 0 
Lệnh readline() sẽ đọc một dòng từ dòng nhập tiếp theo: 
[>str:=readline(); 
[>hello world! 
:= str hello world! 
Đọc một số bytes từ tệp 
Cú pháp 
Khai báo: 
readbytes(file); 
readbytes(file,len); 
readbytes(file,TEXT); 
readbytes(file,len,TEXT); 
Tham biến: 
file: tên của tệp hoặc số hiệu tệp. 
len: Số l−ợng bytes cần đọc. 
TEXT: Chỉ rõ các bytes đọc đ−ợc l−u vào trong một xâu kí tự. 
178 
Mô tả 
Ta sử dụng hàm readbytes để đọc một số bytes xác định (trong biến len) từ một 
tệp. Nếu chiều dài của tệp không đ−ợc cho biết tr−ớc, hàm readbytes chỉ đọc byte 
tiếp theo. Nếu đối số len đ−ợc định rõ là không xác định (infinity), hàm 
readbytes sẽ đọc phần còn lại của tệp. 
Nếu tên tệp đ−ợc cho biết và tệp đó ch−a đ−ợc mở, hàm readbytes() sẽ mở tệp 
theo chế độ mở để đọc. Tệp đ−ợc mở theo kiểu TEXT nếu tham số TEXT đ−ợc 
truyền cho hàm, còn nếu không thì tệp đ−ợc mở theo kiểu BINARY. 
Hàm readbytes cho lại kết quả là danh sách các số nguyên đọc đ−ợc. Nếu hàm 
nhận đối số TEXT thì các bytes đọc đ−ợc sẽ đ−ợc trả lại d−ới dạng một xâu kí tự. 
Trong tr−ờng hợp số bytes còn lại trong tệp ít hơn số l−ợng bytes cần đọc, hàm 
readbytes chỉ đọc hết các bytes còn lại rồi dừng. Nếu tệp đ−ợc đọc không còn 
bytes nào, hàm readbytes cho kết quả là sô 0. Nếu tên tệp đ−ợc chỉ rõ, Maple sẽ 
tự động đóng tệp sau khi đọc hết. 
Minh hoạ 
Ghi dữ liệu vào một tệp bằng lệnh writebytes, sau đó dùng readbytes để 
đọc dữ liệu ra từ tệp: 
[>writebytes(testFile,[65, 66, 67]); 
3 
[>readline(testFile); 
Đọc lệnh từ bàn phím 
Cú pháp 
Khai báo: 
readstat(prompt); 
readstat(quote3,quote2,quote1); 
readstat(prompt,quote3,quote2,quote1); 
readstat(); 
Tham biến: 
prompt: Xâu văn bản đ−ợc dùng làm dấu nhắc đợi lệnh. 
quote3,quote2,quote1: Giá trị thay thế cho %%%, %%, %. 
Mô tả 
Chúng ta sử dụng hàm readstat() để đọc câu lệnh tiếp theo từ bàn phím hoặc tệp 
(nếu tệp đang đ−ợc mở), và cho lại kết quả của lệnh là giá trị của câu lệnh đó. 
Nếu xâu kí tự dùng để thay thế cho dấu nhắc lệnh (prompt) đ−ợc chỉ rõ trong biến 
prompt thì hàm readstat() sẽ hiển thị nó trên màn hình. 
179 
Nếu có các đối số quote3, quote2, quote1 trong lệnh readstat() thì chúng phải đ−ợc 
cho d−ới dạng các danh sách và nội dung của các biến này sẽ thay thế cho những 
chỗ xuất hiện của các dấu %%%, %%, % (trong Maple 5 và 6), hoặc thay cho các 
dấu """, "", " (trong Maple 4 trở xuống). 
Nếu gõ vào ch−a hoàn tất một câu lệnh mà đã ấn phím ENTER, hàm readstat() 
sẽ hiển thị lại dấu nhắc để yêu cầu gõ nốt phần lệnh còn lại. Điều này diễn ra cho 
đến khi toàn bộ câu lệnh đ−ợc nhập vào. 
Khi phát hiện ra lỗi cú pháp, hàm readstat() sẽ hiển thị thông báo về lỗi cú pháp 
này, sau đó hiển thị lại dấu nhắc để đợi một lệnh mới. 
Hàm readstat() đọc tất cả các dòng nhập vào cho đến khi nhận đ−ợc toàn bộ 
một câu lệnh. Nếu tại dòng cuối có thêm các kí tự nào đó đằng sau dấu kết thúc câu 
lệnh (;), hàm readstat hiển thị lời nhắc nhở, đồng thời các kí tự thêm vào sau dấu 
kết thúc sẽ bị loại bỏ. 
Minh hoạ 
[>x := readstat('x will be assigned:'); 
Đọc dữ liệu có số cột và kiểu cố định 
Cú pháp 
Khai báo: 
readdata(file,n); 
readdata(file,format,n); 
readdata(file,format); 
Tham biến: 
 file: tên tệp hoặc số hiệu của tệp. 
 n: Số cột dữ liệu. 
 format: Cho biết dữ liệu đ−ợc đọc là số nguyên hoặc số thực. 
Mô tả 
Hàm readdata() dùng để đọc dữ liệu số từ tệp văn bản vào môi tr−ờng tính toán 
Maple. Dữ liệu bao gồm các số nguyên và số thập phân có dấu chấm động đ−ợc sắp 
xếp trong các cột phân cách nhau bởi dấu cách. Nếu chỉ một cột dữ liệu đ−ợc đọc, 
thì đầu ra của lệnh readdata() là một danh sách dữ liệu. Nếu có nhiều hơn một 
cột dữ liệu đ−ợc đọc, thì đầu ra là một danh sách các danh sách con trong đó mỗi 
danh sách con t−ơng ứng với một dòng dữ liệu trong tệp. 
Ta sử dụng dạng đầu của lệnh readdata() để đọc n cột các số từ tệp xác định bởi 
đối số file. Dữ liệu số đ−ợc đọc ra d−ới dạng các số thập phân có dấu chấm động. 
Muốn đọc dữ liệu d−ới dạng số nguyên, số thập phân có dấu chấm động, hoặc dữ 
liệu kiểu xâu kí tự, ta phải sử dụng dạng thứ hai và thứ ba của hàm readdata() đ−ợc 
khai báo trong phần cú pháp trên. Tham số format nhận các giá trị là integer, 
float, string, hoặc là một danh sách chứa một hay một số kiểu dữ liệu trên. 
180 
Nếu đối số file nhận giá trị tên tệp (chứ không phải là số hiệu tệp), và nếu tệp ch−a 
mở, thì tệp sẽ đ−ợc Maple mở d−ới dạng TEXT theo chế độ READ. Sau khi đọc 
xong dữ liệu, readdata() tự động đóng tệp lại. 
Minh hoạ 
Dùng lệnh writedata() để tạo một têp dữ liệu gồm một dòng các số: 
[>writedata(`data.txt`,[17,7,1979]); 
Đọc lại dữ liệu từ tệp trên: 
[>readdata(`data.txt`); 
[ ], ,17. 7. 1979. 
Ta có thể sử dụng lệnh readdata() để đọc nhiều dòng dữ liệu từ tệp, mỗi dòng 
chứa các dữ liệu có kiểu khác nhau: 
[>f:=fopen(`data.txt`,WRITE,TEXT); 
[>fprintf(f,`7 8 7.5 kha\n`); 
[>fprintf(f,`1 2 1.5 kem\n`); 
[>fclose(f); 
:= f 0 
12 
12 
[>readdata(`data.txt`,[integer,integer,float,string]); 
[ ],[ ], , ,7 8 7.5 kha [ ], , ,1 2 1.5 kem 
Đọc dữ liệu định rõ kiểu 
Cú pháp 
Khai báo: 
fscanf(file, fmt) 
sscanf(str, fmt) 
scanf(fmt) 
Tham biến: 
file: tên tệp hoặc số hiệu của tệp. 
str: Xâu hoặc dãy kí tự sẽ đ−ợc viết ra. 
fmt: Cho biết kiểu dữ liệu đ−ợc hiển thị có kiểu nguyên, thực hoặc 
xâu... 
181 
Mô tả 
Hàm fscanf dùng để đọc dãy kí tự, số học tùy theo kiểu định dạng của fmt và 
Maple trả lại danh sách các phần tử đọc đ−ợc. 
Nếu tệp ch−a tồn tại hoặc rỗng thì danh sách trả lại là rỗng (cũng giống nh− hàm 
scanf(fmt)). 
Các kiểu định dạng (format) của fmtcó dạng %[*][width]code trong đó: 
9 %: chỉ là kí hiệu chỉ cho fscanf biết rằng tại đó bắt đầu định dạng 
kiểu. 
9 *: có thể là một trong các kí hiệu sau: g,d,... Nó định dạng kiểu cho 
hàm fscanf. 
9 width: độ dài lớn nhất của danh sách trả lại khi hàm fscanf đọc 
đ−ợc. 
9 Các fmt th−ờng đ−ợc dùng nhất: 
9 d: định dạng kiểu trả lại là số nguyên. 
9 f: định dạng kiểu trả lại là số thực. 
9 s: kiểu trả lại là một xâu (string).... 
Minh hoạ 
[>sscanf(`123.456E7 123.456E7`,`%g%d.%d %[Ee] %d`); 
[ ], , , ,.1234561010 123 456 E 7 
[>sscanf(`X=123.4 Y=-27.9 Z=2.3E-5`,`X=%f Y=%f Z=%f`); 
[ ], ,123.4 -27.9 .000023 
[>sscanf(`25 1/(x^4+1) test`,`%d%a%s`); 



, ,25
1
 + x4 1 test 
4.4.3. Ghi dữ liệu vào tệp 
Câu lệnh dùng để ghi dữ liệu vào tệp cũng có kiểu định dạng nh− đọc dữ liệu từ 
tệp vào nên chúng tôi chỉ giới thiệu qua. Bạn có thể tham khảo mục đọc dữ liệu từ 
tệp vào. 
Giao diện của công việc ghi 
Cú pháp 
Khai báo: 
interface(thamso1, thamso2,...) 
182 
Tham số: 
thamso1, thamso2,.... là những tùy chọn cần đặt. 
Mô tả 
Interface là một thủ tục cho phép ng−ời dùng trao đổi, đặt lại khả năng hiển thị 
của kết quả phép tính mà không là thay đổi gì đến sự đúng, sai của phép tính. 
Các tùy chọn có thể có của interface: 
9 plotdevice: Dùng trong chế độ đồ họa, cho phép hiển thị hình vẽ 
trong cùng một trang làm việc (inline), hoặc vẽ sang trang làm việc 
khác (window). 
9 screenheight, screenwidth: Quy định khung của trang làm việc 
(chiều cao, chiều rộng). 
9 prompt: Thay đổi dấu nhắc lệnh của Maple. 
Minh hoạ 
Thay đổi dấu nhắc lệnh của Maple 
[>interface( echo=2, prompt=`#-->` ); 
Tìm tùy chọn hiển thị bạn đang dùng(inline hoặc window): 
[>mydevice := interface( plotdevice ); 
:= mydevice inline 
[>interface(plotdevice=postscript,plotoutput=myfile); 
Đặt lại trạng thái của trang làm việc: 
[>interface(plotdevice=mydevice); 
Ghi bằng lệnh in (print) 
Với các dạng sau đây: 
fprintf(file, fmt, x1, ..., xn); 
sprintf(fmt, x1, ...,xn); 
printf(fmt, x1, ...,xn); 
Trong đó: 
file: tên file bạn định ghi lại hoặc một mô tả, 
fmt: Kiểu đ−ợc in ra. Ví dụ: printf(`%g`), 
x1,x2,...xn là các biến sẽ đ−ợc định dạng. 
Mô tả 
Xem mục fscanf. 
183 
Minh hoạ 
Ví dụ 1: In ra một số nguyên(kiểu là %d), số thực(kiểu là %f) và số thực với 
dấu phẩy động(kiểu là %g), sau đó xuống dòng(\n). 
[>printf(`%d %f %g\n`,123,123/456,123456789); 
 123 .269736 1.234567e+08 
Ví dụ 2: Cùng một biến ta cho in ra theo hai kiểu format khác nhau 
[>s:=65: 
[>printf(`In ra voi tham so kieu nguyen : %d`,s); 
In ra voi tham so kieu nguyen : 65 
[>printf(`In ra voi tham so kieu ki tu : %c`,s); 
In ra voi tham so kieu ki tu : A 
Nhận xét: Nh− vậy trong lập trình ta phải thận trọng với format kiểu, bởi vì cùng 
một biến nếu format khác nhau cho ta kết quả khác nhau. Một format khác với 
tham số %nt với n là độ rộng của kết quả in ra, t là kiểu format. 
[>printf(`%s %25s %10s\n`,M,Map,MapleV); 
M Map MapleV 
Lệnh lprint() 
Cú pháp 
Khai báo: 
lprint(bt1, bt2,...) 
Tham số: 
 bt1, bt2,... là các biểu thức cần in ra. 
Mô tả 
lprint hiển thị kết quả của phép toán d−ới dạng lệnh vào của Maple và kết quả đó 
nằm ngay bên trái màn hình. Lệnh này khác với print ở chỗ print căn lề giữa và 
kết quả hiển thị ở dạng viết (format). lprint trả lại NULL sau khi in xong và kết 
quả in ra ở dạng nhập (ch−a format). Mỗi biểu thức đ−ợc in ra cách nhau 3 ô trống 
và trên cùng một dòng. Chính vì sau khi in xong trả NULL nên lprint không thể 
dùng " hoặc " để gọi lại biểu thức vừa in ra giống nh− print. 
Minh hoạ 
[>lprint(3*x^2,x,t); 
3*x^2 x t 
[>print(3*x^2,x,t); 
, ,3 x2 x t 
[>g := (x^4 - y)/(y^2-3*x); lprint(g); 
 := g − x
4 y
 − y2 3 x 
(x^4-y)/(y^2-3*x) 
[>%; 
184 
 − x4 y
 − y2 3 x 
[>f:=sin(x); 
:= f ( )sin x 
[>print(f); 
( )sin x 
[>lprint(f); 
sin(x) 
4.4.4. Ví dụ về thao tác trên tệp 
[>fremove(`test.txt`); 
Error, (in fremove) file I/O error 
[>restart; 
[>append_file:=proc(filename,text) 
local f; 
f:=fopen(filename,APPEND,BINARY); 
fprintf(f,text); 
fclose(f); 
end: 
[>append_file(`c:/temp/try.txt`,`chao ban\n`); 
[>read_file(`c:/temp/try.txt`); 
( )read_file c:/temp/try.txt 
[>read_file:=proc(filename) 
local f,line; 
f:=fopen(filename,READ,BINARY); 
line:=readline(f); 
while line0 do 
print(line); 
line:=readline(f); 
od; 
fclose(f); 
end: 
[>read_file(`c:/temp/try.txt`); 
chao ban 
chao ban 
[>fremove(`c:/temp/try.txt`); 

File đính kèm:

  • pdfgiao_trinh_maple_chuong_4_lap_trinh_tren_maple.pdf