Các thủ tuc vói kiêu con trỏ

Một phần của tài liệu Lập trình pascal tập 2 (Trang 42 - 48)

a: kdl;

BEGIN

i := Addr(a); {gán địa chỉ của a cho i, có thể viết i:=@ a } a :=10 0;

Write(iA);

END.

Bạn hãy thử chạy chương trình trên.

Trong chương trình trên nếu lệnh viết ra màn hình được viết như sau:

Write(i);

thì ta sẽ nhận được kết quả gì? Vì sao?

3. Theo mẫu chương trình trên, bạn hãy lập chương trình nhập giá trị cho nhiều biến có kiểu khác nhau, sau đó truy cập vào địa chỉ của chủng để lấy g á trị và viết ra màn hình.

4. Cho coạn chương trinh sau:

Type

ref=Ainteger;

Var p, q: ref;

Begin

PA:=5; qA:=6; pA:=qA;

If p=q then p:=nil else if pA=qA then q:=p;

If p=q then qA:=4;

Writeln(pA);

End.

a. 4ỏi kiều của p, của pA là gì? Giá trị cùa p, của pA bằng bao ìhiêu?

b. cết quà in ra là gì?

5. Bạn hãy chạy thử chương trình sau:

Vogram P20705;

Type

kdl=integer;

v^ar i: Akdl;

a: kdl;

BEGIN

i:=Addr(a);

a :=10 0; Writeln(iA);

41

iA:=2 0 0; Writeln(a);

Read In;

END.

Rõ ràng trong chương trình trên ta đã sử dụng iA như là biến a.

Neu thay dòng lệnh i:=Addr(a); bằng đòng lệnh a:=iA; thì ta có đ ư ợ c kết quả như cũ không? Vì sao?

6. Đoạn chương trinh sau mô tả việc tạo một biến con trỏ mới khi (C hạy

chương trình:

Program P20706;

Type

Strl8=string[18];

Var

P: AS t r l8; BEGIN

New(P);

PA:~ Now y o u see it...1;

Dispose(P); { Now you don't... } END.

Hãy lưu ý rang biến đó không có tên nhưng ta vẫn có thể làm v iệc với nó thông qua p.

Bạn hãy tìm chỗ sai, sửa lỗi cho đoạn chương trình trên và chạy thử nó.

7. Đoạn chương trình sau mô tà việc khai báo một vùng nhớ để sử chung:

Program P20707;

Type

Rec=record

Name: string[20];

Age : Byte;

end;

Var

i: byte;

p: pointer;

BEGIN

i:=SizeOf(Rec); {tính kích thước một bản ghi }

GetMem(p,i); {định vị một vùng nhớ: địa chi, kích thước } {...}

{•••}

FreeMem(p,i); {giải phóng vùng nhớ } END.

Bạiíi hãv chạy th ử chương trình và tham khảo thêm bài 16.

8. D anh sách được ghép nối là một danh sách mà trong mỗi record, ngíoài trường chứa dữ liệu còn có một trường Next chứa địa chi cùa record tiếp sau. N ó có thể tạo nên bời chương trình sau:

Program P20708;

Type

Ptr=ARec;

Rec=record

Name: string[20];

Next: Ptr;

end;

V ar p: Ptr;

BEGIN New(p);

W rite (T e n :'); readln(pA.name);

Repeat

N ew (pA.next);

p:=pA.next:

W rite('T en:'); readln(pA.name);

Until pA.name=";

END.

Chiương trinh trên cho phép ta nhập một danh sách Tên được ghép nối từ bàin phím. Bạn hãy chạy thử chương trình và bô sung cho nó chức năng liệtt kẽ danh sách đã nhập

9- Trong bài trên, trường Next trong mỗi record cho phép ta lần tới record tiếp sau nỏ, tức là ta chỉ có thể duyệt danh sách theo một chiêu.

Đ ể từ mỗi record có thể lần tới record đứng trước nó, ta phải dùng thêm m ộ t trường chừa địa chi cùa record đứng trước nó. Ví dụ:

Type

Ptr = ARec;

Rec = record Previous: Ptr:

{ ...sử dụng vùng nhớ... }

43

Name: string[20];

Next: Ptr;

end;

Bạn hãy lập chương trình tạo nên một danh sách mà mỗi record được ghép nối với cả record đứng trước lẫn record đứng sau nó. C hương trình cho phép ta nhập một danh sách Tên từ bàn phím, sau đó liệt kê danh sách đã nhập theo cả hai thứ tự xuôi và ngược.

10. Bạn hãy lập chương trình cho phép ta nhập một danh sách Tên từ một text file, tạo nên một danh sách mà mồi record được ghép nối với cả record đứng trướe lẫn record đứng sau nó. Chương trình sẽ liệt kê danh sách đã nhập theo cả hai thứ tự xuôi và ngược.

11. Bạn hãy lập chương trình cho phép nhập từ bàn phím một danh sách được ghép nối. Sau đó gỡ bỏ một record khỏi danh sách.

12. Một lớp học gồm n bạn xếp thành vòng tròn. Bắt đầu từ bạn thứ 1 ta đếm theo chiều kim đồng hồ, đến bạn thứ k sẽ bị loại ra khỏi vòng tròn;

sau đó lại bắt đầu đếm từ bạn kế tiếp. Bạn hãy lập chương trình cho phép nhập một danh sách n học sinh theo thứ tự xếp trên vòng tròn, sau đó liệt kê lại danh sách theo thứ tự bị loại khỏi vòng. Danh sách học sinh ban đầu ghi trong tệp IN.TXT. kết quả đưa ra tệp OUT.TXT. s ố k được nhập từ bàn phím.

13. Bạn hãy lập chương trình cho phép nhập một danh sách được ghép nối. Sau đó chèn thêm một record vào danh sách.

14. Bạn hãy lập chương trình cho phép nhập một danh sách được ghép nối. Sau đó đổi chỗ hai record trong danh sách.

15. Bạn hãy lập chương trình cho phép nhập một danh sách Tên được ghép nối. Sau đó sắp xếp lại danh sách theo trường Tên.

16. Chương trình sau thực hiện việc lưu ảnh một vùng màn hình hình chữ nhật ở toạ độ (10, 20, 30, 40) vào một biến bộ nhớ kiểu con trò rồi hiển thị ra ở một vị trí khác:

Program P20716;

Uses Crt, Graph;

Var Gd, Gm: Integer;

P: Pointer;

Size: Word;

BEGIN Gd:=Detect;

InitGraph(Gd,Gm,’ ');

Bar(0,0,GetMaxX div 2,GetMaxY);

Size:=ImageSize(10. 20, 30, 40); {tính kích thước ảnh}

GetMem(P,Size); {định vị một vùng nhớ: địa chi, kích thước}

GetImage(10,20,30,40,PA); {lưu ảnh màn hình vào bộ nhớ}

Readln; {chờ gõ Enter}

PutImage(500,100,PA,NormalPut); {đặt ảnh ra màn hình}

Readln;

CloseGraph;

END.

H ãy chạy thử chương trình.

17. Bạn hãy lập chương trình vẽ hình sau, sau đó lưu hình vào một biến bộ mhớ kiểu con trò rồi hiển thị ra ờ một vị trí tuỳ chọn khác:

45

Một phần của tài liệu Lập trình pascal tập 2 (Trang 42 - 48)

Tải bản đầy đủ (PDF)

(266 trang)