Việc truy xuất một phần tử nào đó của biến mảng đợcthực hiện qua tên biến mảng, theo sau là giá trị chỉ số để trong dấu [ ].. Ví dụ 11 : Viết chơng trình nhập vào từ bàn phím một dãy số
Trang 1ngôn ngữ lập trình pascal (ti ếp theo) Chơng 11 Kiểu tập hợp và kiểu mảng
11.1 Kiểu tập hợp (set type).
11.1.1 Định nghĩa và khai báo : Dữ liệu kiểu tập hợp là một tập hợp củanhững dữ liệu thuộc một kiểu vô hớng đếm đợc
Một kiểu tập hợp đợc định nghĩa bởi dạng sau :
trong đó kiểu_phần_tử là kiểu dữ liệu của các phần tử của tập hợp
Khai báo biến kiểu tập hợp :
Cách 1 : Khai báo qua một tên kiểu đã đợc định nghĩa :
Biến tập hợp cho phép có tối đa 256 phần tử
Nếu kiểu_cơ_sở là kiểu nguyên thì giá trị phải nằm trong đoạn từ 0 đến 255.Chẳng hạn, Với khai báo :
Type Tap_so = Set of 100 256;
Khi dịch máy sẽ thông báo lỗi : Set base type out of range.
Hằng kiểu tập hợp đợc biểu diễn dới dạng liệt kê các phần tử nằm trong hai
dấu ngoặc vuông [ ] Chẳng hạn : ['A','D','E'], [3,5 8] (tập các số nguyên 3,
5, 6, 7, 8) là các hằng kiểu tập hợp.
(Vị trí của các phần tử trong tập hợp không có ý nghĩa : [1,2]=[2,1])
Tập hợp rỗng đợc kí hiệu là []
Có thể thực hiện phép gán trên các biến kiểu tập hợp
Ví dụ 3 : Với các biến đợc khai báo ở ví dụ trên, ta có thể gán :
Trang 2 Phép toán quan hệ :
- Phép toán = (bằng) : Cho giá trị True nếu 2 tập hợp bằng nhau
- Phép toán <> (khác) : Cho giá trị True nếu 2 tập hợp khác nhau.
- Phép toán <= (nhỏ hơn hoặc bằng) : A <= B cho giá trị True nếu A là
tập con của B
- Phép toán >= (lớn hơn hoặc bằng) : A >= B cho giá trị True nếu B là tập
con của A
Chú ý : Không có phép toán < (nhỏ hơn) và > (lớn hơn) Để kiểm tra tập hợp
A có thật sự nằm trong tập hợp B không ta sử dụng phép toán AND nh câu lệnhsau đây :
If (A<>B) and (A<=B) then Write('A là tập con thật sự của B');
Phép toán IN (thuộc về) : Dùng để kiểm tra xem một biến hay một giá trị
có nằm trong tập hợp nào đó không ? Nếu phần tử đó có trong tập hợp thìphép toán sẽ trả về giá trị True, ngợc lại cho giá trị False
Ví dụ 4 :
'C' In ['A','C','D'] True
'E' In ['A','C','D'] False
Phép toán hợp, giao, hiệu : Gọi A, B là 2 dữ liệu cùng kiểu tập hợp.
- A+B là hợp của A và B : Tập hợp các phần tử thuộc A hoặc thuộc B
- A*B là giao của A và B : Tập hợp các phần tử thuộc A và thuộc B
- A-B là hiệu của A và B : Tập hợp các phần tử thuộc A và không thuộc B
Ví dụ 5 : Với A:=[1,3,9]; B:=[9,2,5];
Trang 3If upcase(Ch) in TapNguyenAm then Writeln(Ch,' là nguyên âm ')
Else Writeln(Ch,' là phụ âm ');
Readln;
END.
11.2 Kiểu mảng (array type).
11.2.1 Mảng một chiều :
1 Khái niệm : Mảng (Array) là một kiểu dữ liệu có cấu trúc bao gồm một số
cố định các thành phần có cùng kiểu dữ liệu, có cùng một tên chung Mỗi phần
tử của mảng có một đại lợng xác định vị trí tơng đối của phần tử đó so với cácphần tử khác trong mảng, gọi là chỉ số Chẳng hạn, mảng a gồm 5 phần tử đ ợcphân bố nh sau :
- Họ tên của các nhân viên trong cùng một xí nghiệp
- Điểm thi một môn học của các học sinh trong một lớp
2 Định nghĩa kiểu dữ liệu mảng :
Theo định nghĩa trên ta có hai kiểu mảng :
Kiểu mảng thứ nhất có tên là dayso, gồm 50 phần tử cùng kiểu Byte, ứng với các
chỉ số 0, 1, 2, , 49 Chỉ số đầu (m1 = 0) và chỉ số cuối (m2 = 49) có thể bắt đầu
từ một con số bất kỳ và kết thúc ở một con số bất kỳ, miễn sao cho m2-m1+1=50theo đúng yêu cầu tạo mảng có 50 phần tử Thông thờng, nếu không bắt buộc, ta
chọn chỉ số đầu (m1) bằng 0 hoặc 1.
Kiểu mảng thứ hai có tên là HT, gồm 50 phần tử cùng kiểu dữ liệu là String[20],ứng với các chỉ số từ 1 đến 50
3 Khai báo biến kiểu mảng : Có hai cách khai báo :
Cách 1 : Khai báo qua một kiểu mảng đã đợc định nghĩa
Ví dụ 8 : Với hai kiểu mảng đã đợc định nghĩa ở ví dụ 7, có thể khai báo :
Var a : dayso;
Trang 44 Khai báo mảng có gán giá trị ban đầu : Turbo Pascal cho phép vừa khai
báo mảng, vừa gán giá trị ban đầu cho các phần tử mảng, chẳng hạn nh dới
đây :
Const x : Array[1 5] Of Integer = (5,7,12,14,6);
Khi đó x là một mảng gồm 5 phần tử cùng kiểu nguyên và có giá trị x[1]=5,
5 Truy xuất một phần tử mảng : Các xử lý trên mảng đợc quy về xử lý từng
phần tử của mảng Việc truy xuất một phần tử nào đó của biến mảng đợcthực hiện qua tên biến mảng, theo sau là giá trị chỉ số để trong dấu [ ]
a[1] := 1; {gán giá trị cho phần tử đầu tiên của mảng bằng 1}
b := a[25]; {gán giá trị b bằng giá trị phần tử cuối cùng của mảng}
Ghi chú :
Chỉ số của một phần tử mảng có thể là một biến, một hằng hay một biểu thức
Có thể gán một biến mảng này cho một biến mảng khác cùng kiểu Chẳnghạn, với khai báo :
Var x, y : Array[1 15] Of Real;
Khi đó, lệnh :
x := y;
tơng đơng với lệnh :
For i:=1 to 15 do x[i] := y[i];
6 Nhập - xuất dữ liệu với mảng : Dùng câu lệnh FOR.
Các thủ tục nhập - xuất biến nh Writeln, Readln, không thể truy xuấtthẳng biến mảng mà phải thông qua từng thành phần của của nó
Ví dụ 11 : Viết chơng trình nhập vào từ bàn phím một dãy số nguyên MI và
xuất ra màn hình:
Các phần tử của dãy MI theo thứ tự ngợc
Trang 5 Các số đối của các phần tử của dãy MI
Writeln( 'In dãy theo thứ tự ngợc :');
For i := n downto 1 do write(MI[i],#32);
Writeln;
Writeln( 'In các số đối của dãy :');
For i:=1 to n do write(-MI[i],#32);
Readln;
End.
7 Các bài toán cơ bản về mảng :
Bài toán 1 : Tìm phần tử nhỏ nhất của mảng.
Ví dụ 12 : Viết chơng trình nhập vào 10 phần tử của mảng a các số nguyên.
Trang 6{tìm số nhỏ nhất}
min := a[1];
For i := 2 to N do
if a[i] < min then min := a[i];
Writeln( 'Phần tử nhỏ nhất là : ',min);
Readln;
End.
Ta có giải thuật tơng tự đối với bài toán tìm phần tử lớn nhất của mảng
Bài toán 2 : Sắp xếp các phần tử trong mảng theo thứ tự tăng dần.
Giải thuật BUBBLE SORT (còn có tên là phơng pháp sắp xếp nổi bọt) : Ta
coi các số cần sắp là trọng lợng của các bọt khí trong nớc Bọt khí nào nhẹ sẽnổi lên trớc, những bọt nào nặng sẽ nổi lên sau nhng không thể nổi lên cao quábọt khí nhẹ hơn nó Một cách hình ảnh ta có ví dụ minh hoạ sau :
Var a : Array[1 N] Of Integer;
i, j ,Tam : Integer; { Tam là biến trung gian }
Trang 7Tam := a[j-1];
a[j-1] := a[j];
a[j] := Tam;
End;
(* In ra kết quả *)
Writeln( 'Dãy sau khi đã sắp xếp : ');
For i:=1 to N do Write(a[i]:6);
Readln;
End.
Giải thuật sắp xếp trên có thể viết theo vòng lặp REPEAT nh sau:
i := 2;
Repeat
doi := false;
For j := N downto i do
if a[j-1] > a[j] then
Begin
Doi :=true; { doi là biến Boolean }
Tam := a[j-1];
a[j-1] := a[j];
a[j] := Tam;
End;
i:=i+1;
Until Not Doi;
Kết quả chạy chơng trình hiện ra trên màn hình :
PP BUBBLE SORT SAP XEP MANG THANH DAY TANG DAN
-
a[1] = 44
a[2] = 55
a[3] = 12
a[4] = 42
a[5] = 94
a[6] = 18
a[7] = 6
a[8] = 67
Dãy sau khi đã sắp xếp :
6 12 18 42 44 55 67 94
Ta có giải thuật tơng tự cho việc sắp xếp mảng theo thứ tự giảm dần
Bài toán 3 : Tìm kiếm một phần tử bất kỳ trong mảng đã đợc sắp có thứ tự.
Giải thuật Binary Search (Tìm kiếm nhị phân) :
Giả sử ta có mảng đã sắp xếp theo thứ tự tăng dần, cần tìm phần tử x có
trong mảng không ?
Giải thuật đợc thực hiện nh sau :
Bớc 1: Phạm vi tìm kiếm là trong toàn bộ mảng.
Trang 8Bớc 2: Lấy phần tử giữa của phạm vi cần tìm kiếm (gọi là y) và so sánh với x.
Nếu x = y thì giải thuật kết thúc và thông báo đã tìm thấy.
Nếu x < y thì phạm vi tìm kiếm mới là các phần tử nằm trớc y.
Nếu x > y thì phạm vi tìm kiếm mới là các phần tử nằm sau y.
Bớc 3: Nếu tồn tại phạm vi tìm kiếm thì lặp lại bớc 2, ngợc lại thông báo không
tìm thấy, giải thuật kết thúc không thành công
Sau đây là ví dụ minh hoạ ý tởng của giải thuật :
If Timco then Write('Da tim co phan tu thu ',j,' bang ',x)
Else Write('Khong co phan tu nao trong day bang ',x);
End.
Trang 911.2.2 Mảng hai chiều (ma trận) :
1 Định nghĩa mảng hai chiều : Mảng hai chiều, còn gọi là ma trận, là sự mở
rộng trực tiếp của mảng một chiều Một kiểu mảng hai chiều đợc định nghĩabởi dạng sau :
Type mang1 = Array[1 2, 0 2] Of Integer;
mang2 = Array[’a’ ’c’,1 3] Of String[10];
2 Khai báo mảng hai chiều :
Cách 1 : Khai báo thông qua một kiểu mảng hai chiều đã đợc định nghĩa :
Ví dụ 14 : Với hai kiểu mảng đã đợc định nghĩa ở ví dụ 13, có thể khai báo :
Var X : mang1;
Y : mang2;
Kết quả ta nhận đợc hai mảng hai chiều :
- Mảng X gồm 6 phần tử cùng kiểu dữ liệu nguyên :
X[1,0], X[1,1], X[1,2]
X[2,0], X[2,1], X[2,2]
- Mảng Y gồm 9 phần tử cùng kiểu chuỗi String[10] :
Y[‘a’,1], Y[‘a’,2], Y[‘a’,3]
Y[‘b’,1], Y[‘b’,2], Y[‘b’,3]
Y[‘c’,1], Y[‘c’,2], Y[‘c’,3]
Cách 2 : Khai báo trực tiếp :
Ví dụ 15 :Hai mảng X và Y ở ví dụ 14 có thể đợc khai báo trực tiếp nh sau :Var X : Array[1 2,0 2] Of Integer;
Y : Array[’a’ ’c’,1 3] Of String[10];
3 Các thao tác trên mảng hai chiều :
Để xác định một phần tử trong mảng hai chiều, ta viết :
tên_biến_mảng[chỉ_số_1, chỉ_số_2]
Ví dụ 16 : Với hai mảng X, Y ở ví dụ 14, ta có thể dùng các lệnh gán sau :
X[1,0] := 5;
X[2,1] := X[1,1] - 20;
Trang 10Y[’a’,1] :=’TOAN’;
§Ó nhËp d÷ liÖu cho mét m¶ng hai chiÒu, ta ph¶i dïng hai vßng lÆp duyÖttheo hai chØ sè, ch¼ng h¹n muèn nhËp d÷ liÖu cho m¶ng X ë vÝ dô 1, ta viÕt :For i:=1 to 2 do
For i:=1 to 3 do (* Vßng lÆp cho tõng hµng (chiÒu thø 1) *)
For j:=1 to 4 do (* Vßng lÆp cho tõng cét (chiÒu thø 2) *)
Trang 11End;
Writeln( 'Tổng tất cả các số trong bảng là: ', tong);
End.
Bài tập[11.1] Viết chơng trình nhập N số nguyên trong phạm vi từ 0 đến 255 từ bàn
phím In ra màn hình tập các số chẵn, tập các số lẻ và cho biết có bao nhiêu số
chẵn, bao nhiêu số lẻ (các số trùng nhau chỉ kể một lần)
Ví dụ : Nhập : 2, 3, 5, 2, 4, 8
Xuất : Các số chẵn là : 2, 4, 8 Có 3 số chẵn
Các số lẻ là : 3, 5 Có 2 số lẻ
[11.2] Viết chơng trình nhập vào một dãy số và xuất ra màn hình các thông tin sau:
1 Phần tử lớn nhất của dãy
2 Phần tử nhỏ nhất của dãy
3 Tổng các phần tử của dãy
[11.3] Viết trong cùng một chơng trình thực hiện các yêu cầu sau:
1 Nhập vào từ bàn phím một dãy số nguyên MI có 10 phần tử và một sốnguyên x thoả tính chất: kí số tận cùng của x bằng 6 và -180 < x 1200
2 Xuất ra màn hình số phần tử trong dãy MI thoả tính chất: Có 2 chữ số vàchia đúng cho x
3 Tính tích của các phần tử MI[i] thoả tính chất: -10 < MI[i] < 20
[11.4] Viết chơng trình đổi một số nguyên dơng từ hệ cơ số 10 sang hệ cơ số 2
[11.5] Viết chơng trình xuất ra màn hình bảng sau (tam giác PASCAL), biết số
Mời hai chi :
Thân Dậu Tuất Hợi Tý Sửu Dần Mão Thìn Tỵ Ngọ Mùi
+ Công thức :
CAN năm = số d của Năm chia cho 10
CHI năm = số d của Năm chia cho 12
Ví dụ: Năm 1497
CAN năm = 1497 MOD 10 = 7 Đinh
CHI năm = 1497 MOD 12 = 9 Tỵ
Trang 12Vậy năm 1497 là năm Đinh Tỵ.
[11.7] Viết chơng trình nhập một danh sách N ( 100) học sinh gồm họ tên và
điểm thi hai môn Toán, Văn Tính điểm trung bình (dtb) và xếp loại các họcsinh nh sau : loại “giỏi” nếu dtb 9, loại “khá” nếu 7 dtb < 9, loại “trungbình” nếu 5 dtb <7, và loại “kém” nếu dtb < 5
In danh sách lên màn hình, mỗi học sinh trên một dòng, gồm : họ tên, dtb,kết quả xếp loại, và in số học sinh có điểm trung bình 10 Yêu cầu danh sách đ-
ợc sắp theo thứ tự giảm của dtb
[11.8] Viết chơng trình nhập vào từ bàn phím một dãy 10 số nguyên và một số
nguyên X Dò tìm xem trong dãy có hai phần tử liên tiếp nào mà tổng củachúng bằng X không ?
[11.9] Viết chơng trình nhập vào từ bàn phím một dãy số nguyên Xuất ra màn
hình tần suất (số lần xuất hiện) của các số trong dãy số đó.
Trang 13Chơng 12 Chơng trình con
12.1 Khái niệm về chơng trình con (subprogram).
Chơng trình con là một đoạn chơng trình có tên và có chức năng giải quyếtmột vấn đề chuyên biệt mà chơng trình chính cần sử dụng nhiều lần, hoặc thựchiện một số lần ứng với các giá trị khác nhau của tham số Chẳng hạn, viết ch-
n
C m n
Thay vì trong chơng trình phải viết ba đoạn chơng trình tính giai thừa : n!,m! và (n-m)!, ta chỉ cần viết một đoạn chơng trình con tính k! tổng quát và đặttên là GiaiThua(k) Sau đó, mỗi lần muốn tính giai thừa, ta chỉ gọi lại đoạn ch-
ơng trình này và đặt giá trị k cho thích hợp Lúc này, để tính tổ hợp trên ta chỉcần dùng một lệnh :
C := GiaiThua(n)/(GiaiThua(m)*(GiaiThua(n-m)).
Việc sử dụng chơng trình con không chỉ có tác dụng làm cho chơng trình bớtrờm rà, dài dòng mà còn đặc biệt có ý nghĩa trong việc tổ chức chơng trình.Chẳng hạn, khi phải giải quyết các bài toán lớn, ta có thể chia nó ra nhiều bàitoán nhỏ Mỗi bài toán nhỏ đợc giải quyết riêng rẽ bằng một chơng trình con
(sub-routine hay sub-program) Các lập trình viên có thể làm việc độc lập với
nhau trên các chơng trình con, ngời quản lý chung chỉ cần tập hợp và sử dụngcác chơng trình con để phát triển chơng trình chính Phơng pháp này cho phépnhìn nhận và giải quyết vấn đề một cách tổng quát, không bị sa vào các chi tiếtnhỏ Đây là t tởng cơ bản của lập trình có cấu trúc : thiết kế từ tổng quát tới chi
tiết (Top - Down design method).
Trong TURBO PASCAL có hai loại chơng trình con là hàm và thủ tục
12.2 Hàm : Khái niệm hàm cũng gần giống khái niệm hàm của toán học,nghĩa là, hàm nhận vào các giá trị đầu vào và cho ra một giá trị đầu ra duy nhất.Giá trị đầu vào của hàm gọi là tham số của hàm
12.2.1 Dạng tổng quát của khai báo hàm :
FUNCTION Tên_hàm(tham_số_hình_thức) : kiểu_kết_quả;
{Khai báo của riêng hàm, biến ở đây gọi là biến cục bộ (hay địa phơng)}
Trang 14Cách 2 : Var danh_sách_biến : kiểu_dữ_liệu Các biến trong danh_sách_biến này gọi là tham biến.
Chú ý :
Phải xác định kiểu_kết_quả cho tên_hàm.
Sau khi đã tính đợc kết quả của hàm, ta cần phải “xuất” giá trị này cho
ch-ơng trình gọi, tức là phải có lệnh gán giá trị cho tên_hàm thông qua câulệnh gán giá trị : tên_hàm := Biểu_thức;
Ví dụ 1:
- Sau đây là khai báo tiêu đề để tính hàm k!, nhận vào k là một số nguyên
d-ơng và trả kết quả cũng là số nguyên
Function GiaiThua(k : Byte) : LongInt;
- Sau đây là khai báo tiêu đề hàm tính a n, nhận vào a là một số thực, n là sốnguyên và trả ra kết quả là số thực
Function LuyThua(a : Real, n : Byte) : Real;
Ví dụ 2: Chơng trình con sau có dạng hàm dùng để tính hàm tang.
Functiontg(x:Real) : Real;
Trang 1512.3.1 Dạng tổng quát của khai báo thủ tục
Tên_thủ_tục là một tên để ký hiệu thủ tục
Tham_số_hình_thức là một dãy các tên biến cùng với mô tả kiểu của nó.Trong tham_số_hình_thức các biến đợc khai báo kiểu dữ liệu của nó bằnghai cách nh đối với chơng trình con FUNCTION, tham_số_hình_thức có thểkhông có
Chú ý : Trớc khi thoát khỏi thủ tục, không cần gán giá trị cho Tên_thủ_tục.
Ví dụ 5 : Chơng trình con Max sau đây thực hiện việc tìm số lớn nhất trong hai
Trang 16thực_sự tơng ứng phải là tên biến Nếu tham_số_hình_thức là tham trị thìtham_số_thực_sự tơng ứng có thể là biểu thức.
Kết quả của lời gọi thủ tục là giá trị nhận đợc ở các tham biến
Ví dụ 6 : Với chơng trình con Max ở ví dụ 5 và a, b là hai biến có giá trị đã đợc
xác định trớc đó Khi đó, lời gọi sau :
Max(a*a-3,b+2,c);
cho kết quả là giá trị lớn nhất giữa hai giá trị a*a-3 và b+2, kết quả đợc lu trongtên biến c
12.4 Ghi chú.
1 Các tham số có mặt trong tham_số_hình_thức> và tham_số_thực_sự phải
t-ơng ứng với nhau về số lợng tham số và kiểu dữ liệu
2 Các biến trong chơng trình có sử dụng chơng trình con đợc chia thành 2 loại:
Biến toàn cục : Đợc khai báo ở ngoài chơng trình con trong phần khai báo của
chơng trình chính; đợc hiểu và sử dụng mọi nơi trong chơng trình
Biến cục bộ : Đợc khai báo bên trong Ctrình con; chỉ đợc hiểu và sử dụng bêntrong Ctrình con đó
3 Trong trờng hợp, có một biến toàn cục và một biến cục bộ có cùng tên thì :
Nếu sử dụng tên biến đó trong thân chơng trình con thì biến đó đợc hiểu làbiến cục bộ
Nếu sử dụng tên biến đó trong chơng trình chính thì đơng nhiên sẽ hiểu là tênbiến toàn cục, vì chơng trình chính không hiểu các biến cục bộ
4 Phân biệt giữa tham trị và tham biến :
Tham biến (variable parameter)
- Có từ khoá VAR đi trớc
- Tham số thực tơng ứng phải là một biến cùng kiểu, không thể là một hằnghoặc biểu thức
- Mọi thay đổi về mặt giá trị của các tham số dạng tham biến trong chơng trình con đều làm thay đổi giá trị của biến thực tơng ứng của chơng trình gọi nó.
Tham số trị (value parameter)
- Không có từ khoá VAR đi trớc
- Tham số thực tơng ứng có thể là một biến, hằng hoặc biểu thức
- Mọi thay đổi về mặt giá trị của các tham số dạng tham trị trong chơng trình con đều không làm thay đổi giá trị của biến thực tơng ứng của chơng trình gọi
nó
Ví dụ 7 : Hai chơng trình dới đây sẽ chỉ rõ sự khác nhau giữa tham biến và
tham trị trong các chơng trình con
Chơng trình 1.
Program Tham_tri;
Var a,b,c : Integer;
Procedure InTri(x,y,z : Integer);
Begin
x:=x*2; y:=y*2; z:=z*2;
Writeln(' Trong thủ tục ta có 3 số : ',x, #32, y, #32, z);
End;
Trang 17Var a,b,c: Integer;
Procedure InTri(Var x,y,z : Integer);
1 Đối với các chơng trình con có tính
chất giống hàm toán học và trả về
một giá trị duy nhất thuộc kiểu kiểu
vô hớng (nguyên, thực, logic, char)
hoặc kiểu con trỏ
2 Đối với các chơng trình con mà lời
gọi nó cần xuất hiện trong biểu thức
Chẳng hạn các hàm toán học : giai
thừa, tổ hợp, chỉnh hợp
1 Đối với chơng trình con có tính chấttính toán nhng trả về cùng lúc nhiềugiá trị (nh thủ tục giải phơng trình bậchai )
2 Đối với các chơng trình con thực hiệnmột hành động nào đó, không trả lạigiá trị nào
Ví dụ 8 : Nhập vào từ bàn phím một dãy các số nguyên rồi xuất ra màn hình
phần tử lớn nhất của dãy
(Yêu cầu dùng hai chơng trình con : một chơng trình con nhập dãy và một
ch-ơng trình con tìm phần tử lớn nhất trong dãy).
Program Vidu_8;
Uses Crt;
Type Day = array[1 20] of Integer;
Var N : Integer;
Trang 18Function MAX(x : Day; N : Integer) : Integer;
Var i, z : Integer; {z : phan tu lon nhat}
CLRSCR : Xoá toàn bộ màn hình và đa cursor về vị trí (1,1) trên màn hình
CLREOL : Xoá từ cursor đến cuối dòng hiện hành
INSLINE : Chèn dòng trống vào vị trí hiện hành của cursor trên màn hình
DELLINE : Xoá dòng cursor đang đứng, các dòng sau sẽ đợc chuyển lêntrên một dòng
TEXTMODE(Mode:Integer) : Chọn chế độ trình bày văn bản Tham sốMode sẽ lấy giá trị :
- BW40 = 0; {40x25 B/W trên Color Adapter}
- CO40 = 1; {40x25 Color trên Color Adapter}
- BW80 = 2; {80x25 B/W trên Color Adaptor}
- CO80 = 3; {80x25 Color trên Color Adapter}
- Mono = 7; {80x25 trên Monochrome Adaptor} Font8x8 = 256; EGA vàVGA43, 50 line mode
Trang 19- LastMode=-1; {Khi khai TextMode(LastMode) Chơng trình tự động text xemmode màn hình trớc đó là gì và lấy mode đó khai cho Chơng trình Điều này
đặc biệt thuận lợi khi ta muốn Chơng trình chạy đợc trên nhiều loại máy khácnhau}
GOTOXY(x,y : Byte) : Đa cursor đến toạ độ (x,y) : dòng y, cột x
HIGHVIDEO : Cho phép hiển thị trên màn hình với độ chói cao
LOWVIDEO : Cho phép hiển thị trên màn hình với độ chói thấp
NORMVIDEO : Khôi phục thuộc tính màn hình mặc định theo các thuộctính đã hiện hữu ở vị trí cursor khi thực hiện chơng trình
SOUND(Hz : Word) : Phát âm thanh có tần số Hz cho đến khi gặp thủ tụcNosound
NOSOUND : Tắt loa phát âm thanh ở máy
DELAY(ms:Word) : Tạm treo chơng trình trong thời gian ms mili giây
TEXTCOLOR(Color : Byte) : Chọn màu của kí tự trình bày trên màn hình.Color có giá trị từ 0 255
TEXTBACKGROUND(Color:Byte) : Chọn màu nền trong chế độ văn bản
Các hằng xác định màu nền và chữ :
Black = 0 Brown = 6 LightRed = 12
Blue = 1 LightGray = 7 LightMagenta = 13
Green = 2 DarkGray = 8 Yellow = 14
Cyan = 3 LightBlue = 9 White = 15
Red = 4 LightGreen = 10
Magenta = 5 LightCyan = 11
Hằng xác định nhấp nháy: Blink = 128
Chẳng hạn, TextColor(15) hay TextColor(White) là chọn chữ màu trắng
Ví dụ 10 :
Program Vidu_10;
Trang 20nhất (kết quả đều nh nhau) Để sử dụng đợc các phím này trong lập trình ta sử
WHEREX : Cho giá trị kiểu byte cho biết cursor đang ở cột nào
WHEREY : Cho giá trị kiểu byte cho biết cursor đang ở dòng nào
Ví dụ 12 :
Program Vidu_12;
Uses Crt;
Trang 21Var X,Y : Integer; Ch : Char;
Function Luythua(a : Integer; n : Byte):Integer;
Var Tempo : real;
Write('X = '); Readln(X); Write('Y = '); Readln(Y);
Write('Chon phep tinh ( + - * / ^): ');
Readln(Ch);
Case Ch of
'+': Write('Ket qua: X',Ch,'Y = ',Cong(X,Y));
'-': Write('Ket qua: X',Ch,'Y = ',Tru(X,Y));
'*': Write('Ket qua: X',Ch,'Y = ',Nhan(X,Y));
'/': Write('Ket qua: X',Ch,'Y = ',Chia(X,Y):1:2);
'^': Write('Ket qua: X',Ch,'Y = ',Luythua(X,Y));
Trang 22Trong Pascal chuẩn cũng nh Turbo Pascal đều cho phép gọi đệ qui trongcác chơng trình con thủ tục và hàm Một thủ tục hay hàm là đệ qui nếu trong nóchứa lời gọi đến chính nó Để thấy rõ điều này, ta xét ví dụ sau :
Ví dụ 13 : Viết chơng trình nhập N từ bàn phím, tính và in ra giá trị N! Trong
chơng trình có xây dựng và sử dụng một hàm đệ qui tính k!
1 (
0 1
!
k khi k
k khi k
Muốn tính k! ta phải tính (k-1)!, muốn tính (k-1)! lại phải tính (k-2)!, ,suy ra cuối cùng phải tính đợc 0!, nhng vì 0!=1 nên quá trình kết thúc
1! + 2! + 3! + + n! với n<=12 đợc nhập từ bàn phím
[12.2] Viết chơng trình có các chức năng sau :
a Tìm ớc số chung lớn nhất của 2 số nguyên
b Tìm bội số chung nhỏ nhất của 2 số nguyên
c Tìm số bé nhất trong 3 số
[12.3] Viết chơng trình vẽ một đờng thẳng đứng (bằng kí tự *) có chiều dài 5
tại cột 4 và cho di chuyển đến cột 20
Trang 23[12.5] Viết chơng trình nhập vào một mảng, xác định phần tử nhỏ nhất, lớn
nhất và trung bình cộng của mảng Hãy sử dụng 4 chơng trình con sau : NHAP(đọc vào các phần tử của mảng), MAX (tìm giá trị lớn nhất của mảng), MIN(tìm giá trị nhỏ nhất của mảng) và TRUNGBINH (Tìm giá trị trung bình cộngcủa mảng)
[12.6] Tàu NT1 cứ k ngày cập cảng 1 lần, tàu NT2 cứ m ngày cập cảng 1 lần (k
m) Viết chơng trình nhập k và m từ bàn phím rồi tính xem nếu 2 tàu cùngrời cảng thì sau thời gian ngắn nhất là bao nhiêu ngày chúng cùng cập cảng.Biết rằng ngày rời cảng luôn luôn cùng với ngày cập cảng
[12.7] Có N quả bóng màu vàng, bạc và đỏ đợc xếp trong một dãy các hộc, mỗi
hộc 1 quả Ta biểu diễn các hộc bằng 1 bảng 1 chiều có N phần tử, mỗi phần tửchứa 1 chữ cái 'V', 'B', hay 'D' Hãy viết chơng trình để sắp xếp các quả bóngsao cho các quả bóng vàng nằm trong các hộc đầu bảng, các quả bóng đỏ dồn
về các hộc cuối, còn các quả bóng bạc ở giữa
VD: Trạng thái ban đầu là: D V B D V B B D B V B
[12.9] Viết thủ tục : Procedure Find_large(a, n, large) để tìm số lớn nhất
trong dãy a gồm n phần tử và large là số lớn nhất
[12.10] Viết hàm : Nguyen_to(m) để kiểm tra xem m có phải số nguyên tố hay
không
[12.11] Viết thủ tục : Procedure List_Nguyen_to(n) để tìm và in ra các số
nguyên tố nhỏ hơn số nguyên dơng n
[12.12] Viết chơng trình đố vui để học trong đó có 2 đội tham gia, chơng trình
có 5 câu hỏi, mỗi câu hỏi có 3 câu trả lời sẵn trong đó chỉ có một câu trả lời
đúng Sau mỗi câu trả lời đều có thông báo số điểm cho từng đội
Trang 24Chơng 12 Kiểu chuỗi ký tự (String)
12.1 định nghĩa và khai báo kiểu chuỗi.
Chuỗi ký tự là một dãy các ký tự trong bảng mã ASCII
Định nghĩa kiểu chuỗi :
Khai báo biến kiểu chuỗi :
VAR tên_biến : tên_kiểu_chuỗi;
Var St : Str20; {St có thể chứa tối đa 20 ký tự}
Holot : String[17]; {Holot có thể chứa tối đa 17 ký tự}
Ten : String[7]; {Ten có thể chứa tối đa 17 ký tự}
Chú ý :
Cần phân biệt độ_dài với độ_dài_cực_đại của biến chuỗi : độ_dài_cực_đại
đợc xác định ngay khi khai báo là khả năng có thể chứa của biến chuỗi, còn
độ_dài của chuỗi là số ký tự đạng thực có trong chuỗi Chẳng hạn, với biếnHolot ở ví dụ 2, nếu gán :
Holot := ‘HO VAN’;
thì biến Holot có độ_dài là 6 ký tự, mặc dù khả năng nó có thể chứa tới 17 ký tự
Trong bộ nhớ của máy, một biến chuỗi sẽ chiếm một số byte bằng độ_dài_cực_đại của
nó cộng thêm 1 Byte đầu tiên, gọi là byte 0, chứa một ký tự có mã bằng độ dài thực của chuỗi; mỗi byte còn lại chứa một ký tự Cấu trúc của biến Holot nói trên có dạng :
- Ký hiệu * biểu diễn ký tự không xác định
- Ký tự đầu của chuỗi (Hoten[0]) là ký tự Chr(6)
Từ đó độ dài của chuỗi ký tự St có thể tìm bằng công thức sau :
Độ dài = Ord(St[0])Tuy nhiên, trong Turbo Pascal có sẵn hàm Length(St) cho ngay độ dài thựccủa chuỗi St mà không cần dùng đến byte 0, chẳng hạn, với biến Holot trên
Trang 25 Readln(St) sẽ đọc các ký tự cho chuỗi St với độ dài thực sự là số ký tự gõvào từ bàn phím Nếu ta gõ <Enter> luôn, không cho ký tự nào thì St = ''
(chuỗi rỗng).
12.2 Truy nhập vào từng phần tử của chuỗi.
Giống nh mảng, mỗi phần tử của chuỗi đợc truy nhập thông qua tên chuỗi
For i:=1 to length(St) do write(St[i]);
Điều này cho thấy chuỗi là một kiểu dữ liệu có tính cấu trúc Nh ng mặtkhác, mỗi chuỗi lại có thể xem là một giá trị duy nhất, vì có thể nhập và in trựctiếp chuỗi St bằng các lệnh :
Ví dụ 5 :
‘Long’ > ‘Lan’ True, vì ‘o’ > ‘a’
‘ABC’ > ‘AD’ False, vì ‘B’ < ‘D’
* Nếu so sánh hết chiều dài của chuỗi ngắn hơn mà không có cặp nào khácnhau thì chuỗi ngắn hơn sẽ nhỏ hơn
Ví dụ 6 :
‘Ho’ < Hoa’ True