1. Trang chủ
  2. » Trung học cơ sở - phổ thông

Giao Trinh Pascal

60 5 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

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)

Mc đích ca giáo trình:

1. H tr thêm kiến thc k năng cho hc phn Tin Hc Đại Cương

2. Biết cách chuyn t vic gii quyết tốn thơng thường thành vic gii tốn máy tính

3. Rèn luyn tư v thut toán

4. Làm quen vi khái nim cơ bn v lp trình cho máy tính thơng qua ngơn ng lp trình Pascal

Lê Đức Long Khoa Tốn - Tin Trường ĐHSP Tp HCM

(2)

Bài 1:

VN ĐỀ - 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)

Mt s ngôn ng lp trình bc 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:

THUT TOÁN – THUT GII

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ờ

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 Hu hn : 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 hiu 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 tng 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 gii chp nhn được nhưng khơng hồn tồn đáp ng đầy đủ tiêu chun ca thut toán thường được gi thut gii

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 Thut gii :

- Đổ đầ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 BIU DIN THUT 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:

GII THIU NGÔN NG LP TRÌNH PASCAL

I./ NGUỒN GỐC :

- Pascal 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 liu được cu 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

- Mnh lnh được cu 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 cu 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:

CU TRÚC TNG QUÁT CA 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 }

LABELCONSTTYPEVAR

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 KIU D LIU ĐƠN GIN 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:

HNG, BIN, KIU, BIU THC,

LNH GÁN, LNH 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 TC NHP, XUT D LIU 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 LNH ĐIU KIN 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 LNH LP 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 : Thut 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 :

Thut 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)

Gii 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 ln 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 lnh đơ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)

Thut 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 :

Gii thích :

- Điều kiện biến hoặc biểu thức kiểu Boolean

- Trong điu kin đúng cịn thực lnh, điu kin 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 lnh đơ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 Thut 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 :

Gii thích :

- Điều kiện biến biểu thức kiểu Boolean

- Trong điu kin sai thì cịn thực lnh, điu kin đú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 lnh đơ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

Ging : 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 thc hin trước sau mi kim tra điều kiện lặp, tức lệnh phải thực ti thiu mt ln WHILE DO : điều kiện lặp được kim tra trước Nếu điều kiện đúng lệnh sau DOđược thc hin, điều kiện sai lệnh sau WHILE DOđược thc hin

Tóm li :

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 TC 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 loi 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

) Bn đọc chương trình gõ li máy để thc hin

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:= <Biu Thc>; 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:= <biu thc xác định giá tr ca 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 hi chương trình PROCEDURE hay FUNCTION ? Gii 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:

Gii quyết vn đề tham s ca chương trình Gii 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:

KIU D LIU CÓ CU TRÚC: TP HP (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:

KIU D LIU CÓ CU TRÚC: MU 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:

KIU D LIU CHUI (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:

KIU D LIU CÓ CU TRÚC: KIU MNG (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: mt phương pháp sp 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:

KIU D LIU CÓ CU TRÚC: KIU TP 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 bn, kí t

+ Đọc d liu s nguyên, s thc t tp tin văn bn 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 TP

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

Ngày đăng: 17/05/2021, 13:42

Xem thêm:

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

  • Đang cập nhật ...

TÀI LIỆU LIÊN QUAN

w