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

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

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Ngơn ngữ lập trình Chương IV: Kiểu liệu có cấu trúc CHƯƠNG 4: KIỂU DỮ LIỆU CÓ CẤU TRÚC 4.1 TỔNG QUAN 4.1.1 Mục tiêu Sau học xong chương này, sinh viên cần phải nắm: - Khái niệm kiểu liệu có cấu trúc - Đặc tả phương pháp cài đặt kiểu liệu có cấu trúc - Các đặc tả, phương pháp tổ chức lưu trữ, cài đặt phép toán số kiểu liệu có cấu trúc như: vecto, mảng nhiều chiều, mẩu tin, chuỗi ký tự… 4.1.2 Nội dung cốt lõi - Kiểu liệu có cấu trúc - Các đặc tả, phương pháp lưu trữ, hình thức truy xuất, cài đặt phép toán số kiểu liệu có cấu trúc 4.1.3 Kiến thức cần thiết Kiến thức kĩ lập trình bản, kiến thức chương 4.2 ÐỊNH NGHĨA KIỂU DỮ LIỆU CÓ CẤU TRÚC Kiểu liệu có cấu trúc hay cịn gọi cấu trúc liệu (CTDL) kiểu liệu mà ÐTDL ÐTDL có cấu trúc Như CTDL tập hợp ÐTDL có cấu trúc với tập hợp phép tốn thao tác ÐTDL Các kiểu liệu mảng, mẩu tin, chuỗi, ngăn xếp (stacks), danh sách, trỏ, tập hợp tập tin CTDL 4.3 SỰ ÐẶC TẢ KIỂU CẤU TRÚC DỮ LIỆU 4.3.1 Sự đặc tả thuộc tính Các thuộc tính chủ yếu CTDL bao gồm: Số lượng phần tử Số lượng phần tử CTDL cho biết kích thước CTDL, số lượng cố định thay đổi tuỳ loại CTDL Một CTDL gọi có kích thước cố định số lượng phần tử không thay đổi thời gian tồn Ví dụ kiểu mảng, mẩu tin CTDL có kích thước cố định Một CTDL gọi có kích thước thay đổi số lượng phần tử thay đổi cách động thời gian tồn Ví dụ ngăn xếp, danh sách, tập hợp, chuỗi ký tự tập tin CTDL có kích thước thay đổi Các phép toán cho phép thêm bớt phần tử cấu trúc làm thay đổi kích thước cấu trúc 30 Ngơn ngữ lập trình Chương IV: Kiểu liệu có cấu trúc Kiểu phần tử Mỗi phần tử CTDL có kiểu liệu đó, ta gọi kiểu phần tử Kiểu phần tử kiểu liệu sơ cấp CTDL Các phần tử CTDL có kiểu phần tử giống khác Một CTDL gọi đồng tất phần tử có kiểu Ví dụ mảng, chuỗi ký tự, tập hợp tập tin CTDL đồng Một CTDL gọi không đồng phần tử có kiểu khác Ví dụ mẩu tin CTDL không đồng Tên để dùng cho phần tử lựa chọn Ðể lựa chọn phần tử CTDL cho xử lý người ta thường sử dụng tên Ðối với cấu trúc mảng, tên số nguyên dãy số; mẩu tin, tên tên trường Một số kiểu cấu trúc liệu ngăn xếp tập tin cho phép truy nhập đến phần tử đặc biệt (phần tử phần tử hành) Số lượng lớn phần tử Ðối với CTDL có kích thước thay đổi chuỗi ký tự ngăn xếp, người ta quy định thuộc tính kích thước tối đa cấu trúc để giới hạn số lượng phần tử cấu trúc Tổ chức cấu trúc Tổ chức phổ biến dãy phần tử Vector (mảng chiều), mẩu tin, chuỗi ký tự, ngăn xếp, danh sách tập tin CTDL có tổ chức kiểu Một số cấu trúc cịn mở rộng thành dạng "nhiều chiều" ví dụ mảng nhiều chiều, mẩu tin mà phần tử mẩu tin, danh sách mà phần tử danh sách 4.3.2 Các phép toán cấu trúc liệu Một số phép toán đặc thù CTDL: Phép toán lựa chọn phần tử cấu trúc Phép toán lựa chọn phần tử phép toán truy nhập đến phần tử CTDL làm cho xử lý phép tốn khác Có hai loại lựa chọn: Lựa chọn ngẫu nhiên (hay gọi lựa chọn trực tiếp) lựa chọn phần tử tùy ý cấu trúc liệu truy nhập thơng qua tên Ví dụ để lựa chọn phần tử mảng, ta số phần tử đó, để lựa chọn phần tử mẩu tin ta sử dụng tên phần tử 31 Ngơn ngữ lập trình Chương IV: Kiểu liệu có cấu trúc Lựa chọn lựa chọn phần tử lựa chọn phần tử đứng sau phần tử lựa chọn khác theo việc xử lý lựa chọn phần tử đặc biệt Ví dụ lựa chọn phần tử tập tin hay lựa chọn phần tử đỉnh ngăn xếp Các phép toán thao tác toàn cấu trúc liệu Là phép tốn nhận CTDL làm đối số sản sinh kết CTDL Chẳng hạn phép gán mẩu tin cho mẩu tin khác phép hợp hai tập hợp Thêm / bớt phần tử Là phép toán cho phép thêm vào CTDL loại bỏ khỏi CTDL số phần tử Các phép toán làm thay đổi số lượng phần tử CTDL Việc thêm vào hay loại bỏ phần tử thường phải định vị trí Tạo / hủy CTDL Là phép tốn tạo xóa bỏ CTDL 4.4 SỰ CÀI ÐẶT CÁC CẤU TRÚC DỮ LIỆU 4.4.1 Biểu diễn nhớ Sự biểu diễn nhớ cho CTDL bao gồm: - Bộ nhớ cho phần tử cấu trúc - Bộ mô tả để lưu trữ số tất thuộc tính cấu trúc Có hai phương pháp để biểu diễn nhớ là: Biểu diễn Biểu diễn biểu diễn, CTDL lưu trữ khối ô nhớ liên tiếp nhau, bắt đầu mơ tả sau phần tử Ðây phương pháp dùng cho CTDL có kích thước cố định có kích thước thay đổi đồng Chẳng hạn dùng biểu diễn để biểu diễn cho mảng, mẩu tin,… Biểu diễn liên kết Biểu diễn liên kết biểu diễn, CTDL lưu trữ nhiều khối nhớ vị trí khác nhớ, khối liên kết với khối khác thông qua trỏ gọi trỏ liên kết Phương pháp thường sử dụng cho CTDL có kích thước thay đổi Chẳng hạn dùng biểu diễn liên kết để biểu diễn cho danh sách, ngăn xếp,… 32 Ngơn ngữ lập trình Chương IV: Kiểu liệu có cấu trúc Bộ mơ tả Bộ mô tả Phần tử Phần tử Phần tử Phần tử Phần tử Phần tử Biểu diễn liên kết Biểu diễn 4.4.2 Cài đặt phép toán cấu trúc liệu Phép toán lựa chọn phần tử phép toán phép tốn CTDL Như trình bày, có hai cách lựa chọn lựa chọn ngẫu nhiên lựa chọn hai cách biểu diễn nhớ biểu diễn biêu diễn liên kết Vì xét cách thực phương pháp lựa chọn với phương pháp biểu diễn nhớ Ðối với biểu diễn Như trình bày, cách biểu diễn tuần tự, khối ô nhớ liên tục cấp phát để lưu trữ tòan CTDL Trong đó, vị trí khối nhớ gọi địa sở Khoảng cách từ địa sở đến vị trí phần tử cần lựa chọn gọi độ dời phần tử Cách thức truy xuất, cho tên số phần tử (chẳng hạn số phần tử mảng), xác định cách tính độ dời phần tử Để lựa chọn ngẫu nhiên phần tử cần phải xác định vị trí thực phần tử (tức địa nhớ lưu trữ phần tử đó) theo cơng thức: Vị trí thực phần tử = Ðịa sở + độ dời phần tử Lựa chọn dãy phần tử cấu trúc theo bước: - Ðể chọn phần tử ta dùng cách tính địa sở cộng với độ dời nói 33 Ngơn ngữ lập trình Chương IV: Kiểu liệu có cấu trúc - Ðối với phần tử dãy, cộng kích thước phần tử hành với vị trí phần tử hành để vị trí phần tử Ðối với biểu diễn liên kết Như trình bày, khối ô nhớ biểu diễn liên kết bố trí rời rạc nhau, khối nối với khối trỏ lúc đầu nắm trỏ tới khối Do việc đến khối phải xuất phát từ khối Để lựa chọn ngẫu nhiên phần tử cấu trúc liên kết cần phải duyệt dãy khối, từ khối đến khối cần lựa chọn Lựa chọn dãy phần tử thực cách lựa chọn phần tử nói sau từ phần tử hành, duyệt theo trỏ để đến phần tử 4.5 VÉCTƠ 4.5.1 Định nghĩa véctơ Véctơ (còn gọi mảng chiều) CTDL bao gồm số cố định phần tử có kiểu giống tổ chức thành dãy phần tử Như véctơ CTDL có kích thước cố định đồng 4.5.2 Sự đặc tả cú pháp Đặc tả thuộc tính véctơ Các thuộc tính véctơ là: - Số lượng phần tử, rõ cách cho tập số Tập số thông thường cho miền số nguyên, trường hợp đó, số lượng phần tử số nguyên cuối - số nguyên + Một cách tổng qt tập số kiểu liệt kê đó, trường hợp này, số lượng phần tử số giá trị kiểu liệt kê Cũng có ngơn ngữ định rõ số lượng phần tử ngôn ngữ C chẳng hạn - Kiểu liệu phần tử, thường viết rõ khai báo - Chỉ số sử dụng để lựa chọn phần tử Nếu tập số cho miền tập số nguyên số nguyên định phần tử số nguyên thứ định phần tử thứ Nếu tập số liệt kê giá trị liệt kê số phần tử Nếu ngôn ngữ định rõ số lượng phần tử số phần tử Khai báo véctơ Pascal ARRAY [] OF Ví dụ VAR a: ARRAY[1 10] OF real; Khai báo xác định véctơ a có 10 phân tử số real Các phần tử lựa chọn số từ đến 10 Miền giá trị số không thiết 1, ví dụ 34 Ngơn ngữ lập trình Chương IV: Kiểu liệu có cấu trúc Var b: ARRAY [-5 10] OF integer; Với khai báo b véctơ có 16 phần tử (10 – (-5) + = 16) Các phần tử lựa chọn nhờ số từ -5 đến 10 Miền giá trị số không thiết miền số nguyên, liệt kê (hoặc miền liệt kê) Ví dụ: Type Ngay = (Chu_nhat, Hai, Ba, Tu, Nam, Sau, Bay); var c : ARRAY [Ngay] OF Integer ; Khai báo xác đinh véctơ c có phần tử số integer, phần tử c lựa chọn nhờ “chỉ số” từ Chu_nhat đến Bay Khai báo véctơ ngôn ngữ C [] Ví dụ int d[10]; Khai báo xác định véctơ d có 10 phần tử số int, phần tử lựa chọn nhờ số từ đến Đặc tả phép toán véctơ Các phép toán véctơ bao gồm: Phép toán lựa chọn phần tử véctơ phép lấy số, viết tên véctơ theo sau số phần tử lựa chọn đặt cặp dấu [] Như phép lựa chọn phần tử véctơ phép lựa chọn trực tiếp Ví dụ, với khai báo ví dụ thuộc phần đặc tả thuộc tính nói trên, Các phần tử véctơ a lựa chọn cách viết a[1], a[2], …, a[10] Các phần tử véctơ b lựa chọn cách viết b[-5], b[-4], …, b[10] Các phần tử véctơ c lựa chọn cách viết c[Chu_nhat], c[Hai], …, c[Bay] Các phần tử véctơ d lựa chọn cách viết d[0], d[1], …, d[9] Chỉ số một biến (nói chung biểu thức), ví dụ a[i] hay a[i+2] Nhờ số biểu thức nên việc lập trình trở nên đơn giản nhiều nhờ tính khái quát số Ví dụ để in giá trị 10 phần tử véctơ a, thay ta phải viết 10 lệnh in phần tử cụ thể theo kiểu writeln(a[1]); writeln(a[2]); writeln(a[3]); … ta cần viết lệnh for i:=1 to 10 writeln(a[i]); Các phép toán khác véctơ bao gồm phép toán tạo hủy bỏ véctơ, gán hai véctơ cho phép toán thực phép tốn số học cặp véctơ có kích thước Chẳng hạn phép cộng véctơ (cộng phần tử tương ứng) Tùy thuộc vào ngôn ngữ mà phép tốn có khơng có 4.5.3 Cài đặt véctơ Biểu diễn nhớ Biểu diễn nhớ sử dụng để biễu diễn cho véctơ 35 Ngơn ngữ lập trình Chương IV: Kiểu liệu có cấu trúc Mơ hình sau minh họa cho biểu diễn nhớ véctơ A : ARRAY[LB UB] OF Ðịa sở Bộ mô tả Bộ nhớ cho phần tử véctơ Véctơ A LB UB Kiểu phần tử E A[LB] A[LB+1] Kiểu liệu Cận tập số Cận tập số Kiểu liệu phần tử Kích thước phần tử A[UB] Khối nhớ để lưu trữ véctơ có hai phần: mô tả nhớ dành cho phần tử véctơ Trong mô tả lưu trữ kiểu liệu cấu trúc (véctơ A), cận tập số (LB - Lower Bound), cận tập số (UB - Upper Bound), kiểu liệu phần tử kích thước phần tử (E) Bộ nhớ dành cho phần tử véctơ lưu trữ liên tiếp phần tử, từ phần tử (A[LB]) phần tử cuối (A[UB]) Do phần tử có kiểu nên nhớ dành cho phần tử có kích thước nahu Ðịa ô nhớ khối gọi địa sở Giải thuật thực phép toán Phép toán lựa chọn phần tử thực cách tính vị trí phần tử cần lựa chọn theo cơng thức: Vị trí phần tử thứ i = ∝ + D + (i - LB) * E Trong i số phần tử cần lựa chọn, ∝ địa sở khối ô nhớ (địa word byte khối ô nhớ dành cho véctơ) D kích thước mơ tả, LB cận tập số E kích thước đối tượng liệu thành phần (số word byte cần thiết để lưu trữ phần tử) Nếu số giá trị kiểu liệt kê khơng phải số ngun hiệu i-LB phải tính tốn cách thích hợp (chẳng hạn sử dụng hiệu hai số thứ tự tương ứng i LB liệt kê) Phép gán véctơ cho véctơ khác có thuộc tính thực cách chép nội dung khối ô nhớ biểu diễn véctơ thứ sang khối ô nhớ biểu diễn véctơ thứ hai Các phép tốn tồn véctơ thực cách sử dụng vòng lặp xử lý phần tử véctơ 4.6 MẢNG NHIỀU CHIỀU Ma trận (mảng hai chiều) xem véctơ véctơ Một mảng chiều xem véctơ ma trận 36 Ngôn ngữ lập trình Chương IV: Kiểu liệu có cấu trúc 4.6.1 Sự đặc tả cú pháp Đặc tả thuộc tính Mảng nhiều chiều tương tự véctơ có thuộc tính khác véctơ chiều phải có tập số tương ứng Chẳng hạn khai báo cho mảng hai chiều đươc viết dạng ARRAY[LB1 UB1, LB2 UB2] OF Trong tập số có giá trị từ LB1 đến UB1, tập số có giá trị từ LB2 đến UB2 Như số lượng phần tử mảng hai chiều (UB1-LB1+1)*(UB2-LB2+1) Ví dụ khai báo Pascal: M= array [1 3, -1 2] of Integer; Sự khai báo cho ta thấy mảng M có hai chiều, chiều thứ xác định tập số chiều thứ hai xác định tập số -1 Có thể xem ma trận có dịng cột, có 12 phần tử, phần tử lưu trữ số integer Đối với mảng có số chiều nhiều hai cách làm tương tự mảng hai chiều Đặc tả phép toán Phép lựa chọn phần tử thực cách tên mảng số chiều Chẳng hạn để lựa chọn phân tử ma trận ta viết tên ma trận, theo sau cặp số dòng, cột phân cách dấu phẩy đặt cặp dấu [], ví dụ M[2,0] Như phép lựa chọn phần tử mảng nhiều chiều phép lựa chọn trực tiếp 4.6.2 Sự cài đặt Sự biểu diễn nhớ Sự biểu diễn nhớ mảng nhiều chiều tương tự biểu diễn nhớ véctơ Nghĩa sử dụng biểu diễn khố ô nhớ chia làm hai phần: mô tả nhớ cho phần tử Bộ mô tả mảng giống mô tả véctơ ngoại trừ chiều có cận cận tập số chiều Trong nhớ dành cho phần tử ta lưu trữ liên tiếp phần tử theo trật tự Với ma trận, mặt logic ma trận bảng gồm m dịng n cơt, phần tử, nhớ lại gồm liên tiếp nhau, ta phải lưu trữ ma trận theo trật tự dòng theo trật tự cột Lưu trữ theo trật tự dịng có nghĩa nhớ dành cho phần tử ta lưu trữ phần tử dòng thứ nhất, tiếp đến phần tử dòng thứ hai cho đên dịng cuối 37 Ngơn ngữ lập trình Chương IV: Kiểu liệu có cấu trúc Lưu trữ theo trật tự cột nghĩa nhớ dành cho phần tử ta lưu trữ phần tử cột thứ nhất, tiếp đến phần tử cột thứ hai cột cuối Chẳng hạn với khai báo M: ARRAY [1 3,-1 2] OF Integer; ta có hình ảnh biểu diễn nhớ hình sau: Cấu trúc logic ma trận M Lưu trữ ma trận M theo trật tự dòng M[1,-1] M[1,0] M[1,1] M[1,2] Ma trận M Kiểu liệu M[2,-1] M[2,0] M[2,1] M[2,2] LB1 (= 1) Cận tập số thứ M[3,-1] M[3,0] M[3,1] M[3,2] UB1 (= 3) Cận tập số thứ LB2 (= -1) Cận tập số thứ hai UB2 (= 2) Cận tập số thứ hai Bộ mô tả M[1,-1] M[1,0] Bộ nhớ cho M[1,1] Các phần tử M[1,2] M[2,-1] Dòng thứ Dòng thứ hai M[2,0] M[3,2] Cấu trúc logic ma trận M Lưu trữ ma trận M theo trật tự cột M[1,-1] M[1,0] M[1,1] M[1,2] Ma trận M Kiểu liệu M[2,-1] M[2,0] M[2,1] M[2,2] LB1 (= 1) Cận tập số thứ M[3,-1] M[3,0] M[3,1] M[3,2] UB1 (= 3) Cận tập số thứ LB2 (= -1) Cận tập số thứ hai UB2 (= 2) Cận tập số thứ hai Bộ mô tả M[1,-1] M[2,-1] Bộ nhớ cho M[3,-1] Các phần tử M[1,0] M[2,0] Cột thứ Cột thứ hai M[3,0] M[3,2] 38 Ngôn ngữ lập trình Chương IV: Kiểu liệu có cấu trúc Giải thuật thực phép toán Ðể thực phép toán lựa chọn phần tử, ta sử dụng cơng thức tính vị trí phần tử nhớ Với cách lưu trữ theo trật tự dòng ma trận M, để tính vị trí M[i,j], ta xác định số dòng cần nhảy qua: (i-LB1) nhân với độ dài dịng để xác định vị trí bắt đầu dịng thứ i sau tìm vị trí thứ J dịng véctơ Như vậy, vị trí phần tử M[i,j] tính bởi: Vị trí M [i,j] = ∝ + D + (i-LB1) x S + (j-LB2) x E ∝ địa sở D độ lớn mơ tả S độ lớn dịng = (UB2 - LB2 +1) x E LB1 cận số thứ LB2,UB2 tương ứng cận cận số thứ hai Tương tự ta thành lập cơng thức tính vị trí phần tử M[i,j] trường hợp ma trận M tổ chức lưu trữ theo trật tự cột Trong đó: Tổng qt hóa cơng thức cho mảng nhiều chiều điều đơn giản 4.7 MẨU TIN 4.7.1 Định nghĩa mẩu tin Mẩu tin CTDL bao gồm số cố định phần tử có kiểu khác Như vậy, mẩu tin CTDL có kích thước cố định khơng đồng Các phần tử mẩu tin gọi trường 4.7.2 Sự đặc tả cú pháp Đặc tả thuộc tính Các thuộc tính mẩu tin phải rõ phép khai báo, chúng bao gồm: Số lượng phần tử Kiểu liệu phần tử (Các phần tử có kiểu khác nhau) Mỗi phần tử cho tên phần tử (tên trường) Cú pháp khai báo mẩu tin Pascal: Nhan_vien: RECORD Ma: Integer; {Mã nhân viên} Ho_ten: String[25]; Tuoi: Integer; {Tuổi} Luong: Real; {Hệ số lương} END Việc khai báo đặc tả mẩu tin có phần tử kiểu Integer, Real String Mỗi phần tử có tên: Ma, Ho_ten, Tuoi Luong Ðể chọn phần tử mẩu tin ta sử dụng tên phần tử (trường) đó, chẳng hạn Pascal, Nhan_vien.Luong để truy xuất tới phần tử Luong mẩu tin Nhan_vien 39 Ngôn ngữ lập trình Chương IV: Kiểu liệu có cấu trúc readln(loaicn); If Upcase(loaicn) ='A' then loai := bien_che else loai := hop_dong; write('So cong: '); readln(ngay_cong); if loai = bien_che then begin write('He so: '); readln(he_so); write('So nghi bao hiem: '); readln(so_ngay_nghi_BHXH); end else begin write('Don gia hop dong: '); readln(don_gia); end; end; { with Ho_so[i] } end; {nhap} {Tính lương cho cơng nhân, theo cơng thức loại công nhân} Procedure Tinh_luong (var ho_so: danh_sach_cong_nhan; n: integer); Var i : integer; luong_binh_quan: real; begin for i:=1 to n with ho_so[i] begin if loai = bien_che then begin {tính lương cơng nhân biên chế} luong_binh_quan := he_so * luong_toi_thieu/20; luong := ngay_cong * luong_binh_quan + so_ngay_nghi_BHXH * luong_binh_quan*0.80; end else {tính lương công nhân hợp đồng} luong := ngay_cong * don_gia; end; { with Ho_so[i] } end; {Tinh_luong } Procedure In_luong (ho_so: danh_sach_cong_nhan; n: integer); Var i : integer; begin for i:=1 to n with ho_so[i] begin Write(ho_ten:25); If loai = bien_che then write('Bien che':10) else write('Hop dong':10); write(ngay_cong:5:1); if loai = bien_che then begin write(he_so:5:1); write(so_ngay_nghi_BHXH:5:1); end else write(don_gia:10:2); writeln(luong:10:2); 43 Ngơn ngữ lập trình Chương IV: Kiểu liệu có cấu trúc end; { with Ho_so[i] } end; { In_luong } begin {Chuong trinh chinh} nhap(ho_so,n); tinh_luong(ho_so,n); in_luong(ho_so,n); readln; end 4.8.2 Cài đặt mẩu tin có cấu trúc thay đổi Biểu diễn nhớ Biểu diễn sử dụng để biểu diễn cho mẩu tin có cấu trúc thay đổi Thơng qua việc dịch, tổng nhớ cần để lưu phần tử phần động xác định nhớ cấp phát đủ để lưu trữ mẩu tin với phần động lớn Chẳng hạn với mẩu tin cong_nhan ta có mơ hình lưu trữ hình vẽ sau: ← Ho_ten Ho_ten → ← Ngay_cong Ngay_cong → Luong → ← Luong Loai → He_so → ← Loai ← Gia_cong_nhat Nghi_bhxh → ← Không sử dụng Công nhân biên chế Cơng nhân hợp đồng Vì khối nhớ đủ lớn để lưu trữ phần động lớn nên có đủ chỗ cho phần động phần động nhỏ không sử dụng tới số ô nhớ cấp phát Với mẩu tin có cấu trúc thay đổi, rõ ràng ta tiết kiệm số ô nhớ so với mẩu tin bình thường Giải thuật thực phép toán Lựa chọn phần tử phần động giống lựa chọn phần tử bình thường, qua việc dịch độ dời phần tử lựa chọn tính tốn qua việc thực độ dời cọng vào địa sở khối để xác định vị trí phần tử 44 Ngơn ngữ lập trình 4.9 Chương IV: Kiểu liệu có cấu trúc CHUỖI KÝ TỰ: Chuỗi ký tự cấu trúc liệu bao gồm dãy ký tự Như vậy, kiểu chuỗi ký tự kiểu đồng nhất, cịn kích thước cố định thay đổi tùy theo ngôn ngữ Kiểu liệu chuỗi ký tự kiểu quan trọng mà hầu hết ngơn ngữ có 4.9.1 Ðặc tả cú pháp: Đặc tả thuộc tính Tùy ngơn ngữ, có cách đặc tả kiểu chuỗi ký tự: a/ Ðộ dài khai báo cố định: Chuỗi ký tự có độ dài (kích thước) cố định khai báo chương trình Mọi giá trị gán cho đối tượng liệu chuỗi có độ dài Khi chuỗi thực gán cho đối tượng liệu mà độ dài chuỗi thực khác độ dài khai báo có điều chỉnh độ dài chuỗi thực cách cắt bớt ký tự dư thêm vào ký tự trắng để có chuỗi có độ dài khai báo Ðây kỹ thuật dùng COBOL từ khóa PICTURE dùng để xác định số lượng ký tự, ví dụ: Last_Name PICTURE X(20) khai báo biến chuỗi ký tự Last_Name chứa chuỗi 20 ký tự Trong Pascal (chuẩn) kiểu liệu chuỗi ký tự khơng có Thay vào kiểu chuổi ký tự biểu diễn véctơ ký tự Last_Name: PACKED ARRAY [1 20] OF Char b/ Ðộ dài thay đổi giới hạn khai báo: Chuỗi ký tự có độ dài cực đại khai báo trước chương trình giá trị thực đối tượng liệu lưu trữ chuỗi có độ dài ngắn hơn, chí chuỗi rỗng Trong q trình thực độ dài giá trị chuỗi đối tượng liệu thay đổi, bị cắt vượt giới hạn khai báo Ðây kỹ thuật dùng PL/1 (và Turbo Pascal) c/ Ðộ dài khơng giới hạn: Chuỗi ký tự có độ dài độ dài thay đổi cách động thơng qua q trình thực Ðây kỹ thuật dùng SNOBOL4 Trong ba phương pháp nói hai phương pháp đầu cho phép cấp phát nhớ cho đối tượng liệu chuỗi xác định thời gian dịch Ðối vơi phương pháp thứ ba sử dụng cấp phát nhớ động thời gian thực Các phương pháp khác đòi hỏi phép toán khác chuỗi Sau số phép toán chủ yếu Đặc tả phép toán Trên chuỗi ký tự, thường có phép tốn sau: a/ Phép ghép nối (concatennation) 45 Ngơn ngữ lập trình Chương IV: Kiểu liệu có cấu trúc Ghép phép toán nhập hai chuỗi ký tự tạo chuỗi ví dụ "//" ký hiệu phép ghép "BLOCK"//"HEAD" cho "BLOCKHEAD" Turbo Pascal sử dụng toán tử “+” cho phép toán ghép chuỗi b/ Các phép toán quan hệ chuỗi Các phép toán quan hệ thông thường bằng, nhỏ hơn, lớn kiểu ký tự mở rộng cho chuỗi ký tự Tập hợp ký tự ln ln có thứ tự Mở rộng thứ tự cho chuỗi ký tự thành thứ tự alphabe chuỗi A nhỏ chuỗi B ký tự A nhỏ ký tự B hai ký tự tương ứng chúng ký tự thư hai A nhỏ ký tự thứ hai B Nếu chuỗi A ngắn chuỗi B A mở rộng cách thêm vào ký tự trắng cho dài B để so sánh c/ Chọn chuỗi dùng số vị trí ký tự Nhiều ngơn ngữ cung cấp phép tốn chọn chuỗi chuỗi cách cho vị trí ký tự ký tự cuối (hoặc vị trí ký tự chiều dài chuỗi con) Ví dụ FORTRAN, lệnh NEXT = STR(6:10) gán ký tự, vị trí thứ đến vị trị thứ 10 chuỗi STR cho biến chuỗi NEXT d/ Ðịnh dạng nhập - xuất Ðịnh dạng nhập xuất phép toán dùng để thay đổi dạng nhập vào xuất chuỗi ký tự Nhập xuất có định dạng nét bật FORTRAN PL/1 e/ Chọn chuỗi dùng so mẫu Thông thường người ta vị trí chuỗi cần chọn chuỗi lớn quan hệ với chuỗi khác biết Ví dụ chuỗi chữ số sau dấu chấm thập phân hay chuỗi đứng sau khoảng trống Phép so mẫu có đối số thứ để xác định dạng chuỗi cần chọn (chẳng hạn độ dài nó) Ðối số thứ hai phép toán so mẫu chuỗi ký tự dùng để tìm chuỗi (chẳng hạn dấu chấm thập phân) Như kết phép toán so mẫu chọn chuỗi sau dấu chấm thập phân có độ dài cho 4.9.2 Cài đặt Biểu diễn nhớ Mỗi phương pháp đặc tả chuỗi có cách biểu diễn nhớ tương ứng Ðối với chuỗi có độ dài khai báo cố định dùng véctơ ký tự Ví dụ chuỗi khai báo có độ dài dùng để lưu trữ chuỗi EINSTEIN (cũng có ký tự): E I N S T E I N Ðối với chuỗi có độ dài thay đổi giới hạn khai báo dùng véctơ ký tự, sử dụng hai làm mơ tả chứa giá trị thể độ dài lớn khai báo độ dài hành chuỗi Ví dụ chuỗi khai báo có độ dài 12 dùng để lưu trữ chuỗi EINSTEIN (có ký tự): 46 Ngơn ngữ lập trình 12 Độ dài khai báo Chương IV: Kiểu liệu có cấu trúc Độ dài thực E I N S T E I N Các ô dư không sử dụng Ðối với chuỗi có độ dài khơng giới hạn sử dụng biểu diễn nhớ liên kết với mô tả chứa độ dài chuỗi E I N T S E I N # Ðộ dài thực chuỗi Giải thuật thực phép tốn Thơng thường phần cứng hỗ trợ cho việc biểu diễn chuỗi có độ dài cố định biểu diễn khác cho chuỗi phải mơ phần mềm Các phép toán ghép, chọn chuỗi so mẫu phải mô phần mềm 4.10 CẤU TRÚC DỮ LIỆU CĨ KÍCH THƯỚC THAY ÐỔI CTDL có kích thước thay đổi cấu trúc mà số lượng phần tử thay đổi cách động trình thực chương trình Một số kiểu chủ yếu cấu trúc liệu có kích thước thay đổi là: 4.10.1 Danh sách cấu trúc danh sách Danh sách CTDL tuyến tính với số lượng thay đổi phần tử có kiểu giống Nếu phần tử danh sách lại danh sách gọi cấu trúc danh sách (list structures) Các phần tử thêm vào xóa khỏi danh sách Các phần tử lựa chọn từ danh sách vị trí phần tử danh sách bị thay đổi phép thêm xóa phần tử nên khơng thể sử dụng số để xác định phần tử Thay vào đó, việc lựa chọn dựa sở mối quan hệ vị trí phần tử với danh sách chẳng hạn phần tử đầu, hai, ba, kế hặc cuối Biểu diễn nhớ liên kết cho danh sách cấu trúc danh sách dùng cách phổ biến để phù hợp với thay đổi số lượng phần tử 4.10.2 Ngăn xếp hàng đợi Ngăn xếp danh sách mà việc lựa chọn, thêm, xóa phần tử thực đầu danh sách Do việc thêm, xóa phần tử thực đầu ngăn xếp, nên phần tử đưa vào sau, lấy trước Do ngăn xếp gọi cấu trúc liệu kiểu LIFO (Last In, First Out) Hàng đợi danh sách mà việc lựa chọn, xóa phần tử thực đầu việc thêm phần tử thực đầu khác danh sách 47 Ngơn ngữ lập trình Chương IV: Kiểu liệu có cấu trúc Do việc xóa phần tử thực đầu (đầu hàng) việc thêm phần tử thực cuối hàng, nên phần tử đưa vào trước, lấy trước Do hàng đợi gọi cấu trúc liệu kiểu FIFO (First In, First Out) Cả hai phương pháp biểu diễn liên kết dùng cho ngăn xếp hàng đợi 4.11 CON TRỎ 4.11.1 Cấp phát tĩnh, cấp phát động trỏ Cấp phát nhớ (gọi tắt cấp phát) dành riêng ô nhớ nhớ cho chương trình sử dụng Thông thường ô nhớ cấp phát để lưu trữ giá trị liệu biến Có hai phương pháp cấp phát cấp phát tĩnh cấp phát động Cấp phát tĩnh cấp phát ô nhớ cho ÐTDL thực trình dịch Trong biên dịch, thông qua khai báo biến, dịch xác định kiểu liệu ÐTDL nên dành sẵn khối ô nhớ đủ lớn để lưu trữ ÐTDL kiểu Người lập trình sử dụng ô nhớ cấp phát thông qua tên biến Khi khối chương trình, nơi khai báo biến kết thúc nhớ cấp phát tự động giải phóng Ưu điểm Ưu điểm cấp phát tĩnh người lập trình dễ sử dụng, cụ thể người lập trình cần khai báo biến, chương trình dịch tự động cấp phát sau tự động giải phóng Nhược điểm Nhược điểm cấp phát tĩnh việc sử dụng nhớ không tối ưu, cụ thể cấp phát nhiều nhớ sử dụng không hết cấp phát thiếu Cấp phát động cấp phát thực chương trình Người lập trình phải viết lệnh cấp phát chương trình, thực lệnh nhớ cấp phát Sử dụng cấp phát động, người lập trình lệnh giải phóng để thu hồi nhớ Ðể cấp phát động, ta cần có biến trỏ hay cịn gọi biến kiểu tham chiếu Biến trỏ ÐTDL sơ cấp chứa địa khối ô nhớ cấp phát Người lập trình sử dụng nhớ cấp phát thông qua biến trỏ Ưu điểm Ưu điểm bật cấp phát động sử dụng nhớ cách tối ưu Nhược điểm Nhược điểm cấp phát động tên, có nhiều tên biến trỏ tham chiếu đến ô nhớ làm giảm độ tin cậy chương trình Ngồi gặp khó kăn sử dụng cấp phát động 48 Ngơn ngữ lập trình Chương IV: Kiểu liệu có cấu trúc 4.11.2 Sự đặc tả Đặc tả thuộc tính Có hai loại trỏ khác nhau: Con trỏ tham chiếu tới ÐTDL kiểu Ðây phương pháp dùng Pascal Ada Ví dụ Pascal: Var p: ^integer p biến trỏ chứa địa ô nhớ lưu trữ số integer Var q: ^VECT q biến trỏ chứa địa khối ô nhớ ÐTDL thuộc kiểu véctơ VECT Con trỏ tham chiếu tới ÐTDL khác kiểu Ðây cách dùng ngôn ngữ SNOBOL4, nơi mà đối tượng liệu mang mơ tả kiểu q trình thực phép kiểm tra kiểu động sử dụng Đặc tả phép toán Các phép toán bao gồm: Phép tốn cấp phát nhớ động: Phép tốn dùng để cấp phát ô nhớ cho đối tượng liệu trả địa nhớ biến trỏ Ðây phép toán quan trọng kiểu trỏ Phép tốn có hai điểm khác biệt với việc tạo đối tượng liệu tĩnh (bằng cách khai báo) là: Ðối tượng liệu tạo khơng cần có tên truy xuất thơng qua trỏ đối tượng liệu tạo cách động trình thực chương trình Trong Pascal Ada phép tốn có tên NEW Ví dụ NEW(p) Phép tốn truy xuất nhớ cấp phát động: Ðể truy xuất đến giá trị liệu lưu khối ô nhớ cấp phát động ta phải sử dụng địa khối ô nhớ thông qua tên trỏ (vì khối nhớ khơng có tên) Ví dụ q^[5] phần tử thứ véctơ Vect trỏ q Phép toán thu hồi nhớ cấp phát động: Phép tốn cho phép giải phóng nhớ cấp phát Trong Pascal, dùng phép tốn DISPOSE Ví dụ sau Pascal minh hoạ tổng hợp điều nói trên: Type Vect = ARRAY[1 10] of Integer; {Lúc nhớ cho Vect chưa cấp phát} VAR p: ^Vect; {Khai báo p biến trỏ chứa địa khối ô nhớ lưu trữ ÐTDL thuộc kiểu véctơ Vect Khi dịch đến nhớ cho p cấp phát} Begin 49 ... ngữ lập trình Chương IV: Kiểu liệu có cấu trúc Kiểu phần tử Mỗi phần tử CTDL có kiểu liệu đó, ta gọi kiểu phần tử Kiểu phần tử kiểu liệu sơ cấp CTDL Các phần tử CTDL có kiểu phần tử giống khác... Chương IV: Kiểu liệu có cấu trúc CHUỖI KÝ TỰ: Chuỗi ký tự cấu trúc liệu bao gồm dãy ký tự Như vậy, kiểu chuỗi ký tự kiểu đồng nhất, cịn kích thước cố định thay đổi tùy theo ngôn ngữ Kiểu liệu chuỗi... hop_dong: 41 Ngơn ngữ lập trình Chương IV: Kiểu liệu có cấu trúc (gia_cong_nhat: Real); END; Khai báo định nghĩa mẩu tin có cấu trúc thay đổi Mẩu tin ln ln có trường Ho_Ten, Ngay_Cong, Luong Loai

Ngày đăng: 02/10/2013, 15:20

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan