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.
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 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:
- giao_trinh_maple_chuong_4_lap_trinh_tren_maple.pdf