Các hàm và thủ tục trong Pascal
Bài 1:
Các hàm và thủ tục trong Pascal
Yêu cầu: Dùng các phím F1, Alt F1, Ctrl + F1 xem cấu trúc và các thông số
đầu vào của từng lệnh trong Pascal và ghi vào dòng phía dưới của các câu
lệnh.
Ví dụ:
- Window Tạo một cửa sổ màn hình mới
) Procedure Window (X1,Y1,X2,Y2:Byte);
Bạn có thể Copy các ví dụ của Pascal và thử chạy nó để hiểu rõ hơn về cách
sử dụng của các hàm và các thủ tục.
I. Một số Unit hay dùng trong Pascal for DOS
Khi sử dụng một Unit nào đó bạn cần phải khai báo tên Unit sau từ khoá uses. Các
Unit có thể đã được Pascal tạo trước đó hoặc do chính bạn định nghĩa.
g; vitri:integer; Sotu:Integer):String; Hàm Copy cho một chuỗi ký tự con của chuỗi st. chuỗi này được lấy từ vitri với Sotu. Ví dụ: St:=’Turbo Pascal’; st1:=Copy(st,7,6); khi đó st1 có giá trị Pascal; + Xoá một chuỗi trong một chuỗi: Hàm Delete(Var St:string;Vitri,sotu:integer); Xoá khỏi chuỗi st sotu trừ vitri còn lại sẽ gắn trở lại chuỗi cho biến St; Ví dụ: St:=Turbo Pascal; Delete(st,7,6); Writeln(st); {câu lệnh này hiện nội dungTurbo} + Chèn chuỗi con vào trong chuỗi: Thủ tục: insert(chuoicon:String; Var st:string; Vitri:integer); Chèn Chuoicon vào chuỗi st bắt đầu từ Vitri. Ví dụ: St:=Tin hoc tre; Chuoicon:=’ECS ‘; insert(Chuoicon,st,1); Writeln(st); {nội dung của st là ECS Tin hoc tre} * Chuyển đổi giữa số và chuỗi: + Ðổi một số thành chuỗi hàm Str Vietebooks Nguyễn Hoàng Cương Trang 18 + Ðổi một chuỗi thành số: hàm Val c. Các giải thuật cơ bản trên dữ liệu kiểu String: ( Ðổi chuỗi ký tự sang ký tự in Var i:byte st:string; đoạn chương trình: For i:=1 to length(st) do St[i]:=Upcase(st[i]); ( Cắt ký tự trắng bên trái chuỗi ký tự: Ví dụ chuối Turbo Pascal có một số ký tự trắng bên trái bạn có thể xoá nó để đưa về chuỗi Turbo Pascal bạn bắt đầu tìm từ vị trí đầu tiên của chuỗi, kiểm tra xem có phải là một ký tự trắng hay không nếu đúng xác định vị trí và xoá ký tự trắng đó khỏi dãy. Var i:byte; st:string; Ðoạn chương trình: i:=1; While st[i]=#32 do inc(i); {#32 là ký tự trắng } Delete(st,1,i-1); ( Cắt ký tự trắng bên phải: Bạn dùng vòng While ... do với điều kiện còn tìm thấy ký tự trắng nhưng bắt đầu từ vị trí cuối cùng ngược tới vị trí đầu. Var i:byte; st:string; Ðoạn chương trình: i:=length(st); while st[i]=#32 then dec(i); st[0]:=Chr(i) ( Cắt các khoảng trắng ở giữa chuỗi: Var i:byte; st:string; đoạn chương trình: i:=pos(#32#32,st); while i0 do begin Delete(st,i,1); i:=Pos(#32#32,st); end; 2. Sử dụng dữ liệu kiểu array: Array là một kiểu dữ liệu có cấu trúc bao gồm một số cố định các thành phần có cùng kiểu dữ liệu. Mỗi thành phần của array được truy xuất thông qua các chỉ số môt tả vị trí thành phần đó trong array. a. Khai báo kiểu: Cú pháp: Type = array[chỉ số] of ; Ví dụ: Type Tocdo=array[Oto, Tai, Buyt, Dulich] of Integer; Hoten=array[1..30] of String; Loai = array['A'..'Z'] of Byte; OrdType=Array[Char] of Byte; AsciiType=Array[Byte] of Char; Vietebooks Nguyễn Hoàng Cương Trang 19 b. Khai báo biến: Cú pháp: Var :ARRAY[Chỉ số] of ; Ví dụ: Var Diem:array[1..30] of Byte; Type Xe=(Oto, Tai, Buyt, Dulich); Tocdo=Array[Xe] of Integer; ý nghĩa: Bạn có thể tưởng tượng một biến như một hộp để chứa dữ liệu và Array là một tập hợp nối tiếp các hộp lại với nhau để chứa dữ liệu có cùng kiểu, mỗi hộp được đánh số thứ tự bằng chỉ số đã khai báo và dãy hộp được đặt chung bằng một tên đó là tên của biến kiểu Array. Ghi chú: Ðể khai báo Array nhiều chiều bạn theo cú pháp sau: Var :Array[Chỉ số1, chỉ số 2,...] of ; Ví dụ:Manhinh: Array[1..25,1..80.0..15] of Integer; c. Truy xuất dữ liệu kiểu Array: ( Xuất dữ liệu kiểu Array: Các thủ tục xuất nhập biến như Writeln, Readln không thể truy xuất thẳng biến Array mà phải thông qua từng thành phần của Array đó. Ví dụ: Var a,b:Array[1..100] of String[30]; c:Array[1..30,1..4] of String; Bạn không thể viết: Write(a); Readln(b); Readln(c); Mà bạn phải viết: Write(a[1]); Write(a[2]); ......... Write(a[100]); Readln(C[1]); .......... Array thường kèm theo biến đếm có cùng kiểu với chỉ số của Array, thay đổi biến đếm của vòng lặp bạn sẽ lần lượt truy xuất hết các thành phần của Array như sau: For i:= to do Begin Readln([i]); Writeln([i]); End; Ví dụ: Var Hoten:Array[1..100] of String; i:Byte; Begin For i:=1 to 100 do Begin Write('Nhap ho ten: ');Readln(Hoten[i]); End; End. ( Gán dữ liệu kiểu Array: Bạn có thể gán nội dung của hai biến Array cùng kiểu Ví dụ: Var a,b:Array[1..10] of Integer; Vietebooks Nguyễn Hoàng Cương Trang 20 i:Byte; Begin For i:=1 to 10 do Readln(a[i]); b:=a; For i:=1 to 10 do Writeln(b[i]); Readln; End. d. Sắp xếp dữ liệu trên dãy: Sắp xếp là một quá trình tổ chức lại một dãy các dữ liệu theo một trật tự nhất định. Mục đích của việc sắp xếp là giúp cho việc tìm kiếm dữ liệu trong một dãy được dễ dàng hơn. Nguyễn lý chung của sắp xếp là So sánh và hoán vị. Sắp xếp bằng phương pháp chọn lựa đơn giản bắt đầu từ thành phần đầu tiên của dãy so sánh với các thành phần đó với nhau. Tiếp tục đến thành phần kế tiếp so sánh với các thành phần còn lại cho tới khi gặp thành phần cuối cùng. Vì sau thành phần cuối cùng không còn thành phần nào nữa để so sánh nên việc sắp sếp đã hoàn tất. Với phương pháp này hình thành hai vòng lặp. Vòng lặp thứ nhất lấy thành phần thứ i từ 1 tới N-1 so sánh và hoán vị với vòng lặp thứ 2 với j từ i+1 tới N Giải thuật: Cho i từ 1 đến n-1 thực hiện Cho J từ i+1 đến n thực hiện Nếu thành phần tứ i nhỏ hơn thành phần thứ j thì Hoán vị hai thành phần thứ i và thứ j. Ví dụ: var i,j:Byte; Trunggian:Real; Begin For i:=1 to n -1 do For j:=i+1 to n do if A[j]<A[i] then {Thực hiện việc so sánh} Begin Trunggian:=A[j]; {Thực hiện việc hoán vị nếu sanh sánh} A[j]:=A[i]; {bằng True} A[i]:=Trunggian; End; End; 3. Dữ liệu kiểu File: Các dữ liệu đã khảo sát ở trên đề thực hiện trong bộ nhớ RAM khi khởi động chương trình, khi chấm dứt chương trình các dữ liệu trên bị mất vì vậy việc lưu trữ dữ liệu lâu dài hoặc sử dụng lại dữ liệu đó bạn cần sử dụng dữ liệu kiểu File. Có 2 loại dữ liệu kiểu File: - File có kiểu: Dữ liệu được lưu trữ trên đĩa thành một tập tin chứa các Record và được ghi dưới dạng nhị phân - File dạng Text: Dữ liệu được lưu trữ trên đĩa thành một tập tin chứa các dữ liệu dưới dạng mã ASCII. Bằng các phần mềm soạn thảo văn bản có thể đọc được dữ liệu này. a. Khai báo dữ liệu kiểu File: Với dữ liệu File có kiểu: Var :File of Vietebooks Nguyễn Hoàng Cương Trang 21 Ví dụ: Var f:File of Byte; S:File of String; Type Hosocanbo=Record Hoten:String; Diachi:String; End; Var F:File of Hosocanbo; Với File dạng Text Var :Text; Khi khai báo tập tin kiểu Text dữ liệu ghi vào đĩa dạng File ASCII như là một tập tin văn bản b. Các thủ tục chuẩn trên dữ liệu kiểu File: ( Gán tên tập tin cho một biến: Thủ tục Assign(Var ,:String); Thủ tục này nhằm mục đích gán một tập tin trên đĩa cho Tên biến File trong RAM. Ví dụ: Var F:Text; Begin .... Assign(f,'Chaoban.txt'); .... End; ( Mở và tạo mới một tập tin: Thủ tục: Rewrite(Var ); (Ví dụ: Rewrite(f);) Thủ tục này tạo một tập tin trên đĩa có tên đã gán cho Tên biến File bằng lệnh gán Asign đồng thời mở tập tin đó ra để truy xuất dữ liệu. Chú ý: Khi mở tập tin bằng lệnh Rewrite nếu trên đĩa đã có tập tin trùng với tên bạn đặt thì tập tin trên đĩa sẽ bị xoá thay vào đó là một tập tin trống mà bạn đã gán tên cho Tên biến File. Nên bạn cần cẩn thận khi mở tập tin bằng lệnh Rewrite. ( Mở một tập tin đã có: Thủ tục: Reset(Var ); Mở một tập tin đã gán cho Tên biến File, nạp nội dung của tập tin này vào trong Tên biến File trong RAM để chuẩn bị cho việc truy xuất dữ liệu. Chú ý: Khi mở một tập tin bằng lệnh Reset nếu tập tin không có trên đĩa sẽ gây lỗi. ( Ðóng một tập tin đã mở: Thủ tục: Close(Var ); Thủ tục này chuyển nội dung trong bộ nhớ vào tập tin trên đĩa đồng thời đóng tập tin lại giải toả bộ nhớ dành cho biến tập tin Chú ý : Các tập tin khi đã mở nếu không đóng lại sẽ mất các dữ liệu truy xuất trên Tên biến File. ( Truy xuất dữ liệu: Việc xuất nhập dữ liệu trên biến File có kiểu chỉ được thực hiện thông qua từng Record - Ðọc dữ liệu từ tập tin dùng thủ tục Read(,); - Ghi dữ liệu vào đĩa: dùng thủ tục Write(,); Vietebooks Nguyễn Hoàng Cương Trang 22 Chú ý: Không dùng các thủ tục Readln, Writeln vì sau khi đọc, ghi xong một Record con trỏ sẽ tự động nhẩy sang Record tiếp theo. c. File văn bản: Ðể đọc dữ liệu trên File văn bản (Text File) bạn dùng các thrủ tục sau: - Read(Var f:Text;GT1,GT2...); - Readln(Var f:Text; v1,v2,...); Ðọc dữ liệu trên một dòng và gán cho một hay nhiều biến. * các hàm tiện ích trên kiểu Text File: - Eoln(Var f:Text):Boolean; Cho biết tình trạng hiện thời của con trỏ trên dòng đang truy xuất đã hết dòng hay chưa, nếu đã hết dòng hàm Eoln cho giá trị True. - Eof(Var F:text):Boolean; Cho biết con trỏ hiện thời đã đến cuối tập tin hay chưa, nếu đã ở cuối tập tin hàm Eof sẽ trả về giá trị True. * Một số ví dụ: ( Hiện toàn bộ nội dung File lên màn hình: Var f:Text; ch:Char; Begin {Tên tập tin gõ vào từ dòng lệnh} if Paramcount=1 then Begin Assign(f,ParamStr(1)); Reset(f); While not Eof(f) do Begin Read(f,Ch); Write(ch); {Xuất dữ liệu ra màn hình} End; End; End. ( Ðọc nội dung một File hiện ra màn hình dùng biến Line kiểu String để đọc từng dòng: Var f:Text; Line:String; Begin {Tên tập tin gõ vào từ dòng lệnh} if Paramcount=1 then Begin Assign(f,ParamStr(1)); Reset(f); Repeat Readln(f,Line); Writeln(Line); {Xuất dữ liệu ra màn hình} Until Eof(f); End; End. ( Bạn có thể tạo một chương trình phát nhạc từ một File nhạc tạo ra theo cấu truc Cao độ, trường độ theo từng dòng? Ví du: {----Lambada.Not----} Vietebooks Nguyễn Hoàng Cương Trang 23 1318 60 1174 20 1046 20 988 20 .... Trong đó số đầu chỉ cao độ, số sau chỉ trường độ. Program Lambada; Uses Ctr; Const Dieuchinh=10; Var f:Text; Caodo,Truongdo:Word; Begin Assign(f,'Lambada.not'); Reset(f); While (not Eof(f)) and (not Keypressed) do Begin Readln(f,Caodo,truongdo); Sound(Caodo); Delay(Dieuchinh*Truongdo); Nosound; End; Close(f); Nosound; End.
File đính kèm:
- cac-ham-va-thu-tuc-trong-pascal.pdf