帕斯卡 - 快速指南


帕斯卡 - 概述

Pascal 是一种通用高级语言,最初由 Niklaus Wirth 在 20 世纪 70 年代初开发。它是为了将编程作为一门系统学科进行教学并开发可靠且高效的程序而开发的。

Pascal 是基于 Algol 的语言,包含许多 Algol 结构。Algol 60 是 Pascal 的子集。Pascal 提供多种数据类型和编程结构。Pascal 程序很容易理解和维护。

由于多种原因,帕斯卡在教学和学术领域越来越受欢迎:

  • 简单易学。
  • 结构化语言。
  • 它产生透明、高效和可靠的程序。
  • 它可以在多种计算机平台上编译。

帕斯卡语言的特点

帕斯卡具有以下特点 -

  • Pascal 是一种强类型语言。
  • 它提供广泛的错误检查。
  • 它提供了多种数据类型,如数组、记录、文件和集。
  • 它提供了多种编程结构。
  • 它支持通过函数和过程进行结构化编程。
  • 它支持面向对象编程。

关于帕斯卡的事实

  • 帕斯卡语言以法国数学家、计算机开发先驱布莱斯·帕斯卡 (Blaise Pascal) 的名字命名。

  • Niklaus Wirth 于 1970 年完成了最初的 Pascal 编程语言的开发。

  • Pascal 基于 Algol 编程语言的块结构风格。

  • Pascal 被开发为一种适合将编程作为一门系统学科进行教学的语言,其实现既可靠又高效。

  • ISO 7185 帕斯卡标准最初于 1983 年发布。

  • Pascal 是 Apple Lisa 以及 Mac 早期用于开发的主要高级语言。

  • 1986 年,Apple Computer 发布了第一个 Object Pascal 实现,1993 年,Pascal 标准委员会发布了 Pascal 的面向对象扩展。

为什么要使用帕斯卡?

Pascal 允许程序员定义复杂的结构化数据类型并构建动态和递归数据结构,例如列表、树和图。Pascal 提供了诸如记录、枚举、子范围、带有关联指针和集合的动态分配变量等功能。

Pascal 允许任何深度级别的嵌套过程定义。这确实为学习编程作为基于基本概念的系统学科提供了一个良好的编程环境。

Pascal 最令人惊奇的实现包括 -

  • Skype
  • 总司令
  • 特克斯
  • Macromedia 着迷
  • 苹果丽莎
  • 各种电脑游戏
  • 嵌入式系统

Pascal - 环境设置

有多种 Pascal 编译器和解释器可供一般使用。其中包括 -

  • Turbo Pascal - 提供一个 IDE 和编译器,用于在 CP/M、CP/M-86、DOS、Windows 和 Macintosh 上运行 Pascal 程序。

  • Delphi - 提供用于运行 Object Pascal 的编译器,并为 32 位和 64 位 Windows 操作系统以及 32 位 Mac OS X 和 iOS 生成本机代码。Embarcadero 计划建立对 Linux 和 Android 操作系统的支持。

  • Free Pascal - 它是一个用于运行 Pascal 和 Object Pascal 程序的免费编译器。Free Pascal 编译器是 32 位和 64 位 Turbo Pascal 和 Delphi 兼容的 Pascal 编译器,适用于 Linux、Windows、OS/2、FreeBSD、Mac OS X、DOS 和其他几个平台。

  • Turbo51 - 它是用于 8051 系列微控制器的免费 Pascal 编译器,具有 Turbo Pascal 7 语法。

  • Oxygene - 它是适用于 .NET 和 Mono 平台的 Object Pascal 编译器。

  • GNU Pascal (GPC) - 它是一个 Pascal 编译器,由 GNU 编译器集合的前端组成。

我们将在这些教程中使用 Free Pascal。您可以从以下链接下载适合您的操作系统的 Free Pascal:下载 Free Pascal

在 Linux 上安装 Free Pascal

Free Pascal 的 Linux 发行版有三种形式 -

  • tar.gz版本,也可以作为单独的文件提供。

  • .rpm (红帽软件包管理器)版本。

  • .deb (Debian )版本。

.rpm版本的安装代码::

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

其中 XYZ 是 .rpm 文件的版本号,ARCH 是支持的体系结构之一(i386、x86_64 等)。

Debian 版本的安装代码(如 Ubuntu) -

dpkg -i fpc-XXX.deb

其中 XXX 是 .deb 文件的版本号。

详细信息请阅读:Free Pascal 安装指南

在 Mac 上安装 Free Pascal

如果您使用 Mac OS X,使用 Free Pascal 最简单的方法是从 Apple 网站下载 Xcode 开发环境并按照简单的安装说明进行操作。设置 Xcode 后,您将能够使用 Free Pascal 编译器。

在 Windows 上安装 Free Pascal

对于 Windows,您将下载 Windows 安装程序 setup.exe。这是一个常用的安装程序。您需要执行以下安装步骤 -

  • 选择一个目录。

  • 选择要安装的包的部分。

  • 您可以选择将 .pp 或 .pas 扩展名与 Free Pascal IDE 关联。

详细信息请阅读:Free Pascal 安装指南

文本编辑器

这将用于输入您的程序。少数编辑器的示例包括 Windows 记事本、操作系统编辑命令、Brief、Epsilon、EMACS 和 vim 或 vi。

文本编辑器的名称和版本可能因不同操作系统而异。例如,记事本将在 Windows 上使用,vim 或 vi 可以在 Windows 以及 Linux 或 UNIX 上使用。

您使用编辑器创建的文件称为源文件,包含程序源代码。Pascal 程序的源文件通常以扩展名.pas命名。

在开始编程之前,请确保您有一个文本编辑器,并且您有足够的经验来编写计算机程序、将其保存在文件中、编译并最终执行它。

Pascal - 程序结构

在我们学习 Pascal 编程语言的基本构建块之前,让我们看一下最基本的 Pascal 程序结构,以便我们可以将其作为后续章节的参考。

帕斯卡程序结构

Pascal 程序基本上由以下部分组成 -

  • 节目名称
  • 使用命令
  • 类型声明
  • 常量声明
  • 变量声明
  • 函数声明
  • 程序声明
  • 主程序块
  • 每个块内的语句和表达式
  • 评论

每个 pascal 程序通常都有严格按照该顺序的标题语句、声明和执行部分。以下格式显示了 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 }

帕斯卡你好世界示例

以下是一个简单的 Pascal 代码,它将打印“Hello, World!”字样。-

program HelloWorld;
uses crt;

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

这将产生以下结果 -

Hello, World!

让我们看看上面程序的各个部分 -

  • 程序第一行程序HelloWorld;表示程序的名称。

  • 程序第二行使用crt;是一个预处理器命令,它告诉编译器在进行实际编译之前包含 crt 单元。

  • begin 和 end 语句中包含的下一行是主程序块。Pascal 中的每个块都包含在开始语句和结束语句内。但是,表示主程序结束的 end 语句后面是句号 (.),而不是分号 (;)。

  • 主程序块的开始语句是程序开始执行的地方。

  • (*...*)内的行将 被编译器忽略,并已将其添加到程序中添加注释。

  • 语句writeln('Hello, World!'); 使用 Pascal 中可用的 writeln 函数,该函数会产生消息“Hello, World!” 要显示在屏幕上。

  • 语句readkey;允许显示暂停,直到用户按下某个键。它是 crt 装置的一部分。单位就像 Pascal 中的图书馆。

  • 最后一句话结束。结束你的程序。

编译并执行 Pascal 程序

  • 打开文本编辑器并添加上述代码。

  • 将文件另存为hello.pas

  • 打开命令提示符并转到保存文件的目录。

  • 在命令提示符下键入 fpc hello.pas 并按 Enter 编译代码。

  • 如果代码中没有错误,命令提示符将带您进入下一行,并生成hello可执行文件和hello.o目标文件。

  • 现在,在命令提示符下键入hello来执行您的程序。

  • 您将能够在屏幕上看到“Hello World”,并且程序将等待您按下任意键。

$ 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!

确保免费的 pascal 编译器fpc位于您的路径中,并且您正在包含源文件 hello.pas 的目录中运行它。

Pascal - 基本语法

您已经了解了 pascal 程序的基本结构,因此很容易理解 pascal 编程语言的其他基本构建块。

变量

变量定义放在以var关键字开头的块中,后面是变量的定义,如下所示:

var
A_Variable, B_Variable ... : Variable_Type;

Pascal 变量在函数的代码体之外声明,这意味着它们不是在begin和end对内声明,而是在过程/函数的定义之后和begin关键字之前声明。对于全局变量,它们在程序头之后定义。

功能/程序

在 Pascal 中,过程是要执行的一组指令,没有返回值,而函数是有返回值的过程。函数/过程的定义如下 -

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

评论

多行注释用大括号和星号括起来,如 (* ... *)。Pascal 允许将单行注释括在大括号 { ... } 中。

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

{ This is a single line comment in pascal }

区分大小写

Pascal 是一种不区分大小写的语言,这意味着您可以在任何一种情况下编写变量、函数和过程。与变量 A_Variable 一样,a_variable 和 A_VARIABLE 在 Pascal 中具有相同的含义。

帕斯卡陈述

Pascal 程序由语句组成。每条语句都指定了程序的一个明确的工作。这些工作可以是声明、赋值、读取数据、写入数据、进行逻辑决策、转移程序流程控制等。

例如 -

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

Pascal 中的保留字

Pascal 中的语句是用一些特定的 Pascal 字设计的,这些字称为保留字。例如,program、input、output、var、real、begin、readline、writeline 和 end 都是保留字。

以下是 Pascal 中可用的保留字列表。

和 大批 开始 案件 常量
分区 做 向下 别的 结尾
文件 为了 功能 去 如果
在 标签 模组 零 不是
的 或者 包装的 程序 程序
记录 重复 放 然后 到
类型 直到 变量 尽管 和

Pascal 中的字符集和标识符

帕斯卡字符集包括 -

  • 全部大写字母 (AZ)

  • 全部小写字母 (az)

  • 所有数字 (0-9)

  • 特殊符号 - + * / := , . ;. () [] = {} ` 空白

Pascal 程序中的实体(如变量和常量、类型、函数、过程和记录等)都有名称或标识符。标识符是由字母和数字组成的序列,以字母开头。标识符中不得使用特殊符号和空格。

Pascal - 数据类型

实体的数据类型指示与其相关的含义、约束、可能的值、操作、功能和存储模式。

整数、实数、布尔值和字符类型被称为标准数据类型。数据类型可以分为标量、指针和结构化数据类型。标量数据类型的示例有整数、实数、布尔值、字符、子范围和枚举。结构化数据类型由标量类型组成;例如,数组、记录、文件和集合。稍后我们将讨论指针数据类型。

帕斯卡数据类型

Pascal 数据类型可以总结如下图所示 -

帕斯卡数据类型

类型声明

类型声明用于声明标识符的数据类型。类型声明的语法是 -

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

例如,以下声明将变量 days 和age 定义为整数类型,yes 和 true 定义为布尔类型,name 和 city 定义为字符串类型,fees 和花销定义为实数类型。

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

整数类型

下表为您提供了有关标准整数类型及其存储大小和 Object Pascal 中使用的值范围的详细信息 -

类型 最低限度 最大限度 格式
整数 -2147483648 2147483647 有符号 32 位
红衣主教 0 4294967295 无符号 32 位
短整型 -128 127 有符号8位
斯莫林特 -32768 32767 有符号 16 位
朗格特 -2147483648 2147483647 有符号 32 位
整型64 -2^63 2^63 - 1 有符号 64 位
字节 0 255 无符号 8 位
单词 0 65535 无符号 16 位
长字 0 4294967295 无符号 32 位

常数

使用常量可以使程序更具可读性,并有助于将特殊数量保留在程序开头的一个位置。Pascal 允许数字、逻辑、字符串和字符常量。通过指定const声明,可以在程序的声明部分声明常量。

常量类型声明的语法如下 -

const
Identifier = contant_value;

以下是常量声明的一些示例 -

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

所有常量声明必须在变量声明之前给出。

枚举类型

枚举数据类型是用户定义的数据类型。它们允许在列表中指定值。枚举数据类型只允许使用赋值运算符和关系运算符。枚举数据类型可以声明如下 -

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

以下是枚举类型声明的一些示例 -

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

枚举类型的域中列出的项目的顺序定义了项目的顺序。例如,在枚举类型 SUMMER 中,April 位于 May 之前,May 位于 June 之前,依此类推。枚举类型标识符的域不能由数字或字符常量组成。

子范围类型

子范围类型允许变量采用特定范围内的值。例如,如果选民的年龄应在 18 至 100 岁之间,则名为 Age 的变量可以声明为 -

var
age: 18 ... 100;

我们将在下一节中详细了解变量声明。您还可以使用类型声明定义子范围类型。声明子范围类型的语法如下 -

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

以下是子范围类型声明的一些示例 -

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

子范围类型可以从已定义的枚举类型的子集创建,例如 -

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

Pascal - 变量类型

变量只不过是我们的程序可以操作的存储区域的名称。Pascal中的每个变量都有一个特定的类型,它决定了变量内存的大小和布局;该内存中可以存储的值的范围;以及可以应用于变量的操作集。

变量的名称可以由字母、数字和下划线字符组成。它必须以字母或下划线开头。Pascal不区分大小写,因此这里大写和小写字母的含义相同。基于上一章解释的基本类型,将有以下基本变量类型 -

Pascal 中的基本变量

先生编号 类型和描述
1

特点

通常是一个八位位组(一个字节)。这是一个整数类型。

2

整数

机器最自然的整数大小。

3

真实的

单精度浮点值。

4

布尔值

指定 true 或 false 逻辑值。这也是一个整数类型。

5

枚举

指定用户定义的列表。

6

亚范围

表示变量,其值位于某个范围内。

7

细绳

存储字符数组。

Pascal 编程语言还允许定义各种其他类型的变量,我们将在后续章节中介绍这些变量,例如指针、数组、记录、集合和文件等。在本章中,我们只研究基本变量类型。

Pascal 中的变量声明

所有变量在 Pascal 程序中使用之前都必须声明。所有变量声明后面都跟有var关键字。声明指定变量列表,后跟冒号 (:) 和类型。变量声明的语法是 -

var
variable_list : type;

这里,type 必须是有效的 Pascal 数据类型,包括字符、整数、实数、布尔值或任何用户定义的数据类型等,variable_list 可以由一个或多个以逗号分隔的标识符名称组成。这里显示了一些有效的变量声明 -

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

在前面的教程中,我们讨论了 Pascal 允许声明类型。类型可以通过名称或标识符来标识。该类型可用于定义该类型的变量。例如,

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

现在,如此定义的类型可以在变量声明中使用 -

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

请注意类型声明和var声明之间的区别。类型声明指示类型的类别或类,例如整数、实数等,而变量规范指示变量可以采用的值的类型。您可以将Pascal 中的类型声明与 C 中的typedef进行比较。最重要的是,变量名称指的是存储变量值的内存位置。类型声明并非如此。

Pascal 中的变量初始化

变量被分配一个带有冒号和等号的值,后跟一个常量表达式。赋值的一般形式是 -

variable_name := value;

默认情况下,Pascal 中的变量不初始化为零。它们可能包含垃圾值。因此,在程序中初始化变量是更好的做法。变量可以在其声明中初始化(分配初始值)。初始化后跟var关键字,初始化的语法如下 -

var
variable_name : type = value;

一些例子是 -

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

让我们看一个例子,它利用了迄今为止讨论的各种类型的变量 -

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.

当上面的代码被编译并执行时,它会产生以下结果 -

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

枚举变量

您已经了解了如何使用简单的变量类型,例如整数、实数和布尔值。现在,让我们看看枚举类型的变量,它可以定义为 -

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

声明枚举类型后,您可以声明该类型的变量。例如,

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

下面的例子说明了这个概念 -

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.

当上面的代码被编译并执行时,它会产生以下结果 -

Which drink do you want?
You can drink limejuice

子范围变量

子范围变量声明为 -

var
subrange-name : lowerlim ... uperlim;

子范围变量的例子是 -

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

以下程序说明了这个概念 -

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.

当上面的代码被编译并执行时,它会产生以下结果 -

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

帕斯卡 - 常数

常量是在程序执行期间保持不变的实体。Pascal 只允许声明以下类型的常量 -

  • 序数类型
  • 设置类型
  • 指针类型(但唯一允许的值为 Nil)。
  • 真实类型
  • 查尔
  • 细绳

声明常量

声明常量的语法如下 -

const
identifier = constant_value;

下表提供了一些有效常量声明的示例 -

实型常量

先生编号 常量类型和示例
1

Ordinal(Integer)类型常量

有效年龄=21;

2

设置类型常量

元音 = (A,E,I,O,U) 的集合;

3

指针类型常量

P = 无;

4

e = 2.7182818;

速度光= 3.0E+10;

5

字符类型常量

运算符='+';

6

字符串类型常量

总统 = '约翰尼·德普';

下面的例子说明了这个概念 -

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.

当上面的代码被编译并执行时,它会产生以下结果 -

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

观察程序输出语句中的格式。变量 c 的格式为总位数 7 和小数点后 2 位。Pascal 允许使用数值变量进行此类输出格式化。

帕斯卡 - 运算符

运算符是告诉编译器执行特定数学或逻辑操作的符号。Pascal 允许以下类型的运算符 -

  • 算术运算符
  • 关系运算符
  • 布尔运算符
  • 位运算符
  • 集合运算符
  • 字符串运算符

让我们一一讨论算术运算符、关系运算符、布尔运算符和位运算符。稍后我们将讨论集合运算符和字符串运算。

算术运算符

下表显示了 Pascal 支持的所有算术运算符。假设变量A为 10,变量B为 20,则 -

显示示例

操作员 描述 例子
+ 添加两个操作数 A + B 将为 30
- 从第一个操作数中减去第二个操作数 A - B 将给出 -10
* 将两个操作数相乘 A * B 将给出 200
/ 分子除以分母 B/A 将给出 2
% 模数运算符和整数除法后的余数 B % A 将给出 0

关系运算符

下表显示了 Pascal 支持的所有关系运算符。假设变量A为 10,变量B为 20,则 -

显示示例

操作员 描述 例子
= 检查两个操作数的值是否相等,如果相等,则条件成立。 (A = B) 不正确。
<> 检查两个操作数的值是否相等,如果值不相等,则条件为真。 (A <> B) 为真。
> 检查左操作数的值是否大于右操作数的值,如果是,则条件为真。 (A > B) 不正确。
< 检查左操作数的值是否小于右操作数的值,如果是,则条件为真。 (A < B) 为真。
>= 检查左操作数的值是否大于或等于右操作数的值,如果是,则条件为真。 (A >= B) 不正确。
<= 检查左操作数的值是否小于或等于右操作数的值,如果是,则条件为真。 (A <= B) 为真。

布尔运算符

下表列出了 Pascal 语言支持的所有布尔运算符。所有这些运算符都处理布尔操作数并产生布尔结果。假设变量A为 true,变量B为 false,则 -

显示示例

操作员 描述 例子
和 称为布尔 AND 运算符。如果两个操作数都为 true,则条件为 true。 (A 和 B)是错误的。
进而 它类似于 AND 运算符,但是,它保证编译器计算逻辑表达式的顺序。从左到右,仅在必要时才计算右操作数。 (A,然后 B)是错误的。
或者 称为布尔或运算符。如果两个操作数中的任何一个为真,则条件为真。 (A 或 B)为真。
要不然 它类似于布尔 OR,但是它保证编译器计算逻辑表达式的顺序。从左到右,仅在必要时才计算右操作数。 (A 或 B)为真。
不是 称为布尔非运算符。用于反转其操作数的逻辑状态。如果条件为真,则逻辑 NOT 运算符会将其设为假。 不是(A 和 B)为真。

位运算符

位运算符作用于位并执行逐位运算。所有这些运算符都处理整数操作数并产生整数结果。按位与 (&)、按位或 (|) 和按位非 (~) 的真值表如下 -

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

假设A = 60;B=13;现在以二进制格式,它们将如下 -

A = 0011 1100

B = 0000 1101

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

A&B = 0000 1100

A^B = 0011 0001

〜A = 1100 0011

Pascal 支持的位运算符如下表所示。假设变量 A 为 60,变量 B 为 13,则:

显示示例

操作员 描述 例子
& 如果两个操作数中都存在,则二进制 AND 运算符会将一位复制到结果中。 (A & B) 将给出 12,即 0000 1100
| 如果任一操作数中存在该位,则二元或运算符会复制该位。 (A | B) 将给出 61,即 0011 1101
! 如果任一操作数中存在该位,则二元或运算符会复制该位。与 | 相同 操作员。 (A ! B) 将给出 61,即 0011 1101
〜 二进制补码运算符是一元的,具有“翻转”位的效果。 (~A ) 将给出 -61,由于是有符号二进制数,因此为 2 的补码形式的 1100 0011。
<< 二进制左移运算符。左操作数的值向左移动右操作数指定的位数。 A << 2 将给出 240,即 1111 0000
>> 二进制右移运算符。左操作数的值向右移动右操作数指定的位数。 A >> 2 将得到 15,即 0000 1111

请注意,Pascal 的不同实现在按位运算符方面有所不同。然而,我们在这里使用的编译器 Free Pascal 支持以下按位运算符 -

运营商 运营
不是 按位非
和 按位与
或者 按位或
异或 按位异或
谢尔 按位左移
什尔 按位右移
<< 按位左移
>> 按位右移

Pascal 中的运算符优先级

运算符优先级决定表达式中术语的分组。这会影响表达式的计算方式。某些运算符的优先级高于其他运算符;例如,乘法运算符的优先级高于加法运算符。

例如x = 7 + 3 * 2;此处,x 被分配为 13,而不是 20,因为运算符 * 的优先级高于 +,因此它首先乘以 3*2,然后添加到 7。

在这里,优先级最高的运算符出现在表的顶部,优先级最低的运算符出现在底部。在表达式中,将首先计算优先级较高的运算符。

显示示例

操作员 优先级
〜,不, 最高
*、/、div、mod 和、&
|、!、+、-、或、
=、<>、<、<=、>、>=、中
否则,然后 最低

帕斯卡 - 决策

决策结构要求程序员指定一个或多个要由程序评估或测试的条件,以及如果确定条件为真则要执行的一个或多个语句,以及可选地如果条件确定则要执行的其他语句确定为假。

以下是大多数编程语言中典型决策结构的一般形式 -

Pascal 中的决策语句

Pascal 编程语言提供以下类型的决策语句。单击以下链接查看其详细信息。

先生编号 声明及说明
1 if-then 语句

if - then 语句由一个布尔表达式后跟一个或多个语句组成。

2 If-then-else 语句

if - then 语句后面可以跟一个可选的else 语句,该语句在布尔表达式为 false 时执行。

3 嵌套 if 语句

您可以在另一个if或else if语句中使用一个if或else if语句。

4 案例陈述

case语句允许测试变量是否与值列表相等。

5 case - else 语句

它类似于if-then-else语句。这里,case 语句后面有一个else项。

6 嵌套 case 语句

您可以在另一个case语句中使用一个case语句。

帕斯卡 - 循环

可能存在一种情况,当您需要多次执行一段代码时。一般来说,语句是按顺序执行的:首先执行函数中的第一个语句,然后执行第二个语句,依此类推。

编程语言提供了各种控制结构,允许更复杂的执行路径。

循环语句允许我们多次执行一条语句或一组语句,以下是大多数编程语言中循环语句的一般形式 -

循环架构

Pascal 编程语言提供以下类型的循环结构来处理循环要求。单击以下链接查看其详细信息。

先生编号 循环类型和描述
1 while-do 循环

当给定条件为真时,重复一个语句或一组语句。它在执行循环体之前测试条件。

2 for-do 循环

多次执行一系列语句并缩写管理循环变量的代码。

3 重复直到循环

与 while 语句类似,只不过它测试循环体末尾的条件。

4 嵌套循环

您可以在任何另一个 while、for 或 Repeat Until 循环中使用一个或多个循环。

循环控制语句

循环控制语句改变其正常顺序的执行。当执行离开作用域时,在该作用域中创建的所有自动对象都将被销毁。

Pascal 支持以下控制语句。单击以下链接查看其详细信息。

先生编号 控制语句和描述
1 中断语句

终止循环或case语句并将执行转移到紧跟在循环或 case 语句后面的语句。

2 继续声明

导致循环跳过其主体的其余部分并在重复之前立即重新测试其条件。

3 转到语句

将控制转移到带标签的语句。尽管不建议在程序中使用 goto 语句。

帕斯卡 - 函数

子程序

子程序是执行特定任务的程序单元/模块。这些子程序组合起来形成更大的程序。这基本上称为“模块化设计”。子程序可以被子程序/程序调用,称为调用程序。

Pascal 提供两种子程序 -

  • 函数- 这些子程序返回单个值。

  • 过程- 这些子程序不直接返回值。

功能

函数是一组共同执行任务的语句。每个 Pascal 程序都至少有一个函数,即程序本身,所有最琐碎的程序都可以定义附加函数。

函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。

Pascal 标准库提供了许多您的程序可以调用的内置函数。例如,函数AppendStr()附加两个字符串,函数New()动态分配内存给变量和更多函数。

定义函数

在 Pascal 中,函数是使用 function 关键字定义的。函数定义的一般形式如下 -

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

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

Pascal 中的函数定义由函数头、局部声明和函数体组成。函数头由关键字 function 和函数的名称组成。这是函数的所有部分 -

  • 参数- 参数建立调用程序和函数标识符之间的链接,也称为形式参数。参数就像一个占位符。当调用函数时,您将一个值传递给参数。该值称为实际参数或参数。参数列表是指函数参数的类型、顺序和数量。此类形式参数的使用是可选的。这些参数可以具有标准数据类型、用户定义的数据类型或子范围数据类型。

    函数语句中出现的形式参数列表可以是简单变量或下标变量、数组或结构化变量、或子程序。

  • 返回类型- 所有函数都必须返回一个值,因此所有函数都必须分配一个类型。函数类型是函数返回值的数据类型。它可以是标准的、用户定义的标量或子范围类型,但不能是结构化类型。

  • 局部声明- 局部声明是指标签、常量、变量、函数和过程的声明,仅适用于函数体。

  • 函数体- 函数体包含定义函数功能的语句集合。它应始终包含在保留字 begin 和 end 之间。它是完成所有计算的函数的一部分。必须有一个类型的赋值语句 - name := expression; 在函数体中为函数名称赋值。该值在函数执行时返回。正文中的最后一个语句必须是结束语句。

以下示例展示了如何在 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;

函数声明

函数声明告诉编译器函数名称以及如何调用该函数。函数的实际主体可以单独定义。

函数声明包含以下部分 -

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

对于上面定义的函数 max(),以下是函数声明 -

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

当您在一个源文件中定义函数并在另一文件中调用该函数时,需要进行函数声明。在这种情况下,您应该在调用该函数的文件顶部声明该函数。

调用函数

创建函数时,您需要定义该函数必须执行的操作。要使用函数,您必须调用该函数来执行定义的任务。当程序调用函数时,程序控制权将转移到被调用的函数。被调用函数执行定义的任务,当执行其返回语句或到达最后一个结束语句时,它将程序控制权返回给主程序。

要调用函数,您只需传递所需的参数和函数名称,如果函数有返回值,则可以存储返回值。下面是一个简单的例子来展示用法 -

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.

当上面的代码被编译并执行时,它会产生以下结果 -

Max value is : 200 

帕斯卡 - 程序

过程是子程序,它们不返回单个值,而是允许获取一组结果。

定义程序

在 Pascal 中,过程是使用procedure关键字定义的。过程定义的一般形式如下 -

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

Pascal 中的过程定义由标头、局部声明和过程主体组成。过程标头由关键字procedure和给定过程的名称组成。以下是程序的所有部分 -

  • 参数- 参数建立调用程序和过程标识符之间的链接,也称为形式参数。过程中的参数规则与函数中的参数规则相同。

  • 局部声明- 局部声明是指标签、常量、变量、函数和过程的声明,仅适用于过程主体。

  • 过程主体- 过程主体包含定义过程功能的语句集合。它应始终包含在保留字 begin 和 end 之间。它是完成所有计算的过程的一部分。

以下是名为findMin()的过程的源代码。此过程采用 4 个参数 x、y、z 和 m,并将前三个变量中的最小值存储在名为 m 的变量中。变量 m 通过引用传递(我们稍后将讨论通过引用传递参数) -

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 }  

程序声明

过程声明告诉编译器过程名称以及如何调用该过程。过程的实际主体可以单独定义。

过程声明具有以下语法 -

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

请注意,过程的名称不与任何类型相关联。对于上面定义的过程findMin(),以下是声明 -

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

调用过程

创建过程时,您需要定义该过程必须执行的操作。要使用该过程,您必须调用该过程来执行定义的任务。当程序调用过程时,程序控制权将转移到被调用的过程。被调用过程执行定义的任务,当到达其最后一个结束语句时,它将控制权返回给调用程序。

要调用过程,您只需传递所需的参数以及过程名称,如下所示 -

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.

当上面的代码被编译并执行时,它会产生以下结果 -

Enter three numbers:
89 45 67
Minimum: 45

递归子程序

我们已经看到,一个程序或子程序可能会调用另一个子程序。当子程序调用自身时,称为递归调用,该过程称为递归。

为了说明这个概念,让我们计算一个数字的阶乘。数字 n 的阶乘定义为 -

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

以下程序通过递归调用自身来计算给定数字的阶乘。

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.

当上面的代码被编译并执行时,它会产生以下结果 -

Enter a number:
5
Factorial 5 is: 120

以下是另一个示例,它使用递归函数生成给定数字的斐波那契数列-

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.

当上面的代码被编译并执行时,它会产生以下结果 -

0 1 1 2	3 5 8 13 21 34

子程序的参数

如果子程序(函数或过程)要使用参数,则它必须声明接受参数值的变量。这些变量称为子程序的形式参数。

形式参数的Behave与子程序内的其他局部变量类似,在进入子程序时创建并在退出时销毁。

调用子程序时,有两种方法可以将参数传递给子程序 -

先生编号 呼叫类型和描述
1 按值调用

该方法将参数的实际值复制到子程序的形式参数中。在这种情况下,对子程序内的参数进行的更改不会对参数产生影响。

2 通过参考调用

此方法将参数的地址复制到形式参数中。在子程序内部,该地址用于访问调用中使用的实际参数。这意味着对参数所做的更改会影响参数。

默认情况下,Pascal 使用按值调用来传递参数。一般来说,这意味着子程序中的代码不能更改用于调用子程序的参数。我们在“Pascal - 函数”一章中使用的示例程序使用call by value调用名为 max() 的函数。

然而,此处提供的示例程序 ( exProcedure ) 使用引用调用来调用过程 findMin() 。

Pascal - 变量作用域

任何编程中的作用域都是程序的一个区域,其中已定义的变量可以存在,超出该区域则无法访问该变量。在 Pascal 编程语言中可以在三个地方声明变量 -

  • 在子程序或块中称为局部变量

  • 在所有子程序之外称为全局变量

  • 子程序中参数的定义称为形式参数

让我们解释一下什么是局部变量、全局变量以及形式参数。

局部变量

在子程序或块内声明的变量称为局部变量。它们只能由该子程序或代码块内的语句使用。局部变量对其自身之外的子程序来说是未知的。以下是使用局部变量的示例。这里,所有变量a、b和c都是名为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.

当上面的代码被编译并执行时,它会产生以下结果 -

value of a = 10 b = 20 c = 30

现在,让我们进一步扩展该程序,创建一个名为 display 的过程,它将有自己的一组变量a、b和c并直接从程序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.

当上面的代码被编译并执行时,它会产生以下结果 -

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

全局变量

全局变量在函数外部定义,通常在程序顶部。全局变量将在程序的整个生命周期中保持其值,并且可以在为程序定义的任何函数内访问它们。

全局变量可以被任何函数访问。也就是说,全局变量在声明后即可在整个程序中使用。以下是使用全局变量和局部变量的示例-

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 =  ',