Các bài tập sau nên viết dưới dạng chương trình con. Lập phương trình tạo ra một mảng chứa cửu chương như vẫn dùng cho học sinh 3. Viết chương trình tìm số lớn nhất và số nhỏ nhất của m[r]
(1)LẬP TRÌNH PASCAL CĂN BẢN (P.05)
Mục đích của giáo trình:
1. Hỗ trợ thêm kiến thức kỹ năng cho học phần Tin Học Đại Cương
2. Biết cách chuyển từ việc giải quyết tốn thơng thường thành việc giải tốn máy tính
3. Rèn luyện tư về thuật toán
4. Làm quen với khái niệm cơ bản về lập trình cho máy tính thơng qua ngơn ngữ lập trình Pascal
Lê Đức Long Khoa Tốn - Tin Trường ĐHSP Tp HCM
(2)Bài 1:
VẤN ĐỀ - BÀI TOÁN I./ THẾ NÀO LÀ VẤN ĐỀ – BÀI TOÁN ?
- Vấn đề hiểu cách đơn giản vướng mắc, khó khăn sống mà cần giải
- Trong sống, người lúc phải giải vấn đề : giải toán đố, trả lời câu hỏi trắc nghiệm, giải khó khăn sống, gia đình giải vấn đề liên quan đến kin tế, xã hội v v
- Dưới góc nhìn khoa học, vấn đề thường thể dạng toán Bài toán loại vấn đề mà để giải nó, phải cần đến tính toán toán toán học, vật lý học, hoá học, xây dựng, kinh tế v v
Ví dụ :
1 Chứng minh đẳng thức : (a+b)2 = a2 + 2ab+ b2
2 Chứng minh gia tốc chuyển động tròn gia tốc hướng tâm Chỉ bước dựng tam giác với chiều dài cạnh a, b, c cho trước Với số vốn 1,3 tỉ đồng, cần đầu tư vào lãnh vực sản xuất để có tiền lời cao ? - Việc giải vấn đề – tốn diễn đạt sơ đồ chung sau :
A B
Trong :
A giả thiết điều kiện ban đầu B kết luận mục tiêu cần đạt
suy luận, giải pháp cần xác định
- Để diễn đạt giải pháp, cần có tập quy ước Tập quy ước thay đổi tuỳ theo vấn đề – tốn
Ví dụ :
1 Đối với vấn đề chứng minh biểu thức tốn học, tập quy ước ký hiệu toán học, phép suy luận toán học, tập tiên đề định lý chứng minh
2 Đối với việc chứng minh định lý Vật lý, tập quy ước định luật Vật lý
II./ MÁY TÍNH VÀ VIỆC GIẢI QUYẾT VẤN ĐỀ – BÀI TOÁN :
- Trên thực tế, có nhiều vấn đề – toán giải đơn giản thực lại địi hỏi q trình tính tốn lặp lặp lại nhiều lần Điều làm cho người giải toán mau mệt mỏi, từ tập trung gây sai sót
- Từ máy tính học Pascal, hàng loạt phát minh cải tiến khác đời Một dấu mốc đáng ghi nhớ đời máy tính điện tử đầu tiên(ENIAC) vào khoảng thời gian 1943-1946 (do hai kỹ sư người Mỹ J.W Mauchly J.P.Eckert Đại học Pensylvania thiết kế) Ngày nay, máy tính điện tử trở thành công cụ đa việc giải vấn đề – tốn (Dùng máy tính điện tử, người tính số Pi đến hàng tỉ số lẻ, 1,1 tỉ số lẻ vào năm 1989 Với trợ giúp máy tính điện tử, vào năm 1986 người tìm số nguyên tố lớn thời
2216091 – 1, số có đến 65050 vị trí) Ngồi cơng dụng tính tốn, máy tính điện tử cịn cơng cụ quản
lý, tư vấn, giải trí, thương mại, giáo dục v v nhiều hoạt động khác
- Máy tính có khả tuyệt vời tính tốn khối lượng khổng lồ phép tính với độ xác tuyệt đối, tốc độ cực nhanh
(3)- Do việc lệnh cho máy tính ngơn ngữ máy q tốn cơng (vì khó hiểu, khó nhớ) nên người phát minh loaị ngôn ngữ bậc cao giống tiếng Anh Muốn máy tính hiểu muốn gì, cần làm gì, phải tiến hành số thao tác để chuyển từ ngôn ngữ tự nhiên (ngôn ngữ mà ta sử dụng) sang ngôn ngữ bậc cao (high - level language) Thao tác gọi lập trình (programming) ngơn ngữ bậc cao dùng để lệnh cho máy tính gọi ngơn ngữ lập trình bậc cao (high – level programming language) Trên giới nay, có nhiều ngơn ngữ lập trình bậc cao thơng dụng Basic(J.D.Kemeny T.E.Kurtz phát minh vào năm 1965 Đại học Dartmouth), C (Dennis Ritchie thiết kế Ra đời vào năm 1972 phịng thí nghiệm Bell Telephone hãng AT & T), Pascal(Niklaus Wirth phát minh Ra đời vào 1970), Java(do hãng SUN phát triển, đời vào thập niên 1990)
Một số ngôn ngữ lập trình bậc cao :
ADA : theo tên nữ bá tước Ada Lovelace (1815-1837), người lập trình lịch sử Thiết kế J.D.Ichbiah năm 1980 vận động thiết kế lập trình Bộ Quốc Phịng Mỹ
ALGOL – 60 (Algorithmic Language) : đời vào năm 1958 ủy ban phối hợp Hiệp hội Máy tính ACM Hội Toán học học ứng dụng Đức GAMM Được thực vào năm 1960
APL(A Programming Language) : Kenneth Iverson hãng IBM thiết kế vào khoảng năm 1960, ban đầu chạy IBM 360
COBOL(Common Business Oriented Language) : đời vào năm 1960, có chuẩn COBOL – 68, COBOL – 74 , COBOL – 85 Chủ yếu áp dụng thương mại
FORTRAN (Formula Translation) : nhóm IBM đứng đầu Backus thiết kế, đời vào năm 1956
LISP (List Processing) : phát minh J.Mc Carthy, giảng dạy MIT (Massachusettes Institude of Technology) Ra đời vào năm 1958 Phục vụ lập trình cho trí tuệ nhân tạo
PROLOG (Programmation en logique) : đời vào năm 1972, kết nghiên cứu chứng minh tự động J.Robinson, R.Kowalski, D.Kuehner, A.Colmerauer Phục vụ lập trình cho trí tuệ nhân tạo
III./ MỘT SỐ PHƯƠNG PHÁP GIẢI QUYẾT VẤN ĐỀ – BÀI TỐN BẰNG MÁY TÍNH :
+ Phương pháp trực tiếp : áp dụng trường hợp vấn đề – toán có lời giải xác Việc giải máy tính thao tác lập trình
Ví dụ : Bài tốn tính tổng n số ngun dương Nhà tốn học Đức Gauss đưa cơng thức tổng quát để giải toán Như việc giải tốn máy tính cịn biểu diễn cơng thức giải theo cú pháp ngơn ngữ lập trình
+ Phương pháp gián tiếp tìm kiếm lời giải : áp dụng trường hợp chưa tìm lời giải xác vấn đề – tốn
Ví dụ : Tìm tất số ngun a, b, c thỏa a3 +b3 + c3 = a + b + c
Bài 2:
THUẬT TOÁN – THUẬT GIẢI
I./ THUẬT TOÁN :
- Thuật toán khái niệm sở Toán học Tin học
- Thuật toán tập hợp hướng dẫn nhằm thực cơng việc Đối việc giải vấn đề – toán , thuật toán hiểu tập hữu hạn hướng dẫn rõ ràng để người giải tốn theo mà giải toán Như vậy, thuật toán phương pháp thể lời giải vấn đề, toán
- Việc nghiên cứu thuật tốn có vai trị quan trọng khoa học máy tính máy tính giải vấn đề có hướng dẫn giải rõ ràng
- Trong khoa học máy tính, thuật tốn định nghĩa dãy hữu hạn bước khơng mậpmờ
và có thể thực thi được, q trình hành động theo bước phải dừng cho kết như
(4)- Các tính chất thuật tốn :
• Xác định : tính khơng mập mờ tính thực thi • Hữu hạn : số bước hữu hạn tính chất dừng
• Đúng
- Các đặc trưng thuật toán :
Đầu vào đầu (Input/Output) : thuật toán nhận liệu đầu vào, xử lý cho kết cuối
Tính hiệu quả (Effectiveness) : dựa khối lượng tính tốn, khơng gian thời gian thuật toán thi hành Là yếu tố định để đánh giá, chọn lựa cách giải vấn đề – tốn thực tế
Tính tổng qt (Generalliness): áp dụng cho trường hợp tốn Ví dụ : Thuật tốn giải phương trình bậc ax + b =0
1 Yêu cầu cho biết giá trị a b Nếu a =
2.1 Nếu b = phương trình vơ định Kết thúc thuật tốn 2.2 Nếu b ≠ phương trình vơ nghiệm Kết thúc thuật tốn
3 Nếu a ≠ phương trình có nghiệm x = - b/a Kết thúc thuật toán II./ THUẬT GIẢI :
- Đặt vấn đề :
• Có nhiều tốn chưa tìm cách giải theo kiểu thuật toán khơng biết có thuật tốn hay khơng ? (Bài tốn tìm số ngun tố lớn nhất)
• Có nhiều tốn có thuật tốn để giải khơng chấp nhận thời gian giải theo thuật tốn q lớn (Bài tốn tháp Hà Nội)
• Có tốn giải theo cách giải vi phạm thuật toán chấp nhận - Mở rộng hai tiêu chuẩn thuật toán : tính xác định tính để chấp nhận cách giải cho
kết tốt, gần phức tạp hiệu
- Các cách giải chấp nhận được nhưng khơng hồn tồn đáp ứng đầy đủ tiêu chuẩn của thuật toán thường được gọi thuật giải
Một thuật giải thường đề cập đến khoa học trí tuệ nhân tạo cách giải theo kiểu Heuristic
Ví dụ : Thuật giải nấu cơm { Gạo, củi}
Nấu cơm :
- Vo gạo - Chuẩn bị lửa - Nấu, canh - Kết thúc { Nồi cơm chín}
Ví dụ : Bài tốn đổ nước
Có hai bình đựng nước B5 có dung tích 5lít , B8 có dung tích 8lít Hãy cách đong để có hai lít nước Các thao tác thực :
1 Hứng đầy nước vào bình B5 B8 Đổ bình
3 Đổ nước từ bình sang bình khác lúc bình đầy Thuật giải :
- Đổ đầy nước vào bình B5 (B5=5)
- Đổ từ bình B5 sang bình B8 (B5=0, B8=5) - Đổ đầy nước bình B5 (B5=5, B8=5)
(5)Bài 3:
CÁC PHƯƠNG PHÁP BIỂU DIỄN THUẬT TOÁN
Có phương pháp biểu diễn thuật tốn : Dùng ngôn ngữ tự nhiên
2 Dùng lưu đồ, sơ đồ khối (Flowchart) Dùng mã giả (pseudo code)
I./ NGÔN NGỮ TỰ NHIÊN :
- Sử dụng ngôn ngữ thường ngày để liệt kê bước thuật tốn
- Khơng có quy tắc cố định việc thể thuật tốn ngơn ngữ tự nhiên Do cách biểu diễn thường dài dịng, khơng thể rõ cấu trúc thuật tốn, đơi lúc gây khó hiểu cho người đọc
Ví dụ : Thuật tốn giải phương trình bậc ax + b = II./ LƯU ĐỒ – SƠĐỒ KHỐI :
- Lưu đồ hay sơ đồ khối công cụ trực quan để diễn đạt thuật toán
- Biểu diễn thuật toán lưu đồ giúp người đọc theo dõi phân cấp trường hợp q trình xử lý thuật tốn
- Phương pháp lưu đồ thường dùng thuật toán có tính rắc rối, khó theo dõi q trình xử lý
- Các ký hiệu :
Ví dụ :
Đ
S
Điều kiện chọn lựa Thao tác xử lý
Thứ tự thực Dữ liệu nhập/xuất
a,b
a = b = Ptvđ
Ptvn
(6)III./ MÃ GIẢ :
- Vay mượn cú pháp ngôn ngữ lập trình để thể thuật tốn
- Dùng mã giả vừa vận dụng khái niệm ngơn ngữ lập trình, vừa giúp người cài đặt dễ dàng nắm bắt nội dung thuật toán, nhiên mã giả dùng phần ngôn ngữ tự nhiên
Ví dụ : - Nhập a, b - If a = :
If b = : xuất kết ‘Pt vô định’ Else xuất kết ‘Pt vô nghiệm’ Else xuất kết x =-b/a
BÀI TẬP
1 Viết thuật tốn tính diện tích, chu vi hình chữ nhật, hình trịn
2 Viết thuật tốn tính số phiếu UCV, biết số phiếu UCV B gấp đôi số phiếu UCV A, UCV C UCV B 100 phiếu, biết tổng số phiếu 900
3 Viết thuật toán giải phương trình bậc hai ax2 + bx + c =
4 Viết thuật toán đổi sang giờ, phút, giây nhập số giây S
5 Viết thuật tốn tìm số lớn hai số nguyên nhập vào từ bàn phím Viết thuật tốn tìm số lớn bốn số ngun nhập vào từ bàn phím
7 Viết thuật tốn nhập vào số ngun, xuất thơng báo số số chẵn hay số lẻ Viết thuật toán nhập vào tháng, xuất kết tháng có ngày Viết thuật toán nhập vào hai số nguyên, tìm ước số chung lớn hai số
Hướng dẫn :
Nếu số > số số = số – số Nếu số > số số = số – số
Thực tiếp số = số dừng Đó USCLN số 10 Viết thuật toán nhập vào số nguyên N, xét xem số có số nguyên tố hay không ?
Số nguyên tố số nguyên dương >=2 , chia hết cho cho 11 Viết thuật tốn giải phương trình trùng phương : ax4 + bx2 + c =
Bài 4:
GIỚI THIỆU NGÔN NGỮ LẬP TRÌNH PASCAL
I./ NGUỒN GỐC :
- Pascal là ngôn ngữ lập trình bậc cao giáo sư Niklaus Wirth (Trường Đại Học Zurich, Thuỵ Sĩ) thiết kế công bố vào năm 1971 Ơng đặt tên cho ngơn ngữ PASCAL để tưởng nhớ đến Blaise Pascal (nhà Toán học- Vật lý học người Pháp kỷ 17), người sáng chế máy tính khí nhân loại
- Ngôn ngữ Pascal chuẩn nhằm phục vụ giảng dạy phương pháp lập trình đặc biệt “ phuơng pháp lập trình có cấu trúc”
- Ngày nay, Pascal sử dụng để giải gần nhiệm vụ loại máy tính xem ngơn ngữ lập trình bậc cao ưu việt lãnh vực giảng dạy lập trình chuyên nghiệp
II./ TÍNH CHẤT CƠ BẢN :
1./ Pascal ngơn ngữ lập trình có định kiểu rõ ràng :
(7)2./ Pascal ngơn ngữ lập trình thể tư lập trình có cấu trúc :
- Dữ liệu được cấu trúc hoá : từ liệu đơn giản có cấu trúc đơn giản, người lập trình xây dựng liệu có cấu trúc phức tạp
- Mệnh lệnh được cấu trúc hố : từ lệnh chuẩn có, người lập trình nhóm chúng lại với đặt hai từ khoá Begin End khiến chúng trở thành câu lệnh phức tạp gọi lệnh hợp hay lệnh ghép
- Chương trình được cấu trúc hóa : chương trình chia thành chương trình tổ chức theo hình phân cấp
III./ CÁC THÀNH PHẦN CỦA NGÔN NGỮ LẬP TRÌNH PASCAL : 1./ Bộ ký tự :
- Các chữ : A-Z, a-z - Ký tự gạch nối – - Các chữ số : 0-9
- Các ký hiệu toán học : + - * / = < > ( ) {} 2./ Từ khoá :
Các tên riêng Pascal có ngữ nghĩa xác định Khơng dùng từ khoá vào việc khác đặt tên trùng với từ khố
Ví dụ :
-Từ khóa chung : PROGRAM, BEGIN, END, PROCEDURE, FUNCTION
-Từ khóa để khai báo: CONST, VAR, TYPE, ARRAY, STRING, RECORD, SET, FILE OF, LABEL -Từ khóa lệnh lựa chọn :
IF THEN
IF THEN ELSE CASE OF
-Từ khóa lệnh lặp : FOR TO DO
FOR DOWNTO DO WHILE DO
REPEAT UNTIL
-Từ khóa điều khiển: WITH, GOTO, EXIT
-Từ khóa tốn tử: AND, OR, NOT, IN, DIV, MOD 3./ Tên chuẩn :
Tên định nghĩa sẵn Pascal (có thể định nghĩa lại muốn) Các tên chuẩn : Boolean, Char, Integer, Word, Byte, Real, False, True, Abs, Cos, Sin, Exp, Ln, Odd, Ord, Round, Trunc, Sqr, Sqrt, Pred, Succ, Read, Readln, Write, Writeln,
4./ Danh hiệu tựđặt :
- Danh hiệu tự đặt dùng để đặt tên cho biến, hằng, kiểu, chương trình - Bắt đầu chữ cái, sau chữ cái, chữ số hay dấu nối
Ví dụ : x, bien_dem
Lưu ý : Ngôn ngữ Pascal không phân biệt chữ hoa hay chữ thường danh hiệu
Bài 5:
CẤU TRÚC TỔNG QUÁT CỦA CHƯƠNG TRÌNH PASCAL
I./ CẤU TRÚC TỔNG QUÁT :
1 Phần tiêu đề chương trình
(8)Cấu trúc chương trình Pascal đầy đủ có ba phần sau:
PROGRAM TEN_CHƯƠNG _TRINH ; { Phần tiêu đề}
USES CRT, PRINTER ; { Phần khai báo }
LABEL … CONST … TYPE … VAR …
PROCEDURE … {phần mơ tả chương trình con} FUNCTION …
BEGIN
…
{Các câu lệnh } { Phần thân chương trình }
END {kết thúc chương trình} II./ VÍ DỤ MINH HỌA :
Program Phuong_trinh_bac_nhat ;
Uses Crt;
Var a, b :real;
Procedure Nhap;
Begin
Write(‘Nhap he so a :’); Readln(a);
Write(‘Nhap he so b :’); Readln(b);
End; Begin
Clrscr; {Xoá hình}
Nhap; {Thực thủ tục Nhap} If a = then
If b= then writeln(‘Phuong trinh vo dinh’) else {b <> 0}
writeln(‘Phuong trinh vo nghiem’) else {a <> }
writeln(‘Phuong trinh co nghiem la :’, -b/a :8:2); Writeln(‘Bam phim <Enter> de tro ve cua so soan thao’); Readln;
End {End of Main}
III./ GIẢI THÍCH SƠ LƯỢC TỪNG PHẦN CỦA CHƯƠNG TRÌNH : 1./ Phần tiêu đề :
Cho biết tên chương trình Phần ln khóa Program chấm dứt dấu ;
Phần khơng có 2./ Phần khai báo liệu :
Trước sử dụng biến nào, phải khai báo biến Khai báo biến xác định rõ xem biến thuộc kiểu liệu Một chương trình Pascal thơng thường có khai báo liệu sau :
CONST {khai báo hằng}
TYPE {khai báo kiểu liệu mới}
VAR {khai báo biến}
(9)3./ Phần khai báo chương trình :
Phần mơ tả nhóm lệnh đặt tên chung chương trình để phần thân chương trình có lệnh gọi đến nhóm lệnh thực Phần có khơng tuỳ theo nhu cầu
4./ Phần thân chương trình :
Phần ln nằm hai từ khố BEGIN END Ở câu lệnh mà chương trình cần thực Sau từ khóa END dấu chấm để báo hiệu kết thúc chương trình Phần bắt buộc phải có chương trình
5./ Dấu chấm phẩy :
Dấu chấm phẩy ; dùng để ngăn cách câu lệnh Pascal khơng thể thiếu 6./ Lời giải thích :
Các lời giải thích đưa vào chỗ chương trình, chúng đặt ký hiệu { } (* *) Khi viết chương trình nên có nhiều lời giải thích để chương trình trở nên dễ hiểu, dễ đọc
Bài 6:
CÁC KIỂU DỮ LIỆU ĐƠN GIẢN I./ CÁC KIỂU DỮ LIỆU (DATA TYPE) CỦA PASCAL :
Khái niệm chung :
- Dữ liệu tất loại thơng tin mà máy tính xử lý - Theo Niklaus Wirth :
CHƯƠNG TRÌNH = GIẢI THUẬT + DỮ LIỆU
- Một kiểu liệu quy định hình dạng, cấu trúc giá trị liệu cách biểu diễn xử lý liệu
- Trong Pascal, kiểu liệu nhìn chung chia thành bốn loại : Kiểu đơn giản (vô hướng) : gồm hai kiểu sau :
Kiểu sở (kiểu chuẩn) : có bốn kiểu Kiểu logic (Boolean)
Kiểu số nguyên (Integer) Kiểu số thực (Real) Kiểu ký tự (Char)
Kiểu vơ hướng tự định nghĩa : có hai kiểu Kiểu miền (Sub-range)
Kiểu liệt kê (Enumerated)
2 Kiểu liệu có cấu trúc : gồm bốn kiểu sau : Kiểu mảng (Array)
Kiểu tập hợp (Set) Kiểu ghi ( Record) Kiểu tập tin (File) Kiểu xâu ký tự (String) Kiểu trỏ (Pointer) II./ KIỂU SỐ NGUYÊN (INTEGER) :
1./ Kiểu số nguyên định nghĩa với từ khóa sau :
TỪ KHÓA PHẠM VI
INTEGER -32628 đến 32627
BYTE đến 255
WORD đến 65535
SHORTINT -128 đến 127
(10)2./ Các phép toán số học số nguyên :
KÝ HIỆU Ý NGHĨA KIỂU KẾT QUẢ
DIV Chia lấy phần nguyên Số nguyên
MOD Chia lấy phần dư Số nguyên
+ Cộng Số nguyên
- Trừ Số nguyên
* Nhân Số nguyên
/ Chia Số thực III./ KIỂU SỐ THỰC (REAL) :
1./ Kiểu số thực định nghĩa với từ khóa REAL:
TỪ KHĨA PHẠM VI
REAL 2.9 x 10-39 đến 1.7x1038 2./ Các phép toán số học số thực :
KÝ HIỆU Ý NGHĨA KIỂU KẾT QUẢ
+ Cộng Số thực
- Trừ Số thực
* Nhân Số thực
/ Chia Số thực 3./ Các hàm số học dùng cho số nguyên số thực :
TÊN HÀM KIỂU TÁC ĐỘNG KIỂU KẾT QUẢ Ý NGHĨA
ABS(x) REAL/NGUYÊN REAL Lấy giá trị tuyệt đối x
ARCTAN(x) REAL/NGUYÊN REAL Cho giá trị Arctan x
COS(x) REAL/NGUYÊN REAL Cho giá trị cosin x (tính radian)
SIN(x) REAL/NGUYÊN REAL Cho giá trị sin x (tính
radian)
EXP(x) REAL/NGUYÊN REAL Cho giá trị ex
PI REAL/NGUYÊN REAL Cho 3.14159
SQR(x) REAL/NGUYÊN REAL/NGUYÊN Lấy bình phương x
SQRT(x) REAL/NGUYÊN REAL Lấy bậc hai x
LN(x) REAL/NGUYÊN REAL Cho giá trị lnx
ROUND(x) REAL/NGUYÊN LONGINT Làm tròn x
TRUNC(x) REAL LONGINT Lấy phần nguyên x
INT(x) REAL REAL Lấy phần nguyên x
FRAC(x) REAL REAL Lấy phần lẻ (phần thập phân ) x
PRED(n) NGUYÊN NGUYÊN Cho số nguyên n+1
SUCC(n) NGUYÊN NGUYÊN Cho số nguyên n-1
ODD(n) NGUYÊN BOOLEAN Cho kết TRUE n số lẻ,
FALSE n số chẵn IV./ KIỂU LOGIC (BOOLEAN):
1./ Định nghĩa :
Một liệu thuộc kiểu Boolean đại lượng nhận hai giá trị logic TRUE FALSE
2./ Các phép toán logic :
(11)- Phép NOT (Phép “phủ định”) - Phép AND (Phép “và”) - Phép OR (Phép “hoặc) - Phép XOR (Phép “chỉ hoặc”)
A Not A
TRUE FALSE FALSE TRUE
A B A AND B
TRUE TRUE TRUE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
A B A OR B
TRUE TRUE TRUE TRUE FALSE TRUE FALSE TRUE TRUE FALSE FALSE FALSE
A B A XOR B
TRUE TRUE FALSE TRUE FALSE TRUE FALSE TRUE TRUE FALSE FALSE FALSE 3./ Các phép toán quan hệ cho kết kiểu Boolean:
Ký hiệu Ý nghĩa
< > Khác
= Bằng >= Lớn <= Nhỏ
> Lớn < Nhỏ V./ KIỂU KÝ TỰ (CHAR):
1./ Định nghĩa :
Ký tự bao gồm chữ (A -> Z, a ->z), chữ số (0 –> 9), ký hiệu #, @, %, ^ , dấu kết thúc câu ? ! v v Kiểu ký tự định nghĩa Pascal từ khóa Char Mỗi ký tự viết cặp nháy đơn
Để tiện trao đổi thông tin máy tính với nhau, ký tự mã hóa xếp theo thứ tự định Mỗi cách xếp gọi bảng mã Thông dụng bảng mã ASCII Bảng mã ASCII chuẩn gồm 128 ký tự :
- Các ký tự có số thứ tự từ đến 31 ký tự điều khiển, khơng in hình máy in
Ví dụ : Ký tự có số thứ tự ký tự BEL : phát tiếng kêu BIP
Ký tự có số thứ tự 13 ký tự CR (Carriage Return) : trở đầu dòng Ký tự có số thứ tự 10 ký tực LF (Line Feed) : xuống dòng - Các ký tự có số thứ tự từ 32 đến 126 chữ số, chữ cái, ký hiệu v v
(12)2./ Các phép toán kiểu ký tự :
Phép cộng ký tự : Có thể sử dụng tốn tử + để nối nhiều ký tự thành chuỗi ký tự
Ví dụ : ‘A’ +’B’ ‘AB’
‘A’+’ ‘+’B’ ‘A B’ Các phép toán quan hệ :
Ký hiệu Ý nghĩa Ví dụ
< > Khác ‘A’ <> ’B’ : TRUE
= Bằng ‘A’ = ‘B’: FALSE
>= Lớn ‘A’ >= ‘B’ : FALSE <= Nhỏ ‘A’ <= ‘ B’ : TRUE
> Lớn ‘A’ > ‘B’ : FALSE
< Nhỏ ‘A’ < ‘B’ : TRUE
3./ Các hàm chuẩn liên quan đến kiểu ký tự :
TÊN HÀM Ý NGHĨA
ORD(x) Cho số thứ tự ký tự x bảng mã ASCII CHR(n) hay #n Cho ký tự có số thứ tự n
bảng mã ASCII PRED(x) Cho ký tự đứng trước x SUCC(x) Cho ký tự đứng sau x UPCASE(x) Cho ký tự in hoa ký tự x
Bài 7:
HẰNG, BIẾN, KIỂU, BIỂU THỨC,
LỆNH GÁN, LỆNH GHÉP
I./ HẰNG(CONSTANT) : 1./ Định nghĩa :
Hằng đại lượng có giá trị khơng thay đổi suốt trình thi hành chương trình 2./ Cách khai báo :
Ví dụ : Const Pi = 3.14; 3./ Phân loại :
Hằng số nguyên, số thực, luận lý (chỉ nhận hai giá trị TRUE, FALSE), ký tự, chuỗi ký tự
Ví dụ : Const Pi = 3.14; { số thực} Const Heso = 10; { số nguyên} Const Ten = ‘Pascal’; { ký tự} Const Tua = ‘Giao trinh Pascal’ { chuỗi ký tự}
Const D = TRUE; { luận lý}
Const S = FALSE; { luận lý}
(13)II./ BIẾN (VARIABLE) : 1/ Định nghĩa :
- Biến vị trí nhớ đặt cho tên dùng để lưu trữ liệu gọi giá trị biến Giá trị biến thay đổi suốt trình thi hành chương trình Một biến phải thuộc kiểu liệu định
- Tên biến đặt bắt đầu chữ cái, khơng có khoảng trắng, dài tối đa 256 ký tự 2./ Cách khai báo :
Ví dụ : VAR a : integer;
b : real;
ch : char;
temp : boolean;
III./ KIỂU (STYLE) :
Ngoài kiểu định sẵn, Pascal cho phép ta định nghĩa kiểu liệu khác từ kiểu theo qui tắc định kiểu Pascal
Cách khai báo :
Ví dụ :
TYPE
Songuyen = Integer;
Ten = String[25];
YearOld = 100;
Color = (Red, Blue, Green);
Khi khai báo có quyền sử dụng kiểu thân chương trình
VAR
i, j : Songuyen; Nhanvien : Ten; Tuoi : YearOld; Mau : Color; IV./ BIỂU THỨC (EXPRESSION) :
1./ Định nghĩa :
Một biểu thức cơng thức tính tốn bao gồm cá phép toán, hằng, biến, hàm dấu ngoặc
Ví dụ: (-b+sqrt(delta))/(2*a) (a and b) or c
2./ Thứ tựưu tiên :
Khi tính giá trị biểu thức, ngôn ngữ PASCAL quy ước thứ tự ưu tiên phép toán từ thấp đến cao sau :
1. Phép gọi hàm 2. Not –
3. * / DIV MOD AND
4. + - OR XOR
5. = <> <= >= < > IN VAR <tênbiến > : <kiểu liệu biến> ;
TYPE
(14)Quy ước tính thứ tự ưu tiên :
Quy tắc 1 : Các phép toán có độ ưu tiên cao đuợc tính trước
Quy tắc 2 : Trong phép toán có độ ưu tiên tính tốn thực từ trái sang phải
Quy tắc 3 : Phần ngoặc từ tính tốn để trở thành giá trị đơn 3./ Kiểu biểu thức :
Là kiểu kết sau tính giá trị biểu thức Ví dụ : Biểu thức sau có kiểu Boolean
not(a and b) or ( x >5) V./ LỆNH GÁN :
Dùng để đặt giá trị cho biến Cách khai báo :
Ví dụ : x := ;
dt :=10 ;
chuvi := chieurong * chieudai ; VI./ CÂU LỆNH GHÉP :
Một nhóm câu lệnh đơn đặt hai từ khóa BEGIN END tạo thành câu lệnh ghép Cách viết :
Bài 8:
CÁC THỦ TỤC NHẬP, XUẤT DỮ LIỆU I./ CÁC THỦ TỤC NHẬP DỮ LIỆU :
DẠNG CÁCH VIẾT Ý NGHĨA
1 READ(x1,x, ,xn);
Nhập liệu từ bàn phím vào biến x1, x2, ,xn Khi viết biến phân cách dấu phẩy, nhập liệu giá trị phân cách khoảng trống Sau khi nhập xong liệu, điểm chèn hàng với dữ
liệu
2 READLN(x1,x2, ,xn);
Tương tự dạng 1 Sau nhập xong liệu,
điểm chèn xuống dịng ( tác dụng như được ấn phím Enter xuống dòng)
3 READLN; Dừng chương trình, đợi ấn phím Enter mới tiếp tục <tênbiến > : = <giá trị> ;
< tênbiến> : = <biểu thức>;
(15)II./ CÁC THỦ TỤC XUẤT DỮ LIỆU :
DẠNG CÁCH VIẾT Ý NGHĨA
1 WRITE([‘Thông báo’],x1,x2 , ,xn);
Xuất thơng báo (nếu có) giá trị biến x1, x2, , xn hình Thông báo phải đặt hai dấu nháy đơn Sau xuất xong liệu, điểm chèn ở
cùng hàng với liệu
2 WRITELN([‘Thông báo’],x1,x2 , ,xn);
Tương tự dạng 1 Sau xuất xong liệu, điểm chèn xuống dịng dưới ( tác dụng như được ấn phím Enter xuống dòng)
3 WRITELN; Chèn thêm dịng trống
III./ CÁC THỦ TỤC TRÌNH BÀY MÀN HÌNH :
Màn hình máy vi tính chế độ văn chia thành 25 dòng, 80 cột
3(cột)
2
(dòng) 1./ Các thủ tục :
CÁCH VIÊT Ý NGHĨA
GOTOXY(x,y); Di chuyển trỏ đến cột x, dòng y hình
CLRSCR; Xóa hình
TEXTCOLOR(Color); Đặt màu cho văn TEXTBACKGROUND(Color); Đặt màu
Lưu ý : Để sử dụng thủ tục nói trên, phải khai báo USES Crt; phần khai báo PROGRAM
2./ Các số màu định sẵn :
0 Black 4 Red 8 DarkGreen 12 LightRed
1 Blue 5 Magenta 9 LightBlue 13 LightMagenta
2 Green 6 Brown 10 LightGreen 14 Yellow
3 Cyan 7 LightGrey 11 LightCyan 15 White
3./ Ví dụ :
PROGRAM Viet_so_co_qui_cach; Uses Crt;
Var i, j : integer;
r : real;
Begin
Clrscr; i := 123; j := 456;
(16)Writeln(j:-5,i:5); Writeln(r:10:6); Readln;
Writeln(‘bấm phím <Enter> để trở cửa sổ soạn thảo’); End
Kết hình : 1234567890
123 81.123456
Bài 9:
CÂU LỆNH ĐIỀU KIỆN I./ VÍ DỤ MỞĐẦU :
1./ Viết chương trình nhập vào số nguyên tìm số lớn số Thuật toán :
- Nhập vào số nguyên a, b, c, d - Giả sử max := a
- Nếu b ≥ max max := b - Nếu c ≥ max max := c - Nếu d ≥ max max := d - Xuất max Kết thúc thuật toán
2./ Viết chương trình nhận biết số nguyên số chẵn hay số lẻ Thuật toán :
- Nhập vào số nguyên a - Tính số dư = a mod
- Nếu số dư = xuất thông báo ‘Số nhập vào số chẵn’ Kết thúc thuật toán Ngược lại { số dư <> 0}
xuất thông báo ‘Số nhập vào số lẻ’ Kết thúc thuật toán II./ CÂU LỆNH IF THEN :
1./ Cú pháp :
Ý nghĩa :
- Nếu điều kiện máy thực lệnh khối lệnh sau THEN tiếp tục thực lệnh khác chương trình
- Nếu điều kiện sai máy bỏ qua lệnh khối lệnh sau THEN để thực lệnh khác chương trình
- Nếu LỆNH KHỐI LỆNH phải đặt BEGIN END Lưu ý : Điều kiện phải biểu thức kiểu Boolean
2./ Ví dụ :
Viết chương trình nhập vào số nguyên tìm số lớn số PROGRAM So_lon_nhat;
Uses Crt;
Var max, a, b, c, d : integer; Begin
Clrscr;
Write(‘Nhập a=’); Readln(a);
(17)Write(‘Nhập b=’); Readln(b); Write(‘Nhập c=’); Readln(c); Write(‘Nhập d=’); Readln(d);
max := a;
If b ≥ max then max := b; If c ≥ max then max := c; If d ≥ max then max := d;
Readln End
III./ CÂU LỆNH IF THEN ELSE : 1./ Cú pháp :
Ý nghĩa:
- Nếu điều kiện máy thực lệnh 1, lệnh bị bỏ qua máy tiếp tục thực lệnh khác chương trình
- Nếu điều kiện sai máy thực lệnh 2, lệnh bị bỏ qua máy tiếp tục thực lệnh khác chương trình
Lưu ý :
- Toàn lệnh IF THEN ELSE xem lệnh đơn
- Nếu sau THEN hoặc ELSE có nhiều lệnh ta phải đặt BEGIN END 2./ Ví dụ :
Viết chương trình nhận biết số nguyên số chẵn hay số lẻ PROGRAM So_chan_le;
Uses Crt;
Var a, so_du: integer;
Begin
Clrscr;
Write(‘Nhập a=’); Readln(a);
so_du := a mod 2;
If so_du = then writeln(’So ’, a,’ la so chan’) Else writeln(‘So ‘, a,’ la so le’);
Readln; End
IV./ CÂU LỆNH CASE OF : 1./ Cú pháp :
IF < Điều kiện> THEN LỆNH ELSE
LỆNH 2;
CASE < Biến/Biểu thức chọn> OF Giá trị : Lệnh 1; Giá trị : Lệnh 2;
Giá trị n : Lệnh n;
ELSE Lệnh n+1;
(18)Ý nghĩa: Xét giá trị biến hay biểu thức chọn : - Nếu có giá trị k thực lệnh thứ k (k=1,2, ,n) - Nếu khơng thực lệnh thứ n+1
Lưu ý :
- Cấu trúc CASE OF khơng có ELSE
- Biến biểu thức chọn phải có kiểu INTEGER, CHAR khơng có kiểu REAL - Nếu muốn ứng với nhiều giá trị khác biến biểu thức chọn, máy thi hành
một lệnh giá trị viết hàng cách dấu, Giá trị k1, k2, kp : Lệnh k;
2./ Ví dụ :
Viết chương trình nhận biết số nguyên số chẵn hay số lẻ PROGRAM So_chan_le;
Uses Crt;
Var a, so_du: integer;
Begin
Clrscr;
Write(‘Nhập a=’); Readln(a);
so_du := a mod 2; Case so_du of
0 : Writeln(‘So ’,a,’ la so chan’); : Writeln(‘So ’,a,’ la so le’); End;
Readln; End
Bài 10:
CÂU LỆNH LẶP I./ CẤU TRÚC FOR:
1./ Ví dụ mởđầu :
Viết chương trình tính tổng n số nguyên dương với n nhập từ bàn phím hai cách ( S = + + + … + n)
Cách : Thuật toán :
- Nhập vào số nguyên dương n - Tính tổng S = n(n+1)/2 - Xuất S Kết thúc thuật toán Cách :
Thuật toán :
- Nhập vào số nguyên dương n - S =
- Lặp i = đến i =n tính S = S +i - Xuất S Kết thúc thuật toán
2./ Cú pháp :
(19)Giải thích :
- i gọi biến điều khiển Biến điều khiển phải có kiểu rời rạc
- Biến điều khiển i gán giá trịđầu sau vòng lặp (một lần thực lệnh) tự động tăng lên đơn vị biến điều khiển có giá trị lớn hơn giá trị cuối kết thúc vịng lặp (dạng 1)
- Biến điều khiển i gán giá trị ci sau vịng lặp (một lần thực lệnh) tự động giảm xuống đơn vị biến điều khiển có giá trị nhỏ hơn giá trịđầu kết thúc vịng lặp (dạng 2)
3./ Lưu ý :
- Cấu trúc FOR sử dụng biết trước số lần lặp Số lần lặp xác định Giá trị cuối – Giá trịđầu + 1
- Toàn cấu trúc FOR câu lệnh đơn
- Nếu phải thực lặp lặp lại nhiều lần (số lần lặp biết trước ) nhiều lệnh sử dụng cấu trúc FOR sau :
4./ Một số ví dụ minh hoạ:
Viết chương trình tính tổng n số ngun dương với n nhập từ bàn phím Program Tong;
Var i, n : integer;
S : Real;
Begin
Write(‘Nhập số nguyên dương n:’); Readln(n);
S := 0;
For i:=1 to n S:=S+i;
Writeln(‘Tong cua’,’ ‘,n,’ ‘,’so nguyen duong dau tien la:’, S:10:2); Readln;
End
Viết chương trình xuất hình dãy số Program Day_so_giam;
Var i : integer; Begin
For i:=5 downto Write(i:2); Readln;
End
II./ CẤU TRÚC WHILE DO : 1./ Ví dụ mởđầu :
Viết chương trình tính tổng n số nguyên dương với n nhập từ bàn phím FOR i:=<Giá trịđầu> TO <Giá trị cuối> DO
Begin Lệnh 1; Lệnh n; End;
FOR i:=<Giá trị cuối> DOWNTO <Giá trịđầu> DO Begin
Lệnh 1;
(20)Thuật toán : - Nhập n - S:=0 - i:=1
- Trong i <=n lặp Bắt đầu
S:=S+i; i:=i+1; Kết thúc Kết thúc lặp
- Xuất S Kết thúc thuật tốn 2./ Cú pháp :
Giải thích :
- Điều kiện biến hoặc biểu thức kiểu Boolean
- Trong điều kiện đúng cịn thực lệnh, điều kiện sai kết thúc vịng lặp thực lệnh sau WHILE DO
3./ Lưu ý :
- Cấu trúc WHILE DO sử dụng trước số lần lặp Toàn cấu trúc WHILE DO câu lệnh đơn
- Nếu phải thực lặp lặp lại nhiều lần nhiều lệnh (không biết trước số lần lặp) sử dụng cấu trúc WHILE DO sau :
4./ Một số ví dụ minh hoạ :
Viết chương trình tính tổng n số nguyên dương với n nhập từ bàn phím Program Tong;
Var i, n : integer;
S : Real;
Begin
Write(‘Nhập số nguyên dương n:’); Readln(n);
S := 0; i:=1;
While i <=n Begin
S:=S+i ; i :=i + 1; End;
Writeln(‘Tong cua’,’ ‘,n,’ ‘,’so nguyen duong dau tien la:’, S:10:2); Readln;
End
WHILE <Điều kiện> DO Lệnh;
WHILE <Điều kiện> DO Begin
Lệnh 1;
(21)III./ CẤU TRÚC REPEAT UNTIL: 1./ Ví dụ mởđầu :
Viết chương trình tính tổng n số nguyên dương với n nhập từ bàn phím Thuật tốn :
- Nhập n - S:=0 - i:=1
- Lặp
Bắt đầu S:=S+i; i:=i+1; Kết thúc Đến i > n Kết thúc lặp
- Xuất S Kết thúc thuật tốn 2./ Cú pháp :
Giải thích :
- Điều kiện biến biểu thức kiểu Boolean
- Trong điều kiện sai thì cịn thực lệnh, điều kiện đúng kết thúc vịng lặp thực lệnh sau REPEAT UNTIL
3./ Lưu ý :
- Cấu trúc REPEAT UNTIL sử dụng trước số lần lặp Toàn cấu trúc REPEAT UNTIL câu lệnh đơn
- Nếu phải thực lặp lặp lại nhiều lần nhiều lệnh (không biết trước số lần lặp) sử dụng cấu trúc REPEAT UNTIL sau :
4./ Một số ví dụ minh hoạ :
Viết chương trình tính tổng n số nguyên dương với n nhập từ bàn phím Program Tong;
Var i, n : integer;
S : Real;
Begin
Write(‘Nhập số nguyên dương n:’); Readln(n);
S := 0; i:=1;
Repeat
S:=S+i ; i :=i + 1; Until i > n; REPEAT
Lệnh (Khốilệnh); UNTIL <Điều kiện>
REPEAT Lệnh 1;
Lệnh n;
(22)Writeln(‘Tong cua’,’ ‘,n,’ ‘,’so nguyen duong dau tien la:’, S:10:2); Readln;
End
IV./ ĐẶC ĐIỂM CỦA TỪNG CẤU TRÚC LẶP :
Có kiểu cấu trúc lặp ngơn ngữ lập trình PASCAL FOR DO/DOWNTO TO
WHILE DO REPEAT UNTIL
Giống : Các cấu trúc lặp cho phép thực lặp lặp lại nhiều lần nhiều tác vụ
Khác :
- FOR dùng biết trước số lần lặp
- WHILE DO , REPEAT UNTIL dùng trước số lần lặp
- REPEAT UNTIL : dùng muốn lệnhđược thực hiện trước sau mới kiểm tra điều kiện lặp, tức lệnh phải thực tối thiểu một lần WHILE DO : điều kiện lặp được kiểm tra trước Nếu điều kiện đúng lệnh sau DOđược thực hiện, điều kiện sai lệnh sau WHILE DOđược thực hiện
Tóm lại :
V./ VÍ DỤ SỬ DỤNG CẤU TRÚC LẶP :
Viết chương trình nhập vào dãy số, số âm tính tổng chúng Việc tính tổng kết thúc nhập vào số –1
Program Tong; Var i : Integer;
S : Real; Begin
S:=0; Repeat
Write(‘Nhap vao cac so nguyen duong :); Readln(i);
If i >0 then S:= S+i; Until i = -1;
Writeln(‘Tong cac so nguyen duong la :’, S:10:2); Readln;
End
Bài 11:
CHƯƠNG TRÌNH CON: THỦ TỤC VÀ HÀM
(PROCEDURE & FUNCTION) I./ KHÁI NIỆM VỀ CHƯƠNG TRÌNH CON:
Trong viết chương trình thường gặp đoạn chương trình lập lập lại nhiều lần chỗ khác Để tránh rườm rà làm cho chương trình dễ đọc dễ hiểu, đoạn chương trìnhđược thay chương trình con tương ứng
Mặc khác, việc giải toán phức tạp thường bao gồm nhiều giai đọan, giai đoạn giải tốn đơn giản Do cần phân chương trình thành khối (module), khối bao gồm lệnh tổ chức thành chương trình con, sau xây dựng thành chương trình hồn chỉnh
(23)1./ Lợi ích việc sử dụng chương trình con:
+ Làm chương trình dễ đọc, dễ hiểu, dễ kiểm tra để phát lỗi sửa sai
+ Có thể nhiều người viết chương trình thơng qua module xây dựng nhiều người
Có hai loại chương trình con: Thủ tục (Procedure) Hàm (Function) 2./ Sự khác Thủ tục Hàm:
) Khác cách khai báo chương trình con:
+ Thủ tục khơng có giá trị trả về, nên khơng thể viết biểu thức
+ Hàm luôn có giá trị trả thơng qua tên hàm (giá trị kết thuộc kiểu xác định) sử dụng biểu thức
Kiểu giá trị hàm phải khai báo phần đầu hàm ) Khác lời gọi chương trình con:
+ Lời gọi thủ tục đứng riêng, tạo thành câu lệnh
+ Lời gọi hàm khơng đứng mình, mà nằm biểu thức (ví dụ lời gọi hàm câu lệnh gán đó)
3./ Cấu trúc chung chương trình:
Turbo Pascal quy định cấu trúc chung chương trình có thứ tự sau:
(Chú ý phần mô tả khai báo phải theo thứ tự bên dưới, phần bỏ khơng thể thiếu phần thân chương trình chính)
PROGRAM Tên_Chương_Trình; LABEL <Khai báo Nhãn>;
CONST <Khai báo Hằng>;
TYPE <Mô tả Định nghĩa kiểu liệu người sử dụng>;
VAR <Khai báo biến>;
(* -Các Chương Trình Con -*) PROCEDURE Tên_Thủ_Tục (Khai báo tham số có);
(*Khai báo Label, Const, Type, Var riêng Procedure cần*)
Begin
(* thân thủ tục *) End;
(* -*) FUNCTION Tên_Hàm (Khai báo tham số có): Kiểu liệu kết quả; (*Khai báo Label, Const, Type, Var riêng Function cần*)
Begin
(* thân hàm *) End;
(* -Thân chương trình -*) BEGIN
(24)4./ Ví dụ:
(*Chương Trình tính Tích Hai Tỉ Số *) (*Chương Trình nguồn: SUBPROC1.PAS*) program Tich2TiSo;
Uses Crt; Var
Tuso1,MauSo1,TuSo2,MauSo2 : integer; Tich : real;
(* -*) Procedure TieuDe;
Begin ClrScr;
writeln ('********************************************'); writeln ('* MINH HOA CHUONG TRINH CON *'); writeln ('********************************************'); End;
(* -*) Procedure Nhap (Var x,y : integer);
Begin Repeat
write ('Nhap Tu So: ');readln (x); write ('Nhap Mau So: ');readln (y);
write (' Co sua du lieu khong ? (Bam ESC de thoat) '); writeln;
until (readkey=#27); (* thủ thuật tạo vòng lặp để nhập liệu bấm ESC thoát*) End;
(* -*) Function Chia (x,y : integer) : real;
Begin
If y <> then Chia:=x/y (* gán giá trị trả cho hàm*) Else
Begin
writeln(#7#7,'Khong chia duoc vi Mau So = 0'); readln;
Halt; (* dừng chương trình trở hình Dos*) End;
End;
(* -Chuong Trinh Chinh -*) BEGIN
TieuDe; (* lời gọi thủ tục *)
writeln ('Nhap Tu So va Mau So 1'); Nhap (TuSo1,MauSo1);
writeln ('Nhap Tu So va Mau So 2'); Nhap (TuSo2,MauSo2);
Tich := Chia (TuSo1,MauSo1) * Chia (TuSo2,MauSo2); writeln ('Ti So (A/B)*(C/D) la: ',Tich:6:2);
readln; END
) Bạn đọc chương trình gõ lại máy để thực hiện
Bạn tìm hiểu nhiệm vụ thủ tục hàm chương trình
(25)II./ CÁCH VIẾT VÀ SỬ DỤNG THỦ TỤC VÀ HÀM: 1./ Thủ tục (Procedure):
a Cấu trúc thủ tục:
PROCEDURE Tên_Thủ_Tục (Khai báo tham số có);
(* Phần khai báo Label, Const, Type, Var riêng Procedure cần*)
Begin
(* thân thủ tục *) End;
⇒ Bắt đầu từ khóa PROCEDURE gọi đầu thủ tục ⇒ Phần khai báo cần
⇒ Sau phần khai báo phần thân thủ tục viết cặp từ khóa BEGIN END ⇒ Sau từ khóa END kết thúc dấu ;
b Vị trí thủ tục:
Trong chương trình có sử dụng thủ tục thủ tục phải mô tả trước phần khai báo chương trình, sau phần khai báo biến
c Sử dụng thủ tục: Lời gọi thủ tục:
Tên_Thủ_Tục ( tham số truyền vào có) 2 / Hàm (Function):
a.Cấu trúc hàm:
FUNCTION Tên_Hàm (Khai báo tham số có): Kiểu liệu kết quả; (*Phần khai báo Label, Const, Type, Var riêng Function cần*)
Begin
(* thân hàm *) Tên_Hàm:= <Biểu Thức>; End;
⇒ Bắt đầu từ khóa FUNCTION (phần đầu hàm)
⇒ Kiểu kết hàm kiểu: Integer, Real, Char, Boolean, String ⇒ Phần khai báo cần
⇒ Sau phần khai báo phần thân thủ tục viết cặp từ khóa BEGIN END ⇒ Trong thân hàm phải có câu lệnh để gán giá trị cho tên hàm:
Tên_Hàm:= <biểu thức xác định giá trị của hàm>; ⇒ Sau từ khóa END kết thúc dấu ;
b Vị trí hàm:
Được mô tả kế sau phần mô tả thủ tục, trước phần thân chương trình c Sử dụng hàm:
(26)3./ Các bước cần làm viết chương trình con: Bước1:
Đặt câu hỏi chương trình PROCEDURE hay FUNCTION ? Giải quyết:
⇒ Chương trình Function thỏa mãn đồng thời yêu cầu sau: + Nếu ta muốn nhận lại kết mà
+ Kết phải kiểu xác định (kiểu vơ hướng)
+ Có cần dùng tên Hàm để viết biểu thức không ? ⇒ Nếu khơng thỏa mãn tính chất chương trình Procedure Ví dụ:
Function BinhPhuong (X : Real) : Real; Begin
BinhPhuong := X*X; End;
(* -*) Procedure BinhPhuong (X: Real; Var X2 : Real);
Begin
X2 := X*X; End;
) Xem cách tính c = a2 + b2 + Nếu dùng Function:
c := BinhPhuong (a) + BinhPhuong (b); + Nếu dùng Procedure với biến trung gian Temp :
BinhPhuong (a,Temp); c := Temp; (* c := a2 *) BinhPhuong (b,Temp); c:= c+Temp; (* c:= a2 + b2 *) Bước2:
Giải quyết vấn đề tham số của chương trình Giải quyết:
⇒ Chương trình có cần tham số không ?
+Nếu đối tượng chương trình biến tồn cục biến không cần đưa vào làm tham số
+Nếu chương trình phải thực với nhiều đối tượng theo qui cách ta phải khai báo tham số phần đầu chương trình
⇒ Nếu có tham số loại tham số ?
+Các tham số đóng vai trị cung cấp liệu đầu vào Tham Trị +Các tham số kết thu lại từ chương trình Tham Biến
III./ BIẾN TOÀN CỤC, BIẾN ĐỊA PHƯƠNG, KHÁI NIỆM TẦM VỰC: 1./ Biến toàn cục:
Biến tồn cục hay cịn gọi biến toàn biến khai báo chương trình Các biến sử dụng nơi chương trình, kể chương trình
2./ Biến địa phương:
Biến địa phương hay gọi biến cục biến khai báo chương trình Biến có tác dụng chương trình mà khai báo
3./ Tầm vực biến:
(27)Ví dụ:
) Giả sử biến A1, A2 khai báo chương trình A (mức 1)
Như vậy, biến A1, A2 có thểđược sử dụng chương trình A (là nơi khai báo) trong chương trình AA, AB ABA (là chương trình nằm A)
Ngồi A1, A2 sử dụng chương trình B, BA chúng khơng chương trình phủ
) Tầm vực biến khai báo mức (ngồi chương trình chính) tồn chương trình
) Ở mức khác chương trình, ta có thể khai báo biến có tên với biến mức khác Tên biến biến mà hai biến khác với tầm vực khác
Ví dụ:
Trong chương trình có biến địa phương X chương trình chínhcó biến tồn cục có tên X Khi trong chương trình biến X địa phương có tác dụng, cịn khi chương trình kết thúc thì biến tồn cục lại lấy lại tác dụng nó
Program TamVuc; Var
I : integer; (* biến toàn cục *)
(* -*) Procedure DiaPhuong;
Var
I : integer; (* biến địa phương trùng tên *) Begin
I := 7;
writeln ( I : 6); End;
(* -*) BEGIN
I := 5;
writeln ( I : 6); DiaPhuong; writeln( I : 6); END
(* -Bạn cho biết kết chương trình ? -*) PROG P
PROC A PROC B
PROC AB PROC AA
PROC BA PROC ABA
Mức
Mức
(28)Bài 12:
KIỂU DỮ LIỆU CÓ CẤU TRÚC: TẬP HỢP (SET)
I./ KIỂU TẬP HỢP VÀ CÁC PHÉP TOÁN: 1./ Kiểu tập hợp:
a Đặt vấn đề:
- Trong số nguyên, có tập hợp như: “tập hợp số chẵn”, “ tập hợp số lẽ ”̃, “tập hợp số nguyên tố”
- Các tháng năm(1 12), ta có tập hợp: + Các tháng dài ngày: [1,3,5,7,8,10,12] + Các tháng mùa mưa: [4 10]
+Các tháng mùa khô: [1 3, 11, 12]
Vậy tập hợp bao gồm số đối tượng có chất, Pascal đưa kiểu liệu có cấu trúc gọi kiểu tập hợp để biểu diễn cho khái niệm
b Mô tả kiểu khai báo biến kiểu tập hợp: _ Mô tả kiểu:
TYPE
Tên kiểu tập hợp = SET OF < kiểu sở> _ Khai báo biến:
VAR
Tên biến: SET OF <kiểu sở> Trong đó:
<Kiểu sở>: phải kiểu sở có thứ tự nằm khoảng >255 (các kiểu chuẩn Byte, Char, Boolean, kiểu miền con)
Giá trị kiểu tập hợp tập hợp phần tử kiểu sở viết dấu [ ] Ví dụ:
TYPE
chucai= SET OF Char; chuso= SET OF 9;
ngay=(Hai, Ba, Tu, Nam, Sau, Bay, ChuNhat);
so= 100;
VAR
kitu:chucai; A,B,C: SET OF so;
Ngaytrongtuan: SET OF ngay;
2./ Các phép tóan kiểu tập hợp: a Phép gán:
Ví dụ:
kitu:= [ ]; {tập hợp rỗng: khơng có phần tử } kitu:= [‘A’ ’D’,’M’,’P‘];
Ngaytrong tuan:= [Ba, Sau]; b Phép hợp:
Kí hiệu: +
> Cho tập có phần tử thuộc tập Ví dụ:
A:= [3,5];
B:= [4 6,10,45];
(29)c Phép giao: Kí hiệu: *
> Cho tập có phần tử nằm chung tập Ví dụ:
C:=A*B; {Tập C [4,5] } d Phép hiệu:
Kí hiệu: -
> Cho tập có phần tử thuộc tập thứ không thuộc tập thứ Ví dụ:
C:=A-B; {Tập C [ 3] } C:=B-A; {Tập C [ 6, 10 ,45] }
e Phép thuộc: Sử dụng từ khóa IN > Cho kết : True False Ví dụ:
VAR
chu: char;
Giả sử ta có:
chu:=‘B’; Vậy:
chu IN chucai; { cho giá trị TRUE }
‘X’ IN kitu; { cho giá trị FALSE } f Các phép so sánh: < > , = , > = , < =
II./ VÍ DỤ:
Bài 1: Đọc vào N kí tự để xây dựng tập kí tự Alphabet Xem số N kí tự đưa vào có loại kí tự gõ vào, sau in kết
Ví dụ: N =
Nhập vào : a Xuất ra: A
c C
A a Ý tưởng:
_ Bài tập thể cách nhập xuất cho kiểu liệu tập hợp _ Nhập: N, phần tử tập Alphabet
_ Xuất: Các kí tự gõ (khơng phân biệt chữ hoa chữ thường) _ Các biến: N,i: integer
kitu : char
Alphabet: SET OF ‘A’ ’Z’ _ Giải thuật:
+ Alphabet=[ ];
+ Nhập N;
+ Lặp i = tới N làm: - Đọc kí tự
- Đổi kí tự nhập thành chữ hoa - Cộng dồn vào tập Alphabet Cuối lặp
+Lặp kitu = ‘A’ tới ‘Z’ làm:
Nếu kitu IN Alphabet : Xuất ( kí tự ) Cuối lặp
Chương trình:
PROGRAM DOCCHU;
TYPE
(30)Alphabet: chuhoa;
N, i : integer;
kitu: char;
BEGIN
Alphabet:= [ ] ;
write(‘Nhap N : ‘); readln(N); For i:=1 to N
BEGIN
write(‘Nhap ki tu thu’ , i , ‘: ‘) ; readln(kitu); writeln;
kitu:= UPCASE(kitu);
Alphabet:= Alphabet+kitu;
END;
writeln(‘Cac chu da go vao tap Alphabet la:’); For kitu:=‘A’ to ‘Z’
If (kitu IN Alphabet ) then writeln(kitu); END
Bài 2: Tìm số ngun tố khơng vượt q N ( với N<255) Áp dụng giải thuật sàng “ Eratosthène” Ý tưởng:
_ Tìm tập hợp số nguyên tố phạm vi từ đến N _ Số nguyên tố : + số nguyên dương >1
+ chia hết cho cho
_ Xuất phát từ tập số nguyên từ > N, lần gặp số nguyên tố, ta loại trừ khỏi tập tất số bội số nguyên tố
_ Các biến: Tapchuaxet, Tapsongto: SET OF Byte
N, sodangxet, tmp: integer
_ Giải thuật:
+ Tapchuaxet = [2 N] { Tập số xét} + Tapsongto = [ ] { ban đầu rỗng }
+ sodangxet = 2; { bắt đầu xét từ số 2}
+ Lặp:
- Trong ( sodangxet <=N) NOT(sodangxet IN Tapchuaxet) Làm: Tăng sodangxet lên
Cuối lặp
- Tapsongto= Tapsongto+ [sodangxet]
- tmp= sodangxet
- Trong ( tmp <=N) Làm:
_ Tapchuaxet= Tapchuaxet- [sodangxet]
_ tmp = tmp + sodangxet Cuối lặp
Cho đến : Tapchuaxet = [ ]
+ Xuất số nguyên tố Tapsongto
Bài 13:
KIỂU DỮ LIỆU CÓ CẤU TRÚC: MẪU TIN (RECORD)
I./ ĐẶT VẤN ĐỀ:
+ Chúng ta học kiểu liệu có cấu trúc mảng (Array), kiểu tập hợp (SET), kiểu ao gồm số thành phần thuộc kiểu định VD: phần tử Array[1 100] of Integer số nguyên Integer
(31)VD: Thông tin học sinh gồm thành phần: - Họ Tên học sinh (kiểu chuỗi)
- Phái (kiểu Boolean) - Năm sinh (kiểu chuỗi) - Nơi sinh (kiểu chuỗi) - Điểm trung bình (kiểu số)
Turbo Pascal cho phép sử dụng kiểu liệu mẫu tin hay gọi kiểu ghi (record) để trình bày thơng tin đối tượng có thơng tin thành phần phức tạp
Mỗi thông tin thành phần gọi trường (Field)
Mỗi mẫu tin (Record) nhiều trường, trường thuộc kiểu khác trường có tên gọi riêng
II./ RECORD: 1./ Định nghĩa:
Record tổ hợp kiểu liệu khác để thành kiểu liệu Ví dụ:
TYPE
Hocsinh= RECORD
Hoten: String[30];
Phai: Boolean;
Namsinh: Integer;
Noisinh: String[10];
DiemTB: Real;
END;
Ý nghĩa: Mô tả kiểu có tên Hocsinh thuộc kiểu liệu mẫu tin gồm trường Hoten, Phai, Namsinh, Noisinh, DiemTB với kiểu khác ( String[30], Boolean, Integer, ) chúng liên kết lại với để mô tả đối tượng Học Sinh
2./ Mô tả kiểu Record: TYPE
<Tên kiểu> = RECORD S1: <Kiểu liệu 1> ; S2: <Kiểu liệu 2> ; :
:
Sn: <Kiểu liệu n ; END;
3./ Các ví dụ: a Ví dụ 1: TYPE
Diachi= RECORD
So_nha: Integer;
Duong: String[20];
Thanh_pho: String[15];
END;
Bạn giải thích ý nghĩa mơ tả kiểu ? b Ví dụ 2:
TYPE
Date= RECORD
Day: 31;
Month: (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec );
Year: Integer;
(32)c Ví dụ 3: TYPE
Nhansu= RECORD
Ho_ten: String[30];
Ngay_sinh: Date;
Gioi_tinh: (Nam,Nu);
Hien_ngu: Dia_chi;
Luong: Real;
END;
Bạn giải thích ý nghĩa mơ tả kiểu ? d Ví dụ 4:
TYPE
Phai=(Nam,Nu); Nhansu= RECORD
Ho_ten: String[30];
Ngay_sinh: RECORD
Ngay: 31;
Thang: 12;
Year: Integer;
END;
Gioi_tinh: Phai;
Hien_ngu: Dia_chi;
Luong: Real;
END; Bạn giải thích ý nghĩa mô tả kiểu ? III./ SỬ DỤNG RECORD:
1./ Để thao tác làm việc với trường Record, sử dụng cú pháp: <Tên biến>.<Tên trường> 2./ Đọc liệu vào biến kiểu Record:
Ví dụ: Với mơ tả ví dụ Ta có đoạn chương trình: VAR
NV1,NV2: Nhansu;
i:Integer; BEGIN
write(‘Ho va Ten nhan vien 1: ‘);readln(NV1.Ho_ten); write(‘Ngay sinh: ‘);readln(NV1.Ngay_sinh.Ngay);
write(‘Thang sinh: ‘);readln(NV1.Ngay_sinh.Thang); write(‘Nam sinh: ‘);readln(NV1.Ngay_sinh.Nam);
write(‘Gioi tinh (1:Nam/2:Nu): ‘);readln(i);NV1.Gioi_tinh=Phai(i); write(‘Hien ngu tai: ‘);readln(NV1.Hien_ngu);
write(‘Luong can ban: ‘);readln(VN1.Luong); {Gán giá trị biến NV1 cho biến NV2} NV2:=NV1;
END
Dòng lệnh NV2:=NV1 thực chất việc thâm nhập vào trường riêng lẻ biến Record hay thâm nhập vào biến kiểu Record ? Bạn giải thích ?
3./ Xuất liệu từ biến kiểu Record: Ví dụ:
Với mơ tả ví dụ Ta có đoạn chương trình:
(33)Bài 13:
KIỂU DỮ LIỆU CHUỖI (STRING)
I./ KHAI BÁO KIỂU CHO DẠNG CHUỖI:
Chuỗi (String) dạng kiểu liệu không chuẩn, gồm chuỗi ký tự bảng mã ASCII Khi sử dụng người lập trình phải khai báo kiểu liệu tự đặt tên kiểu (kiểu liệu danh định)
Khai báo kiểu:
TYPE
Tên kiểu = STRING[n];
Với n số nguyên dương có giá trị từ 255 số ký tự tố đa chứa chuỗi Nếu không khai báo n xem n = 255
Ví dụ:
Type Hoten = String[20]; Lop = String[3];
Chuoi = String;
Hoten kiểu liệu danh định, liệu có kiểu Hoten chuỗi gồm tối đa 20 ký tự Lop kiểu liệu danh định, liệu có kiểu Lop chuỗi có tối đa ký tự
Độ lớn kiểu danh định dạng chuỗi N+1 Bytes
Ví dụ: liệu có kiểu Hoten chiếm giữ 21 bytes nhớ, tương tự kiểu Lop chiếm bytes II./ KHAI BÁO BIẾN CHO DẠNG CHUỖI:
Có thể khai báo biến có kiểu không chuẩn cách sau đây: 1./ Khai báo tường minh:
VAR
Tên biến: STRING[n]; Ví dụ:
Var Name: String[20]; Chuoi1: String;
Name biến kiểu chuỗi có tối đa 20 ký tự, chiếm 21 bytes nhớ Chuoi1 biến kiểu chuỗi có tối đa 255 ký tự, chiếm 256 bytes
2./ Khai báo danh định:
Để khai báo danh định kiểu ta phải khai báo kiểu trước khai báo biến theo kiểu khai báo TYPE
Tên kiểu = String[n]; …………
VAR
Tên biến: Tên kiểu; Ví dụ:
Type Hoten = String[20] ; DT = String ; Var HS: Hoten ;
(34)Về nguyên tắc, hai cách khai báo có tác dụng Tuy nhiên kiểu liệu khơng chuẩn hay liệu có cấu trúc, nên khai báo danh định kiểu chương trình Pascal, với tính cấu trúc, sử dụng nhiều đến chương trình con, theo quy định, tham số (Parameter) truyền qua chương trình phải khai báo danh định kiểu, nên tạo thói quen khai báo danh định kiểu cho biến có kiểu cấu trúc
III./ TRUY XUẤT DỮ LIỆU DẠNG CHUỖI
Đối với biến kiểu String, sử dụng phép gán, thủ tục Writeln, Write, Readln để truy xuất biến dạng
Ví du:
Type Hoten = String[20]; DT = String; Var HS: Hoten;
St: DT;
BEGIN
Write(‘Cho Biet Ho va Ten : ‘); Readln(HS);
St := ‘Trung Tam Tin Hoc THT’; Writeln(St);
Writeln(HS); Readln; END
Chú y: Đối với biến có kiểu dạng String, phải ý đến số ký tự tối đa cho phép kiểu String Trong ví dụ trên, khai báo HS biến có kiểu Hoten dạng kiểu String[20] HS lưu trữ chuỗi tối đa 20 ký tự Nếu gán cho chuỗi dài 20 ký tự chuỗi bị cắt, lấy 20 ký tự Ví dụ 1:
Var St: String[5]; BEGIN
St := ‘Turbo PASCAL’; Writeln(St);
END
Màn hình trình bày nội dung biến St Turbo (Chỉ có ký tự) Ví dụ 2:
Var St: String[5]; BEGIN
Write(‘Cho Mot Chuoi ‘); Readln(St); Writeln(St); END
Cho thực chương trình thấy kết sau: Cho Mot Chuoi AAAAAAAAAAAAAAA (Gõ từ bàn phím 15 ký tự A) AAAAA (xuất có ký tự A)
1./ Dạng liệu kiểu String
Giống liệu kiểu số nguyên số thực, liệu kiểu String xuất hình theo dạng mong muốn cách khai báo
<Tên biến> : K
Với K số nguyên, K > chuỗi ký tự canh phải, cách vị trí K khoảng Ví dụ:
St := ‘Turbo’;
Writeln(St : 10);
(35)Ví dụ:
type Chuoi = String; var
St1, St2: Chuoi; BEGIN
St1 := ‘Trung Tam Tin Hoc THT’; St2 := ‘Turbo PASCAL’;
Writeln(St1:30); Writeln(St2:30); Readln;
END
2./ Truy xuất đến ký tự liệu kiểu STRING:
Turbo Pascal cho phép truy xuất đến ký tự liệu kiểu String cách sử dụng cú pháp: TenBien[i]
Với i thứ tự ký tự đó, TenBien[i] xem liệu kiểu CHAR tác động toán tử hàm liệu kiểu Char
Ví dụ:
Var St: String[20]; ………
St := ‘TURBO PASCAL’;
Ta có phần tử chuỗi truy xuất là:
St[1] có kiểu Char, nội dung ‘T’, tương tự St[3] có nội dung ‘R’… IV./ CÁC HÀM VÀ THỦ TỤC TRÊN DỮ LIỆU DẠNG CHUỖI
1./ Phép cộng chuỗi
Các chuỗi nối với phép + Phép cộng chuỗi khơng có khả hoán vị toán hạng phép cộng liệu kiểu số nguyên số thực
Ví dụ:
St1 := ‘TURBO’; St2 := ‘PASCAL’;
Khi đó, St := St1 + St2 chuỗi St ‘TURBOPASCAL’ Nếu St := St2 + St1 chuỗi St chứa ‘PASCALTURBO’
2./ Một số hàm xử lý chuỗi (Bảng trang sau) Vài ví dụ minh hoạ:
1 Viết chương trình đổi số nguyên số thập phân thành số số nhị phân Ví dụ đổi số 12 (thập phân) thành chuỗi số ‘1100’ (nhị phân)
Program ThapPhan_NhiPhan; Var N, y: Word;
Bin: String[8]; Ch: String[1]; BEGIN
Write(‘Cho mot so nguyen: ‘); Readln(N); Bin := ‘’;
Repeat
Y := N Mod 2;
Str(Y, Ch);
(36)N := N div 2; Until N = 0;
Writeln(‘So nhi phan la: ‘,Bin); Readln;
END
Hàm cộng chuỗi Hàm CONCAT(s1 [,s2, , sn]:String): String Với s1, s2,…, sn: chuỗi cần nối
S1 := ‘TRUNG TAM ‘ S2 := ‘TIN HOC’ S3 := ‘THT’
St := Concat(St1, St2, St3);
Lấy chiều dài chuỗi
Hàm LENGTH(ST: String): Integer St: Chuỗi cần lấy chiều dài
Var cd: Integer; St: String; Begin …
St := ‘PASCAL’; Cd := Length(St); …
End Lấy chuỗi
con từ chuỗi
Hàm COPY(ST: String; INDEX: Integer; COUNT: Integer): String
ST: Chuỗi nguồn INDEX: Vị trí cần lấy COUNT: Số ký tự cần lấy
ST := ‘TURBO PASCAL’ Ketqua := Copy(ST, 7, 6);
Vị trí chuỗi con
chuỗi
Hàm POS(SUB: String; STR: String): Byte; SUB: Chuỗi cần tìm
STR: Chuỗi gốc để tìm
STR:=‘TURBO PASCAL 5.0’ SUB := ‘PASCAL’;
Vt := POS(SUB, STR); Xóa chuỗi
con chuỗi
Thủ tục DELETE(var ST: String; INDEX: Integer; COUNT: Integer);
ST: Chuỗi gốc cần cắt INDEX: vị trí cắt COUNT: số ký tự cắt
ST := ‘TURBO PASCAL’; Delete(ST, 1, 6);
Chèn chuỗi vào
chuỗi
Thủ tục INSERT(SUB: String; var ST: String; INDEX: Integer);
SUB: Chuỗi
ST: Chuỗi chèn SUB vào INDEX: Vị trí cần chèn ST
ST := ‘TURBO 5.0’ SUB := ‘PASCAL ’ Insert(SUB, ST, 7);
Đổi số thành chuỗi
Thủ tục STR(X; var ST: String); X: Giá trị kiểu số
ST: Giá trị kiểu chuỗi
X := 16; Str(X, ST);
Đổi chuỗi thành số
Thủ tục VAL(ST: String; var V; var CODE: Integer);
ST: Giá trị kiểu chuỗi V: Giá trị kiểu số
CODE: Mã lỗi trả (nếu có) Nếu thành công giá trị CODE trả
Var St: String; Num, Code: Integer; Begin
…
St := ‘123’;
Val(St, Num, Code); …
End
2 Tương tự đổi số thập phân thành số số thập lục phân Ví dụ đổi số 90 (thập phân) thành chuỗi ‘5A’ (thập lục phân)
Program ThapPhan_ThapLucPhan; Var N, y: Word;
Hex: String[8];
(37)BEGIN
Write(‘Cho mot so nguyen: ‘); Readln(N);
Hex := ‘’;
Repeat
Y := N Mod 16;
If y < 10 then Str(y, Ch) Else Ch := Chr(y + 55); Hex := Ch + Hex; N := N div 16; Until N = 0;
Writeln(‘So thap luc phan la: ‘, Hex); Readln;
END
V./ CÁC GIẢI THUẬT CƠ BẢN TRÊN DỮ LIỆU KIỂU CHUỖI
Trong ngôn ngữ Pascal chuẩn, liệu kiểu String, người lập trình phải khai báo kiểu dựa kiểu liệu cấu trúc khác, viết chương trình xử lý liệu kiểu chuỗi trình phức tạp Turbo Pascal cung cấp cho kiểu String để khai báo liệu dạng chuỗi đồng thời cung cấp hàm thủ tục xử lý chuỗi làm cho dễ dàng lập trình
Ở khảo sát giải thuật mang tính cách ứng dụng để xử lý chuỗi tạo tiền đề cho bước lập trình phức tạp
1./ Đổi chuỗi ký tự thường thành ký tự in Program Upper;
Var i: Byte;
St: String;
BEGIN
Write(‘Nhap chuoi : ‘); Readln(St); For i:=1 to Length(St)
St[i] := UpCase(St[i]);
Writeln(‘Chuoi HOA: ‘, St); Readln;
END
2./ Đổi ký tự In thành ký tự thường Program Lower;
Var Ch: Char; BEGIN
Write(‘Nhap ky tu : ‘); Readln(Ch);
If (Ch >= ‘A’) and (Ch <= ‘Z’) then Chr(ord(Ch)+ 32); Writeln(‘Ky tu thuong : ‘, Ch);
Readln; END
3./ Đổi chuỗi ký tự in thành chuỗi ký tự thường Program LowerStr;
Var i: Byte; St: String; BEGIN
Write(‘Nhap chuoi : ‘); Readln(St); For i:=1 to Length(St)
If (St[i] >= ‘A’) and (St[i] <= ‘Z’) then Chr(ord(St[i]) + 32); Writeln(‘Chuoi thuong: ‘, St);
Readln; END
4./ Cắt ký tự trắng bên trái chuỗi ký tự
Program LTrim;
(38)BEGIN
Write(‘Nhap chuoi: ‘); Readln(St); i := 1;
While St[i] = #32 Inc(i); Delete(St, 1, i-1); Writeln(St); Readln; END
5./ Cắt ký tự trắng bên phải Program RTrim; Var i: Byte;
St: String;
BEGIN
Write(‘Nhap chuoi : ‘); Readln(St); I := Length(St);
While St[i] = #32 Dec(i); St[0] := Chr(i);
Writeln(St); Readln; END
6./ Cắt khoảng trắng chuỗi Program Etrim; Var i: Byte; St: String; BEGIN
Write(‘Nhap chuoi: ‘); Readln(St); i := Pos(#32#32, St);
While i <> Begin
Delete(St, i, 1);
i := Pos(#32#32, St);
End; Writeln(St); Readln; END
BÀI TẬP
1 Nêu giải thuật viết chương trình nhập họ tên người từ bàn phím, xử lý chuỗi họ tên để chuỗi có dạng khơng có khoảng trắng bên phải, bên trái, khơng có liên tiếp ký tự trắng giữa, ký tự họ, chữ lót, tên viết In ký tự cịn lại viết thường
2 Khơng sử dụng thủ tục DELETE, nêu giải thuật viết chương trình xóa N ký tự từ ký tự thứ i chuỗi St
3 Không sử dụng thủ tụ INSERT, nêu giải thuật viết chương trình chèn chuỗi Obj vào chuỗi St vị trí thứ i
4 Viết chương trình nhập số thực, xuất lại số dạng chuỗi có dấu ‘,’ ngăn cách triệu, ngàn Nêu giải thuật Viết chương trình nhận chuỗi, xuất dạng hoán vị
MỘT SỐ CHƯƠNG TRÌNH MẪU XỬ LÝ CHUỖI Bài 1:
Viết chương trình nhập chuỗi kí tự từ bàn phím, xuất hình số thứ tự mã ASCII kí tự chuỗi
Program So_thu_Tu_ma_ASCII;
Var
(39)Begin
Writeln('SO THU TU MA ASCII CUA TUNG KY TU TRONG CHUOI'); Write('-Nhap chuoi: '); Readln(St);
For i:=1 To Length(St) Do Write(' ',Ord(St[i]));
Writeln(' Bam phim <Enter> de ket thuc'); Readln; End
Bài 2:
Viết chương trình đảo ngược chuỗi, ví dụ nhập chuỗi ‘ABCD’, đảo ngược thành ‘DCBA’
Program Dao_Chuoi;
Var
St:String; i:Byte;
Begin
Writeln('DAO NGUOC MOT CHUOI'); Write('-Nhap chuoi: '); Readln(St); Write('+Chuoi dao : ');
For i:= Length(St) DownTo Do Write(St[i]);
Writeln(' Bam phim <Enter> de ket thuc'); Readln; End
Bài 3:
Viết chương trình nhập vào chuỗi, mã hố chuỗi theo phương thức sau vị trí kí tự: ‘a’ > ‘b’, ‘c’ > ‘d’,…, ‘z’ > ‘a’ , giữ nguyên kiểu chữ hoa, chữ thường
program ma_hoa_chuoi;
var
s:string; i:byte; hople:boolean; begin
{kiem tra gia tri nhap Neu khong la chu se khong thoat} repeat
hople:=true;i:=1;
write('Nhap chuoi bat ky :'); readln(s);
while (upcase(s[i]) in ['A' 'Z']) and (i<=length(S)) i:=i+1; if i<length(s) then
begin
write('Ban nhap sai ! Nhap lai ');readln; hople:=false;
end; until hople=true; for i:=1 to length(s)
case s[i] of {cau truc case chi ma hoa cac ki tu } 'A' 'Y' : s[i]:=chr(ord(s[i])+1);
'a' 'y' : s[i]:=chr(ord(s[i])+1); 'Z' : s[i]:='A';
'z' : s[i]:='a'; end;
writeln('Chuoi da ma hoa: '); writeln(s); readln; end
Bài 4:
Viết chương trình nhập vào chuỗi, kiểm tra chuỗi có đối xứng khơng Ví dụ: - chuỗi ‘ABCDCBA’ chuỗi đối xứng
(40)Program Chuoi_Doi_Xung;
Var
St:String; i,l:Byte; Begin
Write('-Nhap chuoi: '); Readln(St); l:=Length(St);
i:=1;
While (i < l Div 2) And (St[i] = St[l-i+1]) Do Begin
i:=i+1;
If i < (l Div 2) Then Writeln('+Chuoi doi xung') End;
While (i < l Div 2) And (St[i] <> St[l-i+1]) Do Begin
i:=i+1;
If i < (l Div 2) Then Writeln('+Chuoi khong doi xung') End;
Readln; End Bài 5:
Nhập vào câu văn, đếm xem câu có từ
Program Dem_Tu;
{$V-}
Var St:String;
Function Sochu(Dong:String):Integer;
Var dem,i:Integer; Begin
Dem:=0; i:=1; Repeat
While ((UpCase(Dong[i]) < 'A') Or (UpCase(Dong[i]) > 'Z')) And (I <=Length(Dong)) Do i:=i+1; If i <= Length(Dong) Then Dem:=Dem + 1;
While ((UpCase(Dong[i]) >= 'A') And (UpCase(Dong[i]) <= 'Z')) And (I <=Length(Dong)) Do i:=i+1; Until i > Length(Dong);
Sochu:=Dem; End;
{ -} BEGIN
Write('-Nhap mot cau ca dao tuc ngu: '); Readln(St);
Writeln('-Cau co: ',Sochu(St),' tu'); Readln;
END Bài 6:
Nhập vào chuỗi họ tên, tách họ tên program tach_ho_ten;
uses crt;
var hoten,ho,ten:string; vitri:byte; procedure cat_trai(var st:string); begin
while (st[0]<>#0) and (st[1]=#32) delete(st,1,1); end;
procedure cat_phai(var st:string); begin
(41)procedure cat_giua(var st:string); begin
while pos(#32#32,st)<>0 delete(st,pos(#32#32,st),1); end;
begin clrscr;
write('nhap vao ho ten : '); readln(hoten);
cat_trai(hoten); cat_phai(hoten); cat_giua(hoten); ho:='';
ten:='';
if pos(#32,hoten)=0 then ten:=hoten else
begin
vitri:=length(hoten); repeat
vitri:=vitri-1; until hoten[vitri]=#32; end;
ho:=copy(hoten,1,vitri-1);
ten:=copy(hoten,vitri+1,length(hoten)-vitri); writeln('ho lot : ',ho);
write('ten : ',ten); readln;
end
Bài 14:
KIỂU DỮ LIỆU CÓ CẤU TRÚC: KIỂU MẢNG (ARRAY)
I./ MẢNG MỘT CHIỀU
Một mảng liệu gồm số hữu hạn phần tử có kiểu gọi kiểu Số phần tử mảng xác định từ định nghĩa mảng Mỗi phần tử mảng truy nhập trực tiếp thông qua tên mảng với dẫn truy nhập để hai ngoặc vuông [ ]
Định nghĩa kiểu mảng TYPE
Tên Kiểu = ARRAY[Kiểu dẫn] OF Kiểu phần tử
Ví dụ:
TYPE
T = Array[1 10] of Integer;
Khi việc khai báo biến A có kiểu mảng T viết sau: Var A: T;
Hoặc khai báo trực tiếp
Var A: Array[1 10] of Integer; Xét vài ví dụ:
Ví dụ 1: TYPE
AI = ARRAY[1 10] OF INTEGER; AC = ARRAY[1 10] OF CHAR;
Color = (Red, Blue, Green, White, Black); VAR A,B,C: AI;
X,Y: AC;
(42)Vao so lieu cho mang B : B[1] =
B[2] = 12 B[3] = 612 B[4] = B[5] = 34
Vao so lieu hang : 12 612 34 MC: ARRAY[‘A’ ’Z’] OF INTEGER;
MM: ARRAY[Color] OF BOOLEAN;
AI, AC hai kiểu mảng gồm 10 phần tử đánh số thứ tự từ đến 10 thông qua kiểu dẫn đoạn số nguyên 10 Các phần tử AI có kiểu Integer, cịn phần tử AC có kiểu Char A, B, C biến có kiểu AI
Còn M1, M2 hai biến định nghĩa kiểu trực tiếp khai báo Đây hai biến mảng gồm phần tử số nguyên, đánh số từ –3 đến
MC biến mảng gồm 26 số nguyên đánh số qua dẫn chữ từ ‘A’ đến ‘Z’
MM mảng gồm phần tử kiểu Boolean, phần tử đánh dấu qua dẫn tên màu sắc Một điều lưu ý khai báo mảng, kiểu dẫn kiểu đơn giản sau: ký tự (như biến MC), đoạn (thí dụ đoạn integer kiểu AI, AC), kiểu liệt kê người sử dụng định nghĩa biến MM, kiểu Boolean Kiểu dẫn không kiểu Real Integer
Nghĩa không viết:
X: ARRAY[INTEGER] OF INTEGER; Y: ARRAY[REAL] OF INTEGER;
Việc truy nhập vào phần tử mảng thực qua tên biến mảng, theo sau giá trị dẫn để ngoặc vuông như:
MM[Red] := True; MC[‘B’] := 5;
Do thời gian truy nhập vào phần tử mảng không phụ thuộc vào giá trị dẫn nên cấu trúc mảng thuộc kiểu cấu trúc truy nhập trực tiếp
Ví dụ
Gán tất giá trị mảng B (như định nghĩa trên) qua bàn phím, ta dùng thêm biến I có kiểu Integer để làm biến dẫn
Writeln(‘Vao so lieu cho mang B : ‘);
For i:=1 to
Begin
Write(‘ B[‘,I,’] = ‘);
Readln(B[I]);
End;
Kết thể qua hình với số người sử dụng gõ vào:
Nếu bạn muốn vào số liệu hàng ARRAY dịng hình bạn phải ghi rõ tất biến cần đọc (là phần tử mảng) thủ tục Readln Khi khơng áp dụng vịng FOR nữa:
Write(‘Vao so lieu hang : ‘);
Readln(B[1]), B[2], B[3], B[4], B[5]);
Giữa số gõ vào dấu cách (khoảng trắng) với khoảng trắng
Ví dụ
Cộng hai mảng C = A + B (A, B, C với định nghĩa thực chất mảng hay ma trận chiều) For I:=1 to 10 C[I} := A[I] + B[I];
Chú ý:
Lệnh gán C:=A+B; sai khơng thể cộng trực tiếp mảng với Nhưng A := B; với điều kiện A, B phải mảng giống Ví dụ
Giả sử ta muốn đếm 100 lần gõ ký tự vào qua bàn phím số lần xuất ký tự từ ‘A’ đến ‘Z’ Biến MC khai báo đóng vai trị đếm, biến ký tự Ch dùng biến dẫn VAR
I: Integer;
(43)So chu A = So chu D = 68 So chu M = 21 …
So chu Z =
M[1] = -1 M[2] = 456 M[3] = 34 M[4] = -312 M[5] = -56 Sau sap xep :
-312 -56 -1 34 456 MC: ARRAY[‘A’ ’Z’] Of Integer;
BEGIN
For Ch := ‘A’ to ‘Z’ MC[Ch] := 0; For i:=1 to 100
Begin
Readln(Ch);
Ch := Upcase(Ch);
MC[Ch] := MC[Ch] + 1; End;
For Ch := ‘A’ to ‘Z’
If MC[Ch] > then
Writeln(‘So chu ‘,Ch,’ = ‘, MC[Ch]:4);
END
Ví dụ 5: một phương pháp sắp xếp
Giả sử ta có dãy liệu (số thực, số ngun, kí tự,…) chứa trng mảng Yêu cầu phải xếp lại mảng thành dãy tăng dần (hoặc giảm dần) Sau ví dụ số phương pháp xếp mảng (s nguyên) Cách làm: đem phần tử thứ so sánh với phần tử tiếp theo, lớn đem đổi chỗ giá trị hai phần tử so sánh Kết sau lượt đầu, phần tử giữ giá trị nhỏ Tiếp tục vòng hai, đem phần tử thứ hai so sánh với phần tử tiếp theo…
Program Sap_Xep; Const
N = 5;
Var MI: ARRAY[1 N] Of Integer; T: Integer;
I, J: Integer; BEGIN
For i:=1 to n Begin
Write(‘ M[‘,i,’] = ‘); Readln; End;
For i:=1 to n – For j := i + to n Begin
If MI[i] > MI[j] then Begin
T := MI[i];
MI[i] := MI[j];
MI[j] := T;
End; End;
Writeln;
Writeln(‘sau sap xep :’); For i:=1 to n write(MI[i]:6); END
Kết chạy chương trình in hình: II./ MẢNG NHIỀU CHIỀU:
Kiểu phần tử mảng không bị hạn chế nhiều kiểu dẫn Nó cịn kiểu có cấu trúc Ví dụ sau cho thấy việc khai báo mảng có phần tử mảng
Ví dụ TYPE
PT = ARRAY[1 5] OF REAL;
(44)VAR
MPT: ARRAY[1 3] of PT;
Z: ARRAY[1 3, ‘A’ ’C’] OF COLOR; Hoặc viết lần sau:
Var MPT: ARRAY[1 3] of ARRAY[1 5] of Real; Hoặc thường viết gọn lại
Var MPT: ARRAY[1 3, 5] of Real;
MPT định nghĩa ma trận hai chiều hàng cột
Việc truy nhập mảng có định nghĩa phức tạp MPT tiến hành qua hai cách:
Qua hai lần đóng mở ngoặc vng Thí dụ: MPT[3][5] biểu diễn phần tử cuối mảng MPT
Hoặc thường viết đơn giản ngoặc vuông với dẫn cách dấu phẩy MPT[3,5], Z[3, ‘B’]
Cách viết MPT[i][j] MPT[i,j] tương đương Mảng định nghĩa hiểu ma trận nhiều chiều Phần tử MPT[i,j] phần tử hàng thứ i, cột thứ j MPT
Ví dụ
Ví dụ đầy đủ chương trình nhân hai ma trận vng cấp N: C = A*B
Phần tử ma trận tính theo cơng thức: Const
N=3 Phay = ‘,’; Var
A, B, C: ARRAY[1 N, N] of Integer; I, J, K: Integer;
BEGIN
For i:=1 to n
For j:=1 to n Begin
Write(‘ A[‘,i, Phay, j,’] = ‘); Readln(A[i,j]);
End; For i:=1 to n
For j:=1 to n Begin
Write(‘ B[‘,i,Phay,j,’] = ‘); Readln(B[i,j]);
End; For i:=1 to n
For j:=1 to n Begin
C[i,j] := 0; For k:=1 to n
C[i,j] := C[i,j] + A[i,k]*B[k,j]; End;
Writeln(‘Tich cua hai ma tran = ‘); For i:=1 to n
Begin
For j:=1 to n write(C[i,j]:5); Writeln;
End; END
∑ =
= n
k
kj ik
ij A B
C
1
(45)Trong chương trình trên, việc đọc ma trận tiến hành qua dòng cho phần tử mảng Bạn sửa lại đọc vào ma trận dạng dòng tương ứng với hàng ma trận:
For i:=1 to n Begin
Write(‘ Hang ‘,i,’ = ‘); Readln(A[i,1], A[i,2], A[i,3]); End;
Cách làm khơng cho ta dùng vịng For j:=1 to n … mà ta phải ghi trực tiếp phần tử cần đọc vào thủ tục Readln;
Mảng dùng làm tham số cho chương trình mảng không dùng làm kết FUNCTION Tuy nhiên cần lưu ý khai báo kiểu tham số vùng khai báo TYPE không định nghĩa kiểu trực tiếp phần khai báo tham số chương trình (Xem ví dụ khai báo kiểu MT đây) Ví dụ 8: cộng hai ma trận
TYPE
MT = ARRAY[1 3, 1…5] of Real; Var
X,Y,Z: MT;
(* -*)
Procedure CONG_MATRAN(A, B: MT; Var C: MT); Var i,j: integer;
Begin
For i:=1 to For j:= to
C[i,j] := A[i,j] + B[i,j];
End;
(* -*) BEGIN
…
CONG_MATRAN(X, Y, Z); …
END BÀI TẬP
Các tập sau nên viết dạng chương trình
1 Viết chương trình giải hệ phương trình tuyến tính ẩn dùng ma trận để chứa hệ số: a11.x + a12.y = c1
a21.x + a22.y = c2
2 Lập phương trình tạo mảng chứa cửu chương dùng cho học sinh Các khai báo mảng hay ma trận hay sai ?
ARRAY[10000 11000] OF REAL; ARRAY[3.4 4.8] OF INTEGER;
ARRAY OF ARRAY[1 3] OF INTEGER; ARRAY[10,13] OF INTEGER;
ARRAY[‘A’ ’Z’] OF ARRAY[‘A’ ’Z’] OF ‘A’ ’Z’;
4 Viết chương trình tìm số lớn số nhỏ mảng hay ma trận R gồm 15 số thực Giải hệ phương trình tuyến tính ẩn:
A11.X + A12.Y + A13.Z = U1; A21.X + A22.Y + A23.Z = U2; A31.X + A32.Y + A33.Z = U3;
6 Viết chương trình tính tổng bình phương số âm mảng số nguyên Viết chương trình lập ma trận chuyển vị ma trận A hai chiều
(46)Ma trận A có chiều NxL; Ma trận B có chiều LxM; Ma trận tích C có chiều NxM;
BÀI TẬP TỔNG HỢP VỀ MẢNG CHIỀU VÀ MẢNG CHIỀU
1 Lập trình đọc từ bàn phím dãy n số thực đếm có số dương, tính tổng chúng Đưa kết hình
2 Lập trình đọc từ bàn phím dãy n số xếp lại dãy số theo nguyên tắc sau: A1 đổi chỗ với An, A2 đổi chỗ với An-1, A3 với An-2,… Đưa kết hình
3 Lập chương trình nhập từ bàn phím ma trận U kích thước m x n ( m <= 20 , n <= 35) Tính ma trận S kích thước, đó:
Si,j = Ui,j > 0 Ui,j = -1 Ui,j <
Đưa hình ma trận S theo hàng cột
4 Lập trình đưa dãy số nguyên a1,a2, …., an vào máy từ bàn phím Xếp số vừa chia hết cho vừa lẻ lên đầu dãy, số vừa chia hết cho vừa chẵn xuống cuối dãy, số cịn lại dãy Đưa hình dãy ban đầu dãy xếp
5 Lập trình đưa dãy số nguyên a1,a2, …., an vào máy từ bàn phím Đưa hình số bé thứ tự dãy số
6 Lập trình đọc vào từ bàn phím dãy n số ( n < 100) Xếp số bé vào vị trí thứ k ( đọc từ bàn phím) Đưa hai dãy số hình
7 Lập chương trình xếp thứ tự dãy n số nguyên theo thuật toán xếp (tuỳ ý) Đưa dãy số xếp hình Yêu cầu: tăng dần giảm dần
8 Lập chương trình đọc từ bàn phím toạ độ n điểm (xi, yi) Sắp xếp lại n điểm theo thứ tự xi tăng, đưa kết hình
9 Lập chương trình làm việc sau: + Đọc dãy n số nguyên từ bàn phím + Xếp lại dãy theo thứ tự tăng
+ Đọc thêm số nguyên từ bàn phím
+ Chèn số vào vị trí dãy xếp ( Không xáo trộn xếp lại) + Đưa dãy ban đầu, dãy xếp dãy chèn hình
10 Đọc vào n số nguyên ( n < 100) từ bàn phím + Xóa số nhỏ 5, đưa kết hình + Xóa số thuộc đoạn [10, 100]
11 Lập trình đọc từ bàn phím dãy n số ngun đếm xem có số lẻ Đưa hình số lượng số lẻ
12 Lập trình đọc từ bàn phím dãy n số tính tổng tích chúng 13 Đọc vào n số nguyên từ bàn phím:
+ Tính tổng trung bình cộng số cho + Tính tổng số lẻ trung bình cộng số chẵn + Tính trung bình cộng số thuộc đoạn [ 20, 200] 14 Lập chương trình thực việc sau:
+ Đọc từ bàn phím dãy n số nguyên
+ Sắp số lẻ lên đầu dãy, số chẵn xuống cuối dãy
+ Đưa hình dãy số sắp, số lượng số lẻ tổng chúng
15 Lập trình đọc từ bàn phím dãy n số Xếp số bé lên đầu dãy, số cịn lại giữ ngun trình tự đọc vào Đưa dãy xếp hình
16 Lập trình đọc từ bàn phím dãy n số Xếp số lớn lên đầu dãy, số bé nhất, đến số lại Đưa hai dãy hình
(47)+ Tìm giá trị âm lớn n số cho
18 Lập trình đọc dãy n số ngun, sau làm cơng việc sau: + Sắp xếp số chẵn lên đầu dãy
+ Sắp xếp số chia hết cho lên đầu dãy + Sắp xếp số lẻ nhỏ 10 xuống cuối dãy 19 Đọc vào dãy số nguyên gặp số
+ Tính tổng số dương chia hết cho trung bình cộng số âm số đọc, không tính số
+ Đưa dãy đọc kết hình
20 Đọc vào dãy số tổng chúng lớn 1997 + Tính trung bình cộng số đọc vào Đưa kết hình + Xố bỏ số vị trí thứ k với k đọc từ bàn phím
+ Thay tất số âm dãy số + Thay tất số không âm dãy số
21 Lập chương trình nhập ma trận vng A cấp n với phần tử số nguyên Đưa ma trận tam giác dươi ma trận tam giác A hình Các liệu đưatừ bàn phím
22 Đọc vào ma trận A có n dịng, m cột, phần tử số nguyên Đếm xem có phần tử A[i,j] chia hết cho (i+j) tính tổng chúng Đưa ma trận A kết tính tốn hình
23 Đọc vào ma trận A có n dịng, m cột phần tử số nguyên Tính tổng phần tử dịng Đọc vào số ngun k, tính tổng phần tử cột k Đưa ma trận A kết tính tốn hình 24 Đọc vào ma trận A có n dịng, m cột, phần tử số nguyên Xếp lại cột ma trận A theo thứ tự
không giảm phần tử cột Đưa hai ma trận hình
25 Đọc vào ma trận A có n dịng, m cột, phần tử số nguyên Xếp lại dòng ma trận A cho tổng phần tử cột <= tổng phần tử cột <= … Đưa hai ma trận hình
Bài 15:
KIỂU DỮ LIỆU CÓ CẤU TRÚC: KIỂU TẬP TIN (FILE)
I./ KHÁI NIỆM VỀ TẬP TIN:
Tập tin hay Tập tin liệu tập hợp liệu có liên quan với có kiểu nhóm lại với tạo thành dãy Chúng thường chứa thiết bị nhớ ngồi máy tính (ví dụ đĩa mềm, đĩa cứng, băng từ,…) với tên
Tập tin liệu với liệu hiểu theo nghĩa rộng chương trình, số liệu, liệu khác kí tự, văn bản, …
Tập tin kiểu liệu có cấu trúc Định nghĩa tập tin có phần giống mảng chỗ chúng tập hợp phẩn tử liệu có kiểu Song mảng định nghĩa khai báo chương trình với số phần tửđã xác định số phần tử tập tin không xác định định nghĩa.
Định nghĩa kiểu tập tin T với phần tử có kiểu KPT (Kiểu phần tử) viết phần mơ tả kiểu với từ khóa FILE OF sau:
TYPE
T= FILE OF KPT ; Tức là:
Kiểu_tập tinT = FILE OF kiểu_phần_tửKPT; Sau khai báo biến tập tin (FileVar) phần khai báo biến:
VAR
(48)VAR
Biến_tập tin: FILE OF kiểu_phần_tử
Thí dụ:
TYPE {Định nghĩa kiểu tập tin} FileInteger = FILE OF integer; FileReal = FILE OF real; FileBoolean = FILE OF boolean; Nhansu = Record
Ten: string[30];
Tuoi: byte;
Luong: real;
End;
FNhansu = FILE OF Nhansu; Var {Khai báo biến tập tin}
F1,F2: FileInteger; {F1,F2 biến tập tin có phần tử số nguyên} F3: FileReal; {F3 tập tin số thực}
FNS: FNhansu; F5: FILE OF char;
F6: FILE OF ARRAy[1 5] OF integer;
F6 biến tập tin khai báo trực tiếp phần VAR với phần tử mảng chiều, độ dài mảng
FileInteger kiểu tập tin có phần tử số nguyên FileReal kiểu tập tin có phần tử số thực
Kiểu phần tử tập tin kiểu liệu (kiểu vô hướng, kiểu có cấu trúc mảng, ghi), trừ kiểu tập tin nghĩa khơng có kiểu tập tin tập tin
II./ CẤU TRÚC VÀ PHÂN LOẠI TẬP TIN: Mỗi tập tin cấu tạo sau:
⇒BOF Đầu tập tin (ở bên đỉnh) ⇒TOP Đỉnh tập tin, phần tử ⇒Phần tử n
⇒BOTTOM Đáy tập tin, phần tử cuối
⇒EOF Báo hiệu hết tập tin
Phân loại tập tin:
- Tập tin có kiểu ( Type File)
- Tập tin khơng có kiểu ( UnTyped File) - Tập tin văn ( Text File)
Cách khai báo: VAR
< Biến tập tin > : FILE OF < KIỂU>; {khai báo tập tin có kiểu} < Biến tập tin > : FILE; {khai báo tập tin khơng có kiểu}
< Biến tập tin> : TEXT; {khai báo tập tin văn bản} III./ MỞ TẬP TIN MỚI ĐỂ CẤT DỮ LIỆU:
Chương trình cất liệu vào tập tin sau ta làm thủ tục mở tập tin Việc mở tập tin ví muốn cất phiếu thư viện phải đóng phiếu gắn tên ô phiếu
Mở tập tin để ghi:
Turbo Pascal dùng cặp thủ tục liền theo thứ tự:
(49)Thí dụ:
ASSIGN(F1, ‘NGUYENTO.DAT’); (* gán tên tập tin NGUYENTO.DAT cho biến F1 *) REWRITE(F1);
Sau mở tập tin xong, tập tin rỗng chưa có phần tử nào, cửa sổ tập tin khơng có giá trị xác định trỏ vào cuối tập tin (EOF) Đồng thời cần lưu ý mở tập tin nhớ ngồi mà có sẵn tập tin có tên trùng với tên tập tin mở tập tin cũ bị xóa
Ghi giá trị vào tập tin với thủ tục WRITE: Thủ tục WRITE đặt giá trị vào tập tin Cách viết:
WRITE(FileVar, Item1, Item2, …, ItemN); Hay WRITE(Biến_tập tin, Các giá trị cần đặt vào);
Trong Item1, Item2, ItemN hằng, biến, biểu thức, tất nhiên Item phải có giá trị với kiểu phần tử tập tin Hoặc với I, J, K biến integer ta hồn tồn viết:
WRITE(F1, 3, I+2*J, K, 5, Ln(I_K));
Bước cuối việc đặt liệu vào tập tin đóng tập tin lại thủ tục Thí dụ tập tin F1: CLOSE(F1);
Sau viết thí dụ hồn chỉnh: tạo tập tin chứa số nguyên từ đến 100 với tên tập tin nhớ (đĩa mềm, …) NGUYEN.DAT
PROGRAM TAO_TEP_1; VAR
I: integer;
F: File of integer; BEGIN
ASSIGN(F, ‘NGUYEN.DAT’); REWRITE(F);
FOR I:=1 TO 100 DO WRITE(F, I); CLOSE(F);
END
Một tập tin dùng làm tham số chương trình (Procedure Function) với lời khai báo bắt buộc phải sau chữ Var tức tập tin dùng làm tham biến
PROGRAM TAO_TEP_2; TYPE
FI = FILE of integer; St30 = String[30]; VAR
MyFile: FI; FileName: St30;
(* -*) Procedure Tao_File(Var F: FI; Ten: St30); Var I: integer;
Begin
ASSIGN(F, Ten); REWRITE(F);
For i:=1 to 100 Write(F, I); CLOSE(F);
End;
(* -*) BEGIN
(50)Readln(FileName);
Tao_File(MyFile, FileName); END
Thí dụ cịn dùng thủ thuật gài tên tập tin vào chương trình chạy thơng qua biến FileName, tương ứng với tham số hình thức Ten Tham số thực MyFile tương ứng với tham số hình thức biến tập tin F Bạn cần để ý tới việc khai báo tham số tham biến (như biến F) hay tham trị (như Tên tập tin)
IV./ ĐỌC DỮ LIỆU TỪ MỘT TẬP TIN ĐÃ CÓ
Một tập tin dùng đầu để cất liệu lúc khơng thể làm đầu vào (nguồn) liệu được, nghĩa tập tin tuần tự, ta vừa ghi vừa đọc lúc Sau ghi liệu vào tập tin đóng lại, bạn đọc lại giá trị liệu tập tin
Một chương trình muốn sử dụng liệu chứa tập tin (trên đĩa từ) chương trình phải mở tập tin để đọc (giống việc độc giả mở ngăn kéo hộp phiếu để đọc) Các thủ tục dùng cho công việc sau:
Mở tập tin để đọc: Turbo PASCAL dùng cặp thủ tục với
ASSIGN(Biến_tập tin, Tên_tập tin); hay ASSIGN(FileVar, FileName); RESET(Biến_tập tin); hay RESET(FileVar);
Khi chạy chương trình đọc phần tử liệu vị trí cửa sổ trỏ Sau lệnh RESET, tập tin khơng rỗng cửa sổ trỏ vào phần tử tập tin chương trình copy phần tử tập tin trỏ sang biến đệm cửa sổ
ĐỌC DỮ LIỆU TỪ TẬP TIN:
Việc đọc phần tử từ tập tin sau mở tập tin thực thủ tục READ Cách viết:
READ(FileVar, Var1, Var2, …, VarN); READ(Biến_tập tin, biến);
Thực đọc giá trị vị trí cửa sổ trỏ (nếu có) gán sang biến tương ứng kiểu Sau cửa sổ dịch chuyển sang vị trí đọc giá trị cho biến khác Cứ đọc biến VarN
Một điều cần lưu ý thủ tục READ ta đọc giá trị tập tin để gán giá trị cho biến (Var1, Var2, …, VarN) cho biến mà Không thủ tục ghi vào tập tin, tham số thực Item (hằng, biến, biểu thức…)
Việc đọc phần tử tập tin cịn cần có điều kiện: phải thử xem tập tin có cịn phần tử khơng tức cửa sổ chưa trỏ đến EOF Hàm chuẩn EOF báo cho biết: cửa sổ trỏ vào cuối tập tin EOF(Biến_tập tin) = True, cịn cửa sổ trỏ vào phần tử tập tin EOF(Biến_tập tin) = False Do trước làm thao tác để đọc tập tin gán cho biến X, cần phải thử xem tập tin kết thúc chưa câu lệnh:
IF NOT EOF(Biến_tập tin) THEN READ(Biến_tập tin, X); Hoặc muốn đọc tất phần tử tập tin:
WHILE NOT EOF(Biến_tập tin) DO Begin
READ(Biến_tập tin, X); (* Đọc phần tử tập tin *) …
End;
Nếu cửa sổ trỏ đến phần EOF mà chương trình cố tình đọc gặp sai máy báo lỗi, sau chương trình dừng lại
(51)Bây lấy ví dụ cụ thể: giả sử tồn tập tin có tên NGUYEN.DAT tạo thủ tục mở tập tin cất liệu miêu tả Ta phải đọc giá trị thứ thứ ba tập tin gán cho hai biến A B tương ứng Giả sử tập tin khơng rỗng chứa ba phần tử để ta dùng phép thử EOF
Program DOC_TEP_1; Var A, B,C: integer;
FI: File of integer; Begin
ASSIGN(FI, ‘NGUYEN.DAT’); RESET(FI);
Read(FI, A); (* Đọc phần tử thứ tập tin biến A *) Read(FI, B); (* Đọc phần tử thứ hai tập tin biến B *) Read(FI, C); (* Đọc phần tử thứ ba tập tin biến C *) CLOSE(FI);
END
Ba lần đọc READ(FI, …) thay lệnh đọc nhất: READ(FI, A, B, B);
Sở dĩ phải đọc giá trị phần tử thứ tập tin có cấu trúc tuần tự, muốn đọc phần tử thứ ta buộc phải đọc qua phần tử thứ
Thí dụ minh hoạ việc đọc tất phần tử tập tin số nguyên ghi hình giá trị số ngun cuối ghi số phần tử tập tin Tên tập tin xác định lúc chạy chương trình khơng có từ lúc lập trình (‘NGUYEN.DAT’) Do khơng biết tập tin kết thúc đâu nên ta phải dùng phép thử NOT EOF
Program DOC_TEP_2; Var I: integer
SoPhanTu: integer; FI: File of integer; FileName: String[20]; Begin
Write(‘ Ten tep chua cac so nguyen: ‘); Readln(FileName);
ASSIGN(FI, FileName); RESET(FI);
SoPhanTu := 0;
WHILE NOT EOF(FI) DO Begin
Read(FI,I); (* Đọc phần tử tập tin biến I *) Writeln(I);
SoPhanTu := SoPhanTu + 1; (* Đếm số phần tử *) End;
CLOSE(FI);
Writeln(‘ So phan tu cua tep ‘,FileName,’ la ‘, SoPhanTu); End
Thí dụ minh hoạ việc copy từ tập tin số nguyên gọi tập tin nguồn sang tập tin khác Chương trình cho dạng thủ tục
TYPE
FI = File Of Integer; VAR
FS, FD: FI; (* FS: File Source, FD: File Destination *) Name1, Name2: String[30];
(52)Procedure Copy_File_Int(Var Source, Destination: FI); Var I: integer;
Begin
Reset(Source); Rewrite(Destination); While Not EOF(Source) Do Begin
Read(Source, I); Write(Destination, I); End;
Close(Source); Close(Destination); End;
(* -*) Begin
Write(‘Copy from File: ‘); Readln(Name1); Write(‘ to File: ‘); Readln(Name2); Assign(FS, Name1);
Assign(FD, Name2); Copy_File_Int(FS,FD); Writeln(‘ End of Copy’); End
TẬP TIN VỚI CÁC PHẦN TỬ CỦA TẬP TIN LÀ DỮ LIỆU CĨ CẤU TRÚC:
Các ví dụ đơn cử chương trình xử lý tập tin có phần tử liệu đơn giản integer, real, … Tập tin dùng mảng ghi phần tử tập tin (xem FNS, F6 đầu chương)
Vì phần tử tập tin ghi nên để ghi vào tập tin ta phải dùng Write(FNS, Nguoi);
Chứ ghi riêng rẽ thành phần, trường như: Write(FNS, Nguoi.Ten);
V./ TẬP TIN TRUY NHẬP TRỰC TIẾP:
Pascal chuẩn định nghĩa kiểu tập tin: tập tin truy nhập Tuy nhiên nhớ đĩa mềm, đĩa cứng, … cho phép tính tốn toạ độ phần tử tập tin độ dài phần tử tập tin Điều cho phép truy nhập trực tiếp vào tập tin cấu tạo logic tập tin dạng tức phần tử xếp sau phần tử Trong số chương trình Pascal gần có thủ tục để truy nhập trực tiếp: SEEK
Cách viết: SEEK(FileVar, No);
Với No số thứ tự phần tử tập tin Cần lưu ý phần tử tập tin đánh số 0 Theo thủ tục này, máy đặt cửa sổ tập tin vào phần tử thứ No Sau ta việc dùng thủ tục Read để đọc phần tử Write để đặt giá trị vào Như ta cập nhật (update) tập tin cách dễ dàng
Thí dụ:
Giả sử tập tin chứa 100 số nguyên từ đến 100 Ta phải kiểm tra xem phần tử thứ (đếm từ 0) tập tin có giá trị khơng, khơng phải sửa lại:
Var
F: File of Integer; Ch: char;
(53)…
Assign(F, ‘SONGUYEN.DAT’); Reset(F); SEEK(F, 2); (* Đặt cửa sổ vào vị trí thứ *); Read(F, I);
Writeln(‘ I = ‘,I);
Write(‘ Co sua lai khong ? (C/K)’); Readln(Ch); If Ch in [‘C’,’c’] then
Begin
SEEK(F, 2); (* Đặt lại cửa sổ vào vị trí thứ *) Write(‘ I = ‘); Readln(I);
Write(F, I); (* Thay đổi giá trị tập tin *) End;
…
CLOSE(F); End
Bạn áp dụng kỹ thuật cập nhật cho ứng dụng phức tạp Ví dụ cập nhật tủ hồ sơ cán hay kho tàng
VI./ CÁC THỦ TỤC VÀ HÀM XỬ LÝ TẬP TIN CỦA TURBO PASCAL
FileSize(FileVar) Hàm cho số phần tử tập tin FileVar Hàm nhận giá trị tập tin rỗng, khơng có phần tử
FilePos(FileVar) Hàm cho vị trí tức thời trỏ tập tin (cửa sổ) tập tin FileVar Phần tử phần tử số
Erase(FileVar) Thủ tục xóa file đĩa có tên ấn định với FileVar Rename(FileVar, Str); Thủ tục cho phép thay đổi tên tập tin với tên kiểu String chứa
trong xâu Str Bạn càn lưu ý phát tên phải không trùnh với tên tập tin có sẵn danh mục đĩa làm việc VII./ TẬP TIN VĂN BẢN: (TEXT FILES)
Trong Pascal có kiểu tập tin định nghĩa trước, tập tin văn định nghĩa với từ chuẩn TEXT
Thí dụ: khai báo biến tập tin F1, F2 có kiểu TEXT VAR
F1, F2: TEXT;
Các phần tử tập tin kiểu TEXT kí tự (các chữ viết) song Text File khác với File of Char chỗ
tập tin văn tổ chức thành dòng với độ dài dịng khác nhờ có thêm dấu hết dòng (End Of Line) hay dấu chấm xuống dòng Đó cặp kí tựđiều khiển: CR (Carriage Return: nhảy đầu dòng, mã số ASCII = 13) LF (Line Feed: nhảy thẳng xuống dòng tiếp theo, mã số ASCII = 10) Chúng nhận dạng để ngăn cách hai dãy kí tự tương ứng với hai dịng khác Dấu CR LF máy in dùng làm kí tự điều khiển việc xuống đầu dịng Trong chừng mực khơng xác lắm, tập tin văn coi tập tin Record (là dòng kí tự) có độ dài thay đổi
Thí dụ đoạn văn sau: VI DU VAN BAN 1234
HET
Được hiểu máy chứa tập tin văn thành dãy sau:
VI DU VAN BAN CR LF 1234 CR LF HET EOF
(54)Do tập tin văn tổ chức thành dòng nên việc ghi (write) đọc (read) tập tin văn có thêm thủ tục ghi đọc theo dòng Readln(Read Line) Writeln (Write Line) Chúng ta nghiên cứu kĩ thêm
Mặc dù tập tin văn chứa kí tự thủ tục Read(ln), Write(ln) có khả đặc biệt để ghi đọc số nguyên (integer), số thực (real), boolean string nhờ chuyển đổi thích hợp giá trị với dãy kí tự
VIII./ GHI VÀO TẬP TIN VĂN BẢN:
Chúng ta ghi giá trị kiểu integer, real, boolean, string vào tập tin văn lệnh write writeln Cách ghi cho phép chuyển giá trị số sang dạng kí tự, tức dạng đọc cách tường minh trang giấy viết bình thường, cho phép viết biểu bảng liệu,… với qui cách mong muốn
Các cách viết Có dạng viết thủ tục
Write(FileVar, Item1, Item2, … ItemN); Writeln(FileVar, Item1, Item2, … ItemN); Writeln(FileVar);
Thủ tục Write(FileVar, Item1, Item2, …, ItemN); sẽ viết giá trị Item1, Item2, …, ItemN, biến, biểu thức có kiểu đơn giản Integer, Real, Char, String, Boolean vào biến tập tin FileVar Các Item1, Item2, …, ItemN không thiết phải kiểu
Thí dụ: Var
I, J: integer; X: real; B: Boolean; S5: String[5]; Ta viết:
Write(FileVar, ‘Thi du: ‘, I, X, J, S5, 6, X + I); Trong Item là: Xâu kí tự, biến, hằng, biểu thức
Thủ tục Write để ghi vào tập tin văn khơng chấp nhận Item biến có cấu trúc (Array, Set, Record File) Ví dụ khơng thể viết:
Write(FileVar, Nguoi);
Vì Nguoi biến có cấu trúc Cách viết chấp nhận FileVar tập tin văn mà tập tin chứa ghi NhanSu ta thấy phần trước
Thủ tục Writeln(FileVar, Item1, Item2, …, ItemN); thực việc đưa thêm dấu hiệu hết dòng vào tập tin sau viết hết giá trị biến
Thủ tục Writeln(FileVar); thực việc đưa thêm dấu hiệu hết dịng (cặp kí tự điều khiển CR LF) vào tập tin, tức đưa dấu cách dòng vào tập tin
Như thủ tục Writeln(FileVar, Item1, Item2, …, ItemN); thực nhiều thủ tục Write với Writeln cuối sau (dạng khối lệnh)
BEGIN
Write(FileVar, Item1); Write(FileVar, Item2); …
Write(FileVar, ItemN); Writeln(FileVar); END;
(55)Nếu VI kí hiệu biểu thức nguyên: Write(FileVar, VI);
Sẽ viết vào tập tin FileVar giá trị nguyên VI với số chữ số cần thiết: Write(FileVar, VI:n); Sẽ bố trí n chỗ cho giá trị nguyên VI lề bên phải
Giả sử VI có giá trị 12345
Write(FileVar, VI, VI); cho 1234512345 Write(FileVar, VI:8, VI:8); cho _12345 _12345 Nếu VR biểu thức thực: Write(FileVar, VR:n);
Cho cách biểu diễn số thực dạng có số mũ E tức dạng viết khoa học dấu phẩy động, với n chỗ lề bên phải Trong cách biểu diễn chữ số chiếm chỗ sau:
#.#######E%## n-6 chữ số chữ số với # kí hiệu chữ số % kí hiệu dấu + dấu –
Như số chữ số chiếm từ chữ E trở ln ln (kí tự E với hai chữ số nguyên có dấu) Bên cạnh chỗ cho dấu chấm chữ số trước dấu chấm Tổng số chỗ bắt buộc phải có Số chỗ cịn lại qui cách viết n-6 giành cho chữ số sau dấu chấm, gọi chữ số có nghĩa
Thí dụ: VR := 123.123456;
Write(FileVar, VR:8); cho 1.23E+02 Write(FileVar, VR:n:m);
Máy bố trí n chỗ cho số thực VR có m chỗ giành cho phần thập phân (m chữ số sau dấu chấm) lề bên phải Nếu m = 0, máy đưa phần nguyên VR
Thí dụ: VR = 123.123456;
Write(FileVar, VR:10:2); cho 123.12 10 chỗ với chỗ thập phân Write(FileVar, VR:15:9); cho 123.123456000
NẾU VC LÀ MỘT KÍ TỰ (CHAR):
Write(FileVar, VC:n); cho giá trị VC với n chỗ lề bên phải Nếu n > 1, máy cho thêm n-1 dấu cách vào trước kí tự VC
Thí dụ: CH := ‘H’;
Write(FileVar, CH:1); cho H
Write(FileVar, CH:3); cho H {có dấu cách trước chữ H} NẾU VS LÀ MỘT BIỂU THỨC KÍ TỰ HOẶC MỘT STRING:
Write(FileVar, VS:n);
Cho giá trị VS với n chỗ lề bên phải Nếu n < độ dài String máy cắt bớt chữ cuối String
Thí dụ:
Write(FileVar, ‘Hello’:1); cho H Write(FileVar, ‘Hello’:3); cho Hel
Write(FileVar, ‘Hello’:10); cho _Hello Thí dụ:
Var
Ketqua: TEXT;
A: integer; B: real; C: String[20]; D: Boolean; Begin
A := 34; B := 3.14; C := ‘ END.’; D := True;
Assign(Ketqua, ‘KETQUA.TXT’); Rewrite(Ketqua);
Write(Ketqua, ‘Ket qua la: ‘); Write(Ketqua, A:10);
Write(Ketqua, B:10:4);
Ket qua la 34 4.14 END
(56)Writeln(Ketqua, C); Writeln(‘Dong 2! ‘:10, D);
Close(Ketqua);
END
Chương trình tạo tập tin văn với nội dung (xem hình) Các lệnh write ghép lại thành lệnh nhất:
Writeln(Ketqua, ‘Ket qua la : ‘, A:10, B:10:4, C);
Mặc dù A số nguyên song thủ tục write tự chuyển sang dạng kí tự tức dạng đọc Máy giành cho số A 10 chỗ ký tự, A có hai chữ số nên tám chỗ lại trắng Tương tự, số B viết khuôn khổ 10 chữ số với chữ giành riêng cho phần thập phân
Cịn C chất kí tự nên thủ tục write khơng phải chuyển đổi D kiểu boolean nên in từ TRUE FALSE tương ứng
IX./ ĐỌC DỮ LIỆU TỪ TẬP TIN VĂN BẢN:
Chúng ta đọc khơng kí tự từ tập tin văn mà cịn đọc lại số nguyên, số thực, boolean từ tập tin văn thông qua thủ tục:
Read(FileVar, Var1, Var2, …, VarN); Readln(FileVar, Var1, Var2, …, VarN); Readln(FileVar);
Trong Var1, Var2, … VarN biến thuộc kiểu Char, String, Integer, Real, Boolean muốn đọc cho tập tin văn kí tự tương ứng từ vị trí đọc (vị trí cửa sổ) phải diễn tả kiểu liệu cần đọc
Thủ tục Readln(FileVar, Var1, Var2, …, VarN); đưa cửa số tập tin sang đầu dòng sau đọc biến tương ứng
Thủ tục Readln(FileVar) đưa cửa sổ tập tin sang đầu dòng mà khơng đọc
Hàm chuẩn kiểu Boolean EOLN(F) phát dấu hết dòng EOLN (End Of Line) tập tin F, tránh sai sót đọc q dịng Khi EOF=TRUE EOLN có giá trị TRUE
INPUT tập tin văn chuẩn tương ứng với tập tin chứa liệu nguồn vào, máy tự động định nghĩa từ đầu INPUT thường bàn phím (trước máy đọc bìa, đọc băng) INPUT khơng phải ghi vào vị trí biến tập tin thủ tục Read Readln, nghĩa là:
Read(Var1) được hiểu ngầm Read(INPUT, Var1); Readln(Var1) được hiểu ngầm Readln(INPUT, Var1); Readln; được hiểu ngầm Readln(INPUT);
Dấu hiệu EOF tập tin văn qui ước kí tự số 26, thực CTRL_Z INPUT đọc liên tục ấn CTRL_Z tạo EOF(INPUT)=TRUE
While not EOF(INPUT) Begin
Readln(Var1 …); End;
Việc đọc văn tạm chia làm hai loại: + Xử lý văn bản, kí tự
+ Đọc dữ liệu số nguyên, số thực từ tập tin văn bản 1./ XỬ LÝ VĂN BẢN:
Ví dụ
Hãy lập chương trình đếm số chữ tập tin văn F Program Dem_chu;
Var
(57)I: integer;
FileName: String[30]; Begin
Write(‘ Ten tep: ‘); Readln(Filename);
Assign(F, FileName); Reset(F);
I := 0; (* Reset đếm *)
While not EOF(F) Begin
While not EOLN(F) Begin Read(F, Ch);
I := I + 1; End;
Readln(F); End;
Writeln(‘ So chu la : ‘, I);
Close(F);
End
2./ ĐỌC DỮ LIỆU SỐ NGUYÊN, SỐ THỰC TỪ TẬP TIN VĂN BẢN: Với thủ tục
Read(FileVar, Var1, Var2, …, VarN); Readln(FileVar, Var1, Var2, …, VarN);
Trong biến Var1, …, VarN biến số nguyên số thực Thủ tục Read Readln tự động biến đổi sâu kí tự thích hợp tập tin văn sang số nguyên số thực Nó xem xét dấu cách (space) dấu ngăn cách số Ví dụ: xâu kí tự thích hợp tương ứng với số ngun có kí tự chữ số ‘0’ ’9’ dấu ‘+’, ‘-‘, dấu chấm ‘.’ số thực, xây chữ có thêm dấu chấm chữ E biểu thị số mũ số thực cách biểu diễn khoa học Trong ví dụ xét tập tin F có nội dung:
Ket qua la 34 3.1400 END Dong 2! TRUE
Giả sử muốn đọc lại giá trị 34 3.14 vào hai biến I (integer) X (real) dòng thứ Vì biết 10 kí tự đầu khơng phải kí tự số nên ta phải đọc qua kí tự đầu dịng tương ứng với biến St10 có kiểu String[10]:
Readln(F, St10, I, J);
Với thí dụ dùng lệnh Read(F, I, J); vấp phải sai kí tự đầu (cụm từ ‘Ket qua la’) xâu kí tự thích hợp cho việc đọc biến nguyên I Máy báo lỗi chương trình phải dừng lại
Thủ tục SEEK, hàm FileSize, FilePos không áp dụng cho tập tin văn TEXT tính theo
đơn vị dịng (kí tự) với độ dài dịng thay đổi, khơng thể tính tốn vị trí đặt trỏ Tuy nhiên Turbo Pascal có hai hàm xử lý TEXT có phần tên Seek:
SeekEoln(FileVar);
Hàm kiểu Boolean, tương tự hàm Eoln song trước thử Eoln nhảy qua dấu cách Space Tab SekkEof(FileVar);
Hàm kiểu Boolean, tương tự hàm Eof song trước thử Eof nhảy qua dấu cách Space, Tab dấu cách dòng
Như vậy, thủ tục Read Readln tập tin văn đọc nhiều kiểu biến khác ghi tập tin văn (kí tự, xâu kí tự, số nguyên, số thực, logic boolean)
Thí dụ ứng dụng:
(58)Dòng chứa tên thuyết minh Dòng chứa đường gạch nét cho đẹp
Từ dòng trở hết tập tin: chứa liệu với thứ tự: ngày tháng, nhiệt độ, áp suất, độ ẩm
Ưu điểm việc dùng tập tin văn chứa liệu ta dùng chương trình soạn thảo văn (các Editor Editor Turbo Pascal mà bạn dùng để soạn chương trình) sau xem mắt, sửa, cập nhật liệu cách dễ dàng Điều không làm liệu tổ chức thành tập tin Record
Nhược điểm phương pháp cắt liệu dạng văn số ô nhớ chiếm nhiều Thí dụ nhiệt độ = 1656, dùng mã integer ln ln byte, dùng mã kí tự byte chứa kí tự chữ số ‘1’,’6’,’5’,’6’ Song nhược điểm phụ Nói chung bạn cần vào liệu để xử lý nên dùng tập tin văn ưu điểm kể Chắc bạn thắc mắc thêm: không đưa liệu vào qua bàn phím lúc chạy chương trình? Nếu làm bạn khơng chỗ đĩa từ (đó ưu điểm nhỏ) song có hai nhược điểm lớn sau: số liệu gõ vào sai bạn khơng sửa lại chương trình có sai sót bạn phải sửa chương trình cho chạy lại chương trình với việc nhập liệu (qua bàn phím) Điều thực nhiều số liệu có nhiều
Sau qui định cách viết văn chứa liệu, phải tuân thủ qui định dòng để đọc lại liệu cần xử lý Các liệu dòng cách dấu cách (Space) với số lượng không bị hạn chế, chủ yếu cách trình bày Giả sử tập tin văn có tên THANG10.DAT (nghĩa tập tin chứa liệu tháng 10) tạo Editor với nội dung sau:
Chương trình đọc lại liệu ngày để xử lý, với giả thiết dịng đầu (các dịng khơng chứa số liệu chắn tồn nên chương trình khơng kiểm tra EOLN trước đọc) Sau chương trình đọc dòng số liệu Với giả thiết số dịng chứa số liệu khơng biết trước nên ta dùng vòng While Sau kh xử lý số liệu, thơng báo số ngày (tương ứng với số dòng chứa số liệu)
PROGRAM DOC_DU_LIEU; Var
F: TEXT;
NhietDo, DoAm: integer; Ngay: Byte;
ApSuat: Real;
SoNgay: Byte; (* Số ngày tương ứng với số dòng chứa liệu *) BEGIN
Assign(F, ‘THANG10.DAT’); Reset(F);
Readln(F); (* Nhảy qua dòng *) Readln(F); (* Nhảy qua dòng *) SoNgay := 0;
While not SeekEoln(F) Begin (* Đọc số liệu ngày *)
Readln(F, Ngay, NhietDo, ApSuat, DoAm); SoNgay := SoNgay + 1;
(* Xử lý liệu tùy theo ý bạn *) End;
Writeln(‘ Ket qua xu li cua ‘, SoNgay, ‘ la : ‘); …
Close(F);
THOI TIET THANG 10 NAM 2000 30 298.5 45
2 35 100.8 24
(59)END
Một tập tin văn nạp vào nhớ để xử lý cho nhanh dạng mảng String Tất nhiên trước khai báo mảng phải dự phịng xem tập tin văn có nhiều dịng (700 ví dụ đây), dịng có nhiều kí tự Việc khai báo với kích thước dự phịng phí nhớ, khơng dùng hết Sau xử lý văn xử lý tập tin mà mảng ô nhớ đếm số chữ, đếm số từ, … Cuối cất mảng văn vào tập tin ban đầu muốn
VAR
VANBAN: ARRAY[1 700] OF String[80]; { Lưu ý số dòng bị hạn chế }
F: TEXT;
I, Sodong: integer; Name: String[30]; BEGIN
(*Đọc tập tin văn vào mảng *) Name := ‘VIDU.TXT’;
Assign(F, Name); Reset(F);
I := 1;
While not EOF(F) Begin
Readln(F, VANBAN[I]); { đọc dòng vào xâu kí tự } I := i + 1;
End;
Sodong := i – 1; (* số dòng văn *) …
Close(F); … END
Lưu ý: số dòng số chữ dòng khai báo VANBAN bị hạn chế máy tính, nhớ cho khai báo biến (tĩnh) bị chặn 64KB Muốn mở rộng bạn cần tham khảo biến động trỏ chương sau
Việc xử lý liệu làm thẳng với tập tin (không tập tin văn mà với tẹp kiểu khác nữa) tốc độ ghi/đọc đĩa từ chậm tốc độ ghi/đọc nhớ Người lập trình nên tổ chức cấu trúc liệu khác (mảng, tập, …) kiểu liệu nằm nhớ máy
KIỂM TRA TẬP TIN KHI MỞ
Nhiều vấn đề nảy sinh làm việc với tập tin như: dùng Reset(F) liệu tập tin F tồn chưa, ghi vào tập tin F liệu đĩa có cịn đủ chỗ chứa thêm liệu F hay không? Turbo Pascal cung cấp lời hướng dẫn (directive) cho chương trình dịch để đóng/mở việc kiểm tra sai lỗi trình vào/ra tập tin
{$I+} mở việc kiểm tra Khi gặp lỗi vào/ra, chương trình báo lỗi dừng lại Đây chế độc ngầm định (by default), nghĩa chương trình dịch luôn thực chế độ không báo rõ
{$I-} không kiểm tra lỗi vào/ra, chương trình khơng dừng lại treo tất thủ tục vào/ra khác có lời gọi hàm kết IOResult (hàm có sẵn Turbo Pascal, có kiểu integer) Khi có lời gọi hàm IOResult điều kiện sai bị xóa bỏ thủ tục vào khác tiếp tục hoạt động trở lại Lúc nhiệm vụ xử lý lỗi người lập trình Hàm IOResult = việc xảy tốt đẹp Sau ví dụ nhỏ kiểm tra vào mở file để đọc
(60)OK: Boolean; Begin
Repeat
Write(‘ Ten tep: ‘); Readln(FileName); Assign(F, FileName);
{$I-} (* Chuyển việc kiểm tra vào cho người dùng *) Reset(F);
OK := IOResult = 0;
{$I+} (* Sau dùng IOResult ta chuyển thành $I+ *) If not OK then write(‘Khong mo tep voi ten duoc ! ‘);
Until OK; End;
Toàn loại lỗi sau vào liệt kê phần phụ lục dạng thủ tục IOCheck Bạn cần xem kỹ phần phụ lục IOCheck để làm chủ việc vào liệu Mặt khác cần lưu ý {$I-} IOResult
được dùng không với thủ tục Reset mà với thủ tục khác như: ERASE, RENAME, WRITE, READ, …
BÀI TẬP
1./ Viết chương trình đọc tập tin văn tồn mã ASCII hình 2./ Viết chương trình đọc tập tin hình chữ
3./ Viết chương trình đọc tập tin văn bản, đánh số 1, 2, 3, … đầu dòng ghi lại thành tập tin có tên NEWFILE.TXT
4./ Viết chương trình đọc tập văn Tìm số ký tự dòng ngắn nhất, dài ký tự trung bình dịng