【5.高级数据类型】3.集合

3.集合

Pascal语言是少数几种将集合作为内部数据类型的程序设计语言之一。

集合与数学中的集合相似,是指具有相同性质的对象的全体。组成集合的每个对象称为集合的元素。集合的特性:

  1. 集合中的元素是互异的,也就是说相同的元素视为一个元素(互异性)

  2. 集合中的元素是无序的,即{1,2,3,4,5}和{5,4,3,2,1}是同一个集合(无序性)

  3. 集合中元素的个数不能超过256个

  4. 元素和集合的关系是“属于”或“不属于”

3.1集合类型的定义

定义格式:

type
    <类型名称> = set of <基类型>;

说明:

  1. 基类型是集合中的元素的类型,可以是字符型、布尔型、枚举类型和子界等顺序类型,不能是整型、实型和其他类型。

  2. 若基类型是枚举或子界类型,则必须先定义基类型,再定义集合类型。

如:

type
    week = (sun, mon, tue, wed, thu, fri, sat);
    age = 0..99;
    CharSet = set of char;
    WeekSet = set of weel;
    AgeSet = set of age;
    TenSet = set of 1..10;
    LetterSet = set of 'A'..'z';

集合在内部以位的形式存储其元素,所以在运行速度上和内存利用上更高效。集合如果少于32个元素,会直接存储在CPU的寄存器中,效率会更高。

3.2集合类型变量的声明

集合类型变量的声明与其他类型变量的声明完全相同。

如:

var
    w1, w2: WeekSet;

也可以不经过类型定义,直接声明集合类型的变量:

var
    n1, n2: set of (sun, mon, tue, wed, thu, fri, sat);
    a1, a2: set of 0..99;

3.3集合变量的取值

集合变量的取值称为集合值,形式如下:

[<元素1>, <元素2>, ..., <元素n>]

如果集合的基类型有n个元素,则该集合的取值有2的n次幂个,其中包含一个空集合([])。

3.4集合类型的运算

已知两个相同基类型的集合S1和S2,其元素x,则集合运算法则如下:

1.算术运算

运算表达式运算结果满足交换律
S1+S2两个集合中所有不重复的元素组成的新集合
S1*S2两个集合中所共有的元素组成的新集合
S1-S2所有属于S1但不属于S2的元素的集合

2.逻辑运算

运算表达式运算结果满足交换律
相等S1 = S2如果S1和S2所包含的元素完全相同,则为真
不等S1 <> S2如果S1和S2所包含的元素不完全相同,则为真
包含S1 >= S2如果S2中的每个元素都在S1中,则为真
被包含S1 <= S2如果S1中的每个元素都在S2中,则为真
属于x in S1如果元素x被包含在S1中,则为真

集合运算的优先级:

优先级运算符操作数结果
*集合集合
+、-集合集合
=、<>、>=、<=集合逻辑
最低in左操作数是元素,右操作数是集合逻辑

示例:利用集合实现输入成绩,输出评定等级。界面如下图:

 

代码如下:

procedure TForm1.Button1Click(Sender: TObject);
type
  TScore = 0..10;
  Grade = set of TScore;
var
  Bjg, Jg, Zhong, Liang, You: Grade;
  Score: Real;
  ScoreDiv10: Integer;
begin
  // 评定按钮单击事件
  Bjg := [0, 1, 2, 3, 4, 5];
  Jg := [6];
  Zhong := [7];
  Liang := [8];
  You := [9, 10];
​
  Score := StrToFloat(Edit1.Text);
  ScoreDiv10 := Trunc(Score / 10);
​
  if ScoreDiv10 in Bjg then Label2.Caption := '不及格';
  if ScoreDiv10 in Jg then Label2.Caption := '及格';
  if ScoreDiv10 in Zhong then Label2.Caption := '中';
  if ScoreDiv10 in Liang then Label2.Caption := '良好';
  if ScoreDiv10 in You then Label2.Caption := '优秀';
end;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Janeb1018

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值