Tin học xây dựng - Phần III: Ngôn ngữ lập trình pascal - 2

pdf 20 trang vanle 4020
Bạn đang xem tài liệu "Tin học xây dựng - Phần III: Ngôn ngữ lập trình pascal - 2", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdftin_hoc_xay_dung_phan_iii_ngon_ngu_lap_trinh_pascal_2.pdf

Nội dung text: Tin học xây dựng - Phần III: Ngôn ngữ lập trình pascal - 2

  1. TRƯỜNG ĐẠI HỌC XÂY DỰNG KHOA CÔNG NGHỆ THÔNG TIN    GIÁO TRÌNH MÔN HỌC: NHẬP MÔN TIN HỌC PHẦN III – NGÔN NGỮ LẬP TRÌNH PASCAL -2 Giảng viên: ĐÀO TĂNG KIỆM Bộ môn : TIN HỌC XÂY DỰNG Hà nội 2012
  2. Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm Chương 4 CHƯƠNG TRÌNH CON I. Khái niệm chung – đặc điểm 1. Khái niệm chung: Ở những chương trước chúng ta mới làm quen với cấu trúc của chương trình chính, trong đó để giải quyết một hoặc nhiều vấn đề, tất cả các lệnh đều nằm trong một chương trình và thực hiện các lệnh từ trên xuống dưới. Với những bài toán lớn, theo cấu trúc này chương trình chính rất dài, cồng kềnh, khó kiểm soát và không thể phân chia cho nhiều nhóm thực hiện đồng thời một lúc. Từ đó hình thành ý tưởng xây dựng chương trình con là một mô đun độc lập, kết nối với chương trình chính và các chương trình con khác qua “đầu vào” và “đầu ra”, chia nhỏ chức năng và cấu trúc chương trình chính thành nhiều mô đun nhỏ, trong đó chương trình chính là chương trình điều khiển quá trình tính toán của chương trình con. Trong những năm đầu khi bắt đầu xuất hiện ngôn ngữ lập trình, người ta chưa thiết lập được cấu trúc Chương trình con. Trong quá trình phát triển các ngôn ngữ đã có, cùng với nhu cầu của người sử dụng, những tiện lợi mà chương trình con mang lại, sự phát triển các ngôn ngữ đã có và khi xây dựng ngôn ngữ lạp trình mới đều hướng đến việc tổ chức chương trình con. Ưu điểm khi sử dụng cấu trúc chương trình con: - Cấu trúc chương trình chính trở nên gọn, mạch lạc, dễ hiểu. - Không lặp lại các phần tương tự. - Vì là một mô đun độc lập, chương trình con có thể sử dụng nhiều lần trong một chương trình hoặc ở các chương trình khác nhau. - Dễ kiểm tra, theo dõi trong quá trình thử nghiệm. 2. Đặc điểm của Chương trình con: - Là một đơn vị chương trình độc lập, hoàn chỉnh, cũng bao gồm 3 phần: tên chương trình, phần khai báo và phần thân. Chương trình con có thể giải quyết một vấn đề trọn vẹn và được sử dụng nhiều lần qua lời gọi nó trong chương trình chính. - Toàn bộ các Chương trình con đặt ở cuối phần khai báo trong chương trình chính. - Các biến trong chương trình con chỉ có tính chất cục bộ (chỉ có tác dụng trong bản thân chương trình đó). Trong chương trình con có thể sử dụng tất cả các lệnh như chương trình chính. - Thứ tự khai báo các chương trình con không quan trọng nếu các chương trình độc lập với nhau. Khi các chương trình con gọi đến nhau thì phải xếp theo một trật tự nào đó nếu. Ví dụ chương trình con A gọi đến chương trình con B thì B phải khai báo trước A. - Trong Pascal có 2 loại chương trình con: chương trình con dạng hàm (Function) và chương trình con dạng thủ tục (Procedurre). - Chương trình con chỉ được tham chiếu đến nếu nó được gọi từ chương trình chính. Bộ môn Tin học Xây dựng 2
  3. Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm - Mỗi lần gặp lời gọi chương trình con, chương trình chính chuyển đến chương trình con và thực hiện chúng, sau khi thực hiện, nó quay trở về chương trình chính thực hiện câu lệnh ngay sau lời gọi chương trình con. Minh họa cấu trúc của chương trình chính và chương trình con: Cấu trúc chương trình Chú thích Program Tên_chương_trình_chính; Các khai Lebel – Const- Type báo chung Var (Khai báo Các biến chung ) của CT chính Function Tên_hàm ( Danh_sách_tham_số_hình thức) : kiểu_hàm ; { Phần khai báo các biến cục bộ của hàm} Phần khai báo của chương Begin Khai báo trình chính các Các câu lệnh của chương trình con ạng hàm Chương End; trình con Procedure Tên_Thủ_tục (Dsach_Tham_số_hình_thức); - Nội dung { Phần khai báo các biến cục bộ của thủ tục} các Begin chương Các câu lệnh của chương trình con thủ tục; trình con End; BEGIN Các lệnh ; Phần thân của Lời gọi chương trình con; chương trình chính END. II. Thủ tục và hàm – cách khai báo 1. Hàm – Function: Chương trình con dạng hàm dùng để tính cho các hàm hoặc xử lý cho những bài toán chỉ tính và xuất một kết quả. Đặc điểm của chương trình con dạng hàm: - Tên chương trình con là tên biến chứa kết quả. - Dùng cho các bài toán chỉ tính 1 kết quả - Trong phần thân của chương trình con phải có một phép gán có chứa tên của CTC. - Lời gọi chương trình con hàm phải nằm trong thành phần của biểu thức hoặc phép gán và kết quả của chương trình con được lấy ra từ đó. Cấu trúc chương trình con dạng hàm: Function Tên_hàm ( Danh_sách_tham_số_hình thức) : kiểu_hàm ; { Phần khai báo các biến cục bộ của hàm} Begin Bộ môn Tin học Xây dựng 3
  4. Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm Các câu lệnh; Tên_hàm:= Biểu_Thức . . . . End; Ví dụ: Để tính các hàm: F1 = a.x + 5b. x2 – (a+b). xy F2 = (7.a-c).x + b2. x2 + (a-b). xy F3 = c.x + (a+c). x2 – (a2+b2). xy F4 = (a/2).x + 5b. x2 – 120.b. xy - Chúng ta nhận thấy các hàm có 1 cấu trúc giống nhau có thể tổng quát hóa qua công thức : F= a1.x + a2. x2 +a3. xy Trong đó a1, a2, a3 có các giá trị khác nhau trong các hàm F1, F4. Chúng ta thiết lập một chương trình con dạng Function để tính cho một hàm “đại diện”, và sau đó gọi chúng ra tính cho các hàm F1 F4 như sau: - Chương tình con tính cho một hàm F bất kỳ: Nội dung Giải thích Function F ( a1, a2, a3 : real) : real; a1,a2, Ten : các tham số hình thức Var x,y : real ; Khai báo 2 biến x,y lấy tên trùng với tên trong CT chính Begin F := a1* + a2* x2 +a3* x*y ; Thân của chương trình con, tính cho hàm F bất kỳ và sau Writeln ( ‘ Gia tri cua ham ’); đó in kết quả End; - Để tính toán cho các hàm F1, F4 ta viết đoạn chương trình chính sau: Program Tinh_ham; Chương trình chính Var a,b,c, F1,F2,F3,F4,x,y : real ; Khai báo các tham số thực sự BEGIN Writeln (‘ Nhap du lieu ’); Nhập dữ liệu cho chương trình Write ( ‘ Nhap cac gia tri a,b,c ’); Readln ( a,b,c); chính Write ( ‘ Nhap cac gia tri x,y ’); Readln ( x,y); Writeln (‘ KET QUA ’); Gọi 4 lần CTcon tính hàm, F1:= F ( a, 5*b, - (a+b) ) ; Writeln (’F1= ’ , F1:8:2 ); mỗi lời gọi tính cho một hàm, ví dụ để tính F1 thay các tham F2:= F ( 7*a-c , sqr(b), (a-b) ) ; Writeln (’F2= ’, F2:8:2 ); số hình thức bằng các tham số F3:= F ( c, (a+c), - (a*a+b*b)) ; Writeln (’F3= ’ , F3:8:2 ); thực sự như sau: a1= a; F4:= F ( a/2, 5*b, - 120*b ) ; Writeln (’F4= ’ , F4:8:2 ); a2=5*b ;a3=a+b; Readln ; END. Bộ môn Tin học Xây dựng 4
  5. Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm 2. Thủ tục - Procedure: Đặc điểm của thủ tục: có thể dùng để tính cho bài toán bất kỳ. - Tên của chương trình con là một tên bất kỳ, theo cách đặt tên của Pascal. - Thủ tục có thể tính và xuất cho nhiều kết quả. Cấu trúc chương trình con dạng thủ tục: Procedure Tên_thủ_tục ( Danh_sách_tham_số_hình thức) ; { Phần khai báo các biến cục bộ của thủ tục} Begin Các câu lệnh; . . . . End; Ví dụ: Viết chương trình con nhập dữ liệu cho ma trận X bất kỳ có kích thước m hàng, n cột. Procedure Nhap_ma_tran ( Var m,n: integer; Var X :MT) ; Var i,j :integer; Begin Write (' m, n = '); Readln (n,m); for i:=1 to m do for j:=1 to n do begin write (' X[', i, ',' , j ,']= ' ); readln (X [i,j]); end End; Chú ý: trong tham số hình thức đối với mảng, không được khai báo trực tiếp, do vậy, để khai báo cho X, trong chương trình chính phải mô tả trước kiểu, dùng lệnh Type ví dụ: Type MT=array[1 15,1 15] of real; (Tham khảo thêm ví dụ của chương trình con trong các ví dụ tổng hợp ở phần sau). 3. Biến toàn cục và biến cục bộ: Biến toàn cục (tổng thể) là các biến của chương trình chính, các biến thực sự của chương trình và chỉ được đặt trong phần khai báo của chương trình chính. Biến cục bộ (đại phương) là các biến của chương trình con, nó chỉ có tác dụng trong chương trình con. Biến cục bộ cũng có thể dùng chung với biến toàn cục. Khai báo biến cục bộ, có thể qua một trong số các vị trí trong chương trình: - Đặt trong phần khai báo của chương trình con - Khai báo qua các tham số hình thức - Dùng chung với các biến toàn cục (tên phải giống nhau ở CT chính và CT con) III. Tham số 1. Tham số hình thức: Chương trình con có thể có tham số hoặc không có tham số. Việc truyền tham số là cách kiểm soát các dữ liệu vào/ ra chương trình con, dễ dàng điều khiển các biến nằm ngoài và các trị liên quan đến chứng trong chương trình con. Bộ môn Tin học Xây dựng 5
  6. Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm Khi sử dụng và tạo ra tham số chúng ta cần phải xác định: - Các dữ liệu nào từ bên ngoài cần truyền đến chương trình con hoặc các dữ liệu mà chương trình con sau khi tính toán cần lấy ra sử dụng tiếp. - Đặt tên cho tham số - Những dữ liệu nào sẽ bị chương trình con thay đổi - Loại tham số trong danh sách (tham trị hay tham biến) Tham số hình thức là các tham số được khai báo ngay sau tên của hàm và thủ tục, đặt trong cặp ngoặc tròn. Nó là các tên giả định đại diện cho các đại lượng nào đó của các biến/trị đưa vào hoặc các trị cần đưa ra trong chương trình, nó là các biến cục bộ của CT Con. Danh sách tham số hình thức là tập hợp của nhiều nhóm, mỗi nhóm phải cùng loại và kiểu, các nhóm ngăn cách nhau bởi dấu chấm phẩy; còn trong một nhóm có thể có nhiều tên ngăn cách nhau bằng dấu phẩy. Dạng : (Nhóm 1 :kiểu; Nhóm 2: kiểu ); Ví dụ: Procedure Tong_MT ( m,n: interger; A,B: VT2; var C: VT2); Trong ví dụ trên, danh sách tham số hình thức có 3 nhóm, nhóm 1 và 2 là tham trị, nhóm 3 là tham biến. Nhóm 1 có kiểu nguyên, nhóm 2 và nhóm 3 có kiểu VT2, là một kiểu loại mảng đã khai báo trước đó. Trong danh sách tham số hình thức chỉ có 2 loại : Tham biến và tham trị. Tham biến: là các tên trong phần khai báo của tham số hình thức có chữ Var ở trước, đó là các tham số truyền theo kiểu biến. Với kiểu truyền này, địa chỉ chứa các biến trước khi truyền vào CTCon và sau khi ra khỏi CTCon chung một vùng, do vậy nếu trong chương trình con làm thay đổi giá trị của nó thì ra khỏi CTC nó vẫn giữ nguyên giá trị đã bị thay đổi. Thông thường, tham biến dùng khai báo cho các dữ liệu cần chương trình con thay đổi và giữ lại sự thay đổi đó, ví dụ các dữ liệu, kết quả cần tính toán. Sử dụng tham biến sẽ tiết kiệm bộ nhớ. Tham trị: là các tên trong phần khai báo của tham số hình thức không có chữ Var ở trước. Với tham trị, Pascal sử dụng 2 ô nhớ, một ô nhớ để chứa giá trị của biến trước khi truyền vào chương trình con và một ô nhớ chứa bản sao của tham trị dùng để tính toán trong chương trình con, do vậy các tác động trong chương trình con đến tham trị chỉ có tác dụng trong nội bộ CTCon. Khi kết thúc và ra khỏi chượng trình con, giá trị của tham trị sẽ lấy theo giá trị ban đầu, trước khi truyền vào CTCon nên giá trị của nó không bị thay đổi. Do vậy tham trị thường dùng để khai báo cho các dữ liệu cần truyền vào chương trình con mà ra khỏi CTC, các dữ liệu này không được thay đổi. Chú ý: - Trong danh sách tham số hình thức, khi khai báo mảng, tệp phải khai báo gián tiếp. Bộ môn Tin học Xây dựng 6
  7. Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm - Chỉ những dữ liệu cần truyền vào, lấy ra mới đưa vào danh sách, tránh khai báo các biến không cần thiết ( ví dụ các chỉ số, biến đếm, các biến tính toán, xử lý trung gian ). 2. Tham số thực sự và cách truyền tham số: Chương trình con chỉ được thực hiện khi có lời gọi nó từ chương trình chính. Trong lời gọi chương trình con, các tham số thực tế của chương trình thay thế cho danh sách tham số hình thức gọi là Tham số thực sự. Tham số thực sự dùng để truyền dữ liệu vào chương trình con, thay các biến giả định bằng các hằng, biến, hàm hoặc biểu thức đơn giản (tùy thuộc vào nó thay cho tham biến hay tham trị). Tham số thực sự là các đại lượng đã được khai báo trong chương trình chính, các đại lượng dùng thực sự trong chương trình chính. Dạng: ( Danh_sách_tham_số_thực sự); Danh sách tham số thực sự có thể là các hằng, biến, hàm,bản ghi, tệp, biểu thức ngăn cách nhau bằng dấu phẩy. Việc thay thế danh sách này trong tham số thực sự gọi là truyền tham số. Danh sách truyền phải phù hợp với danh sách trong tham số hình thức về số lượng, thứ tự và kiểu. - Với tham trị : có thể truyền theo hằng, biến,biểu thức. - Với tham biến: chỉ truyền dữ liệu theo kiểu biến. - Tên của tham số hình thức và tham số thực sự có thể giống nhau Ví dụ: Tham số hình thức Truyền -Tham số thực sự ( m,n: interger; A,B: VT2; var C: VT2); ( m, n, A, B, C); (10, 5, X, Y, Z) III. Lời gọi chương trình con Chương trình con được dùng (tham chiếu đến) qua lời gọi của chương trình chính tại những chỗ cần thực hiện chương trình con. Số lần gọi là tùy ý, và mỗi lần gọi, danh sách tham số thực sự truyền vào danh sách tham số hình thức có thể khác nhau. Lời gọi CTC là một câu lệnh độc lập. Dạng : Tên_chương trình_con ( Danh_sách_tham_số_thực_sự); Chú ý : Lời gọi hàm có thể đứng độc lập hoặc tham gia trong một vế của biểu thức gán ( lời gọi hàm). Khi gặp lời gọi chương trình con, chương trình chính sẽ chuyển đến thực hiện CTCon, thay tham số thực sự tương ứng với tham số hình thức và thực hiện CTCon, sau khi thực hiện xong, kết quả trả về chương trình chính thông qua các tham số và trở về chương trình chính tại câu lệnh ngay sau lời gọi chương trình con. Ví dụ: Minh họa cho tham biến, tham trị và thực hiện lời gọi chương trình con Program Tham_bien; Var X,Y : integer ; { Chương trinh con} Bộ môn Tin học Xây dựng 7
  8. Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm Procedure Cong ( Var A,B : integer); Begin A:= A+1 ; B:= B+ 2 ; Writeln ( ‘ Gia tri cua X, Y trong chương trinh con : ’ , A,B ); End; BEGIN { Chuong trinh chinh } X:=1 ; Y :=1 ; Writeln ( ‘ Gia tri cua X,Y truoc khi goi chuong trinh con ’, X, Y ); Cong (X,Y) ; Writeln ( ‘ Gia tri cua X,Ysau khi goi chuong trinh con ’, X, Y ); Readln END. Program Tham_tri; Var X,Y : integer ; { Chương trinh con} Procedure Cong ( A,B : integer); Begin A:= A+1 ; B:= B+ 2 ; Writeln ( ‘ Gia tri cua X, Y trong chương trinh con : ’ , A,B ); End; BEGIN { Chuong trinh chinh } X:=1 ; Y :=1 ; Writeln ( ’ Gia tri cua X,Y truoc khi goi chuong trinh con ’, X, Y ); Cong (X,Y) ; Writeln (’ Gia tri cua X,Ysau khi goi chuong trinh con ’, X, Y ); Readln END. Nội dung của 2 chương trình trên hoàn toàn giống nhau cả chương trình chính và chương trình con, sự khác nhau duy nhất là hai tham số hình thức A,B mà sau này được truyền vào bằng X,Y, ở chương trình con 1 khai báo dạng tham biến, còn ở chương trình con 2 khai báo là tham trị. Kết quả sau khi chạy 2 chương trình trên: Chương trình Tham biến Chương trình Tham trị Gia tri cua X,Y truoc khi goi chuong trinh con 1 1 1 1 Gia tri cua X,Y trong chuong trinh con 2 3 2 3 Gia tri cua X,Y truoc khi goi chuong trinh con 2 3 1 1 Từ đó có thể thấy việc khai báo tham biến hay tham trị là rất quan trọng và ảnh hưởng đến kết quả tính toán. Bộ môn Tin học Xây dựng 8
  9. Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm Sơ đồ điều khiển giữa chương trình chính và chương trình con Cấu trúc chương trình Điều khiển Giải thích Program Chuong_trinh_chinh; Chương trình chính . Phần khai báo chương trình chính Procudere CTC1 ( Danh_sach); . . . . thực hiện Khai báo- Toàn bộ CT con 1 End; Procedure CTC2 (Danh_sach); thực hiện Khai báo- Toàn bộ CT con 2 End; BEGIN Phần thân Chương trình chính Lời gọi chương trình con 1 CTC1 ( Tham_so_thuc_su); CTC2 (Tham_so_thuc_su); Lời gọi chương trình con 2 . 3. Các bài tập áp dụng: Bài 1: Cho 2 véc tơ A, B có m phần tử. Viết chương trình con tính các véc tơ C= A+B; D=A+C; E= B+D , trong đó viết 2 chương trình con, một chương trình con nhập dữ liệu cho một véc tơ và một chương trình con tính tổng 2 véc tơ. Bài 2: Cho một ma trận A vuông (mảng 2 chiều) có m hàng, n cột. - Tính trung bình cộng từng hàng của ma trận. - Tìm giá trị lớn nhất của từng cột của ma trận. trong đó viết 3 chương trình con, một chương trình con nhập dữ liệu cho ma trận, một chương trình con tính tổng từng hàng của ma trận và chương trình con tính giá trị lớn nhất từng cột của ma trận. Bài 3: Cho dữ liệu của một phường dân cư có m người. Biết các thông tin Tên chủ hộ, Địa chỉ, Tổng số điện tiêu thụ mỗi tháng của mỗi nhà trong 12 tháng. - Nhập các thông tin của từng hộ - Tính tổng số điện tiêu thụ trong cả năm của mỗi nhà - Tính tiền điện của từng hộ trong cả năm theo lũy tiến như sau: Tổng số điện cả năm 150 số : 5000đ/ số - Tính số lượng những hộ phải trả tiền điện trong cả năm > X đồng Viết 2 chương trình con: một chương trình con nhập dữ liệu và một chương trình con tính tiền điện cho từng hộ. Chương 5 TỆP VĂN BẢN Bộ môn Tin học Xây dựng 9
  10. Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm I. Khái niệm về tệp (File) 1. Lý do dùng tệp Trong quá trình tạo lập biến và các dữ liệu đưa vào theo danh sách biến cũng như quá trình lưu trữ các kết quả tính được trong chương trình Pascal ở các chương trước gặp nhiều tổn thất, đó là khi mất điện hoặc tắt máy, chuyển chương trình các dữ liệu đã nhập và kết quả đang hiện trên màn hình sẽ mất hết. Bên cạnh đó khi làm các bài toán lớn, khối lượng dữ liệu nhiều, quá trình nhập dữ liệu mất nhiều thời gian và dữ liệu cần lưu lại hoặc có thể sử dụng cho những mục đích khác thì cách nhập-xuất trực tiếp không hiệu quả. Vấn đề là cần một phương pháp để lưu trữ các dữ liệu đã nhập và có thể thêm – xóa - sửa chúng một cách dễ dàng, đó là mục đích sử dụng cấu trúc tệp dữu liệu. 2. Cấu trúc tệp: Tệp là một kiểu dữ liệu có cấu trúc, tập hợp các dữ liệu có liên quan đến nhau được chứa trong một thiết bị nhớ ngoài (băng, đĩa, ) với một tên nào đó, do vậy dữ liệu trong tệp được lưu trữ và sử dụng nhiều lần. Khác với các tệp chương trình, tệp văn bản, tệp dữ liệu trong Pascal có thể tạo ra từ các câu lệnh của chương trình Pascal hoặc từ một phần mềm soạn thảo văn bản. Tệp dữ liệu là một tập hợp các loại dữ liệu dưới dạng Văn bản hoặc Bản ghi và được tổ chức theo một cách nào đó, được đặt một tên và lưu trong đĩa. Việc tổ chức và sử dụng tệp được gắn bó với nhau và gọi chung là phương pháp truy nhập tệp. Có 2 phương pháp truy nhập là truy nhập tuần tự và truy nhập trực tiếp. Truy nhập tuần tự là tệp được tổ chức để nhập dữ liệu vào và lấy ra một cách tuần tự, từ đầu đến cuối tệp hoặc từ bản ghi đầu đến bản ghi cuối. Truy nhập trực tiếp hay ngẫu nhiên là tổ chức dữ liệu và nhập – lấy dữ liệu từ tệp theo một địa chỉ bất kỳ (kiểu cấu trúc bản ghi và truy nhập đến địa chỉ của bản ghi). 3. Các loại tệp Có 3 loại tệp : Tệp mã, Tệp văn bản và Tệp không định kiểu. Trong nội dung chương trình, chúng ta chỉ đề cập đến Tệp văn bản. Tệp văn bản là tệp dữ liệu được lưu trữ dưới dạng mã ASCII và xếp theo dòng. Các dòng ngăn cách nhau bằng tín hiệu EOLN (End of line),và đánh dấu ở vị trí cuối tệp là ký hiệu EOF (end of file). Độ dài của các dòng trong tệp có thể thay đổi. Đặc điểm: - Dữ liệu ghi trong tệp dạng ký tự do đó có thể đọc và hiểu được. - Muốn truy nhập tệp văn bản (nhập dữ liệu – lấy dữ liệu) phải tiến hành tuần tự.Ví dụ muốn lấy 1 dữ liệu ở giữa tệp thì cũng phải đọc các dữ liệu từ đầu đến vị trí muốn lấy DL (giữa tệp). - Có thể sử dụng bất cứ phần mềm soạn thảo văn bản nào để soạn nội dung của tệp. - Tệp văn bản đơn giản, dễ tạo và sử dụng. Bộ môn Tin học Xây dựng 10
  11. Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm 4. Tên tệp và biến tệp: Như đã biết, mỗi tệp khi tạo hoặc sử dụng đều có một tên và phải chỉ ra tên trong quá trình truy nhập để chương trình có thể tìm đúng vị trí. Tên tệp là một xâu ký tự có 2 thành phần : đường dẫn và Tên. Trong tất cả các câu lệnh từ tạo tệp, mở tệp, truy nhập tệp đều phải chỉ ra tên tệp mà chúng ta muốn làm việc. Điều này làm cho chương trình rườm rà và khó “tổng quát” trong câu lệnh. Để tránh phiền toái và đơn giản cho câu lệnh, trong Pascal người ta đưa ra khái niệm biến tệp. Biến tệp như một bí danh cho mỗi tên tệp, nó thay cho tên tệp trong các câu lệnh. Bởi vậy, trước khi sử dụng, ta phải gán tên tệp cho biến tệp qua việc sử dụng thủ tục Assign. 5. Các bước làm việc với tệp văn bản: - Khai báo (Tạo (nhập) tên tệp và gán Tên-> biến tệp) - Mở tệp - Truy nhập dữ liệu trong tệp (nhập dữ liệu vào tệp hoặc lấy dữ liệu ra từ tệp) - Đóng tệp II. Khai báo 1. Tạo Tên tệp: tên tệp chứa dữ liệu có thể được đưa vào trực tiếp trong câu lệnh gán cho biến tệp, hoặc đưa vào trong mỗi lần thực hiện chương trình qua lệnh Read qua một biến có kiểu xâu ký tự. Các tên tệp phải khác nhau, nếu trùng tên, khi tạo tệp mới, dữ liệu trong tệp cũ sẽ bị xóa hết. 2. Gán biến tệp cho tên tệp: ASSIGN ( Biến tệp, Tên tệp ); Biến tệp có kiểu text, ngắn, thường sử dụng các ký hiệu f, f1, f2 Tên tệp có thể có dạng hằng xâu kí tự (tên cụ thể) hoặc dạng biến. Ví dụ: - Gán trực tiếp : Assign ( f, ’D:\Bai_tap\ DL1.dat’ ); Theo cách này, tên tệp là hằng xâu sẽ cố định trong các lần thực hiện chương trình hoặc muốn thay tên phải thay trực tiếp trong câu lệnh Assign. - Gán gián tiếp tên qua một biến trung gian: Write ( ’ Hay nhap ten tep chua du lieu’); Readln (Ten_tep); Assign ( f, Ten_tep ); Theo cách này, tên tệp sẽ thay đổi trong mỗi lần thực hiện chương trình, do người sử dụng nhập vào khi gặp lệnh Read. III. Mở tệp Tất cả các tệp trước khi làm việc đều phải dùng thủ tục mở tệp. Trong Pascal mở tệp để tạo tệp mới hay mở tệp để lấy dữ liệu ra từ tệp sẽ dùng các lệnh khác nhau. Các dạng lệnh: Bộ môn Tin học Xây dựng 11
  12. Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm 1. Mở tệp để tạo tệp mới: REWRITE (Biến_tệp); 2. Mở tệp để đưa thêm dữ liệu vào tệp đã có: APPEND (Biến_tệp); 3. Mở tệp để lấy dữ liệu ra từ tệp RESET (Biến_tệp); Chú ý: - Khi gặp lệnh Rewrite chương trình sẽ kiểm tra, nếu tên tệp chưa tồn tại, tệp mới được tạo, nếu tên tệp đã có, chương trình sẽ xóa hết dữ liệu của tệp cũ và thay thế vào đó dữ liệu mới. - Khi gặp lệnh Append và Reset chương trình sẽ kiểm tra tên tệp được gán cho biến tệp, nếu chưa tồn tại, sẽ thông báo: “ File not found”. IV. Đóng tệp Tất cả các tệp sau khi sử dụng: nhập dữ liệu hoặc lấy dữ liệu ra đều phải đóng lại. Cấu trúc của lệnh : CLOSE (Biến_tệp); (Đóng 1 tệp ) hoặc CLOSE (All); (Đóng tất cả các tệp đã mở) Chú ý : Các lệnh gán biến tệp, mở tệp, đóng tệp không được đặt trong các lệnh chu trình. Thông thường, chúng ta nên viết các lệnh này (trừ Close) ở đầu chương trình, trước khi xử lý dữ liệu. V. Nhập dữ liệu vào tệp Để nhập các dữ liệu vào tệp chúng ta sử dụng lệnh Write và có thể kết hợp với các lệnh khác của Pascal. Cấu trúc lệnh: WRITE[LN] ( Biến_tệp, Danh sach biểu thức) ; WRITE[LN] ( Biến_tệp) ; - Cách sử dụng lệnh cũng như lệnh Write thông thường, chỉ khác là có thêm biến tệp để chương trình nhận biết dữ liệu sẽ được ghi vào tệp nào (địa chỉ). - Trước khi nhập dữ liệu vào tệp, thì các dữ liệu này phải đã có ở bộ nhớ trong. - Có thể kết hợp vừa nhập dữ liệu vào máy, vừa cất vào tệp hoặc làm độc lập với nhau. - Lệnh Writeln (f) dùng để in một dòng trống trong tệp hoặc chuyển con trỏ xuống dòng dưới. - Khi cất dữ liệu vào tệp nên dùng cấu trúc có định dạng, như vậy có thể tạo ra các ô trống giữa các giá trị và chúng có thể được Pascal nhận dạng khác nhau. Ví dụ: Nhập các dữ liệu của véc tơ A có n phần tử vào tệp có tên là Bai1.txt đặt tại ổ đĩa D. Assign ( f, ’D:Bai1,txt’); Rewrite ( f ); Writeln ( ’ Nhap cac phan tu cua A vao tep); Bộ môn Tin học Xây dựng 12
  13. Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm Write ( ’ n= ’ ); Readln (n); For i:= 1 to n Do Begin Write ( ‘ A[ ’ , i , ’ ] ’ ); Readln ( A[i] ) {Nhap du lieu vao bo nho trong} Write (f, a[i] :6:1 ); {Nhap du lieu vao tệp} End; Close (f) VI. Lấy dữ liệu ra từ tệp Để lấy các dữ liệu ra từ tệp, chúng ta sử dụng lệnh Read và có thể kết hợp với các lệnh khác của Pascal. Cấu trúc lệnh: READ[LN] ( Biến_tệp, Danh sách biến) ; READ[LN] ( Biến_tệp) ; - Cách sử dụng lệnh cũng như lệnh Read thông thường, chỉ khác là có thêm biến tệp để chương trình nhận biết dữ liệu sẽ được lấy ra từ tệp nào (địa chỉ). - Lệnh Readln (f) dùng để bỏ qua 1 dòng dữ liệu hoặc chuyển con trỏ xuống dòng dưới. - Cách lấy dữ liệu ra từ tệp phải hoàn toàn giống cách tạo ra chúng. - Gặp lệnh Read, chương trình sẽ tuần tự đọc các dữ liệu trong tệp và gán cho các biến tương ứng trong danh sách của lệnh. Các dữ liệu khác nhau trong 1 dòng lệnh của tệp được nhận biết qua ít nhất một ô trống. Các dữ liệu viết liền nhau, chương trình coi như một dữ liệu. - Các giá trị lấy ra từ tệp có thể gán cho các biến bất kỳ, với tên bất kỳ (không nhất thiết cùng tên với các biến đã cất nó vào tệp). Tuy nhiên kiểu và cấu trúc của dữ liệu trong tệp phải khớp với các biến nhận giá trị. Ví dụ: Đọc các dữ liệu của véc tơ A có n phần tử từ tệp có tên là Bai1.txt đặt tại ổ đĩa D. Assign ( f, ’D:Bai1,txt’); Reset ( f ); Writeln ( ’ Lay du lieu tu tep gan cho cac phan tu cua A ’); For i:= 1 to n Do Read (f, a[i] ); Close (f); Ví dụ: Tạo tệp để cất dữ liệu cho ma trận A(mxn) và sau đó mở tệp lấy dữ liệu ra và cất vào ma trận B(m1xn1): Program Tao_Tep_LayDL_tu_tep; Var n,m,i,j:integer; n1, m1:integer; a, b: array[1 10,1 15] of real; f: text; Ttep, ten2: string[20]; BEGIN Write( ' Nhap ten tep cat du lieu '); Readln ( Ttep); Bộ môn Tin học Xây dựng 13
  14. Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm Assign (f, Ttep); Rewrite (f); Write ('Nhap kich thuoc ma tran A n,m=? '); Readln (n,m); Writeln (f, n:5,m:5); for i:=1 to n do for j:=1 to m do begin write ( 'a[',i,',',j,']=?' ); readln ( a[i,j] ) end; { In ma tran A len man hinh va cat vao tep } Writeln; Writeln ( ' Ma tran A truoc khi cat vao tep ' ); for i:=1 to n do begin for j:=1 to m do write ( a[i,j]:10:2 ); writeln; for j:=1 to m do write ( f, a[i,j]:10:2 ); writeln ( f ); end; close ( f ); write (' Nhap ten tep cab lay du lieu' ); Readln ( ten2 ); Assign ( f, ten2); Reset ( f ); Writeln; Writeln ( ' Cac du lieu lay ra tu tep ' ); Readln ( f, n1, m1); writeln; Writeln ( 'n= ',n1:3,' m= ',m1:3); Writeln ( ' Ma tran A sau khi lay tu tep ' ); writeln; for i:=1 to n1 do begin for j:=1 to m1 do read (f, b[i,j] ); readln ( f ); end; close (f) ; { sau khi doc du lieu tu tep In na tran B len man hinh } for i:=1 to n1 do begin for j:=1 to m1 do write ( b[i, j]:10:1 ); writeln; end; readln END. Bộ môn Tin học Xây dựng 14
  15. Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm Chương 6. MỘT SỐ VÍ DỤ TỔNG HỢP Bài 1 : Cho một lớp học sinh, biết mã số SV, tên và điểm thi 3 môn của mỗi sinh viên. Viết chương trình (cấu trúc dữ liệu kiểu bản ghi) tính điểm trung bình của từng người và sắp xếp lại danh sách theo điểm trung bình tăng dần Program Vi_du_Ban_ghi_Sapxep; type sinhvien = record masv:string[10]; tensv: string[30]; dt,dl,dh,dtb:real; end; var temp:sinhvien; sv:array[1 100] of sinhvien; n, i, j: integer; BEGIN {Nhap du lieu n sinh vien} write('Nhap so sinh vien:'); readln(n); for i:=1 to n do begin writeln('Nhap thong tin cua sv thu ' , i); write('Ma sv:'); readln(sv[i].masv); write('Ten sv:'); readln(sv[i].tensv); write('Diem toan:'); readln(sv[i].dt); write('Diem ly:'); readln(sv[i].dl); write('Diem hoa:'); readln(sv[i].dh); sv[i].dtb := (sv[i].dt+sv[i].dl+sv[i].dh)/3; end; {in ra danh sach sinh vien vua nhap} writeln; writeln(' Danh sach sinh vien vua nhap'); writeln(' STT ','Masv':5,'Tensv':10,' DT DL DH DTB'); for i:=1 to n do writeln(i:4, sv[i].masv:5, sv[i].tensv:10, sv[i].dt:6:1, sv[i].dl:6:1, sv[i].dh:6:1, sv[i].dtb:6:1); {sap xep danh sach sinh vien theo diem trung binh tang dan} for i:= 1 to n do for j:=i+1 to n do if (sv[i].dtb >sv[j].dtb) then begin temp:=sv[i]; sv[i]:=sv[j]; sv[j]:=temp; end; Bộ môn Tin học Xây dựng 15
  16. Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm {in ket qua sau danh sach sinh vien sau khi sap xep} writeln; writeln(' Danh sach sinh vien sap theo thu tu dtb tang dan'); writeln(' STT ','Masv':5,'Tensv':10,' DT DL DH DTB'); for i:=1 to n do writeln(i:4, sv[i].masv:5, sv[i].tensv:10, sv[i].dt:6:1, sv[i].dl:6:1, sv[i].dh:6:1, sv[i].dtb:6:1); readln; END. Bài 2 : Cho một véc tơ A có n phần tử,tính tổng các phần tử của mảng, tạo tệp để cất các dữ liệu . Program Mang_1_chieu; var i,n : Byte; A : Array[1 50] of Real; s : Real; tentep: string[10]; f : Text; BEGIN {Nhap mang} Write('n = '); ReadLn(n); For i:=1 To n Do Begin Write('A[',i,']= '); ReadLn(A[i]); End; {Tinh Tong Mang} s:=0; For i:=1 To n Do s:=s+A[i]; WriteLn('s = ',s:7:3); WriteLn; {Ra Mang} WriteLn( ' Mang vua nhap '); For i:=1 To n Do Write(A[i]:7:3); WriteLn( ' Mang vua nhap '); Write('Nhap ten tep cat du lieu'); ReadLn(tentep); Assign(f,tentep); ReWrite(f); WriteLn(f,'s = ',s:7:3); WriteLn(f); {Ra Mang} For i:=1 To n Do Write(f,A[i]:7:3); WriteLn(f); Close(f); Bộ môn Tin học Xây dựng 16
  17. Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm WriteLn('Da xuat xong du lieu ra File '); ReadLn; END. Bài 3 : Cho một lớp học sinh có n người, biết mã số SV, tên và điểm thi m môn của mỗi sinh viên. Viết chương trình (cấu trúc dữ liệu kiểu bản ghi) tính điểm trung bình của từng người và tách danh sách lớp thành 3 danh sách: những SV có DTB nhỏ hơn 5 từ 5-7,và DTB >8. Program Ban_ghi_Tao_danh_sach; type sv=record ms:integer; ht:string[25]; d:array[1 20] of real; dtb:real end; var n,m,n1,n2,n3,i,j,k:integer; ds,ds1,ds2,ds3:array[1 30] of sv; ttsv:sv; t:real; BEGIN write('Nhap so nguoi n, somon m= '); readln(n,m); for i:=1 to n do begin write('ms[',i,']=? '); readln(ds[i].ms); write('ht[',i,']=? '); readln(ds[i].ht); for j:=1 to m do begin write('d[',j,']=? '); readln(ds[i].d[j]); end end; for i:=1 to n do begin t:=0; for j:=1 to m do t:=t+(ds[i].d[j]); ds[i].dtb:=t/m end; n1:=0; n2:=0; n3:=0; for i:=1 to n do if ds[i].dtb<5 then begin n1:=n1+1; ds1[n1]:=ds[i] end else if ds[i].dtb<8 then begin n2:=n2+1; ds2[n2]:=ds[i] end else Bộ môn Tin học Xây dựng 17
  18. Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm begin n3:=n3+1; ds3[n3]:=ds[i] end; writeln; If n1 0 then begin writeln('2. DS SINH VIEN CO DTB: 5-7:'); for i:=1 to n2 do writeln(ds2[i].ms:5,ds2[i].ht:15,ds2[i].dtb:10:1); end; writeln; if n3<>0 then begin writeln('3. DS SINH VIEN CO DTB: 8-10:'); for i:=1 to n3 do writeln(ds3[i].ms:5,ds3[i].ht:15,ds3[i].dtb:10:1); end; writeln; readln END. Bài 4 : Cho một ma trận A (nxm). Sắp xếp lại ma trận sao cho các phần tử trong từng hàng tăng dần. Viết 3 chương trình con:một chương trình con nhập dữ liệu, 1 chương trình con sắp xếp và 1 chương trình con in kết quả. Program Chuong_trinh_con_sap_xep_ma_tran; type k1=array[1 15,1 15] of real; var n,m,i,j,k:integer; a:k1; c:real; Procedure nhap; begin write('n,m=?'); readln(n,m); for i:=1 to n do for j:=1 to m do begin write('A[',i,',',j,']=?'); readln(a[i,j]); end end; Bộ môn Tin học Xây dựng 18
  19. Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm Procedure XL; begin for i:=1 to n do for j:=1 to m-1 do for k:=j+1 to m do if a[i,j]>a[i,k] then begin c:=a[i,j]; a[i,j]:=a[i,k]; a[i,k]:=c end end; Procedure IKQ; begin for i:=1 to n do begin for j:=1 to m do write(a[i,j]:12:2); writeln end end; { Chuong trinh chinh} BEGIN nhap; xl; ikq; readln END. Bài 5 : Bài 6 : Cho trước 2 tệp dữ liệu chứa các thông tin của sinh viên: tệp thứ nhất chứa các dữ liệu về số thứ tự và tên của từng sinh viên; tệp thứ hai gồm các thông tin về số thứ tự, mã số sinh viên, năm sinh và điểm tốt nghiệp của từng sinh viên. Viết chương trình Pascal để lấy các dữ liệu từ tệp sau đó lập danh sách sinh viên giỏi ( có điểm tốt nghiệp >8) in trên màn hình. Program Lay_du_lieu_ra_tu_tep_da_co_va_Xu_ly; Type sv=record tt:integer; ht:string[15]; ms,ns,dtn:real; end; Var i,n:integer; tentep1,tentep2:string[10]; f1,f2:text; ds:array[1 10] of sv;{ Mang chua cac du lieu cua hoc sinh} Bộ môn Tin học Xây dựng 19
  20. Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm BEGIN { Doc du lieu tu tep thu nhat va cat vao mang danh sach co cau truc ban ghi} write(' Dua vao ten tep chua du lieu - hoten '); readln(Tentep1); Assign (f1,tentep1); Reset(f1); i:=1; readln(f1); While not EOF(f1) Do with ds[i] do Begin readln(f1,tt,ht); i:=i+1; end; n:=i-1; Close(f1); { Doc du lieu tu mang thu hai cat tiep vao mang truoc } write(' Dua vao ten tep chua thong tin hoc sinh-thongtin '); readln(tentep2); Assign (f2,tentep2); Reset(f2); i:=1; readln(f2); While not EOF(f2) do with ds[i] do begin readln(f2,tt,ms,ns,dtn); i:=i+1; End; close(f2); Writeln; Writeln(' Danh sach day du '); For i:=1 to n do with ds[i] do writeln(tt:3,ht:15,' ',ms:6:0,' ',ns:6:0,' ',dtn:5:1); Writeln; Writeln ( ' DANH SACH SINH VIEN GIOI '); For i:= 1 to n do with ds[i] do If dtn>=8 then Writeln (tt:3,' ',ht:15,' ',ms:5:0,' ',ns:5:0,' ',dtn:5:1); Readln END. Bộ môn Tin học Xây dựng 20