Cấu trúc dữ liệu Record trong ngôn ngữ lập trình Pascal

MỤC LỤC

DỮ LIỆU KIỂU BẢN GHI

KHÁI NIỆM VÀ ĐỊNH NGHĨA

Chúng ta đã học về các kiểu cấu trúc dữ liệu như mảng (Array), kiểu tập hợp (Set). Các kiểu cấu trúc dữ liệu này đều được tạo ra bằng một tập hợp các phần tử có cùng (mô tả), kiểu.Ví dụ: các phần tử của một array[1.100] of Integer là các số nguyên (Integer). Để tạo ra một kiểu cấu trúc dữ liệu mới với các phần tử dữ liệu có kiểu khác nhau nhưng có liên kết với nhau, người ta định nghĩa ra bản ghi hay còn gọi là Thẻ ghi, Phiếu ghi (tiếng Anh là Record).

Nói một cách khác, để mô tả các kiểu khác nhau, chúng ta phải dùng cấu trúc kiểu Record. Như vậy Record là một phương tiện linh hoạt nhất để xây dựng các kiểu dữ liệu mới. Cấu trúc dữ liệu Record được gắn liền với cấu trúc dữ liệu kiểu Tệp (File) (sẽ được trình bày ở chương sau) để lưu trữ dữ liệu.

Không giống một số ngôn ngữ bậc cao khác như Fortran , ngôn ngữ Pascal còn cho phép Record có thể được mô tả và sử dụng một cách độc lập với File. Mô tả Record được viết bằng chữ Record, theo sau là danh sách mô tả các phần dữ liệu của Record mà ta gọi là trường. Mỗi một trường có một tên trường và được dùng để chọn các phần tử dữ liệu của Record, tiếp theo là mô tả kiểu trường.

Mô tả Record bao giờ cũng được kết thúc bằng chữ End (có dấu chấm phẩy để kết thúc). Như vậy chúng ta có 3 trường là So_nha, Pho và Thanh_pho với kiểu khác nhau (integer, string[20], string[15]) và chúng được liên kết lại với nhau để mô tả địa chỉ. Ví dụ 3: Để miêu tả nhân sự hay phiếu cán bộ của phòng tổ chức, ta phải dùng các trường Họ tên, Ngày sinh, Chỗ ở, Lương.

Thí dụ 3 cho ta thấy điểm đặc biệt là việc mô tả lồng nhau của cấu trúc dữ liệu. Trong mô tả RECORD của nhân sự, ta có thể mô tả các phần tử (các trường) của Record là một kiểu Record khác như các trường Ngày sinh và chỗ ở. Ta cũng có thể viết trực tiếp mô tả trường Ngay_sinh nếu như có mô tả kiểu Date : Type.

CÂU LỆNH WITH

Với thí dụ 3, ta có thể thâm nhập vào các trường Ngay_sinh trực tiếp như sau : With Nguoi_1, Ngay_sinh Do.

DỮ LIỆU KIỂU TỆP

    Khác với các cấu trúc dữ liệu khác mà chúng ta đã học như : mảng, tập hợp, bản ghi, là các cấu trúc dữ liệu được tổ chức trên bộ nhớ trong (RAM) của máy tính nên một khi kết thúc chạy chương trình hoặc mất điện thì các dữ liệu này cũng mất luôn. Tệp cũng còn có thể tổ chức trong bộ nhớ trong của máy song đó là những tệp tạm thời, trung gian vì chúng không lưu trữ lại được khi dừng chương trình hoặc mất điện. Song mảng được định nghĩa và khai báo trong chương trình với số phần tử đã xác định còn số phần tử của tệp không được xác định khi định nghĩa.

    Kiểu của phần tử của tệp có thể là bất kỳ kiểu dữ liệu nào (kiểu vô hướng, kiểu có cấu trúc như mảng, tập, bản ghi) , trừ kiểu tệp nghĩa là không có kiểu tệp của tệp. Các phần tử của tệp được sắp xếp thành một dãy và ở mỗi thời điểm chương trình chỉ có thể truy nhập vào một phần tử của tệp thông qua giá trị của một biến đệm (Tampon Variance). Việc phân loại tệp dựa trên việc bố trí các phần tử của tệp trong bộ nhớ ngoài và cách truy nhập vào tệp : tệp truy nhập tuần tự(Sequential Access), tệp truy nhập trực tiếp(Direct Access).

    Kiểu truy nhập này là đơn giản nhất trong việc xây dựng tệp cũng như xử lý tệp, song nó kém linh hoạt, Bộ nhớ ngoài điển hình tương ứng với cấu trúc này là băng từ. Còn đĩa mềm, đĩa cứng là loại bộ nhớ có thể tạo tệp truy nhập trực tiếp do đầu từ ghi đọc có thể được điều khiển đặt vào một chỗ bất kỳ trên đĩa vào mọi thời điểm. Một tệp có thể đựoc dùng làm tham số của chương trình con (Procedure hoặc Function) với lời khai báo bắt buộc phải sau chữ Var tức là tệp được dùng làm tham biến.

    Một tệp tuần tự được dùng như là đầu ra để cất dữ liệu thì cùng một lúc không thể làm đầu vào ( nguồn ) dữ liệu được, nghĩa là đối với tệp tuần tự, ta không thể vừa ghi vừa đọc cùng một lúc. Sau lệnh Reset, nếu tệp không rỗng thì cửa sổ bao giờ cũng trỏ vào phần tử đầu tiên của tệp và chương trình sẽ copy phần tử của tệp được trỏ sang biến đệm cửa sổ. Mặc dù tệp văn bản chứa các kí tự nhưng các thủ tục Read(ln) và Write(ln) có những khả năng đặc biệt để ghi và đọc được cả những số nguyên, số thực, Boolean hoặc String nhờ sự chuyển đổi thích hợp giữa các giá trị này với các dãy kí tự. GHI VÀO TỆP VĂN BẢN:. Chúng ta có thể ghi các giá trị kiểu Integer, Real, Boolean, String vào tệp văn bản bằng lệnh Write hoặc Writeln. Cách ghi này cho phép chuyển các giá trị bằng số sang dạng kí tự tức là dạng đọc được một cách tường minh như trên trang giấy, cho phép viết các bảng dữ liệu.. với quy cách mong muốn. ItemN ) sẽ viết các giá trị của Item, là các biến, các hằng, hoặc biểu thức có kiểu đơn giản như Integer, Real, Char, Boolean, String vào biến tệp FileVar.

    _ Thủ tục Write để ghi vào tệp văn bản sẽ không chấp nhận Item là các biến có cấu trúc ( Array, Set, Record và File ). Ví dụ không thể viết :. Cách viết này chỉ được chấp nhận khi FileVar không phải biến tệp mà là tệp chứa các bản ghi NhanSu như ta đã thấy ở các phần trước. ItemN ) ; sẽ thực hiện việc đưa thêm dấu hiệu hết dòng vào tệp sau khi đã viết hết các giá trị các biến. VarN là các biến thuộc kiểu Char, String, Integer, Real, Boolean và muốn đọc cho đúng thì trong tệp văn bản các kí tự tương ứng từ vị trí đọc (vị trí cửa sổ) cũng phải diễn tả đúng các kiểu dữ liệu cần đọc trên. VarN); sẽ đưa cửa sổ tệp sang đầu dòng tiếp theo sau khi đã lần lượt đọc các biến tương ứng. * Khi đọc dữ liệu số nguyên, số thực từ tệp văn bản, thủ tục Read và Readln sẽ tự động biến đổi một xâu kí tự thích hợp trong tệp văn bản sang các số nguyên và số thực.

    * Thủ tục Seek, hàm FileSize, FilePos không áp dụng cho tệp văn bản vì Text được tính theo đơn vị là dòng (kí tự) với độ dài dòng thay đổi, chúng ta không thể tính toán vị trí đặt con trỏ. Như vậy thủ tục Read và Readln đối với tệp văn bản có thể đọc được nhiều kiểu biến khác nhau ghi trong tệp văn bản ( Integer, Real, Boolean, Char, String ). Ưu điểm của việc dùng tệp văn bản chứa dữ liệu là ta có thể dùng các chương trình soạn thảo văn bản ( các Editor như Editor của Turbo. Pascal ) và sau đó có thể xem bằng mắt, sửa, cập nhật các dữ liệu một cách dễ dàng.

    Chương trình dưới đây sẽ đọc lại các dữ liệu của từng ngày để xử lý, với giả thiết 2 dòng đầu (các dòng không chứa dữ liệu chắc chắn tồn tại nên chương trình sẽ không kiểm tra EOLN trước khi đọc).