Đề bài: Đếm số âm,dương trong tệp N phần tử
Hướng Dẫn Download & Cài Đặt Hate Pascal If You Can
Link download : https://goo.gl/U2Wxnu Home: http://hatepascalifucan.byethost3.com/
Thứ Sáu, 28 tháng 4, 2017
Tính tổng các ước
Cho dãy số nguyên dương A gồm N phần từ (N<51) hãy tính tổng các ước các phần tử trong dãy A(trừ 1 và chính nó)
Thứ Tư, 26 tháng 4, 2017
Viết chương trình giải phương trình bậc 2 (ax2 + bx + c =0)
Đề bài: Viết chương trình giải phương trình bậc 2 (ax2 +
bx + c =0)
Nhập vào 2 cạnh của một hình chữ nhật. In ra màn hình diện tích và chu vi của nó
Đề bài: Nhập vào 2 cạnh của một hình chữ nhật. In
ra màn hình diện tích và chu vi của nó.
Thứ Bảy, 22 tháng 4, 2017
Giáo trình lập trình Pascal cơ bản
Tài liệu này giúp các bạn nắm vững những kiến thức nền tảng nhất của Pascal
Thứ Năm, 20 tháng 4, 2017
Tìm số nguyên tố trong mảng sử dụng chương trình con
Đề bài: Tìm số nguyên tố trong mảng sử dụng chương trình con
[Series nâng cao] Khái niệm đệ quy
1, Khái niệm
Chương trình con đệ quy là chương trình con mà trong thân chương trình con có lời gọi chinh chương trình con đó.
Thứ Ba, 18 tháng 4, 2017
Tính tổng
Đề bàI: cho dãy A với n số nguyên. viết chương trình tính tổng các phần tử có giá trị chẵn tại vị trí lẻ trong dãy?
Mã hóa xâu
Đề bài:Tập hợp các chữ cái tiếng Anh bao gồm 26 chữ cái được đánh
số thứ tự lần lượt từ 0 đến 25. Quy tắc mã hóa một kí tự như sau:
1. Tìm số thứ tự tương ứng của kí tự
2. Tăng giá trị số này lên 5
3.Tìm số dư trong phép chia số này cho 26
4. Tra ngược bảng chữ cái thu được kí tự tương ứng
Hãy viết chương trình nhập vào một xâu và sử dụng quy tắc mã hóa trên để mã hóa
xâu kí tự đó.
1. Tìm số thứ tự tương ứng của kí tự
2. Tăng giá trị số này lên 5
3.Tìm số dư trong phép chia số này cho 26
4. Tra ngược bảng chữ cái thu được kí tự tương ứng
Hãy viết chương trình nhập vào một xâu và sử dụng quy tắc mã hóa trên để mã hóa xâu kí tự đó.
Thứ Hai, 17 tháng 4, 2017
Tính Tổng Từ Xâu
Đề bài: Trên màn hình hiện ra các số của 1 dãy số N số nguyên hãy tính tổng của k số nguyên liên tiếp xuất hiện trên màn hình. Bắt đầu từ số nguyên thứ b. Dữ liệu vào chứa trong tệp văn bản sum.inp. Dòng đầu ghi k số nguyên
Chủ Nhật, 16 tháng 4, 2017
Thứ Sáu, 14 tháng 4, 2017
Tìm Max
Đề bài:
Tệp dl.txt gồm nhiều dòng, mỗi dòng chứa ba số nguyên.Hãy đọc giá trị từ tệp và tìm gtrị lớn nhất ứng với mỗi dòng.Kết quả ghi vào tệp kq.txt
Tệp dl.txt gồm nhiều dòng, mỗi dòng chứa ba số nguyên.Hãy đọc giá trị từ tệp và tìm gtrị lớn nhất ứng với mỗi dòng.Kết quả ghi vào tệp kq.txt
Tìm Min
Đề bài: Tệp dl.txt gồm nhiều dòng, mỗi dòng chứa ba số nguyên dương.Hãy đọc dữ liệu từ tệp và tìm giá trị nhỏ nhất.Ứng với mỗi dòng kết quả .ghi Vào tệp kq.txt
Thứ Ba, 11 tháng 4, 2017
Đề bài: Nhập ngày tháng năm. Hãy cho biết ngày tháng năm sau đó N ngày
Đề bài: Nhập ngày tháng năm. Hãy cho
biết ngày tháng năm sau đó N ngày.
Thứ Hai, 10 tháng 4, 2017
Chủ Nhật, 9 tháng 4, 2017
Thứ Năm, 6 tháng 4, 2017
Dãy hạnh phúc
Dãy số tự nhiên a1 , a2 ,a3... ak được gọi
là hạnh phúc nếu nó thoả mãn các điều kiện sau :
- Dãy trên là một dãy giảm dần .
- Với mọi i ( 1<=i <= k ) ai hoặc là số nguyên tố , hoặc phải là ước của một trong các số a1 , a2 , ... , ai
VD : 18 17 13 11 9 7 6 5 3 2 là dãy hạnh phúc
Viết chương trình nhập 1 số tự nhiên N từ bàn phím và in ra màn hình một dãy số hạnh phúc càng dài càng tốt với số hạng đầu tiên là N.
- Dãy trên là một dãy giảm dần .
- Với mọi i ( 1<=i <= k ) ai hoặc là số nguyên tố , hoặc phải là ước của một trong các số a1 , a2 , ... , ai
VD : 18 17 13 11 9 7 6 5 3 2 là dãy hạnh phúc
Viết chương trình nhập 1 số tự nhiên N từ bàn phím và in ra màn hình một dãy số hạnh phúc càng dài càng tốt với số hạng đầu tiên là N.
Số hoàn thiện
Một
số có tổng các ước nhỏ hơn nó bằng chính nó được gọi là số hoàn chỉnh.VD 6 có
ước nhỏ hơn nó là 1,2,3. Tổng là 1+2+3=6.Viết chương trình xét xem một số n
được nhập từ bàn phím có phải là số hoàn chỉnh không.
Dãy Tribonacci
Dãy Tribonacci là dãy 1 , 1 , 2 , 3 , 7 , 13 ,
24... dãy này được sinh ra bới công thức đệ qui sau :
Tr(1) = 1 , Tr(2) = 1 , Tr(3) = 2 , Tr(k) = Tr(k-1)+Tr(k-2)+Tr(k-3) ... với 3< k <37
Mọi số tự nhiên N đều có thể biểu diễn duy nhất dưới dạng tổng của một số số trong dãy Tribonacci.
VD: 17 = 13 + 4; 30 = 24 + 4 + 2;
Cho trước số tự nhiên N nhập từ bàn phím. Viết chương trình tìm biểu diễn Tribonacci của số N.
Ý tưởng: Xây dựng 1 mảng số Tribonacci từ 1 tới 37 (đến 37 vì theo đề bài ...), rồi duyệt từng phần tử của dãy Tribonacci, nếu n> Tribonacci[i] thì in ra Tribonacci[i] và giảm n tới khi n<0 thì thôi.
Tr(1) = 1 , Tr(2) = 1 , Tr(3) = 2 , Tr(k) = Tr(k-1)+Tr(k-2)+Tr(k-3) ... với 3< k <37
Mọi số tự nhiên N đều có thể biểu diễn duy nhất dưới dạng tổng của một số số trong dãy Tribonacci.
VD: 17 = 13 + 4; 30 = 24 + 4 + 2;
Cho trước số tự nhiên N nhập từ bàn phím. Viết chương trình tìm biểu diễn Tribonacci của số N.
Ý tưởng: Xây dựng 1 mảng số Tribonacci từ 1 tới 37 (đến 37 vì theo đề bài ...), rồi duyệt từng phần tử của dãy Tribonacci, nếu n> Tribonacci[i] thì in ra Tribonacci[i] và giảm n tới khi n<0 thì thôi.
Thứ Ba, 4 tháng 4, 2017
Xâu thuần nhất (Giải nén xâu trong pascal)
Xâu kí tự thuần nhất được định nghĩa là xâu chỉ
bao gồm các chữ cái tiếng anh. Một xâu thuần nhất có thể được viết thu gọn, bao
gồm các số thứ tự kèm theo tần số xuất hiện liên tiếp của nhóm đó!
VD: AACCBBB<-->A2B2C3
XCAABAABAABCCADADCADCAABAABCCADADY<-->X(C(A2B)3C2(AD)2)2Y
(AB)2(QXA)3<-->ABABQXAQXAQXA
Hãy viết chương trình thu gọn và giải mã (hay nén và giải nén) xâu.
Thuật toán dưới đây là quá trình nén xâu.
VD: AACCBBB<-->A2B2C3
XCAABAABAABCCADADCADCAABAABCCADADY<-->X(C(A2B)3C2(AD)2)2Y
(AB)2(QXA)3<-->ABABQXAQXAQXA
Hãy viết chương trình thu gọn và giải mã (hay nén và giải nén) xâu.
Thuật toán dưới đây là quá trình nén xâu.
Đổi từ hệ 10 sang hệ 2 (hệ thập phân sang nhị phân)
Đề : Đổi từ hệ 10 sang hệ 2 (hệ thập phân sang nhị phân)
Nguyên tắc của phương pháp chuyển đổi từ hệ cơ
số 10 sang hệ cơ số 2 là lấy số cần chuyển đổi chia cho 2 (kết quả chỉ lấy phần
nguyên), sau đó tiếp tục lấy kết quả chia 2 (và cũng chỉ lấy phần nguyên), kết
quả số nhị phân thu được là tập hợp các số dư của các phép chia.
Tính chữ số 0 tận cùng của n!
Đề bài: Nhập vào n (1<=n<=30000), hãy in
ra số chữ số 0 cuối cùng của n giai thừa.
Ý tưởng cách tìm: Xét tất cả các số chia hết cho 5. Giả sử mỗi số đó có thể chia hết cho Xi chữ số 5.
Cộng tất cả các số đó lại thì ta được số chữ số 0.
Giả sử 25! = 15511210043330985984000000 có 6 chữ số 0 tận cùng.
ta có
5 chia hết cho 1 chữ số 5
10 chia hết cho 1 chữ số 5
15 chia hết cho 1 chữ số 5
20 chia hết cho 1 chữ số 5
25 chia hết cho 2 chữ số 5
-> suy ra tổng là 6 (đúng với kết quả là có 6 chữ số 0).
Ý tưởng cách tìm: Xét tất cả các số chia hết cho 5. Giả sử mỗi số đó có thể chia hết cho Xi chữ số 5.
Cộng tất cả các số đó lại thì ta được số chữ số 0.
Giả sử 25! = 15511210043330985984000000 có 6 chữ số 0 tận cùng.
ta có
5 chia hết cho 1 chữ số 5
10 chia hết cho 1 chữ số 5
15 chia hết cho 1 chữ số 5
20 chia hết cho 1 chữ số 5
25 chia hết cho 2 chữ số 5
-> suy ra tổng là 6 (đúng với kết quả là có 6 chữ số 0).
Tổng m số tận cùng của n trong pascal
Nhập vào 1 số tự nhiên n* và nhập vào m, sau đó
tính tổng m các số tận cùng của n.
vd: n = 365 m =2 tổng = 5+6=11.
vd: n = 365 m =2 tổng = 5+6=11.
Tìm các số tổng các các ước của số này bằng số kia và ngược lại
Đề: Hai số m,n gọi là bạn của nhau nếu tổng các
ước của m bằng n và ngược lại.Tìm tất cả các số là bạn của nhau và nhỏ hơn
10001.
In ra tệp các phần tử xuất hiện trong tệp từ k lần trở lên
Nhập một dãy A (mỗi số chỉ xuất 1 lần) có N
(< 40) số tự nhiên và 1 số K. Hãy xuất ra các phần tử có số lần xuất hiện trong
dãy A từ K lần trở lên.
Ngày tháng năm sau ngày được nhập N ngày
Đề bài: Nhập ngày tháng năm. Hãy cho biết ngày tháng năm sau đó N ngày.
CHƯƠNGTRÌNH QUẢN LÝ ĐIỂM THI TỐT NGHIỆP VỚI 2 MÔN THI
Bài
8: Viết chương trình quản lý điểm thi Tốt nghiệp của sinh viên với 2 môn thi:
Cơ
sở và chuyên ngành. Nội dung công việc quản lý bao gồm:
PHÉP CỘNG 2 SỐ TỰ NHIÊN(chương trình con)
Đề : Viết
chương trình thực hiện phép cộng 2 số tự nhiên lớn (không quá 255 chữ
số).
Thứ Hai, 3 tháng 4, 2017
ĐIỂM TRUNG BÌNH (FILE)
Tạo
một file SINHVIEN.DAT để lưu thông tin của một lớp sinh viên. Mỗi
sinh
viên cần những thông tin sau: Họ tên, Ngày sinh, Quê quán, Điểm trung bình,
MA TRẬN MXN
Bài
5 :Một ma trận mxn số thực được chứa trong một file văn bản có tên DULIEU.INP gồm:
dòng đầu chứa hai số m, n; m dòng tiếp theo lần lượt chứa m hàng của ma trận.
Hãy viết chương trình đọc dữ liệu từ file DULIEU.INP,
QUAN HỆ HUYẾT THỐNG
Bài
4: Quan hệ huyết thống ( Hải Dương - 2013)
Đề
: Trung tâm nghiên cứu gen thu thập N mẫu gen của N cá thể trong cùng một loài.
N gen này được mã hóa thành dãy N số nguyên dương a1,a2,…aN. Bộ phận phân tích
sau khi xem xét đã đưa ra được kết luận sau:
SỐ SIÊU NGUYÊN TỐ
Bài
3: Số siêu nguyên tố ( Hải Dương - 2013)
Đề
: Số siêu nguyên tố là số nguyên tố mà khi xóa bỏ dần các chữ số bên phải của
nó thì phần còn lại vẫn là số nguyên tố.
VD:
2333 là số siêu nguyên tố vì 2333, 233, 23, 2 đều là các số nguyên tố
Yêu
cầu : Cho số nguyên dương M (M<=30000). Hãy tìm số siêu nguyên tố gần với M
nhất tức là giá trị tuyệt đối của hiệu giữa số tìm được và M là nhỏ nhất)
Dữ
liệu : Nhập vào từ bàn phím số nguyên
dương M (không cần kiểm tra dữ liệu nhập )
Kết
quả : Ghi ra màn hình các số nguyên tố gần M nhất, mỗi số một dòng theo thứ tự
số nhỏ hơn ghi trước.
VD
Dữ
liệu nhập : 30
Kết
quả in ra: 2 dòng
29
31
Lời giải var d: array[1..30000] of byte; M : longint; procedure sangNT; var I,j : longint; begin for i:=1 to 30000 do d[i] := 0; d[1]:=1; i:=1; while i*i<=30000 do begin repeat inc(i) until (i*i>30000) or (d[i]=0); if i*i<=30000 then begin j:=2; while i*j<=30000 do begin d[i*j]:=1; inc(j); end; end; end; end; function sieunt(x:longint) : boolean; begin repeat if d[x] =1 then begin sieunt:= false; exit; end; x:=x div 10; until x=0; sieunt:=true; end; var a,b: longint; begin sangNT; read(M); a:=m; while (a>0) and (not sieunt (a)) do dec(a); b:=m; while (b<30001) and (not sieunt (b)) do inc(b); if a>0 then writeln(a); if (b<>m) and (b<30001) then writeln(b); end.
MẢNG VÀ XÂU
Bài
2 : Mảng và xâu ( Hưng yên - 2011)
Nhập
số nguyên N (2<=n<=20) và mảng 1 chiều A gồm N số nguyên dương nhỏ hơn
1000 sau đó đưa ra kết quả mảng A ra ngoài màn hình. Em hãy cài đặt chương
trình làm những việc sau.
Số hoàn hảo
Bài
1 : Số hoàn hảo
Số
nguyên dương n được gọi là số hoàn hảo nếu tổng tất cả các ước của nó trừ chính
nó bằng chính nó.
Chủ Nhật, 2 tháng 4, 2017
TỆP VÀ KIỂU DỮ LIỆU TỆP
1 Khái niệm về tệp:
Tệp là một dãy các
phần tử cùng kiểu được sắp xếp một cách tuần tự. Tệp dữ liệu được lưu trữ ở bộ
nhớ ngoài dưới một tên nào đó.
Tệp tập hợp trong nó
một số phần tử dữ liệu có cùng cấu trúc giống như mảng nhưng khác mảng là số
phần tử của tệp chưa được xác định.
Thứ Bảy, 1 tháng 4, 2017
KIỂU MẢNG Phần 2
a. Khai
báo
Một chuỗi dữ liệu là một loạt các ký tự được định nghĩa bằng từ khoá STRING theo sau là số ký tự cực đại có thể có của chuỗi ký tự. String là một kiểu cấu trúc được thêm vào trong Turbo Pascal.
Một chuỗi dữ liệu là một loạt các ký tự được định nghĩa bằng từ khoá STRING theo sau là số ký tự cực đại có thể có của chuỗi ký tự. String là một kiểu cấu trúc được thêm vào trong Turbo Pascal.
Chúng ta có thể khai báo kiểu chuỗi ký tự String gián tiếp hoặc
trực tiếp. Khai báo gián tiếp là khai kiểu trước rồi sau đó mới khai báo biến.
Cách khai báo trực tiếp là khai thẳng biến số. Chiều dài tối đa của chuỗi ký tự
phải là một hằng nguyên và được đặt trong dấu ngoặc vuông [ ]. Trường hợp không
khai báo thì chương trình sẽ lấy giá trị mặc nhiên là 255 ký tự
+ Khai báo gián tiếp
TYPE
<Tên
kiểu String> = STRING [hằng nguyên] ;
VAR
<Tên
biến> : <Tên kiểu String> ;
Ví dụ 8.14:
TYPE
TenSV
= STRING [25] ; {định độ dài tối đa là 25}
Diachi
= STRING; {mặc nhiên có độ dài tối đa là 255}
VAR
HT
: TenSV ;
DC
: Diachi ;
+
Khai báo trực tiếp
VAR
<Tên
biến> : STRING [hằng nguyên] ;
Ví dụ 8.15:
VAR
HT
: STRING [25] ;
DC
: STRING;
Chuỗi ký tự sẽ chiếm số byte trong bộ nhớ bằng số ký tự lớn nhất
đã khai báo trước cộng thêm 1 byte đầu tiên chứa số ký tự hiện có của chuỗi ký
tự.
Ví dụ 8.16:
TYPE DH
= STRING[10] ;
VAR CT
: DH ;
và nếu ta gán CT := CAN THO;
thì CT sẽ được cấp phát 1 + 10 = 11 ô nhớ (byte) liên tục, với
hình ảnh sau :
Chú ý:
- Ðộ dài của chuỗi ký tự CT là 7 ký tự mặc dầu độ dài
lớn nhất cho phép là 10.
- Vì ta dùng 1 byte để chứa chiều dài nên string chỉ có tối đa là
255 ký tự.
b. Các
thao tác trên chuỗi
+ Phép gán
Giống như phép gán trong các kiểu vô hướng khác, phép gán chuỗi là
lệnh gắn một biến với một biểu thức ký tự để trong cặp dấu nháy đơn
Cú
pháp:
<Tên
biến> := Biểu thức ký tự ;
Ví dụ 8.17:
HT
:= Lê Văn Hai ;
DC
:= Số 12/4 đường Trần Hưng Ðạo, TP. Cần thơ ;
+ Phép cộng
Phép cộng là thuật toán nối các chuỗi lại với nhau bằng dấu cộng
(+).
Ví dụ trên nếu ghép HT + DC thì ta sẽ được:
Lê Văn Hai Số 12/4 đường Trần Hưng Ðạo, TP. Cần
thơ
Ghi chú: Không
có phép trừ, nhân, chia trong chuỗi ký tự.
+ Các phép so sánh
Các so sánh gồm có bằng nhau =, lớn hơn >, lớn hơn hoặc bằng
>=, khác nhau <>, nhỏ hơn <, nhỏ hơn hoặc bằng <=
Khi
so sánh 2 chuỗi ký tự thì các ký tự được so sánh từng cặp một từ trái sang phải
theo giá trị của bảng mã ASCII. Có 2 khả năng xảy ra khi so sánh:
-
Nếu 2 chuỗi có độ dài khác nhau nhưng số ký tự giống nhau cho đến độ dài chuỗi
ngắn nhất thì chuỗi ngắn nhỏ hơn chuỗi dài.
Ví dụ 8.18: 'Nation'
<
'National'
'Lan' < 'Lang'
-
Nếu 2 chuỗi có độ dài và nội dung giống nhau thì bằng nhau.
Ví dụ
8.19: 'Hello' =
'Hello'
Ghi
chú: Chuỗi
rổng (null string, viết là '') là chuỗi không có chứa gì cả. Nó có giá trị nhỏ
hơn mọi string khác rỗng.
Vì
vậy: 'A'
>'' và chr(32)> ''
+ Câu lệnh Read và Readln
Hai câu lệnh này đối với chuỗi cũng tương tự như đối với các kiểu
vô hướng khác, nhưng cần lưu ý:
-
Lệnh Read và Readln chỉ cho phép đọc tối đa 127 ký tự một chuỗi nhập từ bàn
phím mặc dầu chiều dài tối đa của một chuỗi có thể đến 255 ký tự.
-
Nếu ta đọc một lúc nhiều biến theo kiểu Read(biến1, biến2, ..., biếnN) ( hoặc
Readln(biến1, biến2, ..., biếnN)) thì có thể bị nhầm lẫn khi ta nhập giá trị có
độ dài vượt quá độ dài tối đa của biến1 thì phần vượt sẽ được gán cho biến2.
Ngược lại, nếu ta nhập giá trị ít hơn độ dài của biến1 thì chương trình lại lấy
các giá trị của biến2 gán thêm cho biến1 kể cả khoảng trống. Do vậy, cách tốt
nhất là đối với biến kiểu String chỉ nên nhập mỗi lần 1 biến.
Ví dụ 8.20: Nên
tránh viết kiểu Read(TenSV, Diachi); mà nên viết
:
Read(TenSV)
;
Read(Diachi)
;
hoặc:
Readln(TenSV)
;
Readln(Diachi)
;
-
Ðộ dài thực tế của chuỗi là độ dài thực tế khi ta đọc vào từ bàn phím mặc dầu
trước đó ta có khai báo độ dài chuỗi. Nếu ta gõ Enter mà không gõ ký tự nào
trước đó thì mặc nhiên chương trình hiểu đó là một chuỗi rỗng (null string hay
st = '').
+ Câu lệnh Write và Writeln
Tương tự như trên nhưng cần một số lưu ý về cách viết:
- Nếu viết Write(st) hoặc Writeln(st) gọi
là cách viết không qui cách thì mỗi ký tự sẽ chiếm 1 vị trí trên màn hình.
- Nếu viết Write(st : n) hoặc Writeln(st :
n) gọi là cách viết theo qui cách, với n là số nguyên, thì màn hình sẽ dành n
vị trí để viết chuỗi st theo lối canh trái nếu n> 0 và ngược lại theo lối
canh phải nếu n < 0.
- Một số chuỗi mà trong đó có dấu như là
một chữ viết tắt, ví dụ như câu: Hes an Intal staff (Ông ta là một nhân viên
quốc tế) thì nơi có dấu phải viết thành (đây là 2 dấu nháy đơn chứ không phải
là 1 dấu nháy kép ).
Ta viết:
Writeln
( ‘ He ‘’s an Int’’al staff ‘) ;
c. Các thủ
tục và hàm chuẩn xử lý chuỗi ký tự
Chuỗi ký tự được dùng khá phổ biến trong lập trình nên Turbo
Pascal đã đưa sẵn vào một số thủ tục và hàm chuẩn để xử lý chuỗi ký tự.
* Thủ tục xóa DELETE (St, Pos, Num)
Ý nghĩa: Xóa khỏi chuỗi St một số ký tự là Num bắt đầu
từ vị trí Pos tính từ trái sang.
Ví dụ
8.21: VAR st
: string [20];
BEGIN
St
:= ' BÀ BA BÁN BÁNH BÒ '; Writeln (St) ;
DELETE
(St, 10, 4); Writeln(St); Readln ;
END.
Khi chạy chương trình, ta sẽ thấy trên màn hình:
BÀ BA BÁN BÁNH BÒ
BÀ BA BÁN BÒ
* Thủ tục INSERT (Obj, St, Pos)
Ý nghĩa: Chèn chuỗi Obj xen vào chuỗi St kể từ vị trí Pos tính từ
bên trái.
Ví dụ
8.22: VAR st
: string [25];
BEGIN
St
:= 'BÀ BA BÁN BÁNH BÒ' ; Writeln (St) ;
INSERT
( BỤNG BỰ , St, 6); Writeln(St); Readln ;
END.
Khi chạy chương trình, ta sẽ thấy trên màn hình:
BÀ BA BÁN BÁNH BÒ
BÀ BA BỤNG BỰ BÁN BÁNH BÒ
* Thủ tục STR (S [: n[: m]], St)
Ý nghĩa: Ðổi giá trị số S thành chuỗi rồi gán cho St, Giá trị n:m
nếu có sẽ là số vị trí và số chữ số thập phân của S.
Ví dụ
8.23: VAR S:
real;
St:
string[10];
BEGIN
S:=
12345.6718;
Writeln(S:5:2);
Str(S:6:2:st);
Readln;
END.
Kết quả trên màn hình:
12345.67 {Ðây
là số }
12345.67 {Ðây
là chuỗi}
* Thủ tục VAL(St, S, Code)
Ý nghĩa: Ðổi chuỗi số St (biểu thị một số nguyên hoặc
số thực) thành số (số nguyên hoặc số thực) và gán giá trị này cho S. Code là số
nguyên dùng để phát hiện lỗi: nếu đổi đúng thì Code có giá trị = 0, nếu sai do
St không biểu diễn đúng số nguyên hoặc số thực thì Code sẽ nhận giá trị bằng vị
trí của ký tự sai trong chuỗi St.
Ví dụ 8.24: VAR St : String[10]; SoX : real; maloi: integer; BEGIN St:= ‘123.456’ ; VAL(St,SoX,maloi) ; Writeln('Số X = , SoX :5:2, và mã lỗi = , maloi) ; Readln; St:=‘123.XXX ’; VAL(St,SoX,maloi); Writeln('St = 123.XXX không đổi thành số được !'); Writeln('Sai lỗi ở vị trí thứ ' , maloi); Readln; END.Khi chạy, ta sẽ thấy trên màn hình:123.45 và maloi = 0St = 123.XXX không đổi thành số được !Sai lỗi ở vị trí thứ 5* Hàm LENGTH (St)Ý nghĩa: Cho kết quả là một số nguyên chỉ độ dài của chuỗi ký tự St.Ðể viết 1 chuỗi ký tự ở trung tâm màn hình, ta có thể dùng thủ thuật viết chuỗi là (80 - lenght(st)) div 2
Ví dụ 8.25: USES CRT; VAR St : String[80]; BEGIN ClrScr ; Write(' Nhập vào một câu : '); Readln(St) ; Gotoxy(80 - Lenght(St)) div2, 12); Writeln(St) ; Readln ; END.
* Hàm COPY (St, Pos, Num)Ý nghĩa: Cho kết quả là một chuỗi ký tự mới có được bằng cách chép từ chuỗi St, bắt đầu từ vị trí Pos và chép Num ký tự.Nếu vị trí Pos lớn hơn chiều dài của chuỗi St thì hàm COPY sẽ cho một chuỗi rỗng. Nếu giá trị của vị trí Pos và số ký tự Num (Pos + Num) lớn hơn chiều dài của chuỗi St thì hàm COPY chỉ nhận các ký tự nằm trong chuỗi St.
* Hàm CONCAT (St1, St2, ..., StN)
Ý nghĩa: Cho kết quả là một chuỗi mới được ghép theo
thứ tự từ các chuỗi St1, St2, ..., StN. Hàm này giống như phép cộng
các chuỗi. Chuỗi mới cũng sẽ không được vượt quá 255 ký tự.
* Hàm POS (Obj, St) :
* Hàm POS (Obj, St) :
Ý nghĩa: Cho kết quả là vị trí đầu tiên của chuỗi Obj
trong chuỗi St. Nếu không tìm thấy thì hàm POS cho giá trị 0.
Ví dụ 8.27:
nếu St := 1234567890, nếu Obj := 456 thì POS (Obj, St) = 4 còn
POS(4X, St)=0
d. Truy xuất từng ký tự trong chuỗi
d. Truy xuất từng ký tự trong chuỗi
Ta có thể truy xuất đến từng ký tự trong chuỗi với tên biến và chỉ
số trong dấu ngoặc vuông [ ] như truy xuất các phần tử của mảng. Ví dụ với chuỗi
St thì St[i] là ký tự thứ i trong chuỗi St, dĩ nhiên . Chỉ số i chạy dài từ 1 đến độ dài
lớn nhất của chuỗi ký tự.
KIỂU MẢNG Phần 1
Một mảng dữ liệu là một tập hợp số hữu hạn phần tử có giống như
các biến, có cùng kiểu, gọi là kiểu cơ bản.
Mảng
được được tổ chức theo một trật tự xác định. Số phần tử của mảng được khai báo
ngay từ khi định nghĩa ra mảng.
a. Mảng
một chiều (One-Dimensional Array)
Mảng một chiều có thể được hiểu như một danh sách các phần tử
(theo cột), có cùng kiểu. Mỗi phần tử của mảng được xác định được truy nhập
trực tiếp thông qua tên mảng cùng với chỉ dẫn truy nhập được để giữa hai ngoặc
vuông [ ].
Ví dụ 8.7:
List
là một mảng 1 chiều có n phần tử. Các phần tử của List có thể mang các tên
List[1], List[2], List[3], ..., List[n], và có thể minh họa như hình
sau:
List[1] List[2] List[3] List[4] ......... List[n]
Hình
8.1: Minh họa mảng một chiều
+ Khai báo gián tiếp:
TYPE
<Kiểu
mảng> = ARRAY [Kiểu chỉ số ] OF <Kiểu phần tử >
;
VAR
<Danh
sách biến> : Kiểu mảng ;
+
Khai báo trực tiếp :
VAR
<
Danh sách biến > : ARRAY [ Kiểu chỉ số] OF < Kiểu phần tử > ;
* Chú ý: Kiểu chỉ số phải là kiểu rời rạc (đếm
được).
Ví dụ 8.8: TYPE KM1 = ARRAY [1.. 100] OF INTEGER ; KM2 = ARRAY [1 .. 20 ] OF CHAR ; DAY = (Sun, Mon, Tue, Wed, Thu, Fri, Sat) ; VAR TUOI : KM1 ; TEN : KM2 ; NGAY : ARRAY [DAY] OF BOOLEAN ;Ý nghĩa:- KM1 là kiểu mảng gồm 100 phần tử được đánh số từ 1 đến 100 thông qua kiểu chỉ dẫn là một miền con các số nguyên từ 1 ..100. TUOI là biến có kiểu là KM1.- KM2 là kiểu mảng gồm 20 phần tử đánh số từ 1 .. 20 có kiểu là các ký tự. Biến TEN có kiểu là KM2.- NGAY là một biến mảng gồm 7 phần tử kiểu Boolean được đánh dấu qua kiểu chỉ dẫn là tên của 7 ngày trong tuần.Chú ý:Khi khai báo mảng, kiểu chỉ dẫn chỉ có thể là:- Kiểu miển con của các loại dữ liệu vô hướng đếm được như ký tự, số nguyên- Kiểu liệt kê do người viết định nghĩa (như NGAY trong tuần)- Kiểu BooleanKiểu chỉ dẫn không thể là kiểu không đếm được như REALViết như sau là SAI : X1 : ARRAY [Real] OF Integer ;Ta cũng không thể khai báo như: X2 : ARRAY [Integer] OF Integer ;Mặc dầu Integer là kiểu vô hướng đếm được do giới hạn của vùng nhớ dành cho dữ liệu, số lượng phần tử của 1 mảng cũng bị hạn chế tùy theo kích thước của kiểu dữ liệu của các phần tử, ta nên dùng kiểu miền con để khai báo số phần tử của mảng.+ Truy xuất các phần tử của mảng:Mỗi phần tử của mảng được truy xuất thông qua Tên Biến Mảng cùng với chỉ số của mảng trong dấu ngoặc vuông [ ]. Ví dụ tên biến mảng là A, khi viết A[7], ta hiểu nó là phần tử thứ 7 của mảng A.
Ví dụ 8.9: Lập trình giải một bài toán tính trung bình một dãy số x[i] : x[1], x[2], x[3], ... , x[n] sau đó tiếp tục tính độ lệch (deviation) của từng phần tử so với trị trung bình, theo công thức: độ_lệch = x[i] - trung_bình Giả sử dãy số của chúng ta có giới hạn n = 100 phần tử trở lại, n là một biến số để khai báo số phần tử muốn tính . Sau đó ta lần lượt nhập tính giá trị của phần tử kiểu số thực (real) từ phần tử thứ 1 đến phần tử thứ n. Trong chương trình sẽ tạo ra một mảng 1 chiều x với n các phần tử. Tính trung bình của n phần tử và độ lệch. In kết quả ra màn hình. PROGRAM Average_deviations ; { Nhập n số phần tử kiểu số thực, tính trị trung bình của chúng, sau đó tính tiếp độ lệch của từng phần tử số so với trị trung bình } VAR n, count : integer ; sum, average, deviation : real ; x : ARRAY [1 .. 100] OF real ; BEGIN (* Nhập số phần tử và tính trung bình*) Write (' Nhập bao nhiêu số n để tính trung bình ? ') ; Readln (n) ; Writeln ; sum := 0 ; FOR count := 1 TO n DO BEGIN Write ( ‘ i = ‘, count : 3, ‘ x = ‘ ) ; Readln (x [count] ) ; sum := sum + x[count]; END ; average := sum/n ; Writeln (' Trung bình của dãy số là = , average ') ; Writeln ; (* Tính độ lệch so với trị trung bình *) FOR count := 1 TO n DO BEGIN deviation := x[count] - average ; Write ( ‘ i = ‘, count : 3, ‘ x = ‘, x[count] ) ; Writeln (' Ðộ lệch d = , deviation '); END ; Readln; END.
Giả sử, ta nhập vào 5 số hạng (các số có gạch dưới là phần của người nhập):x[1] =3.0x[2] =-2.0x[3] =12.0x[4] =4.4x[5] = 3.5Khi chạy chương trình (nhấn Ctrl + F9), trên màn hình ta sẽ thấy :Nhập bao nhiêu số n để tính trung bình ? 5i = 1 x= 3.0i = 2 x= -2.0i = 3 x= 12.0i = 4 x= 4.4i = 5 x= 3.5Trung bình của dãy số là= 4.1800000E+00i = 1 x= 3.0000000E+00 Ðộ lệch d = - 1.1800000E+00i = 2 x= -2.0000000E+00 Ðộ lệch d = - 6.1800000E+00i = 3 x= 1.2000000E+00 Ðộ lệch d = 7.8200000E+00i = 4 x= 4.4000000E+00 Ðộ lệch d = 2.2000000E- 01i = 5 x= 3.5000000E+00 Ðộ lệch d = - 6.8000000E- 01Ta có thể định khoảng chừa kết quả và phần lẻ thập phân, dùng lệnh : m : n
Ví dụ 8.10: Sắp xếp một dãy số theo thứ tự từ nhỏ đến lớn Tiến trình của bài toán: - Giả sử chuỗi số của ta có n phần tử . Lần lượt cho chương trình đọc giá trị của các phần tử nhập được. - Một thủ tục (Procedure) sẽ làm công việc sắp xếp như sau : đầu tiên đưa phần tử thứ nhất so sánh với các phần tử tiếp theo, nếu nó lớn hơn phần tử so sánh thì đem đổi chổ giá trị của hai phần tử với nhau. Sau đó tiếp tục đem phần tử thứ 2 so sánh các phần tử tiếp theo theo trình tự như vậy, ... và cứ như thế cho đến phần tử thứ n - 1. - In kết quả ra màn hình Chương trình Pascal như sau: PROGRAM Reorder ; (* Sắp xếp một mảng các phần tử số thực từ nhỏ đến lớn*) VAR n, i, loc: 1 .. 100 ; x : ARRAY [1 .. 100] OF real ; temp : real ; PROCEDURE interchange ; (* Ðổi chỗ các phần tử mảng từ nhỏ đến lớn*) BEGIN FOR loc := 1 TO n-1 DO FOR i := loc + 1 TO n DO IF x[i] < x [loc] THEN BEGIN temp := x[loc] ; x[loc] := x[i] ; x[i] := temp ; END ; END ; BEGIN Write (' Có bao nhiêu phần tử số ? ') ; Readln (n) ; FOR i := 1 TO n DO BEGIN Write ( ‘ x[ ‘, i : 3, ‘] = ? ‘ ) ; Readln( x[i] ) ; END ; interchange ; Writeln ; Writeln (' Số liệu đã sắp xếp : ') ; Writeln ; FOR i := 1 TO n DO Writeln ( ‘x[ ‘, i : 3, ‘ ] = ‘, x[i] : 4 : 1 ) ; Readln; END.
Khi chạy chương trình, giả sử ta có 5 số liệu như phần nhập :(các số có gạch dưới là phần nhập từ bàn phím)Có bao nhiêu phần tử số ? 5x[ 1] = ? 4. 7x[ 2] = ? - 2. 3x[ 3] = ? 12. 9x[ 4] = ? 8. 8x[ 5] = ? 6. 0Kết quả là :Số liệu đã sắp xếp :x[ 1] = ? - 2. 3x[ 2] = ? 4. 7x[ 3] = ? 6. 0x[ 4] = ? 8. 8x[ 5] = ? 12. 9b. Mảng nhiều chiều (Multi-Dimensional Array)Trong một số bài toán thực tế, người ta sử dụng các mảng nhiều hơn 1 chiều, gọi là mảng nhiều chiều.Ví dụ 8.11: Phòng Ðào tạo quản lý điểm của sinh viên. Trong khoá 22 chẳng hạn, người ta tạo ra một mảng 2 chiều: ví dụ một chiều là số thứ tự của sinh viên, chiều còn lại là các môn học (dạng kiểu vô hướng liệt kê), ta có thể hình dung dạng của mảng ghi điểm (tên mảng là ghi_diem) như sau:Lưu ý: Thực tế, danh sách tên sinh viên lưu lại trong máy tính thường được ghi bằng cách gán mã số sinh viên (coding) cho mỗi sinh viên ngay từ năm đầu vào học.Với ví dụ trên, muốn nhập điểm một sinh viên nào đó ta phải khai báo 2 tham số là số thứ tự sinh viên và môn học.Tương tự, cũng với các khoá kế tiếp theo học những môn như vậy, ta sẽ tạo ra mảng nhiều chiều như hình vẽ minh họa sau:Trong trường hợp này, muốn biết điểm một sinh viên nào đó ta phải khai báo 3 tham số: Khoá học, số thứ tự sinh viên và môn học, chẳng hạn:ghi_diem[K22,0001,AV] nhập điểm 10,...Khai báo cũng có 2 cách như đối với mảng 1 chiều:+ Khai báo gián tiếp:TYPE<Kiểu mảng> = ARRAY [Kiểu_chỉ_số_1, ..., Kiểu_chỉ_số_n] OF <Kiểu phần tử>;VAR<Danh sách biến>:<Kiểu mảng>;Ví dụ 8.12:TYPE matrix = ARRAY [1 .. 20, 1 .. 30] OF integer ;VAR A:matrix;Lệnh trên khai báo một kiểu tên matrix. Ðây là một mảng 2 chiều, chiều thứ nhất có các chỉ số từ 1 đến 20, chiều thứ hai có các chỉ số từ 1 đến 30, tổng cộng ta có (20 x 30) phần tử số nguyên. Và ta có một biến A là biến có kiểu matrix.Ví dụ trên cũng có thể được khai báo tương đương với:TYPE matrix = ARRAY [1 .. 20] OF ARRAY [1 .. 30] OF integer ;VAR A:matrix;+ Khai báo gián tiếp:VAR <Danh sách biến>: ARRAY [Kiểu_chỉ_số_1, ..., Kiểu_chỉ_số_n] OF <Kiểu phần tử>;Khai báo một biến A có 5 dòng và 10 cột kiểu phần tử là Integer như sau:VAR A : ARRAY [1 .. 5, 1 .. 10] OF integer ;+ Truy xuất các phần tử mảng:Tương tự như cách truy xuất phần tử của mảng 1 chiều, mảngg nhiều chiều cũng được truy xuất thông qua tên biến mảng kết hợp với các chỉ số của nó được đặt trong cặp dấu ngoặc vuông.Mảng 2 chiều là một ma trận, như ví dụ trên ta có một ma trận 5 dòng và 10 cột. Các phần tử của ma trận A được ký hiệu là a[i,j] với i là vị trí cột và j là dòng. Khi viết a[2, 7] thì hiểu đây là phần tử ở dòng 2 và cột 7.Trong Pascal, ta có thể viết a[i,j] thành a[i] [j] với ý nghĩa hoàn toàn như nhau.Chú ý: Trên nguyên tắc, ta có thể khai báo một mảng có đến 255 chiều. Tuy vậy, một điều cần lưu ý là kích thước bộ nhớ của máy tính có hạn nên thường chỉ khai báo mảng từ 1 đến 3 chiều. Khai biến quá nhiều thì phải cần máy lớn hơn.Chẳng hạn khi báo 1 mảng [1.. 10] các phần tử số nguyên đã lấy 10 bytes bộ nhớ- Mảng 2 chiều 10 x 10 = 100 bytes bộ nhớ.- Mảng 3 chiều 10 x 10 x 10 = 1 000 bytes bộ nhớ- Mảng 4 chiều 10 x 10 x 10 x 10 = 10 000 bytes bộ nhớ- Mảng 5 chiều 10 x 10 x 10 x 10 x 10 = 100 000 bytes bộ nhớ- v.v...Ví dụ 8.13:Viết một chương trình Pascal để đọc một bảng các số thực được nhập vào máy tính dưới dạng một mảng 2 chiều. Tính tổng các giá trị số theo hàng và theo cột. Kết quả được in ra màn hình theo vị trí hàng và cột tương ứng.Trước tiên, ta bắt đầu bằng định nghĩa các biến:table = mảng 2 chiều chứa số thực dưới dạng bảng gồm các số nhập và kết quảnrows= một biến số nguyên chỉ số hàngncols = một biến số nguyên chỉ số cộtrow = một số đếm nguyên chỉ số hàngcol = một số đếm nguyên chỉ số cộtÐể đơn giản, chúng ta giả sử rằng kích thước số liệu nhập vào bảng tính không vượt quá 10 hàng và 10 cột. Ta sẽ thêm vào 1 hàng cộng phía dưới và 1 cột cộng bên phải vào bảng để ghi kết quả tính cộng các phần tử hàng và cột tương ứng. Như vậy, mảng 2 chiều của chúng ta sẽ trở thành mảng sẽ được in ra có số hàng là (nrows + 1) và số cột là (ncols +1). Do vậy, ta phải khai báo biến table là 1 mảng 2 chiều số nguyên có tối đa 11 cột và 11 hàng.Ðể dễ theo dõi chương trình, ta thực hiện cấu trúc module khi viết chương trình bằng cách tiến hành làm các thủ tục procedure cho đọc số liệu, tính tổng các phần tử theo hàng, tính tổng các phần tử theo cột và in ra màn hình bảng kết quả. Các thủ tục này sẽ có tên tương ứng là readinput, rowsums, columsums và writeoutput.Thuật toán logic yêu cầu cho mỗi thủ tục là cách khai báo thẳng trước (straightforward), chú ý rằng trong mỗi thủ tục ta có một vòng lặp đôi (double loop). Ví dụ, để đọc số liệu ở bảng gốc, ta sẽ phải làm một vòng lặp đôi sau:
FOR row := 1 TO nrows DO BEGIN FOR col := 1 TO ncols DO readln( table[row, col] ) ; Writeln; END ; Câu lệnh Writeln để báo chương trình nhảy tới dòng kế. Tương tự, vòng lặp sau được viết để tính tổng các phần tử theo hàng: FOR row := 1 TO nrows DO BEGIN table [row, ncols + 1] := 0 ; FOR col := 1 TO ncols DO table [row, ncols + 1] := table [row, ncols + 1] + table [row, col]; END ; Tương tự, cấu trúc vòng lặp đôi cũng được dùng để tính tổng các phần tử cột và in ra bảng kết quả cuối cùng. Sau đây là chương trình Pascal của bài toán trên: PROGRAM Tongbang ; {đọc một bảng số, tính tổng từng cột và hàng của cá bảng} VAR row, col : 1 .. 11 ; nrows, ncols : 1 .. 10 ; table : ARRAY [1 .. 11, 1 .. 11] OF real ; PROCEDURE Rowsums ; {cộng các phần tử theo cột bên trong mỗi hàng } BEGIN FOR row := 1 TO nrows DO BEGIN table [row,ncols+1] := 0 ; FOR col := 1 TO ncols DO table[row, ncols+1] := table[row, ncols+1] + table[row,col]; END ; END ; PROCEDURE Columnsums ; {cộng các phần tử theo hàng bên trong từng cột } BEGIN FOR col := 1 TO ncols DO BEGIN table [nrows+1, col] := 0 ; FOR row := 1 TO nrows DO table[nrows+1,col] := table[nrows+1,col] + table[row,col]; END ; END ; PROCEDURE Readinput ; {đọc các phần tử của bảng } BEGIN Write(' Nhập số hàng (1 .. 10) ? ') ;Readln(nrows) ; Write(' Nhập số cột (1 .. 10) ? ') ;Readln(ncols) ; FOR row := 1 TO nrows DO BEGIN Writeln (' Nhập số liệu hàng số , row :2') ; FOR col := 1 TO ncols DO readln(table [row, col] ) ; END ; END ; PROCEDURE Writeoutput ; { In ra bảng số liệu và kết quả tính tổng } BEGIN Writeln('Bảng số liệu và kết quả tính tổng các phần tử theo hàng và cột '); Writeln(‘============================================= ‘); Writeln; FOR row := 1 TO nrows + 1 DO BEGIN FOR col := 1 TO ncols+1 DO Write (table [row,col] : 6 : 1) ; Writeln; END ; END ; BEGIN { Thân chương trình chính } Readinput ; Rowsums ; Columnsums ; Writeoutput; END. { Chấm dứt chương trình }Giả sử, ta có bảng số liệu sau :2.5 -6.3 14.7 4.010.8 12.4 -8.2 5.5-7.2 3.1 17.7 -9.1Khi chạy chương trình, ta có (số có gạch dưới là số của người thử chương trình):Nhập số hàng (1 .. 10 ) ? 3Nhập số cột (1 .. 10) ? 4Nhập số liệu hàng số 12.5 -6.3 14.7 4.0Nhập số liệu hàng số 210.8 12.4 -8.2 5.5Nhập số liệu hàng số 3-7.2 3.1 17.7 -9.1Chương trình sẽ tính tổng các giá trị ở hàng và cột, xong in ra màn hình kết quả:Bảng số liệu và kết quả tính tổng các phần tử theo hàng và cột2.5 -6.3 14.7 4.0 14.910.8 12.4 -8.2 5.5 20.5-7.2 3.1 17.7 -9.1 4.56.1 9.2 24.2 0.4 0.0Ta có thể kiểm tra kết quả ở các hàng và cột.
Đăng ký:
Nhận xét (Atom)




