seo优化网站教程,logo设计网站知乎,网站木马 代码,公司网站设计的费用该内容为学习 《PASCAL程序设计 第2版》郑启华编著 的笔记#xff0c;部分与c语言对比学习#xff0c;方便记忆。
pascal语言基础#xff08;一#xff09;
pascal语言基础#xff08;二#xff09; 集合类型
定义
TYPE集合类型标识符 set of 基类型部分与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种写法等价
(ch0) and (ch9)
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:atoz doif ch in s1then BEGINwrite(ch);n1 : n11;END;writeln;writeln(n1, n1);for ch:atoz doif ch in s2then BEGINwrite(ch);n2 : n21;END;writeln;writeln(n2, n2);END.
可能的输入输出
sdgdgdffdsvsdgda?
sdgdgdffdsvsdgda?
a
n11
dfgsv
n25 类型间的关系
关系同一、 相容、赋值相容。
符合如下任一条则说明两个变量属于该关系
同一对称相容对称赋值相容不对称e对v赋值相容v:e 1. 使用同样的类型标识符说明 2. 类型标识符不同但已被形如t1t2的说明定义为等价 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 marrymthen ms:marriedelse if marrydthen ms:divorcedelse ms:single;{根据标志域值读附加域值}CASE ms OFmarried: readln(child, spousename);divored: with divorcedate doreadln(year, month, day);single: BEGINreadln(live);livesalone : (livet);END;END;{end case}END;{end with}
END.
首先键盘输入职员编号、姓名、生日的年月日然后输入一个字母m,d,s代表该职员的婚姻状况。如果输入的是m则接着输入孩子个数和配偶姓名如果输入的是d则接着输入离婚的年月日如果输入的是s则接着输入t或者ft代表单独住f代表不是。