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à ...

pdf63 trang | Chia sẻ: havih72 | Lượt xem: 298 | Lượt tải: 0download
Nội dung tài liệu 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ải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
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:

  • pdfbai_giang_nguyen_ly_ngon_ngu_lap_trinh_chuong_2_kieu_du_lieu.pdf