Free Pascal语言基础学习:定义变量、数据类型、循环语句、case语句、条件判断、with语句、运算符

news2024/7/7 15:42:05

Pascal是一种结构化编程语言,而Free Pascal作为其现代编译器,不仅支持跨多种操作系统和处理器架构,还提供了高效的内存使用和函数重载等先进功能。Free Pascal继承了Pascal语言的核心特性,同时进行了扩展和优化,使其成为教育、学术和多领域应用开发的理想工具,展示了Pascal语言的持久影响力和Free Pascal的现代化改进。

定义变量

在Free Pascal中,变量的声明可以有多种形式,每种形式都有其特定的用途和含义,需要注意的是汇编名称必须唯一,不能声明或导出两个具有相同汇编名称的变量。特别是,不要尝试导出以FPC_开头的公共名称的变量,因为这是编译器用于某些内部系统例程的名称:

var  
  // 定义并初始化整数变量  
  myInteger: integer = 10;  
  // 定义并初始化实型变量  
  myReal: real = 3.14;  
  // 定义并初始化布尔型变量  
  myBoolean: boolean = true;  
  // 定义并初始化字符型变量  
  myChar: char = 'A';  
  // 定义并初始化字符串型变量  
  myString: string = 'Hello, World!';  
  
begin  
  writeln('Integer: ', myInteger);  
  writeln('Real: ', myReal);  
  writeln('Boolean: ', myBoolean);  
  writeln('Char: ', myChar);  
  writeln('String: ', myString);  
end.

数据类型

在Free Pascal中,数据类型主要分为基本类型、字符类型、结构化类型、指针类型、过程类型、泛型类型和专用类型:

  1. 基本类型

    • 序数类型:包括整数类型(如integerlongintshortintbyte等)、布尔类型(boolean)以及枚举类型(enumeration)。这些类型都是可计数的、有序的。
    • 实数类型:Free Pascal支持IEEE浮点类型,主要使用的是real类型,它可以根据处理器的能力表示为singledouble精度。
  2. 字符类型

    • char:表示单个字符,通常占用一个字节。
    • string:表示字符串,即字符的序列。
  3. 结构化类型:这些类型允许用户定义更复杂的数据结构,如记录(record)、集合(set)等。

  4. 指针类型:指针类型用于存储内存地址,指向其他类型的数据。

  5. 过程类型:表示指向过程或函数的指针,可用于回调或动态调用。

  6. 泛型类型专用类型:这些类型提供了更高级的类型构造能力,允许用户定义可重用和灵活的数据结构。

此外,Free Pascal还支持类型别名(type alias),允许用户为现有类型定义新的名称。

 以下是常用类型的使用实例:

{ 文件名是: hello.pas }
Const  
  e = 2.7182818; { 实数类型常量。}  
  a = 2; { 序数(整数)类型常量。}  
  c = '4'; { 字符类型常量。}  
  s = '这是一个常量字符串'; { 字符串类型常量。}  
  sc = chr(32);  
  
Var  
  ls: Longint;  
  P: Pointer;  
  Ss: set of 0..10; { 假设集合的范围是 0 到 10 }  
  i: Integer; { 声明循环计数器变量 }  
  
begin  
  ls := SizeOf(Longint);  
  P := nil;  
  Ss := [1, 2];  
  
  writeln('浮点数:', e);  
  writeln('整数:', a);  
  writeln('字符:', c);  
  writeln('字符串:', s);  
  writeln('空格字符:', sc);  
  writeln('Longint类型大小:', ls);  
  
  { 打印指针是否为nil或者其指向的内存地址 }  
  if P = nil then  
    writeln('指针P是nil')  
  else  
    writeln('指针P不是nil');  
  
  { 遍历集合元素并打印 }  
  writeln('集合Ss的元素:');  
  for i := 0 to 10 do  
    if i in Ss then  
      writeln(i);  
end.

编译Pascal文件 

fpc hello.pas

 运行编译好的可运行文件

./hello

循环语句

for...to...do循环

在Free Pascal中,For循环是一种非常常用的控制结构,它允许我们重复执行一段代码直到满足某个条件。For循环使用一个控制变量,该变量在循环开始时被初始化,并在每次循环迭代后递增或递减,直到达到一个终止条件。

var  
  i: Integer;  
begin  
  for i := 1 to 10 do  
  begin  
    WriteLn('当前数值是: ', i);  
  end;  
end.

while...do循环
var  
  i: Integer;  
begin  
  i := 1;  
  while i <= 10 do  
  begin  
    WriteLn('当前数值是: ', i);  
    i := i + 1;  
  end;  
end.
 repeat...until循环

在 Free Pascal 中,repeat...until 语句用于创建一个循环,该循环会一直执行,直到指定的表达式结果为真。由于表达式的评估是在语句执行之后进行的,因此循环体内的语句至少会执行一次,请注意,布尔表达式会默认进行短路评估,这意味着一旦结果确定,评估就会停止。

var  
  i: Integer;  
begin  
  i := 1;  
  repeat  
    WriteLn('当前数值是: ', i);  
    i := i + 1;  
  until i > 10;  
end.

 case语句

在 Pascal 语言中,case 语句用于根据表达式的值来选择执行不同的代码块。case 语句中的表达式和常量必须在编译时是已知的,它们可以是枚举类型、序数类型(包括字符)或字符串类型。所有的 case 常量必须是同一类型。

编译器会评估 case 表达式。如果表达式的值与某个 case 常量匹配,那么会执行该常量后面的语句。执行完毕后,程序会继续执行 case 语句块之后的代码。

如果没有任何 case 常量与表达式的值匹配,那么会执行 else 或 otherwise 关键字后面的语句列表。这个列表可以为空。如果没有 else 部分,且没有 case 常量与表达式的值匹配,程序会在 case 语句块之后继续执行。

在 Free Pascal 中,与 Turbo Pascal 不同的是,不允许重复的 case 标签。此外,Free Pascal 还允许使用字符串作为 case 标签,此时 case 变量也必须是字符串类型,并且字符串比较是区分大小写的。

program Case;  
  
var  
  C: char;  
  Number: integer;  
  OS: string;  
  
begin  
  // 使用字符作为 case 标签  
  C := 'c';  
  case C of  
    'a': WriteLn('A pressed');  
    'b': WriteLn('B pressed');  
    'c': WriteLn('C pressed');  
  else  
    WriteLn('Unknown letter pressed: ', C);  
  end;  
  
  // 使用多个字符和 else 语句  
  C := 'd';  
  case C of  
    'a', 'e', 'i', 'o', 'u': WriteLn('Vowel pressed');  
    'y': WriteLn('This one depends on the language');  
  else  
    WriteLn('Consonant pressed');  
  end;  
  
  // 使用数字范围和 else 语句包含多个指令  
  Number := 105;  
  case Number of  
    1..10: WriteLn('Small number');  
    11..100: WriteLn('Normal, medium number');  
  else  
    WriteLn('HUGE number');  
    WriteLn('How did we get this much?');  
  end;  
  
  // 使用字符串作为 case 标签  
  OS := 'Linux';  
  case lowercase(OS) of  
    'windows', 'dos': WriteLn('Microsoft platform');  
    'macos', 'darwin': WriteLn('Apple platform');  
    'linux', 'freebsd', 'netbsd': WriteLn('Community platform');  
  else  
    WriteLn('Other platform');  
  end;  
end.

运行效果:

 if...than...else条件判断语句

在Free Pascal中,if...then...else语句用于根据条件执行不同的代码块。ifthen关键字之间的表达式必须返回布尔值(即真或假)。如果表达式的结果为True,则执行then关键字后面的语句。如果表达式的结果为False,则执行else关键字后面的语句(如果存在)。

请注意以下几点:

  1. 布尔表达式默认会进行短路评估,这意味着评估将在结果确定时停止。
  2. else关键字之前,不允许使用分号(;),但所有的语句都可以是复合语句。
  3. 在嵌套的if...then...else结构中,可能会出现歧义,即哪个else语句与哪个if语句配对。规则是,else关键字与第一个尚未与else配对的if关键字匹配(向后搜索)。

为了避免歧义,当需要嵌套if...then...else语句时,最好使用beginend关键字来明确界定代码块。

var  
  score: Integer;  
  evaluation: string;  
begin  
  Write('请输入学生的分数: ');  
  ReadLn(score);  
  
  if score >= 90 then  
    evaluation := '优秀'  
  else if score >= 80 then  
    evaluation := '良好'  
  else if score >= 70 then  
    evaluation := '中等'  
  else if score >= 60 then  
    evaluation := '及格'  
  else  
    evaluation := '不及格';  
  
  WriteLn('学生的评价是: ', evaluation);  
  ReadLn; // 等待用户输入,防止程序立即退出  
end.

运行结果: 

with语句简化字段和方法的访问

在Free Pascal中,with语句允许我们更方便地访问记录(record)、对象或类的字段和方法。使用with语句时,编译器会检查其中的变量引用或方法引用是否是该记录、对象或类的字段或方法。如果是,则直接访问该字段或调用该方法

Type  
  Passenger = Record  
    Name: String[30];  
    Flight: String[10];  
  end;  
  
Var  
  TheCustomer: Passenger;  
begin  
  // 初始化乘客信息  
  TheCustomer.Name := 'Unknown';  
  TheCustomer.Flight := 'XXXX';  
  
  // 使用with语句更新乘客信息  
  With TheCustomer do  
  begin  
    Name := 'GGBond';  
    Flight := 'PS901';  
  end;  
  
  // 输出更新后的乘客信息  
  WriteLn('Passenger Name: ', TheCustomer.Name);  
  WriteLn('Flight Number: ', TheCustomer.Flight);  
    
  ReadLn; // 防止程序立即退出  
end.

运算符 

算数运算符
运算符操作
+加法
-减法
*乘法
**幂运算
/除法
Div整除
Mod取余

赋值运算符 :=

赋值运算符定义将一种类型的变量赋值到另一种变量的操作。这 结果类型必须与赋值语句左侧的变量类型匹配,即单个 赋值运算符的参数必须与右侧的表达式类型相同 赋值运算符,此系统可用于声明新类型,并为该类型定义赋值。

在Free Pascal中,赋值运算符(:=)不仅用于基本的变量赋值,还可以重载以支持自定义类型的赋值操作。通过重载赋值运算符,我们可以定义如何将一个类型的值赋给另一个类型的变量。这种特性在处理复杂数据类型,如记录(record)或自定义类时特别有用。

type  
  Complex = record  
    re, im: real;  
  end;  
  
// 重载赋值运算符,以支持将实数赋给复数  
operator := (r: real) z: Complex;  
begin  
  z.re := r;  
  z.im := 0.0;  
end;  
  
var  
  R: real;  
  C: Complex;  
begin  
  R := 3.14;  
  C := R; // 这里使用了重载的赋值运算符  
  writeln('复数 C 的实部: ', C.re, ' 虚部: ', C.im);  
  readln;  
end.

逻辑运算符 
运算符操作
not按位求反(一元)
and按位与
or按位或
xor按位异或
shl向左按位移位
shr向右按位移位
<<向左按位移位(与shl相同)
>>按位向右移位(与shr相同)
集合运算符 
运算符操作
+并集
-差集
*交集
><对称差集
<=包含
>=左侧集合是右侧集合的超集
include在集合中包含一个元素
exclude从集合中排除一个元素
in检查一个元素是否在集合中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1886345.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

操作系统真象还原:编写硬盘驱动程序

第13章-编写硬盘驱动程序 这是一个网站有所有小节的代码实现&#xff0c;同时也包含了Bochs等文件 13.1 硬盘及分区表 13.1.1 创建从盘及获取安装的磁盘数 要实现文件系统&#xff0c;必须先有个磁盘介质&#xff0c;虽然咱们己经有个虚拟磁盘 hd60M.img&#xff0c;但它只…

理解MySQL存储引擎:掌握数据存储与管理

在工作或学习过程中&#xff0c;作为一名数据库管理员或开发者&#xff0c;我们常常需处理大量数据&#xff0c;同时确保数据的可靠性与高效性。MySQL作为最受欢迎的开源数据库之一&#xff0c;其强大的性能和灵活性广为人知。而在MySQL背后的存储引擎则起到了至关重要的作用。…

深度学习项目GPU开发环境安装

注安装环境&#xff1a;ubuntu22.04, cuda 11.7, cudnn8.9 1.安装nvidia驱动 看可安装的Nvidia驱动版本&#xff1a;执行 ubuntu-drivers devices 安装合适版本的Nvidia驱动&#xff1a; sudo apt-get install nvidia-driver-515 注意&#xff1a;合适的版本需要尝试&#x…

【区块链+基础设施】银联云区块链服务 | FISCO BCOS应用案例

为了顺应区块链基础设施化的发展趋势&#xff0c;中国银联推出了银联云区块链服务——UPBaaS&#xff0c;为金融行业采用区块链 技术提出了解决方案&#xff0c;微众银行为平台提供 FISCO BCOS 区块链开源技术支持。通过银联云区块链服务&#xff0c;用户可 以用可视化的方式创…

ERROR: No matching distribution found for torch==2.0.1+cu117(比手动下载方便)

ERROR: No matching distribution found for torch2.0.1cu117 遇见这种报错可以把pip install -r requirements.txt修改为 pip install -r requirements.tx --extra-index-url https://download.pytorch.org/whl/cu117 -i https://pypi.tuna.tsinghua.edu.cn/simple或者直接…

ROS2仿真工具-gazebo

gazebo独立于ROS2&#xff0c;就像插件一样&#xff0c;需要安装。 1.安装 sudo apt install gazebo sudo apt install ros-humble-gazebo-* 2.运行测试demo gazebo /opt/ros/humble/share/gazebo_plugins/worlds/gazebo_ros_diff_drive_demo.world 查看所有话题 ros2 top…

vue3开发过程中遇到的一些问题记录

问题&#xff1a; vue3在使用 defineProps、defineEmits、defineExpose 时不需要import&#xff0c;但是 eslint会报错error defineProps is not defined no-undef 解决方法&#xff1a; 安装 vue-eslint-parser 插件&#xff0c;在 .eslintrc.js 文件中添加配置 parser: vue-e…

交叉编译tslib库和上机测试

目录 一、tslib 介绍 二、tslib 框架分析 三、交叉编译、测试 tslib 1.安装工具链 tslib &#xff08;1&#xff09;设置交叉编译工具链 &#xff08;2&#xff09;进入tslib目录 &#xff08;3&#xff09;安装工具链 &#xff08;4&#xff09;确定工具链中头文件、库…

高考志愿填报,AI搜索商业化的第一个金矿?

文&#xff1a;互联网江湖 作者&#xff1a;志刚 前几天高考放榜&#xff0c;很多朋友都在忙着给孩子或者亲戚家孩子报志愿&#xff0c;高考志愿咨询也火得一塌糊涂&#xff0c;张雪峰的志愿咨询产品也卖出了天价。 今年高考前夕&#xff0c;网红张雪峰旗下的“峰学蔚来”APP…

用Vue3和Plotly.js打造一个3D图在线展示

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 三维网格图的绘制 应用场景 三维网格图广泛应用于科学可视化、医学成像、工程设计等领域&#xff0c;用于展示复杂的数据结构和空间分布。 基本功能 本代码使用 Plotly.js 库创建了一个交互式三维网格图&am…

IDEA 好用的插件,必备的插件

1. GitToolBox 菜单栏显示git分支信息 2.MyBatisx 快速定位找到sql的xml文件 3.RestfulToolkit-fix 快速定位接口的插件 默认快捷键: CtrlAltN 4.EasyCamelQSM 字符串转驼峰 默认快捷键: Ctrl Alt Q 5.Maven Helper 检查maven冲突&#xff0c;图形化展示maven依赖的插…

非静压模型SWASH学习(8)——三维孤立波在锥形岛屿上的爬坡过程(Runup of solitary waves on a conical island)

三维孤立波在锥形岛屿上的爬坡过程&#xff08;Runup of solitary waves on a conical island&#xff09; 算例简介模型配置网格及参数设置网格与地形初始条件与边界条件数值求解方法输出设置模拟时间 波浪&#xff08;孤立波&#xff09;入射边界的时间序列.bnd文件模拟结果注…

调试支付分回调下载平台证书

之前的原生代码放到webman里面&#xff0c;死活跑不通 没办法&#xff0c;只能用esayWeChat6.7 &#xff08;自行下载&#xff09; 它里面配置要用到平台证书 平台证书又要用到 composer require wechatpay/wechatpay 但是请求接口之前&#xff0c;你先要用到一个临时的平台…

[Python学习篇] Python函数

定义函数 语法&#xff1a;使用关键字 def def 函数名(参数): 代码1 代码2 ...... 调用函数 语法&#xff1a; 函数名(参数) 注意&#xff1a;不同的需求&#xff0c;参数可有可无。在Python中&#xff0c;函数必须先定义后使用 示例&#xff1a; # 定义函数 d…

边缘计算网关在现代工业企业中的作用-天拓四方

随着工业4.0时代的到来&#xff0c;数字化转型已经成为工业企业发展的必然趋势。在这一过程中&#xff0c;边缘计算网关以其独特的优势&#xff0c;正逐渐成为工业企业实现智能化、高效化运营的关键技术。 边缘计算网关是一种部署在网络边缘的设备&#xff0c;它集成了计算、存…

每日一题——Python实现PAT乙级1100 校庆(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码结构和逻辑 时间复杂度分析 空间复杂度分析 总结 我要更强 方法一…

RK3568驱动指南|第十五篇 I2C-第181章使用GPIO模拟I2C驱动

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

一个能让渲染性能提高100倍的办法

GPU 光线追踪是当今的热门话题&#xff0c;所以让我们来谈谈它&#xff01;今天我们将光线追踪一个单个球体。 使用片段着色器。 是的&#xff0c;我知道。并不特别花哨。你可以在 Shadertoy 上搜索并获得数百个示例(https://www.shadertoy.com/results?querysphere)。甚至已…

速通RK3568开发板多网口网线直连测试

开源鸿蒙硬件方案领跑者 触觉智能 本文适用于在EVB3568开发板上进行多网口网线直连。触觉智能的EVB3568主板基于瑞芯微RK3568处理器&#xff0c;采用22nm先进工艺制程&#xff0c;四核A55 CPU&#xff0c;主频高达2.0GHz&#xff0c;支持高达8GB高速LPDDR4&#xff0c;1T算力N…

Linux miniconda 安装tensorflow-gpu遇到找不到GPU问题

背景&#xff1a; Linux Miniconda python3.9 安装步骤 1、 pip install tensorflow-gpu2.8.0 -i https://pypi.tuna.tsinghua.edu.cn/simple 2、报错如下&#xff1a; 更换镜像源&#xff0c;单独安装 pip install tf-estimator-nightly2.8.0.dev2021122109 -i https:/…