<< Chapter < Page | Chapter >> Page > |
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:
(gia_cong_nhat: Real);
END;
Khai báo trên định nghĩa một mẩu tin có cấu trúc thay đổi. Mẩu tin luôn luôn có các trường Ho_Ten, Ngay_Cong, Luong và Loai. Khi giá trị của Loai = "bien_che" thì mẩu tin còn có các trường He_So và Nghi_Bhxh, trong khi đó nếu giá trị của Loai = "hop_dong" thì nó lại có trường Gia_Cong_Nhat.
Phép toán lựa chọn các phần tử của mẩu tin có cấu trúc thay đổi cũng giống như mẩu tin bình thường. Chẳng hạn ta có thể sử dụng Cong_Nhan.Luong, Cong_Nhan.He_So hay Cong_Nhan.Gia_Cong_Nhat. Tuy nhiên các trường thuộc phần động chỉ tồn tại trong một thời điểm nhất định do đó khi chúng ta truy xuất tới một tên trường mà nó không tồn tại thì sẽ bị lỗi. Trường Loai trong ví dụ trên là rất quan trọng vì nó chỉ ra phần động nào của mẩu tin được sử dụng trong quá trình thực hiện chương trình. Người đọc có thể tham khảo ví dụ tương đối hoàn chỉnh viết bằng 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, và các 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 do with ho_so[i] do begin
Writeln('Cong nhan ',i);
Write('Ho va Ten: '); readln(ho_ten);
Write('Loai cong nhan: A la bien che, B la hop dong ');
readln(loaicn);
If Upcase(loaicn) ='A' then loai := bien_che else loai := hop_dong;
write('So ngay cong: '); readln(ngay_cong);
if loai = bien_che then begin
write('He so: '); readln(he_so);
write('So ngay 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 từng công nhân, theo công thức của từng 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 do with ho_so[i] do begin
if loai = bien_che then begin {tính lương của 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ủa 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 do with ho_so[i] do 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);
end; { with Ho_so[i] }
Notification Switch
Would you like to follow the 'Cấu trúc dữ liệu' conversation and receive update notifications?