Định nghĩa đa thức
- Trong đó a n , a n-1 , , a 1 , a 0 Є K (K là một tr-ờng tuỳ ý) với a n ≠ 0, đ-ợc gọi là đa thức bậc n Ta viết degf = n có nghĩa là bậc của f bằng n
- Các phần tử a n , a n-1 , , a 1 , a 0 Є K đ-ợc gọi là các hệ tử, x là ẩn
- a i x i , i = 0 , n là các hạng tử của đa thức f(x)
- a n x n là hạng tử cao nhất của đa thức f(x)
- a 0 là hạng tử tự do của đa thức f(X)
- Đa thức f(x) = a n x n , a ≠ 0 còn đ-ợc gọi là đơn thức bậc n
- Trong tr-ờng hợp a 0 ≠ 0, n = 0 thì f(x) có bậc bằng 0
- Đa thức f(x) đ-ợc gọi là đa thức không nếu và chỉ nếu tất cả các hệ số của nó bằng 0
Chúng ta cần nhấn mạnh rằng biểu thức (1) luôn được đồng nhất với các biểu thức dẫn dắt từ (1), tức là tổng hợp theo thứ tự tùy ý các đơn thức tham gia trong (1) Do đó, biểu thức có thể được viết theo thứ tự ngược lại với (1).
(2) a 0 + a 1 x + + a n-1 x n-1 + a n x n cùng là một đa thức g(x) đồng nhất với f(x)
- Khi K là một tr-ờng số thực hoặc phức thay cho thuật ngữ hệ tử và hạng tử ta sẽ dùng thuật ngữ hệ số và số hạng.
Định nghĩa các phép toán trên đa thức
Trừ hai đa thức
Phép trừ hai đa thức cũng t-ơng tự nh- phép cộng hai đa thức:
Cho f(x) = a n x n + a n-1 x n-1 + + a 1 x+ a 0 và g(x) = b n x n + b n-1 x n-1 + + b 1 x + b 0 , là các đa thức với hệ số trong K
Hiệu của hai đa thức f(x) và g(x) được biểu diễn dưới dạng f(x) - g(x) = (a_n - b_n)x^n + (a_{n-1} - b_{n-1})x^{n-1} + + (a_1 - b_1)x + (a_0 - b_0) Nếu bậc của hai đa thức không bằng nhau, chúng ta cần thêm các số hạng với hệ số bằng không để đảm bảo tính nhất quán trong biểu thức.
2.3) Phép nhân hai đa thức
Cho hai đa thức: f(x) = a n x n + a n-1 x n-1 + + a 1 x + a 0 , a n ≠ 0 g(x) = b m x m + b m-1 x m-1 + + b 1 x + b 0 , b m ≠ 0 th× f(x)g(x) = d n+m x n+m + d n+m-1 x n+m-1 + + d 1 x+ d 0 trong đó
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
Hiển nhiên degf(X)g(X) = degf(X) + degg(X) f(X)g(X) = g(X)f(X) và f(X)(r(X) + s(X)) = f(X)r(X) + f(X)s(X)
2.4) Phép chia hai đa thức
Giả sử f, g Є K[x] và g ≠ 0 khi đó f có thể viết duy nhất d-ới dạng:
Phép chia đa thức là quá trình chia đa thức f(x) cho đa thức g(x) khác không Trong đó, f(x) được gọi là đa thức bị chia, g(x) là đa thức chia, q(x) là thương, và r(x) là phần dư của phép chia.
Nếu r(x) = 0 ta nói f(x) chia hết cho g(x), khi đó ta cũng nói g(x) là một -ớc của f(x)
2.5) Tính giá trị của đa thức
Với các hệ số của đa thức a 0 , a 1 , , a n-1 , a n và x cho tr-ớc Để tính giá trị của đa thức ta dùng thuật toán Horner
P = ( ((a n x + a n-1 )x + a n-2 )x + + a 1 )x + a 0 , trong đó quá trình truy hồi đ-ợc tiến hành nh- sau:
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
2.6) Ước chung lớn nhất của hai đa thức
Nhắc lại rằng g Є K[x], g ≠ 0 đ-ợc gọi là -ớc chung của f Є K[x] nếu f chia hết cho g và ta viết f | g
+ h là -ớc chung của f và g nếu h | f và h | g
UCLN (ước chung lớn nhất) của hai đa thức f và g là đa thức lớn nhất chia hết cho cả f và g, đồng thời chia hết cho mọi ước chung khác Để xác định UCLN của hai đa thức không đồng thời bằng không, chúng ta có thể áp dụng thuật chia Euclid.
Khi g khác 0, ta chia f cho g để thu được phần dư r1 Nếu r1 khác 0, ta tiếp tục chia g cho r1, thu được phần dư r2 Quá trình này tiếp diễn cho đến khi tồn tại k ≥ 1 sao cho r k-1 chia hết cho r k Từ đẳng thức r k-1 = r k h k+1, ta suy ra rằng r k cũng chia hết cho r k-2 và r k-3, từ đó kết luận rằng r k chia hết cho cả g và f Nếu φ là một ước chung của f và g, thì φ cũng chia hết cho r1 và r2, do đó φ cũng chia hết cho r k.
Tính giá trị của đa thức
Với các hệ số của đa thức a 0 , a 1 , , a n-1 , a n và x cho tr-ớc Để tính giá trị của đa thức ta dùng thuật toán Horner
P = ( ((a n x + a n-1 )x + a n-2 )x + + a 1 )x + a 0 , trong đó quá trình truy hồi đ-ợc tiến hành nh- sau:
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
Ước chung lớn nhất của hai đa thức
Nhắc lại rằng g Є K[x], g ≠ 0 đ-ợc gọi là -ớc chung của f Є K[x] nếu f chia hết cho g và ta viết f | g
+ h là -ớc chung của f và g nếu h | f và h | g
UCLN (ước chung lớn nhất) của hai đa thức f và g là đa thức lớn nhất chia hết cho cả f và g, đồng thời chia hết cho mọi ước chung khác Để tìm UCLN của hai đa thức không đồng thời bằng không, ta có thể áp dụng thuật chia Euclid.
Khi g ≠ 0, ta chia f cho g và thu được phần dư r1 Nếu r1 ≠ 0, ta tiếp tục chia g cho r1 để có phần dư r2 Quá trình này tiếp diễn do bậc của các phần dư giảm dần, dẫn đến tồn tại k ≥ 1 sao cho rk-1 | rk Từ đẳng thức rk-1 = rk hk+1, ta suy ra rk | rk-2 và rk | rk-3, do đó rk | g và rk | f Nếu φ là một ước chung tùy ý của f và g, thì φ | r1 và φ | r2, từ đó suy ra φ | rk.
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
Ch-ơng 2: Cài đặt đa thức bằng mảng
Lý do cài đặt bằng mảng
Cấu trúc mảng là một khái niệm phổ biến trong tất cả các ngôn ngữ lập trình, đặc biệt là trong Pascal Việc hiểu và khai thác hiệu quả cấu trúc mảng sẽ giúp chúng ta giải quyết nhiều bài toán lập trình một cách dễ dàng.
Mảng có ưu điểm cho phép đọc từ cả hai chiều, xuôi và ngược, một cách dễ dàng Bên cạnh đó, việc truy xuất đến một phần tử trong mảng cũng diễn ra nhanh chóng.
Mảng được lưu trữ kế tiếp cho phép truy cập trực tiếp vào các phần tử dựa trên địa chỉ tính toán, do đó mang lại tốc độ truy cập nhanh và đồng đều cho mọi phần tử trong mảng.
Mặc dù có nhiều ứng dụng có thể sử dụng để thể hiện mối quan hệ cấu trúc giữa các phần tử dữ liệu, nhưng vẫn tồn tại một số nhược điểm rõ ràng.
- Không có phép bổ sung phần tử hoặc loại bỏ phần tử đ-ợc thực hiện đối với mảng
- Không tận dụng đ-ợc các vùng nhớ có kích th-ớc nhớ nhỏ vì các thành phần của mảng cần đ-ợc l-u trữ một cách kế tiếp
Khi sử dụng mảng, việc khai báo kích thước trước là cần thiết, nhưng điều này gặp khó khăn khi chúng ta không thể dự đoán kích thước dữ liệu một cách chính xác Do đó, thường xảy ra tình trạng khai báo kích thước không phù hợp.
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
9 lãng phí bộ nhớ hoặc ng-ợc lại khai báo thiếu thì máy bị treo không chạy nổi ch-ơng trình
Víi (2x^2 + x - 3) Để có kết quả là (5x^2)
Mảng một chiều có thể được sử dụng để biểu diễn đa thức, trong đó hệ số của số hạng \(x^i\) được lưu trữ tại phần tử thứ \(i\) của mảng, và bậc của đa thức được lưu trữ ở phần tử -1 Do đó, phép cộng hai đa thức tương đương với phép cộng hai mảng Mặc dù cách biểu diễn này cho phép xử lý đơn giản, nhưng vẫn tồn tại một số nhược điểm Ví dụ, đa thức \(3x^2 - x + 3\) được lưu trữ trong mảng một chiều.
Các hệ số t-ơng ứng các lũy thừa Đa thức: 2x^2 + x – 3 đ-ợc l-u trữ
Kết quả khi cộng hai đa thức trên:
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
Kết quả là một mảng mới chứa nhiều phần tử bằng 0, tuy nhiên nó vẫn chiếm ô nhớ trong bộ nhớ Việc này dẫn đến sự lãng phí bộ nhớ rất lớn, vì các giá trị này không được sử dụng.
Định nghĩa kiểu mảng
Kiểu mảng (Array) là một cấu trúc dữ liệu bao gồm một số lượng phần tử cố định, tất cả đều thuộc cùng một kiểu dữ liệu Nói cách khác, kiểu mảng cho phép lưu trữ nhiều dữ liệu có cùng loại trong một dãy.
Kiểu mảng có những đặc tr-ng sau:
- Các phần tử của mảng phải cùng kiểu, kiểu đó gọi là kiểu cơ sở hay kiểu thành phần
Các phần tử trong mảng được xác định bởi chỉ số, là vị trí số thứ tự của chúng Chỉ số phải thuộc kiểu dữ liệu rời rạc, cho phép truy cập trực tiếp vào từng phần tử thông qua chỉ số tương ứng.
- Các chỉ số là các biểu thức nằm trong dấu ngoặc vuôn [] đặt ngay sau tên mảng và kiểu của chúng gọi là kiểu chỉ số
- Kiểu chỉ số là một kiểu nguyên hoặc miền con, giá trị của chỉ số có thể là âm hoặc d-ơng.
Cách khai báo
= Array[] of ;
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
= Array[] of ;
ý t-ởng giải thuật
Bài toán yêu cầu xử lý các phép toán trên đa thức được cài đặt bằng mảng Đa thức được định nghĩa là một tập hợp các hệ số, trong đó mỗi hệ số tương ứng với một số luỹ thừa và bậc của đa thức Cụ thể, đa thức có dạng f(x) = a_n x^n + a_(n-1) x^(n-1) + + a_0, với điều kiện a_n khác 0.
Biểu diễn bộ hệ số, và bậc của đa thức trên cùng mảng một chiều
Các hệ số t-ơng ứng các lũy thừa Khai báo đa thức a:
Var a:array[-1 maxbac] of real;
Trong đó: maxbac là một số cố định cho tr-ớc a[-1] = n là bậc của đa thức
Cho hai đa thức f(x) và g(x) nh- sau: f(x) = a n x n + a n-1 x n-1 + + a 0 , a n ≠ 0 g(x) = b m x m + b m-1 x m-1 + + b 0 , b m ≠ 0
* Phép tính cộng hai đa thức đ-ợc thực hiện nh- sau: n a 0 a 1 a n-2 a n-1 a n
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
Ta có thể biểu diễn đa thức d dưới dạng mảng một chiều, trong đó phần tử đầu tiên là bậc của đa thức, và các phần tử còn lại chứa hệ số tương ứng với từng luỹ thừa của các số hạng.
Phép cộng hai đa thức được thực hiện bằng cách cộng từng hệ số của các hạng tử cùng bậc Nếu bậc của hai đa thức không giống nhau, chúng ta cần thêm các hạng tử với hệ số bằng không để đảm bảo tính chính xác trong phép cộng.
Khi cộng hai đa thức với nhau ta sẽ đ-ợc một đa thức mới, đa thức c víi: c[i] = a[i] + b[i] (i: 0->max(n,m))
Thực hiện phép trừ đa thức a cho đa thức b
T-ơng tự nh- phép tính cộng hai đa thức, ta chỉ thay dấu cộng bởi dÊu trõ
Cho hai đa thức f(x) và g(x) nh- sau: f(x) = a n x n + a n-1 x n-1 + + a 0 , a n ≠ 0 g(x) = b m x m + b m-1 x m-1 + + b 0 , b m ≠ 0
Nhân hai đa thức thực hiện nh- sau:
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
Cho hai đa thức f(x) và g(x) nh- sau: f(x) = a n x n + a n-1 x n-1 + + a 0 , a n ≠ 0 g(x) = b m x m + b m-1 x m-1 + + b 0 , b m ≠ 0
Dựa vào định nghĩa phép chia hai đa thức đã trình bày ở ch-ơng 1 để thực hiện phép chia đa thức a cho đa thức b
4.5) Tính giá trị của đa thức áp dụng thuật toán Horner để tính giá trị của đa thức
4.6) Tìm -ớc chung lớn nhất của hai đa thức áp dụng thuật chia ECLIDE
5 Cài đặt ch-ơng trình
Procedure CongDT(a,b:mang;Var c:mang);
For i:=0 to max do c[i]:=a[i]+b[i]; i:=max;
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
Procedure TruDT(a,b:mang;Var c:mang);
For i:=0 to max do c[i]:=a[i] - b[i]; i:=max;
Procedure NhanDT(a,b:mang; Var c:mang);
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
Procedure ChiaDT(a,b:mang; Var q,r:mang);
For i:=0 to round(q[-1]) do q[i]:=0; m:=round(b[-1]);
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
5.5) Tính giá trị của đa thức
Function GiaTri(x:real; a:mang):real;
5.6) Tìm -ớc chung lớn nhất của hai đa thức
Procedure UCLN(a,b:mang; var c:mang);
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
18 ch-ơng 3: cài đặt đa thức bằng mảng động
1 Lý do cài đặt bằng mảng động
Trong lập trình Pascal, biến tĩnh có kích thước và kiểu dữ liệu cố định, tồn tại suốt quá trình chạy chương trình, dẫn đến lãng phí bộ nhớ Để khắc phục nhược điểm này, Pascal cho phép sử dụng biến động, được sinh ra trong quá trình thực hiện chương trình và có thể được xóa khỏi bộ nhớ sau khi không cần thiết Điều này giúp tiết kiệm bộ nhớ, vì máy chỉ cấp phát ô nhớ cho biến khi cần thiết và có thể giải phóng sau khi sử dụng.
Biến động có nhược điểm là không có địa chỉ cố định, gây khó khăn trong việc truy cập Để khắc phục, các nhà thiết kế phần mềm đã phát triển biến con trỏ, loại biến này lưu trữ địa chỉ của biến động Biến con trỏ cho phép thao tác với các giá trị địa chỉ, từ đó giúp khai thác bộ nhớ hiệu quả, tiết kiệm tài nguyên và đảm bảo an toàn cho dữ liệu.
= ;
: ^;
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
2.3) Lấy nội dung của một biến con trỏ đang trỏ đến
Dùng thủ tục New(Var ptr:Pointer)
- Tạo ra một vùng biến động có kiểu và kích th-ớc theo quy định
- H-ớng con trỏ đến vùng biến động này
- Thủ tục Release(Var HeapPtr : Pointer);
Thủ tục cho phép xoá toàn bộ vùng nhớ Heap từ điểm đã đánh dấu, bằng cách đặt con trỏ HeapPtr tới địa chỉ của biến động đã được đánh dấu xoá Khi thực hiện thủ tục Release, tất cả vùng nhớ nằm phía trên địa chỉ này sẽ bị xoá, trong khi các vùng nhớ mà các biến động sử dụng ở giữa Heap sẽ không bị ảnh hưởng.
- Thủ tục Dispose(Var Ptr : Pointer);
Thủ tục xoá một vùng nhớ do thủ tục New cấp phát cho một biến động
Cách l-u trữ đa thức nh- sau:
Type mang = array[0 maxbac] of ^real; dt = Record m: mang; bac: shortint;
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
Trong đó: maxbac: một số cố định cho tr-ớc a.bac: bậc của đa thức a.m[0]^ a.m[a.bac]^: hệ số t-ơng ứng với luỹ thừa
Dựa vào cách l-u trữ đó, ta cài đặt các phép toán của đa thức hoàn toàn giống nh- cách cài đặt đa thức bằng mảng
* Ví dụ minh họa thực hiện nhân hai đa thức Cho hai đa thức: Đa thức a: „7x^7 + 3x^5 + 5x + 1‟ bËc 0 1 2 3 4 5 6 7 8 100
Sau khi thực hiện phép nhân hai đa thức ta sẽ đ-ợc một đa thức míi:
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
4 Cài đặt ch-ơng trình
Procedure MCT_CongDT( a1,b1:dt;var c1:dt);
If n>m then max:=n else max:=m;
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
While (c1.m[i]=nil) and (i>=0) do dec(i); c1.bac:=i;
Procedure MCT_Trudt(a1,b1:dt; var c1:dt);
If n>m then max:=n else max:=m;
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
While (c1.m[i]=nil) and (i>=0) do dec(i); c1.bac:=i;
Procedure MCT_NhanDT(a1,b1:dt;var c1:dt);
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
If (k0 then write('x');
If tam^.nd.lth>1 then write('^',tam^.nd.lth);
If (tam^.kenil) and (tam^.kệnd.hso>0) then write('+'); tam:=tam^.ke;
Procedure DSLK_CongDT(f,g:dt; var h:dt);
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
If (not DSLK_DT0(f)) and (not DSLK_DT0(g)) then
Begin new(tam1); tam1^.nd:=tam^.nd; tam1^.ke:=h.trodt; h.trodt:=tam1; tam:=tam^.ke;
Begin new(tam1); tam1^.nd:=tam^.nd; tam1^.ke:=h.trodt; h.trodt:=tam1; tam:=tam^.ke;
Else If not DSLK_DT0(g) then h:=g
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
Procedure DSLK_TruDT(f,g:dt; var h:dt);
Begin h.trodt:=nil; tam:=f.trodt;
Begin new(tam1); tam1^.nd:=tam^.nd; tam1^.ke:=h.trodt; h.trodt:=tam1; tam:=tam^.ke;
Begin new(tam1); tam1^.nd.hso:=-tam^.nd.hso; tam1^.nd.lth:=tam^.nd.lth; tam1^.ke:=h.trodt; h.trodt:=tam1; tam:=tam^.ke;
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
Procedure DSLK_NhanDT(f,g:dt; var h:dt);
Var tam,tama,tamb,tamc:trosh;
If (not DSLK_DT0(f)) and (not DSLK_DT0(g)) then
Begin new(tam); tam^.nd.hso:=tamậnd.hso*tamb^.nd.hso; tam^.nd.lth:=tamậnd.lth+tamb^.nd.lth; tam^.ke:=h.trodt; h.trodt:=tam;
DSLK_chuanhoa(h); tamb:=tamb^.ke;
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
Procedure DSLK_ChiaDT(f,g:dt; Var h,k:dt);
Var t,q1:dt; tama,tamb,tamq1:trosh;
Begin h.trodt:=nil; tamb:=g.trodt;
Begin new(tamq1); tama:=f.trodt; tamq1^.nd.lth:=f.bac-g.bac; tamq1^.nd.hso:=tamậnd.hso/tamb^.nd.hso; tamq1^.ke:=nil; q1.trodt:=tamq1;
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
41 tamq1^.ke:=h.trodt; h.trodt:=tamq1; f:=k;
4.9) Tính giá trị cho đa thức
Function DSLK_GT(f:dt; x:real):real;
Var tam:trosh; i,n:byte; t:real;
Begin tam:=f.trodt; t:=tam^.nd.hso;
If tam^.ke nil then
Begin n:= tam^.nd.lth-tam^.kệnd.lth;
For i:=1 to n-1 do t:=x*t; t:=x*t+tam^.kệnd.hso;
Else for i:=1 to tam^.nd.lth do t:=x*t; tam:=tam^.ke;
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
4.10) Tìm -ớc chung lớn nhất cho hai đa thức
Procedure DSLK_TinhUCLN(f,g:dt;var h:dt);
Begin tamc:=h.trodt; tamc^.nd.hso:=1;
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
43 ch-ơng 5: Thiết kế đồ họa
1 Cách sử dụng Font Tiếng Việt trong pascal
Ngôn ngữ lập trình Pascal chỉ hỗ trợ bộ phông tiếng Anh, vì vậy để sử dụng tiếng Việt, người dùng cần cài đặt phần mềm soạn thảo tiếng Việt trong môi trường DOS, nơi đã tích hợp sẵn bộ font tiếng Việt Tuy nhiên, cần lưu ý rằng không được sử dụng bộ phông tiếng Việt trong các chuỗi ký tự, cũng như không được phép dùng chúng để đặt tên biến hay tên hàm trong chương trình.
Lý do cài đặt bằng mảng con trỏ
Trong lập trình Pascal, biến tĩnh có kích thước và kiểu dữ liệu cố định, tồn tại suốt quá trình chạy chương trình, dẫn đến lãng phí bộ nhớ Để khắc phục vấn đề này, Pascal cho phép sử dụng biến động, được sinh ra trong quá trình thực hiện chương trình thay vì lúc khởi động Biến động chỉ được cấp phát bộ nhớ khi cần thiết và có thể được xóa sau khi sử dụng, giúp tiết kiệm bộ nhớ hiệu quả.
Biến động có nhược điểm là không có địa chỉ cố định, gây khó khăn trong việc truy cập Để khắc phục, nhà thiết kế phần mềm giới thiệu biến con trỏ, loại biến chứa địa chỉ của biến động Biến con trỏ cho phép thao tác trực tiếp trên các giá trị địa chỉ, giúp khai thác bộ nhớ hiệu quả, tiết kiệm không gian lưu trữ và đảm bảo an toàn cho dữ liệu.
Cách khai báo
= ;
: ^;
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
2.3) Lấy nội dung của một biến con trỏ đang trỏ đến
Dùng thủ tục New(Var ptr:Pointer)
- Tạo ra một vùng biến động có kiểu và kích th-ớc theo quy định
- H-ớng con trỏ đến vùng biến động này
- Thủ tục Release(Var HeapPtr : Pointer);
Thủ tục xóa toàn bộ vùng nhớ Heap từ điểm đã đánh dấu yêu cầu đặt con trỏ HeapPtr tới địa chỉ của biến động đã được đánh dấu Khi thực hiện thủ tục Release, tất cả vùng nhớ nằm trên địa chỉ này sẽ bị xóa, trong khi các vùng nhớ được các biến động khác sử dụng ở giữa Heap sẽ không bị xóa.
- Thủ tục Dispose(Var Ptr : Pointer);
Thủ tục xoá một vùng nhớ do thủ tục New cấp phát cho một biến động.
Cách l-u trữ đa thức
Cách l-u trữ đa thức nh- sau:
Type mang = array[0 maxbac] of ^real; dt = Record m: mang; bac: shortint;
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
Trong đó: maxbac: một số cố định cho tr-ớc a.bac: bậc của đa thức a.m[0]^ a.m[a.bac]^: hệ số t-ơng ứng với luỹ thừa
Dựa vào cách l-u trữ đó, ta cài đặt các phép toán của đa thức hoàn toàn giống nh- cách cài đặt đa thức bằng mảng
* Ví dụ minh họa thực hiện nhân hai đa thức Cho hai đa thức: Đa thức a: „7x^7 + 3x^5 + 5x + 1‟ bËc 0 1 2 3 4 5 6 7 8 100
Sau khi thực hiện phép nhân hai đa thức ta sẽ đ-ợc một đa thức míi:
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
Cài đặt ch-ơng trình
Procedure MCT_CongDT( a1,b1:dt;var c1:dt);
If n>m then max:=n else max:=m;
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
While (c1.m[i]=nil) and (i>=0) do dec(i); c1.bac:=i;
Procedure MCT_Trudt(a1,b1:dt; var c1:dt);
If n>m then max:=n else max:=m;
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
While (c1.m[i]=nil) and (i>=0) do dec(i); c1.bac:=i;
Procedure MCT_NhanDT(a1,b1:dt;var c1:dt);
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
If (k0 then write('x');
If tam^.nd.lth>1 then write('^',tam^.nd.lth);
If (tam^.kenil) and (tam^.kệnd.hso>0) then write('+'); tam:=tam^.ke;
Procedure DSLK_CongDT(f,g:dt; var h:dt);
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
If (not DSLK_DT0(f)) and (not DSLK_DT0(g)) then
Begin new(tam1); tam1^.nd:=tam^.nd; tam1^.ke:=h.trodt; h.trodt:=tam1; tam:=tam^.ke;
Begin new(tam1); tam1^.nd:=tam^.nd; tam1^.ke:=h.trodt; h.trodt:=tam1; tam:=tam^.ke;
Else If not DSLK_DT0(g) then h:=g
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
Procedure DSLK_TruDT(f,g:dt; var h:dt);
Begin h.trodt:=nil; tam:=f.trodt;
Begin new(tam1); tam1^.nd:=tam^.nd; tam1^.ke:=h.trodt; h.trodt:=tam1; tam:=tam^.ke;
Begin new(tam1); tam1^.nd.hso:=-tam^.nd.hso; tam1^.nd.lth:=tam^.nd.lth; tam1^.ke:=h.trodt; h.trodt:=tam1; tam:=tam^.ke;
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
Procedure DSLK_NhanDT(f,g:dt; var h:dt);
Var tam,tama,tamb,tamc:trosh;
If (not DSLK_DT0(f)) and (not DSLK_DT0(g)) then
Begin new(tam); tam^.nd.hso:=tamậnd.hso*tamb^.nd.hso; tam^.nd.lth:=tamậnd.lth+tamb^.nd.lth; tam^.ke:=h.trodt; h.trodt:=tam;
DSLK_chuanhoa(h); tamb:=tamb^.ke;
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
Procedure DSLK_ChiaDT(f,g:dt; Var h,k:dt);
Var t,q1:dt; tama,tamb,tamq1:trosh;
Begin h.trodt:=nil; tamb:=g.trodt;
Begin new(tamq1); tama:=f.trodt; tamq1^.nd.lth:=f.bac-g.bac; tamq1^.nd.hso:=tamậnd.hso/tamb^.nd.hso; tamq1^.ke:=nil; q1.trodt:=tamq1;
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
41 tamq1^.ke:=h.trodt; h.trodt:=tamq1; f:=k;
4.9) Tính giá trị cho đa thức
Function DSLK_GT(f:dt; x:real):real;
Var tam:trosh; i,n:byte; t:real;
Begin tam:=f.trodt; t:=tam^.nd.hso;
If tam^.ke nil then
Begin n:= tam^.nd.lth-tam^.kệnd.lth;
For i:=1 to n-1 do t:=x*t; t:=x*t+tam^.kệnd.hso;
Else for i:=1 to tam^.nd.lth do t:=x*t; tam:=tam^.ke;
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
4.10) Tìm -ớc chung lớn nhất cho hai đa thức
Procedure DSLK_TinhUCLN(f,g:dt;var h:dt);
Begin tamc:=h.trodt; tamc^.nd.hso:=1;
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
43 ch-ơng 5: Thiết kế đồ họa
Cách sử dụng Font tiếng việt trong Pascal
Ngôn ngữ lập trình Pascal chỉ hỗ trợ bộ phông tiếng Anh, vì vậy để sử dụng tiếng Việt, người dùng cần phần mềm soạn thảo tiếng Việt trong môi trường DOS, với bộ Font tiếng Việt đã được cài sẵn Tuy nhiên, cần lưu ý rằng không được sử dụng bộ phông tiếng Việt trong các xâu ký tự, cũng như không được phép dùng chúng để đặt tên biến hay tên hàm trong chương trình.
Sau khi chạy chương trình, cần khởi động chương trình thường trú điều khiển phông Tiếng Việt để có thể quan sát và nhập Tiếng Việt trong chương trình của mình thông qua các thủ tục Read và Readln.
Phần mềm VietRes là một ứng dụng giúp gõ Tiếng Việt trong môi trường DOS, tương tự như VietKey Để sử dụng, người dùng chỉ cần nhập lệnh VRD trong DOS, sau đó biểu tượng quay tròn sẽ xuất hiện ở góc phải màn hình Để mở bảng điều khiển của chương trình, nhấn tổ hợp phím CTRL+TAB.
Cài đặt Font vào hệ thống
Sau khi cài đặt bộ Font mới, nó sẽ thay thế bộ Font mặc định trong hệ thống máy (BIOS) Khi đó, các ký tự sẽ được hiển thị theo dạng tương ứng với mã ASCII của bộ Font cũ.
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
Trong đó: loadfont (thủ tục cài đặt Font tiếng việt); removefont (thủ tục loại bỏ Font tiếng việt)
Để hiển thị Tiếng Việt trong chương trình, cần gọi thủ tục loadfont, và để xóa bỏ font, sử dụng thủ tục removefont Hai thủ tục này chỉ hỗ trợ hiển thị Font Tiếng Việt, trong khi để gõ Tiếng Việt, người dùng cần sử dụng phần mềm hỗ trợ Tiếng Việt như VRD của VietRes.
Cách sử dụng chuột trong Pascal
Begin asm mov ah,11h mov al,00h mov bx,1000h mov cx,0FFh lea dx,fe mov bp,dx mov dx,ds mov es,dx mov dx,0 int 10h end; end;
Begin asm mov ax,1104h xor bx,bx int 10h end;
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
45 Để sử dụng chuột trong Pascal ta dùng ngắt 33h và các hàm trong Dos
2.1 ) Ngắt 33h, hàm 00h khởi tạo driver con chuột
Hàm này khởi tạo driver con chuột và thực hiện kiểm tra con chuét
Ra: AX = FFFFh: Trong tr-ờng hợp này, driver đ-ợc cài đặt
BX = số l-ợng phím của con chuột
AX = 0000h: Lỗi, driver không đ-ợc cài đặt
Con trỏ chuột xuất hiện ở giữa màn hình và có thể biến mất Trong chế độ đồ họa, con trỏ có hình dạng mũi tên, trong khi ở chế độ văn bản, nó hiển thị dưới dạng hình chữ nhật sáng Con trỏ tự động xuất hiện trên trang 0, không phụ thuộc vào chế độ sử dụng, và có thể di chuyển toàn bộ trên màn hình.
Trong ch-ơng trình sử dụng thủ tục mreset để khởi tạo chuột
2.2) Ngắt 33h, hàm 01h hiện con trỏ của con chuột
Hàm này hiển thị con trỏ chuột trên màn hình, cho phép người dùng thấy vị trí của nó và theo dõi các di chuyển của chuột.
Begin Asm xor ax,ax int 33h End;
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
Trong ch-ơng trình sử dụng thủ tục mshow để hiện chuột
2.3) Ngắt 33h, hàm 02h dấu con trỏ của con chuột
Hàm này dấu con trỏ của con chuột
=> Thủ tục mhide để ẩn chuột
2.4) Ngắt 33h, hàm 03h xác định vị trí con chuột và trạng thái các phím của con chuột
Hàm này cho biết vị trí hiện thời của con chuột và trạng thái của các phÝm con chuét
Ra: BX = trạng thái các phím con chuột
Begin Asm mov ax,0002h int 33h End;
Begin Asm mov ax,0001h int 33h
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
CX = tọa độ ngang của con chuột
DX = tọa độ dọc của con chuột
Trong ch-ơng trình sử dụng thủ tục mget để lấy tọa độ chuột
2.5) Ngắt 33h, hàm 05h xác định xem đã có bao nhiêu lần một phím đ-ợc ấn
Hàm này cung cấp thông tin về số lần một phím đã được ấn kể từ lần gọi hàm trước đó, đồng thời cho biết vị trí con trỏ tại thời điểm phím được ấn lần cuối.
Ra: AX = Trạng thái tất cả các phím của con chuột
BX = Số lần phím đ-ợc ấn kể từ lần gọi hàm này lần cuối
=> Hàm sau dùng để phát hiện đang ấn chuột trái
Begin Asm mov ax,0003h int 33h mov tg,cx End; x:=tg;
Asm mov tg,dx End; y:=tg;
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh
2.6) Ngắt 33h, hàm 06h xác định xem đã có bao nhiêu lần một phím đ-ợc nhả
Hàm này cung cấp thông tin về số lần một phím được nhả kể từ lần gọi hàm trước đó, đồng thời cho biết vị trí của con trỏ tại thời điểm phím được nhả lần cuối.
Ra: BX = phím (0 = phím trái)
BX = Số lần phím đ-ợc nhả kể từ lần gọi hàm này lần cuối
Begin Asm mov ax,0005h xor bx,bx int 33h mov n,bx End; mlpressed:=n>0;
Begin Asm mov ax,0006h xor bx,bx int 33h mov n,bx End; mlreleased:=n>0;
Trần Thị Lê Na – Lớp 43B1 - khoa Công nghệ Thông tin - Đại học Vinh