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