1. Trang chủ
  2. » Cao đẳng - Đại học

Lap Trinh Voi Turbo Pascal

274 12 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

B¶ng chän nμy cho phÐp thiÕt lËp c¸c lùa chän kh¸c nhau khi biªn dÞch vμ liªn kÕt ch−¬ng tr×nh. Víi ch−¬ng tr×nh lín, cã thÓ nhiÒu tÖp m· nguån. Trong ®ã chØ cã mét tÖp lμ tÖp chÝnh – [r]

(1)

LơI NOI đầU

L mt ngụn ngữ lập trình có cú pháp chặt chẽ, đơn giản v

dễ hiểu, Pascal đợc giảng dạy cho sinh viên tin học năm học

u tiờn Nó lμ ngơn ngữ sở để giới thiệu cho sinh viên lμm quen

với kĩ thuật xây dựng ch−ơng trình Ngoμi ra, cịn đ−ợc dùng để

trình bμy nhiều chuyên đề khác tin học năm

häc tiÕp theo

Nắm vững thnh phần bản, hiĨu râ c¸c u tè có

ph¸p cđa ngôn ngữ lập trình Pascal, l quan trọng Nhng vËn

dụng để xây dựng đ−ợc ch−ơng trình lμ điều quan trọng

nhÊt

Qua kinh nghiệm nhiều lần giảng dạy ngôn ng÷ Pascal cho

các đối t−ợng sinh viên khác nhau, nhận thấy sinh viên

lóng tóng nhÊt ë kh©u vËn dơng x©y dùng chơng trình cụ thể,

không biết lm no, đâu

Giỏo trỡnh ny đặt trọng tâm vμo trình bμy kĩ thuật xây dựng

chơng trình song song với việc giới thiệu ngôn ngữ lập trình

Pascal Các ví dụ ứng dụng tổng hợp cuối chơng đợc chọn lọc

để minh hoạ vấn đề lí thuyết trình bμy ch−ơng

Nh÷ng vÝ dơ ứng dụng ny có liên quan chặt chẽ với nhau, ®−ỵc

phát triển hoμn thiện dần cách có hệ thống để sinh viên hiểu

rõ b−ớc xây dựng ch−ơng trình, từ thơ sơ, đơn giản đến hoμn

thiƯn, hiƯu qđa h¬n

Vì l hệ thống lại bi giảng lần nên

chn cũn nhiu thiếu sót Rất mong đóng góp ý kiến

thầy, cô đồng nghiệp nh− bạn sinh viên lμ đối t−ợng

phôc vụ giáo trình ny.

(2)

NÔI DUNG

LơI NOI đầU i

Ch−¬ng - Giíi thiƯu chung 1

1 Các khái niệm

1.1 Mở đầu

1.2 Các kí tự

1.3 Các từ khoá

1.4 Tên - Identifier

1.5 Tên chuẩn

1.6 Câu lệnh

2 Phát triển chơng trình Pascal 2.1 Cấu trúc chơng trình Turbo Pascal 2.2 Các bớc xây dựng chơng trình Môi trờng phát triển tích hợp Turbo Pascal

3.1 Các công cụ phát triển

3.2 Các chức v cách dùng

3.3 Các bớc xây dựng chơng trình môi trờng Turbo Pascal 11

Câu hỏi v bI tập 12

Chơng - Các kiểu liệu chuẩn, hm chuẩn 14

1 Các kiểu liệu chuẩn 14

1.1 Khái niệm kiểu liệu 14

1.2 Phân loại kiểu d÷ liƯu TurboPascal 14

1.3 Các kiểu đơn giản chuẩn 16

2 C¸c hμm chuÈn 18

2.1 Bảng hm chuẩn 19

2.2 Sử dụng 20

C©u hái vμ bμi tËp 20

Ch−ơng - Các khai báo vμ câu lệnh đơn giản 21

1 Khai b¸o h»ng vμ biÕn 21

1.1 Khai b¸o h»ng 21

1.2 Khai b¸o biÕn 22

2 Biểu thức ngôn ngữ Pascal 23

2.1 Biêủ thức l 23

2.2 Bảng thø tù −u tiªn 24

2.3 Viết biểu thức 25

3 Các câu lệnh đơn giản 25

3.1 LƯnh g¸n 26

3.2 Lệnh in mμn hình khơng kèm định dạng 26 3.3 Quy cách mặc định in kiểu liệu 27

(3)

3.5 LƯnh in m¸y in 29 3.6 LƯnh nhËp d÷ liƯu tõ bμn phÝm 30 Mét sè hμm, thđ tơc tr×nh bμy mμn h×nh 32

Câu hỏi v bi tập 32

Chơng 4- Các cấu trúc điều khiển 35

1 Câu lệnh ghÐp 35

2 C©u lƯnh IF 35

2.1 Cú pháp v công dụng 36

2.2 Các ví dơ minh ho¹ 37

2.3 If lång hay d·y if 38

2.4 AND hay IF lång 39

3 C©u lƯnh CASE 40

3.1 Có ph¸p vμ t¸c dơng 40

3.2 VÝ dơ minh hoạ 41

3.3 Chú ý 42

3.4 Các lỗi thờng gặp 42

4 Câu lệnh FOR 43

4.1 Có ph¸p vμ t¸c dơng 43

4.2 Ví dụ minh hoạ 44

5 Câu lệnh Repeat 45

5.1 Có ph¸p vμ t¸c dơng 45

5.2 Ví dụ minh hoạ 46

6 Câu lệnh While 48

6.1 Cú pháp v công dụng 48

6.2 Ví dụ minh hoạ 49

7 Xây dựng cấu trúc lặp 50

7.1 Điều khiển vòng lặp giá trị canh chừng 50

7.2 Điều khiển vòng lặp cờ báo 51

8 Các lệnh kết thúc sớm vòng lặp chơng trình 51 8.1 Lệnh nhảy không điều kiện - goto 51

8.2 Lệnh chấm dứt sớm vòng lặp 52

8.3 Lệnh thoát khỏi chơng trình 53 8.4 Lệnh dừng chơng trình bất thờng 53

Câu hỏi v bi tËp 53

Ch−ơng - Định nghĩa Các kiểu liệu đơn giản 56

1 Khai b¸o kiĨu liệu 56

1.1 Cú pháp chung 56

1.2 VÝ dơ 56

2 KiĨu liƯt kª 57

2.1 Định nghĩa v cú pháp 57

2.2 TÝnh chÊt vμ c¸c phÐp to¸n 58

2.3 Ví dụ minh hoạ 60

3 Kiểu đoạn 60

3.1 Định nghĩa v cú pháp 60

3.2 VÝ dơ minh ho¹ 62

(4)

4.1 Định nghĩa v cú pháp 62

4.2 Các phép toán tập hợp 63

4.3 Ví dụ minh hoạ 64

Chơng - Kiểu mảng 66

1 Mảng chiều 66

1.1 Định nghĩa vμ có ph¸p 66

1.2 C¸c tÝnh chÊt 67

1.3 Tại nên khai báo kiểu 68

1.4 Ví dụ minh hoạ 68

2 Mảng nhiều chiều 69

2.1 Định nghĩa cú pháp v cấu tróc 69

2.2 VÝ dơ minh ho¹ 70

3 Tìm kiếm mảng 71

3.1 Tìm kiếm 71

3.2 Tìm kiếm nhị phân 72

4 Một vi cách xếp mảng 73

4.1 Ph−ơng pháp đổi chỗ trực tiếp 73

4.2 Phơng pháp chèn trực tiếp 75

4.3 Phơng pháp chän trùc tiÕp 77

C©u hái vμ bμi tËp 79

Chơng - Kiểu xâu kí tự 81

1 Có ph¸p vμ cÊu tróc 81

1.1 Cú pháp 81

1.2 Cấu trúc kiểu xâu kí tù - Truy cËp trùc tiÕp tõng thμnh phÇn 82

2 Thao tác với xâu kí tự 84

2.1 C¸c phÐp to¸n 84

2.2 C¸c thđ tơc v hm xâu kí tự 84

Câu hỏi v bi tập 86

Chơng - Kiểu ghi 88

1 Định nghĩa v khai báo 88

1.1 Định nghĩa 88

1.2 Khai báo kiểu b¶n ghi 88

2 Sư dơng 90

2.1 Truy cập thnh phần 90

2.2 Các phép toán với ton ghi 90 2.3 Đọc vo, viÕt víi mét biÕn kiĨu b¶n ghi 91

2.4 C©u lƯnh With 92

3 Bản ghi có cu trỳc thay i 93

3.1 Định nghĩa v có ph¸p 93

3.2 Sử dụng ghi có cấu trúc thay đổi 94

Ch−¬ng - KiĨu tÖp 98

1 Các khái niệm vμ định nghĩa 98

1.1 Mục đích sử dụng tệp 98

(5)

1.3 TƯp truy cËp tn tù 99

2 Viết tệp, đọc vμo từ tệp 100

2.1 Mở tệp để viết 100

2.2 ViÕt d÷ liƯu tƯp 101

2.3 Mở tệp c vo 102

2.4 Đọc liệu vo tõ tÖp 102

2.5 TÖp truy cËp trùc tiÕp 103

3 C¸c thao t¸c kh¸c 104

3.1 Mét sè hμm vμ thđ tơc víi tƯp 104

3.2 Bẫy lỗi mở tệp 105

4 Tệp văn 107

4.1 Định nghĩa v cấu trúc 107

4.2 Viết tệp văn 108

4.3 Đọc vo từ tệp văn 108

4.4 Các hm, thủ tục chuẩn khác cho tệp văn 109

4.5 Các thiết bị vo chuẩn 111

5 Tệp không định kiểu 112

5.1 Định nghĩa v cấu trúc 112

5.2 Các hm, thủ tục khác 112

Câu hỏi v bi tập 114

Chơng 10 - Chơng trình 115

1 Chơng trình - Hm v thủ tục 115 1.1 Tại cần sử dụng chơng trình 115

1.2 Khai báo chơng trình 115

1.3 Xây dựng chơng trình 117

1.4 Lời gọi chơng trình 117

1.5 Ví dụ minh hoạ 118

2 Hμm hay thđ tơc, tham biÕn hay tham trị 120

2.1 Phân biệt hm với thủ tơc 120

2.2 Ph©n biƯt tham biÕn vμ tham trị 121 2.3 Một vi lu ý xây dựng chơng trình 122

2.4 Khai báo trớc - Forward 124

3 Chơng trình lồng 125

3.1 Biến ton cục, biến cục bộ, tầm tác dụng 125

3.2 Minh hoạ 126

Câu hỏi vμ bμi tËp 128

Ch−ong 11 - ThiÕt kÕ chơng trình 129

1 Phơng pháp xây dựng chơng trình 129

1.1 Khái niệm Công nghệ phần mềm 129

1.2 Chu kì phát triển phần mềm 129

1.3 VÝ dơ minh ho¹ 130

1.4 Lập trình mơ đun - Modula programming 131 1.5 Thủ tục hoá - Procedural abstraction 133 Thiết kế chi tiết dần b−ớc 133 2.1 Sơ đồ cấu trúc ch−ơng trình - structure chart 133

(6)

3 Tính đệ quy vμ thuật giải đệ quy 138

3.1 Tính đệ quy 138

3.2 Thuật giải đệ quy 139

3.3 Thiết kế giải thuật đệ quy 140

4 Một số ví dụ thuật giải đệ quy 141

4.1 Bμi to¸n th¸p Hμ néi 141

4.2 Bμi to¸n vÕt mùc 142

4.3 Tìm kiếm nhị phân 144

4.4 Sắp xếp kiểu phân đoạn hay xếp nhanh - Quick Sort 145 Tự xây dựng th viện chơng trình - Units 147 5.1 Sử dụng lại chơng trình 147

5.2 CÊu tróc cđa mét unit 147

5.3 Biên dịch v sử dụng 149

5.4 Ví dụ minh hoạ 149

5.5 So sánh việc dùng Unit víi chÌn trùc tiÕp tƯp m· ngn 150 5.6 C¸c unit chn cđa Turbo Pascal 150

6 Giíi thiƯu Unit CRT 151

6.1 C¸c biÕn 151

6.2 C¸c hμm, thđ tơc 152

6.3 Mμu sắc vμ chế độ mμn hình văn 153

6.4 Xư lÝ gâ phÝm 156

6.5 C¸c thđ tơc kh¸c 156

7 VÝ dơ øng dơng - Lμm bảng chọn 157

7.1 Các bớc xây dựng bảng chän 157

7.2 Ph©n tÝch thiÕt kÕ chi tiÕt dần bớc 158

7.3 Chơng trình chi tiết 162

7.4 Chun thμnh Unit b¶ng chän 165

8 Một chơng trình ứng dụng 167

8.1 Phân tÝch thiÕt kÕ 167

8.2 TriÓn khai chi tiÕt chơng trình 170

Câu hỏi v bi tập 174

Ch−ơng 12 - Con trỏ vμ cấu trúc liệu động 176

1 Con trá 176

1.1 Bin tnh v bin ng 176

1.2 Định nghĩa vμ khai b¸o 177

1.3 Các phép tốn trỏ 178

2 Biến động 179

2.1 Cấp phát vùng nhớ vμ truy cập biến động 179 2.2 Giải phóng biến động, thu hồi vùng nhớ 180 Con trỏ không định kiểu - Pointer 180

3.1 Định nghĩa 180

3.2 ứng dụng 181

4 Vùng ngăn xếp v vùng Heap 182

4.1 Khái niệm 182

4.2 Giải toả heap 183

(7)

C©u hái vμ bμi tËp 184

Chơng 13 Danh sách & danh sách móc nối 187

1 Danh sách mảng 187

1.1 Mô hình danh sách 187

1.2 Danh sách biểu diễn cấu trúc mảng 188 1.3 Các phép toán danh sách mảng 188

1.4 Các u, nhợc điểm 189

1.5 Ví dụ minh hoạ 190

2 Danh sách kiểu ngăn xếp - Stack 193

2.1 Định nghía danh sách kiểu ngăn xếp 193 2.2 Biểu diễn danh sách kiểu ngăn xếp 194 2.3 Các phép toán kiểu ngăn xếp 194 Danh sách kiểu hμng đợi - Queue 195 3.1 Định nghĩa danh sách kiểu hμng đợi 195 3.2 Biểu diễn danh sách kiểu hμng đợi mảng 196

3.2 C¸c phÐp to¸n 196

4 Danh sách ni n 198

4.1 Mô tả 198

4.2 CÊu tróc mãc nèi 198

4.3 C¸c phÐp to¸n 200

5 Danh s¸ch nèi kÐp 202

5.1 CÊu tróc danh s¸ch nèi kÐp 202

5.2 C¸c phÐp to¸n víi danh s¸ch nèi kÐp 203 VÝ dơ øng dơng cđa danh s¸ch mãc nèi 205 6.1 Cải tiến chơng trình quản lí hồ sơ 205

6.2 Ph©n tÝch thiÕt kÕ 205

6.3 TriĨn khai chi tiÕt 207

C©u hái vμ bμi tËp 213

Chơng 14 - Dồ hoạ 215

1 Các khái niệm 215

1.1 Hai ch hiển thị mμn hình 215

1.2 Khởi tạo vμ đóng chế độ đồ hoạ 216 1.3 Một ch−ơng trình đồ hoạ đơn giản 218 1.4 Mμu sắc, kiểu nét vẽ, kiểu tô 218 Các thủ tục đồ hoạ th−ờng dùng 219 2.1 Di chuyển, vẽ điểm, đoạn thẳng 219

2.2 C¸c thđ tơc vÏ h×nh 220

2.3 Tû lƯ biĨu kiÕn 221

2.4 Viết chữ mμn hình đồ hoạ 222

3 Các thủ tục môi tr−ờng đồ hoạ 224

3.1 C¸c thđ tơc thiÕt lËp mμu 224

3.2 Các thủ tục mẫu tô, mẫu nét vẽ 225

3.3 ViewPort 229

4 Vẽ đồ thị hμm số 230

(8)

4.2 Ch−¬ng trình chi tiết 232 4.3 Chuyển thnh chơng trình 234

5 Lm hoạt hình 235

5.1 Di chuyển hình vẽ trơn 235 5.2 Di chuyển hình vẽ hình ảnh tĩnh 236 5.3 Sử dụng phép lật trang mn hình 240

Câu hỏi vμ bμi tËp 242

Ch−ơng 15 - Thâm nhập hệ thống vμ Hệ điều hμnh DOS 244 Gọi thực chức ROM-BIOS vμ DOS 244 1.1 Các ghi 8086 vμ địa nh 244

1.2 Các ngắt - interrupt 245

1.3 Thâm nhập trực tiếp qua ghi v ngắt 246

1.4 Các ví dụ minh hoạ 247

1.5 Sư dơng c¸c hμm, thđ tơc cđa unit DOS 250

2 §iỊu khiĨn cht 251

2.1 Toạ chut 251

2.2 Ngắt điều khiển chuột $33 252

2.3 VÝ dơ minh ho¹ 253

2.4 Th− viƯn c¸c thđ tơc thao t¸c cht 255

2.5 ứng dụng vo bảng chọn 256

3 Thâm nhËp trùc tiÕp vμo bé nhí vμ cỉng 257

3.1 Th©m nhËp trùc tiÕp bé nhí 257

3.2 Thâm nhập cổng 259

4 Chơng trình thờng trú 260

4.1 Khái niệm 260

4.2 Cách xây dựng chơng trình thờng trú 261

4.3 Ví dụ minh hoạ 261

(9)

Chơng Giíi thiƯu chung

Pascal lμ ngơn ngữ lập trình cho máy tính, Niklaus Wirth, giảng viên tr−ờng Đại học Kĩ thuật Zurich, Thuỵ sĩ xây dựng nên vμo năm 1970 với mục đích để giảng dạy

Lμ ngơn ngữ lập trình cấu trúc, sáng, dễ hiểu, Pascal v−ợt khỏi nhμ tr−ờng, phát triển thμnh ngơn ngữ mạnh, dùng để phát triển ch−ơng trình chuyên nghiệp

N Wirth đ−ợc giải Turing công lao sáng tạo vμ phổ biến ngơn ngữ Pascal

HiƯn ngôn ngữ lập trình Pascal có nhiều biến thể công ty khác bổ xung hon thiện thêm: TURBO PASCAL cña Borland, QUICK PASCAL cña Microsoft, ANSI PASCAL

Nói riêng Turbo Pascal đ−ợc cải tiến hoμn thiện qua nhiều phiên bản, từ 1.0 ban đầu 5.5 năm 1989, 6.0 năm 1990, 7.0 năm 1992

1 C¸c khái niệm

1.1 Mở đầu

Pascal lμ ngơn ngữ lập trình cấp cao, nghĩa lμ gần với ngôn ngữ ng−ời Khái niệm cấp cao, cấp thấp ngôn ngữ lập trình máy tính để nói gần với ngôn ngữ ng−ời hay với ngôn ngữ máy tính khơng phải để nói khả

T−ơng tự nh− ngôn ngữ thông th−ờng, Pascal sử dụng kí tự để tạo nên từ, dùng "từ" vμ yếu tố khác để tạo thμnh "câu" có ý nghĩa xác định Các "câu" đ−ợc phối hợp thμnh "văn bản" hoμn chỉnh gọi lμ văn ch−ơng trình nhằm lệnh cho máy tính thực số cơng việc xử lớ thụng tin no ú

Để minh hoạ ta xét văn chơng trình Pascal sau Program HinhTron;

(10)

Begin

Write(' Cho ban kinh = '); Read(BanKinh);

If BanKinh > then begin

ChuVi:= 2* pi * BanKinh ;

DienTich:= pi * BanKinh * BanKinh ; Write(' Chu vi la = ' , ChuVi );

Write(' Dien tich la = ' , DienTich); End

Else

Write(' Ban kinh am, khong hop le !'); End

Có thể "dịch" văn chơng trình cho máy tính thnh ngôn ngữ thông thờng nh sau

Chơng trình Hình Tròn;

Các biÕn: B¸n KÝnh, Chu Vi, DiƯn TÝch: lμ sè thùc;

Bắt đầu

Viết mn hình: Cho Bán Kính =

§äc tõ bμn phÝm: B¸n KÝnh

Nếu Bán Kính > Thì

Bắt đầu

ChuVi = x π x B¸n KÝnh

DiƯnTÝch = π x B¸n KÝnh x B¸n KÝnh

ViÕt ra: Chu vi lμ = giá trị ChuVi (tính đợc trên)

ViÕt ra: DiƯn tÝch lμ = gi¸ trị DiệnTích (tính đợc trên)

Kết thúc Trái lại

Viết: Bán Kính âm, Không hợp lệ !

Kết thóc

1.2 C¸c kÝ tù

Turbo Pascal sử dụng kí tự sau bảng mà ASCII: - Các chữ thờng v hoa: a z, A Z

- 10 ch÷ sè: - DÊu nèi d−íi: _

- C¸c dÊu phÐp to¸n: + - * / = <>

- Một số kí hiệu đặc biệt: , ; ! ? : ' " ( ) { } [ ] % @ & # $ ^ ý

(11)

1.3 Các từ khoá

Nhìn lại chơng trình v "dịch" ví dụ ta thấy c¸c tõ

Program, Var, Real, Begin, If, Then, Else, End l thnh phần

quan trng Chúng phối hợp với để tạo nên phần khung câu lệnh Đó lμ từ khố. Các từ khóa lμ đơn vị từ vựng sở ngơn ngữ lập trình nói chung

Khác với ngơn ngữ thơng th−ờng, từ nhiều nghĩa, ý viết theo nhiều cách, từ khố ngơn ngữ lập trình có ý nghĩa xác định xác, câu lệnh đ−ợc xây dựng theo quy tắc chặt ch

Dới dây liệt kê từ khoá Turbo Pascal Y nghÜa vμ c¸ch sư dơng chóng ta sÏ lμm quen dÇn sau nμy

And Asm Array Begin Case Const Constructor Destructor Div Do Downto Else End File For Function Goto If Implementation In Inline Interface Label Mod Nil Not Object Of Or Packed Procedure Program Record Repeat Set Shl Shr String Then To Type Unit Until Uses Var While With Xor

Víi c¸c tõ khóa, Pascal không phân biệt chữ in hoa hay chữ thờng Trong văn chơng trình Pascal ta tuỳ ý viết từ khóa chữ dạng in thờng hay in hoa xen kẽ hai dạng

1.4 Tên - Identifier

Nhìn lại ch−ơng trình ví dụ trên, ngoμi từ khố ta thấy cịn có thμnh phần khác nh− BanKinh, ChuVi, DienTich Chúng lμ tên đối t−ợng mμ ta xử lí ch−ơng trình

Quy định đặt tên Pascal nh− sau:

- Tên l xâu kí tự gồm chữ , ch÷ sè, dÊu nèi d−íi ( _ ) - Tên không đợc chứa dấu cách;

- Tên không đợc bắt đầu số;

- Tên có thÓ dμi tuú ý nh−ng chØ cã 63 kÝ tù l có ý nghĩa; - Tên không đợc trïng víi tõ kho¸;

(12)

Giống nh− từ khóa, văn ch−ơng trình Pascal,

tên đ−ợc viết chữ dạng in th−ờng hay in hoa, không phân biệt BanKinh hay bankinh lμ tên Ta chọn phong cách viết thích hợp

Để tách âm tiết cho dễ đọc dùng dấu nối d−ới ( _ ) viết hoa chữ âm tiết, ví dụ: giai_pt_bac_hai, dinh_thuc,

HeSo, BanKinh , DienTich Trong tμi liƯu nμy sÏ dïng c¸ch viÕt hoa chữ

đầu âm tiết

Khái niện tên (identifier - ID) xác vμ chặt chẽ khái niệm tên gọi thông th−ờng (name) Tên phải đảm bảo quy định, không trùng lặp, t−ơng ứng một-một tên vμ đối t−ợng gắn với

1.5 Tªn chn

Tên chuẩn lμ tên mμ Pascal sử dụng, có ý nghĩa hoμn toμn xác định môi tr−ờng Pascal Trong ví dụ thμnh phần Read, Write

lμ tên chuẩn Đó lμ tên hai thủ tục có sẵn Turbo Pascal Tên chuẩn khác từ khố chỗ, dùng lại tên nμy vμo việc khác, định nghĩa lại với nghĩa khác đi, ng−ời dùng quy định Tuy nhiên không nên lμm thay đổi khác lệ th−ờng, d a n nhm ln

Các tên chuẩn bao gồm

- Các kiểu liệu: boolean, char, integer, real, byte, text ;

- Các kiểu lô gic: false, true ; - Các hμm, thủ tục chuẩn lμm sẵn:

chr, odd, abs, sqr, sqrt, exp, ln

arctan, cos, sin,

eof, eoln, read, readln, write, writeln

1.6 C©u lƯnh

Sử dụng từ khố ngơn ngữ Pascal, tên đối t−ợng, dấu phép tốn vμ kí hiệu đặc biệt khác, ng−ời lập trình viết câu lệnh Câu lệnh lμ thị cho máy tính thực thao tác tính tốn, xử lí nμo

VÝ dơ,

DienTich:= pi * BanKinh * BanKinh ;

lμ câu lệnh yêu cầu máy tính bình phơng bán kính nhân với số gán cho diện tích hình tròn

Cú th vit nhiu cõu lnh trờn dòng Phải dùng dấu chấm phẩy “ ; ” để ngăn cách hai câu lệnh dù lμ dòng hay hai dòng khác

(13)

2 Phát triển chơng trình Pascal

2.1 Cấu trúc chơng trình Turbo Pascal

Để cho dễ hiểu từ ta quy −ớc trình bμy thμnh phần cú pháp Pascal ta dùng cách nhấn mạnh chữ in nghiêng để phần mμ ng−ời lập trình cần điền vμo tuỳ theo tr−ờng hợp cụ thể Những từ khố, tên chuẩn ngơn ngữ Pascal lμ phần khung phải giữ nguyên không đ−ợc thay đổi đ−ợc thể kiểu chữ đứng đậm

2.1.1 Các thnh phần

Về cấu trúc, chơng trình Pascal gồm phần: phần tên, phần khai báo, phần thân

Program tên chơng trình ; Phần tên

Uses danh sách unit ;

Const c¸c khai b¸o h»ng ;

Type c¸c khai b¸o kiĨu ;

Var c¸c khai b¸o biÕn ;

Procedure ;

Function ;

PhÇn khai báo

Phần chơng trình BEGIN

các câu lệnh chơng trình; END

Phần thân

Phần tên

Phn khai bỏo phải theo trình tự mục: uses, const, type, var,v.v Có thể lặp lại từ khố nhiều lần, nhiều dịng nh− có nhiều nội dung Phần khai báo khơng có

Phần thân chơng trình bắt buộc phải có ! Lu ý văn chơng trình kết thúc với từ kho¸ END kÌm dÊu chÊm “.”

(14)

ở có khai báo nguyên mẫu (tức l tên, danh sách tham số, kiểu kết

trả về) chơng trình kèm triển khai chi tiết chúng Ta tìm

hiểu kĩ sau ny chơng "Chơng trình con" 2.1.2

2.1.3

2.2.1

Chú thích chơng trình Pascal

Trong văn ch−ơng trình th−ờng xen lẫn lời thích nhằm mục đích cung cấp thơng tin bổ xung giải thích ý nghĩa, nội dung câu lệnh cho ng−ời đọc dễ hiểu Trình biên dịch hoμn toμn bỏ qua thích Cú pháp ngơn ngữ Pascal quy định đoạn lời thích phải đặt cặp dấu ngoặc nhọn “{ , }” cặp dấu ngoặc đơn kèm dấu “(* , *)” Đoạn thích dịng hay nhiều dịng

VÝ dơ:

{ nghiƯm thø nhÊt }

x1:= ( -b + sqrt (b*b – 4*a*c)) / (2*a);

hc

(* nghiÖm thø nhÊt *)

x1:= ( -b + sqrt (b*b – 4*a*c)) / (2*a);

VÝ dơ mét ch−¬ng tr×nh Pascal

Ch−ơng trình Pascal đơn giản sau lμm mμn hình vμ in dịng chữ "Xin Chμo Bạn !" góc trái mμn hình

program ChaoMung; uses crt;

Begin

Clrscr;

Write(' Xin Chao Ban ! '); Readln;

End

2.2 Các bớc xây dựng chơng tr×nh

Xây dựng ch−ơng trình giải bμi toán cụ thể cần trải qua b−ớc nh− sau: xác định rõ yêu cầu bμi toán cần phải lμm gì; phân tích nội dung; thiết kế thuật giải; triển khai viết ch−ơng trình vμ chạy thử kiểm tra

đây ta trình by công việc hai bớc cuối l viết chơng trình v chạy thử

Viết văn chơng trình

(15)

2.2.2

2.2.3

Biên dịch v liên kết

Tệp văn chơng trình gồm câu lệnh gần với ngôn ngữ thông thờng, dễ hiểu với ngời, nhng l ngôn ngữ máy tính Để máy tính hiểu v thực thi đợc câu lệnh cần phải biên dịch chơng trình từ tệp mà nguồn Pascal thnh tệp mà máy

Trong trình biên dịch máy phát lỗi cú pháp -

syntax error Ta cần sửa chữa để đảm bảo ch−ơng trình hết lỗi cú pháp, đ−ợc

biên dịch thnh công v liên kết thnh tệp thi hnh đợc Chạy thử v sửa lỗi

Giống nh− bμi văn gồm toμn câu ngữ pháp nh−ng vô lý, hiểu đ−ợc, ch−ơng trình cú pháp ch−a chạy thơng đ−ợc Máy dừng ch−ơng trình thực na chng Lỳc ny

l lỗi chạy chơng tr×nh - run time error.

Ngay ch−ơng trình chạy thơng cho kết sai Đây lμ lỗi nội dung thuật giải Cần phải sửa lại thuật giải để đảm bảo ch−ơng trình cho kết nh− mong muốn

Một bμi tốn th−ờng có nhiều tr−ờng hợp khác Ví dụ, ch−ơng trình giải ph−ơng trình bậc hai có ba tr−ờng hợp khác ứng với giá trị biệt thức (Delta) lμ âm, d−ơng hay không Ch−ơng trình chạy với tr−ờng hợp nμy ch−a chí khơng chạy thơng đ−ợc cho tr−ờng hợp khác Cần chạy thử ch−ơng trình với nhiều liệu đầu vμo khác để kiểm tra tính đắn ch−ơng trình tr−ờng hợp xảy

3 M«i tr−êng phát triển tích hợp Turbo Pascal

3.1 Các công cụ phát triển

Nh ó trình bμy trên, việc triển khai ch−ơng trình Pascal cần tiến hμnh nhiều b−ớc, từ soạn thảo văn ch−ơng trình biên dịch, liên kết, chạy thử vμ sửa lỗi Mỗi b−ớc nh− cần có cơng cụ hỗ trợ t−ơng ứng Để soạn thảo văn ch−ơng trình cần dùng soạn tho

Editor Để biên dịch chơng trình cần có trình biên dịch Compiler. Để

liên kết đoạn mà sau biên dịch thnh chơng trình cần dùng trình liªn kÕt

Linker Trình hỗ trợ phát vμ sửa lỗi gọi lμ Debuger. Turbo Pascal

(16)

phát triển tích hợp (IDE - Integrated Development Environment) cđa Turbo

Pascal

Bé phÇn mỊm Turbo Pascal gồm nhiều tệp Dới l số tệp

- Turbo.exe: soạn thảo, biên dịch, liên kết, sửa lỗi, trợ giúp.v.v Đây l

tệp tạo nên môi trờng phát triển tích hợp cña Turbo Pascal

- Turbo.tpl: (Turbo Pascal Library) th− viƯn chn phơc vơ cho

turbo.exe.

- Graph.tpu: (Turbo Pascal Units) th− viện ch−ơng trình đồ hoạ

- *.CHR : phông chữ chế độ đồ hoạ

- *.BGI : (Borland Graphics Interfaces) trình điều khiển mn

hỡnh ho ca Borland

3.2 Các chức cách dùng

Để mở môi trờng phát triển Turbo Pascal cần phải cho chạy tệp

Turbo.exe Sau nhiều lần cải tiến, phiên phổ biến l Turbo

Pascal 7.0 Phần trình by dới l phiên ny 3.2.1 Mμn h×nh lμm viƯc

Sau khởi động mμn hình để bắt đầu việc soạn thảo, biên dịch, chạy thử vμ sửa lỗi ch−ơng trình Trên đỉnh mμn hình lμ chọn D−ới đáy mμn hình lμ dịng nhắc lệnh lμ vùng lμm việc

Thanh chän chÝnh File Edit Search Run Compile Debug Tools Options Window Help

Vïng lμm viÖc

F1 Help F2 Save F3 Open Alt+F9 Compile F9 Make Alt+F10

Dòng nhắc lệnh

Mỗi mục tên chọn cho phép mở bảng chọn

buông xuống Mỗi bảng chọn buông xuống chứa nhiều mục chọn thực hiÖn

(17)

Alt + chữ đ−ợc lμm bật để mở bảng chọn buông

xuống t−ơng ứng Ví dụ, gõ Alt + F để mở bảng chọn File, gõ Alt + E để mở bảng chọn Edit, gõ Alt + S để mở bảng chọn Search, v.v Cũng dùng phím mũi tên sang phải, sang trái để di chuyển chọn vμ gõ Enter để mở bảng chọn bng xuống vị trí

Dịng nhắc lệnh gồm nhiều cặp phím gõ tắt - tên lệnh cho biết cách thực nhanh lệnh hay dùng Cặp F1 Help nghĩa lμ gõ phím F1 để mở phần trợ giúp, cặp Alt+F9 Compile nghĩa lμ gõ tổ hợp phím Alt - F9 để thực biên dịch,v.v

3.2.2 Các bảng chọn

Sau õy l ni dung bảng chọn vμ chức mục chọn chứa Y nghĩa mục chọn đ−ợc tìm hiểu kĩ gặp vấn đề có liên quan

- B¶ng chän File

Bảng chọn File tập hợp thao tác với tệp văn chong trình New

Open F3 Save F2 Save as

Save all

Change dir Print

Printer setup DOS shell

Exit Alt+X

Mở cửa sổ soạn thảo míi

Mở tệp có đĩa để sửa chữa, viết tiếp

Ghi l−u tệp ch−ơng trình soạn thảo lên đĩa với tên cũ

Ghi l−u tệp ch−ơng trình soạn thảo lên đĩa với tên khỏc

Ghi lu tất tệp mở cửa sổ soạn thảo

Chuyn sang lm việc th− mục khác In văn ch−ơng trình máy in Thiết đặt tham số cho thao tỏc in Tm v DOS,

Thoát hẳn khỏi môi tr−êng Turbo Pascal trë vÒ DOS

L−u ý bên phải, cạnh số tên mục chọn hay dùng có ghi kèm phím gõ tắt ứng với mục chọn

- B¶ng chän Edit

Bảng chọn nμy có nhiều chức hỗ trợ cho việc soạn thảo văn ch−ơng trình nh− chép, cắt dán Tr−ớc thực chép, cắt dán, v.v cần đánh dấu khối văn cách nhấn tổ hợp phím Shift + phím

(18)

Undo Alt+ BkSp Redo

_ Cut Shift + Del Copy Ctrl + Ins Paste Shift + ins Clear Ctrl + Del Show clipboard

Ho·n viÖc võa nhỡ lm Lặp lại việc vừa lm

Ct bỏ vμ chép vμo vùng đệm Sao vμo vùng đệm

Dán (từ vùng đệm) vμo vị trí từ chỗ chạy Xoá đoạn đã đánh dấu

Hiển thị vùng đệm

- B¶ng chän Run

Bảng chọn Run gồm nhiều chức thực ch−ơng trình chế độ khác Có thể theo dõi hoạt động ch−ơng trình chặng một, chí b−ớc một, qua câu lệnh Gõ Enter để sang b−ớc

Run Ctrl + F9 Step over F8 Trace into F7 Go to cursor F4 Program reset

Dịch v chạy thử

Thực bớc, câu lệnh chơng trình Lời gọi chơng trình coi l bớc Thực bớc, câu lệnh, kể vo chơng tr×nh

Thực ch−ơng trình dịng lệnh có chạy

Trở lại chế độ chạy bình th−ờng

- B¶ng chän Compile

Bảng chọn nμy cho phép thiết lập lựa chọn khác biên dịch vμ liên kết ch−ơng trình Theo mặc định, biên dịch văn ch−ơng trình cửa sổ soạn thảo lμm việc Đó lμ tệp mã nguồn, có *.PAS Tệp kết sau biên dịch vμ liên kết lμ tệp thi hμnh - executable, có tên trùng với tên tệp mã nguồn nh−ng có *.EXE

Với ch−ơng trình lớn, nhiều tệp mã nguồn Trong có tệp lμ tệp – Primary File Các tệp khác lμ tệp phụ kèm theo, bổ xung cho tệp Lựa chọn Primary File cho phép thiết lập tên tệp mã nguồn Dù ta soạn thảo tệp khác, tệp mã nguồn chí khơng đ−ợc mở, việc biên dịch Primary File

Compile Alt + F9 Make F9 Build

(19)

Destination Memory

Primary file Clear primary file Infomation

Th− mục để ghi tệp kết

Ghi tệp *.exe nhận đ−ợc vμo nhớ hay vμo đĩa Memory / Disk

ThiÕt lËp tÖp m· nguån chÝnh Bá thiÕt lËp tƯp m· ngn chÝnh

- B¶ng chän Windows

Bảng chọn Window để thao tác với cửa sổ khác đ−ợc mở L−u ý rằng, thời điểm mở nhiều cửa sổ nh−ng có cửa sổ lμm việc – Active Window Có thể lựa chọn cho phép cửa sổ lμm việc đè lên trên, che khuất cửa sổ lại – Cascade, hay nằm bên cạnh cửa sổ khác, không che khuất nhau, giống nh− lát gạch nhμ – Tile

Có thể hình dung cửa sổ đ−ợc mở xếp thμnh dãy có trình tự tr−ớc sau theo thời điểm đ−ợc mở Di chuyển Next, Previous lμ dãy theo trình tự nói

Tile Cascade Close all

Refresh display _ Size/Move Ctrl + F5 Zoom F5 Next F6 Previous Shift + F6 Close Alt + F3 _ List

Xếp cửa sổ cạnh Xếp cửa sổ đè lên Đóng cửa sổ mở Lμm t−ơi lại mμn hình

Co gi·n tõng chiỊu / Di chuyÓn Phãng to, thu nhá

ChuyÓn sang lμm viƯc ë cưa sỉ tiÕp theo Lïi vỊ cưa sỉ liỊn tr−íc

§ãng cưa sỉ hiƯn hμnh

Hiện danh sách tên cửa sổ mở (để chọn) Chọn nμo cửa sổ thμnh cửa sổ lμm việc

3.3 Các b−ớc xây dựng ch−ơng trình mơi tr−ờng Turbo Pascal - Khởi động Turbo Pascal

- Mở tệp để soạn thảo văn ch−ơng trình: mở bảng chọn File , chọn New để mở tệp mới, Open (F3) để mở tệp có đĩa

(20)

Pascal 7.0 hỗ trợ cho ngời lập trình qua việc hiển thị từ khoá chữ mu trắng

- Ghi l−u vμo đĩa Lần đầu tệp ch−a có tên, khung cửa sổ soạn thảo tạm đ−ợc đặt tên lμ NoName00.pas Phải mở bảng chọn File, chọn Save as vμ đặt tên cho tệp ch−ơng trình Têp đ−ợc ghi lại với tên chọn vμ

đi pas theo mặc định

- DÞch vμ sửa lỗi cú pháp (Alt + F9 F9) Nếu có lỗi cú pháp

xut hin mt thụng báo lỗi mμu đỏ Vị trí có lỗi th−ờng tr−ớc chạy nhấp nháy mμn hình Nếu dịch thμnh cơng, tệp chạy đ−ợc (có exe) có tên trùng với tên tệp văn ch−ơng trình đ−ợc tạo Dịch vμ chạy ch−ơng trình (Ctrl + F9) Nếu hết lỗi cú pháp, dịch thμnh cơng, máy tạm khỏi mơi tr−ờng tích hợp Turbo Pascal, trở DOS vμ cho thực tệp *.exe v−μ tạo

- Xem kết (Alt + F5) Nếu ch−ơng trình chạy thông, nghĩa lμ không bị dừng chừng lỗi chạy ch−ơng trình - run time error, thì kết thúc thực ch−ơng trình máy trở lại môi tr−ờng phát triển Turbo Pascal Ta khơng kịp xem kết mμ ch−ơng trình hiển thị mμn hình DOS Gõ Alt + F5 lại mμn hình nμy Cũng lí nμy mμ nhiều ng−ời thêm câu lệnh Readln vμo cuối ch−ơng trình để chờ gõ phím Enter, có thời gian để xem kết

Bây sử dụng mơi tr−ờng phát triển Turbo Pascal để soạn thảo văn ch−ơng trình, dịch vμ chạy thử ch−ơng trình đơn giản nêu tiết tr−ớc

C©u hái vμ bμI tËp

1 Từ khoá l gì, từ khoá khác tên chuẩn chỗ no

2 Tỡm cỏc t sau õy đâu lμ từ khố, tên chuẩn, tên vμ khơng quy định Turbo Pascal:

End XYZ123 123ABC Tong So Prog#2 Write

X=Y Read 'MaxSize' Tyle "Delta" TimThay?

3 a) Nêu cách chèn thêm thích vμo ch−ơng trình Pascal b) Các thích dùng để lμm

c) Viết đoạn thích nh− sau có ỳng khụng ?

{ Chơng trình giải phơng trình bậc hai {giả thiết a <> 0}, tác giả

Nguyễn Văn A}

(21)

5 Tệp văn chơng trình Pascal l tệp nh no Có thể tạo cách no

6 Phân biệt lỗi cú pháp v lỗi chạy chơng trình, lỗi no thờng dễ phát hơn, dễ sửa

7 Nêu bớc xây dựng chơng trình Pascal Thực bớc ny môi trờng phát triển tích hợp Turbo Pascal nh no

9 Có thể soạn thảo, biên dịch v cho chạy chơng trình Turbo Pascal từ môi trờng DOS hay không ? Nếu có cần phải lm nh thÕ nμo ?

thùc hμnh

1 Khởi động Turbo Pascal, mở tệp để soạn thảo, gõ vμo nội dung văn ch−ơng trình "chμo mừng" - Biên dịch vμ sửa lỗi tả có Ghi lại tệp với tên lμ ChaoMung.Pas - Chạy thử ch−ơng trình, xem kết in nh− nμo

2 Viết thêm dòng thích vo đầu chơng trình: ngy tháng năm, tác giả Biên dịch v cho ch¹y l¹i

3 Ghi l−u lại tệp ChaoMung.exe vμo a

(22)

Chơng2 Các kiểu liệu chuẩn, hm chuẩn

1 Các kiểu liệu chuẩn

1.1 Khái niệm kiểu liệu

Để có hình dung ban đầu kiểu liệu ta hÃy xét hai khái niệm quen thuộc l số nguyên v số thùc Nãi r»ng i lμ mét sè nguyªn ta hiĨu r»ng r»ng i chØ cã thĨ nhËn c¸c gía trị 0,1,2,3 hay -1,-2,-3 nghĩa l phần lẻ Nếu x l số thực cã thĨ nhËn bÊt cø gÝa trÞ sè nμo VËy yếu tố thứ phân biệt hai "kiểu" số khác ny l miền giá trị m chúng nhËn

Nếu xét đến phép toán số học cộng trừ nhân chia, lμ phép chia, lần lại thấy có khác biệt số nguyên vμ số thực Phép chia hai số nguyên nói chung khơng cho ta số ngun Do cần đặt phép chia lấy kết nguyên số nguyên Ta nói đến phép chia đồng d− tập hợp số nguyên số thực điều nμy khơng có ý nghĩa

Có liệu mang thơng tin khơng phải lμ số, ví dụ tên ng−ời, địa chỉ, v.v lμ liệu kiểu xâu kí tự

Tóm lại, liệu có nhiều "kiểu" khác Những "kiểu" nμy đ−ợc đặc tr−ng miền giá trị nhận, phép tốn nμo tác động lên, kết phép toán nh− nμo

Từ kiểu đơn giản lμm sở lại xây dựng, "tổ chức" thμnh kiểu phức tạp hơn, có "cấu trúc" Khi nhìn thấy ba số viết nh− sau 19/08/1945 hầu nh− ng−ời nghĩ lμ ngμy tháng Ai quen biết với tóan học cao cấp hiểu véc tơ, ma trận lμ "kiểu liệu" đ−ợc "cấu trúc" từ thμnh phần đơn gin hn l cỏc s

1.2 Phân loại kiểu liệu TurboPascal

(23)

những kiểu sở, phân chia nhỏ thnh số thnh phần có nghĩa Các kiểu có cấu trúc l kiểu đợc xây dựng nên cách phối ghép số liệu thnh phÇn

Trong loại trên, loại đơn giản hay loại có cấu trúc, lại phân chia lμm hai nhóm

Nhóm thứ bao gồm kiểu có sẵn, đ−ợc xây dựng sẵn với tính chất hoμn toμn xác định, ta sử dụng mμ khơng cần "gia cơng" thêm Đây lμ kiểu liệu phổ biến, hay đ−ợc sử dụng nh− kiểu số nguyên, số thực, kí tự, xâu kí tự Vì mμ Turbo Pascal (vμ ngơn ngữ lập trình khác nói chung) định nghĩa sẵn Ta gọi lμ kiểu liệu chuẩn

Xếp vμo nhóm thứ hai lμ kiểu cịn lại, nghĩa lμ ch−a có sẵn Những kiểu mμ ng−ời sử dụng phải gia công thêm, tự xây dựng tuỳ theo mục đích sử dụng

Sơ đồ d−ới dây phân loại kiểu liệu Turbo Pascal nh− nói

ở nhánh d−ới sơ đồ lμ kiểu liệu có cấu trúc ng−ời lập trình tự xây dựng Đó lμ Stack (Ngăn xếp), Queue (Hμng đợi),

List (danh sách), Tree (Cây), v.v Môn “Cấu trúc liệu vμ thuật giải” trình bμy đầy đủ vấn đề nμy

Kiểu đơn giản Kiểu có cấu trúc Chuẩn Do ng−ơì lập trình định nghĩa Đã có sẵn Do ng−ời lập trình xây dựng

Integer, (nguyªn)

Byte, Char (kÝ tù)

Real(thực)

Kiểu đoạn Kiểu liệt kê

String (xâu kí tự)

Array (mảng)

Set (tập hợp)

Record (bản ghi)

File(Tệp)

Boolean (lôgic)

(24)

1.3 Các kiểu đơn giản chuẩn

1.3.1 KiĨu Boolean hay L«gic

- Miền giá trị: Chỉ có hai giá trị False, True

- Thứ tự: quy định False < True

- C¸c phÐp to¸n AND, OR, XOR, NOT

Bảng dới minh họa ý nghĩa phÐp to¸n KÝ hiƯu pq lμ hai biĨu thøc l«gic

p q NOT p p AND q p OR q p XOR q

True True False False True False True false False False True True True False False False True True True False False True True False

1.3.2 Kiªđ Integer - sè nguyªn

Khác với số ngun tốn học, nhận giá trị nguyên nμo dù lớn đến đâu, kiểu số nguyên máy tính bị hạn chế khả vật lí để thể số nhớ Ta dμnh cμng nhiều bit để thể số ngun miền giá trị t−ơng ứng cμng rộng Trái lại ta tiết kiệm dμnh vμi bit để thể số nguyên miền giá trị cμng hẹp

Cơ thĨ lμ, víi bit ta thĨ đợc 28 = 256 số khác Nếu xét số không âm ta có miền giá trị l 0 255 Nếu xét số âm, có miền giá trị l -128 127. Với 16 bit ta thể đợc 216 = 65536 khả khác

Bng di õy liệt kê kiểu số nguyên khác Turbo Pascal với miền giá trị kiểu nμy Ta thấy có t−ơng ứng chặt chẽ miền giá trị kiểu với số l−ợng byte nhớ dμnh để biểu diễn chúng

Tên Miền giá trị Số

byte Gi¶i thÝch Shortint Integer Longint Byte Word -128 127 -32768 32767 -2147483648 2147483647 000 255 00000 65535

28 = 2* 128 216 = 2* 32768

232 = 2* 2147483648 28= 256

(25)

- C¸c phép toán: Kiểu số nguyên có phép toán số học thông thờng

l cộng, trừ, nhân Dấu phép toán tơng ứng l +, -, * Lu ý

phép chia / thông thờng hai số nguyên cho kết l số thực Hai phép toán chia cđa riªng kiĨu sè nguyªn lμ:

DIV: chia lấy kết nguyên, ví dụ DIV = MOD: chia lÊy phÇn d−, vÝ dơ MOD =

Khi thực phép tốn với kiểu số phải l−u ý kết khơng đ−ợc v−ợt ngoμi phạm vi biểu diễn kiểu số Trái lại kết qủa bị biến dạng sai

1.3.3 KiÓu Real - sè thùc - Miền giá trị:

Cng ging nh i vi số nguyên, số thực đ−ợc phân chia lμm nhiều kiểu khác với miền giá trị rộng hẹp khác tuỳ theo l−ợng ô nhớ dμnh để thể số Nhớ lại nhớ máy tính, số thực đ−ợc biểu diễn d−ới dạng dấu chấm động Bit dμnh riêng để ghi dấu Giá trị số đ−ợc thể hai phần: phần định trị vμ phần bậc

Trong bảng d−ới dây, cột miền giá trị nêu miền biến thiên giá trị tuyệt đối Tr−ớc chữ E lμ phần định trị, sau chữ E lμ phần bậc Bên trái lμ giá trị tuyệt đối bé Mọi giá trị nhỏ đ−ợc coi lμ Bên phải lμ giá trị tuyệt đối lớn Các giá trị v−ợt q khơng biểu diễn đ−ợc vμ có lỗi trμn nhớ

Tên Miền giá trị Số byte

chứa

Sè ch÷ sè cã nghÜa

Single Real Double Extended

1.5 E-45 3.4 E+38 2.9 E-39 1.7 E+38 5.0 E-324 1.7 E+308 3.4 E-4932 1.1 E+4932

4 10

7- 11-12 15-16 19-20

Trong ch−ơng trình Pascal, số thực đ−ợc viết d−ới dạng Dạng quen biết thông th−ờng lμ phần nguyên, dấu chấm thập phân, phần lẻ Đây gọi lμ dạng dấu chấm tĩnh Dạng thứ hai lμ dấu chấm động nh− trình bμy

(26)

- C¸c phÐp to¸n: Bốn phép toán số học cộng, trừ, nhân, chia ( +, - , * , / ) quen thuéc

Lu ý kết phép toán vợt ngoi phạm vi biểu diễn kiểu tơng ứng mắc lỗi trn ô nhớ - overflow Đặc biệt l chia cho số nhỏ, gần víi kh«ng

1.3.4

1.3.5

KiĨu Char - kÝ tù

- Miền giá trị: lμ bảng mã ASCII gồm 256 kí tự khác Mỗi kí tự chiếm byte Mã kí tự nμo lμ số thứ tự bảng mã nμy

Trong ch−ơng trình Pascal, giá trị kiểu kí tự phải đ−ợc viết nằm hai dấu nháy đơn Ví dụ 'A', 'B', '?' Cách thứ hai lμ dùng dấu # kèm với mã nó, ví dụ #65, #66, #63

- Thứ tự: Kiểu Char có thứ tự đ−ợc quy định lμ thứ tự xuất giá trị kí tự bảng mã ASCII Nghĩa lμ ‘a’ < ‘b’ < ‘c’ hay #97 < #98 < #99

- L−u ý: 32 kí tự ( #0 #31) lμ kí tự điều khiển, khơng dùng để hiển thị kí hiệu mμ có ý nghĩa riêng

KiĨu String - x©u kÝ tù

Kiểu String hay xâu kí tự đ−ợc nghiên cứu kĩ sau nμy ch−ơng "Kiểu xâu kí tự" tạm thời nêu nét Dữ liệu kiểu xâu kí tự lμ dãy gồm số kí tự Xâu kí tự lμ tổng qt hố từ hay cụm từ Số kí tự xâu gọi lμ độ dμi xâu Khai báo kiểu String[n] có nghĩa lμ xâu kí tự có độ dμi khơng quỏ n

- Miền giá trị kiểu String[n] l tất xâu kí tự có không qu¸ n

kÝ tù

- Trong ch−ơng trình Pascal, giá trị xâu kí tự cần phải viết cặp dấu nháy đơn Ví dụ ‘Pascal’, ‘Chuong trinh’,

- Thứ tự: quy định thứ tự tập hợp xâu kí tự lμ thứ tự kiểu tự điển Tr−ớc hết so sánh hai kí tự đầu tiên, trùng so sánh tiếp kí tự thứ hai, thứ ba

- C¸c phÐp toán kiểu String trình by chơng Kiểu xâu kí tự

2 Các hàm chuẩn

Các hμm số học, lô gic hay đ−ợc sử dụng Chúng cần đ−ợc lμm sẵn để ng−ời lập trình sử dụng Đó lμ hμm chuẩn Bảng hμm chuẩn d−ới liệt kê hμm

(27)

báo sử dụng th− viện ta cần Các Unit đ−ợc giới thiệu dần trình bμy vấn đề có liên quan

2.1 Bảng hàm chuẩn

Cn lu ý đến kiểu tham đối vμ kiểu kết nh− bảng nêu

Loại Tên Kiểu đối số Kiểu kết Y nghĩa Sqr Abs Nguyên, thực Giống kiểu đối số

Sqr (x) = x2

Abs (x) = | x |

Sqrt Sin Cos Arctan Ln Exp Nguyªn, thùc Thùc

Square root - Căn bậc hai

Sqrt(x) = x

Logarit c¬ sè e

Exponential - hμm mị

Exp(x) = ex

Sè häc Trunc Round Nguyên, thực Nguyên

Cắt bỏ phần lẻ Trunc(3.7)= Lμm trßn Round(3.7)=4

Round(1.5) =

Pred Succ Nguyên Logic Kí tự Giống đối số

Predecessor - giá trị

trớc Pred(4) = 3, Pred (d) = c

Successor - giá trị sau

Succ(4) = 5, Succ(‘d’) = ‘e’

Ord

KÝ tù Nguyªn

Order – thø tù Cho sè thø

tù cđa kÝ tù b¶ng m·

Ord(‘a’) = 97 Thø tù

Chr Nguyªn KÝ tù

Character – kÝ tù Cho kí tự

có mà l số nguyên tơng ứng Chr(97) = ‘a’

Logic Odd Nguyªn Logic

Odd lẻ Hm trả lại true

nu i lμ số lẻ, false nếu đối lμ số chẵn, kết lμ

(28)

2.2 Sư dơng

Các hm đợc viết trực tiếp biểu thøc nh− th«ng th−êng VÝ dơ:

BiĨu thøc sè häc:

a:= abs(x) + exp(3.5);

BiÓu thøc tÝnh nghiƯm cđa tam thøc bËc hai:

x1:= ( -b + sqrt (b*b - 4*a*c)) / (2*a);

Biểu thức lợng giác:

y:= sin(2*x) + 2* cos(x);

C©u hái vμ bμi tËp

1 Những kiểu số ngun nμo khơng có giá trị số âm Chúng th−ờng dùng để lμm

2 Nếu biến N có kiểu integer vμ ta dùng để chứa kết tính N:= k! số k lớn lμ để kết khơng sai

3 Viết số sau dới dạng thập phân thông thờng

103E-4 1.2345E+6 321.04E+2

4 Viết số sau d−ới dạng dấu chấm động chuẩn hóa

1300 345.67 0.00621

5 T×m dới biểu thức l giá trị trực tiếp hợp lệ v nhận biết kiểu liệu chóng

17 'abc' 25.14 $ $07AB -333 102 102

“x" 'x' x '8' '-3' True 'True' "True"

6 TÝnh c¸c biĨu thøc sau

22 DIV 7 DIV 22 22 MOD 7 MOD 22

'c' < Succ('a') 10 = Pred(11) Trunc(-15.8)

Round(-15.8) Round(3.5) Sqrt(Abs(Round(-15.8)))

ord('B') + 1

7 ViÕt c¸c biĨu thøc sau dïng c¸c hμm chn cđa Turbo Pascal

1 + e2x 2ax x1/2 x1/3 log10 x

Thùc hμnh

(29)

Ch−ơng Các khai báo vμ câu lệnh đơn giản

1 Khai báo biến

Mt nguyên tắc chung viết ch−ơng trình Pascal lμ thứ phải đ−ợc khai báo (vμ xây dựng) tr−ớc sử dụng Vì lẽ mμ sau tên ch−ơng trình lμ phần khai báo, sau lμ thân ch−ơng trình

Nh− nêu phần giới thiệu cấu trúc ch−ơng trình Pascal, phần khai báo phải theo trình tự d−ới Phần nμo khơng cần đến bỏ qua

1- Khai báo th− viện ch−ơng trình mẫu dùng đến ch−ơng trình Cú pháp: Từ khố User, sau lμ danh sách Unit

2- Khai b¸o c¸c h»ng

Cú pháp: Từ khố Const, sau lμ danh sách khai báo 3- Khai báo kiểu

Cú pháp: Từ khố Type, sau lμ danh sách khai báo kiểu 4- Khai báo biến

Cú pháp: Từ khoá Var, sau lμ danh sách khai báo biến 5- Phần ch−ơng trình

Từ khố Procedure để khai báo thủ tục Từ khoá Function để khai báo hμm

D−ới trình bμy khai báo vμ khai báo biến Cách thực khai báo khác đ−ợc giới thiệu sau, bμn đến chủ đề có liên quan

Để tiện trình bμy quy định cú pháp ta quy −ớc ngoμi từ khoá, tên chuẩn Turbo Pascal lμ phần khung phải giữ nguyên (đ−ợc in đậm), thμnh phần đ−ợc nhấn mạnh kiểu chữ nghiêng lμ thμnh phần mμ ng−ời xây dựng ch−ơng trình cần phải bổ xung thêm vμo

1.1 Khai báo

1.1.1 Hằng l

(30)

1.1.2

1.1.3

1.2.1

Có ph¸p vμ vÝ dơ

Có ph¸p: Const tên = giá trị ;

ở vế phải, giá trị l giá trị trực tiếp ( literal value) Giá trị trực tiếp l giá trị lấy từ miền giá trị kiểu liệu, thực tính toán thêm

Có thể viết nhiều khai báo liên tiếp

VÝ dô: const

maxSize = 50 ;

tieuDe = 'Cong hoa xa hoi chu nghia Viet nam' ;

sigma = 0.1/ (2*pi) ;

laiXuat = 0.05 ;

Tại nên khai báo h»ng

Một câu hỏi tự nhiên đặt lμ, nên dùng khai báo giá trị thay cho việc viết trực tiếp giá trị nơi cần đến Sử dụng khai báo có hai −u điểm sau đây:

- Ch−¬ng trình rõ rng, dễ hiểu Các tên maxSize, sigma,

laiXuat ví dụ rõ rng l dễ hiểu, dễ nhớ l sè kh«

khan mμ chóng thay thÕ

- Ch−ơng trình dễ chỉnh sửa Ví dụ sau nμy cần tăng kích th−ớc lớn cho phép lên 100 khơng phải lμ 50 cần sửa chỗ lμ dòng khai báo Nếu lãi xuất đ−ợc điều chỉnh lại lμ 0.04 sửa lại hết toμn công thức liên quan mμ cần sửa dòng khai báo mức lãi xuất lμ đủ

1.2 Khai b¸o biÕn

BiÕn lμ g×

Biến lμ đại l−ợng mμ gía trị biến đổi ch−ơng trình Biến lμ dùng để chứa liệu phục vụ cho q trình tính tốn, xử lí ch−ơng trình Nó chứa liệu đầu vμo, kết trung gian hay kết cuối q trình xử lí

(31)

Khai báo biến lμ đăng kí tên biến kèm với kiểu liệu Các biến khác khơng đ−ợc trùng tên Trình biên dịch dμnh cho biến vùng nhớ xác định, đủ để chứa liệu kiểu t−ơng ứng Vùng nhớ nμy rộng hay hẹp (dμi, ngắn) đến đâu lμ kiểu liệu biến định

1.2.2 Có ph¸p vμ vÝ dơ

Có ph¸p: Var tên biến: kiểu liệu ;

- Sau tõ kho¸ VAR cã thĨ viÕt nhiỊu khai b¸o biến liên tiếp nhau, cách dấu chấm phẩy

- Có thể khai báo đồng thời nhiều biến cùng kiểu Thay cho tên biến lμ danh sách tên biến cách dấu phẩy

- Có thể vừa khai báo vừa gán giá trị khởi ®Çu cho biÕn, viÕt dÊu b»ng, theo sau lμ mét giá trị trực tiếp

Ví dụ: VAR

x,y,z: real ;

GoPhim, Chon: char;

TimThay: boolean = true ;

Dem: integer = ;

2 Biểu thức ngôn ngữ Pascal

2.1 Biêủ thức

Ta ó quen với khái niệm biểu thức tốn học Ví dụ biểu thức số học

2 π R

10.34 + sin 2x

2 π R / (10.34 + sin 2x)

vμ c¸c biĨu thøc l«gic Δ≠

(Δ≠ 0) AND (a = 0).

Nhận thấy thnh phần biểu thức l giá trị trực tiếpnh 2, 10.34, cã thÓ lμ mét h»ng nh− sè Pi, cã thÓ lμ biÕn nh− x, cã thÓ lμ hμm nh− sin2x l biểu thức khác

(32)

toán hạng l giá trị trực tiếp, hằng, biến, hm biểu thức khác

Vì toán hạng l biểu thức khác, kết hợp nhiều biểu thức dấu phép toán ta lại cã biĨu thøc míi B»ng c¸ch nμy ta cã thĨ xây dựng biểu thức ngy cng lớn v phức t¹p

Việc thực phép tốn để nhận đ−ợc kết cuối gọi lμ tính giá trị biểu thức

VÝ dơ, c¸c biĨu thøc số học đợc viết lại Pascal nh− sau

2 * pi * BanKinh

+ sin(2*x)

2 * pi * BanKinh / (1 + sin(2*x))

vμ c¸c biĨu thøc l«gic lμ

Delta <>

(Delta <> 0) AND (a = 0).

2.2 B¶ng thø tù −u tiªn

Khi thực phép toán biểu thức phải tuân theo quy định v "th t u tiờn"

Dới dây l bảng thứ tự u tiên phép toán xếp theo mức u tiên giảm dần từ xuống dới

Loại Phép toán Kí hiệu Kiểu toán hạng

Kiểu kết đổi dấu - Nguyên, thực Giống tốn hạng Một ngơi

Phủ định NOT Logic logic

Nhân * Nguyên, thực Giống toán hạng Chia Chia bá d− Chia lÊy d− / DIV MOD Nguyªn, thùc Nguyên Nguyên Thực Nguyên Nguyên Nhân

V AND Logic logic

Cộng Trừ + - Nguyên thực

Giống toán hạng Cộng

Hoặc OR Logic logic

So s¸nh = <> < <= > >=

(33)

2.3 Viết biểu thức L−u ý:

1- Không đ−ợc bỏ qua dấu phép nhân “ * ” hai thừa số Biểu thức toán học 2x, Pascal phải viết đầy đủ lμ 2*x

2- DÊu phÐp chia lμ kÝ hiƯu g¹ch xiên / Ví dụ 1 / (2* Pi) Không dùng dấu hai chấm Không dùng cách viết tử số v mẫu số hai dòng khác

3- NÕu d·y liỊn nhiỊu phÐp to¸n cã cïng thø tự u tiên thực từ trái sang phải

4- Để thay đổi thứ tự −u tiên, dùng cặp dấu ngoặc đơn “( , )” Một cặp dấu ngoặc đơn xác định biểu thức con, nh− toán hạng tham gia cấu thμnh biểu thức lớn chứa

Để thể vμ rõ rμng biểu thức phức tạp cần phải sử dụng cặp dấu ngoặc đơn

VÝ dơ: TÝnh nghiƯm cña tam thøc bËc hai, nÕu ta viÕt

x1:= -b + sqrt (delta) / 2*a

sÏ nhận đợc x1 = -b + (sqrt(delta) /2) * a.

Để tính nghiệm ph−ơng trình bậc hai cần sửa lại lμ

x1:= ( -b + sqrt (delta)) / (2*a) ;

3 Các câu lệnh đơn giản

Turbo Pascal lμ ngơn ngữ lập trình cấu trúc Ngoμi câu lệnh đơn thực cơng việc xác định, có câu lệnh cho phép phối hợp tổ chức nhiều công việc theo quy tắc định Đó gọi lμ câu lệnh tạo cấu trúc điều khiển hay ngắn gọn lμ lệnh cấu trúc

Ta có sơ đồ phân loại câu lệnh nh− sau - Câu Lệnh đơn giản:

-LƯnh g¸n := -LƯnh xt write

-LƯnh nhËp read

-C¸c lƯnh kh¸c: goto, halt, exit

2- C©u lƯnh cÊu tróc

-LÖnh ghÐp begin - end

-LÖnh lùa chän if, case

-LƯnh lỈp for, repeat, while

(34)

3.1 LƯnh g¸n

G¸n gi¸ trÞ cho mét biÕn

Ngơn ngữ Pascal quy định dấu phép gán lμ dấu hai chấm, lμ dấu “:=”, đọc lμ “gán bằng”

Có ph¸p: biÕn:= biĨu thøc ;

Thực hiện: tính biểu thức vế phải, sau gán cho biến vế trái Ví dụ: x:= + 3*sin(2*a) ;

i:= maxSize MOD 3;

L−u ý:

- Chỉ có biến đ−ợc thay đổi giá trị, vế trái lệnh gán bắt buộc phải lμ biến

- Phép gán phải tơng thích kiểu liệu, nghĩa l biến vế trái phải có kiểu giống nh giá trị biểu thức vế phải

- Phép gán chấp nhận số chuyển đổi kiểu "tự nhiên" Ví dụ, gán giá trị nguyờn cho bin thc

Đề phòng: nhầm lẫn viết dÊu phÐp g¸n chØ cã dÊu b»ng, thiÕu dÊu hai chÊm DÊu b»ng “=” lμ dÊu cđa phÐp “so s¸nh b»ng nhau”

3.2 Lệnh in hình không kèm định dạng

3.2.1

3.2.2

Cú pháp

Có dạng câu lệnh in mμn h×nh:

Write( biĨu thøc) ; (1)

Write( biÓu thøc1 , biÓu thøc2 , , biÓu thøc n ) ; (2)

Writeln( biÓu thøc1 , biÓu thøc2 , , biÓu thøc n ); (3)

Writeln ; (4)

Thùc hiÖn

Nh− biết, mμn hình chế độ văn đ−ợc chia cột vμ dòng thμnh hình chữ nhật (thơng th−ờng có 80 cột vμ 25 dịng, tức lμ 2000 chữ nhật) Mỗi hiển thị kí tự bảng mã ASCII Ta gọi kí tự lμ vị trí

(35)

Dạng (1): vị trí chạy, in mμn hình giá trị của biểu thức theo quy cách mặc định kiểu liệu biểu thức đó. In xong chạy dừng vị trí cuối

Dạng (2): vị trí chạy, in mμn hình lần l−ợt giá trị biểu thức đến biểu thức n, nối tiếp liền Giá trị biểu thức đ−ợc in theo quy cách mặc định kiểu liệu In xong chạy dừng vị trí cuối

Nh vậy, thực chất câu lệnh dạng l viết gọn n câu lệnh dạng liền

Dạng (3): tác dụng nh dạng (1) nhng in xong thêm dấu xuống dòng, chạy dừng cột dòng dới

Dạng (4): in dấu xuống dòng tức l chạy xuống cột đầu dòng dới

3.3 Quy cách mặc định in kiểu liệu

3.3.1 Minh häa

LÖnh SÏ in

Write(1234); 1234

Write(-123.456); -1.2345600000E+02 Write('A');

write(chr(65)); write(#7);

A A

<Ph¸t mét tiÕng bip> Write(2>1); TRUE

Write(' Ha noi' );

Ha noi

3.3.2 Quy c¸ch

Tóm lại quy cách mặc định in kiểu liệu lμ:

- Số nguyên: có chữ số in nhiêu

- Số thực: in d−ới dạng dấu phẩy động, theo trình tự nh− sau: dấu +/-, chữ số phần nguyên (luôn khác 0), dấu chấm thập phân, 10 chữ số phần lẻ (thêm số vμo bên phải cần), chữ E, dấu phần mũ, hai chữ số giá trị phần mũ

- Kí tự: chiếm vị trí Nếu lμ kí tự điều khiển thực hμnh vi t−ơng ứng

(36)

3.3.3 VÝ dơ tỉng hỵp

Chơng trình bên trái in mn hình nh trình by cột bên phải Program In_ra_khong_dinh_dang;

Uses crt;

Var i: integer = 123; R: real = 123.456; Ch: char ='a'; B: boolean = 2>1;

Xau: string = ' Vietnam ';

BEGIN

Write(i); write(r); writeln;

Writeln(i,r); Write(ch,Xau,B); END

KÕt qu¶ in

123 1.2345600000E+02 123 1.2345600000E+02 a VietnamTRUE

Ta viết thử ch−ơng trình Pascal đơn giản thực vμi tính tốn có ích

Program HinhChuNhat; Uses crt;

Var Dai,Rong,ChuVi,DienTich: real; Begin

Clrscr;

Dai:= 5.0;

Rong:= 3.5;

ChuVi:= 2* (Dai + Rong); DienTich:= Dai * Rong ;

Writeln(' Chu vi la = ' , ChuVi );

Writeln(' Dien tich la = ' , DienTich); End

3.4 LƯnh in cã kÌm quy c¸ch

Để bố trí mμn hình kết đẹp đẽ vμ dễ đọc hơn, ta cần xếp mục in cho vị trí, dóng thẳng hμng, cột

Turbo Pascal cung cÊp c¸c lƯnh in có quy cách Nguyên tắc chung l:

(37)

Có ph¸p:

Write( biĨu thøc: n);

Phần “: n” thêm vμo sau biểu thức gọi lμ phần định dạng in

- Riªng víi sè thùc, cã thĨ in d−íi d¹ng biĨu diễn thập phân thông thờng cách rõ số vÞ trÝ dμnh cho toμn bé sè lμ n v số vị trí dnh cho phần lẻ l m

Có ph¸p:

Write( biĨu thøc sè thùc: n: m);

VÝ dơ, víi c¸c khai b¸o vμ gán trị nh chơng trình ta có

LÖnh SÏ in

Write (i:10); 123 Write (r:10);

Write (r:12:5);

-1.234E+02 -123.45600 Write (ch:12); a Write (b:12); TRUE

Tóm lại, có ấn định quy cách máy dμnh số vị trí để in giá trị biểu thức, lề từ bên phải, bỏ trống số vị trí thừa bên trái, cắt cụt (lμm sai giá trị !) thiếu chỗ

3.5 Lệnh in máy in

Để in máy in trớc hết cần bổ xung thêm vo đầu chơng trình dòng khai báo sử dụng máy in

Uses printer;

Sau câu lệnh Write, tr−ớc dãy mục cần in ra, cần thêm tham số LST lμ biến tệp đại diện cho máy in:

(38)

3.6 LÖnh nhập liệu từ bàn phím

3.6.1

3.6.2

3.6.3

Có ph¸p

Có dạng câu lệnh đọc liệu từ bμn phím

Read( biÕn); (1)

Read( biÕn , biÕn , , biÕn n) ; (2)

Readln( biÕn , biÕn , , biÕn n ); (3)

Readln ; (4)

Thùc hiÖn

Khi nhập liệu từ bμn phím mục liệu lμ giá trị trực tiếp Các câu lệnh gán giá trị trực tiếp đọc đ−ợc cho biến t−ơng ứng

Dạng (1): gặp lệnh nμy máy đọc từ bμn phím mục liệu, chuyển thμnh giá trị trực tiếp kiểu liệu biến vμ gán cho biến

Dạng (2): gặp lệnh nμy máy đọc từ bμn phím n mục liệu lμ

n giá trị trực tiếp vμ gán lần l−ợt cho n biến theo trình tự Đây lμ viết gọn n câu lệnh dạng

Dạng (3): nh− dạng (2), sau tìm đọc thêm dấu xuống dòng Con chạy dừng sau dấu xuống dòng

Dạng (4): Tìm đọc dấu xuống dịng Sau câu lệnh nμy, chạy đầu dòng Câu lệnh nμy th−ờng dùng để tạm dừng ch−ơng trình, đợi gõ phím Enter Ng−ời sử dụng ch−ơng trình có xem thơng báo, kết trung gian, kết cuối thực thi ch−ơng trình

Quy cách đọc liệu vμo

1- ChØ nhập từ bn phím kiểu liệu: số nguyên, số thực, kí tự v xâu kí tự Không thể nhập từ bn phím liệu kiểu logic

2- Phải đảm bảo gõ vμo t−ơng ứng số mục liệu vμ kiểu liệu Dữ liệu đ−ợc gõ vμo phải lμ giá trị trực tiếp hợp lệ Một giá trị số thực phải viết d−ới dạng thập phân với dấu chấm thập phân Giá trị kiểu kí tự vμ xâu kí tự khơng có cặp dấu nháy đơn bao quanh

Để hiểu rõ hμnh vi thủ tục Read đọc nhiều mục liệu liên tiếp cần nắm vững dấu hiệu phân cách mục liệu

1- C¸c mục liệu kiểu số (số nguyên, số thực) đợc phân cách (hoặc vi) dấu cách, dấu Tab, dấu xuống dòng Enter

2- Mục liệu kiểu kí tự khơng có dấu phân cách phía tr−ớc vμ phía sau Nghĩa lμ với kiểu kí tự máy đọc kí tự kể từ vị trí tại, kể lμ kí tự khoảng trống

(39)

trống Dãy kí tự xếp liền đ−ợc ngắt theo độ dμi n của biến xâu kí tự t−ơng ứng

Do đó, đọc vμo nhiều mục liệu cần l−u ý sử dụng dấu phân cách cho Máy đọc vμ phải đọc n mục liệu, sau thực câu lệnh Nếu ch−a đủ n mục liệu máy chờ đọc tiếp Nếu gõ nhiều mục sau lμ thừa

3.6.4 C¸c vÝ dơ minh hoạ

Giả sử m, n l biến nguyªn, x lμ biÕn thùc

Ví dụ: Câu lệnh đọc vμo

Read(m,n,x);

Cã thÓ gâ d÷ liƯu vμo nh− sau:

1 3.4 <Enter>

hc

1 <Enter> 3.4 <Enter>

hc

1 <Enter> <Enter> 3.4 <Enter>

KÕt qu¶ sÏ cã m:=1, n:=2, x:= 3.4.

Ví dụ 2: Giả sử khai báo biến xâu kí tự có độ dμi kí tự

Var s1,s2,s3: string[5];

Câu lệnh nhập liệu vo l

Readln (s1,s2,s3);

NÕu gâ tõ bμn phÝm

AB12CD34 Hanoi <Enter>

th× sÏ cã s1:= AB12C s2:= D34 Ha, s3:= noi.

3: Minh hoạ cách sử dụng c¸c thđ tơc Readln VÝ dơ

Giả sử m, n lμ biến nguyên, x lμ biến thực nh− ví dụ Nếu có lệnh đọc vμo

readln(m,n); readln(x);

vμ ta gâ vμo

1 3.4 <Enter>

thì máy đọc vμ gán đ−ợc m:=1, n:=2 sau xuống dịng Máy chờ để nhận tiếp giá trị cho x câu lệnh sau ch−a nhận đ−ợc liệu vμo Để nhập cần sửa lại thμnh

(40)

4 Mét sè hàm, thủ tục trình bày hình

Nhc lại mμn hình chế độ văn đ−ợc chia cột vμ dịng thμnh hình chữ nhật (thơng th−ờng có 80 cột vμ 25 dịng, tức lμ 2000 chữ nhật) Mỗi hiển thị kí tự bảng mã ASCII Để trỏ đến nμo đó, ta dùng cặp số nguyên x,y gọi lμ tọa độ mμn hình (x:= 80, y:=1 25)

Turbo Pascal cung cấp số hμm, thủ tục phục vụ việc trình bμy mμn hình chế độ văn Đây lμ th− viện mẫu ch−ơng trình gọi lμ unit CRT - Catot Ray Tube

Để sử dụng hμm, thủ tục phải khai báo sử dụng unit CRT đầu ch−ơng trình:

Uses crt;

Phần dới trình by công dụng cđa mét sè hμm, thđ tơc chÝnh hay dïng

Clrscr: Clear screen xoá mn hình, chạy vị trí (1,1) góc

trái

GotoXY(x,y) : Di chuyển chạy đến toạ độ (x,y)

Clreol: clear to end of line - xố kí tự từ vị trí chạy đến cuối dịng Sau đó, chạy dừng vị trí tr−ớc thực thủ tục nμy

Delline: Xố toμn dịng có chạy Sau đó, chạy dừng vị trí tr−ớc thực thủ tục nμy

WhereX: hm cho biết chạy cột no

WhereY: hm cho biết chạy dòng no

Windows (x1,y1,x2,y2): thiết lập khung vơ hình cửa sổ hiển thị Góc trái lμ (x1,y1) góc d−ới phải lμ (x2,y2). Từ lúc nμy trở đi, mμn hình coi nh− thu nhỏ lại hình chữ nhật nμy Toạ độ x=1, y=1 trùng với góc trên-trái mμn hình thu nhỏ Tóm lại, toạ độ đ−ợc tính lại nh− sau

Xmíi = Xcị - x1 +

Ymíi = Ycị - y1 + 1

C©u hái vμ bμi tËp

(41)

2 Các câu lệnh sau thực hiƯn viƯc g×

Writeln(' Cho so '); Readln(M,N); M:=M+5; N:=N*3;

Writeln(' M = ', M); Writeln(' N = ', N);

3 Trong ch−ơng trình có khai báo kiểu liệu vμ câu lệnh nh− d−ới Tìm câu lệnh đúng, tính giá trị biểu thức, tìm câu lệnh sai vμ giải thích

Const MaxI = 1000;

Var x,y: real;

M,N, I: integer;

Y:= -1.0; M:=3; N:=4; I:= M mod N;

I:=(990 - maxI) div M; I:= M mod y;

X:= PI * y; I:= M/N; X:= M/N;

X:= M mod (M/N);

I:= M mod (990 - maxI);

I:= (maxI - 990) div M; X:= M/y; I:= PI * M;

X:= PI div y; X:= M div N;

I:= (maxI - 990) mod M; I:= M mod 0;

I:= M mod (maxI - 990);

4 Trình by kết thực lệnh sau

Write (-88:4);

Writeln(‘Ha noi’: 10);

Writeln(‘-88’: 4, 88: 8: 2);

5 Giả sử x lμ biến thực, nhận giá trị -23.621 Các định dạng in sau in x nh− nμo

x:8:4 x:8:3 x:8:2 x:8:0 x:8

6 Giả sử dùng thủ tục Readln (a,b) để đọc vμo số từ bμn phím Phải gõ phím nμo sau gõ xong số thứ ? sau gõ xong số thứ hai ? Nếu đọc vμo hai biến kiểu kí tự a,b có thay đổi khơng

7 Giả sử dùng thủ tục Read để đọc vμo nhiều mục liệu từ bμn phím Điều xảy ta gõ thừa, gõ thiếu so với số mục cần thiết

thùc hμnh

H·y viết chơng trình thực công việc sau: Giải phơng trình bậc ax + b = 0.

2 Giải hệ phơng trình tuyến tính cấp 2: ax+ by = e , cx + dy = f, gi¶ thiet r»ng hƯ nhÊt nghiƯm

3 L·i xt tiÕt kiƯm hμng th¸ng lμ k= 1% TÝnh sè tiền có đợc sau 12 tháng số gửi ban ®Çu lμ x

(42)

5 Cho số đo độ dμi cạnh tam giác lμ a,b,c. Tính diện tích tam giác

(43)

Chơng4 Các cấu trúc điều khiển

Pascal lμ ngơn ngữ lập trình có cấu trúc Một ngơn ngữ lập trình cấu trúc có câu lệnh tạo cấu trúc điều khiển Những câu lệnh cấu trúc nμy cho phép kết hợp - hay "cấu trúc" - nhiều câu lệnh thμnh đơn vị thống nhất, liên quan chặt chẽ với

Những câu lệnh có cấu trúc lμm cho ch−ơng trình sáng dễ hiểu, đễ theo dõi

Cã lo¹i cấu trúc điều khiển: tuần tự, rẽ nhánh, vòng lặp

1 C©u lƯnh ghÐp

Cã thĨ nhóm nhiều câu lệnh khác thnh khối, dùng tõ kho¸ Begin, End

Có ph¸p: Begin

c©u lƯnh ;

c©u lƯnh n ;

End;

T¸c dơng:

Các lệnh bên đ−ợc thực từ câu lệnh đến câu lệnh n nh− thơng th−ờng, khơng có thay đổi Tuy nhiên câu lệnh ghép có tác dụng để nhóm nhiều lệnh lại thμnh một câu lệnh để phù hợp với cú pháp cấu trúc điều khiển sau nμy

2 C©u lƯnh IF

(44)

2.1 Có pháp công dụng Cú pháp:

- Trng hợp đầy đủ

If biÓu thức lô gic then

câu lệnh else

c©u lƯnh ;

Thực hiện: biểu thức lơ gic thi hμnh câu lệnh 1, trái lại, biểu thức lô gic lμ sai thi hμnh câu lệnh

- Trờng hợp lựa chọn:

Trong cấu trúc thiếu thnh phần Else Lúc ny câu lệnh sÏ trë thμnh

If biÓu thøc logic then

c©u lƯnh ;

Thực hiện: biểu thức lơ gic thi hμnh câu lệnh 1, trái lại, biểu thức lô gic lμ sai khơng lμm

D−ới lμ l−u đồ (flow chart) minh hoạ

true false true false

C©u lƯnh

C©u lƯnh C©u lƯnh 2

Hình 4.1: L−u đồ minh hoạ ý nghĩa câu lệnh If

VÝ dô:

IF a>b THEN max:= a

ELSE max:=b;

IF a <> 0 THEN x:= -b/a;

Chó ý:

1- Trớc từ khoá Else dấu chấm phÈy “ ; ”

(45)

2.2 Các ví dụ minh hoạ

Ví dụ Viết chơng trình nhận vo từ bn phím số khác không, l số dơng in thông báo "số dơng", l số âm in thông báo "số âm"

True false

x>0

Số dơng Số âm

Hỡnh 4.2: Lu ca ch−ơng trình xét dấu

Program XetDau ; Var x: real; Begin

Write(' cho mot so thuc khac khong' ); Readln(x) ; IF x > then write(' so duong' )

ELSE write (' so am' ) ; End

Ví dụ Giải ph−ơng trình bậc hai a x2 + b x + c Để đơn giản, ta xét tr−ờng hợp hệ số a khác không

True false

Delta <

True False

Delta =

V« nghiƯm Cã nghiƯm

(46)

Hình 4.3: L−u đồ ch−ơng trình giải tam thức bậc hai

Program PhuongTrinhBacHai; Uses crt;

Var a,b,c,delta,x1,x2: real; Begin

Clrscr;

Write(' Cho ba he so a b c:') ; Readln (a,b,c) ; Delta:= b*b - 4*a*c;

If Delta < then

Writeln(' Phuong trinh vo nghiem !') Else if delta = then

Writeln(' Phuong trinh co nghiem kep x1=x2= -b/(2*a)

Else {truong hop delta > 0} Begin

x1:= (-b + sqrt(delta)) /(2*a) ; x2:= (-b - sqrt(delta)) /(2*a) ; Writeln(' Phuong trinh co nghiem

x1= ',x1: 10:4,' x2 = ', x2:10:4 ); End;

End

2.3 If lång hay d∙y if

Khi nhiÒu lùa chän cã thĨ dïng c©u lƯnh If lång Ví dụ, giải phơng trình bậc hai, ta có tr−êng hỵp delta <0, delta=0, delta >0 vμ sư dơng c©u lƯnh If lång nh− vÝ dơ

Nhng hay gặp cách dùng dÃy câu lệnh If:

IF delta < THEN write('phơng trình vô nghiêm'); IF delta = THEN write('phơng trình có nghiệm kép'); IF delta > THEN write('phơng trình có hai nghiệ');

Về mặt lô gic hai cách viết l tơng đơng, nhng với câu lệnh If lồng kiểm tra điều kiện vμ c©u lƯnh kÕt thóc, nÕu dïng d·y câu lệnh If phải kiểm tra điều kiện Nếu điều kiện l phức tạp thì vô ích

Theo quy nh cỳ phỏp, viết nhiều câu lệnh If lồng nhau, thμnh phần Else gắn với If gần

Phong cách viết để tránh nhầm lẫn:

if ®iỊu kiƯn_1 then

c©u lƯnh_1

(47)

c©u lƯnh_2

else if ®iỊu kiƯn_n then

c©u lƯnh_n

else

c©u lƯnh_E

Nếu nh điều kiện không loại trừ nhau, giá trị đầu vo thoả mÃn nhiều điều kiện thứ tự điều kiện lμ quan träng

VÝ dơ: XÕp h¹ng häc sinh theo điểm tổng kết nh sau

Điểm Xếp hạng

còn lại

Giỏi Khá

Trung b×nh KÐm

Các câu lệnh ch−ơng trình thực việc xếp hạng học sinh phải đ−ợc viết thứ tự nh− sau

If Diem >= then Writeln(' Giái')

Else if Diem >= then Writeln(' Kh¸')

Else if Diem >= then Writeln(' Trung bình') Else Writeln(' Khơng đạt ');

Nếu đảo ng−ợc lại thứ tự kết sai điều kiện đ−ợc thực Bất kì học sinh nμo có điểm ≥ bị xếp hạng trung bình

CÇn l−u ý tiÕt kiƯm thời gian, điều kiện hay xảy nhất, có xác suất thoả mÃn cao nhất, nên kiểm tra trớc

2.4 AND hay IF lång

Có trờng hợp cần lựa chọn nhiều điều kiện phụ thuộc nhiều biến khác Ví dụ, tiêu chuẩn tuyển nhân viên: nam, tuổi 18-25, cao >=170, Thông thờng điều kiện đợc kết hợp toán tử lô gic

And, Or

Cũng cã thĨ dïng c©u lƯnh If lång nh− sau IF gioi = nam THEN

IF tuoi >= 18 THEN IF tuoi <= 25 THEN

(48)

Có trờng hợp nên dùng If lồng Ví dơ ®iỊu kiƯn (x <> 0)

AND (y/x > 2.5) có thể gây lỗi chia cho không trình biên dịch thực

hin ỏnh giỏ biu thức lôgic từ phải sang Nên chuyển thμnh IF x<> THEN

IF y/x > 2.5 THEN

3 C©u lƯnh CASE

Khác với lệnh If, rẽ hai nhánh tuỳ theo biểu thức logic đúng hay sai, câu lệnh Case để rẽ nhiều nhánh, tuỳ theo giá trị khác

biĨu thøc BiĨu thøc nμy gäi lμ c¸i chän - selector

3.1 Cú pháp tác dụng

3.1.1

3.1.2

Cú pháp - Tr−ờng hợp đầy đủ

Case biÓu thøc of

TËp h»ng : c©u lƯnh ;

TËp h»ng n : c©u lƯnh n else

c©u lƯnh n+1 ; end ;

- Có thể thnh phần Else, lúc ny câu lênh Case trở thnh

Case biểu thøc of

TËp h»ng : c©u lƯnh ;

TËp h»ng n : c©u lƯnh n

end ;

Thùc hiƯn

- Tính giá trị biểu thức lựa chän

- So khớp lần l−ợt với giá trị tập i, từ xuống d−ới Nếu tập i lμ tập đầu tiên chứa giá trị trùng với giá trị biểu thức lựa chọn máy thực câu lệnh i t−ơng ứng, sau khỏi lệnh Case

(49)

3.2 VÝ dơ minh ho¹

Ví dụ 1: Viết ch−ơng trình nhận vμo từ bμn phím số nguyên d−ơng thuộc khoảng 10, coi lμ điểm tổng kết môn học học sinh, sau phân loại học sinh theo quy định sau: điểm từ đến lμ kém, điểm lμ

trung bình, điểm đến lμ khá, điểm 9,10 lμ giỏi

DÔ nhËn thÊy r»ng khung chơng trình l câu lệnh lựa chọn Case

Uses crt;

Var diem: integer;

XepLoai: String; Begin

Write(' cho biet diem cua hoc sinh: ') ; Readln(diem) ; Case diem of

0 4: XepLoai:= ' Kem ';

5 : XepLoai:= ' Trung binh'; 8: XepLoai:= ' Kha ';

9 10: XepLoai:= ' Gioi '; else

begin

writeln(' Khong co muc diem ', diem) ;

halt(1);

end End;

Writeln(' Hoc sinh duoc xep loai ', XepLoai); End

Ví dụ - Một bảng chọn đơn giản: Viết ch−ơng trình in thực đơn bữa sáng vμ cho phép khách hμng gõ số 1,2,3 để chọn, sau in thơng báo khẳng định lựa chọn khách hμng

Uses crt;

Var Chon: integer; Begin

Writeln(' - Ca phe va banh ngot '); Writeln(' - Sua va banh mi ');

Writeln(' - Xoi '); Writeln(' - Pho '); Writeln;

Write(' Ban chon mon gi: ') ; Readln(Chon) ; Case Chon of

(50)

3: Write(' Ban muon dung Xoi '); 4: Write(' Ban muon dung Pho '); End;

End

3.3 Chó ý

1- C¸c tËp h»ng i cã thĨ gåm hằng, gồm nhiều cách dấu phẩy, l đoạn Ví dụ

CASE biểu thức sè häc kiĨu Integer OF 0: lƯnh 1 ;

1,3,5 : lÖnh 2 ;

2,4,6 10: lÖnh 3 ; END;

- biểu thức lựa chọn câu lệnh Case phải nhận giá trị thuộc kiểu vô h−ớng đếm đ−ợc (rời rạc) nh−: số nguyên, kí tự, logic, liệt kê

3 - câu lệnh If - Then - Else tơng ®−¬ng víi CASE biĨu thøc logic OF

True: lÖnh ; False: lÖnh 2 ; END;

4 - Cã thĨ dïng c©u lƯnh If lång thay cho câu lệnh Case Tuy nhiên so sánh với câu lƯnh If lång th× Case dƠ hiĨu, dƠ dïng h¬n

Mặt khác, Case khơng dùng đ−ợc biểu thức điều kiện để chọn lựa có kiểu giá trị số thực xâu kí tự Lúc nμy có th dựng If lng

3.4 Các lỗi thờng gặp

Khi xây dựng cấu trúc lựa chọn với câu lệnh If, Case thờng hay mắc lỗi sau:

a)- Có dấu chấm phẩy ; tr−íc Else

b)- Dïng biĨu thøc lùa chän cã kiểu số thực xâu kí tự câu lệnh

Case.

c) - Viết sai biểu thức lôgic, thiếu dấu ngoặc kết hợp nhiều điều kiện Ví dụ viết x > And y > 0 thứ tự −u tiên phép so sánh thấp phép tốn lơgic And, máy đánh giá biểu thức nμy thμnh x >

(0 And y) > 0, hon ton điều ta mong muốn

(51)

cuèi cïng biÖt thøc delta dơng ta cần thực nhiều việc: tính nghiệm thø nhÊt, tÝnh nghiƯm thø hai, in kÕt qu¶ NÕu thiếu lệnh ghép

Begin - End nh dới câu lệnh If - Then - Else coi nh kÕt

thóc sau tÝnh nghiƯm x1 C©u lƯnh tÝnh x2 tiÕp theo sÏ kh«ng thc vμo cÊu tróc rẽ nhánh điều khiển If Nó đợc thực trờng hợp Chơng trình mắc lỗi delta dơng

Else {truong hop delta > 0} {Begin}

x1:= (-b + sqrt(delta)) /(2*a) ; x2:= (-b - sqrt(delta)) /(2*a) ;

Writeln(' Phuong trinh co nghiem x1= ', x1: 10:4,' x2 = ', x2:10:4 );

{End;}

4 C©u lÖnh FOR

Cấu trúc lặp lμ cấu trúc nhằm cho phép thực lặp lặp lại số công việc nhiều lần Câu lệnh For lμ để xây dựng cấu trúc lặp với số lần lặp biết rõ từ tr−ớc

4.1 Có ph¸p tác dụng

4.1.1

4.1.2

Cú pháp - Dạng tiến

For biến:= biểu thøc to biĨu thøc 2 do c©u lƯnh ;

- D¹ng lïi

For biÕn:= biÓu thøc downto biÓu thøc do câu lệnh ;

Thnh phần biến câu lệnh For gọi l biến điều khiển vòng lặp Kiểu biến điều khiển vòng lặp, biểu thức 1, biĨu thøc 2 ph¶i lμ

kiểu vơ h−ớng đếm đ−ợc (số nguyên, kí tự, liệt kê)

Thùc hiÖn

- Tr−êng hợp For dạng tiến , bớc l 1- biến nhận giá trị biểu thức 1

2- kiĨm tra ®iỊu kiƯn biÕnbiĨu thøc 2

3- Nếu điều kiện l sai vòng lặp For kÕt thóc, m¸y chun xng lƯnh tiÕp theo

(52)

- thùc hiƯn c©u lƯnh

- tăng biến lên bớc, biến := Succ(biến) v quay lại bớc - Trờng hợp For dạng lùi , c¸c b−íc sÏ lμ

1- biÕn nhËn gi¸ trị biểu thức 1

2- kiểm tra điều kiƯn biÕnbiĨu thøc 2

3- NÕu ®iỊu kiện l sai vòng lặp For kết thúc, máy chun xng lƯnh tiÕp theo

Nếu điều kiện cịn thì: - thực câu lệnh

- giảm biến bớc, biến:= Pred(biến) v quay lại b−íc

4.1.3 Chó ý

1- Khơng đ−ợc lμm thay đổi giá trị biến điều khiển vịng lặp câu lệnh nμo bên vịng lặp, nh− số lần lặp thay đổi theo, chí dẫn đến lặp vơ hạn không kết thúc đ−ợc

2- Giá trị biến điều khiển khỏi vịng lặp For lμ khơng xác định

3- Giá trị biểu thức 1, biểu thức 2 câu lệnh For đ−ợc tính tr−ớc vμo vịng lặp Vì thế, thay đổi giá trị biến tham gia vμo biểu thức 1, biểu thức bên vòng lặp mμ khơng ảnh h−ởng 4.2 Ví dụ minh hoạ

Ví dụ 1: Viết ch−ơng trình in mμn hình bảng nhân với số từ đến 10, trình bμy nh− sau

1 x = x = 10

Rõ rμng vịng lặp For lμ cơng cụ tiện lợi để thực công việc Uses crt;

Var i: integer; BEGIN

Clrscr;

FOR i:= TO 10 DO Begin

Write(i); write(' x = '); writeln(i*5); end

END

(53)

Tr−ờng hợp nμy ta dùng vịng lặp For nh−ng sử dụng biến kiểu kí tự để lμm biến đếm vòng lặp

Uses crt;

Var ch: char; BEGIN

FOR ch:= 'a' TO 'z' DO

Writeln(ch, ' co ma ASCII la = ', ord(ch)); END

5 C©u lƯnh Repeat

Có nhiều tr−ờng hợp cần thực nhiều lần cơng việc nμo nh−ng số lần lặp lại không đ−ợc biết tr−ớc Ta biết điều kiện kiểm tra, cần lặp lặp lại công việc điều kiện nμy đ−ợc thoả mãn Ví dụ, giải gần ph−ơng trình, hệ ph−ơng trình ph−ơng pháp lặp với yêu cầu độ xác cho tr−ớc hay việc cho chạy thử ch−ơng trình nhiều lần để kiểm tra, dừng lại ta chọn K cho câu hỏi C/K (có tiếp tục hay khơng?)

Câu lệnh Repeat - Until dμnh để thực cấu trúc lặp nh− 5.1 Cú pháp tác dụng

5.1.1

5.1.2

Có ph¸p

Repeat

C©u lƯnh 1 ; …

c©u lƯnh n ; Until biÓu thøc logic ;

False

True C©u lƯnh

C©u lƯnh n

Hình 4.4: L−u đồ minh hoạ hoạt đọng câu lệnh Repeat-Until

Thùc hiÖn

(54)

2 - Sau tính biểu thức logic, sai quay lại b−ớc 1, kết thúc câu lệnh Repeat - Until

5.1.3 Chó ý

1- Khơng cần dùng câu lệnh ghép Begin-End để nhóm câu lệnh 1, , câu lệnhn nằm vòng lặp Repeat - Until Chúng đ−ợc giới hạn nằm từ khố Repeat, Until

2- Trong vịng lặp phải có lệnh nμo để thay đổi giá trị ca biu

thức logic Nếu không bị lặp vô hạn, mÃi không dừng

5.2 Ví dụ minh hoạ

Ví dụ 1: Viết chơng trình nhận từ bn phím số nguyên, in thông báo số vừa cho có chữ số

Phân tích: Nếu đếm số chữ số từ phải sang trái tức lμ từ hμng đơn vị trở lên hμng chục, hμng trăm,v.v điều nμy t−ơng đ−ơng với việc lặp lại nhiều lần phép chia số cho cho 10 giữ lại phần nguyên, kết khơng dừng Số lần thực phép chia lμ số chữ số

Uses crt;

Var i: integer; Dem: byte; BEGIN

Clrscr;

Write(' Cho mot so nguyen: '); readln(i);

Dem:= 0;

REPEAT

i:= i div 10; dem:= dem + 1: UNTIL i = 0;

Write(' so vua nhap co ',dem,' chu so '); Readln;

END

Các trờng hợp thờng dùng câu lÖnh Repeat - Until

- Để kiểm tra việc nhập liệu từ bμn phím cho kiểu, phạm vi Nếu liệu vμo lμm lại

- Để chạy kiểm tra (test) ch−ơng trình nhiều lần với liệu đầu vμo khác nhau, ng−ời dùng thoả mãn vμ kết thúc

- Để xây dựng chơng trình điều kiển bảng chän

(55)

Repeat

Write(' Cho Gio Phut Giay: '); Readln( Gio, Phut, Giay);

Until (0 <= Gio) AND (Gio <= 23) AND (0<= Phut) AND (Phut <= 59) AND (0 <= Giay) AND (Giay <= 59);

Ví dụ 3: Để thực giải phơng trình bậc hai nhiều lần với hệ số a,b,c khác ta cần thêm vo chơng trình biến TiepTục kiểu

Char v vòng lặp Repeat - Until nh− sau Begin

Clrscr; REPEAT

Write(' Cho ba he so a b c:') ; Readln (a,b,c) ;

lệnh thực giải phơng tr×nh bËc hai

Write('Go phim bat ki de tiep tuc, go n de ket thuc !'); Readln(TiepTuc);

UNTIL TiepTuc = 'n'; End

VÝ dơ 4: Lμm b¶ng chän

Một ch−ơng trình điều khiển bảng chọn cho phép ng−ời sử dụng chọn số nhiều cơng việc để thi hμnh Sau kết thúc công việc lại quay bảng chọn để ng−ời dùng tiến hμnh chọn lμm việc khác ch−ơng trình kết thúc ng−ời dùng chọn mục "Kết thúc"

Nếu đánh số mục chọn lμ 1,2,3 giá trị -1 lμ khơng hợp lệ Có thể lấy lμm giá trị canh chừng để kết thúc hoạt động bảng chọn Khuôn mẫu đoạn ch−ơng trình điều khiển bảng chọn nh− sau VAR Chon: integer ;

REPEAT

Writeln(' 1- C«ng viƯc 1 '); Writeln(' 2- C«ng viƯc '); Writeln(' 3- Công việc 3 ');

Write(' Bạn chän môc nμo: '); Readln(Chon); CASE Chon OF

1: begin lệnh thực công việc end; 2: begin lệnh thực công việc end; 3: begin lệnh thực công việc end;

(56)

END; UNTIL Chon = 0;

6 C©u lƯnh While

Câu lệnh While để xây dựng cấu trúc lặp với số lần lặp ch−a biết tr−ớc giống nh− câu lệnh Repeat-Until Điểm khác lμ chỗ, với câu lệnh Repeat-Until công việc đ−ợc lặp lại điều kiện ch−a thoả mãn, sai vμ kết thúc điều kiện trở thμnh Trái lại, với câu lệnh

While công việc đ−ợc lặp lại điều kiện cịn vμ kết

thóc điều kiện không đợc thoả mÃn nữa, trở thnh sai 6.1 Cú pháp công dụng

True False

6.1.1

6.1.2

6.1.3

Có ph¸p

While biÓu thøc logic do

c©u lƯnh ;

Hình 4.5: L−u đồ minh hoạ hoạt động câu lệnh While

Thùc hiÖn

Xem l−u hỡnh trờn

1 - Tính giá trị biÓu thøc logic,

2 - Nếu đúng, thực câu lệnh vμ quay lại b−ớc - Nếu sai, kết thúc câu lệnh While

Chó ý

1- Trong phần câu lệnh tức lμ phần thân vịng lặp, phải có lệnh lμm biến đổi giá trị biểu thức lơgic điều khiển vịng lặp Nếu khơng vịng lặp khơng thể kết thúc

2- Nếu vòng lặp gồm nhiều câu lệnh phải dùng Begin - End để ghép thμnh câu lệnh cho cú pháp cấu trúc lặp với While Nếu ta quên điều nμy câu lệnh đơn sau từ khố Do lμ thuộc vịng lặp Các lệnh nằm ngoμi, không thuộc cấu trúc lặp

(57)

3- Điểm khác WhileRepeat - Until cần nắm vững để vận dụng tình lμ nh− sau Trong cấu trúc Repeat - Until,

phần câu lệnh đựơc thực tr−ớc kiểm tra điều kiện sau Trái lại cấu trúc While, điều kiện đ−ợc kiểm tra tr−ớc, thực lệnh Do dùng Repeat - Until phần câu lệnh đ−ợc thực lμ lần, cịn với While câu lệnh không đ−ợc thực lần nμo

6.2 VÝ dơ minh ho¹

VÝ dơ 1: Tổng n số hạng chuỗi điều ho lμ S = 1+1/2

+1/3 + + 1/n Hỏi n nhỏ phải lμ để S v−ợt

ng-−ìng lμ sè A cho tr−íc Uses crt;

Var i, A: integer; S: real; Begin

Clrscr;

Write(' cho so A:' ) ; Readln(A) ;

I:=1; S:=1;

While S < A Begin

I:=i+1;

S:=S+ 1/i ;

End;

Write(' Can it nhat ' , i , 'so hang' ); End

Ví dụ 2: Tính giá trị hμm sin(x) theo c«ng thøc xÊp xØ

sinx = x- x3/3! + x5/5! + x7/ 7!

cho đến đạt độ xác epsilon cho tr−ớc So sánh với kết nhận đ−ợc dùng hμm chuẩn sin(x) Turbo Pascal

uses crt;

var eps,x,y,s: real; i, sign: integer; BEGIN clrscr;

write(' Cho chinh xac eps= '); readln(eps); write(' Cho x= '); readln(x);

y:=x;s:=x;i:=3;sign:=-1; While (s >= eps)

Begin

s:= s*x*x / ((i-1)*i);

(58)

sign:= -sign;

i:=i+2;

end;

writeln(' Sin(x) = ',y:1:5);

write(' Sai khac voi ham chuan sin(x) cua TurboPascal la = ', y-sin(x):0:5);

readln; END

7 Xây dựng cấu trúc lặp

Phần nμy trình bμy số mẫu hình xây dựng cấu trúc lặp để xử lí tình hay gặp

7.1 §iỊu khiĨn vòng lặp giá trị canh chừng

Vớ dụ: Viết ch−ơng trình để nhập vμo vμ cộng tích luỹ để tính tổng số tiền bán hμng ngμy cửa hμng Số lần bán hμng nói chung thay đổi ngμy, khơng biết tr−ớc Vì số tiền bán hμng lμ số d−ơng nên giá trị khơng phải lμ giá trị hợp lệ Ta lấy giá trị nμy lμm dấu hiệu chấm hết dãy số liệu cần nhập Số lμ giá trị canh chừng để kết thúc cơng việc

1- d÷ liệu vo := giá trị ;

2- While dữ liệu vo <> giá trị canh chừng do

begin

d÷ liệu vo:= giá trị ;

end;

Cụ thể vòng lặp đợc xây dùng nh− sau

Write(' cho so tien, – ket thuc '); Readln(SoTien);

WHILE SoTien <> DO Begin

TongSo:= TongSo + SoTien;

(59)

7.2 Điều khiển vòng lặp cờ báo

Một bμi toán th−ờng hay gặp xử lí thơng tin lμ tìm kiếm Thực chất việc tìm kiếm lμ lặp lại nhiều lần phép kiểm tra điều kiện nμo thoả mãn điều kiện tức lμ tìm thấy

Khn mẫu chung để thực việc tìm kiếm lμ xây dựng cấu trúc lặp điều khiển cờ báo nh− sau Một biến kiểu boolean đ−ợc dùng để đánh dấu kiện tìm thấy Nó đ−ợc gọi lμ cờ báo Tr−ớc vμo cấu trúc lặp, cờ báo đ−ợc đặt lμ False Khi tìm thấy, cờ báo đ−ợc thiết lập lμ True vμ vòng lặp kết thúc

1- cê b¸o:= false;

2- While not cê b¸o do

begin

if tìm thấy then cờ báo:= true;

end;

Ví dụ: Tìm số ph−ơng nhỏ lớn x, số x nhập từ bμn phím Ta duyệt số, x, để tìm số ph−ơng Khi tìm thấy số kt thỳc

Cấu trúc lặp đợc xây dựng nh sau TimThay:= False;

So:= x;

WHILE not TimThay DO

If Trunc(sqrt(So)) = sqrt(So) then

TimThay:= True

Else So:=So+1;

Writeln(' So chinh phuong = ', So);

8 Các lệnh kết thúc sớm vòng lặp chơng trình

8.1 Lệnh nhảy không điều kiÖn - goto

Goto nh·n ;

Goto lμ lệnh nhảy không điều kiện, cho phép nhảy từ nơi nμo bên ch−ơng trình hay ch−ơng trình đến vị trí đánh dấu

(60)

1- Khai báo nhÃn: Phải khai báo nhÃn đầu phần khai báo, trớc khai báo c¸c h»ng

Có ph¸p khai b¸o nh·n: tõ kho¸ Label, danh s¸ch nh·n, dÊu chÊm phÈy Danh s¸ch nhÃn l dÃy tên nhÃn, cách dấu phẩy

2- Đánh đấu đích: Trong thân ch−ơng trình vị trí đích nhảy đến lệnh Goto cần đánh dấu tr−ớc

Cú pháp đánh dấu đích tên nhãn: tên nhãn, dấu hai chấm, câu lệnh đích 3- Viết câu lệnh Goto nhãn;

L−u ý, víi lệnh nhảy không điều kiện Goto

- Có thể nhảy từ vòng lặp ngoi

- Không cho phép nhảy từ ngoi vo vòng lặp, từ ngoi vo chơng trình

Nói chung nên tránh dùng câu lệnh nhảy không điều kiện Goto đợc phá vỡ cấu trúc lệnh điều khiển, khó theo dõi

8.2 Lệnh chấm dứt sớm vòng lặp

Break;

Lệnh Break có tác dụng chấm dứt chừng vòng lặp dù cha kết thúc

Vớ dụ: Kiểm tra số nguyên q nhập từ bμn phím có phải lμ số ngun tố hay khơng Ta duyệt phép chia q MOD i với i từ đến bậc hai q Nếu phép chia chẵn q khơng phải lμ số ngun tố vμ kết thúc vịng lặp

var i,q: integer;

NguyenTo: boolean; begin

write('cho so q: '); readln(q); NguyenTo:= True;

for i:=2 to trunc(sqrt(q))+1 if q mod i = then

begin NguyenTo:= False;

break;

end;

if NguyenTo then Write(q,' la so nguyen to ') else write(q,' khong nguyen to');

(61)

Để giải bμi tốn tìm số ngun tố lớn nhỏ số ngun n nhập vμo từ bμn phím, lμm t−ơng tự Ta lại dùng vòng lặp For để duyệt từ n trở xuống vμ dừng tìm thấy số nguyên tố

For q:= n downto

If q lμ sè nguyªn tè then break; Chó ý:

- LƯnh Break cho phép thoát khỏi kiểu vòng lặp For, While hay Repeat-Unitl.

- Nếu có nhiều vòng lặp lồng câu lệnh Break cho phép thoát khái

một vịng lặp bên chứa Các vịng lặp bên ngoμi hoạt động bình th−ờng

8.3 Lệnh thoát khỏi chơng trình

Exit;

LƯnh kÕt thóc vμ tho¸t khái chơng trình

- Nu bờn chng trình lệnh nμy lμm chấm dứt ch−ơng trình (mặc dù ch−a đến câu lệnh cuối) vμ trở ch−ơng trình bên ngoμi gọi ch−ơng trình

- Nếu chơng trình lệnh ny chấm dứt chơng trình v dừng

8.4 Lệnh dừng chơng trình bất thờng

Halt;

L lệnh dừng chơng trình Lệnh ny đợc sử dụng xảy lỗi, sai sót nghiêm trọng, việc tiếp tục thực chơng trình l nguy hiểm ý nghĩa

Câu hỏi v bi tập

1 Các lỗi hay mắc phải viết câu lệnh If, câu lệnh Case l

(62)

3 Khi nμo th× dïng vòng lặp For ?

4 S ln lp ớt vịng lặp For, While, Repeat lμ Vòng lặp nμo dùng để thực bảng chọn

6 Vòng lặp nμo th−ờng dùng để kiểm tra việc nhập liệu hợp lệ

Thùc hμnh

1 Viết ch−ơng trình giải ph−ơng trình bậc nhất, ph−ơng trình bậc hai, hệ ph−ơng trình tun tính ẩn Xét đủ tr−ờng hợp

2 Viết chơng trình in thông báo gõ phím loại no: dấu phép toán + - * / < > , dÊu chÝnh t¶ ,: ; ! ? chữ số 0,1 9 chữ A Z, a z hay c¸c kÝ hiƯu kh¸c

3 Lμm bμi nh−ng dïng c©u lƯnh If lång

4 Nhập số nguyên N gồm chữ số, in mμn hình cách đọc số nμy lời

5 Lập ch−ơng trình để tính số ngaỳ trơi qua kể từ đầu năm gõ vμo ngμy năm

6 BiÕt ngμy h«m lμ ngy thứ Viết chơng trình in thứ tuần ngy D, M, Y (1<=D<=31, 1<=M<=12, Y= 2001).

7 Viết chơng trình in thứ tuần ngy d,m,y. Thuật to¸n: thø = {d+2m+3(m+1) div + y + y div + 1} div 7, víi quy −íc th¸ng 1=tháng 13 năm trớc, tháng 2= tháng 14 năm trớc, tháng khác giữ nguyên, 0=thứ 7, 1= chủ nhật, 2=thø hai,v.v

8 Viết ch−ơng tình tính c−ớc điện thoại, đầu vμo lμ thời gian bắt đầu gọi vμ độ dμi (theo phút) Có giảm giá 1/3 ngoμi lμm việc, giảm giá nửa từ 21.00 đến 6.00 Giá chuẩn lμ x đ/1 phút

9 Lập chơng trình in bảng nhân (bảng cưu ch−¬ng)

10 Tìm tất nghiệm ngun d−ơng ph−ơng trình vơ định 2x+4y =

100

11 Giải bi toán cổ:"vừa g vừa chó " v "trăm trâu trăm cỏ " cách thử hết trờng hợp

12 Tìm tất số nguyên dơng a,b khoảng [1 100] cho a2 +

b2 lμ sè chÝnh ph−¬ng

13 TÝnh tỉng sinx/cosx + (sinx + sin2x/cox+ cos2x) + + (sinx + +

sinnx/cox+ + cosnx), sè n nhËp tõ bμn phÝm

14.TÝnh giá trị đa thức (theo phơng pháp Horne)

P(x) = x + 2x2 + 3x3 + + 10x10

15 Kiểm tra xem số cho có phải lμ số ngun tố khơng 16 Tìm vμ in số nguyên tố <1000

17 In mμn h×nh hình tam giác vuông, tam giác cân dấu *, chiều cao 10 dòng mn hình

(63)

19 In m· ASCII cña kÝ tù gõ từ phím Chơng trình dừng gõ phím số

20 Kiểm tra việc nhập từ bμn phím ngμy tháng hợp lệ Yêu cầu gõ lại

21 T×m −íc chung lín nhÊt số nguyên dơng a,b nhập từ bn phím T×m −íc chung lín nhÊt cđa sè a,b,c,d.

22 Tạo bảng chọn đơn giản gồm mục sau: 1- giải ph−ơng trình bậc nhất; 2-giải ph−ơng trình bậc hai; 3-giải hệ ph−ơng trình tuyến tính ẩn; 4- Kết thúc Gõ số 1,2,3,4 để chọn công việc t−ơng ứng

23 Tìm số n nhỏ để Sn= 1+1/2 +1/3 + + 1/n > a. Số a nhập từ bμn phím

24 Tính gần số π theo công thức

π/4 = 1-1/3 + 1/5 - 1/7 + + (-1)n.1/(2n+1)

a-) Khi cho tr−íc sè n

b-) Khi cho tr−ớc độ xác Epsilon = 10-5 (chuỗi đan dấu nên sai số < số hạng cuối cùng)

25 Tính gần sin x = x - x3/3 + x5/5 - x7/7 + với sai số Epsilon cho tr−ớc So sánh kết vơi hμm chuẩn sin x Turbo Pascal

26 Cho phơng trình a) y = ex + sinx - = 0,

b) y= x.2x - =

(64)

Ch−ơng5 Định nghĩa Các kiểu liệu đơn giản

1 Khai báo kiểu liệu

Cỏc kiu chun có sẵn nh− integer, real, char, boolean lμ kiểu thơng dụng Vì chúng đ−ợc định nghĩa sẵn vμ ta sử dụng để khai báo biến nh− thấy

Các kiểu chuẩn có sẵn khơng thể đáp ứng đầy đủ nhu cầu xử lí bμi tốn thực tế phong phú vμ đa dạng Các ngơn ngữ lập trình nói chung vμ Turbo Pascal nói riêng, cho phép ng−ời sử dụng định nghĩa kiểu liệu phù hợp với bμi tốn

1.1 Có ph¸p chung

Khung cú pháp chung để khai báo kiểu liệu lμ: Type tên kiểu = mô tả kiểu liu mi ;

Diễn giải: Từ khoá TYPE, tên kiểu liệu mới, dấu bằng, mô tả kiểu

d÷ liƯu míi, dÊu chÊm phÈy

Chỉ sau khai báo kiểu liệu đ−ợc sử dụng ch−ơng trình Nghĩa lμ khai báo biến có kiểu xây dựng kiểu khác dựa

1.2 VÝ dơ

VÝ dơ 1: Ta cã thĨ "ViƯt hoá" số tên kiểu tiếng Anh cách sau TYPE

SoNguyen = integer;

SoThuc = real;

KiTu = char;

Sau sử dụng tên kiểu Việt hoá nμy khai báo biến: VAR

(65)

a,b,c: SoThuc;

GoPhim, Chon: KiTu;

Ví dụ 2: Xét bμi tốn giải hệ ph−ơng trình đại số tuyến tính gồm 10 ph−ơng trình, 10 ẩn Rõ rμng lμ ta phải lμm việc với véc tơ vμ ma trận Cần phải định nghĩa "kiểu véc tơ gồm 10 thμnh phần" vμ "kiểu ma trận 10 x 10" chúng khơng phải lμ kiểu chuẩn, có sẵn

TYPE

Vecto10 = array [1 10] of real ;

Matran10 = array [1 10,1 10] of real ;

Bên trái dấu lμ tên kiểu Bên phải dấu lμ mô tả xây dựng kiểu Kiểu Vecto10 lμ dãy 10 số thực liền nhau, kiểu

Matran10 sÏ lμ bé 100 số thực đợc xếp thnh 10 hng, 10 cột Y nghÜa cđa

tõ kho¸ Array vμ c¸ch sư dụng đợc trình by chi tiết chơng nãi vỊ m¶ng

Sau định nghĩa kiểu Vecto10, Matran10 ta khai báo biến thuộc kiểu nh− quy định chung:

VAR

X,Y: Vecto10;

A,B,C: Matran10;

Ta gặp nhiều ví dụ khai báo kiểu liệu phần

2 Kiểu liệt kê

2.1 Định nghĩa cú pháp

Kiểu liệt kê - Enumerated Scalar Type - lμ kiểu liệu thô sơ nhất, xác định cách liệt kê tất "giá trị" có liệu, giá trị đ−ợc đại diện tên gọi ng−ời lập trình đặt

2.1.1 Có ph¸p

Phần mơ tả kiểu liệu khai báo kiểu liệt kê có cú pháp nh− sau: dấu mở ngoặc, danh sách tên giá trị, dấu đóng ngoặc

(66)

ở đây, tên giá trịtên theo quy định đặt tên Pascal Danh sách gồm tên giá trị, cách dấu phẩy L−u ý cặp dấu ngoặc đơn bao quanh danh sách giá trị

Sau khai báo kiểu liệt kê, ta khai báo biến theo quy tắc thông th−ờng

Var tªn biÕn: tªn kiĨu ; 2.1.2

2.2.1

VÝ dô

TYPE NgayTrongTuan = (CN, Thu2, Thu3, Thu4, Thu5, Thu6,Thu7);

MauCoBan = (Do, Xanh, Vang);

XeMoTo = (Honda, Yamaha, Suzuki, Vespa);

VAR NgayHocToan, NgayHocTin: NgayTrongTuan ; Xe1, Xe2: XeMoTo ;

Mau1, Mau2: MauCoBan ;

- Có thể kết hợp khai báo biến kiểu liệt kê kèm với mô tả xác định kiểu lúc nh− sau:

VAR

NgayHocToan, NgayHocTin: (CN, Thu2, Thu3, Thu4, Thu5,

Thu6, Thu7);

Mau1, Mau2: (Do,Xanh,Vang);

Cácbiến NgayHocToan, NgayHocTinMau1, Mau2 lμ biến kiểu liệt kê, nh−ng ta không đặt tên cho kiểu mμ Việc đặt thêm tên kiểu mới, dùng từ khoá Type tiện sử dụng vμ lμm ch−ơng trình dễ hiểu

2.2 Tính chất phép toán

Thứ tự kiĨu liƯt kª

Kiểu liệt kê lμ kiểu có thứ tự Thứ tự giá trị lμ thứ tự liệt kê chúng danh sách Giá trị đứng tr−ớc danh sách nhỏ giá trị đứng sau

VÝ dô:

Thu2 < Thu3 cho kÕt qu¶ lμ True,

(67)

2.2.2

2.2.3

2.2.4

Gán giá trị

Phép gán với vế phải l tên giá trị danh sách Ví dụ:

HomNay:= Thu2;

XeMoiNhap:= Honda;

Mau1:= Xanh;

- C¸c hμm chuÈn

Ord : cho thứ tự giá trị đối số danh sách liệt kê Thứ tự bắt đầu tính từ

Ord (CN) = 0; Ord (Thu2) = 1, v.v

Pred: cho giá trị đứng tr−ớc danh sách,

Pred (Thu2) = CN; Pred (Thu3) = Thu2, v.v

Hμm Pred không xác định đối số lμ giá trị đứng đầu danh sách liệt kê

Pred (CN) khơng xác định, có lỗi chạy ch−ơng trình - run time

error

Succ: cho giá trị đứng sau danh sách

Succ (Thu3) = Thu4; Succ (Thu4) = Thu5, v.v

Hμm Succ không xác định đối số lμ giá trị đứng cuối danh sách liệt

Succ (Thu7) khơng xác định, có lỗi chạy ch−ơng trình - run

time error.

- Đọc vo v viết giá trị kiểu liệt kê

a) Không thể nhập trực tiếp giá trị cho biến kiểu liệt kê từ bn phím Nghĩa l gán cho biến HomNay giá trị Thu2 cách gõ từ bn phím xâu kí tự Thu2, dùng cặp câu lệnh nhập liệu quen thuộc:

Write(' Hom la thu:'); Readln( HomNay);

§Ĩ lm việc ny, phải xử lí gián tiếp Chẳng hạn cã thÓ viÕt:

Write(' Hom la thu:'); Readln( St); If St = 'Thu2' Then HomNay:= Thu2;

b) Không thể in trực tiếp giá trị kiểu liệt kê giống nh− kiểu liệu khác Nghĩa lμ, biến HomNay có gía trị lμ Thu2 khơng thể viết trực tiếp chữ Thu2 bằng câu lệnh Write(HomNay).

(68)

CASE HomNay OF

CN: Write(' Chu Nhat '); Thu2: Write(' Thu hai ');

END; Chó ý:

1-Về thực chất, máy xử lí kiểu liệt kê cách đặt t−ơng ứng dãy giá trị liệt kê với dãy số 0,1,2, Ta hoμn toμn không dùng kiểu liệt kê mμ tự xử lí trực tiếp giống nh− máy tính lμm Chẳng hạn, ghi riêng bên cạnh danh sách quy −ớc CN = 0, Thu2 = 1, v.v Tuy nhiên dùng kiểu liệt kê lμm ch−ơng trình dễ hiểu vμ ta nhớ quy −ớc

2- Cã thĨ sư dơng biÕn kiĨu liƯt kª lm biến điều khiển vòng lặp

For, biến lựa chọn câu lệnh Case, số cho mảng (sẽ trình by phần kiểu mảng!)

2.3 VÝ dơ minh ho¹

Ch−ơng trình sau sử dụng biến kiểu liệt kê để in thứ tự ngμy tuần

Uses crt;

Type NgayTrongTuan = (CN, Thu2, Thu3, Thu4, Thu5, Thu6, Thu7);

Var Ngay: NgayTrongTuan ; BEGIN

For Ngay:= Thu2 to Thu7

Writeln('Thu',ord(Ngay)+1,'la

thu',ord(Ngay),'trong tuan'); END

3 Kiểu đoạn

3.1 Định nghĩa cú pháp

Nu ta hạn chế bớt miền giá trị kiểu vô h−ớng đếm đ−ợc (nguyên, ký tự, liệt kê) vμo đoạn nμo miền giá trị kiểu nhận đ−ợc kiểu liệu lμ kiểu đoạn con

(69)

3.1.1

3.1.2

3.1.3

Có ph¸p

Phần mô tả kiểu liệu khai báo kiểu đoạn có cú pháp nh sau: cận dới, dÊu chÊm, dÊu chÊm, cËn trªn.

Type tªn kiĨu = cận dới cận ;

ở hai thnh phần cận dới v cận trên l hằng, thuộc kiểu sở, thoả mÃn điều kiện cận d−íi < cËn trªn

Miền giá trị kiểu đoạn xác định nh− lμ đoạn từ cận d−ới đến cận trên.

Sau xác định kiểu, ta khai báo biến với kiểu liệu lμ kiểu vừa định nghĩa nh− thơng th−ờng

Var tªn biÕn : tªn kiĨu ;

VÝ dô

TYPE ChuSo = '0' '9' ;

ChuCaiThuong = 'a' 'z' ;

§iem = 10 ;

NgayLamViec = Thu2 Thu6 ;

Các định nghĩa kiểu đoạn dựa kiểu sở lμ kiểu chuẩn có sẵn kiểu định nghĩa tr−ớc Đó lμ:

- ChuSo, ChuCaiThuong l kiểu đoạn së kiĨu kÝ tù.

- §iem lμ kiĨu đoạn sở kiểu số nguyên

- NgayLamViec l kiểu đoạn sở kiểu liệt kª

NgayTrongTuan định nghĩa tiết tr−ớc Phải hiểu bên dòng

khai báo kiểu NgayLamViec có dịng khai báo kiểu liệt kê

NgayTrongTuan

Tính chất

Kiểu đoạn kế thừa tính chất kiểu sở Mọi phép toán kiểu sở áp dụng đợc cho kiểu đoạn Điểm khác biệt l miền giá trị thu hẹp

Cụng dng: kiu đoạn lμ ph−ơng tiện nhờ ch−ơng trình dịch kiểm tra tính phù hợp liệu, đảm bảo giá trị biến kiểu đoạn không v−ợt q miền xác định Nếu ch−ơng trình có câu lệnh vi phạm hiển điềù nμy trình biên dịch báo lỗi Mặt khác, kiểu đoạn lμm ch−ơng trình chặt chẽ hơn, dễ đọc

(70)

3.2 VÝ dơ minh ho¹

Chơng trình sau báo lỗi biên dịch giá trị biến d vợt ngoμi miÒn cho phÐp

Type Diem = 10;

Var d: Diem; i: integer; Begin

For d:= to 11 End

Tuy nhiªn, nÕu ta sửa lại phần thân chơng trình nh dới chơng trình chạy bình thờng !

Begin

For i:= to 10 d:= i * 2; End

4 KiĨu tËp hỵp

4.1 Định nghĩa cú pháp

Kiu tập hợp để thể mơ hình liệu tập hợp tốn học Nó thể loại liệu nhận giá trị khơng phải lμ phần tử đơn lẻ miền xác định mμ lμ tập hợp nhiều phần tử thuộc kiểu vơ h−ớng đếm đ−ợc nμo

Kiểu vô h−ớng đếm đ−ợc nμy gọi lμ kiểu sở

4.1.1 Cú pháp

Phần mô tả kiểu khai báo kiểu tập hợp có cú pháp nh sau:

từ khoá Set of, tên kiểu sở.

Type tên kiểu tập hợp = set of tên kiểu sở ;

õy kiu sở lμ kiểu vơ h−ớng đếm đ−ợc bất kì, kể kiểu liệt kê, kiểu đoạn

(71)

Sau khai báo kiểu tập hợp, ta khai báo biến có kiểu tập hợp nh− thơng th−ờng

Var tªn biÕn: tªn kiĨu tËp hỵp ;

4.1.2

4.1.3

4.2.1

VÝ dô

TYPE BoKiTu = SET OF Char ;

NgayMonhoc = SET OF NgayTrongTuan;

BangMau = SET OF (Đỏ, Hồng, Xanh, Lơ, Vng, Tím);

VungDiem = SET OF 10 ;

VAR NguyenAm, PhuAm : BoKiTu ;

NgayHocToan, NgayHocTin : NgayMonhoc ; Kem, TrungBinh, Kha, Gioi: VungDiem ;

Mét sè tÝnh chÊt

- Một giá trị liệu kiểu tập hợp đ−ợc thể cách liệt kê phần tử tập, cách dấu phẩy, đóng hai dấu ngoặc vng

- Thø tự liệt kê phần tử không quan trọng

- Có thể gán gía trị cho biến tập hợp nh− th«ng th−êng VÝ dơ: NgayHocToan:= [ Thu2, Thu5 ] ;

NgayHocTin := [ Th3, Thu6 ] ;

Kem := [0,1,2,3,4] ;

- Tập rỗng kí hiệu l []

4.2 Các phép toán tập hợp

Phép toán quan hệ

- Hai toán hạng phải kiểu

So s¸nh b»ng nhau: A = B lμ True nÕu A vμ B hoμn toμn nh− So s¸nh khác nhau: A <> B cho kết False A vμ B hoμn toμn nh−

So sánh nhỏ hay bằng:

A <= B l True nÕu A lμ tËp cđa B So s¸nh lín h¬n hay b»ng:

(72)

Chú ý: Khơng có so sánh nhỏ hơn, lớn chặt “< , >” kiểu tập hợp Muốn thể quan hệ "lμ tập thực " ta phải kết hợp hai điều kiện: (A <= B) And (A <> B)

4.2.2

4.2.3

PhÐp t×m kiÕm "thc vỊ"

- Tõ kho¸ In cã ý nghÜa nh− dÊu thc vỊ “∈”

VÝ dơ: Thu2 In NgayHocToan cho kÕt qu¶ True

Thu2 In NgayHocTin cho kÕt qu¶ False

PhÐp Hợp, Giao, Hiệu

- Hai toán hạng phải cïng kiĨu

PhÐp Hỵp thĨ hiƯn b»ng dÊu + : A + B lμ A ∪ B theo nghÜa to¸n häc

PhÐp Giao thĨ hiƯn b»ng dÊu * : A * B lμ A ∩ B theo nghÜa to¸n häc

PhÐp lÊy hiƯu thĨ hiƯn b»ng dÊu - : A - B lμ A \ B theo nghĩa toán học

4.3 Ví dụ minh hoạ

Ví dụ 1: Đếm số kí tự lμ nguyên âm, lμ phụ âm dãy kí tự Để đơn giản ta dùng kí tự số để đánh dấu kết thúc dãy

Dễ thấy cần phải có hai tập hợp chữ lμ nguyên âm vμ phụ âm để phục vụ cho việc kiểm tra kí tự đọc vμo Ch−ơng trình cần phải định nghĩa kiểu liệu TapKiTu vμ hai biến NguyenAm, PhuAm có kiểu lμ tập hợp chữ nh− nêu

type BoKiTu = Set of Char; var NguyenAm, PhuAm: TapKiTu; ch: char;

So_NguyenAm, So_PhuAm: byte; begin

So_NguyenAm:= 0; So_PhuAm:= 0; NguyenAm:= ['a','e','i','o','u']; PhuAm:= ['a' 'z'] - NguyenAm;

Write(' cho day ki tu, ket thuc bang so 0: '); read(ch);

while ch <> '0' begin

if ch in NguyenAm then So_NguyenAm:= So_NguyenAm + 1; if ch in PhuAm then So_PhuAm:= So_PhuAm + 1;

read(ch); end;

(73)

end

Ví dụ 2: Tìm số nguyên tố khoảng N Thuật toán sng Eratosthene.

Phân tích: Sng ban đầu chứa ton dÃy số N Bắt đầu từ số nhỏ l 2, ta loại bỏ khỏi sng tất số l bội số Số nhỏ lại sμng sÏ lμ sè nguyªn tè thø nhÊt lμ Bá sè nμy khái sμng, ghi nã vμo tËp số nguyên tố

Tiếp tục loại bỏ khỏi sng số l bội số số nguyên tố vừa chọn đợc Số nhỏ lại sμng sÏ lμ sè nguyªn tè tiÕp theo

Lặp lại việc ny ta sng dần đợc hết sè nguyªn tè Program Sang_Eratosthene ;

Const N=100;

Type Nguyen = N; Var

NguyenTo, Sang: Set of Nguyen ; Number: Nguyen ;

I: Integer ; BEGIN

NguyenTo:= [ ] ; Sang:= [ N] ;

Number:= 2;

Repeat

While not (Number IN Sang) Number:= Number + 1; NguyenTo:= NguyenTo + [Number] ;

Write ( Number , ' ' );

i:= Number ;

While i <= N Begin

Sang:= sang - [i] ;

I:= i + Number ;

End

(74)

Ch−¬ng KiĨu m¶ng

1 M¶ng mét chiỊu

1.1 Định nghĩa cú pháp

1.1.1 Định nghĩa

Mng l mt kiu d liệu có cấu trúc, tạo nên từ nhiều thμnh phần liệu cùng kiểu, ghép lại cạnh nhau, d−ới tên chung Các thμnh phần nμy đ−ợc xếp liền thμnh dãy liên tục Mỗi thμnh phần đ−ợc gọi lμ phần tử mảng Kích th−ớc mảng hay số phần tử mảng lμ cố định Có thể truy cập đến phần tử mảng thông qua tên chung mảng kèm chỉ số t−ơng ứng Chỉ số nμy thể vị trí thμnh phần dóy liờn tc núi trờn

Hình ảnh mảng có tên l a

a[1] a[2] a[3] a[4] a[5]

1.1.2 Có ph¸p

Khai b¸o kiĨu m¶ng:

Type tên kiểu mảng = array [ tập số ] of kiểu phần tử ; Trong ú:

- kiểu phần tử l kiểu liệu phần tử mảng, l bất k×

kiĨu g×;

- tập số lμ tập hợp số dùng để truy cập đến phần tử

m¶ng Nã cã thĨ lμ:

(75)

TYPE vecto10 = ARRAY [1 10] OF Integer ; b) Một danh sách liệt kê trực tiếp, ví dụ:

TYPE BngTc

= ARRAY [ (XeĐạp, XeMáy, ôtô, MáyBay) ] OF real;

c) Mt kiu liệu (vơ h−ớng đếm đ−ợc hữu hạn gía trị), vớ d kiu

Byte, kiểu liệt kê PhơngTiệnGiaoThông nh dới đây:

TYPE BangASCII = ARRAY [ Byte] OF Char ;

PhơngTiệnGiaoThông = (XeĐạp, XeMáy, ôtô, MáyBay) ;

BảngTộcườ = ARRAY [ Ph−ÈngTiệnGiaoThẬng ] OF real ; Khai bÌo biến mảng:

Var biến mảng: Tên kiểu mảng ;

Vớ d, sau xác định kiểu mảng nh− ta khai báo biến mảng

VAR x,y: Vecto10;

V: Tộcườ ;

Chú ý: Có thể kết hợp khai báo biến mảng với xác định kiểu trực tiếp:

VAR x,y : array [1 10] of integer ;

V: array [(XeĐạp, XeMáy, «t«, M¸yBay)] of real ;

Tuy nhiàn, lục nμy ta sé khẬng cọ cÌc kiểu dứ liệu Vecto10, BảngTộcườ Ẽể sữ dừng CÌc mảng x,y hay V sé cọ kiểu dứ liệu khẬng cọ tàn vμ cọ mờt sộ bất lùi nh− ta sé thấy sau nμy

1.2 C¸c tÝnh chÊt

1- Có thể truy cập đến phần tử biến mảng, sử dụng tên mảng vμ số t−ơng ứng Ví dụ:

x[2]:= 1.23 ; V[xe_đạp]:= 12;

2- Có thể thực phép gán biến mảng cho biến mảng khác kiểu

Ví dụ câu lệnh x:= y tơng đơng với 10 lệnh gán x[1]:= y[1] ;

(76)

1.3 T¹i nên khai báo kiểu

Khi thc hin phép toán với toμn thể mảng nh− toán hạng theo cách trên, phải đảm bảo t−ơng thích hiển về kiểu Các phép toán bị coi lμ không hợp lệ thực chất lμ kiểu nh−ng ta dùng hai tên kiểu khác ta khai báo biến kèm mô tả kiểu liệu trực tiếp (tức lμ kiểu liệu không tên)

Với khai báo kiểu v biến dới đây:

TYPE Vecto10 = array [1 10] of integer ;

VectoNguyen10 = array [1 10] of integer ; VAR x: Vecto10;

y: VectoNguyen10;

z: array [1 10] of integer ;

thì câu lệnh gán x:= y ; x:= z ; y:= z sai cú pháp Thế nh−ng thực phép gán phần tử x[1]:= y[1] ; x[2]:= y[2] ; khơng có vấn đề xảy !

Một điểm cho thấy cần khai báo kiểu lμ dùng mảng lμm tham số cho ch−ơng trình Ta khơng thể mơ tả kiểu mảng trực tiếp danh sách tham số ch−ơng trình mμ phải khai báo kiểu liệu "có tên" Ví dụ, viết hμm tìm phần tử cực đại mảng 10 số nguyên:

Hỵp lƯ:

Function MaxDay( x: Vecto10): integer ; Không hợp lệ:

Function MaxDay( x: array [1 10] of integer): integer;

1.4 VÝ dơ minh ho¹

Ví dụ 1: Viết chơng trình thực phép cộng hai véc tơ, nhân vô hớng hai véc t¬

Program TichVoHuong; Uses crt;

Type Vecto10 = array [1 10] of real; Var a,b: Vecto10;

I: integer; Tich: real; BEGIN

Clrscr;

Writeln(' Nhap hai vec to a, b');

Write(' Cho 10 phan cua vec to a: '); For i:=1 to 10 Read(a[i]) ;

Writeln;

(77)

For i:=1 to 10 Read(b[i]) ; Writeln;

Tich:=0;

For i:=1 to 10 Tich:= Tich + a[i]*b[i]; Write(' Tich vo huong a.b = ', Tich:10:2) ; END

Ví dụ 2: Viết ch−ơng trình đếm 50 lần gõ kí tự từ bμn phím, kí tự từ 'a' đến 'z' đ−ợc gõ lần

Vì dùng đoạn kiểu Char lμm tập số mảng, ta dùng mảng có kiểu Array ['a' 'z'] of word để chứa số lần kí tự t−ơng ứng đ−ợc gõ vμo

Program DemTanSo; Uses crt;

Var Dem: array ['a' 'z'] of word; I: integer;

KiTu, ch: char; BEGIN

Clrscr;

For ch:='a' to 'z' Dem[ch]:= 0;

Writeln('Nhap 50 ki tu bat ki,go lan luot tung ki tu'); For i:=1 to 50

begin

read(KiTu);

for ch:='a' to 'z'

if KiTu = ch then Dem[ch]:=Dem[ch]+1; end ;

For ch:='a' to 'z'

Writeln(' Ban da go ki tu ',ch,': ', Dem[ch], ' lan'); readln;

END

2 M¶ng nhiỊu chiều

2.1 Định nghĩa cú pháp cấu trúc

2.1.1 Định nghĩa v cú pháp

Nếu thnh phần mảng lại l liệu kiểu mảng ta có mảng mảng hay mảng hai chiều Có thể hình dung mảng hai chiều l mô hình hoá khái niệm ma trận

(78)

Type tên kiểu mảng = Array [ tËp chØ sè , tËp chØ sè ] of kiểu phần tử;

Var biến mảng: tên kiểu mảng ; Ví dụ:

TYPE MaTran3x4 = ARRAY [1 ,1 ] OF real;

ÔChữ = ARRAY [1 10, 10] OF char ; VAR A,B: MaTran3x4 ;

LờiGiải1, LờiGiải2: ÔChữ ;

- ChØ sè thø nhÊt th−êng gäi lμ chØ sè hμng, chØ sè thø hai lμ chØ sè cét Nghĩa l với mảng A khai báo ta cã ma trËn nh− sau:

A[1,1] A[1,2] A[1,3] A[1,4] A[2,1] A[2,2] A[2,3] A[2,4] A[3,1] A[3,2] A[3,3] A[3,4] A[4,1] A[4,2] A[4,3] A[4,4]

2.1.2 CÊu tróc

Các phần tử mảng hai chiều đ−ợc xếổctng nhớ theo thứ tự −u tiên hμng, nghĩa lμ lần l−ợt hết hμng đến hμng , hμng 3,v.v Ví dụ mảng A trên, phần tử đ−ợc xếp nhớ nh− sau:

A[1,1] A[1,2] A[1,3] A[1,4] A[2,1] A[2,2] A[2,3] A[2,4] A[3,1]

Để truy cập đến phần tử thuộc hμng i , cột j dùng tên mảng vμ hai số t−ơng ứng Vi d:

Gán giá trị: A[2,3]:= 0.5 ; A[2][3]:= 0.5

§äc ra: write ( A[1,2]: 10:5 ) ; write ( A[1][2]: 10:5 ) ; T−¬ng tù nh− m¶ng mét chiỊu ta cịng cã thĨ thùc hiƯn phép gán cho ton thể mảng nhiều chiều nh toán hạng

2.2 Ví dụ minh hoạ

Viết ch−ơng trinh nhập ma trận thực từ bμn phím, sau tính tổng phần tử thuộc hμng, thuộc cột, thuộc đ−ờng chéo

Uses crt;

Type MaTran_5x5 = array [1 5,1 5] of real; Var a: MaTran_5x5;

i,j: integer;

TongHang2, TongCot3, TongDuongCheo: Real; BEGIN

Clrscr;

(79)

For i:=1 to begin

Write('cho pt hang thu ',i, ': '); for j:=1 to read(a[i,j]);

end;

TongHang2:=0;

For j:=1 to TongHang2:= TongHang2 + a[2,j];

Writeln('Tong hang cua ma tran la:', TongHang2:10:4); TongCot3:=0;

For i:=1 to TongCot3:= TongCot3 + a[i,3];

Writeln('Tong cot cua ma tran la:', TongCot3:10:4); TongDuongCheo:=0;

For i:=1 to TongDuongCheo:= TongDuongCheo + a[i,i]; Writeln('Tong duong cheo cua ma tran la:',

TongDuongCheo:10:4); readln;

END

3 Tìm kiếm mảng

3.1 Tìm kiếm

Tìm kiếm l bi toán sở xử lí thông tin Nhiều bi toán tìm kiếm quy tìm kiếm mảng nh sau Có mảng phần tử (thờng gọi l dÃy giá trị khoá) v giá trị x kiểu liệu HÃy tìm xem có phần tử mảng no có giá trị x hay không

Th tc tìm kiếm tuần tự lμ duyệt lần l−ợt phần tử mảng, so sánh giá trị với x Việc tìm kiếm dừng tìm thấy hết mảng, tức lμ phát lμ mảng khơng có giá trị khố nμo x

Cã thĨ triĨn khai thủ tục tìm kiếm mảng vòng lặp While, dùng cờ báo l biến TimThay kiểu Boolean nh− sau

function TimKiem(x: real; kt_mang: byte; a: mang): boolean; var i: integer;

TimThay: boolean; begin

TimThay:= False; i:=1;

while (i<= kt_mang) and not TimThay begin

if a[i] = x then TimThay:= True; i:=i+1;

end;

(80)

end;

Vì số phần tử mảng lμ cố định, biết tr−ớc nên triển khai thủ tục tìm kiếm vịng lặp For với câu lệnh Break để kết thúc sớm vòng lặp tìm thấy

function TimKiem(x: real; kt_mang: byte; a: mang): boolean; var i: integer;

TimThay: boolean; Begin

TimThay:= False;

For i:=1 to kt_mang if a[i] = x then begin

TimThay:= True; Break;

end;

TimKiem:= TimThay; end;

3.2 Tìm kiếm nhị phân

Nu phần tử mảng thuộc kiểu liệu có thứ tự vμ chúng đ−ợc theo thứ tự cải tiến để thủ tục tìm kiếm thực nhanh Ta chia mảng lμm hai nửa phần tử mảng So sánh giá trị khoá x cần tìm với giá trị phần tử "giữa mảng" loại đ−ợc nửa mảng chắn khơng chứa phần tử nμo có giá trị x. Thủ tục nμy lặp lại độ dμi mảng lμ

Đây lμ khái quát hoá cách mμ ng−ời ta th−ờng lμm tìm từ tự điển, tìm tên ng−ời danh sách xếp thứ tự, v.v Thủ tục tìm kiếm nêu gọi lμ tìm kiếm nhị phân

function TimKiemNhiPhan(x: real; kt: byte; a: mang): boolean;

var l,r,m: integer; TimThay: boolean; begin

TimThay:= False; l:=1; r:= kt;

while (l<=r) and not TimThay begin

if l=r then begin TimKiem:= (a[r]=x); exit; end; m:=(l+r) div 2;

if x=a[m] then begin

(81)

exit; end

else begin

if x<a[m] then r:=m-1 else l:=m+1; end;

end;

TimKiem:= TimThay; end;

4 Mét vµi cách xếp mảng

Sp xp l mt bμi tốn sở xử lí thơng tin Từ dãy liệu ban đầu ch−a có thứ tự, cần tiến hμnh xếp để nhận đ−ợc dãy kết có thứ tự tăng (hoặc giảm) dần theo tr−ờng khố đ−ợc chọn nμo Bμi tốn quy xếp mảng phần tử thuộc kiểu có thứ tự, ví dụ mảng số (thực, ngun)

D−ới trình bμy số ph−ơng pháp xếp trực quan vμ dễ hiểu Để xác định ta ln xếp để mảng kết có thứ tự tăng dần

4.1 Ph−ơng pháp đổi chỗ trực tiếp

ý t−ởng ph−ơng pháp nh− tên gọi Ta thực duyệt cặp phần tử mảng, cặp nμo ch−a thứ tự cần có đổi chỗ hai phần tử cho Lặp lại việc nμy mng c sp ỳng th t

4.1.1 Mô tả

Bớc 1: Bắt đầu từ đầu mút phải a[n], xét cặp phần tử cạnh a[n],

a[n-1], đổi chỗ chúng cho sai thứ tự Nếu đứng thứ tự thơi

Tiến thêm trái mội vị trí, nghĩa lμ xét cặp a[n-1], a[n-2]. Lặp lại phép kiểm tra vμ đổi chỗ tới mút trái

Sau b−íc ny phần tử nhỏ vị trí

Bớc i: Bắt đầu từ đầu mút phải a[n] Xét cặp phần tử cạnh a[n],

a[n-1], đổi chỗ chúng cho sai thứ tự Tiến thêm trái mội vị trí,

lặp lại phép kiểm tra vμ đổi chỗ cho đến tới vị trí i

Sau b−ớc nμy phần tử nhỏ thứ i vị trí i Dãy a[1], a[2], a[i] thứ tự

(82)

Hình ảnh: Nếu viết mảng theo chiều đứng thμnh cột vμ d−ới lên phần tử mảng giống nh− lμ bọt n−ớc nhẹ phải dần lên, nặng phải chìm dần xuống múc trọng l−ợng Vì lẽ mμ ph−ơng pháp nμy cịn có tên gọi lμ xếp kiểu bọt - Bubble sort

4.1.2 Minh hoạ

Bảng dới trình by diễn biến qua bớc việc xếp mảng ban đầu gồm số, xếp theo chiều dọc từ xuống cột Kết xếp sau bớc 1,2,3,4 đợc viết c¸c cét tiÕp theo

B−íc

44 06 06 06 06 06 06 06

55 44 12 12 12 12 12 12 12 55 44 18 18 18 18 18

42 12 55 44 42 42 42 42 94 42 18 55 44 44 44 44 18 94 42 42 55 55 55 55 06 18 94 67 67 67 67 67 67 67 67 94 94 94 94 94

4.1.3 Thđ tơc chi tiÕt

for i:= to n

for j:= n downto i

if a[j-1] > a[j] then đổi chỗ a[j-1] cho a[j]

var i,j: integer; x: real;

begin for i:=2 to size-1

begin for j:= size downto i if a[j-1] > a[j] then

begin x:=a[j-1]; a[j-1]:=a[j]; a[j]:=x; end

(83)

4.2 Phơng pháp chèn trực tiếp

4.2.1 Mô tả

Phng phỏp nμy giống nh− ng−ời chơi bμi nhặt quân đ−ợc chia chèn vμo chỗ phần bμi cầm tay Cụ thể lμ: xuất phát từ đầu dãy nguồn, lấy dần phần tử vμ chèn thêm vμo chỗ dãy đích

Để tiết kiệm chỗ, ta khơng bố trí dãy đích nơi khác mμ xếp vμo phần bỏ trống đầu dãy nguồn, lấy dần phần tử Nh− dãy đích vμ dãy nguồn liền nhau, cộng lại chiếm n

chỗ

Bớc xuất phát:

Dãy nguồn Dãy đích

rỗng

Bc 1: Rỳt phn t a[1] từ dãy nguồn xếp vμo dãy đích Vì dãy đích có phần tử a [1] nên vị trí theo thứ tự cần xếp

Dãy đích Dãy nguồn

a1

B−ớc i: Rút phần tử a[i] từ dãy nguồn chèn thêm vμo dãy đích cho chỗ Dãy đích gồm i phần tử xếp thứ tự

Dãy đích Dãy nguồn

ai

Chèn vμo chỗ

Lặp hết dãy nguồn, tức lμ i = n, mảng đ−ợc xếp xong

Dóy ớch

DÃy nguồn rỗng

(84)

4.2.2

4.2.3

Minh ho¹

Bảng d−ới trình bμy diễn biến trình xếp mảng gồm số theo thuật giải chèn trực tiếp nh− mô tả Dấu vạch chéo lμ vách ngăn dãy đích bên trái vμ dãy nguồn bên phải

XuÊt ph¸t: 44 55 12 42 94 18 06 67 B−íc 1: 44 / 55 12 42 94 18 06 67 B−íc 2: 44 55 / 12 42 94 18 06 67 B−íc 3: 12 44 55 / 42 94 18 06 67 B−íc 4: 12 42 44 55 / 94 18 06 67 B−íc 5: 12 42 44 55 94 / 18 06 67 B−íc 6: 12 18 42 44 55 94 / 06 67 B−íc 7: 06 12 18 42 44 55 94 / 67 B−íc 8: 06 12 18 42 44 55 67 94

Thñ tôc chi tiÕt for i:=2 to size begin x:= a[i];

"chèn x vμo dãy thự tự a[1] a[i-1]" end;

Chi tiết thao tác "chèn x vμo chỗ dãy

s¾p thù tù a[1] a[i-1]" nh sau So sánh x với phần tử kề sát bên trái,

x hn thỡ dịch sang trái vị trí Tiến dần bên trái Lặp lại công việc nμy x lớn phần tử bên trái dừng x tiến đến vị trí

- Bắt đầu j:=i-1; so sánh x với a[j];

- NÕu a[j] > x tiÕn sang tr¸i: j=j-1;

- Dừng gặp a[j]x, đến mút trái

j:=i-1;

while (x < a[j]) and (j>0)

begin a[j+1]:= a[j]; j:= j-1; end;

a[j+1]:= x; { đã đến chỗ cần chèn x vμo }

Có thể lμm đơn giản điều kiện dừng câu lệnh While cách thêm phần tử canh chừng vμo đầu mút trái, đặt a[0] = x;

Tãm lại có thuật giải nh sau

begin

for i:=2 to size

(85)

j:= i-1;

while x < a[j]

begin a[j+1]:= a[j]; j:= j-1; end;

a[j+1]:= x; end

end;

4.3 Phơng pháp chọn trực tiếp

4.3.1 Mô tả

Phng pháp nμy giống nh− lại toμn quân bμi theo thứ tự cách rải rộng mặt bμn vμ nhặt dần từ bμi thấp trở lên Cụ thể lμ: chọn phần tử nhỏ dãy nguồn, xếp vμo vị trí dãy đích Đây lμ phần tử thứ vμ lμ phần tử cuối dãy đích Chọn phần tử nhỏ dãy nguồn lại, lμ phần tử nhỏ thứ hai, xếp vμo vị tri thứ hai vμ lμ vị trí cuối dãy đích vμo lúc nμy Lặp lại việc nμy hết dãy nguồn

Để tiết kiệm chỗ, ta xếp dãy đích vμ dãy nguồn liền mảng, giống nh− ph−ơng pháp tr−ớc Do đó, b−ớc thứ i, thao tác "xếp vμo cuối dãy đích" lμ "đổi chỗ cho a[i]".

Xt ph¸t

Dãy nguồn Dãy đích

rỗng

Bớc 1: - Chọn phần tử bé từ dÃy nguồn, - Đổi chỗ cho phần tư a[1]

Dãy đích Dãy nguồn a1

Chän phÇn tư

B−íc i:

(86)

Dãy đích Dãy nguồn

ai

Chän phÇn tư

Lặp hết dãy nguồn, i = n.

So s¸nh với phơng pháp chèn:

- Phng phỏp chốn lμ lấy phần tử đầu tiên dãy nguồn lại, chèn vμo đúng chỗ dãy đích Lμm việc với dãy đích lμ

- Ph−ơng pháp chọn lμ lấy phần tử nhỏ trong dãy nguồn cịn lại xếp vμo cuối dãy đích Lμm việc với dãy nguồn lμ

4.3.2

4.3.3

Minh hoạ:

Xuất phát: 44 55 12 42 94 18 06 67 B−íc 1: 06 / 55 12 42 94 18 44 67 B−íc 2: 06 12 / 55 42 94 18 44 67 B−íc 3: 06 12 18 / 42 94 55 44 67 B−íc 4: 06 12 18 42 94 55 44 67 B−íc 5: 06 12 18 42 44 / 55 94 67 B−íc 6: 06 12 18 42 44 55 / 94 67 B−íc 7: 06 12 18 42 44 55 67 / 94 B−íc 8: 06 12 18 42 44 55 67 94

Thđ tơc chi tiÕt

for i:=1 to n -1 begin

chän phÇn tư cña d·y a[i],a[i+1], ,a[n]

đổi chỗ cho a[i]

end

var i,j,k: integer; x: real;

begin for i:=1 to size-1 begin k:=i; x:=a[i];

for j:=i+1 to size

if a[j]<x then begin k:=j; x:=a[j];

end;

(87)

end end;

C©u hỏi v bi tập

1 Các phần tử mảng l kiểu gì? Chỉ số mảng l kiểu gì?

2 Cỏc khai báo kiểu mảng d−ới hay sai, mô tả rõ cấu trúc mảng

Array [10 0] of Real; Array ['0' '9'] of Real;

Array ['a' 'z'] of Char; Array [A Z] of Integer;

Array [(A,B,C)] of (-10 10); Array [Byte] of Boolean;

Array [Integer] of Integer; Array [Char] of Byte;

3 Để xử li phần tử mảng thờng dùng vòng lặp gì? Có thể dùng vòng lặp no?

4 Trong Pascal kiểu mảng cã thĨ nhiỊu nhÊt lμ mÊy chiỊu

5 ThÕ no l mảng theo u tiên hng, u tiên cét M¶ng Pascal thc kiĨu nμo?

Thùc hμnh

1 Nhập dãy n số thực Tính trung bình cộng, tìm trung vị (median), tìm phần tử lớn nhất, nhỏ nhất; tìm phần tử lớn thứ nhì; đếm số phần tử d−ơng, âm; Tìm số phần tử âm đầu tiên, cuối cùng; kiểm tra dãy đan dấu Nhập dãy số; trich dãy lμ cấp số cộng, cấp số nhân có nhiều phần tử

nhÊt

3 Cho số nguyên d−ơng hệ 10, in số hệ 2, 8, 16

4 Nhập dãy n giá trị quan trắc đại l−ợng ngẫu nhiên Tìm ph−ơng sai vμ độ lệch tiêu chuẩn

5 TÝnh tÝch v« h−íng cđa hai vÐc t¬

6 NhËp d·y n sè vμ mét số x Tìm xem có số dÃy trùng với

x Chúng vị trí no?

7 Cho ma trận số nguyên A[1 7; 14] với A[i,j]:= i*j. Tính tổng phần tử cột, hng, đờng chéo chính, đờng chéo phụ

8 Cho ma trận vuông Tách thnh hai ma trận tam giác v tam giác dới in mn hình

9 Nhập từ bn phím dÃy số nguyên, in giá trị khác kèm số lần xuất

10 Viết chơng trình xếp dÃy số, dïng c¸c thđ tơc a -) chÌn trùc tiÕp,

(88)

c -) đổi chỗ trực tiếp

11 NhËp hai d·y sè nguyªn có n phần tử Kiểm tra xem có phải dÃy l hoán vị dÃy hay không

12 Cho n điểm khác pi = (xi, yi) vμ ®−êng gÊp khóc khép kín nối điểm ny theo thứ tự từ p1, p2, , pn, p1

a) kiểm tra xem đờng gấp khúc có tự cắt không

(89)

Chơng7 Kiểu xâu kí tự

1 Cú pháp cấu trúc

1.1 Cú pháp

Xâu kí tự l kiểu liệu nhận giá trị lμ d·y kÝ tù ASCII bÊt k× 1.1.1

1.1.2

Khai b¸o kiĨu vμ biÕn Có ph¸p khai báo kiểu xâu kí tự:

TYPE tên kiểu = STRING ;

hoặc TYPE tên kiểu = STRING [ độ dμi cực đại] ;

Trong độ dμi cực đại lμ số n nguyên d−ơng, n <= 255 Độ dμi biến xâu kí tự đ−ợc hiểu lμ số kí tự dãy, kể các kí tự khoảng trống xen nằm hai đầu Với cách khai báo thứ nhất, không ấn định độ dμi cực đại mặc định lμ độ dμi cực đại 255

VÝ dơ:

TYPE HäVμTªn = STRING[20] ;

DòngMnHình : String [80] ;

Khai báo biến:

VAR SV1, SV2 : HọVTên ;

Dòng1, Dòng2: DòngMnHình ;

Cũng khai báo biến kiểu xâu kí tự mô t¶ kiĨu trùc tiÕp: VAR SV1, SV2 : String [20] ;

(90)

Một xâu kí tự lμ dãy kí tự ASCII nằm cặp dấu nháy đơn Cú pháp ngôn ngữ Pascal quy định viết giá trị xâu kí tự cặp dấu nháy đơn (single quote) Ví dụ, ‘Turbo Pascal’, ‘Dai hoc Quoc gia Ha Noi”, v.v

Xâu rỗng lμ xâu kí tự nμo vμ có độ dμi Viết xâu rỗng có cặp dấu nháy đơn liền nhau, khơng có kí tự nμo bên Cần ý phân biệt xâu rỗng với xâu gồm kớ t khong trng

Xâu rỗng:

Xâu chØ cã mét kÝ tù kho¶ng trèng: ‘ ’

1.1.3

1.2.1

Viết ra, đọc vμo xâu kí tự Viết

Cã thĨ in biĨu thức xâu kí tự mn hình, máy in hay tệp văn lệnh Write Thủ tục Write (St) in nguyên văn xâu kí tự St, kể dấu trống đầu v cuối xâu

Ví dụ: Giả sử Dòng1, Dòng2 l hai biến xâu kí tự v ta thực phép gán

Dßng1:= 'CONG HOA XHCN VIET NAM' ; Dßng2:= ' ***** ' ;

Khi in lệnh Writln(Dòng1); Writeln(Dòng2); ta nhận đ−ợc hai dòng chữ bố trí nh− trên:

CONG HOA XHCN VIET NAM *****

Chi tiết sử dụng thủ tục Write để viết vμ quy cách định dạng viết đ−ợc trình bμy Ch−ơng

§äc vμo

Có thể đọc vμo từ bμn phím vμ gán gía trị cho biến kiểu xâu kí tự lệnh Read

Chi tiết sử dụng thủ tục Read để đọc liệu vμo từ bμn phím đ−ợc trình bμy Ch−ơng

1.2 CÊu tróc kiĨu x©u kÝ tù - Truy cËp trùc tiÕp tõng thành phần

Cấu trúc xâu kí tự

(91)

Ví dụ, giá trị biến xâu kí tự SV1 l 'Nguyen Van A' bé nhí sÏ lμ

#12 N g u y e N V a n A * * * * * * * *

Trong đó, #12 lμ kí tự có mã ASCII 12 Các dấu “ *” nghĩa lμ kí tự nμo khơng xác định

1.2.2

1.2.3

Có ph¸p truy cập kí tự thnh phần

Cấu trúc biến xâu kí tự l mảng kí tự nh vừa mô tả nên ta cã thĨ thùc hiƯn mét sè thao t¸c truy cËp trực tiếp vo thnh phần biến xâu kí tù

- Có thể truy cập vμo kí tự xâu, dùng tên biến vμ số thứ tự xâu đặt dấu ngoặc vng, giống nh− mảng chiều Ví dụ, phép so sánh SV1 [8] = 'V' cho kết True

- Có thể lấy độ dμi thực xâu kí tự St bất kì, thơng qua mã ASCII phần tử St[0], tức lμ độ dμi xâu St Ord (St[0])

L−u ý ta có hμm chuẩn cho biết độ dμi xâu kí tự St

Length (St).

VÝ dơ

Viết ch−ơng trình nhập xâu kí tự từ bμn phím vμ in xâu đảo ng−ợc từ phải sang trái

Uses crt;

Var Xau: String; I: byte ; BEGIN

Writeln('Cho mot xau ki tu: '); Readln( Xau );

For i:= lenght (Xau) downto write (Xau[i]); Readln;

END

(92)

2 Thao tác với xâu kí tự

2.1 C¸c phÐp to¸n

2.1.1

2.1.2

2.1.3

BiĨu thøc x©u kÝ tù vμ phÐp g¸n

PhÐp céng “ + ” hai toán hạng kiểu xâu kí tự l ghép nối hai xâu lại thnh Có thể cộng hai biến kiểu xâu kí tự, nột biến với giá trị trực tiếp hai giá trị trực tiếp (kiểu xâu kí tù)

VÝ dô 1:

BiÕn SV1 cã gía trị l Nguyen Van A biểu thức ' Họ v tên: ' +

SV1 có giá trị l ' Ho va tên: Nguyen Van A ' VÝ dô 2:

Path:= 'C:\TP\bin\' ; FileName:= 'Turbo.exe' ; St:= Path + FileName;

sẽ nhận đợc St:= ' C:\ TP\bin\Turbo.exe '

PhÐp so s¸nh

So s¸nh b»ng “ = ” vμ kh¸c “ <> ”

PhÐp so s¸nh hai biĨu thức xâu kí tự "bằng nhau" cho kết True

nếu cặp kí tự tơng ứng hai xâu l trùng Trái lại, phép so sánh nhau” sÏ cho kÕt qu¶ False

Ví dụ: Nếu biến kiểu xâu kí tự SV1 đ−ợc gán giá trị nh− ví dụ

SV1 = 'Nguyen Van A' cho giá trị True

SV1 = 'Nguyen Van A' cho giá trị False Thø tù cđa kiĨu x©u kÝ tù

X©u kÝ tù lμ kiĨu cã thø tù Thø tù cđa kiểu xâu l thứ tự từ điển Phép so sánh thứ tự hai xâu kí tự đợc thc qua so sánh lần lợt cặp kí tự tơng ứng hai xâu, từ trái sang phải Thứ tự xâu l thứ tự cặp kí tự không trùng

Ví dụ:

'abcd' < 'abed' cho giá trị True.

'abc' < 'abcdef' cho giá trị True

(93)

Trong th viện hm, thủ tục lm sẵn cđa Pascal cã mét sè hμm, thđ tơc vỊ xư lí xâu kí tự

2.2.1 Các thủ tục

Delete(St, Pos, Num): - St lμ biÕn kiĨu String.

- Num, Pos lμ c¸c gi¸ trị nguyên

- Tác dụng: xoá khỏi xâu St số lợng Num kí tự, vị trí

Pos, từ trái sang phải

Ví dụ: St:= 'ABCDEF' ;

Delete(St,2,4); sÏ cho St = 'AFG' Delete(St,2,10) ; sÏ cho St ='A'

Delete(St,10,3); sÏ cho St = 'ABCDEF' ;

Insert (St2, St, Pos) ;

- St2 lμ biÓu thøc kiĨu String.

- St1 lμ biÕn kiỴu String.

- Pos l giá trị nguyên

Tỏc dng: chèn thêm xâu St2 vμo xâu St1 vị trí Pos Nếu Pos v−-ợt q độ dμi xâu đích St2 đ−ợc nối thêm vμo đuôi

VÝ dô: insert('123' , St, 4); sÏ cho St = 'ABCD123EF' insert('123' , St,10) ; sÏ cho St = 'ABCDEF123'

Str (Value, St);

- Value lμ biÓu thøc nguyên hay thực, có quy cách in

- St lμ biÕn kiĨu String

Tác dụng: đổi gía trị số thμnh xâu kí số gán cho xâu St Ví dụ:

i:= 123;

Str (i:5 , St) ; nhận đợc St = ' 123' x:= 123.456 ;

Str (x:10:5 , St); sÏ nhËn ®−ỵc St = ' 123.45600'

Val (St, Var , Code);

- St lμ biÓu thøc String.

- Var lμ biÕn nguyªn hay thùc

- Code lμ biÕn nguyªn

(94)

VÝ dô 1: i, e: integer; St = '123' ;

Val (St, i , e); sÏ nhận đợc i = 123 , e = 0.

VÝ dô 2: St = '12ba' ;

Val (St, i, e); nhận đ−ợc i không xác định, e = 3

2.2.2 C¸c hμm

Length (St): cho biết độ dμi xâu St.

Copy(St, Pos, Num):

- St lμ biĨu thøc x©u kÝ tù,

- Pos, Num biÓu thøc kiÓu nguyên

Tác dụng: trích xâu từ xâu từ xâu St, vị trí

Pos vμ dμi Num kí tự Nếu Pos + Num lớn độ dμi xâu St xâu kết gồm kí tự cuối xâu St Nếu Pos lớn độ dμi St xâu kết lμ rỗng

VÝ dô: St:= 'ABCDEF' ;

St_con:= Copy (St, 3, 3) ; sÏ cho St_con = 'CDE'.

St_con:= Copy (St, 4,4) ; sÏ cho St_con = 'DEF'.

St_con:= Copy (St, 10,5) ; sÏ cho St_con = ' '

Concat (St1, St2, , Stn):

GhÐp nèi tÊt xâu thnh xâu

- Nếu tổng chièu di xâu > 255 máy báo lỗi - Cã thÓ dïng phÐp +

Pos (St1, St2);

Tìm xâu St1 xâu St2 v cho biết vị trí gặp xâu St1 xâu St2 Nếu không tìm thấy Pos = 0.

Ví dơ: St:='ABCDEF' ; th×: Pos ('CD', St) = 3;

Pos ('CX' ,St) = 0.

C©u hái vμ bμi tËp

(95)

3 X©u kÝ tự khác mảng kí tự nh no Tại sử dụng kiểu xâu lại tiện lợi dùng mảng kí tự

Thực hnh

1 Tạo dòng chữ chạy từ trái sang phải (hoặc từ phải sang trái) khung hình chữ nhật mn hình

2 Tự viết lại hm thủ tục xử lÝ x©u kÝ tù tiÕt

3 ViÕt chơng trình chuyển n số thực dới dạng xâu chữ số cách khoảng trắng vo mảng n sè thùc, kh«ng dïng hμm chuÈn

(96)

Chơng8 Kiểu ghi

1 Định nghĩa khai báo

1.1 Định nghĩa

Cỏc kiu d liu c xõy dựng lμ mơ hình hố loại liệu từ giới thực Các đối t−ợng thực tế th−ờng phức tạp, hμm chứa nhiều thông tin khác kiểu Ví dụ, thơng tin cán bao gồm họ tên, q qn (có kiểu xâu kí tự), giới tính (kiểu logic), tuổi (kiểu số nguyên), mức l−ơng (kiểu số thực) Thông tin sản phẩm hμng hóa bao gồm mã số, tên gọi (kiểu xâu kí tự), ngμy sản xuất (kiểu ngμy tháng), giá thμnh (kiểu số thực),v.v

Để tiện xử lí đối t−ợng nμy, cần có chế ghép nhiều thμnh phần liệu có kiểu khác thμnh đơn vị thống

Kiểu ghi - Record lμ cấu trúc liệu đáp ứng đòi hỏi nμy Một liệu kiểu ghi tạo nên từ nhiều thμnh phần, gi l cỏc trng

field Mỗi trờng l mục liệu khác kiểu

1.2 Khai báo kiểu ghi

1.2.1

1.2.2

Có ph¸p

Có ph¸p khai báo kiểu ghi nh sau

Type tên kiểu = Record

tên trờng : mô tả kiểu liệu 1;

tên trờng n : mô tả kiểu liệu n ;

end ; VÝ dô

(97)

Ngay: 31 ;

Thang: 12 ;

Nam: Word ;

END ; Ví dụ 2: Kiểu địa

TYPE Adress = RECORD

SoNha: Word ; Phè: String [20] ; TØnh: String [15] ;

END ;

Ví dụ 3: Kiểu hồ sơ nhân sù TYPE HoSo = RECORD

HoDem: String [20] ;

Tªn: String [20] ;

Gioi: boolean ;

NgaySinh: Date ;

L−¬ng: real;

CoGiaDinh: boolean ;

DiaChi: Adress ;

END;

Chú ý: - Có thể viết định nghĩa kiểu ghi lồng Nếu tr−ớc ta ch−a định nghĩa kiểu Date viết lồng trực tiếp định nghĩa kiểu

Date bên định nghĩa kiểu HoSo nh− sau: TYPE HoSo = RECORD

HoDem: String [20] ;

Tªn: String [20] ;

Gioi: boolean ;

NgaySinh: RECORD

Ngay: 31 ;

Thang: 12 ;

Nam: Word ; END ;

L−¬ng: real;

CoGiaDinh: boolean ; DiaChi: Adress ;

END;

Sau định nghĩa kiểu ghi nh− ta khai báo biến để sử dụng nh− thông th−ờng

(98)

Ví dụ

VAR KhơiCông, KhanhThanh, NgSinh_1, NgSinh_2 : Date ; CanBo1, CanBo2: HoSo ;

2 Sư dơng

2.1 Truy cập thành phần

Kiểu ghi cho phÐp truy cËp tõng thμnh phÇn, tøc lμ tõng tr−êng

Cú pháp: tên biến, dấu chấm, tên trờng liệu muốn truy cập. Gán giá trị tên biến tên trờng := giá trị;

Đọc giá trị vế trái:= tên biến tên trờng;

Ví dụ:

Để gán cho biến NgSinh_1 giá trị ngy 10/02/1970 ta sử dụng câu lệnh sau:

NgSinh_1.Ngay:= 10;

NgSinh_1.Thang:= 2;

NgSinh_1.Nam := 1970 ;

Để in mn hình hä tªn cđa CanBo1:

St:= CanBo1.HoDem + CanBo1.Ten ; Write(' Ho va ten:' , St) ;

2.2 Các phép toán với toàn ghi

Cã thĨ thùc hiƯn mét sè phÐp to¸n với ton biến kiểu ghi nh toán hạng

2.2.1

2.2.2

Phép gán

Cho phép gán hai biến ghi kiểu Tiếp tục ví dụ viết

CanBo1 NgaySinh := NgSinh_1 ;

PhÐp so s¸nh

(99)

PhÐp so sánh "bằng nhau" thực qua so sánh cặp trờng tơng ứng Hai ghi l trờng tơng ứng trùng hon ton Trái lại l khác

Ví dụ: Sau lệnh gán

CanBo2 := CanBo1 ;

thì phép so sánh CanBo1 = CanBo2 cho kết lμ true ;

- Kiểu ghi khơng có thứ tự, khơng cho phép so sánh < , > , >= , >=

2.2.3 L−u ý vỊ tªn kiĨu

Khi thực phép toán với toμn thể ghi nh− toán hạng cần phải đảm bảo t−ơng thích hiển kiểu Các phép tốn bị coi lμ khơng hợp lệ thực chất lμ kiểu nh−ng ta dùng hai tên kiểu khác ta khai báo biến kèm mô tả kiểu liệu trực tiếp (tức lμ kiểu liệu khơng tên)

Gi¶ sư có khai báo kiểu v biến dới đây: TYPE Date = RECORD

Ngay: 31; Thang: 12 ;

Nam: Word ;

END;

NgThang = RECORD

Ngay: 31; Thang: 12 ;

Nam: Word ;

END; VAR N1: Date;

N2: NgThang;

N3: RECORD

Ngay: 31; Thang: 12 ; Nam: Word ;

END;

Các câu lệnh sau sai cú pháp

N1:= N2 ; N2:= N3;

2.3 Đọc vào, viết víi mét biÕn kiĨu b¶n ghi

(100)

VÝ dô, nÕu mèn nhËp tõ bμn phÝm liệu cho biến kiểu ghi

NgSinh_1 nh ví dụ dùng lệnh Read( NgSinh_1) råi

nhËp tõ bμn phÝm c¸c sè 10 1970 m phải dùng cặp lệnh liên tiÕp nh− sau

Write(' cho sinh ') ; Readln(NgSinh_1.Ngay ); Write(' cho th¸ng sinh ') ; Readln(NgSinh_1.Thang ); Write(' cho năm sinh ') ; Readln(NgSinh_1.Năm );

T−ơng tự nh− vậy, muốn viết biến NgSinh_1 khơng thể dùng lệnh Write(NgSinh_1) mμ phải truy cập vμ viết lần l−ợt tr−ờng thμnh phần có kiểu liệu chuẩn đơn giản

2.4 C©u lƯnh With

Ta thấy để truy cập tr−ờng ghi phải rõ tên biến ghi vμ sau lμ tên tr−ờng Nếu ghi gồm nhiều tr−ờng tên biến ghi đ−ợc lặp lặp lại nhiều ln

Để tránh lặp lại việc viết tên biến kiĨu b¶n ghi mn truy cËp tíi nhiỊu tr−êng cđa nã cïng lóc, ta cã thĨ dïng c©u lƯnh WITH

Cú pháp: With tên biến do câu lệnh ; Ví dụ:

Có thể viết lại đoạn lệnh gán giá trị cho NgSinh_1 nh sau WITH NgSinh_1 DO

Begin Ngay:= 10 ; Thang:= ; Nam:= 1970 end ;

Cã thÓ viÕt đoạn lệnh gán trị cho biến CanBo1 nh sau: WITH CanBo1 DO

Begin

HoDem:= ' Nguyen Van ' ; Ten:= ' Hung ' ;

End ;

Có thể sử dụng câu lệnh With lồng để truy cập tr−ờng biến có cấu trúc kiểu ghi lồng nhiều tầng Ví dụ, muốn gán trực tiếp ngμy tháng năm sinh cho CanBo1 ta dùng hai câu lệnh With

lång nh− sau

(101)

WITH NgaySinh DO Begin

Ngay:= 10 ;

Thang:= ;

Nam:= 1970 ;

End;

Thậm chí viết gọn n÷a WITH CanBo1 NgaySinh DO

Nghĩa lμ A lμ biến kiểu ghi, B lμ tr−ờng A vμ B lại lμ biến ghi để thâm nhập vμo tr−ờng B cần viết

WITH A.B DO

3 Bản ghi có cấu trúc thay đổi

3.1 Định nghĩa cú pháp

3.1.1

3.1.2

Đặt vấn đề

Ta xét kiểu ghi có cấu trúc cố định, số tr−ờng, kiểu t−ơng ứng tr−ờng lμ không th thay i

Đôi có liệu gồm nhiều thnh phần kiểu giống nhau, khác vi điểm Ví dụ, xét thêm trờng liệu nghề nghiệp kiểu ghi HồSơ thấy có nhiều kiểu khác Công nhân

cần ghi bậc thợ, Trí thức cần ghi học hm học vị, Doanh nhân cần ghi ngnh kinh doanh, số vốn

Hai giải pháp:

- Tạo nhiều kiểu ghi: CôngNhân, TríThức, DoanhNhân, khác ë tr−êng nghỊ nghiƯp

- Hoặc định nghĩa kiểu ghi nh−ng có tr−ờng nghề nghiệp khác vμ dùng ba tr−ờng tuỳ tr−ờng hợp

Cả hai cách lμm cồng kềnh vμ lãng phí

Cần đặt kiểu linh hoạt hơn, lμ bản ghi có cấu trúc thay đổi Mô tả cú pháp kiểu ghi cấu trúc thay đổi

Trong định nghĩa kiểu ghi cho phép có một tr−ờng mμ cấu trúc tuỳ thuộc biến lựa chọn câu lệnh Case Ví dụ, để giải

tr−ờng hợp nghề nghiệp khác cần ghi thơng tin khác nh− nêu ta xây dựng kiểu ghi với tr−ờng NghềNghiệp có cấu trúc thay đổi nh− sau:

(102)

Ngnh = (KhaiThác, CơKhi, HóaChất, DầuKhí, ĐiệnLực) ;

ChuyênMôn = (Toán,Lý,Hoá,Sinh ) ;

Trnh = (CÈSỡ, TrungHoc, ưỈiHồc, ThỈcSị, PTS, TS );

HåS¬ = RECORD

HọĐệm: String [20] ; Tên: String [20] ;

CASE NghỊNghiƯp: NghỊ OF

CẬngNhẪn: ( NgμnhCN: Ngμnh ; Bậc: Byte) ; KịS−: ( NgμnhKS: Ngμnh; TrỨnhườKS: TrỨnhườ);

TrÝThực: (MẬn: ChuyànMẬn ; TrỨnhườTT: TrỨnhườ);

DoanhNh©n: ( ) ;

END ;

Nh− vậy, tr−ờng NghềNghiệp có cấu trúc thay đổi tuỳ theo Nghề

Nghề lμ biến lựa chọn vμ đ−ợc gọi lμ tr−ờng đánh dấu ứng với giá trị tr−ờng đánh dấu - lμ nhãn lệnh Case - ta có cấu trúc ghi khác thể danh sách tr−ờng nằm cặp dấu ngoặc đơn L−u ý cú pháp quy định phải có cặp dấu ngoặc đơn danh sách tr−ờng lμ rỗng (xem tr−ơng hợp nghề lμ Doanh Nhân)

Từ khố Case khơng hoμn toμn giống câu lệnh Case nhiều lựa chọn biết

3.1.3 Các quy định

- Chỉ đ−ợc phép có tr−ờng thay đổi Tuy nhiên ghi có cấu trúc thay đổi lại lồng

- Tr−ờng thay đổi phải lμ tr−ờng cuối

- Trong phần thay đổi tất tên biến không đ−ợc trùng dù lμ nằm hai tr−ờng hợp khác Trong ví dụ ta phải phân biệt

NgμnhCN vợi NgμnhKS cúng nh− phẪn biệt TrỨnhườKS vợi TrỨnhườTT dủ rÍng chụng thuờc hai tr−ởng hùp khÌc Nếu lμ hai kiểu ghi phẪn biệt thỨ ró rμng Ẽiều nμy khẬng cần thiết

3.2 Sử dụng ghi có cấu trúc thay đổi

Về nguyên tắc, truy cập biến ghi cấu trúc thay đổi giống nh− truy cập ghi thông th−ờng Điểm khác lμ tr−ờng tuỳ chọn Ta phải sử dụng câu lệnh Case để tuỳ biến theo tr−ờng hợp

(103)

program VariableRecord;

type Nghe = (CongNhan,KiSu,TriThuc, DoanhNhan);

Nganh = (KhaiThac,CoKhi, HoaChat, DauKhi, DienLuc); Mon = (Toan,Ly, Hoa, Sinh);

TrinhDo = char; {ki hieu A,B,C,D cho don gian} HoSo = record

HoTen: String[20]; NamSinh: integer;

CASE NgheNghiep: Nghe of

CongNhan: (NganhCN: Nganh; Bac:byte);

KiSu: (NganhKS: Nganh; TrinhDoKS: TrinhDo); TriThuc:(ChuyenMon: Mon; TrinhDoTT: TrinhDo); DoanhNhan: ();

END;

var a_cn,b_ks,c_tt,d_dn,v: HoSo;

procedure ShowVariableRecord(v: HoSo); var ne: Nghe;

nh: nganh; m: mon;

td: TrinhDo; begin

With v begin

Writeln(' Ho Ten: ', HoTen); Writeln(' Nam sinh: ', NamSinh); Write(' Nghe Nghiep: ');

ne:= v.nghenghiep; case ne of

CongNhan:

begin writeln(' Cong Nhan '); nh:= v.nganhCN;

case nh of

KhaiThac: write(' Khai thac '); CoKhi: write (' co ');

HoaChat: write(' hoa chat '); DauKhi: write (' dau '); DienLuc: write (' dien luc '); end;

writeln(' bac ', v.bac); end;

KiSu:

begin writeln(' Ki Su '); nh:= v.nganhKS; case nh of

KhaiThac: write(' Khai thac '); CoKhi:

(104)

writeln(' Trinh Do ', v.TrinhDoKS); end;

TriThuc:

begin writeln (' Tri Thuc , mon '); m:= v.ChuyenMon;

case m of

Toan: write(' Toan '); Ly: write(' Ly '); Hoa: write(' Hoa '); Sinh: write(' sinh '); end;

writeln ( ' Trinh ', v.TrinhDoTT); end;

DoanhNhan: writeln (' Doanh Nhan '); end;

end; end; BEGIN

with a_cn begin

HoTen:= 'Anh Cong Nhan'; Namsinh:= 1971;

NgheNghiep:= CongNhan; NganhCN:= CoKhi;

Bac:=7; end;

with b_ks begin

HoTen:= 'Nguyen Ki Su'; Namsinh:= 1972;

NgheNghiep:= KiSu; NganhKs:= DauKhi; TrinhDoKs:= 'A'; end;

with c_tt begin

HoTen:= 'Tran Tri Thuc'; Namsinh:= 1973;

NgheNghiep:= TriThuc; ChuyenMon:= Toan; TrinhDoTT:= 'C'; end;

V:= a_cn;

ShowVariableRecord(v); V:= b_ks;

(105)(106)

Ch−¬ng9 KiĨu tƯp

1 Các khái niệm định nghĩa

1.1 Mục đích sử dụng tệp

Tệp lμ ph−ơng tiện để l−u trữ thơng tin Có thể nói ch−ơng trình xử lí thơng tin phải lμm việc với tệp L−u thông tin tệp đặc biệt cần thiết tr−ờng hợp nh−:

-Khi cần l−u giữ kết để dùng sau

-Khi cã nhiỊu d÷ liệu đầu vo nhiều kết xuất -Khi chạy thử chơng trình nhiều lần với liệu vo -Khi đầu chơng trình ny phục vụ lm đầu vo chơng trình khác, v.v

Trong tr−ờng hợp nhập liệu cách gõ trực tiếp từ bμn phím hay l−u kết cách chép lại từ mμn hình mμ phải tổ chức ghi thμnh tệp đĩa để tiện sử dụng

1.2 Tệp định kiểu

Nh− nêu phần trên, tệp lμ cấu trúc để l−u trữ nhiều liệu Nếu tệp l−u phần tử liệu kiểu ta có tệp định kiểu

- Tệp định kiểu lμ tập hợp phần tử liệu cùng kiểu, xếp liền nhau; - Số phần tử hay kích th−ớc tệp có thể thay đổi trong thời gian thực ch−ơng trình ;

- Kích thứơc tệp khơng đ−ợc xác định khai báo

1.2.1 Có ph¸p Khai b¸o kiĨu tƯp

(107)

Trong kiểu phần tử tệp gọi lμ kiểu sở, lμ kiểu gì, trừ kiểu tệp

1.2.2

1.3.1

VÝ dô

TYPE TepSoThuc = FILE OF Real ; TepSoNguyen = FILE OF Integer ;

TepHoSo = FILE OF LyLich ;

VAR F1: TepSoThuc ; F2: TepSoNguyen ;

F3: TepHoSo ;

Cịng cã thĨ khai b¸o tắt, kết hợp khai báo biến với mô tả kiểu tÖp: F1: FILE OF Real ;

F2: FILE OF Integer; F3: FILE OF LyLich ;

Biến kiểu tệp lμ biến đại diện cho tệp Mọi việc truy cập tệp phải thông qua biến tệp

1.3 Tệp truy cập

Mô tả cÊu tróc

Theo định nghĩa, tệp lμ tập hợp phần tử liệu cùng kiểu, xếp liền nhau, coi tệp nh− mảng với kích th−ớc co giãn đ−ợc

Cấu trúc mảng có khn mẫu cố định nên truy cập trực tiếp vμo phần tử qua số mảng Trái lại, phần tử lμm nên tệp khơng đ−ợc đánh số, bị di chuyển thao tác thêm bớt vμo nội dung

Tại thời điểm truy cập vμo phần tử thông qua giá trị biến đệm

Có thể minh hoạ biến đệm nh− cửa sổ di động dọc theo tệp để nhìn vμo phần tử tệp Tại thời điểm sổ nμy nằm vị trí xác định

(108)

Có dấu hiệu đặc biệt EOF vị trí kết thúc tệp vμ hμm chuẩn Eof (F)

cho biết cửa sổ tệp tệp F phần tử cuối tệp hay ch−a Eof (F) = True vị trí cuối tệp, Eof (F) = False nu trỏi li

Tệp đợc tổ chức nh gọi l tệp truy cập tuần tù - Sequential

access

Với tệp truy cập tuần tự, muốn đọc phần tử nμo phải qua phần tử đứng tr−ớc Muốn thêm phần tử phải đ−a cửa sổ cuối tệp Hình ảnh tệp truy cập lμ băng từ

Tóm lại, tệp truy cập có cấu trúc đơn giản vμ dễ xây dựng nh−ng linh hoạt

Pascal chuẩn định nghĩa tệp truy cập TurboPascal có cung cấp kiểu tệp truy cập trực tiếp, cho phép đặt sổ tệp vμo vị trí tệp vμ truy cập phần tử tệp t−ơng tự nh− truy cập mảng

2 Viết tệp, đọc vào từ tệp

2.1 Mở tệp để viết

Nh− biết thao tác truy cập tệp ch−ơng trình Pascal phải thơng qua biến tệp Mặt khác, tệp lμ đối t−ợng vật lí tồn thực ổ đĩa Việc gắn kết tệp cụ thể ổ đĩa với biến tệp đại diện cho ch−ơng trình đ−ợc thực thủ tục Assign ( biến tệp, tên tệp ), tên tệp lμ xâu kí tự gồm đ−ờng dẫn vμ tên tệp để tệp ổ đĩa mμ ta muốn truy cập

Muốn ghi vμo tệp phải dùng hai thủ tục liền Thủ tục thực việc gắn kết biến tệp với tệp đ−ợc tạo ổ đĩa theo nguyên tắc chung nêu Thủ tục đặt tệp vμo trạng thái sẵn sμng để viết liệu vμo

Có ph¸p

Assign ( biÕn tƯp, tªn tƯp );

Rewrite ( biÕn tƯp ); VÝ dơ

(109)

Tác dụng: th− mục lμm việc hμnh đĩa đ−ợc tạo tệp có tên lμ Luong.Dat ch−a có phần tử nμo Cửa sổ tệp khơng xác định trỏ vμo EOF

Chó ý:

- NÕu mn t¹o tƯp mét th− mục khác tên tệp phải bao gồm đờng dÉn

- Nếu đĩa có sẵn tệp trùng tên nội dung tệp nμy bị xố Tệp trở thμnh rỗng.Trong ví dụ trên, có sẵn tệp Luong.Dat

trong cïng th mục tệp ny trở thnh rỗng

2.2 ViÕt d÷ liƯu tƯp

Sau tệp đ−ợc mở sẵn sμng để ghi vμo, thủ tục ghi mục liệu vμo tệp có dạng sau

Write ( biến tệp , biểu thức 1, biểu thức , , biểu thức n ) ; Trong biểu thức 1, biểu thức , , biểu thức n lμ mục liệu cần ghi vμo tệp Chúng phải có kiểu lμ kiểu phần tử tệp

Tác dụng: thủ tục nμy tính gía trị biểu thức 1, biểu thức vμ ghi lần l−ợt vμo tệp vị trị hμnh cửa sổ tệp Cửa sổ tệp tự động dịch chuyển xuống vị trí sau ghi xong mục Sau lệnh nμy cửa sổ tệp tiến thêm n vị trí

Sau ghi xong phải đóng tệp để tránh liệu lệnh đóng tệp:

Close ( biÕn tƯp ); VÝ dơ

Tạo tệp có tên lμ Nguyên.Dat chứa số nguyên n từ đến 100

Program TaoTep; Var i: integer;

F: FILE OF Integer; BEGIN

Assign (F, 'Nguyen.Dat');

Rewrite (F);

For i:=1 to 100 write (F,i);

Close (F);

(110)

2.3 Mở tệp để đọc vào

Mở tệp để đọc liệu từ tệp vμo nhớ phải dùng hai thủ tục liền nhau, t−ơng tự nh− tr−ờng hợp viết vμo tệp

Cú pháp

Assign ( biến tệp, tên tÖp );

Reset ( biÕn tÖp );

Tác dụng: tệp đ−ợc mở ra, cửa sổ tệp đặt vμo phần tử đầu tiên, sẵn sμng để đọc liệu Nếu tệp ch−a tồn đĩa bỏo li

2.4 Đọc liệu vào từ tÖp

Thủ tục đọc liệu từ tệp gán cho biến có dạng sau

Read ( biÕn tÖp, biÕn 1, biÕn , , biến n );

Lu ý thnh phần biến 1, biến 2, , biến n phải l biến cùng kiểu liệu nh kiểu sở cđa tƯp

Tác dụng: đọc giá trị phần tử mμ sổ tệp trỏ vμo, gán giá trị cho biến 1, dịch cửa sổ xuống vị trí tiếp theo, đọc giá trị phần tử t−ơng ứng vμ gán cho biến 2, biến n

Sau đọc xong cần đóng tệp lệnh

Close ( biÕn tÖp ) ;

Chú ý: Nếu cửa sổ tệp đến cuối tệp mμ đọc bị lỗi Do cần có động tác kiểm tra xem cuối tệp hay ch−a Chẳng hạn, sử dụng cấu trúc sau:

IF NOT Eof ( biÕn tÖp) THEN Read( biÕn tƯp, X) ; Hc: WHILE NOT Eof ( biÕn tÖp ) DO

Begin

Read( biÕn tÖp , X);

(111)

Đoạn ch−ơng trình sau mở vμ đọc phần tử thứ vμ phần tử thứ tệp Nguyên.Dat tạo ví dụ tr−ớc, gán vμo hai biến nguyên

p,q t−ơng ứng, sau in để kiểm tra Var p,q : integer;

F: File of Integer ; BEGIN

Assign (F,'Nguyen.Dat');

Reset (F);

Read (F,p); {đọc phần tử thứ } Read (F,p); {đọc phần tử thứ } Read (F,q); {đọc phần tử thứ } Read (F,q); {đọc phần tử thứ } Read (F,q); {đọc phần tử thứ } Close (F);

Writeln ( p,' ',q); END

VÝ dơ

Đoạn ch−ơng trình sau tạo tệp chứa 50 số nguyên sinh ngẫu nhiên, sau đọc từ tệp ghi vμo mảng

Program TepSoNgauNhien; Var i,p: integer;

F: FILE OF Integer;

a: array [1 50]of integer; BEGIN

Assign (F, 'Random.int');

Rewrite (F);

Randomize;

For i:=1 to 50 write (F,random (1000));

Close (F);

Assign (F,'Random.int'); Reset (F); i:= 1;

While not eof(F) begin

Read (F,p);

a[i]:= p;

i:=i+1; end;

END

2.5 TÖp truy cËp trùc tiÕp

Pascal chuẩn định nghĩa kiểu tệp truy cập tun t

(112)

ny thực đợc phần tử tệp l kiểu, chiếm chỗ nhớ

Th tc nh vị cửa sổ tệp vị trí cho tr−ớc có dạng sau

Seek ( biÕn tƯp , vÞ trÝ ) ;

Trong vị trí lμ số nguyên, vị trí (thứ tự) phần tử cần truy cập tệp Phần tử tệp vị trí 0

Để đọc / viết vμo phần tử tệp truy cập trực tiếp cần b−ớc sau:

Mở tệp chế độ đọc ghi t−ơng ứng

Dùng câu lệnh Seek để định vị cửa sổ tệp trỏ vμo phần tử mong muốn Sau đọc vμo dùng thủ tục Read, viết tệp dùng thủ tục

Write nh− th«ng th−êng

VÝ dơ

Ch−ơng trình đọc tệp nh−ng thay việc thâm nhập thâm nhập trực tiếp

BEGIN

Assign (F,'Nguyen.Dat');

Reset (F);

Seek (F,1); { tìm phần tử thứ } Read (F,p); { đọc phần tử thứ } Seek (F,4); { tìm phần tử thứ } Read (F,q); { đọc phần tử thứ } Close (F);

Writeln ( p,' ',q); Readln ;

END

3. Các thao tác khác

3.1 Một số hàm vµ thđ tơc víi tƯp.

Tr−ớc sử dụng hμm vμ thủ tục d−ới phải thực động tác gắn kết biến tệp với tệp vật lí đĩa câu lệnh Assign.

- FileSize ( biÕn tÖp ): LongInt;

(113)

VÝ dô: Assign (F, 'Nguyen Dat');

Sz:= FileSize (F) ;

sẽ nhận đợc Sz = 100

L−u ý: Có thể dùng hμm nμy kết hợp với thủ tục Seek để viết nối thêm vμo cuối tệp (Tác dụng giống nh− lệnh Append vμo cuối tệp kiểu văn bản)

Seek( biÕn tÖp , FileSize( biÕn tÖp )) ;

Write( biÕn tƯp, biĨu thøc 1, , biĨu thøc n ); - FilePos ( biÕn tƯp ): LongInt;

Hm cho biết vị trí cửa sổ tệp Phần tử vị trí VÝ dô: Assign(F, 'Nguyen.Dat')

Reset(F);

I:= FilePos(F); {sÏ cho I = } - Erase ( biÕn tƯp ) ;

Thđ tơc xo¸ tƯp

VÝ dơ: Assign(F, 'Nguyen Dat');

Erase(F)

- Rename ( biÕn tƯp , tªn míi ) ;

Thủ tục đổi tên tệp thμnh tên Tên nμy phải không đ−ợc trùng với tên tệp có th− mục

VÝ dô: Assign(F, 'Nguyen Dat') Rename( F, ' So1_100 Int' ) ;

3.2 BÉy lỗi mở tệp

3.2.1 t

Khi thực thao tác mở tệp để đọc / ghi bị lỗi nếu: - mở tệp ch−a tồn đĩa, tên sai

- hết chỗ đĩa để ghi thêm vμo tệp

TurboPascal cung cấp thị để trình biên dịch thêm mã lệnh thực kiểm tra lỗi trình thực đọc / ghi tệp mμ d−ới gọi ngắn gọn lμ thị kiểm tra I/O

(114)

{ $ I - }: tắt việc kiểm tra I/O Ch−ơng trình khơng dừng dù có lỗi I/O Tuy nhiên bỏ qua (treo, tạm dừng) tất thủ tục vμo/ra sau gặp lời gọi hμm IOResult IOResult lμ hμm trả mã lỗi thực thao tác đọc ghi đĩa Nếu công việc thμnh cơng mã lỗi lμ Trái lại, mã lỗi lμ số khác không

Sử dụng chế kiểm tra I/O thực việc bẫy lỗi mở tệp, lμ tiến hμnh mở tệp an toμn, tránh việc vơ tình xố tệp tên mở tệp để viết vμo thủ tục Rewrite

3.2.2

3.2.3

Các b−ớc để mở tệp an toμn

Tắt chế độ kiểm tra vμ thử mở tệp để đọc Gọi hμm IOResult

Nếu IOResult 0, nghĩa lμ mở tệp thμnh cơng tức lμ có tệp

cùng tên Cần thông báo cho ng−ời dùng biết để xử lí, nhập lại tên khác chẳng hạn

Nếu IOResult khác không nghĩa l cha có tệp no có tên nh Có thể yên tâm tạo tƯp b»ng lƯnh Rewrite.

VÝ dơ minh ho¹

Assign( biÕn tƯp , tªn tƯp); {$I-}

Reset( biÕn tÖp ); {$I+}

If IOResult <> then {không có tệp no trùng tên} Begin

Writeln(' Ban muon tao tep moi ? Enter=Yes '); if ReadKey = #13 then Rewrite( biÕn tÖp )

else exit; end;

Else Begin

Writeln(' Da co tep trung ten '); End;

(115)

4 Tệp văn

4.1 Định nghĩa vµ cÊu tróc

Tệp văn lμ kiểu tệp phổ biến, đ−ợc định nghĩa sẵn, để l−u trữ xử lí "văn bản" Khái niệm “văn bản” khác với khái niệm văn thông th−ờng phần mềm xử lí văn “Văn bản” gồm kí tự ASCII vμ đ−ợc phân thμnh dịng Ngoμi ra, khơng có định dạng nμo khác trình bμy nh− cỡ chữ, kiểu chữ, mμu sắc, v.v

4.1.1

4.1.2

Có ph¸p

Kiểu tệp văn đ−ợc định nghĩa sẵn với tên chuẩn lμ Text Ta khơng cần phải khai báo kiểu

Có ph¸p khai báo biến tệp văn bản:

Var biến tệp: Text ;

VÝ dô

VAR F1, F2 : Text ; CÊu tróc

Thμnh phÇn chÝnh tệp văn l kí tự ASCII Tuy nhiên, tệp văn đợc chia thnh dòng Đánh dÊu hÕt dßng b»ng dÊu Eoln (end

of line) Đó l cặp kí tự CR (cariage return) - nhảy đầu dòng, mà ascii

l 13 - vμ LF (line feed) - nhảy xuống dòng d−ới, mã ascii lμ 10 Dấu hết tệp Eof tệp văn lμ Ctrl-Z có mã ascii lμ 26 Trong mơi tr−ờng DOS dùng lệnh Type để hiển thị nội dung tệp văn lên mμn hình

Tệp văn l tệp kí tù File of Char File of Char kh¸c víi tƯp kiểu Text chỗ không nhận biết cặp kÝ tù CR, LF nh− dÊu hÕt dßng mμ coi nh− hai kÝ tù ascii b×nh th−êng

VÝ dơ

TƯp TieuDe.txt chøa ba dßng CH XHCN VIETNAM Doc lap - Tu - Hanh phuc *****

Néi dung cđa tƯp lμ d·y kÝ tù liªn tiÕp nh− sau

(116)

4.2 ViÕt tÖp văn

Cú th ghi cỏc giỏ tr kiểu nguyên, thực, logic, xâu kí tự tệp văn lệnh Write Các thủ tục Write viết tệp văn tự động tính biểu thức vμ chuyển đổi giá trị sang dạng biểu diễn xâu kí tự thơng th−ờng để ghi vμo tệp văn

Write ( biÕn tÖp , biÓu thøc 1, biÓu thøc , , biĨu thøc n ) ;

Writeln ( biÕn tƯp , biÓu thøc 1, biÓu thøc , , biĨu thøc n );

Writeln ( biÕn tƯp );

Sau biểu thức kèm phần định dạng (quy cách) in Tác dụng câu lệnh hoμn toμn t−ơng tự nh− tr−ờng hợp xuất mμn hình trình bμy Ch−ơng Chỉ khác lμ in mμn hình mμ lμ viết tệp văn ứng với biến tệp Về chất, mμn hình giống nh− tệp văn

VÝ dô

F: TEXT;

i,j: Integer;

X: Real;

B: Boolean; St: String [8];

Write(F, (i+ j):5, 3*X:0:2, St:10, ' The End ');

4.3 §äc vào từ tệp văn

4.3.1 Cú ph¸p

Các thủ tục Read quen biết đọc từ tệp văn gán cho biến khơng kí tự mμ kiểu liệu khác nữa: số nguyên, thực, logic Thủ tục Read tự động chuyển đổi xâu kí tự biểu diễn liệu thμnh giá trị có kiểu t−ơng ứng biến đ−ợc gán

Read ( biÕn tÖp , biÕn , biÕn , , biÕn n );

Readln ( biÕn tÖp , biÕn , biÕn , , biÕn n ) ;

(117)

Tác dụng: hoμn toμn giống nh− lệnh đọc liệu từ bμn phím quen biết, khác lμ nhập liệu từ bμn phím mμ mục liệu viết sẵn tệp văn ứng với biến tệp

Tuỳ theo kiểu biến i mμ lệnh Read thực đọc dãy kí tự từ tệp văn bản, chuyển đổi thμnh giá trị trực tiếp thuộc kiểu liệu

biÕn i vμ g¸n cho biÕn nμy

Quy định phân cách mục liệu kiểu số, kiểu kí tự, kiểu xâu kí tự đ−ợc trình bμy chi tiết Ch−ơng

4.3.2 VÝ dơ

D−ới lμ đoạn ch−ơng trình minh hoạ quy cách đọc vμo từ tệp văn Kết thực thủ tục Read đ−ợc viết phần thích sau câu lệnh Đầu vμo ch−ơng trình lμ tệp vanban.txt có nội dung nh− hình sau

abcdefg hiklm -3.2

1.5

var f: text; x: real;

i: integer;

s1,s2,s3: string[5]; S : string;

begin

assign(f,'vanban.txt'); reset(f);

read(f,x); { x:= 1.5 }

read(f,i); { i:= }

readln(f,x); { x:= -3.2 vμ xuèng dßng}

read(f,s1); { s1:= 'abcde' }

read(f,S); { S:= 'fg hiklm' , không xuống dòng}

read(f,s2); { s2:= '' xâu rỗng }

readln(f);

read(f,s3); { s3:= 'nnnnn' }

end

4.4 Các hàm, thủ tục chuẩn khác cho tệp văn

(118)

- Eof( biÕn tÖp ): boolean ;

Kiểm tra cuối tệp ch−a

- Eoln ( biÕn tÖp ): boolean ;

Kiểm tra cuối dòng ch−a - Append ( biến tệp );

Mở tệp văn để viết vμo, sổ tệp đặt cuối tệp - SeekEoln( biến tệp ): boolean ;

T−¬ng tù nh− Eoln nh−ng tr−íc kiĨm tra nhảy qua dấu cách v dấu Tab SeekEoln cho kết True phần lại dòng, kể từ vị trí tại, không mơc d÷ liƯu nμo n÷a

- SeekEof( biÕn tƯp ): boolean ;

T−ơng tự nh− Eof nh−ng tr−ớc kiểm tra nhảy qua dấu cách, dấu Tab vμ dấu xuống dòng. SeekEof cho kết True từ vị trí đến cuối tệp khơng cịn mục liệu nμo

- Flush( biÕn tÖp );

Xả hết nội dung đệm tệp kiểu văn đ−ợc mở để vit vo

F l biến kiểu tệp văn Text, đợc mở Rewrite

Append viết Khi lời gọi Flush xả hết phần nội dung đọng

trong đệm, viết nốt tệp F Thủ tục nμy đ−ợc dùng để đảm bảo lệnh viết tệp F đ−ợc thực trọn vẹn, khơng bỏ sót liệu

Flush khơng có tác dụng tệp F đựơc mở để đọc

- SetTextBuf( biến tệp, vùng đệm, kích th−ớc );

Gán vùng đệm I/O cho tệp văn Tham biến Vùng đệm lμ vùng nhớ dùng lμm trung gian, tạm chứa liệu thao tác truy cập đọc viết vμo tệp ổ đĩa Tham trị kích th−ớc lμ tuỳ chọn, khơng có mặt

Thủ tục nμy th−ờng dùng để tăng kích th−ớc vùng đệm nhằm đẩy nhanh tốc độ trao đổi liệu với ổ đĩa Ta biết tốc độ truy cập đĩa chậm nhiều so với truy cập nhớ Nếu có vùng đệm thao tác xử lí đọc / viết tạm Khi đầy vùng đệm tiến hμnh thao tác đọc / viết thực đĩa, không lμm lắt nhắt nhiều lần

SetTextBuf không nên gọi cho tệp mở vμ có thao tác trao đổi

d÷ liƯu Nã đợc gọi sau Reset, Rewrite, hay Append. Nếu gọi

SetTextBuf cho tệp mở có thao tác I/O , bị liƯu

kích th−ớc vùng đệm thay đổi Ví dụ

(119)

var

F: Text; Ch: Char;

Buf: array[1 4095] of Char; { 4K buffer } begin

{LÊy tªn tƯp tõ tham sè dßng lƯnh} Assign(F, ParamStr(1));

{Tăng đệm lớn để đọc nhanh} SetTextBuf(F, Buf);

Reset(F);

{§−a toμn bé néi dung tệp văn mn hình} while not Eof(f)

begin

Read(F, Ch); Write(Ch); end;

end

4.5 C¸c thiết bị vào chuẩn

Bn phím v mn hình l thiết bị vo / chuẩn nh đợc coi nh tệp văn bản, sử dụng m không cần khai báo

OUTPUT

L tệp xuất chuẩn, đ−ợc tự động gắn cho mμn hình

Nếu câu lệnh Write không râ biÕn tƯp th× cã nghÜa lμ sư dơng tƯp xuất chuẩn Output Đó l lí in mn hình bỏ qua thnh phần biến tệp Câu lệnh có dạng

Write ( biĨu thøc 1, biĨu thøc , , biỴu thøc n ) ; INPUT

Lμ tệp vμo chuẩn, đ−ợc tự động gắn cho bμn phím

T−¬ng tù nh với lệnh xuất ra, câu lệnh Read không rõ biến tệp có nghĩa l sư dơng tƯp vμo chn

LST lμ tƯp xt gắn với máy in

Để in máy in từ chơng trình Pascal cần rõ biến tệp

bây l máy in

(120)

5 Tệp không định kiểu

5.1 Định nghĩa cấu trúc

Tp không định kiểu - Untyped File - lμ tệp không định rõ kiểu phần tử khai báo, coi liệu lμ mã nhị phân 0,1 khơng cần biết biểu thị Đơn vị xử lí lμ khối bít, có kích th−ớc ta quy định, gọi lμ Record L−u ý record lμ kiểu ghi nh− biết

Tệp không định kiểu chủ yếu dùng để tăng tốc độ thao tác vμo liệu

Có ph¸p

Khai b¸o: dïng tõ kho¸ FILE

Var biÕn tÖp : File ;

Truy cập: Các thủ tục Reset, Rewrite tệp không định kiểu cần có thêm tham trị kich th−ớc Rec Tham trị kích th−ớc Rec lμ số nguyên (kiểu Word) để ấn định kích th−ớc khối liệu đơn vị (record) thao tác tệp Kích th−ớc nμy tính theo byte

Reset ( biÕn tƯp , kÝch th−íc Rec );

Rewrite ( biÕn tƯp , kÝch th−íc Rec ); VÝ dơ

Reset(F,4); đọc khối byte Rewrite(F,2); viết vμo khối byte

Nếu tham số nμy khơng có mặt record có kích th−ớc mặc nh l

128 byte

5.2 Các hàm, thđ tơc kh¸c

Ngoμi ra, để tăng nhanh tốc độ xuất nhập liệu, cịn có hai thủ tục dμnh riêng cho tệp không định kiểu lμ BlockReadBlockWrite

BlockRead( biến tệp , vùng đệm , số Rec , kết quả );

Vùng đệm: vùng đệm nhớ, lμ tham biến, nơi chứa liệu

đọc vμo

(121)

Kết quả : tham biến kiểu Word, lμ số khối thực đọc đ−ợc Tác dụng

BlockRead đọc l−ợng số Rec khối bit từ tệp ứng với biến tệp

ghi vμo nhớ, byte thứ Vùng đệm Số khối bit thực đọc đ−ợc đ−ợc trả biến kết qủa L−u ý số khối bít thực đọc đ−ợc bé sô Rec dự định đọc đến cuối tệp

Nếu khơng có tham biến kết qủa số khối thực đọc đ−ợc khơng số Rec có lỗi I/O xảy

Số byte đọc đ−ợc nhiều lμ số Rec * kích th−ớc Rec, kích

th−íc Rec lμ kÝch th−íc cđa khèi KÝch th−íc khèi lμ sè l−ỵng byte mét

khối, đ−ợc ấn định mở tệp nh− trình bμy

NÕu sè Rec * kÝch th−íc Rec > 65,535 (64K) có lỗi

BlockWrite( bin , vùng đệm , số Rec , kết quả );

Vùng đệm: vùng đệm nhớ, lμ tham biến, nơi chứa liệu

để xuất

Sô Rec : tham trị kiểu Word, lμ số khối dự định xuất

KÕt qu¶ : tham biÕn kiÓu Word, lμ sè khèi thùc sù xuÊt đợc

Y nghĩa tham số v công dụng BlockWrite tơng tự nh BlockRead Chỉ có thao tác truy cập l viÕt tõ bé nhí tƯp VÝ dơ

Ch−¬ng trình dới minh hoạ cách dùng BlockRead, BlockWrite.

Nó thực chép tệp nhanh, đơn giản khơng kiểm tra lỗi program CopyFile;

var

FromF, ToF: file;

NumRead, NumWritten: Word; Buf: array[1 2048] of Char; begin

Assign(FromF, ParamStr(1)); { Mo tep du lieu vao}

Reset(FromF, 1); { Record size = }

Assign(ToF, ParamStr(2)); { Mo tep du lieu ra}

Rewrite(ToF, 1); { Record size = }

Writeln('Copying ', FileSize(FromF), ' bytes '); repeat

BlockRead(FromF, Buf, SizeOf(Buf), NumRead); BlockWrite(ToF, Buf, NumRead, NumWritten); until (NumRead = 0) or (NumWritten <> NumRead); Close(FromF);

(122)

C©u hái vμ bμi tËp

1 Tệp văn dùng để đọc/viết kiểu liệu nμo Tệp đinh kiểu dùng để đọc/viết kiểu liệu nμo Khi có mơt kiểu liệu tệp kiểu nμo đ−ợc thao tác nhanh

2 Những hμm, thủ tục nμo áp dụng cho tệp định kiểu mμ không áp dụng đ−ợc cho tệp văn vμ ng−ợc lại

3 Khi no phần khai báo bién biến tệp Khi no phần khai báo kiểu không cã kiĨu tƯp

4 Khi nμo tƯp cã thĨ l tham trị danh sách tham số chơng trình

5 S ln nht cỏc ghi viết vμo tệp lμ Tệp không định kiểu đặt nhằm mục đích

Thùc hμnh

1 Viết ch−ơng trình tạo tệp Ran100.int chứa 100 số nguyên d−ơng i đ−ợc sinh ngẫu nhiên (0 < i <= 50) In nội dung tệp mμn hình thμnh 10 dịng b) Lấy tệp nμy lμm đầu vμo để nhập ma trận Hai số lấy lμm số hμng, số cột ma trận, tiép theo lμ phần tử ma trận, thiếu gán giá trị khơng

2 Viết ch−ơng trình nhân hai ma trận với liệu đọc từ tệp vμ kết in tệp a) Dùng tệp số nguyên vμ ma trận nguyên b) Dùng tệp số thực với ma trận thực c) Dùng tệp văn

3 Thùc hiƯn s¾p xÕp hoμ nhập hai đờng: đầu vo l tệp số thực có thứ tự tăng dần Tẹp kết l trộn hai tệp, có th tự tăng dần Viết chơng trình thống kê số lần xuất 26 chữ

tệp văn

5 Viết chơng trình thống kê số lần xuất từ cho trớc tệp văn

6 viết ch−ơng trình đếm số từ tệp văn chuẩn hoá lại tệp để từ cách không khoảng trắng (từ lμ cụm kí tự khơng chứa dấu cách nh− khoảng trắng, tab, xuống dòng) nằm hai dấu cách

(123)

Chơng10 Chơng trình

1 Chơng trình - Hàm thủ tục

1.1 Tại cần sử dụng chơng trình

- Trong chơng trình có phần công việc phải lặp lặp lại nhiều lần, với liệu đầu vo l khác Để tránh viết lại đoạn chơng trình dùng nhiều lần, ta cần tổ chức thnh chơng tr×nh

- Có số ch−ơng trình hay dùng, d−ợc xây dựng hoμn chỉnh thμnh ch−ơng trình mẫu Cần tổ chức thμnh th− viện ch−ơng trình để sử dụng lại sau nμy Ví dụ, Turbo Pascal có th− viện hμm mẫu: sin,

cos, tan, sqrt Ng−êi lËp tr×nh cã thể xây dựng thêm chơng trình

khỏc, ví dụ để tính biểu thức hay gặp, tạo bảng chọn, vẽ đồ thị - Khi phát triển phần mền cỡ lớn vμ phức tạp tất yếu lμ phải chia lμm nhiều mô đun nhỏ độc lập nhau, giao cho nhóm phát triển độc lập Một ch−ơng trình lớn lμ cấu trúc phối hợp nhiều chng trỡnh

- Ngay chơng trình l di việc tổ chức thnh chơng trình có tác dụng hỗ trợ, lm cho việc quản lý, gỡ rối, bảo trì tiện lợi v dễ dng

1.2 Khai báo chơng trình

Trong Pascal cỏc chng trỡnh cần phải đ−ợc khai báo vμ triển khai đầy đủ tr−ớc sử dụng Trong khung cấu trúc ch−ơng trình Pascal, phần dμnh cho khai báo vμ xây dựng ch−ơng trình lμ sau phần khai báo nhãn, hằng, kiểu, biến vμ trc phn thõn chng trỡnh chớnh

Program Tên chơng tr×nh;

(124)

Label ;

Const ;

Type ;

Var ;

Phần dnh cho chơng trình con;

BEGIN

Các câu lệnh ;

END

Chơng trình gồm có hai loại, gọi l hm v thủ tục, đợc xây dựng theo khung cấu trúc nh sau

function Tên hm ( Danh sách tham số hình thức): Kiểu liệu trả về;

Các khai báo hằng, kiểu, biến riêng hm ny;

Các chơng trình dùng hm ny;

Begin

Các câu lệnh cđa hμm;

tªn hμm:= giá trị trả ;

End;

Procedure Tên thủ tục ( Danh sách tham số hình thøc) ;

C¸c khai b¸o h»ng, kiĨu, biÕn cđa riªng thđ tơc nμy;

Các chơng trình dùng thủ tục ;

Begin

Các câu lệnh thủ tục;

End;

Phân tích chi tiết thnh phần nh− sau

(125)

Danh s¸ch c¸c tham số hình thức l dÃy khai báo dạng tên

tham số: kiểu liệu cách dÊu chÊm phÈy “ ; ” Tr−íc tªn tham sè cã

thể có từ khố VAR để thị cách truyền theo tham biến (ý nghĩa giải thích sau) Nếu có vμi tham số kiểu liệu khai báo chung Nếu danh sách tham số lμ rỗng bỏ hai dấu ngoặc đơn

Tóm lại, với ch−ơng trình con, dịng nhằm mục đích khai

o tên v "kiểu" chơng trình Kiểu chơng trình bao

gồm: chơng trình loại gì, hm hay thủ tục; có tham số liệu đầu vo, đầu v kiĨu cđa c¸c tham sè Êy

VÝ dơ dòng khai báo nguyên mẫu chơng trình con: Procedure NhapSoLieu;

Function MaxDay( SoPhanTu: word; Var A: MangSoNguyªn): integer ;

Procedure GiaiPTBacHai(a,b,c: real ; Var Nghiem_1, Nghiem_2: real);

1.3 Xây dựng chơng trình

Sau dòng khai báo nguyên mẫu (tên vμ kiểu) lμ phần triển khai chi tiết ch−ơng trình Phần nμy có cấu trúc hoμn toμn t−ơng tự nh− ch−ơng trình Pascal bình th−ờng Bắt đầu lμ khai báo (units, hằng, kiểu, biến, ) riêng ch−ơng trình Sau lμ phần thân ch−ơng trình gồm câu lệnh nằm hai từ khoá Begin, End. Chú ý tr−ớc bắt đầu phần thân ch−ơng trình lại có ch−ơng trình ch−ơng trình nμy Khái niệm ch−ơng trình có tính đệ quy

Các chơng trình kết thúc End với dấu chấm phẩy dấu chấm nh chơng trình

Nếu chơng trình l hm phần thân, trớc kết thúc phải có câu lệnh dạng

tên hm:= giá trị trả ;

1.4 Lời gọi chơng trình

Để cho thực chơng trình con, ta cÇn viÕt mét lêi gäi Lêi gäi hμm, thđ tơc có dạng chung nh sau

Tên hm ( Danh s¸ch c¸c tham sè thùc sù );

(126)

Trong lời gọi hμm, thủ tục danh sách tham số thực phải t−ơng ứng - với danh sách tham số hình thức: số l−ợng, thứ tự vμ kiểu liệu

Tại điểm ch−ơng trình chính, gặp lời gọi ch−ơng trình ch−ơng trình tạm dừng Các tham số hình thức đ−ợc gán giá trị tham số thực vμ lệnh xử lí thân ch−ơng trình đ−ợc tiến hμnh Khi kết thúc ch−ơng trình con, điều khiển đ−ợc trả cho ch−ơng trình vμ cơng việc ch−ơng trình tiếp tục lại từ chỗ tạm dừng nhy vo chng trỡnh

Dới l ví dụ lời gọi chơng trình đợc khai báo nh nêu

NhapSoLieu;

Lời gọi thủ tục ny cho thực lần lợt lƯnh th©n thđ

tục NhapSoLieu giống nh− ta chèn toμn câu lệnh vμo chỗ mμ

lêi gäi cã mỈt

TuoiCaoNhat:= MaxDay( 50, Tuoi );

Khi thực lời gọi hμm nh− trên, tham số SoPhanTu đ−ợc gán trị 50, Tuoi phải lμ mảng số nguyên có 50 phần tử Ch−ơng trình tìm giá trị cực đại mảng Tuoi vμ gán cho biến TuoiCaoNhat

GiaiPTBacHai( 2.3, -0.5, 1.0, x1, x2);

Lời gọi thủ tục nμy có tác dụng gán a:=2.3; b:=-0.5, c:=1.0. Sau giải ph−ơng trình bậc hai với ba hệ sơ a,b,c có giá trị nh− vμ đặt kết vμo x1, x2 lμ biến thực đ−ợc khai báo tr−ớc

1.5 VÝ dơ minh ho¹

Hãy viết ch−ơng trình nhập vμo hai dãy số liệu lμ nhiệt độ cao vμ nhiệt độ thấp ngμy tuần Tìm vμ in nhiệt độ cao nhất, thấp tuần

Nếu không sử dụng ch−ơng trình ta viết ch−ơng trình nh− sau

const kt_mang = 7;

type MangSoThuc = array [1 kt_mang] of real; var NhietDoCao, NhietDoThap: MangSoThuc;

m,max,min: real; i: integer;

(127)

write('Cho day nhiet cao:'); for i:=1 to kt_mang

read(NhietDoCao[i]);

write('Cho day nhiet thap:'); for i:=1 to kt_mang

read(NhietDoThap[i]); m:= NhietDoCao[1];

for i:=2 to kt_mang

if NhietDoCao[i]> m then m:= NhietDoCao[i]; max:= m;

m:= NhietDoThap[1]; for i:=2 to kt_mang

if NhietDoThap[i] < m then m:= NhietDoThap[i]; min:= m;

Writeln('Nhiet cao nhat tuan la', max:3:1); Writeln('Nhiet thap nhat tuan la', min:3:1); END

Ta nhận thấy ch−ơng trình bao gồm phần cơng việc rõ rμng, việc nhập dãy số liệu ban đầu đ−ợc lặp lại hai lần giống Có thể tổ chức lại ch−ơng trình phân thμnh ch−ơng trình Mỗi ch−ơng trình đảm nhận phần cơng việc Đó lμ:

Thủ tục nhập mảng chiều Thủ tục nμy đ−ợc gọi để thực việc nhập dãy số liệu đầu vμo

Hμm tính giá trị lớn phần tử mảng chiều Hμm đ−ợc gọi để tính nhiệt độ cao

Hμm tính giá trị nhỏ phần tử mảng chiều Hμm đ−ợc gọi để tính nhiệt độ thấp

Ch−ơng trình gồm vμi dòng lệnh lμ lời gọi ch−ơng trình con, giống nh− liệt kê cơng việc cần lμm Nó trở nên đơn giản, sáng sủa vμ dễ hiểu nhiều

const kt_mang = 7;

type MangSoThuc = array [1 kt_mang] of real; var NhietDoCao, NhietDoThap: MangSoThuc;

max,min: real;

procedure nhap_mang(var v: MangSoThuc); var i: integer;

begin

(128)

function max_mang( v: MangSoThuc): real;

var i: integer;

m: real; begin m:=v[1];

for i:=2 to kt_mang

if v[i]>m then m:=v[i]; max_mang:= m;

end;

function min_mang( v: MangSoThuc): real;

var i: integer;

m: real; begin m:=v[1];

for i:=2 to kt_mang

if v[i]< m then m:=v[i]; min_mang:= m;

end;

BEGIN

Writeln('Cho day nhiet cao'); nhap_mang(NhietDoCao);writeln(''); Writeln('Cho day nhiet thap'); nhap_mang(NhietDoThap);writeln(''); Max:= max_mang(NhietDoCao);

Min:= min_mang(NhietDoThap);

Writeln('Nhiet cao nhat tuan la', max:3:1); Writeln('Nhiet thap nhat tuan la', min:3:1); END

2 Hµm hay thđ tơc, tham biÕn hay tham trÞ

2.1 Phân biệt hàm với thủ tục

Kết qu¶ ci cïng cđa mét hμm lμ tr¶ vỊ mét giá trị mới Trong thân hm phải có lệnh gán tên hm:= giá trị trả về Chính tên hμm nμy coi nh− mét biÕn, dïng lμm n¬i chøa giá trị trả

Th tc khụng cú phn gía trị trả Nh− khơng có nghĩa lμ khơng tạo kết Kết thủ tục lμ lμm thay đổi giá trị hay nhiều biến tồn tr−ớc gọi thủ tục

VÝ dô:

(129)

- Tìm phần tử cực đại dãy số nên lμ hμm ch−ơng trình nμy trả giá trị lớn phần tử dóy

2.2 Phân biệt tham biến tham trị

Các tham số danh sách tham sè h×nh thøc cđa ch−ong tr×nh chia lμm hai loại, tuỳ theo cách truyền giá trị từ chơng tr×nh chÝnh gäi nã

Loại thứ lμ tham số đ−ợc truyền theo giá trị hay gọi tắt lμ tham trị Truyền theo giá trị nghĩa lμ chép lại giá trị biến từ ch−ơng trình thời điểm gọi ch−ơng trình để sử dụng ch−ơng trình con, khơng thay đổi gốc

Loại thứ hai lμ tham biến Tham biến nghĩa lμ chuyển trực tiếp biến từ ch−ơng trình sang cho ch−ơng trình sử dụng Ch−ơng trình d−ợc trỏ đến tận địa gốc biến, thực tính tốn trực tiếp vμ lμm thay đổi đ−ợc nội dung tham biến

Tham biến đợc khai báo kèm từ khoá VAR danh sách tham số hình thức

T ý nghĩa hai cách truyền tham số vừa giải thích trên, ta thấy đối vơí ch−ơng trình tham số lμ liệu đầu vo -

input- nhận từ chơng trình l tham trị tham biến, nhng

cỏc tham số lμ kết đầu - output - thủ tục phải lμ tham biến Nếu quên điều nμy thủ tục kết thúc ln kết tính tốn, xử lí thực tạo ch−ơng trình con, bị huỷ ch−ơng trình kết thúc Giá trị chính, nghĩa lμ biến ch−ơng trình khơng thay đổi

VÝ dơ minh ho¹ Program Tham_tri; var a,b,c: integer;

procedure GapDoi(x,y,z: integer); begin x:= x*2; y:=y*2; z:=z*2;

writeln('Trong procedure co so:',x,' ',y,' ',z); end;

BEGIN

a:= 1; b:= 10; c:= 100;

writeln('Truoc procedure co so:',a,' ',b,' ',c); GapDoi(a,b,c);

writeln('Sau procedure co so:',a,' ',b,' ',c) END

(130)

Tr−íc procedure cã so 10 100 Trong procedure cã so 20 200 Sau procedure cã so 10 100

Nếu sửa lại danh sách tham số thủ tục trên, khai báo x,y,z đ−ợc truyền nh− tham biến với từ khố VAR kết lμm biến đổi thực giá trị a,b,c Dòng kết cuối lμ

Sau procedure cã so 20 200 !

Program Tham_bien; var a,b,c: integer;

procedure GapDoi_var(VAR x,y,z: integer);

2.3 Một vài lu ý xây dựng chơng tr×nh

2.3.1 Xác định danh sách tham số

Tên, danh sách tham số đầu vμo, đầu kèm với kiểu liệu tham số nguyên mẫu ch−ơng trình lμ toμn giao diện ch−ơng trình với bên ngoμi Để sử dụng ch−ơng trình cần biết tên, chức năng, tham số đầu vμo lμ vμ kết đầu kiểu gì, để đâu Ng−ời sử dụng ch−ơng trình không cần biết đến nội dung câu lệnh bên thân ch−ơng trình

Tuy nhiên, không thiết liệu đầu vμo ch−ơng trình phải xuất danh sách tham số hình thức Đ−a tham số nμo vμo danh sách tham số hình thức dịng khai báo nguyên mẫu ch−ơng trình lμ vấn đề mở cổng giao tiếp nμo ng−ời sử dụng tuỳ biến gọi thực ch−ơng trình

Nguyên tắc chung lμ: tham số hình thức mμ tất lần gọi thực ch−ơng trình đ−ợc gán giá trị tham số thực giống loại khỏi danh sách tham số hình thức nguyên mẫu ch−ơng trình

(131)

s¸ch tham số Chỉ tham số nhận giá trị khác lần sử dụng khác cần đa vo danh sách tham số hình thức

Xét trờng hợp viết chơng trình thực in ma trận mn hình thnh bảng hình chữ nhËt dãng th¼ng hμng, cét

1- NÕu chơng trình cần thực in mn hình nhiều ma trận với nhiều kích thớc khác tất liệu sau phải đa vo danh sách tham số hình thức: số hng ma trËn, sè cét cđa ma trËn, m¶ng chøa ma trËn

2- Nếu ch−ơng trình ma trận kích th−ớc tham số: số hμng ma trận, số cột ma trận khơng cần đ−a vμo danh sách tham số hình thức Trong danh sách tham số hình thức cần có mảng chứa ma trận cần in

3- Nếu ta gọi ch−ơng trình nμy lần để in ma trận kết chẳng hạn chí khơng cần đ−a mảng chứa ma trận vμo danh sách tham số Danh sách tham số lμ rỗng

2.3.2

2.3.3

2.3.4

Phong c¸ch viÕt danh s¸ch tham sè

Để cho rõ rμng, dễ theo dõi, nên chia danh sách tham số lμm hai phần, chí hai dịng khác nhau, thích rõ đâu lμ tham số lμm liệu đầu vμo {input}, đâu lμ tham số để chứa kết đầu {output} Ví dụ,

Procedure NhapMang ({input} so_pt: integer, {output} Var Dayso: mang)

Lùa chän hμm hay thđ tơc

Hoμn toμn cã thĨ chun mét hμm thμnh mét thđ tơc cách coi giá trị trả nh tham số đầu ra, đợc khai báo l tham biến

VÝ dô:

Procedure MaxDay ({input} so_pt: integer; Dayso: mang ; {output} Var giatrimax: real);

Tuy nhiªn, hμm cã thĨ tham gia trùc tiÕp vμo biĨu thức nh toán hạng, thủ tục không !

Lùa chän tham biÕn hay tham trÞ

Đối với lợng liệu lớn việc truyền theo tham trị không hiệu chiếm nhiều chỗ ngăn xếp việc tạo chép lại liệu đợc truyền Một số kiểu liệu có cấu trúc không cho phép truyền theo tham trÞ mμ chØ cã thĨ trun theo tham biÕn

Tuy nhiên, chọn cách truyền theo tham biến cần l−u ý đến

(132)

2.3.5 Tệp lm tham số chơng trình

Khi cần truyền nhận nhiều liệu, dùng biến tệp để truyền tham số cho ch−ơng trình Nó bắt buộc phải lμ tham biến Ch−ơng trình thực truy cập tệp khơng phải tạo khác

VÝ dô

Thủ tục TaoTep d−ới tạo tệp số nguyên ghi vμo số nguyên từ đến 100 Tên tệp đ−ợc cung cấp nh− tham số đầu vμo thủ tục

Procedure TaoTep( Var F: TepSoNguyen; Ten: String[30]); Var i: integer;

Begin Assign (F, Ten);

Rewrite (F);

For i:=1 to 100 Write(F,i); Close(F);

End;

2.4 Khai b¸o tr−íc - Forward

Quy tắc chung ch−ơng trình Pascal lμ thứ phải tuân theo trình tự khai báo, xây đựng đ−ợc sử dụng Các ch−ơng trình khơng ngoμi thơng lệ Ta sử dụng, tức lμ viết câu lệnh có lời gọi tới ch−ơng trình sau triển khai đầy đủ

Tuy nhiên, có tr−ờng hợp mμ hai ch−ơng trình sử dụng lẫn nh− minh hoạ d−ới Trong thân thủ tục Proc1 có lời gọi đến thủ tục Proc2 vμ ng−ợc lại thân thủ tục Proc2 lại có lời gọi đến thủ tục

Proc1.

Procedure Proc1( );

Begin

Proc2( );

End;

Procedure Proc2( );

Begin

(133)

End;

Trong tình nμy có lỗi cú pháp gặp lời gọi Proc2 trình biên dịch ch−a biết đ−ợc Proc2 lμ Dù đặt thủ tục nμo lên tr−ớc mắc lỗi

Turbo Pascal cung cấp khả khai báo trớc thị Forward

Cần thêm dòng khai báo nguyên mẫu thủ tục Proc2 kèm thị

Forward trớc bắt đầu khai baó v xây dùng thđ tơc Proc1 Sau kÕt

thóc viƯc x©y dùng thđ tơc Proc1 ta tiÕn hμnh x©y dùng thđ tơc Proc2 nh− th«ng th−êng

Procedure Proc2( ) ; Forward ;

Procedure Proc1( );

Begin

Proc2( );

End;

Procedure Proc2;

3 Chơng trình lồng

3.1 Biến toàn cục, biến cục bộ, tầm tác dơng

3.1.1 Ph©n biƯt biÕn toμn cơc vμ biến cục Biến ton cục:

- Đợc khai báo đầu chơng trình

- Tồn suốt thời gian lm việc chơng trình

- Có thể truy cập (đọc giá trị, biến đổi giá trị) từ chỗ nμo ch−ơng trình

BiÕn cơc bé:

- Khai b¸o đầu chơng trình

- Ch tn thời gian hoạt động ch−ơng trình

(134)

3.1.2

3.1.3

Gi¶i thÝch b¶n chÊt

Nếu tìm hiểu kỹ việc tổ chức thực ch−ơng trình máy tính ta thấy nh− sau Khi ch−ơng trình đ−ợc nạp vμo nhớ để thực phần mã câu lệnh đ−ợc bố trí đoạn mã lệnh Các liệu đầu vμo ch−ơng trình đ−ợc khai báo đầu ch−ơng trình chính, tức lμ hằng, kiểu, biến toμn cục đ−ợc cấp phát vùng nhớ cần thiết đoạn khác gọi lμ đoạn liệu ch−ơng trình Vùng nμy tồn nhớ ch−ơng trình kết thúc

Mỗi gặp lời gọi ch−ơng trình vùng nhớ (kích th−ớc mặc định lμ 16 KB) đ−ợc dμnh riêng để chứa liệu đầu vμo cho ch−ơng trình nμy nh− tham số ch−ơng trình con, hằng, kiểu, biến cục Nó đ−ợc gọi lμ vùng ngăn xếp (Stack) ch−ơng trình Khi ch−ơng trình kết thúc toμn vùng ngăn xếp dμnh cho đ−ợc giải phóng Điều nμy ch−ơng trình lồng nhiều cấp

Từ ta thấy tính chất khác biến toμn cục vμ biến cục nh− nêu lμ hoμn toμn hiển nhiờn

Trờng hợp trùng tên

Mt trng hợp cần xem xét kĩ lμ có biến toμn cục vμ biến cục trùng tên Điều nμy đ−ợc phép dù trùng tên, chúng lμ hai biến khác nhau, tồn hai nơi khác vμ có "đời sống" dμi ngắn khác

Khi có câu lệnh truy cập đến biến bị trùng tên nh− nêu tác động lên biến nμo? Nếu câu lệnh nằm ngoμi ch−ơng trình dĩ nhiên đối t−ợng tác động lμ biến toμn cục biến cục lúc khơng tồn Nếu câu lệnh nằm bên ch−ơng trình đối t−ợng tác động lμ biến cục ch−ơng trình khơng phải lμ biến toμn cục

Tãm l¹i ta cã quy tắc xử lí trờng hợp trùng tên l:

- Biến cục che khuất biến toμn cục, biến che lấp biến ngoμi - Nếu có nhiều hai biến trùng tên, nghĩa lμ trùng tên nhiều tầng, lệnh truy cập tác động đến biến "gần" mμ nhìn thấy

Mặc dù máy tính khơng nhầm lẫn có biến có phạm vi khác mμ trùng tên nh−ng ng−ời lập trình khơng nhầm lẫn nên tránh trùng tên Sử dụng tên khác cho biến khác

3.2 Minh ho¹

Trong hình vẽ trên, hình chữ nhật t−ợng tr−ng cho phạm vi ch−ơng trình Hình chữ nhật ngoμi t−ợng tr−ng cho ch−ơng trình Các biến a,b,c,V lμ biến toμn cục Các biến lại lμ cục ch−ơng trình định nghiã chúng

(135)

Từ ch−ơng trình Proc111 truy cập đến biến a111,

b111, c111, a11, b11, c11, a1, b1, c1, a, b, c nhng không thấy, không truy

cập đợc biến a12, b12, c12, a2, b2, c2.

Mét c©u lƯnh chơng trình Proc1 m không nằm

Proc11, Proc12 truy cập biến a1, b1, c1, a, b, c.

Đối với biến trùng tên V câu lệnh truy cập Proc12 tác động lên biến V thuộc ch−ơng trình Proc1

Proc21; Var a21,b21,c21

V:

Proc2; Var a2,b2,c2 Program Prog000;

Var a,b,c: V:

Proc12; Var a12,b12,c12

V:

Proc11; Var a11, b11,c11

V:

Proc111;

Var a111, b111,c111

Var a1,b1,c1

Proc1;

(136)

C©u hái v bi tập

1 Trình by bớc công việc gặp lời gọi thực chơng trình

2 Sử dụng chơng trình tiết kiệm thời gian cho máy tính hay cho ngời lập trình

3 Phân biệt ch−ơng trình đ−ợc gọi vμ ch−ơng trình gọi Trong Pascal ch−ơng trình lồng cấp, điều định việc nμy

4 Các tham số danh sách tham số ch−ơng trình đóng vai trị Các tham số thủ tục Read lμ tham số đầu vμo hay đầu Câu hỏi

t−¬ng tù cho thđ tơc Write

6 Trong chơng trình có khai báo v lời gọi chơng trình nh dới Tìm xem lời gọi nμo sai

const MaxInt = 32767; Var x,y,z: real;

m,n: integer;

Procedure ThuTuc1(var a,b: real; x:integer);

C¸c lêi gäi:

ThuTuc1(x,y,z); ThuTuc1(2.5,y,3); ThuTuc1(x,y,n);

ThuTuc1(x,y,m+2); ThuTuc1(x-y,x+y,5); ThuTuc1(z,y,5,10); ThuTuc1(x,y,MaxInt);

7 Phân biệt biên toμn cục, biến cục Quy tắc để xác định tầm tác dụng biến

8 Tên tham số hình thức ch−ơng trình trùng với tên bién toμn cục hay khơng, trùng với tên bién cục ch−ơng trình hay khơng

Thùc hμnh

1 Viết hμm LuyThua có hai tham số x,n để tính xn Chuyển thμnh thủ tục, ghi kết vμo tham số y.

2 Viết thủ tục đổi chữ xâu chữ thμnh chữ in hoa Nếu muốn chuyển thμnh hμm cần thay đổi nh− nμo

3 Viết hμm tính định thức cấp vμ sử dụng để giải hệ ph−ơng trình tuyến tính cấp theo quy tắc Cramer

(137)

Ch−ong 11 thiết kế chơng trình

1 Phơng pháp xây dựng chơng trình

1.1 Khái niệm Công nghệ phần mềm

Cho đến ta viết số ch−ơng trình giải bμi tốn nhỏ nh− lμ ví dụ minh hoạ Lập trình tr−ờng học, lμ mức sơ khởi, khác nhiều với xây dựng phần mềm chuyên nghiệp thực tế

Công nghệ phần mềm lμ thuật ngữ để môn khoa học quy trình, kĩ thuật, cơng cụ, v.v hỗ trợ cho nhμ phát triển phần mềm chuyên nghiệp việc thiết kế ch−ơng trình, viết mã nguồn, thử nghiệm vμ bảo trì phần mềm cỡ lớn cho hiệu

Trong thực tế, mầm mống dự án phần mềm nhu cầu tự động hố máy tính cơng việc xử lí thơng tin lμm thủ cơng Vì ng−ời sử dụng phần mềm nói chung khơng có hiểu biết đầy đủ vμ chuyên sâu cơng nghệ thơng tin, nhμ phân tích hệ thống cần tiến hμnh trao đổi kĩ l−ỡng với khách hμng để xác định xác yêu cầu đặt hệ thống mμ phải xây dựng Qua ng−ời sử dụng hiểu rõ thêm địi hỏi phần mềm t−ơng lai Dựa yêu cầu đ−ợc xác định cụ thể, nhμ phân tích hệ thống lựa chọn giải pháp vμ thiết kế hệ thống để đáp ứng yêu cầu đặt b−ớc nμy chiến l−ợc chia để trị đ−ợc áp dung Yêu cầu đặt đ−ợc phân chia thμnh nhiều bμi toán nhỏ hơn, thực chức cụ thể, gọi lμ mô đun Quá trình phân chia chi tiết dần tiếp tục mơ đun ch−ơng trình đủ đơn giản Chỉ đến lập trình viên bắt đầu cơng việc viết ch−ơng trình, tức lμ chuyển thμnh mã nguồn thiết kế chi tiết có Việc chạy thử để kiểm tra, sửa lỗi, hoμn thiện lμ b−ớc tất yếu sau

Q trình phát triển phần mềm th−ờng lμ theo vịng xốy trôn ốc, lặp lại nhiều lần b−ớc ch−ơng trình đáp ứng đ−ợc yêu cầu ngi dựng

1.2 Chu kì phát triển phÇn mỊm

(138)

Ng−ời ta gọi lμ chu kì phát triển phần mềm - Software Life Cycle.

Dới l bớc chu kì phát triển phần mềm

1- c t chi tiết yêu cầu - Requirements Specification : Xác định xác u cầu bμi tốn đặt ra, trả lời câu hỏi ch−ơng trình cần phải lμm Kết giai đoạn nμy lμ văn đặc tả yêu cầu phần mềm t−ơng lai, đ−ợc hai bên - khách hμng vμ nhμ phát triển - trí thơng qua

2- Ph©n tÝch bi toán - Analysis: Cụ thể hoá yêu cầu trên, đầu vo, đầu ra, mối quan hệ, quy luật, công thức có liên quan Đa giải pháp v lựa chọn giải pháp thích hợp

3- Thiết kế - Design: Xác định mô đun với chức cụ thể, đầu vμo, đầu mô đun Kết giai đoạn nμy lμ sơ đồ cấu trúc, cho thấy rõ mô đun ch−ơng trình vμ mối quan hệ chúng với

4- TriĨn khai, viÕt m· lƯnh ch−¬ng trình - Implementation: Thể thiết kế ngôn ngữ chơng trình cụ thể Kết thúc giai đoạn ny ta có văn mà nguồn chơng trình

5- Chạy thử vμ kiểm tra - Test and Verification: biên dịch vμ chạy thử ch−ơng trình với nhiều liệu đầu vμo khác nhau, gồm tr−ờng hợp thông th−ờng, tr−ờng hợp đặc biệt, kiểm tra kết có đắn khơng, hμnh vi ch−ơng trình có phù hợp khơng Sửa chữa sai sót

Với bi toán lớn v phức tạp, ngời ta chia nhỏ thnh quy trình b−íc hc b−íc

Một khuyết điểm mμ ng−ời học lập trình hay mắc phải lμ th−ờng hay bỏ qua b−ớc đầu, vội vã bắt đầu việc viết dòng lệnh mμ khơng để tìm hiểu kĩ bμi tốn, hình dung cách rõ rμng u cầu nó, phác thảo vμi cách giải vμ lựa chọn cách tốt Rèn luyện cách xây dựng ch−ơng trình theo ph−ơng pháp lμ việc cần lm

Trong khuôn khổ giáo trình ny ta chØ tËp trung vμo b−íc thiÕt kÕ vμ triĨn khai chơng trình

1.3 Ví dụ minh hoạ

(139)

1.1.1 VÝ dô

ViÕt chơng trình thực nhân hai ma trận

1- Xác định yêu cầu: Thực phép nhân hai ma trận Dữ liệu đầu vμo lμ hai ma trận nhập từ bμn phím Ma trận kết đ−ợc in d−ới dạng bảng hình chữ nhật dóng thẳng hμng, cột Nếu kích th−ớc ma trận đầu vμo khơng phù hợp thơng báo lỗi

2- Ph©n tích bi toán:

- Đầu vo l liệu vỊ hai ma trËn A, B thĨ gåm: rA = sè hμng cña ma trËn A cA = sè cét cña ma trËn A rB = sè hμng cña ma trËn B cB = sè cét cña ma trận B phần tử Aij ma trận A, BB

ij cña ma trËn

B.

- Đầu l ma trận tích C

- Các công thức tính toán: rC = rA (số hμng cña C b»ng sè hμng cña

A) cC = cB (sè cét cña C b»ng sè cét cña B) Các phần tử C l

Cij = Aik * Bkj

- Phải kiểm tra điều kiện nhân đợc cA=rB Nếu không thoả mÃn báo lỗi v dừng chơng trình Nếu thoả mÃn tính vμ in ma trËn C 3- ThiÕt kÕ

Thùc hiƯn chi tiÕt dÇn tõng b−íc theo cách tiếp cận top-down trình by kì phÇn thiÕt kÕ chi tiÕt dÇn tõng b−íc

4- TriĨn khai, viÕt m· lƯnh

Chun thiÕt kÕ chi tiết bớc trớc thnh câu lệnh Pascal 5- Ch¹y thư vμ kiĨm tra

- Tr−êng hợp nhân đợc

- Trờng hợp không nhân đợc

- Các tr−ờng hợp đặc biệt: ma trận suy biến thμnh véc tơ, có hμng, ct, v.v

1.4 Lập trình mô đun - Modula programming 1.1.2 Kiến trúc theo mô đun

(140)

−u ®iĨm cđa kiÕn tróc theo mô đun 1.1.3

Kiến trúc theo mô đun nh có nhiều u điểm

Nó tạo khả mềm dẻo v linh hoạt xây dùng hƯ thèng Cã thĨ dïng s¶n phÈm cđa nhiỊu nh sản xuất khác miễn l phù hợp th«ng sè kÜ tht

Nó cho phép dễ dμng bảo trì, phát vμ sửa chữa hỏng hóc vμ nâng cấp Do mô đun đảm nhiệm chức công việc rõ rμng Khi khâu công việc nμo bị trục trặc hiệu quả, ta xác định đ−ợc mô đun liên quan vμ cần sửa chữa hay thay mơ đun

Nó cho phép tái sử dụng mô đun lm việc đợc tháo v mang lắp vo hệ thống

1.1.4 Lập trình theo mô đun

Lp trỡnh theo mụ un lμ áp dụng mơ hình kết cấu mơ đun nh− vμo xây dựng ch−ơng trình Một ch−ơng trình lớn, phức tạp cần đ−ợc phân chia lμm nhiều mô đun ch−ơng trình Mỗi mơ đun ch−ơng trình hoμn thμnh phần công việc t−ơng đối độc lập Một mô đun, mô đun khác giống nh− "hộp đen" Nghĩa lμ nội dung cụ thể bên nó, lệnh xử lí, tính tốn lμm theo cách nμy hay theo cách khác lμ không quan trọng miễn lμ hoμn thμnh phần công việc đ−ợc giao Các mơ đun ch−ơng trình đ−ợc "ráp nối" với thơng qua giao diện - interfaces - lμ đầu vμo, đầu Đầu vμo mô đun nμy lμ đầu mô đun khác Cứ nh− liệu đ−ợc chuyển tiếp xử lí mơ đun đạt kết cuối

Giống nh− việc kết cấu máy móc thiết bị theo mơ đun, lập trình theo mơ đun có đầy đủ −u điểm t−ơng tự Nó hỗ trợ cho phát vμ sửa chữa lỗi, bảo trì vμ nâng cấp ch−ơng trình, sử dụng lại mơ đun ch−ơng trình hoμn thiện vμ tổ chức nhóm cộng tác thực ch−ơng trình cách mềm dẻo linh hoạt

1.1.5 VÝ dô

Sau phân tích ch−ơng trình lμm phép nhân hai ma trận ta thiết kế ch−ơng trình nμy theo mô đun nh− sau:

- Mô đun 1: đảm bảo phần công việc nhập ma trận từ bμn phím - Mơ đun 2: thực phép nhân hai ma trận sau kiểm tra điều kiện nhõn c

- Mô đun 3: hiển thị ma trận (kết quả) mn hình

Mụ đun đ−ợc sử dụng hai lần để nhập lần l−ợt hai ma trận đầu vμo

(141)

1.5 Thđ tơc ho¸ - Procedural abstraction

Các mơ đun ch−ơng trình lμ ch−ơng trình ch−ơng trình lớn Thực thiết kế theo mô đun lμ sử dụng hμm vμ thủ tục để xây dựng ch−ơng trình hay thủ tục hố xây dựng ch−ơng trình

Ph−ơng pháp để lμm việc nμy lμ

- Xác định rõ chức năng mơ đun nh− ch−ơng trình con, lμm gì, ch−a quan tâm lμm nh− nμo, không vμo chi tiết Đây lμ viêc phân chia biên giới ch−ơng trình con, đảm bảo tính độc lập t−ơng đối chúng với

- Xây dựng khung lắp ghép ch−ơng trình thμnh ch−ơng trình Mỗi ch−ơng trình lμ mô đun riêng rẽ, giống nh− bê tông để xây thμnh toμ nhμ lắp ghép Để kiến trúc nên toμ nhμ cần bố trí bê tơng vị trí định Để xây dựng thμnh ch−ơng trình cần xác định quan hệ mơ đun ch−ơng trình với

- Xác định chất kết dính để liên kết mơ đun với Nó giống nh− vơi vữa xi măng xây dựng nhμ cửa Cái kết dính ch−ơng trình với lμ việc truyền tham số Đầu vμo ch−ơng trình nμy lμ đầu ch−ơng trình khác Cần hoạch định cách thức truyền liệu ch−ơng trình Truyền thơng qua danh sách tham số hay gián tiếp qua biến toμn cục, theo cách tham trị hay tham biến

- Sau tiến hμnh thủ tục hoá nh− trên, viết đ−ợc ch−ơng trình tr−ớc thực chi tiết ch−ơng trình

2 ThiÕt kÕ chi tiÕt dÇn tõng b−íc

2.1 Sơ đồ cấu trúc ch−ơng trình - structure chart

Theo ph−ơng pháp thiết kế top-down chi tiết dần b−ớc ta cần lập sơ đồ cấu trúc ch−ơng trình Sơ đồ cấu trúc ch−ơng trình gồm nhiều mức, giống hình lật ng−ợc mμ gốc lμ bμi toán ban đầu Sơ đồ cấu trúc phát triển dần xuống d−ới, chia nhiều nhánh con, ứng với việc chi tiết dần bμi toán thμnh bμi toán nhỏ Quá trình phân nhánh tiếp tục bμi toán đủ đơn giản

(142)

Møc

Møc

Møc Bμi to¸n ban đầu

Bi toán Bi toán Bi to¸n

Bμi to¸n 1.1

Bμi to¸n 2.1 Bμi to¸n

1.2

Møc 3

Hình 11.1: sơ đồ cấu trúc ch−ơng trình

Ph−ơng châm hμnh động thiết kế ch−ơng trình theo kiểu top-down

chi tiÕt dÇn tõng b−íc lμ:

- Đi từ tổng thể đến phận, từ khái quát đến chi tiết

- bớc trả lời câu hỏi lm gì, ch−a véi ®i vμo chi tiÕt lμm

nh− thÕ nμo. ViƯc lμm nh− thÕ nμo sÏ râ dÇn qua bớc phân chia công

việc, việc lμm g× 2.2 VÝ dơ

2.2.1 VÝ dơ

Thiết kế ch−ơng trình nhân hai ma trận phân tích tiết tr−ớc Chi tiết mức

Các bi toán nhỏ phải giải l Nhập ma trận

Đầu vo: số hμng cđa ma trËn, sè cét cđa ma trËn, c¸c phÇn tư cđa ma trËn gâ tõ bμn phÝm

Đầu ra: mảng chiều biểu diễn ma trận nhớ đợc gán trị Kiểm tra điều kiện nhân đợc

Đầu vo: số hng A, số cột B

Đầu ra: kết luận có thực đợc phép nhân AB không Nhân ma trËn

Đầu vμo: hai mảng chiều biểu diễn hai ma trận A,B thoả mãn điều kiện nhân c, ó cú b nh

Đầu ra: ma trËn tÝch C = A.B In ma trËn mn hình

(143)

Đầu ra: Hiển thị phần tử ma trận thnh bảng chữ nhật, dóng thẳng hng cột mn hình

Chơng trình nhân hai ma trận

1.Nhập ma trận

3 Nh©n hai ma trËn

4 In ma trËn 2.Kiểm tra

nhân đợc

Hỡnh 11.2: s cấu trúc ch−ơng trình nhân ma trận sau chi tiết mức

Giả sử có mơ đun ch−ơng trình thực chức trên, với tên gọi t−ơmg ứng lμ NhapMaTran, KiemTraNhanDuoc, NhanMaTran

v InMaTran Chơng trình gồm lệnh gọi chơng trình

thực công việc sau: nhập ma trận A; nhập ma trận B; kiểm tra điều kiện nhân đợc; nÕu tho¶ m·n tÝnh ma trËn tÝch C = A.B vμ in ma trËn C mμn h×nh

Ta viết phần mà lệnh chơng trình chÝnh BEGIN

Writeln(' nhap ma tran thu nhat:'); NhapMaTran(rA,cA,A);

Writeln(' nhap ma tran thu hai:'); NhapMaTran(rB,cB,B);

If not KiemTraNhanDuoc Then exit Else

begin

NhanMaTran(rA,cA,rB,cB,rC,cC,A,B,C); Writeln(' ma tran tich la: ');

InMaTran(rC,cC,C); End;

END

Chi tiÕt møc NhËp ma tr©n

1.1 NhËp kÝch th−íc (sè hng, số cột) ma trận 1.2 Nhập phần tư cđa ma trËn

- Nhập từ hμng thứ hμng cuối Kiểm tra nhân đ−ợc:

(144)

nếu trả kết lμ True

3 Nhân hai ma trận A*B đặt vμo ma trận C

3.1 G¸n sè hμng cđa C b»ng sè hμng cña A, sè cét cña C b»ng sè cét cđa B

3.2 Tính phần tử ma trận tích C theo cơng thức biết - Tính phần tử theo hμng, từ hμng thứ hμng cuối

4 In ma trËn mμn h×nh

4.1 LÊy kÝch th−íc cđa ma trËn

4.2 In lÇn lợt hng ma trận thnh bảng dóng thẳng cét: - In hμng thø nhÊt

- xuãng dßng

- In hμng vμ lặp lại hết hμng Sơ đồ cấu trúc ch−ơng trình nh− sau

§äc sè hμng, sè cét

Đọc lần lợt

hng

Lấy số hng , số

cột

In lần lợt

hng

Tính lần lợt C ij Tính số

hng, cột C

Chơng trình nh©n hai ma trËn

NhËp ma trËn

Nh©n hai ma trËn

In ma trËn KiÓm tra

nhân đợc

Hỡnh 11.3: S cu trỳc chng trình nhân ma trận sau chi tiết mức

Chơng trình chi tiết nh sau

program TichMaTran; uses crt;

const max_size = 50;

(145)

var A,B,C: matrix;

rA,cA,rB,cB,rC,cC: word;

Procedure NhapMaTran(Var SoHang,SoCot: word; Var M: matrix); var

i,j: byte; begin

write(' cho so hang, so cot cua ma tran: '); readln(SoHang,SoCot);

Writeln(' Cho cac phan tu cua ma tran:'); for i:=1 to SoHang

for j:=1 to SoCot begin

Write('pt[',i,',',j,']= ');Readln(M[i,j]); end;

end;

Function NhanDuoc(SoCotA, SoHangB: word): Boolean; begin

if SoCotA <> SoHangB then begin

writeln('kich thuoc ma tran khong hop le !!'); NhanDuoc:= false;

End Else

NhanDuoc:= true; end;

Procedure InMaTran(Var M: matrix); var

i,j: byte; begin

for i:=1 to SoHang begin

for j:=1 to SoCot Write(M[i,j]:4); writeln;

end; end;

Procedure NhanMaTran(rA,cA,rB,cB: word; Var rC,cC: word; Var A,B,C: matrix);

var

i,j,k: byte; begin

rC:=rA; cC:=cB;

for i:=1 to rC for j:=1 to cC begin

C[i,j]:=0;

for k:=1 to cA

(146)

end;

end;

BEGIN

Writeln(' nhap ma tran thu nhat:'); NhapMaTran(rA,cA,A);

Writeln(' nhap ma tran thu hai:'); NhapMaTran(rB,cB,B);

If not NhanDuoc Then exit Else

begin

NhanMaTran(rA,cA,rB,cB,rC,cC,A,B,C); Writeln(' ma tran tich la: ');

InMaTran(rC,cC,C); End;

END

3 Tính đệ quy thuật giải đệ quy

3.1 Tính đệ quy

Nhiều vật, t−ợng có tính chất đặc biệt lμ đồng dạng với phận Một hình ảnh th−ờng thấy lμ TV phát hình phát viên bên cạnh mμn hình TV có hình trực tiếp buổi phát hình đó, ta có chuỗi vơ tận mμn hình TV lồng nhau, chiếu khung hỡnh

Khái niệm "cnh cây" l ví dụ khác Một cnh bẻ từ cnh cịng lμ mét cμnh c©y

Trong tốn học có khái niệm giai thừa đ−ợc định nghĩa qua nh− sau

nÕu n = n! =

n*(n-1)! nÕu n >

Trong phần tin học sở ta lμm quen với khái niệm đ−ờng dẫn Một phần đ−ờng dẫn sau bớt vμi tên th− mục cuối lμ đ−ờng dẫn Nhiều kiểu liệu có cấu trúc mμ sau nμy ta nghiên cứu có tính chất t−ơng tự

(147)

Đệ quy lμ khái niệm mạnh Nó cho phép diễn đạt ngắn gọn xác vơ hạn qua "cơng thức" hữu hạn

3.2 Thuật giải đệ quy

3.2.1

3.2.2

Định nghĩa

Một thủ tục lμ đệ quy thủ tục có lời gọi đến

Nếu việc giải bμi toán T thực việc giải bμi toán T’ có dạng hoμn toμn giống T lμ thuật giải đệ quy

Nếu ta viết thủ tục thực thuật giải nμy bên lại chứa thủ tục t−ơng tự, nghĩa lμ có lời gọi đến hay lời gọi đệ quy

Liệu thủ tục nh− có luẩn quẩn khơng, có kết thúc đ−ợc khơng? Câu trả lời lμ khơng, T’ khơng phải giống hệt T mμ T’ đồng dạng với T, nh−ng có “quy mơ” bé Do hy vọng sau lặp lại nhiều lần gọi đệ quy "quy mơ" bμi toán cần giải giảm đến mức thủ tục chấm dứt

VÝ dơ: nÕu n = n! =

n*(n-1)! nÕu n >

Thủ tục tự nhiên để tính giai thừa, gần nh− chép lại định nghĩa lμ:

Function Factorial(n: integer):integer; begin

if n=0 then Factorial:=1

else Factorial:= n* Factorial(n-1); end;

Vậy thuật giải đệ quy lμ thuật giải tự nhiên để giải bμi tốn có tính đệ quy

VÝ dơ

Ta xét ví dụ gần với thực tế đời sống Đó lμ việc tìm kiếm số điện thoại ng−ơì sổ điện thoại hay tra cứu giải nghĩa từ tự điển Trình tự tiến hμnh cơng việc nμy th−ờng lμ nh− sau

- Më −íc chõng ë gi÷a, chia tù ®iĨn lμm phÇn

(148)

- Lặp lại việc lμm tìm thấy từ cần tra kết luận đ−ợc lμ khơng có từ ú t in

Mô hình hóa thao tác tìm kiếm thnh thuật giải sau

Procedure TimKiem (D: TuDien; w: MotTu); begin

If Từ điển D l từ then cho kết quả

else

begin

- Chia đôi D = D1 D2

if w D1 then TimKiem (D1, w)

else TimKiem (D2, w)

end end;

Đây lμ thủ tục tìm kiếm nhị phân dạng đệ quy

3.3 Thiết kế giải thuật đệ quy

3.3.1 Hai đặc điểm thuật giải đệ quy

1- Sau lần gọi đệ quy kích th−ớc bμi tốn giảm

2- Có tr−ờng hợp suy biến: bμi toán đủ đơn giản có lời giải trực tiếp, khơng phải gọi đệ quy

Dựa vμo hai đặc điểm trên, để thiết kế thuật giải đệ quy cần phân tích bμi tốn vμ thực b−ớc sau

- Xác định rõ kích th−ớc bμi tốn phụ thuộc vμo ? - Phân tích đ−a bμi toán một vμi bμi toán đồng dạng nh−ng có kích th−ớc nhỏ

- Khi no có trờng hợp suy biến Lời giải trực tiÕp cho tr−êng hỵp nμy

VÝ dơ, nÕu bμi to¸n xt ph¸t cã kÝch th−íc lμ n:

- Giả sử bμi tốn với kích th−ớc nhỏ hay n-1 giải đ−ợc lời giải bμi tốn với kích th−ớc n có tìm đ−ợc hay khơng ?

(149)

3.3.2

4.1.1

4.1.2

4.1.3

Khuôn mẫu viết thuật giải đệ quy

Khuôn mẫu chung thủ tục đệ quy lμ

If tr−êng hỵp suy biÕn Then cho lêi gi¶i trùc tiÕp

Else Begin

- dÉn vỊ bμi to¸n cã kÝch th−íc nhá h¬n;

- gọi đệ quy; End;

4 Một số ví dụ thuật giải đệ quy

4.1 Bµi toán tháp Hà nội

Phát biểu bi toán

Truyền thuyết kể chùa Hμ nội có cọc kim c−ơng vμ 64 đĩa vμng, đ−ờng kính khác nhau, có lỗ tròn Đầu tiên 64 đĩa nμy xếp nằm cọc, to nằm d−ới, bé nằm Để tu tâm, rèn luyện tính nhẫn nại, hμng ngμy nhμ s− niệm kinh Phật vμ di chuyển đĩa từ cọc nμy sang cọc khác Quy tắc di chuyển lμ lần chuyển đ−ợc đĩa vμ không đ−ợc đặt đĩa to lên đĩa bé

Bμi toán: chuyển toμn 64 đĩa từ cọc x (= xuất phát) ban đầu sang cọc lμ d (=đích) Trong trình di chuyển xếp tạm lên cọc cịn lại tg lμm trung gian

Ph©n tÝch

Kích th−ớc bμi tốn lμ số đĩa n = 64

Giả sử biết cách giải bμi toán với n nhỏ hơn: chuyển n-1 đĩa theo quy tắc nêu trên, từ cọc ban đầu sang cọc khác, dùng cọc lại lμm trung gian Thế giải bμi tốn với n đĩa nh− sau:

- Chuyển n-1 đĩa từ x sang tg lấy d lμm trung gian - Chuyển nốt 1 đĩa từ x sang d

- Chuyển n-1 đĩa từ tg sang d lấy x lμm trung gian

- Tr−ờng hợp suy biến: n = 1 Lúc nμy có lời giải trực tiếp Chuyển đĩa từ x sang d

(150)

- Tham số 1: số đĩa

- Tham số 2: cọc đĩa xuất phát - Tham số 3: cọc đích

- Tham sè 4: cäc lμm trung gian Tham số đầu ra:

Theo ỳng khuụn mẫu viết thủ tục đệ quy, thủ tục Hanoi bắt đầu với tr−ờng hợp suy biến, có đĩa Tr−ờng hợp số đĩa nhiều 1, bμi toán đ−ợc phân rã nh− trình bμy Hai lời gọi đệ quy đ−ợc thực để giải bμi toán nhỏ với n-1 đĩa L−u ý thứ tự tham số đầu vμo thứ 2, thứ 3, thứ lμ rất quan trọng t−ơng ứng với vai trò lμ cọc đĩa xuất phát, cọc đích, cọc trung gian thao tác chuyển đĩa

procedure hanoi(n: integer ; x,d,tg: char); begin

if n=1 then

writeln(' chuyen dia: ',x,' -> ',d) else

begin

hanoi(n-1,x,tg,d); hanoi(1,x,d,tg); hanoi(n-1,tg,d,x); end

end;

4.2 Bài toán vết mực 4.2.1

4.2.2

Ph¸t biĨu bμi to¸n

Có tờ giấy kẻ ô l−ới vuông Một số vết mực loang tờ giấy Cần tính diện tích vết loang Coi diện tích lμ số dính mực Nếu gọi dính mực gọi lμ đen, khơng dính mực lμ trắng bμi tốn trở thμnh đếm cụm số ô đen liên thông chứa chọn

Bμi to¸n nμy cã nhiỊu øng dụng xử lí ảnh Phân tích

Cú thể đề xuất thuật giải đệ quy nh− sau Diện tích vết mực giả sử lμ n Nếu ta biết cách đếm số ô đen vết có diện tích nhỏ hay n -1 hoμn toμn giải đ−ợc bμi tốn cách: xuất phát từ ô đen vùng; đếm 1; đánh dấu ô chọn thμnh ô trắng; chọn kề nó; đếm cụm đen liên thơng với ô nμy Việc nμy lμm đ−ợc theo giả thiết vết đen nμy có diện tích n-1

Lu ý ô có « kỊ nã nªn hμm Dem_O_Den

(151)

Tr−ờng hợp suy biến: khơng cịn kề nμo lμ đen Ơ xét lμ trắng kết thúc vμ trả số đếm

x x x x

x x x x x x x

x x x x x x x x x x x x x x x x x

x x x

H×nh 11.4: Minh hoạ bi toán vết mực

4.2.3 Viết hμm đệ quy

Hμm đệ quy Dem_O_Den triển khai thuật giải đệ quy nh− trình bμy

Tham số đầu vo:

- Tham số 1: Luoi l mảng hai chiều m phần tử nhận hai giá trị Den Trang

- Tham số 2: x toạ độ x ô xuất phát - Tham số 3: y toạ độ y ô xuất phát Tham số đầu ra: tên hμm chứa kết đếm

const MaxX = 10; MaxY = 10;

type MangBit = array[1 MaxX,1 MaxY] of (Den,Trang); var A: MangBit;

i,j: integer; Dau: byte;

function Dem_O_Den(Var Luoi: MangBit; x,y: integer): word; begin

if (x<1) or (x>MaxX) or (y<1) or (y>MaxY) then Dem_O_Den:=0

else if Luoi[x,y] = Trang then Dem_O_Den:= else {Ô Đen}

begin

Luoi[x,y]:= Trang;

Dem_O_Den:= 1+ Dem_O_Den(Luoi,x-1,y-1)

(152)

end; end;

BEGIN

Writeln(' Cho mang 10 x 10 so 0/1 theo tung hang '); for i:=1 to MaxX

begin

write('cho hang ',i,': '); for j:=1 to MaxY

begin

read(Dau);

if Dau = then A[i,j]:= Den else A[i,j]:=Trang;

end; readln; end;

Writeln('So o Den la ', Dem_O_Den(A,1,2));

END

Để kiểm tra hoạt động hμm vừa xây dựng ta dùng mảng 10 x 10 số 0/1 nhập từ bμn phím theo hμng, lần hμng 10 số Số ứng với ô trắng, số ứng với đen

Cã thĨ chän « xuất phát l ô no, miễn l thuộc vÕt mùc cÇn tÝnh diƯn tÝch

Nếu nhập liệu vμo nh− hình vẽ ch−ơng trình phải cho két tính diện tích lμ 16 của vết mực chứa ô (1,2)

4.3 Tìm kiếm nhị phân 4.3.1

4.3.2

Phân tÝch

Giả sử có dãy khố theo thứ tự tăng dần Cho giá trị khoá x Hãy viết thủ tục tìm kiếm xem dãy có chứa giá trị khố x khơng Đây lμ khái qt hố bμi tốn kiểu nh− tìm từ tự điển, tìm tên ng−ời danh sách xếp thứ tự

Thủ tục tìm kiếm nhị phân lμ thích hợp cho tr−ờng hợp nμy Một thủ tục tìm kiếm nhị phân sử dụng vịng lặp đ−ợc trình bμy nói tìm kiếm mảng D−ới lμ triển khai d−ới dạng thủ tục đệ quy Thủ tục tìm kiếm đệ quy tiến hμnh chia đơi dãy khố vμ gọi đệ quy để xử lí hai dãy có chứa khố x Tr−ờng hợp suy biến lμ dãy cịn phần tử, có kết trực tiếp

Viết hμm đệ quy Tham số đầu vo:

- Tham số 1: số đầu mút trái dÃy xét l

(153)

- Tham số 3: giá trị khoá x cần tìm - Tham số 4: mảng a chứa kho¸

Tham số đầu ra: tên hμm, chứa kết tìm thấy hay khơng Theo khn mẫu chung tủ tục đệ quy, hμm

TimKiemNhiPhan bắt đầu trờng hợp suy biến, dÃy khoá chØ gåm

mét phÇn tư

function TimKiemNhiPhan(l,r: integer; x: real; var a: mang): boolean;

var m: integer;

TimThay: boolean; begin

if l=r then begin TimKiemNhiPhan:= (a[r]=x); exit; end; TimThay:= False;

m:=(l+r) div 2; if x=a[m] then begin

TimThay:= True; exit;

end else

begin

if x<a[m] then r:=m-1 else l:=m+1; TimThay:= TimKiemNhiPhan(l,r,x,a); end;

TimKiemNhiPhan:= TimThay; end;

4.4 S¾p xếp kiểu phân đoạn hay xếp nhanh - Quick Sort 4.4.1 Ph©n tÝch

Sắp xếp kiểu phân đoạn hay xếp nhanh lμ thuật giải xếp hiệu C.A.R Hoare đề xuất ý t−ởng thuật toán xuất phát từ việc phân tích cải tiến ph−ơng pháp đổi chỗ kết hợp với sử dụng thủ tục đệ quy

Nội dung cụ thể thuật tốn mơ tả nh− sau: - Chọn phần tử x nμo dãy lμm phần tử chốt - Tiến dần từ trái sang phải gặp a[i] > x;

- Tiến dần từ phải sang trái gặp a[j] < x; - Đổi chỗ a[i] cho a[j].

(154)

chia lm hai phần, nửa trái gồm ton phần tử < x, nửa phải gồm ton phần tử > x Điều ny giải thích lại gọi phần tử x l chốt

Nh− dãy ban đầu đ−ợc phân rã thμnh hai dãy con, bμi toán ban đầu đ−ợc phan rã thμnh hai bμi toán đồng dạng Sử dụng thủ tục đệ quy lμ điều tự nhiên Tr−ờng hợp suy biến lμ dãy phần tử

4.4.2 Viết thủ tục đệ quy Tham số đầu vμo

- Tham sè 1: chØ số đầu mút trái dÃy xét l

- Tham số 2: số đầu mút phải r dÃy xét

Tham số đầu ra: khơng có Kết thủ tục phân đoạn lμm thay đổi vị trí phần tử mảng lμ biến toμn cục nên không cần đ−a vμo danh sách tham số

procedure PhanDoan (l,r: integer); var x,w: ;

begin

i:=l; j:=r; { l=left; r=right } “chon mot phan tu x lam chot” repeat

while a[i] < x i:=i+1; while x < a[j] j:=j-1; if i<=j then

begin w:=a[i];a[i]:=a[j];a[j]:=w; i:=i+1; j:=j-1;

end until i>j;

if l<j then PhanDoan(l,j); if i<r then PhanDoan(i,r); end;

L−u ý thủ tục trên, điều kiện "cho đến gặp nhau" để kết thúc b−ớc phân đoạn đ−ợc thể câu lệnh until i>j until i=j Lí lμ điều kiện i>j ln xảy ra, cịn điều kiện i=j khơng xảy trình

Thủ tục xếp nhanh bao gồm lời gọi đến thủ tục phân đoạn áp dụng cho dãy xuất phát ban đầu

procedure Quicksort; begin

(155)

5 Tự xây dựng th viện chơng trình - Units 5.1 Sử dụng lại chơng trình

Cỏc chng trỡnh thng dùng, cần lμm sẵn để sử dụng lại nhiều lần ch−ơng trình nh− t−ơng lai sau nμy Có hai cách để sử dụng lại chng trỡnh con:

1- Chỉ thị cho trình biên dịch chèn trực tiếp tệp mà nguồn chơng trình vo chỗ cần thiết tiến hnh biên dịch chơng trình Theo cách ny ta thêm thị biên dịch (compiler directive) sau vo vị trí muốn chèn thêm tệp mà nguồn chơng trình

{$I tªn tƯpm· ngn }

Cơng dụng thị hoμn toμn giống nh− ta lại vμ chèn thêm cách thủ công đoạn mã nguồn ch−ơng trình vμo vị trí

2- Tổ chức thnh th viện chơng trình - c¸c Unit

Các hμm, thủ tục mẫu hay dùng ch−ơng trình tổ chức riêng thμnh th− viện ch−ơng trình Nếu có nhiều ch−ơng trình ng−ời ta chia lμm nhiều th− viện, nhóm theo chức năng, phần lμ Unit Khi xây dựng ch−ơng trình lớn, cần đến nhiều Unit ch−ơng trình

TurboPascal lμm sẵn th− viện ch−ơng trình th−ờng sử dụng Đây lμ Unit chuẩn

Các hμm thủ tục có sẵn Unit chuẩn phong phú nh−ng ch−a thể đáp ứng tr−ớc tất nhu cầu vô đa dạng viết ch−ơng trình ứng dụng Ng−ời lập trình hoμn toμn lμm thêm th− viện bổ xung ch−ơng trình cần thiết cho lĩnh vực chun ngμnh mình, cho bμi tốn thực tiễn mình, theo ý muốn

5.2 CÊu tróc cđa mét unit

Để xây dựng Unit vμ sử dụng ch−ơng trình ta phải theo quy định xác cơng đoạn D−ới trình bμy lần l−ợt b−ớc

5.2.1 Khung cÊu tróc

Khung cấu trúc để viết Unit nh− sau:

(156)

Uses ; INTERFACE

Const tªn h»ng = giá trị;

Type tên kiểu = mô tả kiểu;

Var tên biến: kiểu liệu ;

Procedure tên thủ tục (ds tham số); Function tên hm (ds tham số): kiểu

liệutrả về;

Giao din vi bờn ngoi: Phần khai báo hằng, biến, kiểu vμ nguyên mẫu hμm, thủ tục bên ngoμi sử dụng Triển khai mã lệnh chi tiết đ−ợc thực hin on Implementation

dới IMPLEMENTATION

Uses .;

Const ;

Type ;

Var ;

Khai b¸o c¸c h»ng, biÕn, kiĨu

nội bộ để dùng bên d−ới,

trong c¸c hμm, thđ tơc

Procedure ; Begin End;

Function ; Begin End;

TriÓn khai m· lƯnh chi tiÕt c¸c hμm, thđ tơc néibé vμ c¸c hμm thđ tơc lμm giao diƯn

đã khai báo phần

Interface

END {cña Unit} Lu ý BEGIN tơng ứng

5.2.2 Các thnh phần

Nh vậy, thnh phần Unit gåm hai lo¹i

Loại nội bộ nghĩa lμ sử dụng bên Unit, dùng đến triển khai mã lệnh bên thân Unit, ng−ời xây dựng Unit biết Những thμnh phần nμy khơng khai báo phần Interface

Lo¹i lμm giao diện l dnh cho bên ngoi sử dụng, phải khai báo phần Interface.

Những điểm khác với khung cấu trúc chơng trình bình th−êng lμ:

(157)

- Có thêm phần giao diện khoá Interface để khai báo tất hằng, kiểu, biếncác ch−ơng trình con dμnh cho bên ngoμi sử dụng L−u ý phần nμy hμm, thủ tục đ−ợc khai báo nguyên mẫu gồm tên, danh sách tham số hình thức vμ kiểu liệu trả về, cịn phần triển khai mã lệnh, tức lμ phần thân lại nằm phần Implementation

- Phần triển khai –Implementation - lμ nội dung unit, chứa thân tất hμm, thủ tục khai báo phần giao diện với ch−ơng trình khác phục vụ cho việc thực hμm, thủ tục lμm giao diện có

5.3 Biên dịch sử dụng 5.3.1

5.3.2

Biên dịch

Tiến hnh biên dịch tƯp m· ngn cđa c¸c unit cịng hoμn toμn nh− biên dịch chơng trình thông thờng Chọn Compile gõ phím tắt

Alt+F9. Tuy nhiên, tệp kết nhận đợc có phần mở rộng l TPU

(Turbo Pascal Units) l tệp có phÇn më réng exe

Phải thiết lập mục chọn Compile / Destination Disk để ghi tệp kết đĩa không để nhớ (Destination Memory)

L−u ý xác định nơi đặt tệp kết thông qua mục chọn Options /

Directories / TPU & EXE Directory Có thể đặt chung th− mục

Unit chuẩn Turbo Pascal cách điền đ−ờng dẫn đầy đủ

"C:\tp\Units" vμo ô " TPU & EXE Directory " Cũng đặt th− viện unit riêng mình, ví dụ "C:\tp\MyUnits"

Sư dơng

Muốn sử dụng Unit ch−ơng trình phải khai báo đầu ch−ơng trình giống nh− Unit chuẩn Turbo Pascal

Uses danh s¸ch c¸c Unit ;

Để trình biên dịch tìm đ−ợc tệp TPU t−ơng ứng, cần rõ nơi đặt Mở mục chọn Options / Directories vμ bổ xung thêm đ−ờng dẫn, ví dụ "C:\tp\MyUnits" ô "Units Directories"

5.4 VÝ dô minh ho¹

(158)

unit tools; interface

const EscKey = #27;

procedure Say(x,y: byte; St: string); implementation

uses Crt;

procedure Say;

begin gotoXY(x,y); write(St); end;

END {unit tools}

Soạn thảo tệp Tools.pas có nội dung nh− Biên dịch thμnh tệp Tools.tpu, đặt th− mục nμo đó, ví dụ C:\tp\MyUnits Ta có Unit

Tools sẵn sμng để sử dụng

Ch−¬ng trình dới sử dụng Unit Tools. program ViDu1Unit;

Uses Crt, Tools; BEGIN Clrscr;

Say(10,10,' Day la thu tuc Say Tools unit !'); repeat

until Readkey = EscKey; END

5.5 So s¸nh viƯc dïng Unit víi chÌn trùc tiÕp tƯp m∙ ngn

Nh− trình bμy trên, để sử dụng lại ch−ơng trình đă đ−ợc xây dựng hoμn chỉnh chèn trực tiếp mã nguồn chúng vμo ch−ơng trình tổ chức thμnh Unit

Tỉ chøc thμnh Unit th× dịch chạy thử chơng trình chính, Unit không cần phải dịch lại

Nếu chèn trực tiếp mà nguồn vo tệp chơng trình thị cho trình biên dịch

{$I tên tệp mà nguån }

thì tất đoạn mã chèn thêm nμy đ−ợc dịch lại toμn chạy thử Do khơng nên theo cách nμy có nhiều ch−ơng trình dμi vμ phức tạp

(159)

TurboPascal cung cấp th− viện lμm sẵn, lμ Unit chuẩn Các Unit chuẩn chứa hằng, kiểu liệu, biến, hμm thủ tục mẫu để ng−ời lập trình Pascal sử dụng

Các Unit chuẩn đợc chứa tệp Turbo.tpl Chúng đợc tổ chức theo nhóm chức Danh sách Unit chuẩn nh sau

Tên Nội dung

Crt Dos Graph Graph3 Overlay Printer System

Turbo3 WinDos

Hiển thị mμn hình, đọc mã bμn phím Khai thác chức DOS Các hμm, thủ tục đồ hoạ

Các hμm, thủ tục đồ hoạ t−ơng thích với phiên 3.0 Cho chế độ overlay

Phôc vơ sư dơng m¸y in

Các hμm, thủ tục chuẩn hay dùng Unit System tự động đ−ợc gọi, khơng cần khai báo danh sách sau từ khố Uses

Để tơng thích lùi với phiên 3.0 Để lập trình cho môi trờng window

Cn tham khảo tμi liệu để biết đ−ợc nội dung chi tiết tên gọi, giá trị vμ ý nghĩa hằng, kiểu, biến nh− chức vμ cách sử dụng ch−ơng trình mẫu đ−ợc lμm sẵn unit

6 Giíi thiƯu Unit CRT

Unit CRT (Catot Ray Tube) lμ Unit chứa hằng, biến, hμm, thủ tục điều khiển việc hiển thị lên mμn hình chế độ văn bản, xử lí mã bμn phím vμ âm loa máy tính

6.1 C¸c biÕn

Các biến đ−ợc định nghĩa Crt:

Tªn biÕn KiÓu

CheckBreak CheckEOF DirectVideo CheckSnow LastMode

Boolean Boolean Boolean Boolean

(160)

TextAttr

WindMin WindMax

Byte

Word

Word

(Xem c¸c thđ tơc TextColor,

TextBackGround, Highvideo,

LowVideo)

(Xem thđ tơc Window) (Xem thđ tơc Window)

Y nghĩa chúng đ−ợc giải thích kĩ nói đến hμm, thủ tục có liên quan

6.2 C¸c hµm, thđ tơc

Phần nμy khảo sát tóm tắt hμm, thủ tục có Unit Crt Nguyên mẫu hμm thủ tục d−ợc trình bμy để cung cấp giao diện cho ng−ời sử dụng Công dụng hay chức đ−ợc nêu vắn tắt

ClrEol;

Xố từ vị trí chạy đến cuối dịng

ClrScr;

Xo¸ mn hình mu tại, đa chạy mn hình vị trí (1,1)

DelLine;

Xoá dòng có chạy mn hình, dòng dới dồn lên

InsLine;

Chèn thêm dòng trắng vị trí chạy

GotoXY(x,y:byte);

Đa chạy mn hình vÞ trÝ (x,y)

WhereX: byte;

Hμm trả lại toạ độ X chạy mμn hình

WhereY: byte;

Hμm trả lại toạ độ Y chạy mμn hình

Vị trí toạ độ mμn hình nói đến hμm, thủ tục lμ

giá trị t−ơng đối cửa sổ mμn hình tại, thiết lp bi th tc Window

trình by dới

Window(x1,y1,x2,y2:byte) ;

(161)

ghi t−¬ng øng biÕn WinMin, WinMax Cơ thĨ h¬n, x1 =

Lo(WinMin) , y1 = Hi(WinMin), x2 = Lo(WinMax), y2 = Hi(WinMax)

Sau lời gọi thủ tục Window phạm vi tác dụng nhiều hμm, thủ tục điều khiển việc hiển thị mμn hình giới hạn khung sổ nμy Mμn hình coi nh− đ−ợc thu nhỏ lại Điểm góc trên-trái khung cửa sổ có toạ độ (1,1).

Window(1,1,80,25) sÏ tr¶ lại vùng hiển thị l ton mn hình

6.3 Màu sắc chế độ hình văn

Mμn hình có nhiều chế độ hiển thị văn khác nhau., goi lμ

Mode mμn hình Dới l bảng giá trị Mode v ý nghĩa chúng

Tên Gía trị

Y nghÜa

BW40 C40 BW80 C80 Mono Font8x8

0 256

40 x 25, đen- trắng mn hình mu 40 x 25 mn hình mu,

80 x 25 đen trắng mn hình mu 80 x 25 mn hình mu

80 x 25 mμn hình đơn sắc

45 / 50 dòng cho mn hình EGA / VGA

TextMode(Mode: Integer);

Đặt chế độ (mode) hiển thị mμn hình văn Tác dụng:

- Cửa sổ mn hình trở lại l ton mn hình, chạy mn hình vÞ trÝ (1,1).

- Thuộc tính video hiển thị văn đ−ợc trả giá trị xuất phát, tr−ớc ch−ơng trình bắt đầu, thơng qua việc gọi thủ tục NormVideo (xem phần d−ới biến TextAttr vμ thủ tục chế độ video)

- Chế độ video hμnh đ−ợc ghi l−u lại vμo biến LastMode Do lời gọi thủ tục TextMode(LastMode) trở lại chế độ video áp

dụng tr−ớc chế độ

(162)

begin

OrigMode:= LastMode; {Ghi l−u lại mode hiển thị cũ }

TextMode(OrigMode); End;

D−ới lμ bảng mμu sắc, dùng để quy định mμu nền, mμu chữ vμ độ sáng hiển thị văn

Tªn mu Gía trị

Tên mu Giá trị Black Blue Green Cyan Red Magenta Brown lightGray DarkGray LightBlue LightGreen LightCyan LightRed LightMagenta Yellow White 10 11 12 13 14 15

Các mμu thuộc cột trái lμ thuộc chế độ LowVideo, khơng sáng chói Các mμu thuộc cột phải lμ thuộc chế độ HighVideo, lμ mμu t−ơng ứng cột trái nh−ng sáng chói hn

Có thể dùng tên tiếng Anh giá trị số

TextBackground(Color: byte);

Đặt mu C¸c mμu nỊn cã thĨ lμ 0 7 hay Black LightGray TextColor(Color: byte);

Đặt mu chữ Các mu chữ cã thÓ lμ 0 15 hay Black White

BiÕn TextAttr lu giữ giá trị thuộc tính hiển thị văn (trong byte) với c¸c ý nghÜa cđa tõng bit nh− sau

7

B b b b V f f f

Ba bit từ số đến số để xác định mμu chữ (f = foreground) Chúng nhận giá trị 15 Ba bit từ số đến số để xác định mμu

(b = background) Bit số để chuyển đổi độ sáng thấp - LowVideo

(163)

HighVideo;

Lμm mμu chữ tăng độ sáng (chói) hơn, t−c lμ đặt bit số lμ

LowVideo;

Lμm mμu chữ giảm độ sáng đi, tức lμ đặt bit số lμ

Nh− vËy, thđ tơc HighVideo l chuyển mu chữ từ cột trái sang mu tơng ứng cột phải bảng trên; thủ tục LowVideo l chuyển mu chữ từ cột phải sang mu tơng ứng cột trái

Mun lm ch nhp nháy đặt bit số Có thể dùng cách thiết lập mμu chữ lμ mμu + Blink mμu + 128

NormVideo;

Lấy lại thuộc tính hiển thị văn có vị trí chạy tr−ớc ch−ơng trình bắt đầu NormVideo đặt biến TextAttr trở lại giá trị ban đầu tr−ớc chạy ch−ơng trình

Tóm lại, việc thiết lập thuộc tính video hiển thị văn đ−ợc thực thơng qua việc gọi thủ tục nói Thực chất, thủ tục nμy tiến hμnh đặt lại bít t−ơng ứng biến TextAttr

Ta hoμn toμn can thiệp đặt giá trị chúng cách trực tiếp Ví dụ lệnh gán TextAttr:= Yellow + Blue * 16 + 128 cho chữ mμu vμng xanh vμ nhấp nháy

VÝ dơ sư dơng c¸c thđ tơc NormVideo, TextBackGround, TextColor uses Crt;

begin

{Chữ xanh nỊn ®en} TextColor(Green);

TextBackground(Black); WriteLn('Hey there!');

{ Chữ mμu đỏ sáng xám } TextColor(LightRed+Blink);

TextBackground(LightGray); WriteLn('Hi there!');

{ Chữ vng xanh}

TextColor(14); { Yellow = 14 } TextBackground(Blue);

WriteLn('Ho there!');

NormVideo; {Trở lại thuộc tính ban đầu } WriteLn('Back to normal ');

(164)

6.4 Xö lÝ gâ phÝm

KeyPressed: boolean;

Hμm kiĨm tra gâ phÝm bÊt k×

ReadKey: char;

Trả lại mà quét phím đợc gõ từ bn phím

Cỏc phím th−ờng gõ tạo mã Các phím mở rộng gõ tạo hai mã, mã đầu ln lμ kí tự NUL = #0 Do để nhận biết phím mở rộng cần bỏ qua kí tự NUL vμ đọc tiếp mã thứ hai:

Gophim:= ReadKey;

If gophim = #0 then gophim:= ReadKey;

Mét sè m· phÝm vμ tỉ hỵp phÝm th−êng dïng

C¸c phÝm th−êng: Esc =#27 , Tab = #9, Enter = #13

C¸c phÝm më réng vμ tỉ hỵp phÝm: #0 / #72

#0 / #80 #0 / #77 #0 / #75

Home #0 / #71 End #0 / #79 PgUp #0 / #73 PgDn #0 / #81

F1 #0 / #59 F2 #0 / #60 F10 #0 / #68 Ctrl +F1 #0 / #94 Ctrl + F2 #0 / #95

6.5 C¸c thđ tơc kh¸c Delay (ms): word;

Tạm ng−ng hoạt động máy tính khoảng thời gian ms

milliseconds

NoSound;

T¾t ©m cđa loa m¸y tÝnh

Sound(Hz: Word); Phát âm có tần số Hz,

Ví dụ: Chơng trình chơi nhạc từ bn phím Uses crt;

Var ch: char; BEGIN

(165)

Repeat

Ch:= readkey;

Case ch of

'd': begin nosound; sound(262) end; 'r': begin nosound; sound(294) end; 'm': begin nosound; sound(330) end; 'p': begin nosound; sound(349) end; 's': begin nosound; sound(392) end;

end; {case}

until ch = esc; nosound; END

7 VÝ dụ ứng dụng - Làm bảng chọn

Bng chọn lμ công cụ hay đ−ợc dùng đến Vận dụng kiến thức trình bμy ch−ơng nμy, ta viết ch−ơng trình tạo bảng chọn kiểu popup Sau thử tổ chức thμnh Unit ch−ơng trình mẫu để sử dụng lại sau nμy

7.1 Các bớc xây dựng bảng chọn

Xác định yêu cầu: Ch−ơng trình vẽ bảng chọn lên mμn

hình văn bản; cho phép chọn phím mũi tên Up, Down (chứ khơng phải gõ số hay chữ), có đổi mầu lμm mục chọn; gõ phím Enter để xác nhận việc chọn; gõ phím Esc để

Phân tích bμi toán: Mặc dù yêu cầu đặt lμ viết ch−ơng trình

tạo vμ xử lí bảng chọn nh−ng ta phải thực ch−ơng trình hoμn chỉnh chứa ch−ơng trình nói để kiểm tra hoạt động yêu cầu

Chơng trình lm bảng chọn có chức nh− sau:

- Đầu vμo: toạ độ góc trái bảng chọn mμn hình, số mục chọn, nhãn tên mục chọn, mμu chữ, mμu bình th−ờng vμ mμu chọn cần lμm mục ang chn

- Đầu ra:

1- Hin thị mμn hình bảng chọn hình chữ nhật, có mục chọn bật, lμ lựa chọn mặc định ban đầu

2- Xư lÝ sù kiƯn gâ c¸c phÝm:

- NÕu gâ phÝm mịi tên Up, Down mục chọn đợc lm bật di chuyển theo lên xuống dới;

- Nếu gõ Enter phải trả lại giá trị để nhận biết lμ chọn mục nμo Thông th−ờng giá trị nμy lμ số thứ tự mục chọn bảng chọn

(166)

- NÕu gõ phím no khác tác dụng phát chuông cảnh báo

- Tr−ờng hợp đặc biệt: gõ phím mữi tên Up mục chọn đỉnh bảng vμ gõ mũi tên Down mục chọn đáy bảng xử lí cho phép "xoay vịng trịn"

ThiÕt kÕ chơng trình: Chơng trình tạo v xử lí bảng chọn

đợc triển khai chi tiết dần b−íc tiÕt sau

TriĨn khai, viÕt m· lƯnh: Chun thiÕt kÕ chi tiÕt b−íc tr−íc thμnh c¸c

c©u lƯnh Pascal

Chạy thử để kiểm tra:

- Thay đổi số mục chọn, nhãn tên mục chọn, mμu nền, mμu chữ - Theo dõi hμnh vi gõ phím khác

7.2 Phân tích thiết kế chi tiết dần tõng b−íc

Tiết nμy minh hoạ ph−ơng pháp thiết kế chi tiết dần b−ớc để xây dựng ch−ơng trình tạo bảng chọn nêu

Để tiện trình bμy ta dùng chữ số để đánh số bμi toán mức chi tiết 1, dùng hai chữ số để đánh số bμi tốn chi tiết cơng việc mức Chữ số thứ kế thừa từ mức 1, chữ số thứ lμ thứ tự chi tiết mức Với công việc ch−a đủ chi tiết sau b−ớc 2, ta lμm thêm b−ớc chi tiết nữa, dùng chữ số để liệt kê theo quy −ớc Vμ tiếp tục nh− cần, kết thúc đủ đơn giản

7.2.1 Chi tiết mức

Chơng trình gồm công việc: - Nhập liệu vo

- Chng trình tạo vμ xử lí bảng chọn - Kiểm tra hoạt động ch−ơng trình 1- Đọc liu vo

Đầu vo: vị trí góc trái, số mục chọn, tên mục chọn, mu nền, mu chọn

Đầu ra: hằng, biến đợc gán giá trị tơng ứng 2- Vẽ v xử lí bảng chọn (chơng trình bảng chọn)

u vo: cỏc tham số bảng chọn đ−ợc gán trị cụ thể sau phần Đầu ra:

- VÏ b¶ng chọn mn hình

(167)

Đầu vo: số nguyên (l kết trả mô ®un xư lÝ b¶ng chän, ng−êi sư dơng gâ c¸c phÝm kh¸c nhau)

Đầu ra: In dịng thơng báo " Bạn chọn mục " mμn hình

Sau b−ớc chi tiết lần thứ ta cú s cu trỳc di õy

Chơng trình lm bảng chọn popup

1.Đọc liệu vo

2: Xây dựng bảng chọn

3: Kim tra hot động

Hình 11.5: Sơ đồ cấu trúc ch−ơng trình bảng chọn - chi tiết mức

7.2.2 Chi tiÕt møc

1- Đọc liệu vμo: đơn giản vμ quen thuộc, không cần chi tiết thêm

3- Kiểm tra hoạt động bảng chọn: Khuôn mẫu chung để sử dụng bảng

chän lμ dïng c©u lƯnh lùa chän Case. Ta cịng sư dơng c©u lƯnh Case

để kiểm tra hoạt động bảng chọn Đầu vμo lμ số nguyên n. Đầu lμ dịng thơng báo “Chọn mục n” Đây lμ việc đơn giản, không cần chi tiết thờm na

2- Tạo v xử lí bảng chọn.

Có công việc rõ rng: - Vẽ bảng chọn ban đầu - Xử lí gõ phím

2.1- Vẽ bảng chọn ban đầu

u vμo: tham số đ−ợc gán giá trị thủ tục nhập liệu Đầu ra: Hiển thị khung hình chữ nhật, dịng lμ nhãn tên mục chon, mục nμo (ví dụ mục đầu tiên) đ−ợc lμm bật

2.2 - Xư lÝ gâ c¸c phÝm

(168)

Đầu vo: mà phím gõ vo Đầu ra:

- NÕu gâ Enter, tr¶ vỊ sè thø tù mơc chän Kết thúc - Nếu gõ Esc, trả - KÕt thóc

- NÕu gâ c¸c phÝm mũi tên Up,Down, cập nhật lại số thứ tự mục chọn v hiển thị bảng chọn với mục đợc chọn

- Nếu gõ phím khác Không lm

Sau bc chi tiết lần thứ hai ta nhận đ−ợc sơ đồ d−ới õy

2.1: Vẽ bảng chọn ban đầu

2.2: Xử lí gõ phím

Chơng trình lm bảng chọn popup

1: Đọc liệu vo

2: Xây dùng b¶ng chän

3: Kiểm tra hoạt động

Hình 11.6: Sơ đồ cấu trúc ch−ơng trình bảng chọn - chi tiết mức

7.2.3 Chi tiÕt møc

2.1: VÏ b¶ng chän ban ®Çu Chi tiÕt tõng b−íc nh− sau:

2.1.1: Tính chiều dμi, chiều rộng cần thiết Chiều dμi bảng chọn tính theo dịng lμ số mục chọn Chiều rộng bảng chọn phải đủ hiển thị nhãn tên mc chn di nht

2.1.2: Vẽ khung hình chữ nhật với mu 2.1.3: Viết lần lợt tên môc chän

2.1.4: Lμm bật mục chọn mặc định ban đầu mμu chọn 2.2: Xử lí gõ phím

Chia thμnh hai tr−êng hợp, gõ phím mũi tên Up, Down v gâ c¸c phÝm kh¸c

(169)

2.2.2: Xư lÝ gâ c¸c phÝm kh¸c

2.1.1.TÝnh chiỊu di, chiều rộng

2.1.2.Vẽ khung hình chữ nhật với mu

2.1.3 Viết lần lợt tên mục chän

2.1.4 Lμm bật mục chọn mặc nh 2.1: V bng

chọn ban đầu

2.2.1: Xư lÝ gâ mịi tªn lªn, xng

2.2.2: Xư lÝ gâ c¸c phÝm kh¸c 2.2: Xư lÝ gâ

phÝm

H×nh 11.7: Chi tiÕt møc công việc 2.1 v 2.2

n õy ta thấy hầu nh− công việc đủ đơn giản Phần cần lμm chi tiết thêm lμ mơ đun 2.2.1 - xử lí gõ phím mũi tên Up,

Down

7.2.4 Chi tiÕt møc

NÕu kÝ hiÖu i lμ số thứ tự mục chọn hnh công viƯc 2.2.1 (xư lÝ gâ phÝm mịi tªn Up, Down) cÇn thùc hiƯn lμ nh− sau

2.2.1.1: Lμm chìm mục chọn i cũ tức l hiển thị mục chän i b»ng mμu nỊn b×nh th−êng

2.2.1.2: CËp nhật lại mục chọn i

- Gán i:= i + / i:= i - 1 tuú theo gâ Up, Down

(170)

2.2.1.3: Lμm nỉi bËt mơc chän i míi HiĨn thÞ mơc chän i b»ng mμu chän

2.2.1: Xö lÝ gâ mịi tªn lªn, xng

2.2.1.1 Lμm ch×m mơc chäncị

2.2.1.2 CËp nhËt mơc chän míi

2.2.1.3.Lμm nỉi mơc chän míi

H×nh 11.7: chi tiÕt møc c«ng viƯc 2.2.1

Tóm lại, sau bốn b−ớc chi tiết dần, công việc trở thμnh đơn giản Việc triển khai viết ch−ơng trình sử dụng Turbo Pascal hay ngơn ngữ lập trình nμo đơn lμ chuyển cơng việc thμnh câu lệnh t−ơng ứng cách máy móc

7.3 Chơng trình chi tiết

Di lμ ch−ơng trình tạo bảng chọn nhận đ−ợc sau triển khai sơ đồ thμnh câu lệnh Turbo Pascal

uses crt;

const max_SoMucChon = 8; {sè mơc chän tèi ®a}

type mang_string = array[0 max_SoMucChon-1] of string; var Ten_Muc_Chon: mang_string; {mảng tên muc chän} So_Muc_Chon: word; {sè môc chän}

Mau_nen, Mau_Chon: byte;

Chon: integer; {danh so tu (SoMucChon - 1),ESC = -1} Procedure NhapThamSoBangChon;

{phần nhập liệu} begin

So_Muc_Chon:=3;

Ten_Muc_Chon[0]:=' muc chon '; Ten_Muc_Chon[1]:=' muc chon '; Ten_Muc_Chon[2]:=' thoat ';

End;

Procedure KiemTraHoatDong;

{kiĨm tra c¸c thao t¸c sư dơng b¶ng chän} begin;

(171)

0: begin

clrscr;

gotoXY(1,1); writeln('ban da chon:', Chon); end;

1: begin

clrscr;

gotoXY(5,5); writeln('ban da chon:', Chon); end;

2: begin

clrscr;

gotoXY(10,10); writeln('ban da chon:', Chon); end;

-1: begin

clrscr;

gotoXY(20,20); writeln('ban da chon thoat !'); end;

end; {case} end;

function BangChon(x,y,SoMucChon:word;TenMucChon: mang_string; MauNen,MauChon: byte): integer; {vẽ bảng chọn, xử lý thao tác chọn} const esc=#27; {các phím để chọn}

enter =#13; up = #72 ; down = #80;

var rong: word; {chiều rộng bảng = tên mục chän dμi nhÊt} i: integer; {thø tù môc chän hiƯn t¹i}

procedure LamNoiMucChon(i: integer); {lμm nỉi bËt mơc chän}

begin

TextBackGround(MauChon); gotoXY(1,i+1);

ClrEol;

write(TenMucChon[i]); end;

procedure LamChimMucChon(i:integer); {th«i lμm nỉi} begin

TextBackGround(MauNen); gotoXY(1,i+1);

clreol;

write(TenMucChon[i]); end;

procedure VeBangChon; var i: integer;

begin

{tinh chieu rong}

rong:=length(TenMucChon[0]); for i:=1 to SoMucChon -1

if rong < length(TenMucChon[i]) then rong:= length(TenMucChon[i]);

(172)

TextBackGround(MauNen); clrscr;

for i:=0 to SoMucChon -1 writeln(TenMucChon[i]);

{mặc định tr−ờng hợp đ−ợc chọn} LamNoiMucChon(0);

end;

procedure XuLiGoPhim; var i: integer;

gophim: char; begin

i:=0; {mặc định ban đầu lμ mục chọn thứ nhất}

repeat

if keyPressed then begin

gophim:=readkey;

if gophim=#0 then gophim:=readkey;

case gophim of

enter: begin BangChon:= i; exit end; esc : begin BangChon:=-1; exit end; up: begin

{xoa hight light} LamChimMucChon(i);

i:= ((i+SoMucChon) -1) mod SoMucChon; LamNoiMucChon(i);

BangChon:=i; end;

down:

begin

LamChimMucChon(i);

i:=(i+1) mod SoMucChon; LamNoiMucChon(i);

BangChon:=i; end;

else ; {gõ phím khác tác dụng gì} end; {case}

end;

until (gophim=enter) or (gophim=esc); end;

begin {function BangChon} VeBangChon;

XuLiGoPhim;

(173)

textMode (lastMode);

end; {function BangChon} BEGIN

NhapThamSoBangChon; Chon:=

BangChon(10,5,So_Muc_Chon,Ten_Muc_Chon,Blue,Red); KiemTraHoatDong;

Readln; END

7.4 Chuyển thành Unit bảng chän

Chuyển ch−ơng trình tạo bảng chọn xây dựng tiết tr−ớc thμnh Unit vμ đặt vμo th− viện Unit chuẩn Turbo Pascal để sử dụng sau nμy

§Ĩ mét chơng trình khác sử dụng đợc hm tạo bảng chọn, phần giao diện phải cung cấp mẫu hm BangChon v liệu đầu vo nh vị trí, số mục chọn, mảng tên mục chọn v mu (mu bình thờng v mu đợc chọn)

Nhận thấy tham số nói có danh sách tham số hμm bảng chọn Các kiểu liệu word, byte lμ kiểu chuẩn đ−ợc định nghĩa sẵn Chỉ có kiểu mang_string mảng xâu kí tự khơng phải lμ kiểu chuẩn nên phải khai báo phần giao diện, sau từ khoá Interface

Phần triển khai chi tiết Unit khơng có khác lμ thực chi tiết hμm bảng chọn nh− viết ví dụ tiết Tóm lại, tệp BgChon.pas

cã néi dung nh− sau Unit BgChon;

INTERFACE

type mang_string = array[0 7] of string;

function BangChon(x,y,SoMucChon:word;TenMucChon:mang_string; MauNen,MauChon: byte): integer;

IMPLEMENTATION uses crt;

function BangChon(x,y,SoMucChon:word;TenMucChon: mang_string; MauNen,MauChon: byte): integer; const esc=#27;

(174)

down = #80;

var rong: word; {chieu rong bang = nhan muc chon dai nhat} i: integer; {thu tu muc chon hien tai}

procedure LamNoiMucChon(i: integer); {lam noi bat muc chon} begin

end;

procedure LamChimMucChon(i:integer); {thoi lam noi} begin

end;

procedure VeBangChon; var i: integer;

begin end;

procedure XuLiGoPhim; var i: integer;

gophim: char; begin

end;

begin {function BangChon}

end; {function BangChon}

END {Unit BgChon}

Biên dịch tệp BgChon.pas thμnh tệp BgChon.tpu vμ đặt vμo th− mục Units chuẩn Turbo Pascal nh− h−ớng dẫn Bây kiểm tra thử hoạt động bảng chọn ch−ơng trình ngắn gọn nh− sau

program testUnitBgChon; uses crt, BgChon;

var SoMC: word;

TenMC: Mang_String; Chon: integer;

Procedure NhapThamSoBangChon;

(175)

BEGIN

NhapThamSoBangChon;

Chon:= BangChon(10,5,SoMC,TenMC,Blue,Red); KiemTraHoatDong;

Readln; END

8 Mét chơng trình ứng dụng

Bi toán: Xây dựng chơng trình quản lí hồ sơ sinh viên Chơng

trình cần có chức tạo tệp liệu mới, mở tệp liệu có, liệt kê toμn danh sách, tìm kiếm thơng tin sinh viên nμo đó, thêm sinh viên (vμo cuối) danh sách Ch−a xét đến việc sửa đổi thông tin, xoá tên sinh viên khỏi danh sách hay xếp danh sách theo mơt trật tự nμo thêm vμo

8.1 Ph©n tÝch thiÕt kÕ 8.1.1

8.1.2

CÊu tróc d÷ liƯu

Các mục liệu hồ sơ sinh viên tổ chức thμnh ghi Một danh sách sinh viên ghi lại đĩa lμ tệp ghi

KiĨu d÷ liƯu hå sơ sinh viên v tệp hồ sơ dùng chơng trình đợc khai báo nh sau

Type HoSo= Record

maso:integer; hoten:String[20]; namsinh:string[2]; end;

Var TepHoSo:File of HoSo;

Chi tiết bớc

Chơng trình gồm hai phần, phần giao diện l bảng chọn v phần xử lí yêu cầu ngời sử dụng

Ta xây dựng Unit lμm bảng chọn nên cần gọi sử dụng D−ới phân tích chi tiết phần xử lí yêu cầu Rõ rμng cần chia mô đun thực chức cơng việc nh− đặc tả

1 - Mở tệp hoc ó cú trờn a

- Đầu vo: tên tệp cần mở

(176)

- Liệt kê nội dung toμn ghi tệp - Đầu vμo: tệp mở sẵn sng

- Đầu ra: hiển thị ton nội dung ghi có tệp mn hình

3 - Tìm kiếm: tìm ghi cụ thể, hiển thị kết tìm kiếm lên mn hình

- Đầu vμo: tệp mở sẵn sμng, mã số sinh viên cần tìm gõ từ bμn phím

- Đầu ra: hiển thị nội dung ghi tìm thấy thông báo không tìm thấy

4- Thêm ghi vo cuối tệp

- u vμo: tệp mở sẵn sμng, mã số sinh viên vμ thơng tin khác nhập từ bμn phím

- Đầu ra: sinh viên cha có danh sách ghi đợc thêm vo cuối tệp

Giả sử tên thủ tục thực công việc tơng ứng l Mở tệp,

Liệt kê, Tìm kiếm, Thêm. Ta viết chơng trình chính, bao

gồm số lời gọi mô đun chơng trình nh dới ®©y

Ch−ơng trình sử dụng lại ch−ơng trình lμm bảng chọn mμ ta chuyển thμnh Unit

BEGIN { chơng trình }

Clrscr; repeat

chon:= BangChon(60,15,SoMC,TenMC,Blue, Red) + 1; case chon of

0:exit; 1:MoTep; 2:LietKe; 3:TimKiem 4:Them; else ;

end;

until chon = SoMC;

END

8.1.3 C¸c b−íc chi tiÕt tiÕp theo

1- Mở tệp:

Chi tiết công việc nh sau 1.1 - Nhập tên tệp cần mở

1.2 - Kiểm tra có tệp đĩa hay ch−a

(177)

1.4 - Xö lÝ ch−a cã tƯp:

1.4.1 - KiĨm tra xem ng−êi dùng muốn tạo tệp liệu hay gõ nhầm tên

1.4.2 - Trờng hợp 1, tạo tệp v thông báo thnh công 1.4.3 - Trờng hợp 2, thoát ra, cho phép lm lại

2- Liệt kê ton danh sách

Chi tiết công việc nh− sau

2.1 - Trình bμy phần tiêu đề để hiển thị danh sách 2.2 - Đ−a cửa sổ v u

2.3 - Đọc ghi vμo biÕn trung gian vμ viÕt mμn h×nh 2.4 - Dịch xuống ghi tiếp

2.5 - Kim tra hết tệp, đóng tệp vμ kết thúc

3 Tìm kiếm

Các bớc công việc

3.1 - Nhập mà số cần tìm 3.2 - Tiến hnh tìm kiếm

3.2.1- Đa cửa sổ tệp đầu tệp

3.2.2 - Đọc ghi vμo biÕn trung gian 3.2.3 - So s¸nh víi m· số cần tìm

3.2.4 - Dng ó thy hết tệp 3.3 - Hiển thị kết

3.3.1 - Trờng hợp tìm thấy, hiển thị nội dung biến trung gian 3.3.2 - Trờng hợp không tìm thấy, hiển thị thông báo

3.4 - Hỏi lại ngời dùng có cần tìm kiếm tiếp hay không 3.5 - Xử lí tuỳ theo yêu cầu ngời sử dụng

3.5.1 - Có: lặp lại việc tìm kiếm 3.5.2 - Không: kết thúc

3.6 - Đóng tệp v kết thúc

4 Thêm hồ sơ

C¸c b−íc chi tiÕt

4.1 - NhËp m· số cần thêm

4.2 - Tìm kiếm: gọi thủ tục tìm kiếm 4.3 - Xử lí kết tìm kiếm

4.3.1 Trng hp ó cú hin th thụng bỏo

4.3.2 Trờng hợp cha có, thêm vo cuối danh sách 4.3.2.1 Nhập liệu vo biến trung gian 4.3.2.2 §−a cưa sỉ tƯp vỊ ci tƯp

(178)

4.5 - Xử lí câu trả lời:

4.5.1 Có: lặp lại từ 4.1

4.5.2 Không: sang bớc 4.6 - Đóng tệp v kÕt thóc

8.2 TriĨn khai chi tiÕt ch−¬ng tr×nh

D−ới lμ mơ đun ch−ơng trình thực chức cơng việc nh− phân tích

Thđ tơc Më tÖp

procedure MoTep; const Enter = #13;

var tenfile: String[32]; begin

clrscr;

Write(' Cho ten tep '); Readln(tenfile); Assign(TepHoSo,tenfile);

{$I-}

reset(TepHoSo); {$I+}

if ioresult <> then {không có tệp no trùng tên } begin

Writeln(' Ban muon tao tep moi ? Enter=Yes '); if ReadKey = Enter then Rewrite(ds)

else exit; end;

close(ds);

Writeln(' Tep da san sang !'); end;

Thđ tơc LiƯt kª procedure LietKe; var i:integer; begin

clrscr;

reset(TepHoSo); i:=0;

writeln(' DANH SACH SINH VIEN '); writeln;

writeln(' -'); writeln('|TT |MASO | HO TEN |NAM SINH|'); writeln(' -'); while not eof(TepHoSo)

(179)

read(TepHoSo,sv); if sv.maso<>0 then begin

i:=i+1; with sv begin

writeln('|',i:2,' |',maso:2,' | ',hoten:20,'|',namsinh:4,' |'); end;

end; end;

close(TepHoSo); end;

Thđ tơc T×m kiÕm.

procedure TimKiem; var TimThay:boolean; traloi:char; i,h:integer; begin

clrscr; repeat

write(' Ma so SV can xem thong tin: '); readln(ma);

reset (TepHoSo); TimThay:=false;

while (not TimThay) and (not eof(TepHoSo)) begin

read(TepHoSo,sv); if sv.maso=ma then begin

TimThay:=true;

writeln(' Sv co ma so: ',ma,': '); writeln(' Ho ten: ',sv.hoten); writeln(' Nam sinh: ',sv.namsinh); end;

end;

if not Timthay then writeln('*Ma so SV: ',ma,' khong co tep ');

write(' Can xem tiep (Y/N) ?: ');readln(traloi); until upcase(traloi)='N';

close(TepHoSo); end;

(180)

Clrscr;

write(' Ma so SV (0:Stop): ');readln(ma); while ma<>0

begin

reset(TepHoSo); DaCo:=false;

while (not DaCo) and (not eof(TepHoSo)) begin

read(TepHoSo,sv);

if sv.maso=ma then DaCo:=true end;

if DaCo=true then writeln('Ma so: ',ma,'da co ') else

begin

with sv begin

write(' Ho ten: ');readln(hoten); write(' Nam sinh ( so cuoi ): ');readln(namsinh);

maso:=ma; end;

seek(TepHoSo,filesize(TepHoSo)); write(TepHoSo,sv);

end;

write(' Ma so SV (0:Stop): ');readln(ma); end;

close(TepHoSo); end;

Toμn chức ch−ơng trình quản lí hồ sơ sinh viên nh− u cầu đ−ợc triển khai chi tiết Bây cần lắp ráp chúng vμo khung ch−ơng trình Ch−ơng trình sử dụng bảng chọn xây dựng Unit BgChon ch−ơng tr−ớc

Tãm l¹i, ta nhận đợc chơng trình hon chỉnh nh sau

program QLSV; uses crt, BgChon; Const maxSize=10; Type HoSo= Record

maso:integer; hoten:String[20]; namsinh:string[2]; end;

Var TepHoSo:File of HoSo; sv:HoSo;

tenfile:String[32]; ma:integer;

(181)

SoMC: word;

TenMC: Mang_String; Chon: integer;

Procedure NhapThamSoBangChon; Begin

{khởi tạo tham số bảng chọn} SoMC:= 5;

TenMC[0]:=' Mo tep du lieu '; TenMC[1]:=' Liet ke ';

TenMC[2]:=' Tim kiem ';

TenMC[3]:=' Them vao danh sach '; TenMC[4]:=' Ket thuc ';

End;

procedure MoTep; Var i:integer; begin

end;

procedure LietKe; var i:integer; begin

end;

procedure TimKiem; var TimThay:boolean; traloi:char; i,h:integer; begin

end;

procedure Them; var i,ma: integer; DaCo:boolean; begin

end; BEGIN

Clrscr; repeat

chon:= BangChon(60,15,SoMC,TenMC,Blue, Red) + 1; case chon of

0:exit; 1:MoTep; 2:LietKe; 3:TimPhanTu; 4:ThemPhanTu; else ;

end;

(182)

END

C©u hỏi v bi tập

1 Nguyên tắc chung thiết kế chi tiết dần bớc l

2 Các mơ đun ch−ơng trình liên kết với cách nμo Sơ đồ cấu trúc ch−ong trình khác với l−u đồ thuật giải

4 Khi nμo vμ cần dùng thuật giải đệ quy

5 So sánh thuật giải đệ quy với thuật giải lặp.Thuật giải nμo hiệu Câu lệnh nμo ln có thủ tục đệ quy

7 Tên mọt hμm đệ quy phải xuất lμ lần bên phần thân

8 Tại n lμ tham số hμm, thủ tục đệ quy n phải lμ tham biến

Thùc hμnh

1 Ph©n tÝch thiÕt kÕ vμ triĨn khai chơng trình quản lí đầu sách th viện Mỗi đầu sách gồm thông tin: mà số, tên, số lợng Chơng trình cho phép liệt kê kho sách, tìm kiếm đầu sách, thêm số sách cho đầu sách, thêm đầu sách

2 Phân tich thiết kế v triển khai chơng trình soạn thảo dòng văn bản, cho phép chèn, xoá, thay xâu

3 Phõn tich thiết kế vμ triển khai trò chơi đơn giản hỏi đáp địa lí nh− sau: đ−a tên n−ớc vμ số tên thủ đô, ng−ời chơi chọn câu trả lời, có thống kê vμ tính điểm

4 Viết chơng trình quản lí kết quản học tËp cđa häc sinh mét líp, gåm 10 häc sinh Mỗi học sinh có thông tin sau: Họ v tên, điểm, xếp loại Họ tên v điểm nhập từ bn phím Chơng trình có chơng trình con:

NhapDuLieu, PhanLoai, DiemTB, XetLenLơp Cho trớc chơng trình

chính nh− sau

NhapDuLieu; {thđ tơc nhËp d÷ liƯu}

PhanLoai (4,6,8); {kém:0 4; trung bình:5,6; 7,8; giỏi: 9,10} Writeln(' Điểm trung bình lơp: ', DiemTB);

Writeln(' Danh sach học sinh đợc lên lớp ');

XetLenL¬p

(183)

6 Viết thủ tục đệ quy in phần tử mảng theo thứ tự xuôi, theo thứ tự ng−ợc

7 Liệt kê hoán vị n phần tử dùng thuật giải đệ quy

(184)

Ch−¬ng 12

Con trỏ vμ cấu trúc liệu động

1 Con trá

1.1 Biến tĩnh biến động 1.1.1

1.1.2

BiÕn tÜnh

Cho đến ta biết muốn sử dụng biến ch−ơng trình hay ch−ơng trình phải khai báo Sau khai báo, tức lμ đăng kí tên vμ kiểu liệu biến đầu ch−ơng trình, ch−ơng trình ta n tâm sử dụng mμ khơng cần phải lμm thêm viêc nμo khác Mọi cơng việc quản lí biến trình biên dịch vμ hệ điều hμnh đảm nhiệm Chúng đ−ợc cấp phát vùng nhớ bắt đầu ch−ơng trình, ch−ơng trình vμ đ−ợc giải phóng ch−ơng trình, ch−ơng trình kết thúc Nh− vậy, biến toμn cục tồn suốt thời gian hoạt động ch−ơng trình chính, biến cục tồn suốt thời gian hoạt động ch−ơng trình đ−ợc sử dụng xong sớm từ lúc bắt đầu ch−ơng trình đến gần thời điểm kết thúc cần đến nơi

Vì lí nμy mμ ng−ời ta gọi lμ biến tĩnh Sử dụng biến tĩnh dễ dμng vμ đơn giản Tuy nhiên chúng không cho phép tận dụng triệt để nhớ

Biến động

Để khắc phục nh−ợc điểm biến tĩnh, ng−ời lập trình cần phải có khả can thiệp trực tiếp vμo việc cấp phát vμ giải phóng vùng nhớ Chỉ xin cấp phát nhớ cho biến bắt đầu thực dùng đến nó, cần xin cấp phát nhiêu, tránh lãng phí vμ dùng xong giải phóng khơng để chiếm chỗ vơ ích

Khái niệm biến động đ−ợc đề xuất lμ để đáp ứng địi hỏi Nó mang lại khả sử dụng nhớ linh hoạt vμ mềm dẻo hơn, nhiên yêu cầu ng−ời lập trình phải lμm việc nhiều hơn, có trình độ cao

(185)

1.2 Định nghĩa khai báo 1.2.1

1.2.2

BiÕn trá

Biến trỏ (Pointer variable) lμ loại biến đặc biệt, chiếm byte Nội dung khơng phải lμ giá trị, liệu, mμ lμ địa Đây lμ địa ô nhớ vùng nhớ để chứa biến động t−ơng ứng Vùng nhớ nμy dμi đến đâu lμ kiểu liệu biến động định

Vậy cần rõ trỏ kiểu (dữ liệu) gì! Khi trỏ có kiểu đợc khai báo trình biên dịch nhận đợc thông tin sau:

-KÝch th−íc cđa biÕn

-Cấu trúc biến, nghĩa lμ địa t−ơng đối tr−ờng thμnh phần có vμ kích th−ớc tr−ờng

BiÕn trá

$1234 $1234

Vùng nhớ chứa biến động

Hình 12.1: biến trỏ để trỏ vμo địa

Khai b¸o

Có thể khai báo kiểu trỏ vμ sau khai báo biến trỏ Cũng khai báo trực tiếp biến trỏ, không định nghĩa kiểu

Cú pháp: từ khoá Type, tên kiểu trỏ, dấu b»ng, dÊu mị, kiĨu d÷ liƯu trá tíi

Type kiĨu trá = ^ kiĨu d÷ liƯu ;

Var biÕn trá : kiĨu trá ;

hc

Var biÕn trá : ^ kiểu liêu ;

Ví dụ 1: Type RealPtr = ^ Real; Var a,b, kq: RealPtr; hc

Var a,b, kq: ^ Real;

VÝ dô 2: Type Sv = Record

Ho_dem: string[24];

(186)

diemm_tb: real; end;

SvPtr = ^ Sv;

Var SinhVien1, SinhVien2: SvPtr; hc

Var SinhVien1, SinhVien2, LopTruong: ^ Sv;

Lu ý khai báo kiểu biến trỏ không chấp nhận

kiểu liệu vô danh Sau kÝ hiÖu trá “^” chØ chÊp nhËn kiểu liệu

chun ó cú sn hoc kiểu đ−ợc khai báo tr−ớc

Ví dụ, trình biên dịch khơng chấp nhận cách khai báo trỏ đến mảng nh− sau:

VAR MangPtr: ^ array[1 10] of real;

ThËm chÝ mét khai b¸o kiĨu

TYPE MangPtr = ^ array[1 10] of real;

cũng không hợp lệ Cần phải khai báo kiểu mảng tr−ớc TYPE Mang = array[1 10] of real;

MangPtr = ^Mang;

VAR A,B: MangPtr;

Hc

TYPE Mang = array[1 10] of real;

VAR A,B: ^MangPtr;

1.3 Các phép toán trỏ 1.3.1 Gán giá trị cho biến trỏ

Nội dung biến trỏ lμ địa Có thể gán giá trị cho biến trỏ, nghĩa lμ cho trỏ nμy trỏ đến địa cụ thể nμo cách nh− sau

1- Gán trực tiếp địa biến tĩnh cho trỏ kiểu liệu, dùng toán tử lấy địa @ Lệnh gán nμy lμm cho biến trỏ trỏ đến biến đó:

biÕn trá = @ biÕn tÜnh ;

VÝ dô

Var i: Integer;

ip: ^Integer;

(187)

2- Dùng thủ tục New GetMem để khởi tạo biến động vμ gán giá trị cho trỏ t−ơng ứng nh− xét tiết sau

3- Dùng hμm Ptr để chuyển đổi địa đoạn vμ offset thμnh địa gán cho trỏ (sẽ xét đến phần lập trình hệ thống)

4- Có thể gán giá trị biến trỏ cho biến trỏ khác kiểu Sau phép gán nμy hai trỏ có gía trị, nghĩa lμ trỏ đến biến động Ví dụ,

LopTruong:= SinhVien1;

1.3.2

1.3.3

2.1.1

So s¸nh

ChØ cã thĨ so s¸nh hai trá b»ng hay kh¸c

Hai biến trỏ lμ kiểu vμ giá trị, tức lμ trỏ đến địa

Con trá NIL

- NIL Lμ giá trị đặc biệt, nói trỏ nμy không trỏ vμo đâu

- Cã thể gán giá trị NIL cho trỏ kiÓu nμo

Việc đặt giá trị NIL nhằm mục đích sau Nội dung biến trỏ đ−ợc hiểu lμ địa Sau khai báo biến trỏ mμ ch−a khởi tạo biến động t−ơng ứng, giải phóng biến động, vùng nhớ mμ trỏ trỏ tới chứa liệu quan trọng Dữ liệu bị vơ tình lμm hỏng để trỏ "vu vơ" Việc gán giá trị đặc biệt NIL tình nhằm tránh hậu bất th−ờng xảy

2 Biến động

2.1 Cấp phát vùng nhớ truy cập biến động

Cấp phát vùng nhớ cho biến động Cú pháp: Dùng thủ tục New

New ( biÕn trá );

(188)

2.1.2 Truy cập biến động

Cần phân biệt lμ gán giá trị vμ đọc giá trị biến động (mμ biến trỏ trỏ đến) lμ gán giá trị vμ đọc giá trị biến trỏ

: biến trỏ ^ := giá trị ;

Gán trị

Đọc giá trị: biến := biến trỏ ^ ; VÝ dô 1:

Var P: SvPtr; New (P);

P^.HoDem:= 'nguyen van'; P^.Ten:= 'Nam';

P^ Diem_tb:= 7.5; VÝ dô 2:

LopTruong:= P; Nguoi1:= P;

New(P) ; { lúc nμy P chứa địa khác }

Nguoi2:= P;

2.2 Giải phóng biến động, thu hồi vùng nhớ

Khi sử dụng xong, nên giải phóng vùng nhớ cấp cho biến động

Dispose ( biÕn trá );

biÕn trá := NIL;

Thủ tục nμy trả lại phần nhớ mμ biến động đ−ợc cấp nghĩa lμ đánh dấu trở thμnh vùng nhớ rỗi, dùng vμo việc khác Ví dụ:

Writeln(‘Lớp tr−ởng:’, LopTruong^.HoDem, ‘ ’ , LopTruong ^ Ten); Writeln(‘ Điểm trung bình cuối năm:’ , LopTruong ^ Diem_tb ); { sử dụng xong biến động LopTruong^ , giải phóng} Dispose ( LopTruong );

3 Con trỏ không định kiểu - Pointer

(189)

Trái với trỏ có kiểu, trỏ không định kiểu hay trỏ kiểu

chung - generic pointer - để trỏ đến địa ô nhớ vùng

nhớ mμ ta cần đến Kích th−ớc vùng nhớ nμy cịn ch−a xác định, cấu trúc ch−a có Ng−ời sử dụng phải tự lo lấy việc ấn định kích th−ớc vμ cấu trúc truy cập

Khai b¸o: Var biÕn trá: Pointer ;

Xin cÊp ph¸t vïng nhí: GetMem ( biÕn trá , kich th−íc ); Gi¶i phãng vïng nhí: FreeMem ( biÕn trá , kÝch th−íc ); ë kích thớc l kích thớc khối nhớ liên tục tÝnh b»ng word

øng dông 3.2

Khi cần xử lí khối nhớ liên tục, khơng cần truy cập đến thμnh phần, ví dụ cần xử lí l−ợng gồm size * Word dữ liệu, chẳng hạn tệp hình ảnh, tệp âm thanh, mμn hình, khung cửa sổ, để tăng tốc độ truy cập ng−ời ta th−ờng dùng trỏ khơng định kiểu

Các ch−ơng trình đồ hoạ vμ tạo hoạt hình th−ờng phải thực nhiều lần việc l−u giữ lại cho hiển thị toμn hay phần mμn hình Ta thấy nhiều ví dụ sử dụng trỏ khơng định kiểu

Cũng tính chất khơng định kiểu hay nói lμ ch−a định kiểu mμ trỏ chung Pointer t−ơng thích với kiểu liệu Ta dùng phép ép kiểu để truy cập vùng nhớ trỏ trỏ chung Pointer

nh− lμ biến có kiểu cụ thể nμo

D−ới lμ ví dụ minh hoạ, sử dụng trỏ khơng định kiểu vμ thủ tục GetMem xin cấp phát động vùng nhớ để tiết kiệm dùng mảng Ta biết khai báo biến mảng kích th−ớc phải lμ cho tr−ớc Điều nμy dẫn đến phải khai báo dự phịng kích th−ớc tơí đa Sử dụng trỏ vμ biến động ta không dùng biến tĩnh mμ dùng trỏ không định kiểu Khi biết kích th−ớc cụ thể xin cấp vừa đủ vùng nhớ cần thiết Việc truy cập phần tử mảng s thụng qua phộp ộp kiu

Chơng trình dới tạo v in ma trận vuông có phần tử l số nguyên, sinh ngẫu nhiên KÝch th−íc (sè hμng = sè cét) cđa ma trËn gâ tõ bμn phÝm

uses crt;

const max_size = 50;

type matrix = array[1 max_size,1 max_size] of word; var P: Pointer ;

sz,i,j: byte; BEGIN

(190)

write(' cho kich thuoc ma tran: '); readln(sz); Getmem(P, sz*sz);

for i:=1 to sz for j:=1 to sz

( matrix (P^))[i,j]:= random(100); for i:=1 to sz

begin

for j:=1 to sz

write( (matrix (P^))[i,j]:4); writeln;

end;

freeMem( P, sz*sz); END

Có thể khai báo P lμ trỏ đến kiểu mảng matrix

Var P: ^ matrix;

Thủ tục GetMem dùng đ−ợc để cấp vùng nhớ cho P nh− cũ Phép truy cập phần tử mảng trỏ P nh− thơng th−ờng, khơng phải ép kiểu Ch−ơng trình dễ hiểu Tuy nhiên, ví dụ cho thấy tính linh hoạt sử dụng trỏ không định kiểu

4 Vùng ngăn xếp vùng Heap

4.1 Kh¸i niƯm

Vùng ngăn xếp hay Stack lμ vùng nhớ dμnh cho biến cục ch−ơng trình Mỗi gọi ch−ơng trình con, stack (kích th−ớc mặc định lμ 16 KB) đ−ợc tạo Khi kết thúc vμ khỏi ch−ơng trỡnh con,

stack ny đợc giải phóng

Vựng nhớ dμnh chỗ cho stack lμ vùng thấp, phần vùng nhớ l−u giữ mã ch−ơng trình

stack segment Heap segment

Chơng trình v biÕn tÜnh

ch−a dïng

đã dùng

dùng

ch−a dïng

Vùng điạ thấp ← → Vùng địa cao

H×nh 12.2: Tổ chức nhớ thực môt chơng tr×nh

Vùng Heap lμ vùng nhớ dμnh để cấp cho biến động thủ tục

(191)

Con trỏ Heap trỏ vμo ô nhớ rỗi vùng Heap Sau lần xin cấp phát New trỏ di chuyển khoảng kích th−ớc biến động vừa cp phỏt

Do cáp phát, giải phóng xen kẽ nhau, hậu l vùng Heap phân thnh nhiều mảnh, không liền

Trớc xin cấp phát mảng nhớ lớn cần kiểm tra tránh trn Heap

bằng hai hm sau

MemAvail: Tổng số ô nhớ rỗi

MaxAvail : Kích thứơc lớn vùng nhớ liên tục rỗi

4.2 Gi¶i to¶ heap

ở ta biết cách giải phóng biến động thủ tục Dispose Thủ

tục Dispose tham số đầu vμo lμ trỏ đến biến động cần giải phóng vμ

lần gọi giải phóng biến động

Có tr−ờng hợp cần tạo vμ giải phóng nhiều biến động lúc Các thủ tục d−ới hỗ trợ thực việc nμy

Mark ( Pmark );

Ghi laị giá trị trỏ Heap vμo Pmark Pmark lμ biến trỏ Kể lừ lệnh nμy, thủ tục New đ−ợc cấp vùng nhớ từ trở

Release ( Pmark );

Giải phóng tất biến động đ−ợc cấp phát kể từ đánh dấu

Mark( Pmark)

VÝ dô:

Var P,Q,R, Pmark: … Begin

New(R);

Mark(Pmark);

New(P);

New(Q);

{giải phóng vùng nhớ cấp cho P,Q } Release(Pmark);

End

(192)

Con trỏ vμ biến động lμ công cụ linh hoạt Nó cho phép xây dựng nhiều câú trúc liệu động cần thiết mμ ta nghiên cứu ch−ơng sau nêu ví dụ nhằm minh hoạ ý nghĩa quan trọng vμ cách sử dụng chúng

Ta biết vùng nhớ dμnh cho biến tĩnh bị giới hạn 640 KB vùng nhớ sở Hơn nữa, khai báo mảng cỡ lớn kích th−ớc khơng thể v−ợt phân đoạn nhớ (segment) lμ 64 KB Ví dụ, với mảng số thực kiểu real, liệu kiểu real chiếm byte mảng lớn khơng thể v−ợt q 10922 phần tử (vì 10922 * = 65532 byte < 64 KB = 65536 byte)

Nếu bμi toán cần xử lí nhiều mảng cỡ lớn phải dùng biến động để xin cấp phát vùng nhớ Heap vμ giải phóng sau sử dụng xong

Ví dụ d−ới nhằm minh hoạ điều Vùng Heap bị vét cạn nhanh ta khơng giải phóng chỗ

const nMax=10922;

type MangLon=array[1 nMax] of real; Var Mp: ^MangLon ;

i: integer; BEGIN

i:=0; repeat i:=i+1;

writeln('tong vung nho roi tren Heap: ', MemAvail); writeln('khoi nho lien lon nhat tren heap:', MaxAvail); if MaxAvail < sizeof(MangLon) then

begin

writeln('khong du vung nho cho mang thu ',i,' !'); halt;

end else begin

new(Mp);

writeln('Heap dang chua ',i,' mang 10922 so thuc

=', i * 65532,' byte !');

readln;

end; until false; END

C©u hái vμ bμi tËp

(193)

2 Phân biệt biến tĩnh vμ biến động Các biến tĩnh đ−ợc cấp phát vùng nhớ nμo Các bién động đ−ợc cấp phát vùng nhớ cách nμo Câu lênh GetMem khác với New điểm nμo Nó dùng để cấp

phát vùng nhớ cho biến động kiểu Có thể dùng FreeMem để giải phóng vùng nhớ cấp phát New hay khơng

4 Trong ch−ơng trình có khai báo vμ câu lệnh nh− sau Câu lệnh nμo cú pháp, câu lệnh nμo sai cú pháp,

a) Type mang = array[1 10] of integer;

MangPtr = ^mang;

Var A: mang;

Aptr: mangPtr;

p,q: ^integer;

i: integer;

câu lệnh:

p:=i; @i:=p; p:=@i; p:=q; A[5]:= i; A[5]:= p^; A[5]:= q; Aptr^[5]:= q^; Aptr[5]^:= i; b) Type HoSo = record

HoVaTen: String;

NamSinh: word;

L−¬ng: real;

End;

HoSoPtr = ^HoSo;

Var CB1, CB2: HoSo;

NV1, NV2: HoSoPtr;

Các câu lệnh:

CB1:= NV1; NV1^:= CB1; CB1:= NV1^; @NV1:= CB1; NV2:= @CB2;

NV1.L−¬ng:= 500.0;

NV1^.HoVaTen:=' nguyen van A'; NV1.NămSinh^:= 1970

5 Có khai báo

Type vecto_10 = array [1 10] of Integer ;

vecto_nguyen_10 = array [1 10] of Integer ; vecto_10_Ptr = ^ vevto_10;

Var x: vecto_10;

y: vecto_nguyen_10;

z: array [1 10] of Integer ;

P: pointer;

(194)

b) Type Vevto_10_Ptr = ^ array [1 10] of Integer ; - a) x:=y b) y:= z c) x:= z

(195)

Chơng 13

Danh sách & danh s¸ch mãc nèi

Ch−ơng nμy nghiên cứu mơ hình danh sách lμ mơ hình liệu hay gặp bμi toán thực tế Đặc biệt có hai kiểu danh sách ngăn xếp vμ danh sách hμng đợi lμ kiểu liệu bản, lμm sở để thực nhiều thuật giải điển hình

Ngoμi ra, ch−ơng nμy cịn có mục đích minh hoạ tính linh hoạt trỏ vμ biến động cấu trúc liệu Sau trình bμy danh sách mảng vμ −u nh−ợc điểm nó, ta xét việc biểu diễn danh sách cấu trúc danh sách móc nối, dùng trỏ vμ biến động Cấu trúc linh hoạt nμy khắc phục đ−ợc nh−ợc điểm thuộc chất danh sách mảng

1 Danh s¸ch mảng

1.1 Mô hình danh sách

Danh sách tuyến tính (List) l mô hình liệu khái quát hoá danh sách liệt kê Có nhiều ví dụ danh sách bi toán xử lí thông tin Danh sách nhân viên quan, danh sách hnh khách giữ chỗ chuyến bay, danh sách công việc cần phải tiến hnh quy trình công nghệ

Có thể khái qt hố đặc tr−ng danh sách nh− sau: - Danh sách lμ tập phần tử liệu cùng kiểu, phần tử

một trình tự đứng tr−ớc, đứng sau.

- Cho phÐp thªm phần tử vo danh sách xoá bỏ bớt phần tử khỏi danh sách

- S phn t hay kích th−ớc danh sách lμ khơng cố định, thay đổi tăng lên, giảm thời gian thực ch−ơng trình Đây lμ điểm khác với mảng

(196)

1.2 Danh s¸ch biĨu diƠn b»ng cÊu tróc m¶ng.

Theo mơ tả đặc tr−ng danh sách trên, dễ thấy ta triển khai xây dựng danh sách cấu trúc mảng Để thể đ−ợc kích th−ớc thay đổi danh sách cần xét kèm thêm biến để ghi số phần tử có Nh− vậy, danh sách lμ gồm mảng PhanTu để chứa phần tử vμ biến nguyên kt lμ số phần tử có mặt danh sách

Type DanhSach = Record

PhanTu: array [1 max_kt ] of kiĨu phÇn tư ; kt: word;

end;

max_kt l kích thớc (dự phòng) lớn nhÊt cã thĨ cđa danh s¸ch VÝ dơ, mét danh sách tên ngời, phần tử l xâu kí tự đợc khai báo nh sau:

TYPE Ten = String[8]; DSTen = Record

PhanTu: array [1 100] of Tªn; kt: word;

end;

VAR L: DSTªn;

1.3 Các phép toán danh sách mảng

Sử dụng mảng lμ cấu trúc có sẵn, thao tác danh sách nói dễ dμng đ−ợc thực

1.3.1 Truy cËp mét phÇn tư

Truy cËp vμo mét phÇn tư danh sách l truy cập vo phần tử mảng

Gán trị: L.PhanTu[i]:= giá trị ; §äc gi¸ trÝ: biÕn:= L.PhanTu[i]; VÝ dơ,

{ g¸n tên l Hùng cho ngời thứ danh sách } L.PhanTu[5]:='Hùng';

{ Đọc tên ngời thứ 10 }

(197)

1.3.2

1.3.3

1.3.4

1.3.5

Dut danh s¸ch

Duyệt danh sách lμ thao tác truy cập đến tất phần tử danh sách để thực xử lí nμo cho đảm bảo khơng sótkhơng lặp Khơng sót nghĩa lμ phần tử đ−ợc xử lí, khơng lặp nghĩa lμ khơng phần tử nμo bị xử lí lần

PhÐp duyệt thực nhờ vòng lặp For

For i:= 1 to L.kt " xö lÝ L.PhanTu[i]" ; VÝ dơ

Thay toμn bé tªn b»ng ch÷ in hoa

For i:= 1 to L.kt L.PhanTu[i]:= upper(L.PhanTu[i]);

T×m kiÕm

Tìm kiếm phần tử danh sách lμ nhằm phát phần tử có chứa thμnh phần liệu trùng khớp với mẫu cho Mẫu nμy th−ờng đ−ợc gọi lμ khóa tìm kiếm

Tuỳ theo danh sách có đ−ợc xếp thứ tự theo khoá cho hay khơng mμ có cách tìm kiếm khác

Tìm kiếm - Sequential Searching

Khi danh sách ch−a đ−ợc xếp cách để thực tìm kiếm lμ duyệt từ đầu, tìm thấy phát khơng có

Tìm kiếm nhị phân - Binary Searching

Khi danh sách đ−ợc xếp thứ tự theo khố cần tìm tiến hμnh tìm kiếm theo cách chia đôi dần Đây lμ thủ tục tìm kiếm nhị phân xét đến phần thủ tc quy

Thêm phần tử

- Hoặc nối vμo cuối, danh sách khơng đ−ợc theo thứ tự Thực đơn giản nh−ng phí nhiều tìm kiếm

- Hoặc chèn chỗ, theo cách nμy buộc phải tìm vị trí vμ sau dịch chuyển phần đuôi Thực phức tạp nh−ng bù lại tìm kiếm nhanh

Gì bá phÇn tư

- Tìm đến phần tử cần gỡ bỏ vμ huỷ phần tử nμy cách chép dồn lên

1.4 Các u, nhợc điểm

(198)

- Đơn giản, cμi đặt đễ dμng kiểu mảng quen biết - Bất tiện th−ờng xuyên có thao tác thêm bớt phần tử danh sách

1.5 VÝ dô minh ho¹

Để thấy đ−ợc −u nh−ợc điểm danh sách mảng cải tiến ch−ơng trình quản lí hồ sơ sinh viên phát triển ch−ơng

Ch−ơng trình nμy cho phép tiến hμnh thao tác tạo lập, liệt kê, tìm kiếm vμ thêm hồ sơ vμo cuối danh sách Cần bổ xung thêm chức thứ lμ cho phép huỷ hồ sơ

1.5.1 Ph©n tÝch, thiÕt kÕ

Chức huỷ hồ sơ danh sách sinh viên lμ thủ tục phức tạp ghi cần huỷ nằm tệp Cần có thao tác dồn lấp chỗ trống Nội dung tệp phải viết lại hoμn toμn Do cần đọc toμn thơng tin mảng nhớ để tiện xử lí Chỉ viết lại vμo tệp thời điểm cuối cùng, thay đổi hoμn tất

Mét danh s¸ch c¸c hå sơ đợc thực mảng ghi Ta cần khai báo danh sách mảng nh sau

Type DSHoso = Record

PhanTu: array [1 max_kt] of Hoso;

Kt: word;

End; Var L: DSHoso

Chi tiÕt dÇn tõng b−íc thủ tục huỷ hồ sơ khỏi danh sách nh sau Hủ mét hå s¬

- Đầu vμo: tệp mở sẵn, mã số hồ sơ cần huỷ gõ từ bμn phím - Đầu ra: tệp khơng cịn chứa ghi cần huỷ

Chi tiÕt dÇn tõng b−íc

5.1 ChÐp toμn bé néi dung tƯp mảng ghi

5.2.1 Đa cửa sổ tệp đầu tệp; gán số mảng 5.2.2 Đọc từ tệp phần tử mảng

5.2.3 Tăng số mảng lên 5.2.4 Dừng hÕt tƯp

5.2 NhËp m· sè cđa hå sơ cần huỷ

5.3 Tỡm kim phn t mng lμ ghi có mã số cho: 5.3.1 Gọi thủ tục Tìm kiếm

5.4 Xư lÝ kÕt qu¶ tìm kiếm

(199)

5.4.2 Trờng hợp thấy, tiÕn hμnh bá b¶n ghi khái m¶ng: 5.4.2.1 ChÐp dồn phần tử mảng lên vị trí lấp vo chỗ phần tử mảng bị gõ bỏ,

5.4.2.2 hiển thị thông báo thnh công 5.5 Hỏi lại ngời dùng có cần huỷ tiếp hay không 5.6 Xử lí trả lời có: lặp lại từ bớc 5.2;

5.7 Viết nội dung mảng tệp 5.8 Đóng tƯp vμ kÕt thóc

1.5.2 TriĨn khai chi tiÕt

Từ bảng phân tích chi tiết dần b−ớc trên, dễ dμng chuyển thμnh thủ tục Pascal nh− d−ới L−u ý để nhấn mạnh cấu trúc danh sách vμ dễ theo dõi ta không sử dụng câu lệnh with mμ viết đầy đủ cấp kiểu ghi lồng

procedure Huy;

var TimThay:boolean; CoHuy:boolean; traloi:char;

i, csTimThay: integer; begin

CoHuy:= false; reset(TepHoso); i:=0;

{chep lai vao danh sach de xu ly thao tac huy} while not eof(TepHoso)

begin read(TepHoso,L.PhanTu[i]); i:=i+1;

end; L.kt:= i-1; repeat

write('Ma so SV can huy thong tin: '); readln(ma);

TimThay:= false; i:= 0; while (not TimThay) begin

if L.PhanTu[i].maso=ma then

begin TimThay:=true; CoHuy:=true; csTimThay:=i;

end; i:=i+1; end;

if TimThay then

begin {chep lai mang, tru SV can huy} L.kt:= L.kt - 1;

for i:= csTimThay to L.kt begin

(200)

L.PhanTu[i].namsinh:= L.PhanTu[i+1].namsinh; end

end

else writeln(' Ma so SV: ',ma,' khong co danh sach');

write(' Can huy tiep (Y/N) ?: ');readln(traloi); until upcase(traloi)='N';

if CoHuy then

begin {chep tu L vao tep} rewrite(TepHoso);

for i:=0 to L.kt

write(TepHoso,L.PhanTu[i]); close(TepHoso);

end else

close(TepHoso); end;

Chơng trình sau đợc bổ xung thêm chức huỷ hồ sơ program QLSV;

uses crt, bgchon; Const maxSize=10; Type HoSo= Record

maso:integer; hoten:String[20]; namsinh:string[2]; end;

DSHoso = record

PhanTu: array[0 maxSize] of HoSo; Kt: word;

End;

Var TepHoso:File of HoSo; L: DSHoso;

sv:HoSo;

tenfile:String[8]; ma:integer;

SoMC: word;

TenMC: Mang_String; Chon: integer;

procedure MoTep;

procedure LietKe;

procedure TimKiem;

Ngày đăng: 28/05/2021, 00:02

Xem thêm:

w