Pascal - Hướng dẫn nhanh

Pascal là một ngôn ngữ có mục đích chung, cấp cao, được phát triển bởi Niklaus Wirth vào đầu những năm 1970. Nó được phát triển để dạy lập trình như một môn học có hệ thống và để phát triển các chương trình đáng tin cậy và hiệu quả.

Pascal là ngôn ngữ dựa trên Algol và bao gồm nhiều cấu trúc của Algol. Algol 60 là một tập con của Pascal. Pascal cung cấp một số kiểu dữ liệu và cấu trúc lập trình. Nó rất dễ hiểu và dễ duy trì các chương trình Pascal.

Pascal đã trở nên phổ biến trong lĩnh vực giảng dạy và học thuật vì nhiều lý do:

  • Dễ học.
  • Ngôn ngữ có cấu trúc.
  • Nó tạo ra các chương trình minh bạch, hiệu quả và đáng tin cậy.
  • Nó có thể được biên dịch trên nhiều nền tảng máy tính.

Đặc điểm của ngôn ngữ Pascal

Pascal có các tính năng sau:

  • Pascal là một ngôn ngữ được đánh máy mạnh.
  • Nó cung cấp khả năng kiểm tra lỗi rộng rãi.
  • Nó cung cấp một số kiểu dữ liệu như mảng, bản ghi, tệp và tập hợp.
  • Nó cung cấp nhiều cấu trúc lập trình khác nhau.
  • Nó hỗ trợ lập trình có cấu trúc thông qua các hàm và thủ tục.
  • Nó hỗ trợ lập trình hướng đối tượng.

Sự thật về Pascal

  • Ngôn ngữ Pascal được đặt theo tên của Blaise Pascal, nhà toán học người Pháp và người tiên phong trong phát triển máy tính.

  • Niklaus Wirth đã hoàn thành việc phát triển ngôn ngữ lập trình Pascal gốc vào năm 1970.

  • Pascal dựa trên kiểu cấu trúc khối của ngôn ngữ lập trình Algol.

  • Pascal được phát triển như một ngôn ngữ phù hợp để dạy lập trình như một môn học có hệ thống, mà việc triển khai có thể đáng tin cậy và hiệu quả.

  • Tiêu chuẩn Pascal ISO 7185 ban đầu được xuất bản vào năm 1983.

  • Pascal là ngôn ngữ cấp cao chính được sử dụng để phát triển trong Apple Lisa và trong những năm đầu của Mac.

  • Năm 1986, Apple Computer phát hành bản cài đặt Object Pascal đầu tiên, và vào năm 1993, Ủy ban Tiêu chuẩn Pascal đã xuất bản Phần mở rộng hướng đối tượng cho Pascal.

Tại sao sử dụng Pascal?

Pascal cho phép người lập trình xác định các kiểu dữ liệu có cấu trúc phức tạp và xây dựng các cấu trúc dữ liệu động và đệ quy, chẳng hạn như danh sách, cây và đồ thị. Pascal cung cấp các tính năng như bản ghi, liệt kê, biên bản con, các biến được phân bổ động với các con trỏ và tập hợp liên quan.

Pascal cho phép các định nghĩa thủ tục lồng nhau ở bất kỳ mức độ sâu nào. Điều này thực sự cung cấp một môi trường lập trình tuyệt vời để học lập trình như một môn học có hệ thống dựa trên các khái niệm cơ bản.

Trong số những cách triển khai tuyệt vời nhất của Pascal là:

  • Skype
  • Tổng chỉ huy
  • TeX
  • Macromedia Captivate
  • Apple Lisa
  • Các trò chơi PC khác nhau
  • Những hệ thống nhúng

Có một số trình biên dịch và thông dịch Pascal có sẵn để sử dụng chung. Trong số này có -

  • Turbo Pascal - cung cấp IDE và trình biên dịch để chạy các chương trình Pascal trên CP / M, CP / M-86, DOS, Windows và Macintosh.

  • Delphi- cung cấp trình biên dịch để chạy Object Pascal và tạo mã gốc cho hệ điều hành Windows 32 và 64 bit, cũng như Mac OS X và iOS 32 bit. Embarcadero đang có kế hoạch xây dựng hỗ trợ cho hệ điều hành Linux và Android.

  • Free Pascal- nó là một trình biên dịch miễn phí để chạy các chương trình Pascal và Object Pascal. Trình biên dịch Free Pascal là trình biên dịch Pascal tương thích với Turbo Pascal và Delphi 32 và 64 bit cho Linux, Windows, OS / 2, FreeBSD, Mac OS X, DOS và một số nền tảng khác.

  • Turbo51 - Đây là một trình biên dịch Pascal miễn phí cho họ vi điều khiển 8051, với cú pháp Turbo Pascal 7.

  • Oxygene - Nó là một trình biên dịch Object Pascal cho nền tảng .NET và Mono.

  • GNU Pascal (GPC) - Nó là một trình biên dịch Pascal bao gồm giao diện người dùng cho Bộ sưu tập trình biên dịch GNU.

Chúng tôi sẽ sử dụng Free Pascal trong các hướng dẫn này. Bạn có thể tải xuống Free Pascal cho hệ điều hành của mình từ liên kết: Download Free Pascal

Cài đặt Pascal miễn phí trên Linux

Bản phân phối Linux của Free Pascal có ba dạng:

  • a tar.gz phiên bản, cũng có sẵn dưới dạng các tệp riêng biệt.

  • a .rpm (Red Hat Package Manager) phiên bản.

  • a .deb (Debian) phiên bản.

Mã cài đặt cho phiên bản .rpm ::

rpm -i fpc-X.Y.Z-N.ARCH.rpm

Trong đó XYZ là số phiên bản của tệp .rpm và ARCH là một trong những kiến ​​trúc được hỗ trợ (i386, x86_64, v.v.).

Mã cài đặt cho phiên bản Debian (như Ubuntu) -

dpkg -i fpc-XXX.deb

Trong đó XXX là số phiên bản của tệp .deb.

Để biết chi tiết, hãy đọc: Hướng dẫn cài đặt Pascal miễn phí

Cài đặt Pascal miễn phí trên Mac

Nếu bạn sử dụng Mac OS X, cách dễ nhất để sử dụng Free Pascal là tải xuống môi trường phát triển Xcode từ trang web của Apple và làm theo hướng dẫn cài đặt đơn giản. Khi bạn đã thiết lập Xcode, bạn sẽ có thể sử dụng trình biên dịch Free Pascal.

Cài đặt Pascal miễn phí trên Windows

Đối với Windows, bạn sẽ tải xuống trình cài đặt Windows, setup.exe. Đây là một chương trình cài đặt thông thường. Bạn cần thực hiện các bước sau để cài đặt -

  • Chọn một thư mục.

  • Chọn các phần của gói bạn muốn cài đặt.

  • Tùy ý chọn liên kết các phần mở rộng .pp hoặc .pas với IDE Pascal miễn phí.

Để biết chi tiết, hãy đọc: Hướng dẫn cài đặt Pascal miễn phí

Trình soạn thảo văn bản

Điều này sẽ được sử dụng để nhập chương trình của bạn. Ví dụ về một số trình soạn thảo bao gồm Windows Notepad, lệnh Chỉnh sửa hệ điều hành, Tóm tắt, Epsilon, EMACS và vim hoặc vi.

Tên và phiên bản của trình soạn thảo văn bản có thể khác nhau trên các hệ điều hành khác nhau. Ví dụ, Notepad sẽ được sử dụng trên Windows và vim hoặc vi có thể được sử dụng trên windows cũng như Linux hoặc UNIX.

Các tệp bạn tạo bằng trình chỉnh sửa của mình được gọi là tệp nguồn và chứa mã nguồn chương trình. Các tệp nguồn cho chương trình Pascal thường được đặt tên với phần mở rộng.pas.

Trước khi bắt đầu lập trình, hãy đảm bảo rằng bạn đã có sẵn một trình soạn thảo văn bản và bạn có đủ kinh nghiệm để viết một chương trình máy tính, lưu nó vào một tệp, biên dịch và cuối cùng là thực thi nó.

Trước khi nghiên cứu các khối xây dựng cơ bản của ngôn ngữ lập trình Pascal, chúng ta hãy xem một cấu trúc chương trình Pascal tối thiểu để chúng ta có thể lấy nó làm tài liệu tham khảo trong các chương sắp tới.

Cấu trúc chương trình Pascal

Một chương trình Pascal về cơ bản bao gồm các phần sau:

  • Tên chương trình
  • Sử dụng lệnh
  • Nhập các khai báo
  • Tuyên bố liên tục
  • Khai báo biến
  • Khai báo hàm
  • Khai báo thủ tục
  • Khối chương trình chính
  • Các câu lệnh và biểu thức trong mỗi khối
  • Comments

Mọi chương trình pascal thường có một câu lệnh tiêu đề, một phần khai báo và một phần thực thi theo đúng thứ tự đó. Định dạng sau thể hiện cú pháp cơ bản của chương trình Pascal:

program {name of the program}
uses {comma delimited names of libraries you use}
const {global constant declaration block}
var {global variable declaration block}

function {function declarations, if any}
{ local variables }
begin
...
end;

procedure { procedure declarations, if any}
{ local variables }
begin
...
end;

begin { main program block starts}
...
end. { the end of main program block }

Ví dụ về Pascal Hello World

Sau đây là một mã pascal đơn giản sẽ in dòng chữ "Hello, World!" -

program HelloWorld;
uses crt;

(* Here the main program block starts *)
begin
   writeln('Hello, World!');
   readkey;
end.

Điều này sẽ tạo ra kết quả sau:

Hello, World!

Hãy để chúng tôi xem xét các phần khác nhau của chương trình trên -

  • Dòng đầu tiên của chương trình program HelloWorld; cho biết tên của chương trình.

  • Dòng thứ hai của chương trình uses crt; là một lệnh tiền xử lý, lệnh này yêu cầu trình biên dịch bao gồm đơn vị crt trước khi chuyển sang biên dịch thực sự.

  • Các dòng tiếp theo trong câu lệnh begin và end là khối chương trình chính. Mọi khối trong Pascal được bao trong mộtbegin tuyên bố và một endtuyên bố. Tuy nhiên, câu lệnh end cho biết sự kết thúc của chương trình chính được theo sau bởi một dấu chấm (.) Thay vì dấu chấm phẩy (;).

  • Các begin câu lệnh của khối chương trình chính là nơi bắt đầu thực hiện chương trình.

  • Các dòng bên trong (*...*) sẽ bị trình biên dịch bỏ qua và nó đã được thêm vào comment trong chương trình.

  • Tuyên bố writeln('Hello, World!');sử dụng hàm writeln có sẵn trong Pascal gây ra thông báo "Hello, World!" được hiển thị trên màn hình.

  • Tuyên bố readkey;cho phép màn hình tạm dừng cho đến khi người dùng nhấn một phím. Nó là một phần của đơn vị crt. Một đơn vị giống như một thư viện trong Pascal.

  • Tuyên bố cuối cùng end. kết thúc chương trình của bạn.

Biên dịch và thực thi chương trình Pascal

  • Mở trình soạn thảo văn bản và thêm mã được đề cập ở trên.

  • Lưu tệp dưới dạng hello.pas

  • Mở dấu nhắc lệnh và chuyển đến thư mục, nơi bạn đã lưu tệp.

  • Nhập fpc hello.pas tại dấu nhắc lệnh và nhấn enter để biên dịch mã của bạn.

  • Nếu không có lỗi nào trong mã của bạn, dấu nhắc lệnh sẽ đưa bạn đến dòng tiếp theo và sẽ tạo hello tệp thực thi và hello.o tệp đối tượng.

  • Bây giờ, gõ hello tại dấu nhắc lệnh để thực thi chương trình của bạn.

  • Bạn sẽ có thể thấy "Hello World" được in trên màn hình và chương trình sẽ đợi cho đến khi bạn nhấn bất kỳ phím nào.

$ fpc hello.pas Free Pascal Compiler version 2.6.0 [2011/12/23] for x86_64 Copyright (c) 1993-2011 by Florian Klaempfl and others Target OS: Linux for x86-64 Compiling hello.pas Linking hello 8 lines compiled, 0.1 sec $ ./hello
Hello, World!

Đảm bảo rằng trình biên dịch pascal miễn phí fpc nằm trong đường dẫn của bạn và bạn đang chạy nó trong thư mục chứa tệp nguồn hello.pas.

Bạn đã thấy cấu trúc cơ bản của chương trình pascal, vì vậy sẽ dễ dàng hiểu được các khối xây dựng cơ bản khác của ngôn ngữ lập trình pascal.

Biến

Một định nghĩa biến được đặt trong một khối bắt đầu bằng var từ khóa, theo sau là định nghĩa của các biến như sau:

var
A_Variable, B_Variable ... : Variable_Type;

Các biến Pascal được khai báo bên ngoài phần thân mã của hàm có nghĩa là chúng không được khai báo trong beginend các cặp, nhưng chúng được khai báo sau định nghĩa của thủ tục / hàm và trước begintừ khóa. Đối với các biến toàn cục, chúng được định nghĩa sau tiêu đề chương trình.

Chức năng / Thủ tục

Trong Pascal, một procedure là tập hợp các lệnh được thực thi, không có giá trị trả về và functionlà một thủ tục có giá trị trả về. Định nghĩa của hàm / thủ tục sẽ như sau:

Function Func_Name(params...) : Return_Value;
Procedure Proc_Name(params...);

Bình luận

Các chú thích nhiều dòng được đặt trong dấu ngoặc nhọn và dấu hoa thị là (* ... *). Pascal cho phép chú thích một dòng nằm trong dấu ngoặc nhọn {...}.

(* This is a multi-line comments
   and it will span multiple lines. *)

{ This is a single line comment in pascal }

Phân biệt chữ hoa chữ thường

Pascal là một ngôn ngữ không phân biệt chữ hoa chữ thường, có nghĩa là bạn có thể viết các biến, hàm và thủ tục của mình trong cả hai trường hợp. Giống như các biến A_Variable, a_variable và A_VARIABLE có cùng ý nghĩa trong Pascal.

Câu lệnh Pascal

Chương trình Pascal được tạo bằng các câu lệnh. Mỗi câu lệnh chỉ định một công việc xác định của chương trình. Những công việc này có thể là khai báo, phân công, đọc dữ liệu, ghi dữ liệu, đưa ra các quyết định logic, chuyển điều khiển luồng chương trình, v.v.

Ví dụ -

readln (a, b, c);
s := (a + b + c)/2.0;
area := sqrt(s * (s - a)*(s-b)*(s-c));
writeln(area);

Các từ dành riêng trong Pascal

Các câu lệnh trong Pascal được thiết kế với một số từ Pascal cụ thể, chúng được gọi là các từ dành riêng. Ví dụ, các từ, chương trình, đầu vào, đầu ra, var, real, begin, readline, writeline và end đều là các từ dành riêng.

Sau đây là danh sách các từ dành riêng có trong Pascal.

mảng bắt đầu trường hợp hăng sô
div làm xuống khác kết thúc
tập tin cho chức năng đi đến nếu
trong nhãn mod không không phải
của hoặc là đóng gói thủ tục chương trình
ghi lại nói lại bộ sau đó đến
kiểu cho đến khi var trong khi với

Bộ ký tự và mã định danh trong Pascal

Bộ ký tự Pascal bao gồm:

  • Tất cả các chữ cái viết hoa (AZ)

  • Tất cả các chữ cái thường (az)

  • Tất cả các chữ số (0-9)

  • Các ký hiệu đặc biệt - + * /: =,. ;. () [] = {} `khoảng trắng

Các thực thể trong chương trình Pascal như biến và hằng, kiểu, hàm, thủ tục và bản ghi, v.v., có tên hoặc định danh. Định danh là một chuỗi các chữ cái và chữ số, bắt đầu bằng một chữ cái. Các ký hiệu đặc biệt và khoảng trống không được sử dụng trong mã định danh.

Các kiểu dữ liệu của một thực thể cho biết ý nghĩa, các ràng buộc, giá trị có thể có, hoạt động, chức năng và chế độ lưu trữ liên quan đến nó.

Các kiểu số nguyên, thực, Boolean và ký tự được gọi là kiểu dữ liệu chuẩn. Các kiểu dữ liệu có thể được phân loại thành kiểu dữ liệu vô hướng, con trỏ và kiểu dữ liệu có cấu trúc. Ví dụ về kiểu dữ liệu vô hướng là số nguyên, thực, Boolean, ký tự, dải con và liệt kê. Các kiểu dữ liệu có cấu trúc được tạo từ các kiểu vô hướng; ví dụ, mảng, bản ghi, tệp và tập hợp. Chúng ta sẽ thảo luận về các kiểu dữ liệu con trỏ sau.

Các kiểu dữ liệu Pascal

Các kiểu dữ liệu Pascal có thể được tóm tắt như sau trong sơ đồ sau:

Loại khai báo

Khai báo kiểu được sử dụng để khai báo kiểu dữ liệu của một định danh. Cú pháp khai báo kiểu là -

type-identifier-1, type-identfier-2 = type-specifier;

Ví dụ: khai báo sau định nghĩa các biến ngày và tuổi là kiểu số nguyên, có và đúng là kiểu Boolean, tên và thành phố là kiểu chuỗi, phí và chi phí là kiểu thực.

type
days, age = integer;
yes, true = boolean;
name, city = string;
fees, expenses = real;

Các loại số nguyên

Bảng sau cung cấp cho bạn thông tin chi tiết về các kiểu số nguyên tiêu chuẩn với kích thước lưu trữ và phạm vi giá trị được sử dụng trong Object Pascal:

Kiểu Tối thiểu Tối đa định dạng
Số nguyên -2147483648 2147483647 ký 32-bit
Hồng y 0 4294967295 32-bit không dấu
Ngắn gọn -128 127 ký 8-bit
Khói -32768 32767 ký 16-bit
Longint -2147483648 2147483647 ký 32-bit
Int64 -2 ^ 63 2 ^ 63 - 1 ký 64-bit
Byte 0 255 8-bit không dấu
Word 0 65535 16-bit không dấu
Từ dài 0 4294967295 32-bit không dấu

Hằng số

Việc sử dụng hằng số làm cho chương trình dễ đọc hơn và giúp giữ các số lượng đặc biệt ở một vị trí trong phần đầu của chương trình. Pascal cho phép các hằng số, logic, chuỗiký tự . Hằng số có thể được khai báo trong phần khai báo của chương trình bằng cách chỉ địnhconst tờ khai.

Cú pháp khai báo kiểu hằng như sau:

const
Identifier = contant_value;

Sau đây là một số ví dụ về khai báo hằng:

VELOCITY_LIGHT = 3.0E=10;
PIE = 3.141592;
NAME = 'Stuart Little';
CHOICE = yes;
OPERATOR = '+';

Tất cả các khai báo hằng phải được đưa ra trước khai báo biến.

Các loại được liệt kê

Kiểu dữ liệu được liệt kê là kiểu dữ liệu do người dùng xác định. Chúng cho phép các giá trị được chỉ định trong danh sách. Chỉ các toán tử gán và toán tử quan hệ mới được phép trên kiểu dữ liệu liệt kê. Các kiểu dữ liệu được liệt kê có thể được khai báo như sau:

type
enum-identifier = (item1, item2, item3, ... )

Sau đây là một số ví dụ về khai báo kiểu liệt kê:

type
SUMMER = (April, May, June, July, September);
COLORS = (Red, Green, Blue, Yellow, Magenta, Cyan, Black, White);
TRANSPORT = (Bus, Train, Airplane, Ship);

Thứ tự mà các mục được liệt kê trong miền của kiểu liệt kê xác định thứ tự của các mục. Ví dụ: trong kiểu liệt kê SUMMER, tháng 4 đến trước tháng 5, tháng 5 đến trước tháng 6, v.v. Miền của số nhận dạng kiểu được liệt kê không được bao gồm các hằng số hoặc ký tự.

Loại dải con

Các kiểu dải con cho phép một biến giả định các giá trị nằm trong một phạm vi nhất định. Ví dụ: nếu độ tuổi của cử tri nằm trong khoảng từ 18 đến 100 tuổi, thì một biến có tên tuổi có thể được khai báo là:

var
age: 18 ... 100;

Chúng ta sẽ xem xét chi tiết khai báo biến trong phần tiếp theo. Bạn cũng có thể xác định kiểu dải con bằng cách sử dụng khai báo kiểu. Cú pháp khai báo kiểu dãy con như sau:

type
subrange-identifier = lower-limit ... upper-limit;

Sau đây là một số ví dụ về khai báo kiểu dãy con:

const
P = 18;
Q = 90;
type
Number = 1 ... 100;
Value = P ... Q;

Các kiểu dải con có thể được tạo từ một tập con của kiểu liệt kê đã được xác định, Ví dụ:

type
months = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
Summer = Apr ... Aug;
Winter = Oct ... Dec;

Một biến không là gì ngoài tên được đặt cho một vùng lưu trữ mà chương trình của chúng ta có thể thao tác. Mỗi biến trong Pascal có một kiểu cụ thể, kiểu này xác định kích thước và cách bố trí bộ nhớ của biến đó; phạm vi giá trị có thể được lưu trữ trong bộ nhớ đó; và tập hợp các thao tác có thể áp dụng cho biến.

Tên của một biến có thể bao gồm các chữ cái, chữ số và ký tự gạch dưới. Nó phải bắt đầu bằng một chữ cái hoặc một dấu gạch dưới. Pascal lànot case-sensitive, vì vậy chữ hoa và chữ thường có nghĩa giống nhau ở đây. Dựa trên các kiểu cơ bản đã giải thích trong chương trước, sẽ có các kiểu biến cơ bản sau:

Các biến cơ bản trong Pascal

Sr.No Loại & Mô tả
1

Character

Điển hình là một octet đơn (một byte). Đây là một kiểu số nguyên.

2

Integer

Kích thước tự nhiên nhất của số nguyên cho máy.

3

Real

Một giá trị dấu chấm động chính xác duy nhất.

4

Boolean

Chỉ định các giá trị logic đúng hoặc sai. Đây cũng là một kiểu số nguyên.

5

Enumerated

Chỉ định danh sách do người dùng xác định.

6

Subrange

Đại diện cho các biến có giá trị nằm trong một phạm vi.

7

String

Lưu trữ một mảng các ký tự.

Ngôn ngữ lập trình Pascal cũng cho phép định nghĩa nhiều loại biến khác nhau mà chúng ta sẽ trình bày trong các chương tiếp theo như Con trỏ, Mảng, Bản ghi, Bộ và Tệp,… Đối với chương này, chúng ta hãy chỉ nghiên cứu các kiểu biến cơ bản.

Khai báo biến trong Pascal

Tất cả các biến phải được khai báo trước khi chúng ta sử dụng chúng trong chương trình Pascal. Tất cả các khai báo biến đều được theo sau bởi từ khóa var . Một khai báo chỉ định một danh sách các biến, theo sau là dấu hai chấm (:) và kiểu. Cú pháp khai báo biến là -

var
variable_list : type;

Ở đây, kiểu phải là kiểu dữ liệu Pascal hợp lệ bao gồm ký tự, số nguyên, thực, boolean hoặc bất kỳ kiểu dữ liệu nào do người dùng xác định, v.v. và danh sách biến có thể bao gồm một hoặc nhiều tên định danh được phân tách bằng dấu phẩy. Một số khai báo biến hợp lệ được hiển thị ở đây -

var
age, weekdays : integer;
taxrate, net_income: real;
choice, isready: boolean;
initials, grade: char;
name, surname : string;

Trong hướng dẫn trước, chúng ta đã thảo luận rằng Pascal cho phép khai báo một kiểu. Một loại có thể được xác định bằng tên hoặc mã định danh. Kiểu này có thể được sử dụng để xác định các biến của kiểu đó. Ví dụ,

type
days, age = integer;
yes, true = boolean;
name, city = string;
fees, expenses = real;

Bây giờ, các kiểu được định nghĩa như vậy có thể được sử dụng trong các khai báo biến -

var
weekdays, holidays : days;
choice: yes;
student_name, emp_name : name;
capital: city;
cost: expenses;

Hãy lưu ý sự khác biệt giữa khai báo kiểu và khai báo var . Khai báo kiểu cho biết danh mục hoặc lớp của các kiểu như số nguyên, thực, v.v., trong khi đặc tả biến cho biết kiểu giá trị mà một biến có thể nhận. Bạn có thể so sánh khai báo kiểu trong Pascal với typedef trong C. Quan trọng nhất, tên biến đề cập đến vị trí bộ nhớ nơi giá trị của biến sẽ được lưu trữ. Điều này không đúng với khai báo kiểu.

Khởi tạo biến trong Pascal

Các biến được gán một giá trị bằng dấu hai chấm và dấu bằng, theo sau là một biểu thức hằng số. Hình thức chung của việc gán giá trị là -

variable_name := value;

Theo mặc định, các biến trong Pascal không được khởi tạo bằng 0. Chúng có thể chứa các giá trị rác. Vì vậy, nó là một thực hành tốt hơn để khởi tạo các biến trong một chương trình. Các biến có thể được khởi tạo (gán giá trị ban đầu) trong khai báo của chúng. Việc khởi tạo được theo sau bởivar từ khóa và cú pháp khởi tạo như sau:

var
variable_name : type = value;

Một số ví dụ là -

age: integer = 15;
taxrate: real = 0.5;
grade: char = 'A';
name: string = 'John Smith';

Chúng ta hãy xem xét một ví dụ sử dụng nhiều loại biến khác nhau đã được thảo luận cho đến nay -

program Greetings;
const
message = ' Welcome to the world of Pascal ';

type
name = string;
var
firstname, surname: name;

begin
   writeln('Please enter your first name: ');
   readln(firstname);
   
   writeln('Please enter your surname: ');
   readln(surname);
   
   writeln;
   writeln(message, ' ', firstname, ' ', surname);
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Please enter your first name:
John
Please enter your surname:
Smith
Welcome to the world of Pascal John Smith

Các biến được liệt kê

Bạn đã thấy cách sử dụng các kiểu biến đơn giản như số nguyên, thực và boolean. Bây giờ, hãy xem các biến của kiểu liệt kê, có thể được định nghĩa là:

var
var1, var2, ...  : enum-identifier;

Khi bạn đã khai báo một kiểu liệt kê, bạn có thể khai báo các biến của kiểu đó. Ví dụ,

type
months = (January, February, March, April, May, June, July, August, September, October, November, December);
Var
m: months;
...
M := January;

Ví dụ sau minh họa khái niệm -

program exEnumeration;
type
beverage = (coffee, tea, milk, water, coke, limejuice);

var
drink:beverage;

begin
   writeln('Which drink do you want?');
   drink := limejuice;
   
   writeln('You can drink ', drink);
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Which drink do you want?
You can drink limejuice

Biến dải con

Các biến dải con được khai báo là -

var
subrange-name : lowerlim ... uperlim;

Ví dụ về các biến dải con là -

var
marks: 1 ... 100;
grade: 'A' ... 'E';
age: 1 ... 25;

Chương trình sau đây minh họa khái niệm -

program exSubrange;
var
marks: 1 .. 100;
grade: 'A' .. 'E';

begin
   writeln( 'Enter your marks(1 - 100): ');
   readln(marks);
   
   writeln( 'Enter your grade(A - E): ');
   readln(grade);
   
   writeln('Marks: ' , marks, ' Grade: ', grade);
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Enter your marks(1 - 100): 
100
Enter your grade(A - E):
A
Marks: 100 Grade: A

Hằng số là một thực thể không thay đổi trong quá trình thực hiện chương trình. Pascal chỉ cho phép khai báo các hằng có kiểu sau:

  • Các loại thông thường
  • Đặt các loại
  • Các kiểu con trỏ (nhưng giá trị được phép duy nhất là Nil).
  • Các loại thực
  • Char
  • String

Khai báo hằng số

Cú pháp khai báo hằng như sau:

const
identifier = constant_value;

Bảng sau cung cấp các ví dụ về một số khai báo hằng hợp lệ:

Real type constant

Sr.No Loại không đổi & Ví dụ
1

Ordinal(Integer)type constant

hợp_lý = 21;

2

Set type constant

Nguyên âm = set of (A, E, I, O, U);

3

Pointer type constant

P = NIL;

4

e = 2,7182818;

vận_ tốc = 3.0E + 10;

5

Character type constant

Toán tử = '+';

6

String type constant

chủ tịch = 'Johnny Depp';

Ví dụ sau minh họa khái niệm -

program const_circle (input,output);
const
PI = 3.141592654;

var
r, d, c : real;   {variable declaration: radius, dia, circumference}

begin
   writeln('Enter the radius of the circle');
   readln(r);
   
   d := 2 * r;
   c :=  PI * d;
   writeln('The circumference of the circle is ',c:7:2);
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Enter the radius of the circle
23
The circumference of the circle is 144.51

Quan sát định dạng trong câu lệnh đầu ra của chương trình. Biến c được định dạng với tổng số chữ số 7 và 2 chữ số sau dấu thập phân. Pascal cho phép định dạng đầu ra như vậy với các biến số.

Một toán tử là một ký hiệu yêu cầu trình biên dịch thực hiện các thao tác toán học hoặc logic cụ thể. Pascal cho phép các loại toán tử sau:

  • Toán tử số học
  • Toán tử quan hệ
  • Toán tử boolean
  • Toán tử bit
  • Đặt toán tử
  • Toán tử chuỗi

Chúng ta hãy thảo luận lần lượt các toán tử số học, quan hệ, Boolean và bit. Chúng ta sẽ thảo luận về các toán tử tập hợp và các hoạt động chuỗi sau.

Toán tử số học

Bảng sau đây cho thấy tất cả các toán tử số học được Pascal hỗ trợ. Giả sử biếnA giữ 10 và biến B giữ 20, sau đó -

Hiển thị các ví dụ

Nhà điều hành Sự miêu tả Thí dụ
+ Thêm hai toán hạng A + B sẽ cho 30
- Trừ toán hạng thứ hai với toán hạng đầu tiên A - B sẽ cho -10
* Nhân cả hai toán hạng A * B sẽ cho 200
/ Chia tử số cho mẫu số B / A sẽ cho 2
% Toán tử mô đun và phần còn lại của sau một phép chia số nguyên B% A sẽ cho 0

Toán tử quan hệ

Bảng sau đây cho thấy tất cả các toán tử quan hệ được hỗ trợ bởi Pascal. Giả sử biếnA giữ 10 và biến B giữ 20, sau đó -

Hiển thị các ví dụ

Nhà điều hành Sự miêu tả Thí dụ
= Kiểm tra xem giá trị của hai toán hạng có bằng nhau hay không, nếu có thì điều kiện trở thành true. (A = B) không đúng.
<> Kiểm tra xem giá trị của hai toán hạng có bằng nhau hay không, nếu các giá trị không bằng nhau thì điều kiện trở thành true. (A <> B) là đúng.
> Kiểm tra xem giá trị của toán hạng bên trái có lớn hơn giá trị của toán hạng bên phải hay không, nếu có, thì điều kiện trở thành true. (A> B) là không đúng.
< Kiểm tra xem giá trị của toán hạng bên trái có nhỏ hơn giá trị của toán hạng bên phải hay không, nếu có, thì điều kiện trở thành true. (A <B) là đúng.
> = Kiểm tra xem giá trị của toán hạng bên trái có lớn hơn hoặc bằng giá trị của toán hạng bên phải hay không, nếu có thì điều kiện trở thành true. (A> = B) là không đúng.
<= Kiểm tra xem giá trị của toán hạng bên trái có nhỏ hơn hoặc bằng giá trị của toán hạng bên phải hay không, nếu có thì điều kiện trở thành true. (A <= B) là đúng.

Toán tử Boolean

Bảng sau hiển thị tất cả các toán tử Boolean được hỗ trợ bởi ngôn ngữ Pascal. Tất cả các toán tử này hoạt động trên toán hạng Boolean và tạo ra kết quả Boolean. Giả sử biếnA giữ đúng và biến B giữ sai, sau đó -

Hiển thị các ví dụ

Nhà điều hành Sự miêu tả Thí dụ
Được gọi là toán tử Boolean AND. Nếu cả hai toán hạng đều đúng, thì điều kiện trở thành đúng. (A và B) là sai.
và sau đó Nó tương tự như toán tử AND, tuy nhiên, nó đảm bảo thứ tự mà trình biên dịch đánh giá biểu thức logic. Các toán hạng trái sang phải và phải chỉ được đánh giá khi cần thiết. (A và sau đó là B) là sai.
hoặc là Được gọi là Boolean HOẶC Toán tử. Nếu bất kỳ toán hạng nào trong hai toán hạng là true, thì điều kiện trở thành true. (A hoặc B) là đúng.
hoặc cái gì đó khác Nó tương tự như Boolean OR, tuy nhiên, nó đảm bảo thứ tự mà trình biên dịch đánh giá biểu thức logic. Các toán hạng trái sang phải và phải chỉ được đánh giá khi cần thiết. (A hoặc khác B) là đúng.
không phải Được gọi là Toán tử Boolean NOT. Được sử dụng để đảo ngược trạng thái logic của toán hạng của nó. Nếu một điều kiện là đúng, thì toán tử logic NOT sẽ làm cho nó sai. không (A và B) là đúng.

Toán tử bit

Toán tử bitwise làm việc trên các bit và thực hiện hoạt động từng bit. Tất cả các toán tử này hoạt động trên toán hạng số nguyên và tạo ra kết quả số nguyên. Bảng sự thật cho bitwise và (&), bitwise hoặc (|), và không phải là bitwise (~) như sau:

p q p & q p | q ~ p ~ q
0 0 0 0 1 1
0 1 0 1 1 0
1 1 1 1 0 0
1 0 0 1 0 1

Giả sử nếu A = 60; và B = 13; bây giờ ở định dạng nhị phân, chúng sẽ như sau:

A = 0011 1100

B = 0000 1101

-----------------

A&B = 0000 1100

A ^ B = 0011 0001

~ A = 1100 0011

Các toán tử Bitwise được Pascal hỗ trợ được liệt kê trong bảng sau. Giả sử biến A giữ 60 và biến B giữ 13, thì:

Hiển thị các ví dụ

Nhà điều hành Sự miêu tả Thí dụ
& Toán tử AND nhị phân sao chép một bit vào kết quả nếu nó tồn tại trong cả hai toán hạng. (A & B) sẽ cho 12, là 0000 1100
| Toán tử OR nhị phân sao chép một bit nếu nó tồn tại trong một trong hai toán hạng. (A | B) sẽ cho 61, là 0011 1101
! Toán tử OR nhị phân sao chép một bit nếu nó tồn tại trong một trong hai toán hạng. Của nó giống như | nhà điều hành. (A! B) sẽ cho kết quả 61, là 0011 1101
~ Toán tử bổ sung số nhị phân là một ngôi và có tác dụng 'lật' các bit. (~ A) sẽ cho -61, là 1100 0011 ở dạng phần bù của 2 do một số nhị phân có dấu.
<< Toán tử dịch chuyển trái nhị phân. Giá trị toán hạng bên trái được di chuyển sang trái bằng số bit được chỉ định bởi toán hạng bên phải. A << 2 sẽ cho 240, là 1111 0000
>> Toán tử Shift phải nhị phân. Giá trị của toán hạng bên trái được di chuyển sang phải bằng số bit được chỉ định bởi toán hạng bên phải. A >> 2 sẽ cho 15, là 0000 1111

Xin lưu ý rằng các cách triển khai khác nhau của Pascal khác nhau ở các toán tử bitwise. Tuy nhiên, Free Pascal, trình biên dịch chúng tôi đã sử dụng ở đây, hỗ trợ các toán tử bitwise sau:

Các nhà khai thác Hoạt động
không phải Bitwise KHÔNG
Bitwise VÀ
hoặc là Bitwise HOẶC
xor Bitwise độc ​​quyền HOẶC
shl Dịch chuyển bit sang trái
shr Dịch chuyển bitwise sang phải
<< Dịch chuyển bit sang trái
>> Dịch chuyển bitwise sang phải

Các toán tử ưu tiên trong Pascal

Mức độ ưu tiên của toán tử xác định nhóm các từ trong một biểu thức. Điều này ảnh hưởng đến cách một biểu thức được đánh giá. Các toán tử nhất định có quyền ưu tiên cao hơn những toán tử khác; ví dụ, toán tử nhân có quyền ưu tiên cao hơn toán tử cộng.

Ví dụ x = 7 + 3 * 2; ở đây, x được gán 13, không phải 20 vì toán tử * có mức độ ưu tiên cao hơn +, vì vậy đầu tiên nó được nhân với 3 * 2 và sau đó cộng thành 7.

Ở đây, các toán tử có mức độ ưu tiên cao nhất xuất hiện ở đầu bảng, những toán tử có mức độ ưu tiên thấp nhất xuất hiện ở cuối bảng. Trong một biểu thức, các toán tử có mức độ ưu tiên cao hơn sẽ được đánh giá đầu tiên.

Hiển thị các ví dụ

Nhà điều hành Quyền ưu tiên
~, không, Cao nhất
*, /, div, mod và, &
|,!, +, -, hoặc,
=, <>, <, <=,>,> =, trong
hoặc khác, và sau đó Thấp nhất

Cấu trúc ra quyết định yêu cầu người lập trình chỉ định một hoặc nhiều điều kiện để được đánh giá hoặc kiểm tra bởi chương trình, cùng với một câu lệnh hoặc các câu lệnh sẽ được thực thi nếu điều kiện đó được xác định là đúng và tùy chọn, các câu lệnh khác được thực thi nếu điều kiện được xác định là sai.

Sau đây là dạng chung của cấu trúc ra quyết định điển hình được tìm thấy trong hầu hết các ngôn ngữ lập trình:

Ngôn ngữ lập trình Pascal cung cấp các loại câu lệnh ra quyết định sau. Nhấp vào các liên kết sau để kiểm tra chi tiết của chúng.

Sr.No Tuyên bố & Mô tả
1 câu lệnh if - then

An if - then statement bao gồm một biểu thức boolean theo sau bởi một hoặc nhiều câu lệnh.

2 Câu lệnh if-then-else

An if - then statement có thể được theo sau bởi một tùy chọn else statement, thực thi khi biểu thức boolean sai.

3 câu lệnh if lồng nhau

Bạn có thể sử dụng một if hoặc là else if tuyên bố bên trong khác if hoặc là else if các câu lệnh).

4 tuyên bố trường hợp

A case câu lệnh cho phép một biến được kiểm tra tính bình đẳng với một danh sách các giá trị.

5 case - câu lệnh else

Nó tương tự như if-then-else tuyên bố. Đây, mộtelse thuật ngữ theo sau case statement.

6 câu lệnh trường hợp lồng nhau

Bạn có thể sử dụng một case tuyên bố bên trong khác case các câu lệnh).

Có thể có một tình huống, khi bạn cần thực thi một khối mã nhiều lần. Nói chung, các câu lệnh được thực hiện tuần tự: Câu lệnh đầu tiên trong một hàm được thực hiện đầu tiên, tiếp theo là câu lệnh thứ hai, v.v.

Các ngôn ngữ lập trình cung cấp các cấu trúc điều khiển khác nhau cho phép các đường dẫn thực thi phức tạp hơn.

Câu lệnh lặp cho phép chúng ta thực hiện một câu lệnh hoặc một nhóm câu lệnh nhiều lần và sau đây là dạng chung của câu lệnh lặp trong hầu hết các ngôn ngữ lập trình:

Ngôn ngữ lập trình Pascal cung cấp các kiểu cấu tạo vòng lặp sau đây để xử lý các yêu cầu lặp. Nhấp vào các liên kết sau để kiểm tra chi tiết của chúng.

Sr.No Loại vòng lặp & Mô tả
1 vòng lặp trong khi làm

Lặp lại một câu lệnh hoặc một nhóm câu lệnh trong khi một điều kiện đã cho là đúng. Nó kiểm tra điều kiện trước khi thực thi phần thân của vòng lặp.

2 vòng lặp việc cần làm

Thực thi một chuỗi các câu lệnh nhiều lần và viết tắt mã quản lý biến vòng lặp.

3 vòng lặp lặp lại cho đến khi

Giống như một câu lệnh while, ngoại trừ việc nó kiểm tra điều kiện ở cuối thân vòng lặp.

4 vòng lồng nhau

Bạn có thể sử dụng một hoặc nhiều vòng lặp bên trong bất kỳ vòng lặp while, for hoặc lặp lại cho đến khi nào khác.

Tuyên bố kiểm soát vòng lặp

Các câu lệnh điều khiển vòng lặp thay đổi việc thực thi từ trình tự bình thường của nó. Khi việc thực thi rời khỏi một phạm vi, tất cả các đối tượng tự động được tạo trong phạm vi đó sẽ bị phá hủy.

Pascal hỗ trợ các câu lệnh điều khiển sau. Nhấp vào các liên kết sau để kiểm tra chi tiết của chúng.

Sr.No Tuyên bố & Mô tả Kiểm soát
1 tuyên bố ngắt

Chấm dứt loop hoặc là case câu lệnh và chuyển việc thực thi đến câu lệnh ngay sau vòng lặp hoặc câu lệnh case.

2 tiếp tục tuyên bố

Làm cho vòng lặp bỏ qua phần còn lại của phần thân và ngay lập tức kiểm tra lại tình trạng của nó trước khi nhắc lại.

3 tuyên bố goto

Chuyển quyền điều khiển sang câu lệnh được gắn nhãn. Mặc dù không nên sử dụng câu lệnh goto trong chương trình của bạn.

Chương trình con

Chương trình con là một đơn vị / mô-đun chương trình thực hiện một nhiệm vụ cụ thể. Các chương trình con này được kết hợp với nhau để tạo thành các chương trình lớn hơn. Về cơ bản đây được gọi là 'Thiết kế mô-đun.' Một chương trình con có thể được gọi bởi một chương trình con / chương trình, được gọi là chương trình gọi.

Pascal cung cấp hai loại chương trình con:

  • Functions - các chương trình con này trả về một giá trị duy nhất.

  • Procedures - các chương trình con này không trực tiếp trả về giá trị.

Chức năng

A functionlà một nhóm các câu lệnh cùng thực hiện một nhiệm vụ. Mọi chương trình Pascal đều có ít nhất một hàm, đây là chính chương trình và tất cả các chương trình tầm thường nhất đều có thể định nghĩa các hàm bổ sung.

Một chức năng declarationcho trình biên dịch biết về tên, kiểu trả về và các tham số của hàm. Một chức năngdefinition cung cấp phần thân thực tế của hàm.

Thư viện chuẩn Pascal cung cấp nhiều hàm dựng sẵn mà chương trình của bạn có thể gọi. Ví dụ, hàmAppendStr() nối hai chuỗi, hàm New() cấp phát động bộ nhớ cho các biến và nhiều hàm khác.

Xác định một chức năng

Trong Pascal, một functionđược định nghĩa bằng cách sử dụng từ khóa chức năng. Dạng tổng quát của định nghĩa hàm như sau:

function name(argument(s): type1; argument(s): type2; ...): function_type;
local declarations;

begin
   ...
   < statements >
   ...
   name:= expression;
end;

Định nghĩa hàm trong Pascal bao gồm một hàm header, địa phương declarations và một chức năng body. Tiêu đề hàm bao gồm hàm từ khóa và mộtnamecho hàm. Đây là tất cả các phần của một hàm -

  • Arguments- (Các) đối số thiết lập mối liên kết giữa chương trình đang gọi và các định danh hàm và còn được gọi là các tham số hình thức. Một tham số giống như một trình giữ chỗ. Khi một hàm được gọi, bạn truyền một giá trị cho tham số. Giá trị này được gọi là tham số hoặc đối số thực tế. Danh sách tham số đề cập đến kiểu, thứ tự và số lượng tham số của một hàm. Việc sử dụng các tham số chính thức như vậy là tùy chọn. Các tham số này có thể có kiểu dữ liệu chuẩn, kiểu dữ liệu do người dùng xác định hoặc kiểu dữ liệu dải con.

    Danh sách tham số chính thức xuất hiện trong câu lệnh hàm có thể là các biến đơn giản hoặc được chỉ định con, mảng hoặc biến có cấu trúc hoặc chương trình con.

  • Return Type- Tất cả các hàm phải trả về một giá trị, vì vậy tất cả các hàm phải được gán một kiểu. Cácfunction-typelà kiểu dữ liệu của giá trị mà hàm trả về. Nó có thể là loại vô hướng hoặc dải con chuẩn, do người dùng xác định nhưng nó không thể là loại có cấu trúc.

  • Local declarations - Khai báo cục bộ tham chiếu đến các khai báo nhãn, hằng, biến, hàm và thủ tục, chỉ áp dụng cho phần thân của hàm.

  • Function Body- Phần thân hàm chứa tập hợp các câu lệnh xác định chức năng thực hiện. Nó phải luôn được đặt giữa các từ dành riêng bắt đầu và kết thúc. Nó là một phần của một chức năng mà tất cả các tính toán được thực hiện. Phải có một câu lệnh gán kiểu -name := expression;trong phần thân hàm gán giá trị cho tên hàm. Giá trị này được trả về khi và khi hàm được thực thi. Câu lệnh cuối cùng trong phần nội dung phải là câu lệnh kết thúc.

Sau đây là một ví dụ cho thấy cách xác định một hàm trong pascal:

(* function returning the max between two numbers *)
function max(num1, num2: integer): integer;

var
   (* local variable declaration *)
   result: integer;

begin
   if (num1 > num2) then
      result := num1
   
   else
      result := num2;
   max := result;
end;

Khai báo hàm

Một chức năng declarationcho trình biên dịch biết về tên hàm và cách gọi hàm. Phần thân thực của hàm có thể được định nghĩa riêng biệt.

Một khai báo hàm có các phần sau:

function name(argument(s): type1; argument(s): type2; ...): function_type;

Đối với hàm max () được định nghĩa ở trên, sau đây là khai báo hàm:

function max(num1, num2: integer): integer;

Khai báo hàm là bắt buộc khi bạn xác định một hàm trong một tệp nguồn và bạn gọi hàm đó trong một tệp khác. Trong trường hợp này, bạn nên khai báo hàm ở đầu tệp gọi hàm.

Gọi một hàm

Trong khi tạo một hàm, bạn đưa ra định nghĩa về những gì hàm phải làm. Để sử dụng một hàm, bạn sẽ phải gọi hàm đó để thực hiện tác vụ đã xác định. Khi một chương trình gọi một chức năng, điều khiển chương trình sẽ được chuyển sang chức năng được gọi. Một hàm được gọi thực hiện nhiệm vụ được xác định và khi câu lệnh trả về của nó được thực thi hoặc khi đạt đến câu lệnh kết thúc cuối cùng, nó sẽ trả lại quyền điều khiển chương trình cho chương trình chính.

Để gọi một hàm, bạn chỉ cần chuyển các tham số bắt buộc cùng với tên hàm và nếu hàm trả về một giá trị, thì bạn có thể lưu trữ giá trị trả về. Sau đây là một ví dụ đơn giản để hiển thị cách sử dụng -

program exFunction;
var
   a, b, ret : integer;

(*function definition *)
function max(num1, num2: integer): integer;
var
   (* local variable declaration *)
   result: integer;

begin
   if (num1 > num2) then
      result := num1
   
   else
      result := num2;
   max := result;
end;

begin
   a := 100;
   b := 200;
   (* calling a function to get max value *)
   ret := max(a, b);
   
   writeln( 'Max value is : ', ret );
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Max value is : 200

Procedures là các chương trình con, thay vì trả về một giá trị duy nhất, cho phép thu được một nhóm kết quả.

Xác định một thủ tục

Trong Pascal, một thủ tục được định nghĩa bằng cách sử dụng proceduretừ khóa. Dạng tổng quát của định nghĩa thủ tục như sau:

procedure name(argument(s): type1, argument(s): type 2, ... );
   < local declarations >
begin
   < procedure body >
end;

Một thủ tục definition trong Pascal bao gồm một header, địa phương declarations và một bodycủa thủ tục. Tiêu đề thủ tục bao gồm từ khóaprocedurevà một tên được đặt cho thủ tục. Đây là tất cả các phần của một quy trình -

  • Arguments- (Các) đối số thiết lập mối liên kết giữa chương trình đang gọi và các định danh thủ tục và còn được gọi là các tham số chính thức. Các quy tắc cho các đối số trong các thủ tục cũng giống như cho các hàm.

  • Local declarations - Khai báo cục bộ tham chiếu đến các khai báo nhãn, hằng, biến, hàm và thủ tục, chỉ áp dụng cho phần thân của thủ tục.

  • Procedure Body- Phần thân thủ tục chứa một tập hợp các câu lệnh xác định những gì thủ tục thực hiện. Nó phải luôn được đặt giữa các từ dành riêng bắt đầu và kết thúc. Nó là một phần của một thủ tục nơi tất cả các tính toán được thực hiện.

Sau đây là mã nguồn của một thủ tục được gọi là findMin () . Thủ tục này nhận 4 tham số x, y, z và m và lưu trữ giá trị nhỏ nhất trong số ba biến đầu tiên trong biến có tên m. Biến m được chuyển quareference (chúng ta sẽ thảo luận về việc chuyển các đối số bằng cách tham chiếu một chút sau) -

procedure findMin(x, y, z: integer; var m: integer); 
(* Finds the minimum of the 3 values *)

begin
   if x < y then
      m := x
   else
      m := y;
   
   if z <m then
      m := z;
end; { end of procedure findMin }

Khai báo thủ tục

Một thủ tục declarationcho trình biên dịch biết về tên thủ tục và cách gọi thủ tục. Nội dung thực tế của thủ tục có thể được xác định riêng biệt.

Một khai báo thủ tục có cú pháp sau:

procedure name(argument(s): type1, argument(s): type 2, ... );

Xin lưu ý rằng name of the procedure is not associated with any type. Đối với thủ tục được định nghĩa ở trên findMin () , sau đây là khai báo:

procedure findMin(x, y, z: integer; var m: integer);

Gọi một thủ tục

Trong khi tạo một thủ tục, bạn đưa ra định nghĩa về những gì thủ tục phải làm. Để sử dụng thủ tục, bạn sẽ phải gọi thủ tục đó để thực hiện tác vụ đã xác định. Khi một chương trình gọi một thủ tục, điều khiển chương trình sẽ được chuyển sang thủ tục được gọi. Một thủ tục được gọi thực hiện nhiệm vụ đã xác định và khi đạt đến câu lệnh kết thúc cuối cùng của nó, nó sẽ trả lại điều khiển cho chương trình đang gọi.

Để gọi một thủ tục, bạn chỉ cần chuyển các tham số cần thiết cùng với tên thủ tục như hình dưới đây:

program exProcedure;
var
   a, b, c,  min: integer;
procedure findMin(x, y, z: integer; var m: integer); 
(* Finds the minimum of the 3 values *)

begin
   if x < y then
      m:= x
   else
      m:= y;
   
   if z < m then
      m:= z;
end; { end of procedure findMin }  

begin
   writeln(' Enter three numbers: ');
   readln( a, b, c);
   findMin(a, b, c, min); (* Procedure call *)
   
   writeln(' Minimum: ', min);
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Enter three numbers:
89 45 67
Minimum: 45

Chương trình con đệ quy

Chúng ta đã thấy rằng một chương trình hoặc chương trình con có thể gọi một chương trình con khác. Khi một chương trình con gọi chính nó, nó được gọi là một cuộc gọi đệ quy và quá trình này được gọi là đệ quy.

Để minh họa khái niệm, chúng ta hãy tính giai thừa của một số. Giai thừa của một số n được định nghĩa là -

n! = n*(n-1)!
   = n*(n-1)*(n-2)!
      ...
   = n*(n-1)*(n-2)*(n-3)... 1

Chương trình sau đây tính giai thừa của một số nhất định bằng cách gọi chính nó một cách đệ quy.

program exRecursion;
var
   num, f: integer;
function fact(x: integer): integer; (* calculates factorial of x - x! *)

begin
   if x=0 then
      fact := 1
   else
      fact := x * fact(x-1); (* recursive call *)
end; { end of function fact}

begin
   writeln(' Enter a number: ');
   readln(num);
   f := fact(num);
   
   writeln(' Factorial ', num, ' is: ' , f);
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Enter a number:
5
Factorial 5 is: 120

Sau đây là một ví dụ khác, tạo ra Fibonacci Series cho một số nhất định bằng cách sử dụng recursive chức năng -

program recursiveFibonacci;
var
   i: integer;
function fibonacci(n: integer): integer;

begin
   if n=1 then
      fibonacci := 0
   
   else if n=2 then
      fibonacci := 1
   
   else
      fibonacci := fibonacci(n-1) + fibonacci(n-2);
end; 

begin
   for i:= 1 to 10 do
   
   write(fibonacci (i), '  ');
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

0 1 1 2	3 5 8 13 21 34

Đối số của một chương trình con

Nếu một chương trình con (function or procedure) là sử dụng các đối số, nó phải khai báo các biến chấp nhận giá trị của các đối số. Các biến này được gọi làformal parameters của chương trình con.

Các tham số chính thức hoạt động giống như các biến cục bộ khác bên trong chương trình con và được tạo ra khi vào chương trình con và bị hủy khi thoát.

Trong khi gọi một chương trình con, có hai cách mà các đối số có thể được chuyển đến chương trình con:

Sr.No Loại & Mô tả Cuộc gọi
1 Gọi theo giá trị

Phương thức này sao chép giá trị thực của một đối số vào tham số chính thức của chương trình con. Trong trường hợp này, các thay đổi được thực hiện đối với tham số bên trong chương trình con không ảnh hưởng đến đối số.

2 Gọi bằng cách tham khảo

Phương thức này sao chép địa chỉ của một đối số vào tham số chính thức. Bên trong chương trình con, địa chỉ được sử dụng để truy cập đối số thực sự được sử dụng trong cuộc gọi. Điều này có nghĩa là các thay đổi được thực hiện đối với tham số sẽ ảnh hưởng đến đối số.

Theo mặc định, Pascal sử dụng call by valueđể chuyển đối số. Nói chung, điều này có nghĩa là mã bên trong chương trình con không thể thay đổi các đối số được sử dụng để gọi chương trình con. Chương trình ví dụ chúng tôi đã sử dụng trong chương 'Pascal - Các hàm' được gọi là hàm có tên max () bằng cách sử dụngcall by value.

Trong khi đó, chương trình ví dụ được cung cấp ở đây ( exProcedure ) gọi thủ tục findMin () bằng cách sử dụngcall by reference.

Phạm vi trong bất kỳ chương trình nào là một vùng của chương trình nơi một biến xác định có thể tồn tại và ngoài biến đó không thể được truy cập. Có ba vị trí, nơi các biến có thể được khai báo bằng ngôn ngữ lập trình Pascal -

  • Bên trong một chương trình con hoặc một khối được gọi là các biến cục bộ

  • Bên ngoài tất cả các chương trình con được gọi là biến toàn cục

  • Trong định nghĩa các tham số chương trình con được gọi là tham số chính thức

Hãy để chúng tôi giải thích những gì localglobal biến và tham số hình thức.

Biến cục bộ

Các biến được khai báo bên trong chương trình con hoặc khối được gọi là biến cục bộ. Chúng chỉ có thể được sử dụng bởi các câu lệnh bên trong chương trình con hoặc khối mã đó. Các biến cục bộ không được biết đến với các chương trình con bên ngoài của chúng. Sau đây là ví dụ sử dụng các biến cục bộ. Ở đây, tất cả các biến a , bc là cục bộ của chương trình có tên exLocal .

program exLocal; 
var
   a, b, c: integer;

begin
   (* actual initialization *)
   a := 10;
   b := 20;
   c := a + b;
   
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

value of a = 10 b = 20 c = 30

Bây giờ, chúng ta hãy mở rộng chương trình hơn một chút, hãy tạo một thủ tục có tên là display, thủ tục này sẽ có tập hợp các biến a , bc của riêng nó và hiển thị các giá trị của chúng, ngay từ chương trình exLocal .

program exLocal;
var
   a, b, c: integer;
procedure display;

var
   a, b, c: integer;
begin
   (* local variables *)
   a := 10;
   b := 20;
   c := a + b;
   
   writeln('Winthin the procedure display');
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
end;

begin
   a:= 100;
   b:= 200;
   c:= a + b;
   
   writeln('Winthin the program exlocal');
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
   display();
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Within the program exlocal
value of a = 100 b = 200 c = 300
Within the procedure display
value of a = 10 b = 20 c = 30

Biến toàn cục

Các biến toàn cục được định nghĩa bên ngoài một hàm, thường nằm trên đầu chương trình. Các biến toàn cục sẽ giữ giá trị của chúng trong suốt thời gian tồn tại của chương trình của bạn và chúng có thể được truy cập bên trong bất kỳ hàm nào được định nghĩa cho chương trình.

A globalbiến có thể được truy cập bởi bất kỳ hàm nào. Có nghĩa là, một biến toàn cục có sẵn để sử dụng trong toàn bộ chương trình của bạn sau khi khai báo. Sau đây là một ví dụ sử dụnggloballocal biến -

program exGlobal;
var
   a, b, c: integer;
procedure display;
var
   x, y, z: integer;

begin
   (* local variables *)
   x := 10;
   y := 20;
   z := x + y;
   
   (*global variables *)
   a := 30;
   b:= 40;
   c:= a + b;
   
   writeln('Winthin the procedure display');
   writeln(' Displaying the global variables a, b, and c');
   
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
   writeln('Displaying the local variables x, y, and z');
   
   writeln('value of x = ', x , ' y =  ',  y, ' and z = ', z);
end;

begin
   a:= 100;
   b:= 200;
   c:= 300;
   
   writeln('Winthin the program exlocal');
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
   
   display();
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Within the program exlocal
value of a = 100 b = 200 c = 300
Within the procedure display
Displaying the global variables a, b, and c
value of a = 30 b = 40 c = 70
Displaying the local variables x, y, and z
value of x = 10 y = 20 z = 30

Xin lưu ý rằng hiển thị thủ tục có quyền truy cập vào các biến a, b và c, là các biến toàn cục liên quan đến hiển thị cũng như các biến cục bộ của riêng nó. Một chương trình có thể có cùng tên cho các biến cục bộ và toàn cục nhưng giá trị của biến cục bộ bên trong một hàm sẽ được ưu tiên.

Chúng ta hãy thay đổi ví dụ trước một chút, bây giờ các biến cục bộ cho hiển thị thủ tục có tên giống như a , b , c -

program exGlobal;
var
   a, b, c: integer;
procedure display;

var
   a, b, c: integer;

begin
   (* local variables *)
   a := 10;
   b := 20;
   c := a + b;
   
   writeln('Winthin the procedure display');
   writeln(' Displaying the global variables a, b, and c');
   
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
   writeln('Displaying the local variables a, b, and c');
   
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
end;

begin
   a:= 100;
   b:= 200;
   c:= 300;
   
   writeln('Winthin the program exlocal');
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);   
   
   display();
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Within the program exlocal
value of a = 100 b = 200 c = 300
Within the procedure display
Displaying the global variables a, b, and c
value of a = 10 b = 20 c = 30
Displaying the local variables a, b, and c
value of a = 10 b = 20 c = 30

Chuỗi trong Pascal thực chất là một chuỗi ký tự với quy cách kích thước tùy chọn. Các ký tự có thể là số, chữ cái, trống, ký tự đặc biệt hoặc kết hợp của tất cả. Extended Pascal cung cấp nhiều loại đối tượng chuỗi tùy thuộc vào hệ thống và cách triển khai. Chúng ta sẽ thảo luận về các loại chuỗi phổ biến hơn được sử dụng trong các chương trình.

Bạn có thể xác định một chuỗi theo nhiều cách -

  • Character arrays - Đây là một chuỗi ký tự là một chuỗi không hoặc nhiều ký tự có kích thước byte được đặt trong dấu nháy đơn.

  • String variables - Biến kiểu String, như định nghĩa trong Turbo Pascal.

  • Short strings - Biến kiểu String với đặc tả kích thước.

  • Null terminated strings - Biến của pchar kiểu.

  • AnsiStrings - Ansistrings là chuỗi không giới hạn độ dài.

Pascal chỉ cung cấp một toán tử chuỗi, toán tử nối chuỗi (+).

Ví dụ

Chương trình sau sẽ in ra bốn loại chuỗi đầu tiên. Chúng tôi sẽ sử dụng AnsiStrings trong ví dụ tiếp theo.

program exString;
var
   greetings: string;
   name: packed array [1..10] of char;
   organisation: string[10];
   message: pchar;

begin
   greetings := 'Hello ';
   message := 'Good Day!';
   
   writeln('Please Enter your Name');
   readln(name);
   
   writeln('Please Enter the name of your Organisation');
   readln(organisation);
   
   writeln(greetings, name, ' from ', organisation);
   writeln(message); 
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Please Enter your Name
John Smith
Please Enter the name of your Organisation
Infotech
Hello John Smith from Infotech

Ví dụ sau sử dụng thêm một số chức năng, hãy xem:

program exString;
uses sysutils;
var
   str1, str2, str3 : ansistring;
   str4: string;
   len: integer;

begin
   str1 := 'Hello ';
   str2 := 'There!';
   
   (* copy str1 into str3 *)
   str3 := str1;
   writeln('appendstr( str3, str1) :  ', str3 );
   
   (* concatenates str1 and str2 *)
   appendstr( str1, str2);
   writeln( 'appendstr( str1, str2) ' , str1 );
   str4 := str1 + str2;
   writeln('Now str4 is: ', str4);
   
   (* total lenghth of str4 after concatenation  *)
   len := byte(str4[0]);
   writeln('Length of the final string str4: ', len); 
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

appendstr( str3, str1) : Hello
appendstr( str1, str2) : Hello There!
Now str4 is: Hello There! There!
Length of the final string str4: 18

Các hàm và thủ tục trong chuỗi Pascal

Pascal hỗ trợ một loạt các hàm và thủ tục thao tác với chuỗi. Các chương trình con này khác nhau về cách triển khai. Ở đây, chúng tôi liệt kê các chương trình con thao tác chuỗi khác nhau được cung cấp bởi Free Pascal -

Sr.No. Chức năng & Mục đích
1

function AnsiCompareStr(const S1: ; const S2:):Integer;

So sánh hai chuỗi

2

function AnsiCompareText(const S1: ; const S2:):Integer;

So sánh hai chuỗi, không phân biệt chữ hoa chữ thường

3

function AnsiExtractQuotedStr(var Src: PChar; Quote: Char):;

Xóa dấu ngoặc kép khỏi chuỗi

4

function AnsiLastChar(const S:):PChar;

Nhận ký tự cuối cùng của chuỗi

5

function AnsiLowerCase(const s:):

Chuyển đổi chuỗi thành toàn chữ thường

6

function AnsiQuotedStr(const S: ; Quote: Char):;

Trích dẫn một chuỗi

7

function AnsiStrComp(S1: PChar;S2: PChar):Integer;

So sánh chuỗi phân biệt chữ hoa chữ thường

số 8

function AnsiStrIComp(S1: PChar; S2: PChar):Integer;

So sánh các chuỗi phân biệt chữ hoa chữ thường

9

function AnsiStrLComp(S1: PChar; S2: PChar; MaxLen: Cardinal):Integer;

So sánh L ký tự của chuỗi phân biệt chữ hoa chữ thường

10

function AnsiStrLIComp(S1: PChar; S2: PChar; MaxLen: Cardinal):Integer;

So sánh L ký tự của chuỗi phân biệt chữ hoa chữ thường

11

function AnsiStrLastChar(Str: PChar):PChar;

Nhận ký tự cuối cùng của chuỗi

12

function AnsiStrLower(Str: PChar):PChar;

Chuyển đổi chuỗi thành toàn chữ thường

13

function AnsiStrUpper(Str: PChar):PChar;

Chuyển chuỗi thành toàn chữ hoa

14

function AnsiUpperCase(const s:):;

Chuyển chuỗi thành toàn chữ hoa

15

procedure AppendStr(var Dest: ; const S:);

Thêm 2 chuỗi

16

procedure AssignStr(var P: PString; const S:);

Gán giá trị của các chuỗi trên heap

17

function CompareStr(const S1: ; const S2:):Integer; overload;

So sánh hai chuỗi phân biệt chữ hoa chữ thường

18

function CompareText(const S1: ; const S2:):Integer;

So sánh hai chuỗi không phân biệt chữ hoa chữ thường

19 procedure DisposeStr(S: PString); overload;

Xóa chuỗi khỏi heap

20

procedure DisposeStr(S: PShortString); overload;

Xóa chuỗi khỏi heap

21

function IsValidIdent( const Ident:):Boolean;

Chuỗi có phải là mã định danh pascal hợp lệ không

22

function LastDelimiter(const Delimiters: ; const S:):Integer;

Lần xuất hiện cuối cùng của ký tự trong một chuỗi

23

function LeftStr(const S: ; Count: Integer):;

Nhận N ký tự đầu tiên của một chuỗi

24

function LoadStr(Ident: Integer):;

Tải chuỗi từ tài nguyên

25

function LowerCase(const s: ):; overload;

Chuyển đổi chuỗi thành toàn chữ thường

26

function LowerCase(const V: variant ):; overload;

Chuyển đổi chuỗi thành toàn chữ thường

27

function NewStr(const S:):PString; overload;

Phân bổ chuỗi mới trên heap

28

function RightStr(const S: ; Count: Integer):;

Nhận N ký tự cuối cùng của một chuỗi

29

function StrAlloc(Size: Cardinal):PChar;

Cấp phát bộ nhớ cho chuỗi

30

function StrBufSize(Str: PChar):SizeUInt;

Dành bộ nhớ cho một chuỗi

31

procedure StrDispose(Str: PChar);

Xóa chuỗi khỏi heap

32

function StrPas(Str: PChar):;

Chuyển đổi PChar thành chuỗi pascal

33

function StrPCopy(Dest: PChar; Source:):PChar;

Sao chép chuỗi mật khẩu

34

function StrPLCopy(Dest: PChar; Source: ; MaxLen: SizeUInt):PChar;

Sao chép N byte của chuỗi pascal

35

function UpperCase(const s:):;

Chuyển chuỗi thành toàn chữ hoa

Pascal cung cấp kiểu dữ liệu Boolean cho phép người lập trình định nghĩa, lưu trữ và thao tác các thực thể logic, chẳng hạn như hằng số, biến, hàm và biểu thức, v.v.

Giá trị boolean về cơ bản là kiểu số nguyên. Các biến kiểu boolean có hai giá trị có thể được xác định trướcTrueFalse. Các biểu thức phân giải thành giá trị Boolean cũng có thể được gán cho kiểu Boolean.

Pascal miễn phí cũng hỗ trợ ByteBool, WordBoolLongBoolcác loại. Đây là loại Byte, Word hoặc Longint, tương ứng.

Giá trị False tương đương với 0 (không) và mọi giá trị khác không được coi là True khi chuyển đổi thành giá trị Boolean. Giá trị Boolean của True được chuyển đổi thành -1 trong trường hợp nó được gán cho một biến kiểu LongBool.

Cần lưu ý rằng các toán tử logic and, ornot được định nghĩa cho kiểu dữ liệu Boolean.

Khai báo các kiểu dữ liệu Boolean

Một biến kiểu Boolean được khai báo bằng từ khóa var.

var
boolean-identifier: boolean;

ví dụ,

var
choice: boolean;

Thí dụ

program exBoolean;
var
exit: boolean;

choice: char;
   begin
   writeln('Do you want to continue? ');
   writeln('Enter Y/y for yes, and N/n for no');
   readln(choice);

if(choice = 'n') then
   exit := true
else
   exit := false;

if (exit) then
   writeln(' Good Bye!')
else
   writeln('Please Continue');

readln;
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Do you want to continue?
Enter Y/y for yes, and N/n for no
N
Good Bye!
Y
Please Continue

Ngôn ngữ lập trình Pascal cung cấp một cấu trúc dữ liệu gọi là mảng, có thể lưu trữ một tập hợp tuần tự có kích thước cố định của các phần tử cùng kiểu. Mảng được sử dụng để lưu trữ một tập hợp dữ liệu, nhưng thường hữu ích hơn nếu coi một mảng là một tập hợp các biến cùng kiểu.

Thay vì khai báo các biến riêng lẻ, chẳng hạn như number1, number2, ... và number100, bạn khai báo một biến mảng chẳng hạn như số và sử dụng số [1], số [2] và ..., số [100] để biểu diễn các biến riêng lẻ. Một phần tử cụ thể trong một mảng được truy cập bởi một chỉ mục.

Tất cả các mảng bao gồm các vị trí bộ nhớ liền nhau. Địa chỉ thấp nhất tương ứng với phần tử đầu tiên và địa chỉ cao nhất cho phần tử cuối cùng.

Xin lưu ý rằng nếu bạn muốn một mảng kiểu C bắt đầu từ chỉ mục 0, bạn chỉ cần bắt đầu chỉ mục từ 0, thay vì 1.

Khai báo Mảng

Để khai báo một mảng trong Pascal, người lập trình có thể khai báo kiểu rồi tạo các biến của mảng đó hoặc khai báo trực tiếp biến mảng.

Dạng khai báo kiểu chung của mảng một chiều là:

type
   array-identifier = array[index-type] of element-type;

Ở đâu,

  • array-identifier - cho biết tên của kiểu mảng.

  • index-type- chỉ định chỉ số con của mảng; nó có thể là bất kỳ kiểu dữ liệu vô hướng nào ngoại trừ thực

  • element-type - chỉ định các loại giá trị sẽ được lưu trữ

Ví dụ,

type
   vector = array [ 1..25] of real;
var
   velocity: vector;

Bây giờ, vận tốc là một mảng biến đổi kiểu vectơ, đủ để chứa tối đa 25 số thực.

Để bắt đầu mảng từ chỉ mục 0, khai báo sẽ là:

type
   vector = array [ 0..24] of real;
var
   velocity: vector;

Các loại chỉ số mảng

Trong Pascal, một chỉ số con của mảng có thể thuộc bất kỳ kiểu vô hướng nào như, số nguyên, Boolean, liệt kê hoặc dải con, ngoại trừ thực. Các chỉ số con của mảng cũng có thể có giá trị âm.

Ví dụ,

type
   temperature = array [-10 .. 50] of real;
var
   day_temp, night_temp: temperature;

Hãy để chúng tôi lấy một ví dụ khác trong đó chỉ số con có kiểu ký tự -

type
   ch_array = array[char] of 1..26;
var
   alphabet: ch_array;

Chỉ số phụ có thể thuộc loại liệt kê -

type
   color = ( red, black, blue, silver, beige);
   car_color = array of [color] of boolean;
var
   car_body: car_color;

Khởi tạo Mảng

Trong Pascal, mảng được khởi tạo thông qua phép gán, bằng cách chỉ định một chỉ số con cụ thể hoặc sử dụng vòng lặp việc cần làm.

Ví dụ -

type
   ch_array = array[char] of 1..26;
var
   alphabet: ch_array;
   c: char;

begin
   ...
   for c:= 'A' to 'Z' do
   alphabet[c] := ord[m];  
   (* the ord() function returns the ordinal values *)

Truy cập các phần tử mảng

Một phần tử được truy cập bằng cách đánh chỉ mục tên mảng. Điều này được thực hiện bằng cách đặt chỉ mục của phần tử trong dấu ngoặc vuông sau tên của mảng. Ví dụ -

a: integer;
a: = alphabet['A'];

Câu lệnh trên sẽ lấy phần tử đầu tiên từ mảng có tên bảng chữ cái và gán giá trị cho biến a.

Sau đây là một ví dụ, sẽ sử dụng tất cả ba khái niệm được đề cập ở trên viz. khai báo, gán và truy cập mảng -

program exArrays;
var
   n: array [1..10] of integer;   (* n is an array of 10 integers *)
   i, j: integer;

begin
   (* initialize elements of array n to 0 *)        
   for i := 1 to 10 do
       n[ i ] := i + 100;   (* set element at location i to i + 100 *)
    (* output each array element's value *)
   
   for j:= 1 to 10 do
      writeln('Element[', j, '] = ', n[j] );
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Element[1] = 101
Element[2] = 102
Element[3] = 103
Element[4] = 104
Element[5] = 105
Element[6] = 106
Element[7] = 107
Element[8] = 108
Element[9] = 109
Element[10] = 110

Chi tiết mảng Pascal

Mảng rất quan trọng đối với Pascal và cần nhiều chi tiết hơn. Một vài khái niệm quan trọng sau đây liên quan đến mảng mà một lập trình viên Pascal cần phải hiểu rõ:

Sr.No Khái niệm & Mô tả
1 Mảng đa chiều

Pascal hỗ trợ mảng nhiều chiều. Dạng đơn giản nhất của mảng nhiều chiều là mảng hai chiều.

2 Mảng động

Trong loại mảng này, độ dài ban đầu bằng không. Chiều dài thực của mảng phải được đặt với tiêu chuẩnSetLength chức năng.

3 Mảng đóng gói

Các mảng này được đóng gói theo từng bit, tức là mỗi ký tự hoặc giá trị chân lý được lưu trữ trong các byte liên tiếp thay vì sử dụng một đơn vị lưu trữ, thường là một từ (4 byte trở lên).

4 Truyền mảng sang chương trình con

Bạn có thể chuyển cho chương trình con một con trỏ tới một mảng bằng cách chỉ định tên của mảng mà không có chỉ mục.

Con trỏ trong Pascal rất dễ học và thú vị. Một số tác vụ lập trình Pascal được thực hiện dễ dàng hơn với con trỏ, và các tác vụ khác, chẳng hạn như cấp phát bộ nhớ động, không thể thực hiện nếu không sử dụng con trỏ. Vì vậy việc học con trỏ để trở thành một lập trình viên Pascal hoàn hảo trở nên cần thiết. Hãy bắt đầu học chúng theo các bước đơn giản và dễ dàng.

Như bạn đã biết, mọi biến là một vị trí bộ nhớ và mọi vị trí bộ nhớ đều có địa chỉ của nó được xác định có thể được truy cập bằng cách sử dụng tên của biến con trỏ, biểu thị một địa chỉ trong bộ nhớ.

Con trỏ là gì?

Con trỏ là một biến động, có giá trị là địa chỉ của một biến khác, tức là địa chỉ trực tiếp của vị trí bộ nhớ. Giống như bất kỳ biến hoặc hằng số nào, bạn phải khai báo một con trỏ trước khi có thể sử dụng nó để lưu trữ bất kỳ địa chỉ biến nào. Dạng chung của khai báo biến con trỏ là:

type
   ptr-identifier = ^base-variable-type;

Kiểu con trỏ được xác định bằng cách thêm tiền tố mũi tên lên của biểu tượng dấu mũ (^) với kiểu cơ sở. Kiểu cơ sở xác định kiểu của các mục dữ liệu. Khi một biến con trỏ được xác định là thuộc loại nhất định, nó chỉ có thể trỏ các mục dữ liệu thuộc loại đó. Khi một loại con trỏ đã được xác định, chúng ta có thể sử dụngvar khai báo để khai báo biến con trỏ.

var
   p1, p2, ... : ptr-identifier;

Sau đây là một số khai báo con trỏ hợp lệ:

type
   Rptr = ^real;
   Cptr = ^char;
   Bptr = ^ Boolean;
   Aptr = ^array[1..5] of real;
   date-ptr = ^ date;
      Date = record
         Day: 1..31;
         Month: 1..12;
         Year: 1900..3000;
      End;
var
   a, b : Rptr;
   d: date-ptr;

Các biến con trỏ được tham chiếu bằng cách sử dụng cùng một ký hiệu dấu mũ (^). Ví dụ, biến liên quan được tham chiếu bởi một con trỏ rptr , là rptr ^ . Nó có thể được truy cập như -

rptr^ := 234.56;

Ví dụ sau sẽ minh họa khái niệm này:

program exPointers;
var
   number: integer;
   iptr: ^integer;

begin
   number := 100;
   writeln('Number is: ', number);
   
   iptr := @number;
   writeln('iptr points to a value: ', iptr^);
   
   iptr^ := 200;
   writeln('Number is: ', number);
   writeln('iptr points to a value: ', iptr^);
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Number is: 100
iptr points to a value: 100
Number is: 200
iptr points to a value: 200

In địa chỉ bộ nhớ trong Pascal

Trong Pascal, chúng ta có thể gán địa chỉ của một biến cho một biến con trỏ bằng cách sử dụng toán tử địa chỉ (@). Chúng tôi sử dụng con trỏ này để thao tác và truy cập mục dữ liệu. Tuy nhiên, nếu vì lý do nào đó, chúng ta cần làm việc với chính địa chỉ bộ nhớ, chúng ta cần lưu trữ nó trong một biến kiểu từ.

Hãy để chúng tôi mở rộng ví dụ trên để in địa chỉ bộ nhớ được lưu trong con trỏ iptr -

program exPointers;
var
   number: integer;
   iptr: ^integer;
   y: ^word;

begin
   number := 100;
   writeln('Number is: ', number);
   iptr := @number;
   writeln('iptr points to a value: ', iptr^);
   
   iptr^ := 200;
   writeln('Number is: ', number);
   writeln('iptr points to a value: ', iptr^);
   y := addr(iptr);
   writeln(y^); 
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Number is: 100
iptr points to a value: 100
Number is: 200
iptr points to a value: 200
45504

Con trỏ NIL

Luôn luôn là một thực tiễn tốt để chỉ định một NILgiá trị cho một biến con trỏ trong trường hợp bạn không có địa chỉ chính xác để được chỉ định. Điều này được thực hiện tại thời điểm khai báo biến. Một con trỏ được chỉ địnhNILchỉ vào hư không. Hãy xem xét chương trình sau:

program exPointers;
var
   number: integer;
   iptr: ^integer;
   y: ^word;

begin
   iptr := nil;
   y := addr(iptr);
   
   writeln('the vaule of iptr is ', y^);
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

The value of ptr is 0

Để kiểm tra một nil con trỏ bạn có thể sử dụng câu lệnh if như sau:

if(ptr <> nill )then     (* succeeds if p is not null *)
if(ptr = nill)then    (* succeeds if p is null *)

Chi tiết về con trỏ Pascal

Con trỏ có nhiều khái niệm nhưng dễ hiểu và chúng rất quan trọng đối với lập trình Pascal. Có một vài khái niệm con trỏ quan trọng sau đây mà một lập trình viên Pascal cần phải hiểu rõ:

Sr.No Khái niệm & Mô tả
1 Pascal - Số học con trỏ

Có bốn toán tử số học có thể được sử dụng trên con trỏ: tăng, giảm, +, -

2 Pascal - Mảng con trỏ

Bạn có thể xác định mảng để chứa một số con trỏ.

3 Pascal - Con trỏ tới con trỏ

Pascal cho phép bạn có con trỏ trên một con trỏ, v.v.

4 Truyền con trỏ đến chương trình con trong Pascal

Truyền một đối số theo tham chiếu hoặc theo địa chỉ đều cho phép đối số được truyền vào được thay đổi trong chương trình con đang gọi bởi chương trình con được gọi.

5 Con trỏ trả về từ chương trình con trong Pascal

Pascal cho phép một chương trình con trả về một con trỏ.

Mảng Pascal cho phép bạn xác định kiểu biến có thể chứa một số mục dữ liệu cùng loại nhưng một bản ghi là kiểu dữ liệu khác do người dùng xác định có sẵn trong Pascal, cho phép bạn kết hợp các mục dữ liệu khác loại.

Hồ sơ bao gồm các trường khác nhau. Giả sử bạn muốn theo dõi sách của mình trong thư viện, bạn có thể muốn theo dõi các thuộc tính sau của từng sách:

  • Title
  • Author
  • Subject
  • Mã sách

Xác định bản ghi

Để xác định kiểu bản ghi, bạn có thể sử dụng câu lệnh khai báo kiểu. Loại bản ghi được định nghĩa là -

type
record-name = record
   field-1: field-type1;
   field-2: field-type2;
   ...
   field-n: field-typen;
end;

Đây là cách bạn khai báo Sổ sách -

type 
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: integer;
end;

Các biến bản ghi được định nghĩa theo cách thông thường như

var
   r1, r2, ... : record-name;

Ngoài ra, bạn có thể xác định trực tiếp một biến loại bản ghi là:

var
Books : record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: integer;
end;

Truy cập các trường của bản ghi

Để truy cập bất kỳ trường nào của bản ghi, chúng tôi sử dụng toán tử truy cập thành viên (.). Toán tử truy cập thành viên được mã hóa là khoảng thời gian giữa tên biến bản ghi và trường mà chúng ta muốn truy cập. Sau đây là ví dụ để giải thích cách sử dụng cấu trúc:

program exRecords;
type
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: longint;
end;

var
   Book1, Book2: Books; (* Declare Book1 and Book2 of type Books *)

begin
   (* book 1 specification *)
   Book1.title  := 'C Programming';
   Book1.author := 'Nuha Ali '; 
   Book1.subject := 'C Programming Tutorial';
   Book1.book_id := 6495407;

   (* book 2 specification *)
   Book2.title := 'Telecom Billing';
   Book2.author := 'Zara Ali';
   Book2.subject := 'Telecom Billing Tutorial';
   Book2.book_id := 6495700;
 
   (* print Book1 info *)
   writeln ('Book 1 title : ', Book1.title);
   writeln('Book 1 author : ', Book1.author);
   writeln( 'Book 1 subject : ', Book1.subject);
   writeln( 'Book 1 book_id : ', Book1.book_id);
   writeln; 

   (* print Book2 info *)
   writeln ('Book 2 title : ', Book2.title);
   writeln('Book 2 author : ', Book2.author);
   writeln( 'Book 2 subject : ', Book2.subject);
   writeln( 'Book 2 book_id : ', Book2.book_id);
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407

Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

Ghi lại dưới dạng đối số của chương trình con

Bạn có thể truyền một bản ghi dưới dạng đối số của chương trình con theo cách tương tự như khi bạn truyền bất kỳ biến hoặc con trỏ nào khác. Bạn sẽ truy cập các trường bản ghi theo cách tương tự như bạn đã truy cập trong ví dụ trên -

program exRecords;
type
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: longint;
end;

var
   Book1, Book2: Books; (* Declare Book1 and Book2 of type Books *)

(* procedure declaration *)
procedure printBook( var book: Books );

begin
   (* print Book info *)
   writeln ('Book  title : ', book.title);
   writeln('Book  author : ', book.author);
   writeln( 'Book  subject : ', book.subject);
   writeln( 'Book book_id : ', book.book_id);
end;

begin
   (* book 1 specification *)
   Book1.title  := 'C Programming';
   Book1.author := 'Nuha Ali '; 
   Book1.subject := 'C Programming Tutorial';
   Book1.book_id := 6495407;
   
   (* book 2 specification *)
   Book2.title := 'Telecom Billing';
   Book2.author := 'Zara Ali';
   Book2.subject := 'Telecom Billing Tutorial';
   Book2.book_id := 6495700;
   
   (* print Book1 info *)
   printbook(Book1);
   writeln; 

   (* print Book2 info *)
   printbook(Book2);
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407

Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

Con trỏ tới Bản ghi

Bạn có thể xác định con trỏ tới bản ghi theo cách rất giống như bạn định nghĩa con trỏ cho bất kỳ biến nào khác như sau:

type
record-ptr = ^ record-name;
record-name = record
   field-1: field-type1;
   field-2: field-type2;
   ...
   field-n: field-typen;
end;

Bây giờ, bạn có thể lưu trữ địa chỉ của một biến kiểu bản ghi trong biến con trỏ được xác định ở trên. Để khai báo một biến của kiểu con trỏ đã tạo, bạn sử dụng từ khóa var -

var
   r1, r2, ... : record-ptr;

Trước khi sử dụng các con trỏ này, bạn phải tạo bộ nhớ cho một biến kiểu tên bản ghi, biến này sẽ được thao tác bởi các con trỏ này.

new(r1);
new(r2);

Để truy cập các thành viên của bản ghi bằng con trỏ tới bản ghi đó, bạn phải sử dụng dấu ^. toán tử như sau -

r1^.feild1 := value1;
r1^.feild2 := value2;
...
r1^fieldn := valuen;

Cuối cùng, đừng quên vứt bỏ bộ nhớ đã sử dụng khi nó không còn được sử dụng nữa -

dispose(r1);
dispose(r2);

Hãy để chúng tôi viết lại ví dụ đầu tiên bằng cách sử dụng một con trỏ đến bản ghi Sách. Hy vọng điều này sẽ dễ dàng để bạn hiểu khái niệm -

program exRecords;
type
BooksPtr = ^ Books;
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: longint;
end;

var
  (* Declare Book1 and Book2 of pointer type that refers to Book type *)
   Book1, Book2: BooksPtr; 

begin
   new(Book1);
   new(book2);
   
   (* book 1 specification *)
   Book1^.title  := 'C Programming';
   Book1^.author := 'Nuha Ali '; 
   Book1^.subject := 'C Programming Tutorial';
   Book1^.book_id := 6495407;
   
   (* book 2 specification *)
   Book2^.title := 'Telecom Billing';
   Book2^.author := 'Zara Ali';
   Book2^.subject := 'Telecom Billing Tutorial';
   Book2^.book_id := 6495700;
   
   (* print Book1 info *)
   writeln ('Book 1 title : ', Book1^.title);
   writeln('Book 1 author : ', Book1^.author);
   writeln( 'Book 1 subject : ', Book1^.subject);
   writeln( 'Book 1 book_id : ', Book1^.book_id);
   
   (* print Book2 info *)
   writeln ('Book 2 title : ', Book2^.title);
   writeln('Book 2 author : ', Book2^.author);
   writeln( 'Book 2 subject : ', Book2^.subject);
   writeln( 'Book 2 book_id : ', Book2^.book_id);
   
   dispose(Book1); 
   dispose(Book2);
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407

Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

Tuyên bố Với

Chúng tôi đã thảo luận rằng các thành viên của một bản ghi có thể được truy cập bằng toán tử truy cập thành viên (.). Bằng cách này, tên của biến bản ghi phải được viết mỗi lần. CácWith tuyên bố cung cấp một cách thay thế để làm điều đó.

Hãy xem đoạn mã sau được lấy từ ví dụ đầu tiên của chúng tôi -

(* book 1 specification *)
   Book1.title  := 'C Programming';
   Book1.author := 'Nuha Ali '; 
   Book1.subject := 'C Programming Tutorial';
   Book1.book_id := 6495407;

Bài tập tương tự có thể được viết bằng cách sử dụng With tuyên bố như -

(* book 1 specification *)
With Book1 do
begin
   title  := 'C Programming';
   author := 'Nuha Ali '; 
   subject := 'C Programming Tutorial';
   book_id := 6495407;
end;

Pascal hỗ trợ một kiểu lưu trữ duy nhất có tên là các biến thể. Bạn có thể chỉ định bất kỳ loại giá trị đơn giản nào trong một biến thể. Loại giá trị được lưu trữ trong một biến thể chỉ được xác định trong thời gian chạy. Hầu hết mọi kiểu đơn giản đều có thể được gán cho các biến thể: kiểu thứ tự, kiểu chuỗi, kiểu int64.

Các kiểu có cấu trúc như tập hợp, bản ghi, mảng, tệp, đối tượng và lớp không tương thích với phép gán với một biến thể. Bạn cũng có thể gán một con trỏ cho một biến thể.

Pascal miễn phí hỗ trợ các biến thể.

Khai báo một biến thể

Bạn có thể khai báo loại biến thể giống như bất kỳ loại nào khác bằng cách sử dụng vartừ khóa. Cú pháp để khai báo kiểu biến thể là:

var
   v: variant;

Bây giờ, biến biến thể v này có thể được gán cho hầu hết các kiểu đơn giản bao gồm cả kiểu liệt kê và ngược lại.

type  
   color = (red, black, white);  
var  
   v : variant;  
   i : integer;  
   b : byte;  
   w : word;  
   q : int64;  
   e : extended;  
   d : double;  
   en : color;  
   as : ansistring;  
   ws : widestring;  

begin  
   v := i;  
   v := b;  
   v := w;  
   v := q;  
   v := e;  
   v := en;  
   v := d:  
   v := as;  
   v := ws;  
end;

Thí dụ

Ví dụ sau đây sẽ minh họa khái niệm:

Program exVariant;

uses variants;
type
   color = (red, black, white);

var
   v : variant;
   i : integer;
   r: real;
   c : color;
   as : ansistring;


begin
   i := 100;
   v:= i;
   writeln('Variant as Integer: ', v);

   r:= 234.345;
   v:= r;
   writeln('Variant as real: ', v);

   c := red;
   v := c;
   writeln('Variant as Enumerated data: ', v);

   as:= ' I am an AnsiString';
   v:= as;
   writeln('Variant as AnsiString: ', v);
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Variant as Integer: 100
Variant as real: 234.345
Variant as Enumerated data: 0
Variant as AnsiString: I am an AnsiString

Tập hợp là tập hợp các phần tử cùng loại. Pascal cho phép xác định kiểu dữ liệu tập hợp. Các phần tử trong một tập hợp được gọi là thành viên của nó. Trong toán học, tập hợp được biểu diễn bằng cách đặt các thành viên trong dấu ngoặc nhọn {} . Tuy nhiên, trong Pascal, các phần tử tập hợp được đặt trong dấu ngoặc vuông [], được gọi là hàm tạo tập hợp.

Xác định các loại tập hợp và biến

Các kiểu Tập hợp Pascal được định nghĩa là

type
set-identifier = set of base type;

Các biến thuộc loại tập hợp được định nghĩa là

var
s1, s2, ...: set-identifier;

hoặc là,

s1, s2...: set of base type;

Ví dụ về một số khai báo kiểu tập hợp hợp lệ là:

type
Days = (mon, tue, wed, thu, fri, sat, sun);
Letters = set of char;
DaySet = set of days;
Alphabets = set of 'A' .. 'Z';
studentAge = set of 13..20;

Đặt toán tử

Bạn có thể thực hiện các thao tác đặt sau trên các tập Pascal.

Sr.No Hoạt động & Mô tả
1

Union

Điều này kết hợp hai tập hợp và tạo ra một tập hợp mới với các thành viên từ cả hai tập hợp.

2

Difference

Lấy sự khác biệt của hai tập hợp và đưa ra một tập hợp mới với các phần tử không chung cho cả hai tập hợp.

3

Intersection

Lấy giao của hai tập hợp và cho một tập hợp mới với các phần tử chung cho cả hai tập hợp.

4

Inclusion

Tập hợp P được bao gồm trong tập hợp Q, nếu tất cả các mục trong P cũng thuộc Q nhưng không phải ngược lại.

5

Symmetric difference

Lấy hiệu số đối xứng của hai tập hợp và đưa ra một tập hợp các phần tử nằm trong một trong hai tập hợp và không nằm trong giao điểm của chúng.

6

In

Nó kiểm tra tư cách thành viên.

Bảng sau đây hiển thị tất cả các toán tử tập hợp được Free Pascal hỗ trợ. Giả sửS1S2 là hai bộ ký tự, sao cho -

S1: = ['a', 'b', 'c'];

S2: = ['c', 'd', 'e'];

Nhà điều hành Sự miêu tả Thí dụ
+ Liên hiệp hai bộ

S1 + S2 sẽ cho một tập hợp

['a', 'b', 'c', 'd', 'e']

- Hiệu số của hai bộ

S1 - S2 sẽ cho một tập hợp

['a', 'b']

* Giao điểm của hai tập hợp

S1 * S2 sẽ cho một bộ

['c']

> < Hiệu số đối xứng của hai bộ S1> <S2 sẽ cho một tập hợp ['a', 'b', 'd', 'e']
= Kiểm tra sự bằng nhau của hai tập hợp S1 = S2 sẽ cho giá trị boolean Sai
<> Kiểm tra sự không bằng nhau của hai tập hợp S1 <> S2 sẽ cho giá trị boolean True
<= Chứa (Kiểm tra xem một tập hợp có phải là tập hợp con của tập hợp kia không) S1 <= S2 sẽ cho giá trị boolean Sai
Bao gồm Bao gồm một phần tử trong tập hợp; về cơ bản nó là Liên hiệp của một tập hợp và một phần tử của cùng một kiểu cơ sở

Bao gồm (S1, ['d']) sẽ cho một tập hợp

['A B C D']

Loại trừ Loại trừ một phần tử khỏi một tập hợp; về cơ bản nó là Sự khác biệt của một tập hợp và một phần tử của cùng một kiểu cơ sở

Exclude (S2, ['d']) sẽ cung cấp một tập hợp

['c', 'e']

Trong Kiểm tra tập hợp thành viên của một phần tử trong tập hợp ['e'] trong S2 cho giá trị boolean True

Thí dụ

Ví dụ sau minh họa việc sử dụng một số toán tử này:

program setColors;
type  
color = (red, blue, yellow, green, white, black, orange);  
colors = set of color;  
 
procedure displayColors(c : colors);  
const  
names : array [color] of String[7]  
  = ('red', 'blue', 'yellow', 'green', 'white', 'black', 'orange');  
var  
   cl : color;  
   s : String;  

begin  
   s:= ' ';  
   for cl:=red to orange do  
      if cl in c then  
      begin  
         if (s<>' ') then s :=s +' , ';  
         s:=s+names[cl];  
      end;  
   writeln('[',s,']');  
end;  
 
var  
   c : colors;  
 
begin  
   c:= [red, blue, yellow, green, white, black, orange];
   displayColors(c);

   c:=[red, blue]+[yellow, green]; 
   displayColors(c);  

   c:=[red, blue, yellow, green, white, black, orange] - [green, white];     
   displayColors(c);    

   c:= [red, blue, yellow, green, white, black, orange]*[green, white];     
   displayColors(c);  

   c:= [red, blue, yellow, green]><[yellow, green, white, black]; 
   displayColors(c);  
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

[ red , blue , yellow , green , white , black , orange]
[ red , blue , yellow , green]
[ red , blue , yellow , black , orange]
[ green , white]
[ red , blue , white , black]

Pascal coi một tệp như một chuỗi các thành phần, các thành phần này phải có kiểu đồng nhất. Loại tệp được xác định bởi loại của các thành phần. Kiểu dữ liệu tệp được định nghĩa là -

type
file-name = file of base-type;

Trong đó, kiểu cơ sở cho biết kiểu của các thành phần của tệp. Kiểu cơ sở có thể là bất kỳ thứ gì như, số nguyên, thực, Boolean, liệt kê, dãy con, bản ghi, mảng và bộ ngoại trừ một loại tệp khác. Các biến của một loại tệp được tạo bằng cách sử dụng khai báo var -

var
f1, f2,...: file-name;

Sau đây là một số ví dụ về việc xác định một số loại tệp và biến tệp:

type
   rfile = file of real;
   ifile = file of integer;
   bfile = file of boolean;
   datafile = file of record
   arrfile = file of array[1..4] of integer;

var
   marks: arrfile;
   studentdata: datafile;
   rainfalldata: rfile;
   tempdata: ifile;
   choices: bfile;

Tạo và ghi vào tệp

Hãy để chúng tôi viết một chương trình sẽ tạo một tệp dữ liệu cho hồ sơ của học sinh. Nó sẽ tạo một tệp có tên là Students.dat và ghi dữ liệu của sinh viên vào đó -

program DataFiles;
type
   StudentRecord = Record
      s_name: String;
      s_addr: String;
      s_batchcode: String;
   end;

var
   Student: StudentRecord;
   f: file of StudentRecord;

begin
   Assign(f,'students.dat');
   Rewrite(f);
   Student.s_name := 'John Smith';
   Student.s_addr := 'United States of America';
   Student.s_batchcode := 'Computer Science';
   Write(f,Student);
   Close(f);
end.

Khi được biên dịch và chạy, chương trình sẽ tạo một tệp có tên là students.dat vào thư mục làm việc. Bạn có thể mở tệp bằng trình soạn thảo văn bản, như notepad, để xem dữ liệu của John Smith.

Đọc từ một tệp

Chúng tôi vừa tạo và ghi vào một tệp có tên là student.dat. Bây giờ, chúng ta hãy viết một chương trình có thể đọc dữ liệu của học sinh từ tệp -

program DataFiles;
type
   StudentRecord = Record
      s_name: String;
      s_addr: String;
      s_batchcode: String;
   end;

var
   Student: StudentRecord;
   f: file of StudentRecord;

begin
   assign(f, 'students.dat');
   reset(f); 
   while not eof(f) do
   
   begin
      read(f,Student);
      writeln('Name: ',Student.s_name);
      writeln('Address: ',Student.s_addr);
      writeln('Batch Code: ', Student.s_batchcode);
   end;
   
   close(f);
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Name: John Smith
Address: United States of America
Batch Code: Computer Science

Tệp dưới dạng Tham số chương trình con

Pascal cho phép các biến tệp được sử dụng làm tham số trong các chương trình con chuẩn và do người dùng định nghĩa. Ví dụ sau minh họa khái niệm này. Chương trình tạo một tệp có tên là rain.txt và lưu trữ một số dữ liệu về lượng mưa. Tiếp theo, nó mở tệp, đọc dữ liệu và tính toán lượng mưa trung bình.

Xin lưu ý rằng, if you use a file parameter with subprograms, it must be declared as a var parameter.

program addFiledata;
const
   MAX = 4;
type
   raindata = file of real;

var
   rainfile: raindata;
   filename: string;
procedure writedata(var f: raindata);

var
   data: real;
   i: integer;

begin
   rewrite(f, sizeof(data));
   for i:=1 to MAX do
   
   begin
      writeln('Enter rainfall data: ');
      readln(data);
      write(f, data);
   end;
   
   close(f);
end;

procedure computeAverage(var x: raindata);
var
   d, sum: real;
   average: real;

begin
   reset(x);
   sum:= 0.0;
   while not eof(x) do
   
   begin
      read(x, d);
      sum := sum + d;
   end;
   
   average := sum/MAX;
   close(x);
   writeln('Average Rainfall: ', average:7:2);
end;

begin
   writeln('Enter the File Name: ');
   readln(filename);
   assign(rainfile, filename);
   writedata(rainfile);
   computeAverage(rainfile);
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Enter the File Name:
rainfall.txt
Enter rainfall data:
34
Enter rainfall data:
45
Enter rainfall data:
56
Enter rainfall data:
78
Average Rainfall: 53.25

Tệp văn bản

Tệp văn bản, trong Pascal, bao gồm các dòng ký tự mà mỗi dòng được kết thúc bằng một dấu cuối dòng. Bạn có thể khai báo và xác định các tệp như:

type
file-name = text;

Sự khác biệt giữa tệp ký tự thông thường và tệp văn bản là tệp văn bản được chia thành các dòng, mỗi dòng được kết thúc bằng một điểm đánh dấu cuối dòng đặc biệt, được hệ thống tự động chèn vào. Ví dụ sau tạo và ghi vào tệp văn bản có tên contact.txt -

program exText;
var
   filename, data: string;
   myfile: text;

begin
   writeln('Enter the file name: ');
   readln(filename);
   
   assign(myfile, filename);
   rewrite(myfile);
   
   writeln(myfile, 'Note to Students: ');
   writeln(myfile, 'For details information on Pascal Programming');
   writeln(myfile, 'Contact: Tutorials Point');
   writeln('Completed writing'); 
   
   close(myfile);
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Enter the file name:
contact.txt 
Completed writing

Thêm vào một tệp

Thêm vào một tệp có nghĩa là ghi vào một tệp hiện có đã có một số dữ liệu mà không ghi đè tệp. Chương trình sau đây minh họa điều này -

program exAppendfile;
var
   myfile: text;
   info: string;

begin
   assign(myfile, 'contact.txt');
   append(myfile);
   
   writeln('Contact Details');
   writeln('[email protected]');
   close(myfile);
   
   (* let us read from this file *)
   assign(myfile, 'contact.txt');
   reset(myfile);
   while not eof(myfile) do
   
   begin
      readln(myfile, info);
      writeln(info);
   end;
   close(myfile);
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Contact Details
[email protected]
Note to Students:
For details information on Pascal Programming
Contact: Tutorials Point

Chức năng xử lý tệp

Free Pascal cung cấp các hàm / thủ tục sau để xử lý tệp:

Sr.No. Tên & Mô tả chức năng
1

procedure Append(var t: Text);

Mở tệp ở chế độ nối thêm

2

procedure Assign(out f: file; const Name:);

Gán tên cho một tệp

3

procedure Assign(out f: file; p: PChar);

Gán tên cho một tệp

4

procedure Assign(out f: file; c: Char);

Gán tên cho một tệp

5

procedure Assign(out f: TypedFile; const Name:);

Gán tên cho một tệp

6

procedure Assign(out f: TypedFile; p: PChar);

Gán tên cho một tệp

7

procedure Assign(out f: TypedFile; c: Char);

Gán tên cho một tệp

số 8

procedure Assign(out t: Text; const s:);

Gán tên cho một tệp

9

procedure Assign(out t: Text; p: PChar);

Gán tên cho một tệp

10

procedure Assign(out t: Text; c: Char);

Gán tên cho một tệp

11

procedure BlockRead(var f: file; var Buf; count: Int64; var Result: Int64);

Đọc dữ liệu từ tệp vào bộ nhớ

12

procedure BlockRead(var f: file; var Buf; count: LongInt; var Result: LongInt);

Đọc dữ liệu từ tệp vào bộ nhớ

13

procedure BlockRead(var f: file; var Buf; count: Cardinal; var Result: Cardinal);

Đọc dữ liệu từ tệp vào bộ nhớ

14

procedure BlockRead(var f: file; var Buf; count: Word; var Result: Word);

Đọc dữ liệu từ tệp vào bộ nhớ

15

procedure BlockRead(var f: file; var Buf; count: Word; var Result: Integer);

Đọc dữ liệu từ tệp vào bộ nhớ

16

procedure BlockRead(var f: file; var Buf; count: Int64);

Đọc dữ liệu từ tệp vào bộ nhớ

17

procedure BlockWrite(var f: file; const Buf; Count: Int64; var Result: Int64);

Ghi dữ liệu từ bộ nhớ vào một tệp

18

procedure BlockWrite(var f: file; const Buf; Count: LongInt; var Result: LongInt);

Ghi dữ liệu từ bộ nhớ vào một tệp

19

procedure BlockWrite(var f: file; const Buf; Count: Cardinal; var Result: Cardinal);

Ghi dữ liệu từ bộ nhớ vào một tệp

20

procedure BlockWrite(var f: file; const Buf; Count: Word; var Result: Word);

Ghi dữ liệu từ bộ nhớ vào một tệp

21

procedure BlockWrite(var f: file; const Buf; Count: Word; var Result: Integer);

Ghi dữ liệu từ bộ nhớ vào một tệp

22

procedure BlockWrite(var f: file; const Buf; Count: LongInt);

Ghi dữ liệu từ bộ nhớ vào một tệp

23

procedure Close(var f: file);

Đóng một tệp

24

procedure Close(var t: Text);

Đóng một tệp

25

function EOF(var f: file):Boolean;

Kiểm tra cuối tệp

26

function EOF(var t: Text):Boolean;

Kiểm tra cuối tệp

27

function EOF: Boolean;

Kiểm tra cuối tệp

28

function EOLn(var t: Text):Boolean;

Kiểm tra cuối dòng

29

function EOLn: Boolean;

Kiểm tra cuối dòng

30

procedure Erase(var f: file);

Xóa tệp khỏi đĩa

31

procedure Erase(var t: Text);

Xóa tệp khỏi đĩa

32

function FilePos( var f: file):Int64;

Vị trí trong hồ sơ

33

function FileSize(var f: file):Int64;

Kích thước của tệp

34

procedure Flush(var t: Text);

Ghi bộ đệm tệp vào đĩa

35

function IOResult: Word;

Trả về kết quả của thao tác IO tệp cuối cùng

36

procedure Read(var F: Text; Args: Arguments);

Đọc từ tệp thành biến

37

procedure Read(Args: Arguments);

Đọc từ tệp thành biến

38

procedure ReadLn(var F: Text; Args: Arguments);

Đọc từ tệp thành biến và chuyển sang dòng tiếp theo

39

procedure ReadLn(Args: Arguments);

Đọc từ tệp thành biến và chuyển sang dòng tiếp theo

40

procedure Rename(var f: file; const s:);

Đổi tên tệp trên đĩa

41

procedure Rename(var f: file; p: PChar);

Đổi tên tệp trên đĩa

42

procedure Rename(var f: file; c: Char);

Đổi tên tệp trên đĩa

43

procedure Rename(var t: Text; const s);

Đổi tên tệp trên đĩa

44

procedure Rename(var t: Text; p: PChar);

Đổi tên tệp trên đĩa

45

procedure Rename( var t: Text; c: Char);

Đổi tên tệp trên đĩa

46

procedure Reset(var f: file; l: LongInt);

Mở tệp để đọc

47

procedure Reset(var f: file);

Mở tệp để đọc

48

procedure Reset(var f: TypedFile);

Mở tệp để đọc

49

procedure Reset(var t: Text);

Mở tệp để đọc

50

procedure Rewrite(var f: file; l: LongInt);

Mở tệp để ghi

51

procedure Rewrite(var f: file);

Mở tệp để ghi

52

procedure Rewrite(var f: TypedFile);

Mở tệp để ghi

53

procedure Rewrite(var t: Text);

Mở tệp để ghi

54

procedure Seek(var f: file; Pos: Int64);

Đặt vị trí tệp

55

function SeekEOF(var t: Text):Boolean;

Đặt vị trí tệp thành cuối tệp

56

function SeekEOF: Boolean;

Đặt vị trí tệp thành cuối tệp

57

function SeekEOLn(var t: Text):Boolean;

Đặt vị trí tệp thành cuối dòng

58

function SeekEOLn: Boolean;

Đặt vị trí tệp thành cuối dòng

59

procedure SetTextBuf(var f: Text; var Buf);

Đặt kích thước của bộ đệm tệp

60

procedure SetTextBuf(var f: Text; var Buf; Size: SizeInt);

Đặt kích thước của bộ đệm tệp

61

procedure Truncate(var F: file);

Cắt ngắn tệp ở vị trí

62

procedure Write(Args: Arguments);

Ghi biến vào tệp

63

procedure Write(var F: Text; Args: Arguments);

Ghi biến vào tệp

64

procedure Writeln(Args: Arguments);

Ghi biến vào tệp và nối dòng mới

65

procedure WriteLn(var F: Text; Args: Arguments);

Ghi biến vào tệp và nối dòng mới

Chương này giải thích về quản lý bộ nhớ động trong Pascal. Ngôn ngữ lập trình Pascal cung cấp một số chức năng để cấp phát và quản lý bộ nhớ.

Phân bổ bộ nhớ động

Trong khi lập trình, nếu bạn biết về kích thước của một mảng thì sẽ rất dễ dàng và bạn có thể xác định nó là một mảng. Ví dụ: để lưu trữ tên của bất kỳ người nào, nó có thể có tối đa 100 ký tự để bạn có thể xác định một cái gì đó như sau:

var
name: array[1..100] of char;

Nhưng bây giờ, chúng ta hãy xem xét một tình huống, nơi bạn không có ý tưởng về độ dài của văn bản mà bạn cần lưu trữ, chẳng hạn như bạn muốn lưu trữ mô tả chi tiết về một chủ đề. Ở đây, chúng ta cần xác định một con trỏ tới chuỗi mà không cần xác định dung lượng bộ nhớ là bao nhiêu.

Pascal cung cấp một thủ tục newđể tạo biến con trỏ.

program exMemory;
var
name: array[1..100] of char;
description: ^string;

begin
   name:= 'Zara Ali';
   
   new(description);
      if not assigned(description) then
         writeln(' Error - unable to allocate required memory')
      else
         description^ := 'Zara ali a DPS student in class 10th';
   writeln('Name = ', name );
   writeln('Description: ', description^ );
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Name = Zara Ali
Description: Zara ali a DPS student in class 10th

Bây giờ, nếu bạn cần xác định một con trỏ với số byte cụ thể sẽ được nó tham chiếu sau này, bạn nên sử dụng getmem chức năng hoặc getmem thủ tục, có cú pháp sau:

procedure Getmem(
   out p: pointer;
   Size: PtrUInt
);

function GetMem(
   size: PtrUInt
):pointer;

Trong ví dụ trước, chúng ta đã khai báo một con trỏ tới một chuỗi. Một chuỗi có giá trị tối đa là 255 byte. Nếu bạn thực sự không cần nhiều dung lượng như vậy, hoặc một không gian lớn hơn, về byte, chương trình con getmem cho phép xác định điều đó. Hãy để chúng tôi viết lại ví dụ trước, sử dụng getmem -

program exMemory;
var
name: array[1..100] of char;
description: ^string;

begin
   name:= 'Zara Ali';
   
   description := getmem(200);
      if not assigned(description) then
         writeln(' Error - unable to allocate required memory')
      else
         description^ := 'Zara ali a DPS student in class 10th';
   writeln('Name = ', name );
   writeln('Description: ', description^ );
   
   freemem(description);
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Name = Zara Ali
Description: Zara ali a DPS student in class 10th

Vì vậy, bạn có toàn quyền kiểm soát và bạn có thể chuyển bất kỳ giá trị kích thước nào trong khi cấp phát bộ nhớ không giống như mảng, nơi một khi bạn đã xác định kích thước thì không thể thay đổi.

Thay đổi kích thước và giải phóng bộ nhớ

Khi chương trình của bạn xuất hiện, hệ điều hành sẽ tự động giải phóng tất cả bộ nhớ được cấp bởi chương trình của bạn, nhưng cách tốt nhất là khi bạn không cần bộ nhớ nữa, thì bạn nên giải phóng bộ nhớ đó.

Pascal cung cấp thủ tục dispose để giải phóng một biến được tạo động bằng thủ tục new. Nếu bạn đã cấp phát bộ nhớ bằng cách sử dụng getmem chương trình con, sau đó bạn cần sử dụng chương trình con freememđể giải phóng bộ nhớ này. Các chương trình con freemem có cú pháp sau:

procedure Freemem(
   p: pointer;
  Size: PtrUInt
);

function Freemem(
   p: pointer
):PtrUInt;

Ngoài ra, bạn có thể tăng hoặc giảm kích thước của khối bộ nhớ được cấp phát bằng cách gọi hàm ReAllocMem . Hãy để chúng tôi kiểm tra các chương trình trên một lần nữa và tận dụng ReallocMemFreeMem chương trình con. Sau đây là cú pháp cho ReAllocMem :

function ReAllocMem(
   var p: pointer;
   Size: PtrUInt
):pointer;

Sau đây là một ví dụ mà làm cho sử dụng ReallocMemFreeMem chương trình con -

program exMemory;
var
name: array[1..100] of char;
description: ^string;
desp: string;

begin
   name:= 'Zara Ali';
   desp := 'Zara ali a DPS student.';
   
   description := getmem(30);
      if not assigned(description) then
         writeln('Error - unable to allocate required memory')
      else
         description^ := desp;

   (* Suppose you want to store bigger description *)
   description := reallocmem(description, 100);
   desp := desp + ' She is in class 10th.';
   description^:= desp; 
   
   writeln('Name = ', name );
   writeln('Description: ', description^ );
   
   freemem(description);
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Name = Zara Ali
Description: Zara ali a DPS student. She is in class 10th

Chức năng quản lý bộ nhớ

Pascal cung cấp một kho các chức năng quản lý bộ nhớ được sử dụng để triển khai các cấu trúc dữ liệu khác nhau và thực hiện lập trình cấp thấp trong Pascal. Nhiều chức năng trong số này phụ thuộc vào việc triển khai. Free Pascal cung cấp các chức năng và thủ tục sau để quản lý bộ nhớ:

SN Tên & Mô tả chức năng
1

function Addr(X: TAnytype):Pointer;

Trả về địa chỉ của biến

2

function Assigned(P: Pointer):Boolean;

Kiểm tra xem một con trỏ có hợp lệ không

3

function CompareByte(const buf1; const buf2; len: SizeInt):SizeInt;

So sánh 2 bộ đệm bộ nhớ mỗi byte

4

function CompareChar(const buf1; const buf2; len: SizeInt):SizeInt;

So sánh 2 bộ đệm bộ nhớ mỗi byte

5

function CompareDWord(const buf1; const buf2; len: SizeInt):SizeInt;

So sánh 2 bộ đệm bộ nhớ mỗi byte

6

function CompareWord(const buf1; const buf2; len: SizeInt):SizeInt;

So sánh 2 bộ đệm bộ nhớ mỗi byte

7

function Cseg: Word;

Trả về đoạn mã

số 8

procedure Dispose(P: Pointer);

Giải phóng bộ nhớ được cấp phát động

9

procedure Dispose(P: TypedPointer; Des: TProcedure);

Giải phóng bộ nhớ được cấp phát động

10

function Dseg: Word;

Trả về phân đoạn dữ liệu

11

procedure FillByte(var x; count: SizeInt; value: Byte);

Làm đầy vùng bộ nhớ với mẫu 8 bit

12

procedure FillChar( var x; count: SizeInt; Value: Byte|Boolean|Char);

Làm đầy vùng bộ nhớ với một số ký tự

13

procedure FillDWord( var x; count: SizeInt; value: DWord);

Làm đầy vùng bộ nhớ với mẫu 32 bit

14

procedure FillQWord( var x; count: SizeInt; value: QWord);

Làm đầy vùng bộ nhớ với mẫu 64 bit

15 procedure FillWord( var x; count: SizeInt; Value: Word);

Làm đầy vùng bộ nhớ với mẫu 16 bit

16

procedure Freemem( p: pointer; Size: PtrUInt);

Giải phóng bộ nhớ được cấp phát

17

procedure Freemem( p: pointer );

Giải phóng bộ nhớ được cấp phát

18

procedure Getmem( out p: pointer; Size: PtrUInt);

Cấp phát bộ nhớ mới

19

procedure Getmem( out p: pointer);

Cấp phát bộ nhớ mới

20

procedure GetMemoryManager( var MemMgr: TMemoryManager);

Trả về trình quản lý bộ nhớ hiện tại

21

function High( Arg: TypeOrVariable):TOrdinal;

Trả về chỉ số cao nhất của mảng mở hoặc được liệt kê

22

function IndexByte( const buf; len: SizeInt; b: Byte):SizeInt;

Tìm giá trị có kích thước byte trong một phạm vi bộ nhớ

23

function IndexChar( const buf; len: SizeInt; b: Char):SizeInt;

Tìm giá trị có kích thước ký tự trong một phạm vi bộ nhớ

24

function IndexDWord( const buf; len: SizeInt; b: DWord):SizeInt;

Tìm giá trị có kích thước DWord (32-bit) trong một phạm vi bộ nhớ

25

function IndexQWord( const buf; len: SizeInt; b: QWord):SizeInt;

Tìm giá trị có kích thước QWord trong một phạm vi bộ nhớ

26

function Indexword( const buf; len: SizeInt; b: Word):SizeInt;

Tìm giá trị có kích thước từ trong một phạm vi bộ nhớ

27

function IsMemoryManagerSet: Boolean;

Trình quản lý bộ nhớ có được đặt không

28

function Low( Arg: TypeOrVariable ):TOrdinal;

Trả về chỉ số thấp nhất của mảng đang mở hoặc được liệt kê

29

procedure Move( const source; var dest; count: SizeInt );

Di chuyển dữ liệu từ vị trí này trong bộ nhớ sang vị trí khác

30

procedure MoveChar0( const buf1; var buf2; len: SizeInt);

Di chuyển dữ liệu cho đến ký tự 0 đầu tiên

31

procedure New( var P: Pointer);

Tự động cấp phát bộ nhớ cho biến

32

procedure New( var P: Pointer; Cons: TProcedure);

Tự động cấp phát bộ nhớ cho biến

33

function Ofs( var X ):LongInt;

Trả về phần bù của biến

34

function ptr( sel: LongInt; off: LongInt):farpointer;

Kết hợp phân đoạn và bù đắp với con trỏ

35

function ReAllocMem( var p: pointer; Size: PtrUInt):pointer;

Thay đổi kích thước khối bộ nhớ trên heap

36

function Seg( var X):LongInt;

Trả về phân đoạn

37

procedure SetMemoryManager( const MemMgr: TMemoryManager );

Đặt trình quản lý bộ nhớ

38

function Sptr: Pointer;

Trả về con trỏ ngăn xếp hiện tại

39

function Sseg: Word;

Trả về giá trị thanh ghi phân đoạn ngăn xếp

Một chương trình Pascal có thể bao gồm các mô-đun được gọi là đơn vị. Một đơn vị có thể bao gồm một số khối mã, lần lượt được tạo thành từ các biến và khai báo kiểu, câu lệnh, thủ tục, v.v. Có rất nhiều đơn vị tích hợp sẵn trong Pascal và Pascal cho phép người lập trình xác định và viết các đơn vị của riêng họ để sử dụng. sau trong các chương trình khác nhau.

Sử dụng các đơn vị tích hợp

Cả đơn vị cài sẵn và đơn vị do người dùng định nghĩa đều được bao gồm trong một chương trình bởi mệnh đề sử dụng. Chúng tôi đã sử dụng đơn vị biến thể trong hướng dẫn Pascal - Variants . Hướng dẫn này giải thích việc tạo và bao gồm các đơn vị do người dùng xác định. Tuy nhiên, trước tiên chúng ta hãy xem cách bao gồm một đơn vị tích hợpcrt trong chương trình của bạn -

program myprog;
uses crt;

Ví dụ sau minh họa bằng cách sử dụng crt đơn vị -

Program Calculate_Area (input, output);
uses crt;
var 
   a, b, c, s, area: real;

begin
   textbackground(white); (* gives a white background *)
   clrscr; (*clears the screen *)
   
   textcolor(green); (* text color is green *)
   gotoxy(30, 4); (* takes the pointer to the 4th line and 30th column) 
   
   writeln('This program calculates area of a triangle:');
   writeln('Area = area = sqrt(s(s-a)(s-b)(s-c))');
   writeln('S stands for semi-perimeter');
   writeln('a, b, c are sides of the triangle');
   writeln('Press any key when you are ready');
   
   readkey;
   clrscr;
   gotoxy(20,3);
   
   write('Enter a: ');
   readln(a);
   gotoxy(20,5);
   
   write('Enter b:');
   readln(b);
   gotoxy(20, 7);
   
   write('Enter c: ');
   readln(c);

   s := (a + b + c)/2.0;
   area := sqrt(s * (s - a)*(s-b)*(s-c));
   gotoxy(20, 9);
   
   writeln('Area: ',area:10:3);
   readkey;
end.

Đây là chương trình tương tự mà chúng tôi đã sử dụng ngay ở phần đầu của hướng dẫn Pascal, hãy biên dịch và chạy nó để tìm ra tác động của sự thay đổi.

Tạo và sử dụng một đơn vị Pascal

Để tạo một đơn vị, bạn cần viết các mô-đun hoặc chương trình con mà bạn muốn lưu trữ trong đó và lưu nó trong một tệp với .passự mở rộng. Dòng đầu tiên của tệp này phải bắt đầu bằng đơn vị từ khóa theo sau là tên của đơn vị. Ví dụ -

unit calculateArea;

Sau đây là ba bước quan trọng trong việc tạo một đơn vị Pascal:

  • Tên của tệp và tên của đơn vị phải hoàn toàn giống nhau. Vì vậy, đơn vị tính toán của chúng tôi sẽ được lưu trong một tệp có tên là CalculArea.pas.

  • Dòng tiếp theo phải bao gồm một từ khóa interface. Sau dòng này, bạn sẽ viết các khai báo cho tất cả các hàm và thủ tục sẽ có trong đơn vị này.

  • Ngay sau khi khai báo hàm, hãy viết từ implementation, lại là một từ khóa. Sau dòng chứa triển khai từ khóa, cung cấp định nghĩa của tất cả các chương trình con.

Chương trình sau tạo đơn vị có tên là CalculArea -

unit CalculateArea;
interface

function RectangleArea( length, width: real): real;
function CircleArea(radius: real) : real;
function TriangleArea( side1, side2, side3: real): real;

implementation

function RectangleArea( length, width: real): real;
begin
   RectangleArea := length * width;
end;

function CircleArea(radius: real) : real;
const
   PI = 3.14159;
begin
   CircleArea := PI * radius * radius;
end;

function TriangleArea( side1, side2, side3: real): real;
var
   s, area: real;

begin
   s := (side1 + side2 + side3)/2.0;
   area := sqrt(s * (s - side1)*(s-side2)*(s-side3));
   TriangleArea := area;
end;

end.

Tiếp theo, chúng ta hãy viết một chương trình đơn giản sử dụng đơn vị mà chúng ta đã xác định ở trên -

program AreaCalculation;
uses CalculateArea,crt;

var
   l, w, r, a, b, c, area: real;

begin
   clrscr;
   l := 5.4;
   w := 4.7;
   area := RectangleArea(l, w);
   writeln('Area of Rectangle 5.4 x 4.7 is: ', area:7:3);

   r:= 7.0;
   area:= CircleArea(r);
   writeln('Area of Circle with radius 7.0 is: ', area:7:3);

   a := 3.0;
   b:= 4.0;
   c:= 5.0;
  
   area:= TriangleArea(a, b, c);
   writeln('Area of Triangle 3.0 by 4.0 by 5.0 is: ', area:7:3);
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Area of Rectangle 5.4 x 4.7 is: 25.380
Area of Circle with radius 7.0 is: 153.938
Area of Triangle 3.0 by 4.0 by 5.0 is: 6.000

Hầu hết các phần mềm bạn viết cần triển khai một số dạng hàm ngày trả về ngày và giờ hiện tại. Ngày là một phần của cuộc sống hàng ngày đến nỗi bạn có thể dễ dàng làm việc với chúng mà không cần suy nghĩ. Pascal cũng cung cấp các công cụ mạnh mẽ về số học ngày tháng giúp thao tác với ngày tháng dễ dàng. Tuy nhiên, tên thực tế và hoạt động của các hàm này khác nhau đối với các trình biên dịch khác nhau.

Lấy ngày và giờ hiện tại

Hàm TimeToString của Pascal cung cấp cho bạn thời gian hiện tại ở dạng phân cách bằng dấu hai chấm (:). Ví dụ sau đây cho thấy cách lấy thời gian hiện tại:

program TimeDemo;
uses sysutils;

begin
   writeln ('Current time : ',TimeToStr(Time));
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Current time : 18:33:08

Các Date hàm trả về ngày hiện tại trong TDateTimeđịnh dạng. TDateTime là một giá trị kép, cần một số giải mã và định dạng. Chương trình sau đây trình bày cách sử dụng nó trong chương trình của bạn để hiển thị ngày hiện tại -

Program DateDemo;
uses sysutils;
var
   YY,MM,DD : Word;

begin
   writeln ('Date : ',Date);
   DeCodeDate (Date,YY,MM,DD);
   writeln (format ('Today is (DD/MM/YY): %d/%d/%d ',[dd,mm,yy]));
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Date: 4.111300000000000E+004
Today is (DD/MM/YY):23/7/2012

Hàm Now trả về ngày và giờ hiện tại -

Program DatenTimeDemo;
uses sysutils;
begin
   writeln ('Date and Time at the time of writing : ',DateTimeToStr(Now));
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Date and Time at the time of writing : 23/7/2012 18:51:

Free Pascal cung cấp một cấu trúc tem thời gian đơn giản có tên TTimeStamp, có định dạng sau:

type TTimeStamp = record
   Time: Integer;
   Date: Integer;
end;

Các chức năng ngày và giờ khác nhau

Free Pascal cung cấp các hàm ngày và giờ sau:

Sr.No. Tên & Mô tả chức năng
1

function DateTimeToFileDate(DateTime: TDateTime):LongInt;

Chuyển đổi loại DateTime thành ngày tệp.

2

function DateTimeToStr( DateTime: TDateTime):;

Xây dựng biểu diễn chuỗi của DateTime

3

function DateTimeToStr(DateTime: TDateTime; const FormatSettings: TFormatSettings):;

Xây dựng biểu diễn chuỗi của DateTime

4

procedure DateTimeToString(out Result: ;const FormatStr: ;const DateTime: TDateTime);

Xây dựng biểu diễn chuỗi của DateTime

5

procedure DateTimeToString(out Result: ; const FormatStr: ; const DateTime: TDateTime; const FormatSettings: TFormatSettings);

Xây dựng biểu diễn chuỗi của DateTime

6

procedure DateTimeToSystemTime(DateTime: TDateTime; out SystemTime: TSystemTime);

Chuyển đổi DateTime thành giờ hệ thống

7

function DateTimeToTimeStamp( DateTime: TDateTime):TTimeStamp;Chuyển đổi DateTime thành dấu thời gian

số 8

function DateToStr(Date: TDateTime):;

Xây dựng biểu diễn chuỗi ngày

9

function DateToStr(Date: TDateTime; const FormatSettings: TFormatSettings):;

Xây dựng biểu diễn chuỗi ngày

10

function Date: TDateTime;

Nhận ngày hiện tại

11

function DayOfWeek(DateTime: TDateTime):Integer;

Được ngày trong tuần

12

procedure DecodeDate(Date: TDateTime; out Year: Word; out Month: Word; out Day: Word);

Giải mã DateTime thành năm tháng và ngày

13

procedure DecodeTime(Time: TDateTime; out Hour: Word; out Minute: Word; out Second: Word; out MilliSecond: Word);

Giải mã DateTime thành giờ, phút và giây

14

function EncodeDate(Year: Word; Month: Word; Day: Word):TDateTime;

Mã hóa năm, ngày và tháng thành DateTime

15

function EncodeTime(Hour: Word; Minute: Word; Second: Word; MilliSecond: Word):TDateTime;

Mã hóa giờ, phút và giây thành DateTime

16

function FormatDateTime(const FormatStr: ; DateTime: TDateTime):;

Trả về biểu diễn chuỗi của DateTime

17

function FormatDateTime(const FormatStr: ; DateTime: TDateTime; const FormatSettings: TFormatSettings):;

Trả về biểu diễn chuỗi của DateTime

18

function IncMonth(const DateTime: TDateTime; NumberOfMonths: Integer = 1):TDateTime;

Thêm 1 vào tháng

19

function IsLeapYear(Year: Word):Boolean;

Xác định xem năm có phải là năm nhuận không

20

function MSecsToTimeStamp(MSecs: Comp):TTimeStamp;

Chuyển đổi số mili giây thành dấu thời gian

21

function Now: TDateTime;

Nhận ngày và giờ hiện tại

22

function StrToDateTime(const S:):TDateTime;

Chuyển đổi chuỗi thành DateTime

23

function StrToDateTime(const s: ShortString; const FormatSettings: TFormatSettings):TDateTime;

Chuyển đổi chuỗi thành DateTime

24

function StrToDateTime(const s: AnsiString; const FormatSettings: TFormatSettings):TDateTime;

Chuyển đổi chuỗi thành DateTime

25

function StrToDate(const S: ShortString):TDateTime;

Chuyển đổi chuỗi thành ngày tháng

26

function StrToDate(const S: Ansistring):TDateTime;

Chuyển đổi chuỗi thành ngày tháng

27

function StrToDate(const S: ShortString; separator: Char):TDateTime;

Chuyển đổi chuỗi thành ngày tháng

28

function StrToDate(const S: AnsiString; separator: Char):TDateTime;

Chuyển đổi chuỗi thành ngày tháng

29

function StrToDate(const S: ShortString; const useformat: ; separator: Char):TDateTime;

Chuyển đổi chuỗi thành ngày tháng

30

function StrToDate(const S: AnsiString; const useformat: ; separator: Char):TDateTime;

Chuyển đổi chuỗi thành ngày tháng

31

function StrToDate(const S: PChar; Len: Integer; const useformat: ; separator: Char = #0):TDateTime;

Chuyển đổi chuỗi thành ngày tháng

32

function StrToTime(const S: Shortstring):TDateTime;

Chuyển đổi chuỗi thành thời gian

33

function StrToTime(const S: Ansistring):TDateTime;

Chuyển đổi chuỗi thành thời gian

34

function StrToTime(const S: ShortString; separator: Char):TDateTime;

Chuyển đổi chuỗi thành thời gian

35

function StrToTime(const S: AnsiString; separator: Char):TDateTime;

Chuyển đổi chuỗi thành thời gian

36

function StrToTime(const S: ; FormatSettings: TFormatSettings):TDateTime;

Chuyển đổi chuỗi thành thời gian

37

function StrToTime(const S: PChar; Len: Integer; separator: Char = #0):TDateTime;

Chuyển đổi chuỗi thành thời gian

38

function SystemTimeToDateTime(const SystemTime: TSystemTime):TDateTime;

Chuyển đổi thời gian hệ thống thành ngày giờ

39

function TimeStampToDateTime(const TimeStamp: TTimeStamp):TDateTime;

Chuyển đổi tem thời gian thành DateTime

40

function TimeStampToMSecs(const TimeStamp: TTimeStamp):comp;

Chuyển đổi Dấu thời gian thành số mili giây

41

function TimeToStr(Time: TDateTime):;

Trả về biểu diễn chuỗi của Thời gian

42

function TimeToStr(Time: TDateTime; const FormatSettings: TFormatSettings):;

Trả về biểu diễn chuỗi của Thời gian

43

function Time: TDateTime;

Nhận thời gian hiện tại

Ví dụ sau minh họa việc sử dụng một số hàm trên:

Program DatenTimeDemo;
uses sysutils;
var
year, month, day, hr, min, sec, ms: Word;

begin
   writeln ('Date and Time at the time of writing : ',DateTimeToStr(Now));
   writeln('Today is ',LongDayNames[DayOfWeek(Date)]);
   writeln;
   writeln('Details of Date: ');
   
   DecodeDate(Date,year,month,day);
   writeln (Format ('Day: %d',[day]));
   writeln (Format ('Month: %d',[month]));
   writeln (Format ('Year: %d',[year]));
   writeln;
   writeln('Details of Time: ');
   
   DecodeTime(Time,hr, min, sec, ms);
   writeln (format('Hour: %d:',[hr]));
   writeln (format('Minutes: %d:',[min]));
   writeln (format('Seconds: %d:',[sec]));
   writeln (format('Milliseconds: %d:',[hr]));
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Date and Time at the time of writing : 7/24/2012 8:26:
Today is Tuesday
Details of Date:
Day:24
Month:7
Year: 2012
Details of Time:
Hour: 8
Minutes: 26
Seconds: 21
Milliseconds: 8

Chúng ta có thể tưởng tượng vũ trụ của chúng ta được làm từ các vật thể khác nhau như mặt trời, trái đất, mặt trăng, v.v. Tương tự, chúng ta có thể tưởng tượng chiếc xe của chúng ta được làm từ các vật thể khác nhau như bánh xe, tay lái, bánh răng, v.v. Tương tự, có các khái niệm lập trình hướng đối tượng, giả sử mọi thứ như một đối tượng và triển khai một phần mềm bằng các đối tượng khác nhau. Trong Pascal, có hai kiểu dữ liệu cấu trúc được sử dụng để triển khai một đối tượng thế giới thực:

  • Các loại đối tượng
  • Các loại lớp

Các khái niệm hướng đối tượng

Trước khi đi vào chi tiết, chúng ta hãy định nghĩa các thuật ngữ Pascal quan trọng liên quan đến Pascal hướng đối tượng.

  • Object- Một đối tượng là một loại bản ghi đặc biệt có chứa các trường giống như một bản ghi; tuy nhiên, không giống như các bản ghi, các đối tượng chứa các thủ tục và chức năng như một phần của đối tượng. Các thủ tục và hàm này được coi là con trỏ đến các phương thức được liên kết với kiểu của đối tượng.

  • Class- Một Lớp được định nghĩa gần giống như một Đối tượng, nhưng có sự khác biệt về cách chúng được tạo ra. Lớp được cấp phát trên Heap của một chương trình, trong khi Đối tượng được cấp phát trên Stack. Nó là một con trỏ tới đối tượng, không phải chính đối tượng.

  • Instantiation of a class- Instantiation nghĩa là tạo một biến của kiểu lớp đó. Vì một lớp chỉ là một con trỏ, khi một biến của kiểu lớp được khai báo, sẽ có bộ nhớ chỉ được cấp phát cho con trỏ chứ không phải cho toàn bộ đối tượng. Chỉ khi nó được khởi tạo bằng cách sử dụng một trong các hàm tạo của nó, bộ nhớ mới được cấp phát cho đối tượng. Các thể hiện của một lớp cũng được gọi là 'đối tượng', nhưng đừng nhầm lẫn chúng với Đối tượng Pascal Đối tượng. Trong hướng dẫn này, chúng ta sẽ viết 'Đối tượng' cho Đối tượng Pascal và 'đối tượng' cho đối tượng khái niệm hoặc cá thể lớp.

  • Member Variables - Đây là các biến được định nghĩa bên trong một Lớp hoặc một Đối tượng.

  • Member Functions - Đây là các hàm hoặc thủ tục được định nghĩa bên trong một Lớp hoặc một Đối tượng và được sử dụng để truy cập dữ liệu đối tượng.

  • Visibility of Members- Các thành viên của một Đối tượng hoặc Lớp còn được gọi là các trường. Các lĩnh vực này có tầm nhìn khác nhau. Khả năng hiển thị đề cập đến khả năng tiếp cận của các thành viên, tức là chính xác nơi mà các thành viên này sẽ có thể truy cập. Đối tượng có ba cấp độ hiển thị: công khai, riêng tư và được bảo vệ. Các lớp có năm kiểu hiển thị: công khai, riêng tư, riêng tư nghiêm ngặt, được bảo vệ và xuất bản. Chúng tôi sẽ thảo luận về khả năng hiển thị chi tiết.

  • Inheritance- Khi một Lớp được định nghĩa bằng cách kế thừa các chức năng hiện có của Lớp cha, thì nó được cho là được kế thừa. Ở đây lớp con sẽ kế thừa tất cả hoặc một vài hàm và biến thành viên của một lớp cha. Các đối tượng cũng có thể được kế thừa.

  • Parent Class- Một Lớp được kế thừa bởi Lớp khác. Đây còn được gọi là lớp cơ sở hoặc siêu lớp.

  • Child Class- Một lớp kế thừa từ một lớp khác. Đây còn được gọi là lớp con hoặc lớp dẫn xuất.

  • Polymorphism- Đây là một khái niệm hướng đối tượng trong đó cùng một chức năng có thể được sử dụng cho các mục đích khác nhau. Ví dụ: tên hàm sẽ giữ nguyên nhưng nó có thể có số lượng đối số khác nhau và có thể thực hiện các tác vụ khác nhau. Các lớp Pascal thực hiện tính đa hình. Các đối tượng không triển khai tính đa hình.

  • Overloading- Đây là một kiểu đa hình trong đó một số hoặc tất cả các toán tử có cách triển khai khác nhau tùy thuộc vào kiểu đối số của chúng. Tương tự, các chức năng cũng có thể được nạp chồng với các cách triển khai khác nhau. Các lớp Pascal thực hiện nạp chồng, nhưng các Đối tượng thì không.

  • Data Abstraction - Bất kỳ biểu diễn dữ liệu nào trong đó chi tiết triển khai được ẩn (trừu tượng hóa).

  • Encapsulation - Đề cập đến một khái niệm trong đó chúng ta đóng gói tất cả dữ liệu và các hàm thành viên lại với nhau để tạo thành một đối tượng.

  • Constructor - Đề cập đến một loại hàm đặc biệt sẽ được gọi tự động bất cứ khi nào có sự hình thành đối tượng từ một lớp hoặc một Đối tượng.

  • Destructor - Đề cập đến một loại chức năng đặc biệt sẽ được gọi tự động bất cứ khi nào một Đối tượng hoặc Lớp bị xóa hoặc ra khỏi phạm vi.

Định nghĩa các đối tượng Pascal

Một đối tượng được khai báo bằng cách sử dụng khai báo kiểu. Hình thức chung của một khai báo đối tượng như sau:

type object-identifier = object  
   private
   field1 : field-type;  
   field2 : field-type;  
   ...
   public
   procedure proc1;  
   function f1(): function-type;
   end;  
var objectvar : object-identifier;

Hãy để chúng tôi xác định một Đối tượng Hình chữ nhật có hai thành viên dữ liệu kiểu số nguyên - lengthwidth và một số hàm thành viên để thao tác với các thành viên dữ liệu này và một thủ tục để vẽ hình chữ nhật.

type 
   Rectangle = object  
   private  
      length, width: integer; 
   
   public  
      constructor init;  
      destructor done;  
      
      procedure setlength(l: inteter);  
      function getlength(): integer;  
      
      procedure setwidth(w: integer);  
      function getwidth(): integer;  
      
      procedure draw;
end;
var
   r1: Rectangle;
   pr1: ^Rectangle;

Sau khi tạo các đối tượng của mình, bạn sẽ có thể gọi các hàm thành viên liên quan đến đối tượng đó. Một hàm thành viên sẽ chỉ có thể xử lý biến thành viên của đối tượng liên quan.

Ví dụ sau cho thấy cách đặt chiều dài và chiều rộng cho hai đối tượng hình chữ nhật và vẽ chúng bằng cách gọi các hàm thành viên.

r1.setlength(3);
r1.setwidth(7);

writeln(' Draw a rectangle: ', r1.getlength(), ' by ' , r1.getwidth());
r1.draw;
new(pr1);
pr1^.setlength(5);
pr1^.setwidth(4);

writeln(' Draw a rectangle: ', pr1^.getlength(), ' by ' ,pr1^.getwidth());
pr1^.draw;
dispose(pr1);

Sau đây là một ví dụ đầy đủ để chỉ ra cách sử dụng các đối tượng trong Pascal:

program exObjects;
type 
   Rectangle = object  
   private  
      length, width: integer; 
   
   public  
      procedure setlength(l: integer);
      function getlength(): integer;  
      
      procedure setwidth(w: integer);  
      function getwidth(): integer;  
      
      procedure draw;
end;
var
   r1: Rectangle;
   pr1: ^Rectangle;

procedure Rectangle.setlength(l: integer);
begin
   length := l;
end;

procedure Rectangle.setwidth(w: integer);
begin
   width :=w;
end;

function Rectangle.getlength(): integer;  
begin
   getlength := length;
end;

function Rectangle.getwidth(): integer;  
begin
   getwidth := width;
end;

procedure Rectangle.draw;
var 
   i, j: integer;
begin
   for i:= 1 to length do
   begin
     for j:= 1 to width do
        write(' * ');
     writeln;
   end;
end;

begin
   r1.setlength(3);
   r1.setwidth(7);
   
   writeln('Draw a rectangle:', r1.getlength(), ' by ' , r1.getwidth());
   r1.draw;
   new(pr1);
   pr1^.setlength(5);
   pr1^.setwidth(4);
   
   writeln('Draw a rectangle:', pr1^.getlength(), ' by ' ,pr1^.getwidth());
   pr1^.draw;
   dispose(pr1);
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Draw a rectangle: 3 by 7
* * * * * * *
* * * * * * *
* * * * * * *
Draw a rectangle: 5 by 4
* * * *
* * * *
* * * *
* * * *
* * * *

Khả năng hiển thị của các thành viên đối tượng

Khả năng hiển thị cho biết khả năng tiếp cận của các thành viên đối tượng. Các thành viên đối tượng Pascal có ba kiểu hiển thị:

Sr.No Khả năng hiển thị & Khả năng tiếp cận
1

Public

Các thành viên có thể được sử dụng bởi các đơn vị khác ngoài đơn vị chương trình

2

Private

Các thành viên chỉ có thể truy cập trong đơn vị hiện tại.

3

Protected

Các thành viên chỉ có sẵn cho các đối tượng con cháu từ đối tượng mẹ.

Theo mặc định, các trường và phương thức của một đối tượng là công khai và được xuất ra bên ngoài đơn vị hiện tại.

Các hàm tạo và hủy cho các đối tượng Pascal -

Constructorslà loại phương thức đặc biệt, được gọi tự động bất cứ khi nào một đối tượng được tạo. Bạn tạo một hàm tạo trong Pascal chỉ bằng cách khai báo một phương thức với một hàm tạo từ khóa. Thông thường, tên phương thức là Init, tuy nhiên, bạn có thể cung cấp bất kỳ số nhận dạng hợp lệ nào của riêng mình. Bạn có thể truyền bao nhiêu đối số tùy thích vào hàm khởi tạo.

Destructorslà các phương thức được gọi trong quá trình phá hủy đối tượng. Các phương thức của hàm hủy sẽ phá hủy mọi cấp phát bộ nhớ được tạo bởi các hàm tạo.

Ví dụ sau sẽ cung cấp một hàm tạo và một hàm hủy cho lớp Rectangle, lớp này sẽ khởi tạo chiều dài và chiều rộng cho hình chữ nhật tại thời điểm tạo đối tượng và hủy nó khi nó vượt ra khỏi phạm vi.

program exObjects;
type 
   Rectangle = object  
   private  
      length, width: integer; 
   public  
      constructor init(l, w: integer);
      destructor done;
      
      procedure setlength(l: integer);
      function getlength(): integer;  
      
      procedure setwidth(w: integer);  
      function getwidth(): integer;  
      
      procedure draw;
end;

var
   r1: Rectangle;
   pr1: ^Rectangle;

constructor Rectangle.init(l, w: integer);
begin
   length := l;
   width := w;
end;

destructor Rectangle.done;
begin
   writeln(' Desctructor Called');
end; 

procedure Rectangle.setlength(l: integer);
begin
   length := l;
end;

procedure Rectangle.setwidth(w: integer);
begin
   width :=w;
end;

function Rectangle.getlength(): integer;  
begin
   getlength := length;
end;

function Rectangle.getwidth(): integer;  
begin
   getwidth := width;
end;

procedure Rectangle.draw;
var 
   i, j: integer;
begin
   for i:= 1 to length do
   begin
      for j:= 1 to width do
         write(' * ');
      writeln;
   end;
end;

begin
   r1.init(3, 7);
   writeln('Draw a rectangle:', r1.getlength(), ' by ' , r1.getwidth());
   r1.draw;
   new(pr1, init(5, 4));
   
   writeln('Draw a rectangle:', pr1^.getlength(), ' by ',pr1^.getwidth());
   pr1^.draw;
   pr1^.init(7, 9);
   
   writeln('Draw a rectangle:', pr1^.getlength(), ' by ' ,pr1^.getwidth());
   pr1^.draw;
   dispose(pr1);
   r1.done;
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Draw a rectangle: 3 by 7
* * * * * * *
* * * * * * *
* * * * * * *
Draw a rectangle: 5 by 4
* * * *
* * * *
* * * *
* * * *
* * * *
Draw a rectangle: 7 by 9
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
Destructor Called

Kế thừa cho các đối tượng Pascal

Các đối tượng Pascal có thể kế thừa từ một đối tượng mẹ. Chương trình sau minh họa sự kế thừa trong các đối tượng Pascal. Hãy để chúng tôi tạo một đối tượng khác có tênTableTop, được kế thừa từ đối tượng Rectangle.

program exObjects;
type 
   Rectangle = object  
   private  
      length, width: integer; 
   public  
      procedure setlength(l: integer);  
      function getlength(): integer;  
      procedure setwidth(w: integer);  
      function getwidth(): integer;  
      procedure draw;
end;

TableTop = object (Rectangle)
   private
     material: string;
   public
      function getmaterial(): string;
      procedure setmaterial( m: string);
      procedure displaydetails;
      procedure draw;
end;

var
   tt1: TableTop;

procedure Rectangle.setlength(l: integer);
begin
   length := l;
end;

procedure Rectangle.setwidth(w: integer);
begin
   width :=w;
end;

function Rectangle.getlength(): integer;  
begin
   getlength := length;
end;

function Rectangle.getwidth():integer;
begin
   getwidth := width;
end;

procedure Rectangle.draw;
var 
   i, j: integer;
begin
   for i:= 1 to length do
   begin
      for j:= 1 to width do
         write(' * ');
      writeln;
  end;
end;

function TableTop.getmaterial(): string;
begin
   getmaterial := material;
end;

procedure TableTop.setmaterial( m: string);
begin
   material := m;
end;

procedure TableTop.displaydetails;
begin
   writeln('Table Top: ', self.getlength(), ' by ' , self.getwidth());
   writeln('Material: ', self.getmaterial());
end;

procedure TableTop.draw();
var
   i, j: integer;
begin
   for i:= 1 to length do
   begin
      for j:= 1 to width do
         write(' * ');
   writeln;
   end;
   writeln('Material: ', material);
end;

begin
   tt1.setlength(3);
   tt1.setwidth(7);
   tt1.setmaterial('Wood');
   tt1.displaydetails();
   writeln;
   writeln('Calling the Draw method');
   tt1.draw();
end.

Sau đây là những điểm quan trọng cần được lưu ý:

  • Đối tượng Tabletop đã kế thừa tất cả các thành viên của đối tượng Rectangle.

  • Cũng có một phương pháp hòa trong TableTop . Khi bốc thăm phương pháp được gọi là sử dụng một bàn đối tượng, bốc thăm bàn của bị gọi.

  • Có một ví dụ ngầm có tên self mà đề cập đến phiên bản hiện tại của đối tượng.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Table Top: 3 by 7
Material: Wood

Calling the Draw Method 
* * * * * * *
* * * * * * *
* * * * * * *
Material: Wood

Bạn đã thấy rằng các Đối tượng Pascal thể hiện một số đặc điểm của mô hình hướng đối tượng. Chúng thực hiện đóng gói, ẩn dữ liệu và kế thừa, nhưng chúng cũng có những hạn chế. Ví dụ, đối tượng Pascal không tham gia vào tính đa hình. Vì vậy, các lớp được sử dụng rộng rãi để thực hiện hành vi hướng đối tượng thích hợp trong một chương trình, đặc biệt là phần mềm dựa trên GUI.

Một Lớp được định nghĩa theo cách gần giống như một Đối tượng, nhưng là một con trỏ đến một Đối tượng chứ không phải chính Đối tượng. Về mặt kỹ thuật, điều này có nghĩa là Lớp được cấp phát trên Heap của một chương trình, trong khi Đối tượng được cấp trên Stack. Nói cách khác, khi bạn khai báo một biến kiểu đối tượng, nó sẽ chiếm nhiều không gian trên ngăn xếp bằng kích thước của đối tượng, nhưng khi bạn khai báo một biến kiểu lớp, nó sẽ luôn có kích thước bằng một con trỏ trên ngăn xếp. Dữ liệu lớp thực tế sẽ ở trên heap.

Định nghĩa các lớp Pascal

Một lớp được khai báo giống như một đối tượng, sử dụng khai báo kiểu. Hình thức chung của một khai báo lớp như sau:

type class-identifier = class  
   private
      field1 : field-type;  
      field2 : field-type;  
        ...
   
   public
      constructor create();
      procedure proc1;  
      function f1(): function-type;
end;  
var classvar : class-identifier;

Cần lưu ý những điểm quan trọng sau:

  • Định nghĩa lớp chỉ nên nằm dưới phần khai báo kiểu của chương trình.

  • Một lớp được định nghĩa bằng cách sử dụng class từ khóa.

  • Trường là các mục dữ liệu tồn tại trong mỗi thể hiện của lớp.

  • Các phương thức được khai báo trong định nghĩa của một lớp.

  • Có một hàm tạo được xác định trước được gọi là Createtrong lớp Root. Mọi lớp trừu tượng và mọi lớp cụ thể đều là con của Root, vì vậy tất cả các lớp đều có ít nhất một hàm tạo.

  • Có một trình hủy xác định trước được gọi là Destroytrong lớp Root. Mọi lớp trừu tượng và mọi lớp cụ thể đều là hậu duệ của Root, do đó, tất cả các lớp đều có ít nhất một hàm hủy.

Chúng ta hãy định nghĩa một lớp Rectangle có hai thành viên dữ liệu kiểu số nguyên - chiều dài và chiều rộng và một số hàm thành viên để thao tác với các thành viên dữ liệu này và một thủ tục để vẽ hình chữ nhật.

type
   Rectangle = class
   private
      length, width: integer;
   
   public
      constructor create(l, w: integer);
      procedure setlength(l: integer);
      function getlength(): integer;
      procedure setwidth(w: integer);
      function getwidth(): integer;
      procedure draw;
end;

Chúng ta hãy viết một chương trình hoàn chỉnh để tạo một thể hiện của một lớp hình chữ nhật và vẽ hình chữ nhật. Đây cũng là ví dụ chúng ta đã sử dụng khi thảo luận về các đối tượng Pascal. Bạn sẽ thấy cả hai chương trình gần như giống nhau, với các ngoại lệ sau:

  • Bạn sẽ cần bao gồm chỉ thị {$ mode objfpc} để sử dụng các lớp.

  • Bạn sẽ cần bao gồm chỉ thị {$ m +} để sử dụng các hàm tạo.

  • Khởi tạo lớp khác với khởi tạo đối tượng. Chỉ khai báo biến không tạo khoảng trống cho instance, bạn sẽ sử dụng hàm tạo create để cấp phát bộ nhớ.

Đây là ví dụ hoàn chỉnh -

{$mode objfpc} // directive to be used for defining classes {$m+}		   // directive to be used for using constructor

program exClass;
type
   Rectangle = class
   private
      length, width: integer;
   
   public
      constructor create(l, w: integer);
      procedure setlength(l: integer);
      
      function getlength(): integer;
      procedure setwidth(w: integer);
      
      function getwidth(): integer;
      procedure draw;
end;
var
   r1: Rectangle;

constructor Rectangle.create(l, w: integer);
begin
   length := l;
   width := w;
end;

procedure Rectangle.setlength(l: integer);
begin
   length := l;
end;

procedure Rectangle.setwidth(w: integer);
begin
   width :=w;
end;

function Rectangle.getlength(): integer;
begin
   getlength := length;
end;

function Rectangle.getwidth(): integer;
begin
   getwidth := width;
end;

procedure Rectangle.draw;
var
   i, j: integer;
begin
   for i:= 1 to length do
   begin
      for j:= 1 to width do
         write(' * ');
      writeln;
   end;
end;

begin
   r1:= Rectangle.create(3, 7);
   
   writeln(' Draw Rectangle: ', r1.getlength(), ' by ' , r1.getwidth());
   r1.draw;
   r1.setlength(4);
   r1.setwidth(6);
   
   writeln(' Draw Rectangle: ', r1.getlength(), ' by ' , r1.getwidth());
   r1.draw;
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Draw Rectangle: 3 by 7
* * * * * * *
* * * * * * *
* * * * * * *
Draw Rectangle: 4 by 6
* * * * * * 
* * * * * * 
* * * * * * 
* * * * * *

Khả năng hiển thị của các thành viên trong lớp

Khả năng hiển thị cho biết khả năng truy cập của các thành viên trong lớp. Các thành viên lớp Pascal có năm kiểu hiển thị:

Sr.No Khả năng hiển thị & Khả năng tiếp cận
1

Public

Những thành viên này luôn có thể truy cập được.

2

Private

Các thành viên này chỉ có thể được truy cập trong mô-đun hoặc đơn vị có chứa định nghĩa lớp. Chúng có thể được truy cập từ bên trong các phương thức của lớp hoặc từ bên ngoài chúng.

3

Strict Private

Các thành viên này chỉ có thể được truy cập từ các phương thức của chính lớp đó. Các lớp khác hoặc các lớp con trong cùng một đơn vị không thể truy cập chúng.

4

Protected

Điều này giống như private, ngoại trừ, các thành viên này có thể truy cập vào các kiểu con, ngay cả khi chúng được triển khai trong các mô-đun khác.

5

Published

Điều này tương tự như Public, nhưng trình biên dịch tạo ra thông tin kiểu cần thiết để tự động truyền trực tuyến các lớp này nếu trình biên dịch ở trạng thái {$ M +}. Các trường được xác định trong một phần đã xuất bản phải thuộc loại lớp.

Các hàm tạo và hủy cho các lớp Pascal

Hàm tạo là các phương thức đặc biệt, được gọi tự động bất cứ khi nào một đối tượng được tạo. Vì vậy, chúng tôi tận dụng tối đa hành vi này bằng cách khởi tạo nhiều thứ thông qua các hàm khởi tạo.

Pascal cung cấp một hàm đặc biệt gọi là create () để định nghĩa một hàm tạo. Bạn có thể truyền bao nhiêu đối số tùy thích vào hàm khởi tạo.

Ví dụ sau sẽ tạo một phương thức khởi tạo cho một lớp có tên Books và nó sẽ khởi tạo giá và tiêu đề cho sách tại thời điểm tạo đối tượng.

program classExample;

{$MODE OBJFPC} //directive to be used for creating classes
{$M+} //directive that allows class constructors and destructors
type
   Books = Class 
   private 
      title : String; 
      price: real;
   
   public
      constructor Create(t : String; p: real); //default constructor
      
      procedure setTitle(t : String); //sets title for a book
      function getTitle() : String; //retrieves title
      
      procedure setPrice(p : real); //sets price for a book
      function getPrice() : real; //retrieves price
      
      procedure Display(); // display details of a book
end;
var
   physics, chemistry, maths: Books;

//default constructor 
constructor Books.Create(t : String; p: real);
begin
   title := t;
   price := p;
end;

procedure Books.setTitle(t : String); //sets title for a book
begin
   title := t;
end;

function Books.getTitle() : String; //retrieves title
begin
   getTitle := title;
end;

procedure Books.setPrice(p : real); //sets price for a book
begin
   price := p;
end;

function Books.getPrice() : real; //retrieves price
begin
   getPrice:= price;
end;

procedure Books.Display();
begin
   writeln('Title: ', title);
   writeln('Price: ', price:5:2);
end;

begin 
   physics := Books.Create('Physics for High School', 10);
   chemistry := Books.Create('Advanced Chemistry', 15);
   maths := Books.Create('Algebra', 7);
   
   physics.Display;
   chemistry.Display;
   maths.Display;
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Title: Physics for High School
Price: 10
Title: Advanced Chemistry
Price: 15
Title: Algebra
Price: 7

Giống như hàm tạo ngầm định có tên là create, cũng có một phương thức hủy ngầm định sử dụng phương thức hủy mà bạn có thể giải phóng tất cả các tài nguyên được sử dụng trong lớp.

Di sản

Các định nghĩa lớp Pascal có thể thừa kế tùy chọn từ một định nghĩa lớp cha. Cú pháp như sau:

type
childClas-identifier = class(baseClass-identifier) 
< members >
end;

Ví dụ sau cung cấp một lớp tiểu thuyết, lớp này kế thừa lớp Sách và thêm nhiều chức năng hơn dựa trên yêu cầu.

program inheritanceExample;

{$MODE OBJFPC} //directive to be used for creating classes
{$M+} //directive that allows class constructors and destructors

type
   Books = Class 
   protected 
      title : String; 
      price: real;
   
   public
      constructor Create(t : String; p: real); //default constructor
      
      procedure setTitle(t : String); //sets title for a book
      function getTitle() : String; //retrieves title
      
      procedure setPrice(p : real); //sets price for a book
      function getPrice() : real; //retrieves price
      
      procedure Display(); virtual; // display details of a book
end;
(* Creating a derived class *)

type
   Novels = Class(Books)
   private
      author: String;
   
   public
      constructor Create(t: String); overload;
      constructor Create(a: String; t: String; p: real); overload;
      
      procedure setAuthor(a: String); // sets author for a book
      function getAuthor(): String; // retrieves author name
      
      procedure Display(); override;
end;
var
   n1, n2: Novels;

//default constructor 
constructor Books.Create(t : String; p: real);
begin
   title := t;
   price := p;
end;

procedure Books.setTitle(t : String); //sets title for a book
begin
   title := t;
end;

function Books.getTitle() : String; //retrieves title
begin
   getTitle := title;
end;

procedure Books.setPrice(p : real); //sets price for a book
begin
   price := p;
end;

function Books.getPrice() : real; //retrieves price
begin
   getPrice:= price;
end;

procedure Books.Display();
begin
   writeln('Title: ', title);
   writeln('Price: ', price);
end;

(* Now the derived class methods  *)
constructor Novels.Create(t: String);
begin
   inherited Create(t, 0.0);
   author:= ' ';
end;

constructor Novels.Create(a: String; t: String; p: real);
begin
   inherited Create(t, p);
   author:= a;
end;

procedure Novels.setAuthor(a : String); //sets author for a book
begin
   author := a;
end;

function Novels.getAuthor() : String; //retrieves author
begin
   getAuthor := author;
end;

procedure Novels.Display();
begin
   writeln('Title: ', title);
   writeln('Price: ', price:5:2);
   writeln('Author: ', author);
end;

begin 
   n1 := Novels.Create('Gone with the Wind');
   n2 := Novels.Create('Ayn Rand','Atlas Shrugged', 467.75);
   n1.setAuthor('Margaret Mitchell');
   n1.setPrice(375.99);
   n1.Display;
   n2.Display;
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Title: Gone with the Wind
Price: 375.99
Author: Margaret Mitchell
Title: Atlas Shrugged
Price: 467.75
Author: Ayn Rand

Cần lưu ý những điểm quan trọng sau:

  • Các thành viên của lớp Sách có protected hiển thị.

  • Lớp Novels có hai hàm tạo, vì vậy overload toán tử được sử dụng để nạp chồng hàm.

  • Thủ tục Books.Display đã được khai báo virtual, để cùng một phương thức từ lớp Novels có thể override nó.

  • Hàm tạo Novels.Create gọi hàm tạo lớp cơ sở bằng cách sử dụng inherited từ khóa.

Giao diện

Các giao diện được định nghĩa để cung cấp một tên chức năng chung cho người triển khai. Những người triển khai khác nhau có thể triển khai các giao diện đó theo yêu cầu của họ. Bạn có thể nói, giao diện là bộ xương, được thực hiện bởi các nhà phát triển. Sau đây là một ví dụ về giao diện -

type  
   Mail = Interface  
      Procedure SendMail;  
      Procedure GetMail;  
   end;  
   
   Report = Class(TInterfacedObject,  Mail)  
      Procedure SendMail;  
      Procedure GetMail;  
   end;

Xin lưu ý rằng, khi một lớp triển khai một giao diện, nó phải triển khai tất cả các phương thức của giao diện. Nếu một phương thức của một giao diện không được triển khai, thì trình biên dịch sẽ báo lỗi.

Các lớp trừu tượng

Một lớp trừu tượng là một lớp không thể được khởi tạo, chỉ được kế thừa. Một lớp trừu tượng được chỉ định bằng cách bao gồm từ trừu tượng ký hiệu trong định nghĩa lớp, như thế này:

type
   Shape = ABSTRACT CLASS (Root)
      Procedure draw; ABSTRACT;
      ...
   end;

Khi kế thừa từ một lớp trừu tượng, tất cả các phương thức được đánh dấu là trừu tượng trong khai báo lớp của cha phải được định nghĩa bởi con; Ngoài ra, các phương pháp này phải được xác định với cùng một khả năng hiển thị.

Từ khóa tĩnh

Khai báo các thành viên hoặc phương thức của lớp dưới dạng tĩnh làm cho chúng có thể truy cập được mà không cần khởi tạo lớp. Một thành viên được khai báo là tĩnh không thể được truy cập bằng một đối tượng lớp được khởi tạo (mặc dù một phương thức tĩnh có thể). Ví dụ sau minh họa khái niệm -

program StaticExample;
{$mode objfpc}
{$static on}
type
   myclass=class
      num : integer;static;
   end;
var
   n1, n2 : myclass;
begin
   n1:= myclass.create;
   n2:= myclass.create;
   n1.num := 12;
   writeln(n2.num);
   n2.num := 31;
   writeln(n1.num);
   writeln(myclass.num);
   myclass.num := myclass.num + 20;
   writeln(n1.num);
   writeln(n2.num);
end.

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

12
31
31
51
51

Bạn phải sử dụng chỉ thị {$ static on} để sử dụng các thành viên tĩnh.