[Pascal – TUT] Bài 9: Kiểu bản ghi – Record
1. Khai báo:
a. Khai báo gián tiếp
Cú pháp:
Type <Tên kiểu> = RECORD <Tên trường 1> :<Kiểu trường> <Tên trường 2>:<Kiểu trường> ... END;
Ví dụ:
Type date=RECORD ngay,thang:byte; nam:word; End; HOCSINH = RECORD MaSV:string[15]; Hoten:string[30]; Ngaysinh:date; Diachi: String; End;
Lưu ý: Nếu không có kiểm date trước đó ta có thể mô tả trực tiếp như sau:
Type HOCSINH = RECORD MaSV:string[15]; Hoten:string[30]; Ngaysinh:record {sử dụng khai báo trực tiếp} ngay:1..31; thang:1..12; nam:word; End; Diachi: String; End; Var HSA,HSB: HOCSINH; Lop12A: Array[1..50] of HOCSINH;
b. Khai báo trực tiếp
Cú pháp:
<pre>var <tên kiểu>: RECORD <Tên trường 1> :<Kiểu trường> <Tên trường 2>:<Kiểu trường> ... END;
2. Truy xuất biến kiểu record
Để truy xuất đến biến kiểu record ta phải truy xuất vào các trường của biến với cú pháp như sau:
<Tên biến record>.<tên trường>
Chú ý:
– Các biến cùng kiểu record có thể gán được cho nhau khi đó toàn bộ thông tin từ biến record này sẽ được gán cho biến kiểu record kia.
Ví dụ ta gán: HSA:=HSB thay vì ta phải thực hiện gán từng trường của các biến như
HSA.hoten:=HSB.hoten;
HSA.ngaysinh:=HSB.ngaysinh;
…
– Có thể dùng phép so sánh =, <> cho 2 biến kiểu record nhưng không thể dùng các phép so sánh <,<=,>,>=.
Ví dụ ta có thể so sánh:
if HSA=HSB then writeln(‘Cung mot hoc sinh’);
hoặc if HSA.hoten=HSB.hoten then writeln(‘Hai hoc sinh trung ten’);
Nhưng không thể so sánh:
if HSA>HSB then writeln(‘HS A lon hon HS B’);
– Không dùng các thủ tục read, readln, write, writeln cho cả một biến record
Ví dụ không được dùng:
writeln(HSA);
– Không được dùng tất cả các phép toán số học và logic với biến kiểu record.
3. Câu lệnh with
Như trên ta thấy việc truy xuất một trường biến kiểu Record phải thông qua tên và dấu chấm, làm phức tạp thêm chương trình, giải quyết bớt phần nào sự phức tạp này, Pascal đưa ra câu lệnh With … do
Cú pháp:
WITH <biến kiểu record> Do <câu lệnh>;
Chú ý:
Chúng ta có thể lồng các câu lệnh with do vào với nhau để truy cập vào các trường ở xâu trong record.
Ví dụ với HOCSINH và Ngaysinh đều là biến record nhưng ngaysinh là một trường của HOCSINH ta có thể viết như sau:
WITH HOCSINH DO WITH ngaysinh DO <lệnh>;
hoặc
WITH HOCSINH, ngaysinh DO <lệnh>;
Bài viết gốc : vietsource.net
Do trình tự post bài có chút nhầm lẫn nên Bài 10: Tệp trong pascal – Kiểu file đã được viết trước đó, các bạn xem tại đây nhé.
cảm ơn bạn nhiều lắm 😀
Chúc bạn học tốt. 😀
Ghé thăm blog thường xuyên nhé.
Anh ơi sao không có phần 2 ạ….
E có 1 số bài muốn hỏi anh Quân và e có thể hỏi qua email của A được không ạ!!
Phần 2 quên không làm 😀
ok có gì bạn cứ mail cho mình
Anh ơi anh có bài tập về bản ghi ko ah, anh up cho em xin với
Bạn tìm trên mạng nhiều lắm. “Bài tập bản ghi pascal”
Ai giúp mình làm bài này được không? “Cho một dãy gồm n số nguyên dương a1, a2, …, an. Hãy tìm tất cả các số nguyên tố và sắp xếp theo thứ tự tăng dần của dãy số tìm được sau đó tính tích dãy số tìm được đó. Nếu không tìm được thì xuất hiện câu thông báo “Day so khong thoa dieu kien”.”
chương trình này mình chưa có sắp xếp được, chỉ có làm mấy các yêu cầu kia thôi
PROGRAM Hacker;
USES crt;
VAR n,j,z :^integer;
A,B :array[1..500] of integer;
test :char;
i,dem :integer;
tich :longint;
BEGIN
repeat
repeat
clrscr;
write(‘So phan tu cua day so la ‘);
new(n);
read(n^);
until n^ > 0;
write(‘Nhap day so.’);
readkey;
clrscr;
for i:= 1 to n^ do
begin
write(‘So thu ‘,i,’ la ‘);
readln(A[i]);
end;
new(j);
new(z);
j^:= 0;
dem:= 0;
for i:= 1 to n^ do
begin
z^:= 2;
while A[i] mod z^ 0 do z^:= z^ + 1;
if A[i] = z^ then
begin
j^:= j^ + 1;
B[j^]:= A[i];
dem:= dem + 1;
end;
end;
if dem = 0 then
begin
clrscr;
write(‘Day so khong thoa ma dieu kien.’);
end
else
begin
tich:= 1;
for i:= 1 to dem do tich:= tich * B[i];
write(‘Tich cac so nguyen to la ‘,tich,’.’);
readkey;
end;
clrscr;
writeln(‘Ban co muon quay lai va tiep tuc ?’);
writeln(‘1. Co’);
writeln(‘2. Khong’);
test:= readkey;
until test = ‘2’;
END.
Em thật sự cảm.ơn anh rất nhiều em đi ôn hsg tin 11 thầy giảng kiểu bản gi e không hiểu xem anh giảng cũng như cho ví dụ em cảm thấy mình hiểu ra nhiều mong anh tiếp tục cho ra các bài viết hay thế này ạ…Thân gửi anh :).
Cảm ơn bạn nhé. 🙂
Kiểu Pointtype có phải là bản gi ko anh
Đúng rồi bạn.
kiểu PointType được định nghĩa sẵn bởi unit Graph như sau:
PointType = Record X, Y : Integer End;