Chươ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

1

Bits và giá trị (values)

10010101010011101101001110101011

Signed Integer

10010101010011101101001110101011

Unsigned Integer

10010101010011101101001110101011

Address

10010101010011101101001110101011

String

10010101010011101101001110101011

Single Float

10010101010011101101001110101011

2

Nội dung chính của chương

3

(cid:1) Giới thiệu kiểu dữ liệu (cid:1) Kiểu dữ liệu cơ bản (cid:1) Kiểu do người dùng ñịnh nghĩa (cid:1) Kiểu dữ liệu có cấu trúc

Dữ liệu (data)

(cid:2) ðược lưu trữ ở bộ nhớ (cid:2) ðược tổ chức thành dạng bits, bytes, words

(cid:1) Dữ liệu / máy tính

(cid:2) ðược tổ chức phức tạp: số, chuỗi ký tự, các mảng,

ngăn xếp, …

(cid:2) 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

(cid:2) VD Int = {- 231 … 0 … 231 }

4

(cid:1) Dữ liệu / NNLT

ðối tượng dữ liệu

5

(cid:1) 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 (cid:1) 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

Phân loại ñối tượng dữ liệu

(cid:2) ðTDL sơ cấp: chứa một giá trị dữ liệu ñơn (cid:2) ðTDL có cấu trúc: tập hợp của các dữ liệu khác (cid:2) VD!

(cid:1) Phân loại dựa trên cấu trúc: 2 loại

(cid:2) ðTDL tường minh: do người dùng khai báo như biến,

hằng…)

(cid:2) ð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

6

(cid:1) Phân loại trên nguồn gốc: 2 loại

Thuộc tính của ðTDL

trưng của ðTDL ñó

(cid:1) Thuộc tính của một ðTDL là một tính chất ñặc

biệt ðTDL này với ðTDL khác.

(cid:1) Mỗi ÐTDL có một tập hợp các thuộc tính ñể phân

kiểu dữ liệu (cid:2) VD Int: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

(cid:1) Các ðTDL sơ cấp có một thuộc tính duy nhất là

7

(cid:1) 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

Giá trị dữ liệu (GTDL)

(cid:1) 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 ñó.

ñược biểu diễn bởi một khối ô nhớ. (cid:2) 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

(cid:1) GTDL ñược biểu diễn bởi 1 dãy các bits, ðTDL

các GTDL của các phần tử của ðTDL ñó.

8

(cid:1) GTDL của một ðTDL có cấu trúc là một tập hợp

Thời gian tồn tại của ðTDL

(cid:1) 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

cho ñến khi nó bị hủy bỏ

9

(cid:1) Thời gian này ñược tính từ khi ÐTDL ñược tạo ra

Biến và hằng

(cid:2) ÐTDL ñược ñịnh nghĩa và ñặt tên một cách tường

minh

(cid:2) Biến là cách trù tượng hóa một hoặc nhiều ô nhớ (cid:2) Thuộc tính : name, address, value, type, lifetime, scope

(cid:1) Biến

(cid:2) Ð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ó

(cid:2) VD!

10

(cid:1) Hằng

Phạm vi của biến (Scope)

(cid:1) Phạm vi của biến là vùng mà biến có thể trông thấy ñược (cid:1) Phạm vi tĩnh (static scope or block) : C, C++, Java & C#

void sub(){ int count; … while (…) { int count; count++;

}

}

11

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);

}

12

Phạm vi của biến (tt)

(cid:1) 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;

13

Procedure Sub2 is X: integer; Begin … End Begin … End

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();

14

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)

15

Scope VS Lifetime của biến

(cid:2) 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 (cid:1) Nhưng scope và lifetime hoàn toàn không tương

tự nhau (cid:2) Scope là khái niện liên quan ñến không gian (cid:2) Lifetime là khái niện liên quan ñến thời gian

16

(cid:1) ðôi khi scope và lifetime là tương tự nhau

Các liên kết (binding)

trong thời gian tồn tại của nó

(cid:1) Một ÐTDL có thể tham gia vào nhiều mối liên kết

và trả CT con

(cid:2) ðTDL với ðTDL (component): giá trị của pointer và

pointer có thể bị thay ñổi do thay ñổi pointer

(cid:2) ðTDL và ô nhớ: trình quản lý bộ nhớ (routine) thiết lập

17

(cid:1) Các mối liên kết phổ biến (cid:2) ðTDL với GTDL: phép gán (cid:2) ðTDL với 1 hoặc nhiều tên tham chiếu: khai báo, gọi

ðặt tên (names)

(cid:2) Có phân biệt ký tự HOA và thường không? (cid:2) Từ khóa gồm những từ nao?

(cid:1) Cách ñặt tên : biến, hằng và hàm

(cid:2) Fortran cho phép tối ña 31 (cid:2) C99 chấp nhận 63 ký tự ñầu tiên (cid:2) Java không giới hạn ñộ dài

(cid:1) Chiều dài tối ña của tên

cái, các số và «_» ñể ñặt tên

18

(cid:1) Hầu hết các NNLT ñều cho phép dùng các chữ

ðặt tên (names) (tt)

giữa 2 từ. VD myStack

(cid:1) Vài NNLT dùng khái niện «camel» : ký tự HOA

(case sensitive). VD rose, ROSE và Rose

(cid:1) C, C++, Java phân biệt giữa chữ hoa chữ thường

tình huống ñặc biệt

(cid:1) Từ khóa trong từng NNLT ñược dùng trong các

tên biến, tên hằng, tên hàm, etc

19

(cid:1) Không ñược dùng từ khóa ñể ñặt tên, chẳng hạn

ðặc tả kiểu dữ liệu

(cid:2) Các thuộc tính: xác ñịnh các ñối tượng dữ liệu thuộc

kiểu

(cid:2) Các giá trị: mà các ñối tượng dữ liệu thuộc kiểu có thể

ñược gán cho

(cid:2) 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

20

(cid:1) ðặc tả kiểu dữ liệu bao gồm ba yếu tố sau:

Kiểu dữ liệu

các phép toán thao tác trên các ÐTDL ñó. (cid:2) VD -int là valid và -string là invalid

(cid:1) Kiểu dữ liệu là một tập hợp các ÐTDL và tập hợp

(cid:2) Số : Int, Real (float point), decimal (cid:2) Char (character) (cid:2) Boolean (Pascal)

21

(cid:1) Các kiểu dữ liệu nguyên thuỷ (primitive types)

Kiểu dữ liệu (tt)

(cid:2) Records (Struct) (cid:2) Variant Records (Unions) (cid:2) Arrays (cid:2) Strings (cid:2) Pointers (cid:2) Lists (Perl) (cid:2) Files (cid:2) Kiểu do người dùng ñinh nghĩa, VD boolean trong C

22

(cid:1) Kiểu dữ liệu có cấu trúc (or composite types)

Khai báo kiểu

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

(cid:1) Khai báo là một phát biểu trong chương trình

ÐTDL

(cid:1) Sự khai báo có thể chỉ rõ thời gian tồn tại của

sử dụng (cid:2) Ưu ñiểm : mềm dẽo, khuyết ñiểm : khó quản lý

23

(cid:1) Một số NNLT không cần khai báo biến trước khi

Ưu ñiểm của kiểu dữ liệu

(cid:1) 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ụ

thông thường của programmer (cid:2) Kiểm tra kiểu không thể ngăn ngừa hết các tác vụ vô

nghĩa

24

(cid:1) Cho phép trình biên dịch phát hiện toàn bộ các lỗi

Kiểm tra kiểu

(cid:1) 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 hay không?

(cid:1) Cùng kiểu (Type Equivalence): khi hai giá trị có

(cid:1) 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?

kiểu gì, hoặc phép toán trả kiểu gì?

25

(cid:1) Sự quy nạp kiểu (Type Inference): kiểu thức có

Kiểm tra kiểu (tt)

(cid:2) Kiểu của các biến : int, double, hoặc boolean (cid:2) Biểu thức toán :

(cid:1) Tham biến (arguments) : int hoặc double (cid:1) Kết quả : integer nếu các ñối số là integer và double, ngoặc

ngược lại (cid:2) Biểu thức quan hệ

(cid:1) Tham biến (arguments) : integer hoặc double (cid:1) Kết quả : lý luận (boolean)

(cid:2) Phép gán : biến và biểu thức ñước gán phải có cùng

kiểu

(cid:2) If và While, etc : kiểu của ñiều kiện phải là boolean

26

(cid:1) Các luật kiểm tra kiểu

Kiểm tra kiểu: ñộng và tĩnh

(cid:1) 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 (cid:2) Sử dụng ñuôi kiểu (type tag) ñược lưu trong từng

ðTDL

(cid:2) VD: ðTDL kiểu số nguyên sẽ chứa cả giá trị số nguyên

và ñuôi kiểu ‘integer’

(cid:2) Các ngôn ngữ SNOLBOL4, LISP và APL ñòi hỏi kiểm

tra kiểu ñộng

(cid:2) Ư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) (cid:2) 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

27

Kiểm tra kiểu: tĩnh

(cid:1) Kiểm tra kiểu tĩnh: chương trình dịch sẽ kiểm

tra kiểu lúc dịch (cid:2) ðòi hỏi các thông tin:

(cid:1) ðố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ả

(cid:1) ðối với mỗi tên biến: kiểu của ðTDL có tên biến ñó (cid:1) ðối với mỗi hằng: kiểu của ðTDL có tên hằng ñó (cid:2) Ư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

(cid:2) Khuyết ñiểm: không mền dẻo

28

Kiểm tra kiểu: mạnh và yếu

(cid:1) 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

(cid:1) 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 (cid:2) VD

(cid:1) NN C Int A; double B; B = 10.1; A = B; valid (cid:1) NN C++ Int A; double B; B = 10.1; A = B; Warning

29

Thông tin về kiểm tra kiểu vài NN

Kiểm tra tĩnh

C++/C#/Java

C

Perl

Python

Pascal/Modula/Ada

Common Lisp

√ √ x x √ x

Kiểm tra mạnh √ x x √ √ √

30

Chuyển kiểu (convertion)

chuyển ñổi kiểu

(cid:1) 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 (cid:2) Sự không tương thích kiểu sẽ bị báo lỗi hoặc (cid:2) Một sự chuyển ñổi kiểu tự ñộng ñược thi hành ñể

Round

(cid:2) Sự chuyển kiểu ngầm (thực hiện ngầm). VD int = int +

double;

31

(cid:1) Hầu hết NNLT ñều cung cấp 2 cách chuyển kiểu (cid:2) Tập hợp các hàm ñể chuyển kiểu. VD, Pascal có hàm

Chuyển kiểu (tt)

nhau : (cid:2) Int to float và ngược lại (cid:2) Enum to Int và ngược lại (cid:2) subclass to base class

(cid:1) Chuyển kiểu chỉ thực hiện ñược giữa các kiểu gần

thước lưu trữ (cid:2) Pointer to integer (cid:2) Integer or enum to pointer (cid:2) Giữa 2 pointer trỏ tới 2 ñối tượng khác kiểu (cid:2) Giữa 2 pointer trỏ tới 2 hàm khác kiểu

32

(cid:1) Nonconverting Cast: giữa 2 kiểu có cùng kích

Sự tương hợp kiểu

(cid:1) 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: (cid:2) Có thể gán ðTDL T1 cho ðTDL T2 và ngược lại

(cid:2) Tương ñương tên (cid:2) Tương ñơn cấu trúc

(cid:1) Type T1=array[1..20] of integer T2=array[1..20] of integer

33

(cid:1) Hai qui tắc xác ñịnh tương hợp

34

35

Kiểu dữ liệu cơ bản

(cid:2) Số nguyên (integer, int) (cid:2) Số thực dấu chấm ñộng (floating-point real)

(cid:1) Kiểu số

36

(cid:1) Kiểu logic (Boolean) (cid:1) Kiểu ký tự (char or character)

Kiểu số nguyên

(cid:1) Số nguyên dài/ngắn, VD Java : byte, short, int, long; với

C : short, int, long

(cid:1) 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

10010101010011101101001110101011

(cid:1) Các phép toán

(cid:2) BinOp(Binary operations) : +, -, x, /, mod (cid:2) UnaryOp : âm (-), dương (+) (cid:2) RelOp (relational Operations) : equal, not equal, less-than,

greater-than, less-than-or-equal

(cid:2) BitOp (Bit Operations) : and (&), or (|), shif bits (<<)

37

Số thực dấu chấm ñộng

(cid:1) 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 (cid:2) VD 1.234567, 123456.7, 0.00001234567

ô nhớ : phần ñịnh trị (mantissa) và phần mũ (exponent) (cid:2) Single : 1 bit dấu, 23 bits phần trị, 8 bits mũ (cid:2) double : 1 bit dấu, 53 bits phần trị, 10 bits mũ

Single Float

10010101010011101101001110101011

38

(cid:1) Hai thành phần biểu diễn giá trị của số thực trong

Số thực dấu chấm cố ñịnh

chiều dài cố ñịnh

(cid:1) ðược biểu diễn bằng một chuỗi các chữ số có

và phần lẻ

(cid:1) Có dấu chấm thập phân phân cách phần nguyên

phần nguyên và phần lẻ

1 00101010 100111…..010011

Phần nguyên

Phần lẻ

39

(cid:1) VD khai báo trong COBOL: X picture 999 v 99 (cid:1) ðược lưu trữ ở dạng nhị phân biểu diễn trị số của

Kiểu lý luận (logic)

(FALSE)

(cid:1) Kiểu logic chỉ nhận 2 giá trị : ñúng (TRUE) và sai

(cid:1) Trong Pascal, boolean ñược xem là kiểu liệt kê, Boolean = (FALSE, TRUE) và FALSE

giá trị 0 = FALSE, 1 = TRUE

40

(cid:1) Các phép toán logic : AND, OR, NOT (cid:1) Kiểu logic chỉ dùng duy nhất 1 bit ñể biểu diễn

Kiểu ký tự

(cid:2) Các phép toán quan hệ (relational operations) (cid:2) Phép gán

41

(cid:1) Kiểu ký tự ñược lưu trong máy tính ở dạng mã số (cid:1) Mã số này ñược lưu trữ trong 8-bits (ASCII) (cid:1) Bảng mã Unicode (16 bit) ñược ñưa vào Java, C# (cid:1) Các phép toán

Kiểu do người dùng ñịnh nghĩa

42

(cid:1) Kiểu liệt kê (Set) (cid:1) Kiểu miền con số nguyên (subrange)

Kiểu liệt kê

(cid:1) 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 ñó (cid:2) VD type NGAY = (CN, Hai, Ba, Tu, Nam, Sau, Bay);

bằng các số nguyên : 0,1,2,… (cid:2) VD kiểu NGAY cần sử dụng 7 giá trị từ 0 ñến 6 : (cid:1) 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ữ.

43

(cid:1) Giá trị của ðTDL kiểu liệt kê ñược biểu diễn

Miền con của số nguyên

(cid:1) 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. (cid:2) VD A : 1..10 (Pascal); A : Integer Rang 1..10 (Ada)

(cid:2) 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

(cid:2) 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ệ

44

(cid:1) Lợi ích của kiểu miền con

Kiểu dữ liệu có cấu trúc

45

(cid:1) Mãng (cid:1) Mẫu tin (cid:1) String (cid:1) Pointer (cid:1) Tập tin

Mãng : một chiều (vector)

(cid:1) 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ự.

(cid:2) Số lượng các phần tử (cid:2) Kiểu dữ liệu của mỗi một phần tử (cid:2) 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

46

(cid:1) Các thuộc tính của mãng 1 chiều

Mãng : một chiều (tt)

(cid:2) Lựa chọn 1 phần tử [], VD myArray[4] (cid:2) 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

(cid:1) Các phép toán

Int list [] = {4,5,7,83}; char name[] = «NoName»; (cid:1) 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ớ

47

(cid:1) Sự khởi tạo mãng, trong C

Mãng : một chiều (tt)

myArray

Kiểu dữ liệu

Cận dưới của tập chỉ số

LB

Bộ mô tả

Cận trên của tập chỉ số

Kiểu dữ liệu của các phần tử

UB Kiểu phần tử E

Kích thước của mỗi phần tử

myArray[LB]

Bộ nhớ cho các phần tử

LB : Low subscript bound

myArray[UB]

UB: Upper subscript bound

48

Mãng 2 hoặc nhiều chiều

chiều là mãng của mãng 2 chiều. (cid:1) Mãng n chiều có n tập các phần tử

(cid:2) Pascal myArray array[a..b,c..d] of real; (cid:2) C float myArray[b-a][d-c];

(cid:1) Mãng 2 chiều là mãng của mãng 1 chiều; mãng 3

(cid:2) Lưu trữ theo trật tự dòng (C, C++, C#) (cid:2) Lưu trữ theo trật tự cột (Fortran) (cid:2) Lưu trữ theo pointer của dòng (Java)

49

(cid:1) Sự biểu diễn bộ nhớ

Mãng 2 hoặc nhiều chiều (tt)

50

Mẫu tin

có kiểu khác nhau

(cid:1) ðTDL cho phép chứa 1 số nhất ñịnh các phần tử

(cid:2) Algol 68, C, C++, and Common Lisp: struct (cid:2) Java, C++, C#: class (cid:2) Pascal: record (cid:1) Các thuộc tính

(cid:2) Số phần tử, kiểu của các phần tử (cid:2) Tên phần tử

51

(cid:1) Có nhiều thuật ngữ khác nhau

Mẫu tin (tt)

(cid:1) VD

52

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

53

Mẫu tin có cấu trúc thay ñổi (tt)

ID

Dept

Age

PayClass

HourRate

MonthlyRate

StartDate

Reg

Overtime

PayClass = Salaried

PayClass = Hourly

54

Kiểu chuỗi ký tự

thêm các tác vụ khác mà các mãng khác không có (cid:1) 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 (cid:1) Lisp, Java, C# cho phép thay ñổi chiều dài của

biến có kiểu chuỗi ký tự

(cid:1) Chuỗi ký tự là mãng của các ký tự, nhưng có

kiểu chuỗi

55

(cid:1) SNOBOL4 không giới hạn chiều dài của biến

Kiểu chuỗi ký tự (tt)

(cid:2) Phép nối kết, Pascal sử dụng toán tử «+» (cid:2) Các phép toán quan hệ thông thường : bằng, lớn hơn,

nhỏ hơn

(cid:2) Chọn chuỗi con bằng chỉ số vị trí, VD Fortran str(6:10) (cid:2) Chọn chuỗi con bằng so mẫu (substr của C) (cid:2) ðịnh dạng xuất / nhập

56

(cid:1) Các phép toán

Con trỏ (pointer)

nhớ cho CT sử dụng

(cid:1) Cấp phát bộ nhớ (cấp phát) là dành riêng các ô

ñược thực hiện trong qua trình dịch (cid:2) Ưu ñiểm : dể sử dụng (cid:2) Nhược ñiểm : không tối ưu

(cid:1) Cấp phát tĩnh là sự cấp phát ô nhớ cho ðTDL

(cid:2) Ưu ñiểm : sử dụng bộ nhớ 1 cách tối ưu (cid:2) Nhược ñiểm : người dùng phải tự quản lý

57

(cid:1) Cấp phát ñộng là cấp phát lúc thực hiện CT

Con trỏ (tt)

cấp phát ñộng

(cid:1) Con trỏ là ðTDL chứa ñịa chỉ khối ô nhớ ñược

trỏ

(cid:1) Ô nhớ cấp phát ñộng ñược tham chiếu bằng con

(cid:2) Con trỏ chỉ có thể tham chiếu ñến các ðTDL cùng kiểu

(Pascal, Ada)

(cid:2) Con trỏ có thể tham chiếu tới các ÐTDL có kiểu nhau

khác

58

(cid:1) ðặt tả thuộc tính

Con trỏ (tt)

(cid:2) Cấp phát ô nhớ ñộng

C++: int *x = new int; C: int *x = (int *) malloc(sizeof(int)); Java: BankAccount b = new BankAccount(0);

(cid:2) Truy xuất ô nhớ *x = *x + 1; (cid:2) Thu hồi ô nhớ C++: delete x; C: free(x);

59

(cid:1) Các phép toán

Con trỏ - kiểu ñệ qui

int data; struct IntList next;

};

(cid:1) struct IntList{

int data; struct IntList *next;

};

(cid:1) struct IntList{

60

(cid:1) Yêu cầu con trỏ cuối trỏ ñến NULL ñể kết thúc

Tập tin

ngoài và thời gian tồn tại lâu

(cid:1) Tập tin có 2 thuộc tính : lưu trữ trong bộ nhớ

mode: READ hoặc WRITE

(cid:1) Tập tin có thể ñược truy nhập theo một trong hai

(cid:2) Mở tập tin (cid:2) ðọc tập tin (cid:2) Ghi tập tin (cid:2) ðóng tập tin

61

(cid:1) Các phép toán chủ yếu ñối với tập tin

Tập tin : Pascal

(cid:1) Khai báo biến tập tin

= FILE OF ;

(cid:1) Mở tập tin :

RESET(biếnTậpTin)

(cid:1) ðọc tập tin:

READ(biếnTậpTin, b1, b2, ..., bN)

(cid:1) Ghi tập tin :

WRITE(biếnTậpTin, b1, b2, ..., bN):

(cid:1) ðóng tập tin

CLOSE(biếnTậpTin)

62

Tận tin : C

(cid:1) Khai báo biến tập tin

FILE * (cid:1) Mở tập tin

FP = fopen("filename","mode"); mode : r, w, a, rw

(cid:1) ðọc tập tin

fread (ptr,size,n,FP); char *ptr; int n,size;

(cid:1) Ghi tập tin

Fwrite (ptr,size,n,FP); char *ptr; int n,size;

(cid:1) ðóng tập tin Fclose (FN)

63