Tham khảo tài liệu ''giáo trình phân tích khả năng ứng dụng kiểu dữ liệu sơ cấp trong ngôn ngữ lập trình p9'', công nghệ thông tin, kỹ thuật lập trình phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả
h a n g e Vi e N 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 bu to k lic d o m o o c u -tr a c k C w w w d o Chương IV: Kiểu liệu có cấu trúc m C lic k to bu y Ngơn ngữ lập trình w w w w y N O W ! XC er O W F- w PD h a n g e Vi e ! XC er PD F- c u -tr a c k c h a n g e Vi e y N c Đặc tả phép toán Lựa chọn phần tử phép toán cuả mẩu tin Phép toán thực cách tên trực kiện phần tử Ví dụ để lựa chọn phần tử thứ mẩu tin Nhan_vien ta viết: Nhan_vien.Luong Phép toán lựa chọn phần tử mẩu tin lựa chọn trực tiếp Mặc dù lựa chọn trực tiếp, có khác biệt so với cách lựa chọn phần tử véctơ Điểm khác biệt là: véctơ, ta sử dụng giá trị biểu thức làm số, chẳng hạn VECTO[i+1], mẩu tin bắt buộc phải rõ tên trực kiện, khơng thể biểu thức Ngồi phép tốn lựa chọn phần tử, phép gán mẩu tin có cấu trúc phép tốn phổ biến ngơn ngữ đưa vào Chẳng hạn Nhan_vien := InputRec InputRec có thuộc tính giống hệt Nhan_vien 4.7.3 Sự cài đặt Biểu diễn nhớ Biểu diễn nhớ sử dụng để lưu trữ mẩu tin Một khối liên tục ô nhớ dùng để lưu trữ cho mẩu tin, khối đó, biểu diễn cho trường Có thể cần sử dụng mô tả riêng cho trường để lưu trữ thuộc tính trường Do trường có kiểu khác nên nhớ dành cho chúng có kích thước khác Giải thuật thực hiên phép toán Việc lựa chọn phần tử thực cách dễ dàng tên trường biết đến thông qua việc dịch tính tốn thơng qua việc thực véctơ Việc khai báo mẩu tin cho phép xác định kích thước vị trí nhớ thông qua việc dịch Kết độ dời phần tử tính thơng qua việc dịch Chẳng hạn với mẩu tin Nhan_vien, phần tử lưu trữ nhớ sau: 22901 Nguyen Van A 20 ← Ma Vị trí phần tử tính cách dễ dàng Chẳng hạn ← Ho_ten Vị trí Tuoi = α + Kích thước Ma + Kích thước Ho_ten ← Tuoi Trong α địa sở khối ô nhớ biểu diễn cho Nhan_vien Phép tốn gán tồn mẩu tin cho mẩu tin khác có cấu trúc thực cách đơn giản copy nội dung khối ô nhớ biểu diễn cho mẩu tin thứ sang khối ô nhớ biểu diễn cho mẩu tin thứ 2.18 ← Luong 40 bu to k d o m o o c u -tr a c k w lic w w w d o Chương IV: Kiểu liệu có cấu trúc m C lic k to bu Ngơn ngữ lập trình w w w C y N O W ! XC er O W F- w PD h a n g e Vi e ! XC er PD F- c u -tr a c k c h a n g e Vi e c u -tr a c k w y N c 4.8 MẨU TIN CÓ CẤU TRÚC THAY ÐỔI 4.8.1 Ðặc tả khai báo Trước hết ta xét ví dụ sau: Giả sử xí nghiệp có hai loại cơng nhân cơng nhân biên chế công nhân hợp đồng Ðối với cơng nhân biên chế lương tính số ngày công * mức lương tối thiểu * hệ số /20, ngày nghỉ bảo hiểm xã hội, họ trả lương bảo hiểm xã hội Ngược lại công nhân hợp đồng trả lương số ngày công * đơn giá công nhật họ không trả lương bảo hiểm xã hội Ta thấy, hai loại cơng nhân có thơng tin chung họ tên, số ngày công, tiền lương loại công nhân (biên chế hay hợp đồng) Mỗi loại công nhân lại có thơng tin riêng Đối với cơng nhân biên chế, ta cần thêm thông tin: hệ số lương số ngày nghỉ bảo hiểm xã hội Đối với công nhân hợp đồng, ta cần thêm thông tin đơn giá công nhật Nếu sử dụng mẩu tin bình thường để lưu trữ thơng tin hai loại công nhân này, ta cần tất trường để lưu trữ thông tin chung thông tin riêng Khối ô nhớ cần cấp phát phải đủ để lưu trữ trường việc sử dụng khối ô nhớ lại bị dư, công nhân biên chế ta cần trường, công nhân hợp đồng ta cần trường! Đặc tả thuộc tính Ðể giải vấn đề lãng phí nhớ, số ngơn ngữ lập trình có loại CTDL gọi mẩu tin có cấu trúc thay đổi Mỗi cấu trúc có số trường giống cho loại mẩu tin số trường khác cho loại mẩu tin Các trường giống gọi phần chung hay phần tĩnh, trường khác gọi phần động hay phần thay đổi mẩu tin Chẳng hạn tốn nêu cơng nhân lưu mẩu tin, có trường thuộc phần chung Ho_Ten, Ngay_Cong, Tien_Luong Ngồi tùy thuộc vào loại công nhân biên chế hay hợp đồng mà có trường riêng Ðối với cơng nhân biên chế ta cần thêm trường He_So Nghi_Bhxh để lưu trữ hệ số lương số ngày nghỉ bảo hiểm xã hội Ðối với công nhân hợp đồng ta cần thêm trường Gia_Cong_Nhat để lưu trữ giá công nhật cho người Khai báo Pascal sau: TYPE loai_cong_nhan = (bien_che,hop_dong); VAR Cong_Nhan : RECORD ho_ten: String[20]; ngay_cong: Real; luong: Real; CASE loai: loai_cong_nhan OF bien_che: (he_so: Real; nghi_bhxh:Real); hop_dong: 41 bu to k lic d o m o m w o d o Chương IV: Kiểu liệu có cấu trúc w w w w w C lic k to bu Ngôn ngữ lập trình C y N O W ! XC er O W F- w PD h a n g e Vi e ! XC er PD F- c u -tr a c k c h a n g e Vi e N 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 Khi giá trị Loai = "bien_che" mẩu tin cịn có trường He_So Nghi_Bhxh, giá trị Loai = "hop_dong" lại có trường Gia_Cong_Nhat Đặc tả phép tốn Phép tốn lựa chọn phần tử mẩu tin có cấu trúc thay đổi giống mẩu tin bình thường Chẳng hạn ta sử dụng Cong_Nhan.Luong, Cong_Nhan.He_So hay Cong_Nhan.Gia_Cong_Nhat Tuy nhiên trường thuộc phần động tồn thời điểm định truy xuất tới tên trường mà khơng tồn bị lỗi Trường Loai ví dụ quan trọng phần động mẩu tin sử dụng q trình thực chương trình Người đọc tham khảo ví dụ tương đối hồn chỉnh viết Pascal uses crt; Const luong_toi_thieu = 290000; Type Loai_cong_nhan = (bien_che, hop_dong); Cong_nhan = Record ho_ten : String[20]; Ngay_cong : real; luong : real; Case loai: Loai_cong_nhan of bien_che: (He_so, so_ngay_nghi_BHXH : real); hop_dong: (don_gia: real); end; danh_sach_cong_nhan = Array[1 10] of cong_nhan; Var n : integer; ho_so : danh_sach_cong_nhan; {Nhập danh sách công nhân, thông tin liên quan đến lao động} Procedure Nhap (var ho_so: danh_sach_cong_nhan; var n: integer); Var i: integer; loaicn : char; Begin write('So cong nhan: '); readln(n); For i:=1 to n with ho_so[i] begin Writeln('Cong nhan ',i); Write('Ho va Ten: '); readln(ho_ten); Write('Loai cong nhan: A la bien che, B la hop dong '); 42 bu to k lic d o m o o c u -tr a c k C w w w d o Chương IV: Kiểu liệu có cấu trúc m C lic k to bu y Ngơn ngữ lập trình w w w w y N O W ! XC er O W F- w PD h a n g e Vi e ! XC er PD F- c u -tr a c k c h a n g e Vi e y N 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 bu to k d o m o o c u -tr a c k w lic w w w d o Chương IV: Kiểu liệu có cấu trúc m C lic k to bu Ngôn ngữ lập trình w w w C y N O W ! XC er O W F- w PD h a n g e Vi e ! XC er PD F- c u -tr a c k c ... dong '); 42 bu to k lic d o m o o c u -tr a c k C w w w d o Chương IV: Kiểu liệu có cấu trúc m C lic k to bu y Ngôn ngữ lập trình w w w w y N O W ! XC er O W F- w PD h a n g e Vi e ! XC er PD F-... nghi_bhxh:Real); hop_dong: 41 bu to k lic d o m o m w o d o Chương IV: Kiểu liệu có cấu trúc w w w w w C lic k to bu Ngơn ngữ lập trình C y N O W ! XC er O W F- w PD h a n g e Vi e ! XC er PD F- c... ← Luong 40 bu to k d o m o o c u -tr a c k w lic w w w d o Chương IV: Kiểu liệu có cấu trúc m C lic k to bu Ngơn ngữ lập trình w w w C y N O W ! XC er O W F- w PD h a n g e Vi e ! XC er PD F-