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

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.mzph.cn/pingmian/35415.shtml

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

相关文章

基于Java+MySQL停车场车位管理系统详细设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

vrrp与mstp

简单实验步骤

Aiseesoft Screen Recorder v2解锁版安装教程 (屏幕录像工具)

前言 Aiseesoft Screen Recorder 是一个易于使用的屏幕捕捉工具&#xff0c;可以在您的计算机上录制任何视频或音频并以高质量保存它们。这款功能强大的视频屏幕录制应用程序可以帮助您在 Windows 11/10/8/7 上抓取在线电影和广播、捕捉游戏、制作视频教程、录制网络摄像头视频…

java类的加载 ,类加载器以及双亲委派机制详细介绍

1_类的加载 路径 类的加载过程类的加载时机 类的加载 当程序在运行后&#xff0c;第一次使用某个类的时候&#xff0c;会将此类的class文件读取到内存&#xff0c;并将此类的所有信息存储到一个Class对象中 说明&#xff1a;Class对象是指java.lang.Class类的对象&#xff0c…

【2024最新版】图解Mysql数据库配置、命令行及Workbench访问(Windows版本)

目录 1. 准备工作1.1 安装MySQL1.2 验证MySQL的环境变量 2. 环境变量配置3. 访问MySQL3.1 命令行访问MySQL3.2 Workbench访问MySQL 1. 准备工作 1.1 安装MySQL 如果您已经安装了MySQL&#xff0c;请从【2. Mysql 环境配置】开始&#xff1b;如果您没有安装MySQL&#xff0c;请…

【MySQL】数据库的索引机制

文章目录 前言1. 索引是什么2. 索引的优缺点2.1 优点2.2 缺点 3. 索引的操作3.1 创建索引3.2 查看索引3.3 删除索引 4. 索引的存储原理4.1 B树4.2 B树 结语 前言 在数据库中&#xff0c;我们经常使用到的操作就是查询&#xff0c;当数据量小的时候&#xff0c;查询的速度很快&…

COMSOL - 一个点光源是否总能照亮整个房间?

20 世纪 50 年代&#xff0c;数学家恩斯特施特劳斯&#xff08;Ernst Straus&#xff09;提出了一个有趣的问题&#xff1a;在一个侧壁由理想反射镜构成的任意形状的空房间里&#xff0c;一个点光源是否总能照亮整个房间&#xff1f;诺贝尔奖获得者罗杰彭罗斯&#xff08;Roger…

1S013485认证:企业腾飞的引擎

在全球化的今天&#xff0c;企业要想在激烈的市场竞争中立于不败之地&#xff0c;必须不断提升自身的综合实力。1S013485认证正是帮助企业实现这一目标的重要工具。获得这项认证&#xff0c;企业不仅能在市场竞争中占据优势&#xff0c;还能在多个层面实现质的飞跃&#xff0c;…

mac m芯片下安装nacos

背景&#xff1a;最近再研究 下载地址&#xff1a; https://nacos.io/download/nacos-server/ 解压zip包 unzip nacos-server-2.3.2.zip启动 进入到bin目录下 ./startup.sh -m standalone访问可视化界面 账号密码都是nacos&#xff0c;进行登录即可&#xff0c;nacos的端口为…

还在为职场烦恼?六西格玛黑带培训来帮忙!

为什么现在越来越多的学员都直奔六西格玛黑带培训呢&#xff1f;别急&#xff0c;张驰咨询这就来给你们揭秘&#xff01; 首先&#xff0c;六西格玛这个名头可不是盖的&#xff01;它就像是企业管理的“超级英雄”&#xff0c;专门解决各种流程中的“小怪兽”——也就是那些影…

Hadoop3:MapReduce中的Shuffle机制

一、流程图 Shuffle是Map方法之后&#xff0c;Reduce方法之前的数据处理过程称。 二、图解说明 1、数据流向 map方法中context.write(outK, outV);开始&#xff0c;写入环形缓冲区&#xff0c;再进行分区排序&#xff0c;写到磁盘 reduce方法拉取磁盘上的数据&#xff0c;…

Appium+python自动化(二十五)- 那些让人抓耳挠腮、揪头发和掉头发的事 - 获取控件ID(超详解)

简介 在前边的第二十二篇文章里&#xff0c;已经分享了通过获取控件的坐标点来获取点击事件的所需要的点击位置&#xff0c;那么还有没有其他方法来获取控件点击事件所需要的点击位置呢&#xff1f;答案是&#xff1a;Yes&#xff01;因为在不同的大小屏幕的手机上获取控件的坐…

[SAP ABAP] 汇总内表数据

在加入新数据记录时&#xff0c;将非数值字段具有相同内容记录的数值字段汇总 语法格式 COLLECT <wa> INTO <itab>. <wa>&#xff1a;代表工作区 <itab>&#xff1a;代表内表 示例1 结果显示&#xff1a;

多维度mysql性能优化手段实践

数据库优化维度有四个:硬件升级、系统配置、表结构设计、SQL语句及索引。 优化选择: 优化成本:硬件升级>系统配置>表结构设计>SQL语句及索引。 优化效果:硬件升级<系统配置<表结构设计<SQL语句及索引。 系统配置优化 保证从内存中读取数据 MySQL会在内…

【云原生】深入理解Pod的使用进行管理

深入理解Pod 文章目录 深入理解Pod一、介绍Pod1.1、什么是Pod1.2、Pod的特点1.3、Pod的用途1.4、Pod网络1.5、Pod存储1.6、Pod的工作方式 二、创建Pod2.1、命令行创建Pod2.2、资源清单创建Pod2.2.1、镜像拉取策略2.2.2、Pod重启策略2.2.3、部署资源2.2.4、删除资源 三、静态Pod…

Go语言之集合类型

个人网站&#xff1a; http://hardyfish.top/ 免费书籍分享&#xff1a; 资料链接&#xff1a;https://url81.ctfile.com/d/57345181-61545511-81795b?p3899 访问密码&#xff1a;3899 免费专栏分享&#xff1a; 资料链接&#xff1a;https://url81.ctfile.com/d/57345181-6…

浏览器扩展V3开发系列之 chrome.storage 的用法和案例

【作者主页】&#xff1a;小鱼神1024 【擅长领域】&#xff1a;JS逆向、小程序逆向、AST还原、验证码突防、Python开发、浏览器插件开发、React前端开发、NestJS后端开发等等 chrome.storage 是用于存储、获取用户数据的 API。当我们需要持久化存储数据时&#xff0c;比如&…

目标检测系列(四)-利用pyqt5实现yolov8目标检测GUI界面

1、pyqt5安装 Qt Designer&#xff1a;一个用于创建图形用户界面的工具&#xff0c;可轻松构建复杂的用户界面。它基于MVC架构&#xff0c;可以将界面设计与逻辑分离&#xff0c;使得开发更为便捷。在Qt Designer中&#xff0c;可以通过拖拽控件来灵活地调整界面&#xff0c;并…

11. Java线程的状态详解

1. 前言 本节内容主要是对多线程的 6 种状态进行详细讲解&#xff0c;具体内容点如下&#xff1a; 抛开语言&#xff0c;谈操作系统的线程的生命周期及线程 5 种状态&#xff0c;这是我们学习 Java 多线程 6 种状态的基础&#xff1b;掌握 Java 的线程生命周期及 6 种线程状态…

电脑没声音是什么原因?一篇文章帮你解决疑惑

在使用电脑时&#xff0c;声音是至关重要的一部分&#xff0c;无论是播放音乐、观看视频还是进行视频会议。然而&#xff0c;有时候电脑可能会出现没声音的情况&#xff0c;这让人感到非常困扰。那么电脑没声音是什么原因呢&#xff1f;本文将详细介绍解决电脑没声音问题的三种…