pascal语言基础(三)

article/2025/10/3 14:08:23

该内容为学习 《PASCAL程序设计 第2版》郑启华编著  的笔记,部分与c语言对比学习,方便记忆。

pascal语言基础(一)

pascal语言基础(二)

 

集合类型

定义

TYPE<集合类型标识符> = set of <基类型>;
VAR<集合类型变量表>: <集合类型标识符>;

基类型必须是有序类型(整型子界、字符型、布尔型、枚举型等),例:

TYPEdigit = set of 1..9;
VARod, even: digit;
BEGINod := [1, 3, 5, 7, 9];even := [2, 4, 6, 8];

 

运算

在处理集合前,一般需要赋予初值(常为空集或全集):

od := [];        {空集}
od := [1..9];    {全集}

1. 并交差(要求2集合类型相容)

{并,+}
[1, 3, 4] + [1, 2, 4] --> [1, 2, 3, 4]
['a', 'c', 'f'] + ['b', 'c', 'd', 'f'] --> ['a', 'b', 'c', 'd', 'f']{交,*}
[1, 3, 4] * [1, 2, 4] --> [4]
['a', 'b'] * ['c', 'd'] --> []{差,-}
[1, 3, 4] - [1, 2, 4] --> [3]
['a', 'b', 'c'] - ['a', 'c', 'b'] --> []

集合中顺序不重要。

2. 关系运算(=、<>、<=、>=)

关系运算的结果为布尔型:

{=和<>用来检查2个集合是否包含同样的元素}
[1, 3] = [3, 1] --> true
[1, 3] <> [1, 3] --> false{<=用来决定子集关系}
[1, 3] <= [1, 2, 3, 4] --> true
[] <= [1, 3] --> true{>=用来决定包集关系}
[1, 3] >= [1, 3] --> true
[2, 4] >= [1, 2] --> false

另有新运算 IN ,用于决定一个特定的元素是否在集合中:

1 in [1, 2, 3] --> true
1 in [3,2 4] --> false

以下2种写法等价:

(ch>='0') and (ch<='9')
ch in ['0'..'9']

3. 输入和输出

集合变量不能直接输入输出,输入通常为:将集合置为空集,然后逐个读入集合的每个元素值,将构成的单指集合依次+进原集合变量;输出通常为:用IN依次检查该集合基类型中的每一个元素是否在该集合中,若在则依次输出对应元素。

例:输入一串字符,以'?'结束,组成元音字母集合s1,辅音字母集合s2,然后输出两集合元素以及元素个数。

PROGRAM sets (input, output);VARs1, s2: set of 'a'..'z';n1, n2: integer;ch: char;BEGINs1 := [];s2 := [];n1 := 0;n2 := 0;read(ch);write(ch);while ch<>'?' do{判断输入的ch是元音还是辅音,加入对应的集合}BEGINif ch in ['a'..'z']then if ch in ['a', 'e', 'i', 'o', 'u']then s1 := s1+[ch]else s2 := s2+[ch];read(ch);write(ch); END;writeln;{输出}for ch:='a'to'z' doif ch in s1then BEGINwrite(ch);n1 := n1+1;END;writeln;writeln('n1=', n1);for ch:='a'to'z' doif ch in s2then BEGINwrite(ch);n2 := n2+1;END;writeln;writeln('n2=', n2);END.

可能的输入输出:

sdgdgdffdsvsdgda?
sdgdgdffdsvsdgda?
a
n1=1
dfgsv
n2=5

 

类型间的关系

关系:同一、 相容、赋值相容。

符合如下任一条则说明两个变量属于该关系:

同一(对称)相容(对称)赋值相容(不对称,e对v赋值相容,v:=e)

1. 使用同样的类型标识符说明

2. 类型标识符不同,但已被形如t1=t2的说明定义为等价

3. 在同一变量说明语句中使用

1. 它们是同一的非结构变量

2. 它们是同一类型的子界,或一个是另一个的子界

3. 它们是有相容的基类型的集合类型

4. 它们是具有同一长度的串类型

5. 整型和实型之间

1. e和v是类型同一的非文件类型

2. v是实型,e是整型或整型的子界

3. e和v是相容的简单类型,且e的值是v所允许的值

4. e和v是相容的集合类型,且e的每一个值都是v所允许的值

5. e和v是相容的串类型

 

三者之间不存在蕴含关系,关系图如下:


 

记录类型

记录是2个或多个有关数据项的汇集,一个记录的每个分量可以具有不同的类型,类似于c语言中的结构体。

定义

TYPE<记录类型标识符> = RECORD<域标识符表>: <类型>;...<域标识符表>: <类型>END;

域标识符表可以是一个标识符或多个标识符,在多个标识符的情况下,每个标识符之间用 ','(逗号) 隔开。

年月日的记录如下:

TYPE mont = (jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec);date = RECORDmonth: mont;day: 1..31;year: integerEND;
VARday1, day2: date;

 

WITH语句(开域语句)

一般形式:

with <记录变量名表> do<语句>

语句可以是单条语句,或是用BEGIN..END括起来的多条语句。

对记录的赋值:

{原始的赋值方法}
day1.month := mar;
day1.day := 3;
day1.year := 2020;
day2 := day1;{使用with语句后}
with day1 doBEGINmonth := mar;day := 3;year := 2020;END;

 

记录数组

类似于c语言的结构体数组,一个数组的分量是记录类型称为记录数组(记录数组首先是个数组,数组的分量是记录)。

例:输入全班学生的姓名和成绩,按照某一标准给学生成绩评定等级,最后输出各位学生的姓名、成绩、等级。

思路:定义一个记录类型student,它的域包括姓名name,成绩score,等级grade。其中name是一个字符串(由紧缩型数组定义),score是实型,grade是字符型。然后再定义一个记录数组类型studenta,它的分量类型为student,存储班上所有学生的信息。

CONSTn = 30;  {班级学生人数}
TYPEalfa = packed array[1..15]of char   {姓名的字符串}student = RECORDname: alfa;score: real;grade: char;END;studenta = array[1..n]of student;
VARstudents: studenta;

给记录数组赋值时:

with students[i] doBEGINname := 'li hong        ';  {共15位}score := 93.5;grade := 'A';END;

 

层次记录

记录的域为记录类型,则为记录的嵌套,也就是层次记录。类比多维数组,记录的嵌套也可以是多重的。

例:职员的记录类型,包括编号,姓名,生日,家庭地址。

TYPEalfa = packed array[1.15]of char;date = RECORDyear: integer;month: 1..12;day: 1..31;END;address = RECORDcity: alfa;street: alfa;streetnum: integer;END;employee = RECORDnum: integer;name: alfa;birth: date;home: address;END;
VARprogrammer: employee;

其中生日和家庭地址的类型是记录,给该层次记录赋值可写为:

programmer.num := 1;
programmer.birth.year := 1998;
programmer.home.city := 'changsha       ';

可使用with语句简写:

with programmer, birth, home doBEGINnum := 1;year := 1998;city := 'changsha        ';END;

需注意在with..do之间的顺序问题,首先programmer必须在第一位。如果birth和home不是并列关系,那么顺序需层次渐进。

在上例中birth和home是并列的,如果这2条记录中没有同名的域名,那么顺序无所谓;如果有同名域名,为了不引发问题,需分开写:

with programmer, birth doBEGINnum := 1;year := 1998;with home doBEGINcity := 'changsha        ';END;END;

 

记录变体

1. 一般形式:

TYPE<记录类型标识符> = RECORD{固定部分}<域标识符表>: <类型>;...{变体部分}case <标志域>: <类型> of<常量表>: (<域表>);...END;
  • 固定部分和变体部分出现的域名不能相同
  • 如果常量表中没有对应的域,此时域表为空,用一个()空括号对表示
  • <域表>内也可以有变体部分,变体部分必须在对应的固定部分之后
  • case..of 可以不需要end作为结束

2.  例:接上个例子,职员的记录类型为编号、姓名、生日、婚姻状况。

其中,婚姻状况为,已婚、离异、单身。对于已婚的职员,需附加配偶姓名和孩子个数;对于离异的职员,需附加离婚日期;对于单身的职员,需附加是否单独住。

TYPEalfa = packed array[1..15]of char;date = RECORDyear: integer;month: 1..12;day: 1..31;END;marristat = (married, divorced, single);employee = RECORD{固定部分}num: integer;name: alfa;birth: date;{变体部分}case ms:marristat ofmarried: (spousename: alfa;child: integer);divorced: (divorcedate: date);single: (livesalone: boolean); END;

其中,marristat为枚举类型,ms是类型为marristat的特殊域,称为标志域。当ms取值为married时,会附加定义2个域spousename和child,另2个分支不会被定义,因此此时programmer.spousename和programmer.child可以被引用,而programmer.livealone不存在。

在定义变体部分时,下面2句等价:

case ms:marristat ofms: marristat;
case marristat of

3. 读记录

VARmarry, live: char;
BEGIN{读固定部分}with employee, birth doreadln(num, name, year, month, day);{读变体部分}with employee doBEGIN{读标志域值}read(marry);if marry='m'then ms:=marriedelse if marry='d'then ms:=divorcedelse ms:=single;{根据标志域值读附加域值}CASE ms OFmarried: readln(child, spousename);divored: with divorcedate doreadln(year, month, day);single: BEGINreadln(live);livesalone := (live='t');END;END;{end case}END;{end with}
END.

首先键盘输入职员编号、姓名、生日的年月日,然后输入一个字母m,d,s代表该职员的婚姻状况。如果输入的是m,则接着输入孩子个数和配偶姓名;如果输入的是d,则接着输入离婚的年月日;如果输入的是s,则接着输入t或者f,t代表单独住f代表不是。


http://chatgpt.dhexx.cn/article/GDvIf31q.shtml

相关文章

pascal语言基础(二)

该内容为学习 《PASCAL程序设计 第2版》郑启华编著 的笔记&#xff0c;部分与c语言对比学习&#xff0c;方便记忆。 pascal语言基础&#xff08;一&#xff09; 函数与过程程序设计 函数 1. 定义&#xff1a; FUNCTION <函数名>(<参数表>):<函数类型>;&…

pascal语言基础(一)

该内容为学习 《PASCAL程序设计 第2版》郑启华编著 的笔记&#xff0c;部分与c语言对比学习&#xff0c;方便记忆。 pascal语言基础&#xff08;二&#xff09; 基本介绍 保留字&#xff08;35个&#xff09; AND、ARRAY、BEGIN、CASE、CONST、DIV、DO、DOWNTO、ELSE、END、…

PASCAL语言的基本知识

Pascal是一种计算机通用的高级程序设计语言。它由瑞士Niklaus Wirth教授于六十年代末设计并创立。 以法国数学家命名的Pascal语言。现已成为使用最广泛的基于DOS的语言之一。其主要特点有&#xff1a;严格的结构化形式&#xff1b;丰富完备的数据类型&#xff1b;运行效率高&am…

C语言assert()函数用法总结

&#xfeff;&#xfeff; assert宏的原型定义在<assert.h>中&#xff0c;其作用是如果它的条件返回错误&#xff0c;则终止程序执行&#xff0c;原型定义&#xff1a; #include <assert.h> void assert( int expression ); assert的作用是现计算表达式 expression…

C语言assert函数完全攻略

断言assert函数&#xff0c;C语言assert函数完全攻略 对于断言&#xff0c;相信大家都不陌生&#xff0c;大多数编程语言也都有断言这一特性。简单地讲&#xff0c;断言就是对某种假设条件进行检查。在 C 语言中&#xff0c;断言被定义为宏的形式&#xff08;assert(expressio…

python assert函数解析(最清晰的解释)

欢迎关注WX公众号&#xff1a;【程序员管小亮】 python assert的作用&#xff1a; assert函数用于程序调试 Python 官方文档解释https://docs.python.org/3/reference/simple_stmts.html#assert “Assert statements are a convenient way to insert debugging assertions …

C++中的assert用法

assert用法 void assert(int expression);C中assert&#xff0c;即断言&#xff0c;可以在程序调试阶段检查错误&#xff0c;常用的就比如函数传参时&#xff0c;若是整型&#xff0c;是否超出范围&#xff1b;若是字符串型&#xff0c;地址是否为空等。 在正常时&#xff0c;…

assert()函数(断言函数)

assert()函数&#xff08;断言函数&#xff09; 一&#xff0c;快速了解一下assert函数 void assert (int expression);//括号里面是一个表达式。assert函数是一个宏。 括号里面的表达式如果为真&#xff0c;程序正常执行。 如果函数形式的宏的参数表达式比较等于零&#x…

c语言中assert函数是什么

点击上方蓝字关注我&#xff0c;了解更多咨询 1、assert将通过检查表达式expresion的值来决定是否需要终止执行程序。 2、如果表达式expresion的值是假的(即0)&#xff0c;它将首先向标准错误流stderr打印错误信息。 通过调用abort函数终止程序运行。否则&#xff0c;assert没有…

assert()函数

今天&#xff0c;遇到一个函数返回值时引用&#xff0c;但是返回值存在为NULL的情况。下面是搜到的解决方案 然后&#xff0c;就搜了搜assert()函数的用法&#xff0c;找到一篇&#xff0c;贴在下面assert()函数用法总结 assert宏的原型定义在<assert.h>中&#xff0c;其…

assert()函数用法总结

assert宏的原型定义在<assert.h>中&#xff0c;其作用是如果它的条件返回错误&#xff0c;则终止程序执行&#xff0c;原型定义&#xff1a; #include <assert.h> void assert( int expression ); assert的作用是现计算表达式 expression &#xff0c;如果其值为假…

assert断言函数简介

目录 &#x1f38d;1.整体介绍 &#x1f38d;2.assert() 的用法和机制 &#x1f38d;3.关于NDEBUG 宏 &#x1f38d;4.使用assert()注意事项 &#x1f38d;4.1使用 assert() 时&#xff0c;被检测的表达式最好不要太复杂 &#x1f38d;4.2不要用会改变环境的语句作为断言…

第十二章 C语言调试_assert断言函数

在我们的实际开发过程之中&#xff0c;常常会出现一些隐藏得很深的BUG&#xff0c;或者是一些概率性发生的BUG&#xff0c;通常这些BUG在我们调试的过程中不会出现很明显的问题&#xff0c;但是如果我们将其发布&#xff0c;在用户的各种运行环境下&#xff0c;这些程序可能就会…

c语言之assert()函数用法总结

1.assert宏的原型定义在<assert.h>中&#xff0c;其作用是如果它的条件返回错误&#xff0c;则终止程序执行。 库函数&#xff1a; assert.h 原型定义&#xff1a; void assert( int expression ); assert的作用是现计算表达式 expression &#xff0c;如果其值为假&…

接私活必备!国外5个顶级程序员接私活网站

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 人生交契无老少&#xff0c;论交何必先同调。 文章目录 PeoplePerHour&#xff1a;薪酬最高的专业自由职业者网站GuruFreeLancerUpworkFiverr 话说程序员这个职业有…

关于网上程序员接私活的问题

点击上方“程序人生”&#xff0c;选择“置顶公众号” 第一时间关注程序猿&#xff08;媛&#xff09;身边的故事 文丨eachfeel 很多人都谈网上接私活这件事&#xff0c;其实大家想法都差不多&#xff0c;现在做软件的那么多&#xff0c;工资也不是那么高了&#xff0c;不像以前…

程序员兼职可以从什么平台接私活?

之前有一项调查&#xff0c;结果显示&#xff1a;想通过副业赚钱的朋友&#xff0c;其中60%的人找不到门路。今天这篇文章就给大家一批可以接私活的平台。不过&#xff0c;再次强调一下&#xff0c;副业并不等于接私活儿。 私活类型与价格区间 程序员兼职的项目大致可分为三类…

10个程序员可以接私活的平台和一些建议!

来源&#xff1a;http://mrw.so/5isQLi 什么样的私活不能接 1、没有第三方担保的个人对个人的尽量不要接&#xff0c;双方都没保障&#xff0c;出了问题很大的可能撕破脸皮不了了之。 2、一上来就直接说给我开发一个什么软件&#xff0c;不说具体需求&#xff0c;没有需求文档的…

程序员接私活常用平台汇总

作者&#xff1a;镇上宝塔 素材来源&#xff1a;今日头条 今天分享一些接私活的常用平台。 ▍前 言 关于程序员接私活&#xff0c;社会各界说法不一。按照作者的观点来说如果你确实急用钱&#xff0c;价格又合适&#xff0c;那就去做。如果不怎么缺钱&#xff0c;那就接私活之前…

程序员接私活的几个平台和建议,避免掉坑!

大家对于程序员接私活这件事的看法&#xff0c;褒贬不一。但是你如果确实用钱&#xff0c;价格又合适&#xff0c;那就大胆去接。 如果不那么缺钱&#xff0c;那么接私活之前先考虑清楚&#xff0c;如果自己将空余时间用在接私活所产生的价值是不是大于提升自己。如果是的话&a…