Bài giảng Nguyên lý ngôn ngữ lập trình - Chương 2: Kiểu dữ liệu - Nguyễn Văn Hòa
Tóm tắt Bài giảng Nguyên lý ngôn ngữ lập trình - Chương 2: Kiểu dữ liệu - Nguyễn Văn Hòa: ...iểu dữ liệu bao gồm ba yếu tố sau: Cỏc thuộc tớnh: xỏc ủịnh cỏc ủối tượng dữ liệu thuộc kiểu Cỏc giỏ trị: mà cỏc ủối tượng dữ liệu thuộc kiểu cú thể ủược gỏn cho Cỏc tỏc vụ: cỏc thao tỏc cú thể cú trờn cỏc ủối tượng dữ liệu thuộc kiểu 21 Kiểu dữ liệu Kiểu dữ liệu là một tập hợp c...B; Warning 30 Thụng tin về kiểm tra kiểu vài NN x√Common Lisp √√Pascal/Modula/Ada x√Python xxPerl √xC √√C++/C#/Java Kiểm tra tĩnhKiểm tra mạnh 31 Chuyển kiểu (convertion) Nếu khụng cú sự thương thớch kiểu lỳc kiểm tra kiểu, NNLT thực hiện một trong hai tỏc vụ sau Sự khụng tương th...Hai, Ba, Tu, Nam, Sau, Bay); Giỏ trị của ðTDL kiểu liệt kờ ủược biểu diễn bằng cỏc số nguyờn : 0,1,2, VD kiểu NGAY cần sử dụng 7 giỏ trị từ 0 ủến 6 : Lợi ớch của kiểu liệt kờ: tăng khả năng dễ ủọc và tớnh dễ viết và ủộ tin cậy của ngụn ngữ. 44 Miền con của số nguyờn Kiểu dữ liệu mà ...
1Chương 2 : Kiểu dữ liệu
Giảng viờn: Ph.D Nguyễn Văn Hũa
Khoa KT-CN-MT – ðH An Giang
2Bits và giỏ trị (values)
10010101010011101101001110101011
10010101010011101101001110101011Signed Integer
10010101010011101101001110101011Unsigned Integer
10010101010011101101001110101011Address
10010101010011101101001110101011String
10010101010011101101001110101011Single Float
3Nội dung chớnh của chương
Giới thiệu kiểu dữ liệu
Kiểu dữ liệu cơ bản
Kiểu do người dựng ủịnh nghĩa
Kiểu dữ liệu cú cấu trỳc
4Dữ liệu (data)
Dữ liệu / mỏy tớnh
ðược lưu trữ ở bộ nhớ
ðược tổ chức thành dạng bits, bytes, words
Dữ liệu / NNLT
ðược tổ chức phức tạp: số, chuỗi ký tự, cỏc mảng,
ngăn xếp,
Thuật ngữ ủối tượng dữ liệu (data objects) là một tập
hợp (set) của một hoặc nhiều mẫu dữ liệu
VD Int = {- 231 0 231 }
5ðối tượng dữ liệu
Một ủối tượng dữ liệu là một chỗ chứa cỏc giỏ trị
của dữ liệu – một vị trớ trong bộ nhớ mỏy tớnh,
ủược ủặt tờn và cú thể lưu trữ giỏ trị của dữ liệu
Cú 1 tập cỏc thuộc tớnh xỏc ủịnh số lượng và kiểu
của cỏc giỏ trị mà ủối tượng dữ liệu cú thể lấy, tổ
chức luận lý của cỏc giỏ trị này
6Phõn loại ủối tượng dữ liệu
Phõn loại dựa trờn cấu trỳc: 2 loại
ðTDL sơ cấp: chứa một giỏ trị dữ liệu ủơn
ðTDL cú cấu trỳc: tập hợp của cỏc dữ liệu khỏc
VD!
Phõn loại trờn nguồn gốc: 2 loại
ðTDL tường minh: do người dựng khai bỏo như biến,
hằng)
ðTDL ẩn: ủược ủịnh nghĩa bởi hệ thống như cỏc ngăn
xếp lưu trữ cỏc giỏ trị trung gian, cỏc ụ nhớ ủệm
7Thuộc tớnh của ðTDL
Thuộc tớnh của một ðTDL là một tớnh chất ủặc
trưng của ðTDL ủú
Mỗi éTDL cú một tập hợp cỏc thuộc tớnh ủể phõn
biệt ðTDL này với ðTDL khỏc.
Cỏc ðTDL sơ cấp cú một thuộc tớnh duy nhất là
kiểu dữ liệu
VD Int: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Cỏc ðTDL cú cấu trỳc cú thờm cỏc thuộc tớnh
nhằm xỏc ủịnh số lượng, kiểu dữ liệu của cỏc
phần tử. VD Struct, Union
8Giỏ trị dữ liệu (GTDL)
GTDL của một ðTDL sơ cấp cú thể là một số,
một ký tự hoặc là một giỏ trị logic tựy thuộc vào
kiểu của ðTDL ủú.
GTDL ủược biểu diễn bởi 1 dóy cỏc bits, ðTDL
ủược biểu diễn bởi một khối ụ nhớ.
VD một ðTDL A chứa GTDL B ~ khối ụ nhớ biểu
diễn A chứa dóy bits biểu diễn B
GTDL của một ðTDL cú cấu trỳc là một tập hợp
cỏc GTDL của cỏc phần tử của ðTDL ủú.
9Thời gian tồn tại của ðTDL
Thời gian tồn tại (lifetime) của một éTDL là
khoảng thời gian ðTDL chiếm giữ bộ nhớ của
mỏy tớnh
Thời gian này ủược tớnh từ khi éTDL ủược tạo ra
cho ủến khi nú bị hủy bỏ
10
Biến và hằng
Biến
éTDL ủược ủịnh nghĩa và ủặt tờn một cỏch tường
minh
Biến là cỏch trự tượng húa một hoặc nhiều ụ nhớ
Thuộc tớnh : name, address, value, type, lifetime, scope
Hằng
éTDL cú tờn và giỏ trị của hằng khụng thay ủổi trong
thời gian tồn tại của nú
VD!
11
Phạm vi của biến (Scope)
Phạm vi của biến là vựng mà biến cú thể trụng thấy ủược
Phạm vi tĩnh (static scope or block) : C, C++, Java & C#
void sub(){
int count;
while () {
int count;
count++;
}
}
12
int main(){
int count;
count = 10;
printf("count %d\n",count);
{
int count;
count = 2;
count++;
printf("count %d\n",count);
}
count = count -5;
printf("count %d\n",count);
}
13
Phạm vi của biến (tt)
Phạm vi ủộng (dynamic scope): Perl, COMMON, LISP cho phộp khai
bỏo phạm vi ủộng
Procedure Big is
X : integer;
Procedure Sub1 is
Begin
X
End;
Procedure Sub2 is
X: integer;
Begin
End
Begin
End
14
Phạm vi của biến: vớ dụ
x : integer;
procedure setX(n : integer)
x := n;
procedure printX()
write integer(x);
procedure first()
setX(4); printX();
procedure second()
x : integer; setX(2); printX();
// bắt ủầu chương trỡnh chớnh
setX(1);
second();
printX();
first();
printX();
15
int x = 2
procedure f(){ x = x * x;}
procedure g(){ h(f) }
procedure h(P){
int x = 4
P()
}
// bắt ủầu chương trỡnh chớnh
g()
print(x)
16
Scope VS Lifetime của biến
ðụi khi scope và lifetime là tương tự nhau
Java: 1 biến ủược khai bỏo trong 1 hàm (no method
calls), scope ủược bắt ủầu từ vị trớ khai bỏo ủến cuối
hàm và lifetime là thời gian thực hiện của hàm
Nhưng scope và lifetime hoàn toàn khụng tương
tự nhau
Scope là khỏi niện liờn quan ủến khụng gian
Lifetime là khỏi niện liờn quan ủến thời gian
17
Cỏc liờn kết (binding)
Một éTDL cú thể tham gia vào nhiều mối liờn kết
trong thời gian tồn tại của nú
Cỏc mối liờn kết phổ biến
ðTDL với GTDL: phộp gỏn
ðTDL với 1 hoặc nhiều tờn tham chiếu: khai bỏo, gọi
và trả CT con
ðTDL với ðTDL (component): giỏ trị của pointer và
pointer cú thể bị thay ủổi do thay ủổi pointer
ðTDL và ụ nhớ: trỡnh quản lý bộ nhớ (routine) thiết lập
18
ðặt tờn (names)
Cỏch ủặt tờn : biến, hằng và hàm
Cú phõn biệt ký tự HOA và thường khụng?
Từ khúa gồm những từ nao?
Chiều dài tối ủa của tờn
Fortran cho phộp tối ủa 31
C99 chấp nhận 63 ký tự ủầu tiờn
Java khụng giới hạn ủộ dài
Hầu hết cỏc NNLT ủều cho phộp dựng cỏc chữ
cỏi, cỏc số và ô_ằ ủể ủặt tờn
19
ðặt tờn (names) (tt)
Vài NNLT dựng khỏi niện ôcamelằ : ký tự HOA
giữa 2 từ. VD myStack
C, C++, Java phõn biệt giữa chữ hoa chữ thường
(case sensitive). VD rose, ROSE và Rose
Từ khúa trong từng NNLT ủược dựng trong cỏc
tỡnh huống ủặc biệt
Khụng ủược dựng từ khúa ủể ủặt tờn, chẳng hạn
tờn biến, tờn hằng, tờn hàm, etc
20
ðặc tả kiểu dữ liệu
ðặc tả kiểu dữ liệu bao gồm ba yếu tố sau:
Cỏc thuộc tớnh: xỏc ủịnh cỏc ủối tượng dữ liệu thuộc
kiểu
Cỏc giỏ trị: mà cỏc ủối tượng dữ liệu thuộc kiểu cú thể
ủược gỏn cho
Cỏc tỏc vụ: cỏc thao tỏc cú thể cú trờn cỏc ủối tượng dữ
liệu thuộc kiểu
21
Kiểu dữ liệu
Kiểu dữ liệu là một tập hợp cỏc éTDL và tập hợp
cỏc phộp toỏn thao tỏc trờn cỏc éTDL ủú.
VD -int là valid và -string là invalid
Cỏc kiểu dữ liệu nguyờn thuỷ (primitive types)
Số : Int, Real (float point), decimal
Char (character)
Boolean (Pascal)
22
Kiểu dữ liệu (tt)
Kiểu dữ liệu cú cấu trỳc (or composite types)
Records (Struct)
Variant Records (Unions)
Arrays
Strings
Pointers
Lists (Perl)
Files
Kiểu do người dựng ủinh nghĩa, VD boolean trong C
23
Khai bỏo kiểu
Khai bỏo là một phỏt biểu trong chương trỡnh
dựng ủể chuyển tới bộ dịch, thụng tin về số lượng,
kiểu của éTDL và tờn ủối tượng dữ liệu; cần thiết
trong quỏ trỡnh thực hiện chương trỡnh
Sự khai bỏo cú thể chỉ rừ thời gian tồn tại của
éTDL
Một số NNLT khụng cần khai bỏo biến trước khi
sử dụng
Ưu ủiểm : mềm dẽo, khuyết ủiểm : khú quản lý
24
Ưu ủiểm của kiểu dữ liệu
Cung cấp ngữ cảnh hoàn hảo (implicit context)
cho cỏc tỏc vụ, do ủú programmer khụng cần chỉ
ra ngữ cảnh cụ thể cho cỏc tỏc vụ
Cho phộp trỡnh biờn dịch phỏt hiện toàn bộ cỏc lỗi
thụng thường của programmer
Kiểm tra kiểu khụng thể ngăn ngừa hết cỏc tỏc vụ vụ
nghĩa
25
Kiểm tra kiểu
Kiểm tra kiểu là kiểm tra xem mỗi tỏc vụ ủược
thực hiện cú nhận ủược ủối số thớch hợp thuộc
kiểu dữ liệu thớch hợp khụng.
Cựng kiểu (Type Equivalence): khi hai giỏ trị cú
cựng kiểu hay khụng?
Sự tương thớch kiểu (Type Compatibility): khi giỏ
trị của kiểu A ủược dựng trong phạm của kiểu B
hay khụng?
Sự quy nạp kiểu (Type Inference): kiểu thức cú
kiểu gỡ, hoặc phộp toỏn trả kiểu gỡ?
26
Kiểm tra kiểu (tt)
Cỏc luật kiểm tra kiểu
Kiểu của cỏc biến : int, double, hoặc boolean
Biểu thức toỏn :
Tham biến (arguments) : int hoặc double
Kết quả : integer nếu cỏc ủối số là integer và double, ngoặc
ngược lại
Biểu thức quan hệ
Tham biến (arguments) : integer hoặc double
Kết quả : lý luận (boolean)
Phộp gỏn : biến và biểu thức ủước gỏn phải cú cựng
kiểu
If và While, etc : kiểu của ủiều kiện phải là boolean
27
Kiểm tra kiểu: ủộng và tĩnh
Kiểm tra kiểu ủộng : kiểm tra kiểu ủược thực hiện
trong khi thực hiện chương trỡnh
Sử dụng ủuụi kiểu (type tag) ủược lưu trong từng
ðTDL
VD: ðTDL kiểu số nguyờn sẽ chứa cả giỏ trị số nguyờn
và ủuụi kiểu ‘integer’
Cỏc ngụn ngữ SNOLBOL4, LISP và APL ủũi hỏi kiểm
tra kiểu ủộng
Ưu ủiểm: linh hoạt (khụng cần khai bỏo kiểu, kiểu của
cỏc biến cú thể thay ủổi trong khi chạy nếu cần thiết)
Khuyết ủiểm: cú thể sút lỗi về kiểu, khú debug, tốn
nhiều bộ nhớ, tốc ủộ chương trỡnh chậm lại
28
Kiểm tra kiểu: tĩnh
Kiểm tra kiểu tĩnh: chương trỡnh dịch sẽ kiểm
tra kiểu lỳc dịch
ðũi hỏi cỏc thụng tin:
ðối với mỗi tỏc vụ: số lượng, thứ tự và kiểu dữ liệu của
cỏc ủối số và kết quả
ðối với mỗi tờn biến: kiểu của ðTDL cú tờn biến ủú
ðối với mỗi hằng: kiểu của ðTDL cú tờn hằng ủú
Ưu ủiểm: kiểm tra tất cả cỏc tỏc vụ, khụng cần ủuụi
kiểu, chương trỡnh chạy nhanh hơn
Khuyết ủiểm: khụng mền dẻo
29
Kiểm tra kiểu: mạnh và yếu
Kiểm tra kiểu mạnh: NNLT khụng cho phộp
cỏc tỏc vụ mà dữ liệu khụng tương thớch
nhau
Kiểm tra kiểu yếu : Cho phộp thực hiện chuyển
kiểu dữ liệu một cỏch tự ủộng
VD
NN C Int A; double B; B = 10.1; A = B; valid
NN C++ Int A; double B; B = 10.1; A = B; Warning
30
Thụng tin về kiểm tra kiểu vài NN
x√Common Lisp
√√Pascal/Modula/Ada
x√Python
xxPerl
√xC
√√C++/C#/Java
Kiểm tra tĩnhKiểm tra mạnh
31
Chuyển kiểu (convertion)
Nếu khụng cú sự thương thớch kiểu lỳc kiểm tra
kiểu, NNLT thực hiện một trong hai tỏc vụ sau
Sự khụng tương thớch kiểu sẽ bị bỏo lỗi hoặc
Một sự chuyển ủổi kiểu tự ủộng ủược thi hành ủể
chuyển ủổi kiểu
Hầu hết NNLT ủều cung cấp 2 cỏch chuyển kiểu
Tập hợp cỏc hàm ủể chuyển kiểu. VD, Pascal cú hàm
Round
Sự chuyển kiểu ngầm (thực hiện ngầm). VD int = int +
double;
32
Chuyển kiểu (tt)
Chuyển kiểu chỉ thực hiện ủược giữa cỏc kiểu gần
nhau :
Int to float và ngược lại
Enum to Int và ngược lại
subclass to base class
Nonconverting Cast: giữa 2 kiểu cú cựng kớch
thước lưu trữ
Pointer to integer
Integer or enum to pointer
Giữa 2 pointer trỏ tới 2 ủối tượng khỏc kiểu
Giữa 2 pointer trỏ tới 2 hàm khỏc kiểu
33
Sự tương hợp kiểu
Hai kiểu T1 và T2 tương hợp nếu ðTDL kiểu T1
cú thể xuất hiện ở vị trớ của ðTDL kiểu T2 và
ngược lại:
Cú thể gỏn ðTDL T1 cho ðTDL T2 và ngược lại
Hai qui tắc xỏc ủịnh tương hợp
Tương ủương tờn
Tương ủơn cấu trỳc
Type T1=array[1..20] of integer
T2=array[1..20] of integer
34
35
36
Kiểu dữ liệu cơ bản
Kiểu số
Số nguyờn (integer, int)
Số thực dấu chấm ủộng (floating-point real)
Kiểu logic (Boolean)
Kiểu ký tự (char or character)
37
Kiểu số nguyờn
Số nguyờn dài/ngắn, VD Java : byte, short, int, long; với
C : short, int, long
Số nguyờn cú dấu (signed) hoặc khụng dấu; bit bờn trỏi
miờu tả dấu 0: positive; 1 negative
Cỏc phộp toỏn
BinOp(Binary operations) : +, -, x, /, mod
UnaryOp : õm (-), dương (+)
RelOp (relational Operations) : equal, not equal, less-than,
greater-than, less-than-or-equal
BitOp (Bit Operations) : and (&), or (|), shif bits (<<)
10010101010011101101001110101011
38
Số thực dấu chấm ủộng
Dóy số cú thứ tự từ một số õm nhỏ nhất tới một số
lớn nhất ủược xỏc ủịnh trước, nhưng dấu phẩy
thập phõn khụng cố ủịnh
VD 1.234567, 123456.7, 0.00001234567
Hai thành phần biểu diễn giỏ trị của số thực trong
ụ nhớ : phần ủịnh trị (mantissa) và phần mũ
(exponent)
Single : 1 bit dấu, 23 bits phần trị, 8 bits mũ
double : 1 bit dấu, 53 bits phần trị, 10 bits mũ
10010101010011101101001110101011Single Float
39
Số thực dấu chấm cố ủịnh
ðược biểu diễn bằng một chuỗi cỏc chữ số cú
chiều dài cố ủịnh
Cú dấu chấm thập phõn phõn cỏch phần nguyờn
và phần lẻ
VD khai bỏo trong COBOL: X picture 999 v 99
ðược lưu trữ ở dạng nhị phõn biểu diễn trị số của
phần nguyờn và phần lẻ
1 00101010 100111..010011
Phần nguyờn Phần lẻ
40
Kiểu lý luận (logic)
Kiểu logic chỉ nhận 2 giỏ trị : ủỳng (TRUE) và sai
(FALSE)
Trong Pascal, boolean ủược xem là kiểu liệt kờ,
Boolean = (FALSE, TRUE) và FALSE<TRUE
Trong Pascal : type Boolean = (FALSE, TRUE)
Trong C : typedef enum {FALSE=0, TRUE} Boolean;
Cỏc phộp toỏn logic : AND, OR, NOT
Kiểu logic chỉ dựng duy nhất 1 bit ủể biểu diễn
giỏ trị 0 = FALSE, 1 = TRUE
41
Kiểu ký tự
Kiểu ký tự ủược lưu trong mỏy tớnh ở dạng mó số
Mó số này ủược lưu trữ trong 8-bits (ASCII)
Bảng mó Unicode (16 bit) ủược ủưa vào Java, C#
Cỏc phộp toỏn
Cỏc phộp toỏn quan hệ (relational operations)
Phộp gỏn
42
Kiểu do người dựng ủịnh nghĩa
Kiểu liệt kờ (Set)
Kiểu miền con số nguyờn (subrange)
43
Kiểu liệt kờ
NNLT Pascal và Ada cho phộp người dựng ủặt ra
kiểu dữ liệu bằng cỏch liệt kờ cỏc giỏ trị của kiểu
ủú
VD type NGAY = (CN, Hai, Ba, Tu, Nam, Sau, Bay);
Giỏ trị của ðTDL kiểu liệt kờ ủược biểu diễn
bằng cỏc số nguyờn : 0,1,2,
VD kiểu NGAY cần sử dụng 7 giỏ trị từ 0 ủến 6 :
Lợi ớch của kiểu liệt kờ: tăng khả năng dễ ủọc và
tớnh dễ viết và ủộ tin cậy của ngụn ngữ.
44
Miền con của số nguyờn
Kiểu dữ liệu mà tập cỏc giỏ trị là một dóy cỏc giỏ
trị nguyờn trong một khoảng giới hạn ủó ủịnh.
VD A : 1..10 (Pascal); A : Integer Rang 1..10 (Ada)
Lợi ớch của kiểu miền con
Tiết kiệm ụ nhớ về mặt lưu trữ. VD miền con 1..10 chỉ
yờu cầu 4 bits cỏc giỏ trị trong miền con
Dể kiểm tra kiểu hơn số nguyờn. VD Month: 1..12, thi
lệnh gỏn Month=0 là khụng hợp lệ
45
Kiểu dữ liệu cú cấu trỳc
Móng
Mẫu tin
String
Pointer
Tập tin
46
Móng : một chiều (vector)
Móng một chiều: ðTDL bao gồm một số cố ủịnh
cỏc phần tử cú kiểu giống nhau ủược tổ chức
thành một dóy tuần tự.
Cỏc thuộc tớnh của móng 1 chiều
Số lượng cỏc phần tử
Kiểu dữ liệu của mỗi một phần tử
Chỉ số của mỗi phần tử, VD trong Pascal
var myArray: array[-10..10] of integer; chỉ số -10..10
trong C: int myArray[20]; chỉ số 0..19
47
Móng : một chiều (tt)
Cỏc phộp toỏn
Lựa chọn 1 phần tử [], VD myArray[4]
Cỏc phộp toỏn khỏc : gỏn 2 móng, cỏc phộp toỏn số học
trờn từng cập 2 móng cú cựng kớch thước
Sự khởi tạo móng, trong C
Int list [] = {4,5,7,83}; char name[] = ôNoNameằ;
Hầu hết cỏc NNLT cấp phỏt cỏc phần tử của
móng liờn tục trong bụ nhớ
48
Móng : một chiều (tt)
Kiểu dữ liệu
Cận dưới của tập chỉ số
Cận trờn của tập chỉ số
Kiểu dữ liệu của cỏc phần tử
Kớch thước của mỗi phần tử
myArray
LB
UB
Kiểu phần tử
E
myArray[LB]
myArray[UB]
Bộ mụ tả
Bộ nhớ cho
cỏc phần tử
LB : Low subscript bound
UB: Upper subscript bound
49
Móng 2 hoặc nhiều chiều
Móng 2 chiều là móng của móng 1 chiều; móng 3
chiều là móng của móng 2 chiều.
Móng n chiều cú n tập cỏc phần tử
Pascal myArray array[a..b,c..d] of real;
C float myArray[b-a][d-c];
Sự biểu diễn bộ nhớ
Lưu trữ theo trật tự dũng (C, C++, C#)
Lưu trữ theo trật tự cột (Fortran)
Lưu trữ theo pointer của dũng (Java)
50
Móng 2 hoặc nhiều chiều (tt)
51
Mẫu tin
ðTDL cho phộp chứa 1 số nhất ủịnh cỏc phần tử
cú kiểu khỏc nhau
Cú nhiều thuật ngữ khỏc nhau
Algol 68, C, C++, and Common Lisp: struct
Java, C++, C#: class
Pascal: record
Cỏc thuộc tớnh
Số phần tử, kiểu của cỏc phần tử
Tờn phần tử
52
Mẫu tin (tt)
VD
53
Mẫu tin cú cấu trỳc thay ủổi
type PayType = (Salaried, hourly)
Var Employee: record
ID : integer;
Dept : array [1..3] of char;
Age : integer
case Payclass: Paytype of
Salaried : (MonthRate : real;
StartDate : integer);
Hourly: (HourRate : real;
Reg : integer;
Overtime : integer;
end
54
Mẫu tin cú cấu trỳc thay ủổi (tt)
ID
Dept
Age
PayClass
MonthlyRate
StartDate
Overtime
HourRate
Reg
PayClass = Salaried PayClass = Hourly
55
Kiểu chuỗi ký tự
Chuỗi ký tự là móng của cỏc ký tự, nhưng cú
thờm cỏc tỏc vụ khỏc mà cỏc móng khỏc khụng cú
C, Pascal, Ada yờu cầu chiều dài của chuỗi giỏ trị
khụng vượt quỏ một giới hạn ủó ủược khai bỏo
Lisp, Java, C# cho phộp thay ủổi chiều dài của
biến cú kiểu chuỗi ký tự
SNOBOL4 khụng giới hạn chiều dài của biến
kiểu chuỗi
56
Kiểu chuỗi ký tự (tt)
Cỏc phộp toỏn
Phộp nối kết, Pascal sử dụng toỏn tử ô+ằ
Cỏc phộp toỏn quan hệ thụng thường : bằng, lớn hơn,
nhỏ hơn
Chọn chuỗi con bằng chỉ số vị trớ, VD Fortran str(6:10)
Chọn chuỗi con bằng so mẫu (substr của C)
ðịnh dạng xuất / nhập
57
Con trỏ (pointer)
Cấp phỏt bộ nhớ (cấp phỏt) là dành riờng cỏc ụ
nhớ cho CT sử dụng
Cấp phỏt tĩnh là sự cấp phỏt ụ nhớ cho ðTDL
ủược thực hiện trong qua trỡnh dịch
Ưu ủiểm : dể sử dụng
Nhược ủiểm : khụng tối ưu
Cấp phỏt ủộng là cấp phỏt lỳc thực hiện CT
Ưu ủiểm : sử dụng bộ nhớ 1 cỏch tối ưu
Nhược ủiểm : người dựng phải tự quản lý
58
Con trỏ (tt)
Con trỏ là ðTDL chứa ủịa chỉ khối ụ nhớ ủược
cấp phỏt ủộng
ễ nhớ cấp phỏt ủộng ủược tham chiếu bằng con
trỏ
ðặt tả thuộc tớnh
Con trỏ chỉ cú thể tham chiếu ủến cỏc ðTDL cựng kiểu
(Pascal, Ada)
Con trỏ cú thể tham chiếu tới cỏc éTDL cú kiểu nhau
khỏc
59
Con trỏ (tt)
Cỏc phộp toỏn
Cấp phỏt ụ nhớ ủộng
C++: int *x = new int;
C: int *x = (int *) malloc(sizeof(int));
Java: BankAccount b = new BankAccount(0);
Truy xuất ụ nhớ
*x = *x + 1;
Thu hồi ụ nhớ
C++: delete x;
C: free(x);
60
Con trỏ - kiểu ủệ qui
struct IntList{
int data;
struct IntList next;
};
struct IntList{
int data;
struct IntList *next;
};
Yờu cầu con trỏ cuối trỏ ủến NULL ủể kết thỳc
61
Tập tin
Tập tin cú 2 thuộc tớnh : lưu trữ trong bộ nhớ
ngoài và thời gian tồn tại lõu
Tập tin cú thể ủược truy nhập theo một trong hai
mode: READ hoặc WRITE
Cỏc phộp toỏn chủ yếu ủối với tập tin
Mở tập tin
ðọc tập tin
Ghi tập tin
ðúng tập tin
62
Tập tin : Pascal
Khai bỏo biến tập tin
= FILE OF ;
Mở tập tin :
RESET(biếnTậpTin)
ðọc tập tin:
READ(biếnTậpTin, b1, b2, ..., bN)
Ghi tập tin :
WRITE(biếnTậpTin, b1, b2, ..., bN):
ðúng tập tin
CLOSE(biếnTậpTin)
63
Tận tin : C
Khai bỏo biến tập tin
FILE *
Mở tập tin
FP = fopen("filename","mode"); mode : r, w, a, rw
ðọc tập tin
fread (ptr,size,n,FP); char *ptr; int n,size;
Ghi tập tin
Fwrite (ptr,size,n,FP); char *ptr; int n,size;
ðúng tập tin
Fclose (FN)
File đính kèm:
bai_giang_nguyen_ly_ngon_ngu_lap_trinh_chuong_2_kieu_du_lieu.pdf



