集合定义 赋值 运算 特殊操作注意事项..

概念:

delphi中的集合是对数学中集合概念的简单实现。要求是集合中的元素必须同类型,且必须是序数类型,且集合中可能的元素个数不能大于255。

集合是P a s c a l特有的数据类型,在Visual Basic、C或C + +都没有(虽然C++ Builder提供了一种模板类称为集合,它模仿P a s c a l集合的行为)。

集合是由具有某些共同特征的元素构成的一个整体。在pascal中,一个集合是由具有同一有序类型的一组数据元素所组成,这一有序类型称为该集合的基类型。

类型的定义和变量的说明

定义: type 集合类型名 = set of 基类型

基类型可以是任意顺序类型, 而不能是实型或其它构造类型。同时,基类型的数据的序号不得超过255。例如下列说明是合法的:
type

    numbers =set of 0..9; {基类型为子界SubRange}
    ch=set of char;  {基类型为Char有序类型}
    day=(sun,mon,tue,wed,thu,fri,sat);  {定义一个枚举,方便后面集合使用}      
var

   s: numbers;

   c: ch;

weekday: day;

可以将类型说明与变量说明合并在一起,如:
  var

    s: set of 0..9;                               { 子界型 }

    c: set of char;           {  Char  } 
         weekday: (sun,mon,tue,wed,thu,fri,sat);      { 枚举型 } 
注意:集合的元素个数不超过256个,因此 var s: set of integer; 是错误的,因为Integer的取值范围远远超出了256.

集合的值 

1、集合的值放在一对方括号中,中间各元素之间用逗号隔开。如:[1,2,5] 和 [‘a‘,‘e‘,‘i‘] 都是集合。 
2、在集合中可以没有任何元素,这样的集合称为空集。[] 空集
3、在集合中,如果元素的值是连续的,则可用子界型的表示方法表示。例如:[1,2,3,4,5, 10,15] 可以表示成: [1..5,10,15]
4、集合的值与方括号内元素出现的次序无关。例如[1,5,8 ]和[5,1,8]的值相等。
5、在集合中同一元素的重复出现对集合的值没有影响。例如,[1,8,5,1,8]与[1,5,8]的值相等。
6、每个元素可用基类型所允许的表达式来表示。如 [1,1+2,4]、[succ(ch)]。

集合的运算

集合类型变量不能进行算术运算,集合是无序的,不能使用ord、pred、succ等函数。
  1、赋值运算
  只能通过赋值语句给集合变量赋值,不能通过读语句赋值,也不能通过写语句直接输出集合变量的值。如: 
集合变量赋值:     c:=[‘2‘];  i:=[5];  w:=[];
    集合变量赋子界值: c:=[‘a‘..‘z‘];  i:=[1..7];
    集合变量赋枚举值: c:=[‘a‘,‘b‘,‘d‘,‘m‘];  i:=[2,4,6,8,10];  
  2、集合的并、交、差运算
  可以对集合进行并(+)、交(*)、差 (-)三种运算,每种运算只有一个运算符、两个运算对象,运算结果仍为集合。注意它们与算术运算的区别。 
①     并运算 (关系代数运算符∪) 
A,B为两个集合,由集合A中的元素加上集合B中的与A不重复的所有元素组成的集合,称为集合A和B的并。即A+B,如: 
[X,Y,Z]+[X] 为 [X,Y,Z]       { 两个集合中不重复的所有元素 } 
[1]+[4] 为[1,4]  
②     交运算  (关系代数运算符∩) 
A,B为两个集合,由既属于集合A中的元素又属于集合B中的所有元素组成的集合,称为集合A和B的交。即A*B,如: 
[X,Y,Z]*[X] 为 [X]          { 两个集合中的相同元素 } 
[X,Y,Z]* 为 [] 
③差运算   (关系代数运算符-) 
A,B为两个集合,由集合A中的元素除去集合B中与A相同的元素组成的集合,称为集合A和B的差。即AB,如: 
[X,Y,Z]-[X] 为 [Y,Z ]      { 在集合A中又不在集合B中的所有元素 } 
[X,Y,Z]- 为 [X,Y,Z]

提示 尽可能地用Include()和Exclude()来增删元素,尽可能地少用+、-运算符。

因为Include()和Exclude()仅需要一条机器指令,而+和-需要13+6n(n是集合的按位的长度)条机器指令。
3、集合的关系运算: 运算结果为布尔值
关系运算符: = 相等、<> 不相等、 
>= 包含,表示前者蕴含后者。 
<= 包含于,表示前者蕴含于后者。 
例如:[a,b,c]=[b,c,a]   为true,元素个数相同,内容相同,不管排列顺序如何。 
[a,b,c]>=[a]      为true;    
      [a,b]<=[a,b,c]    为true。
  
in运算:in的右边为集合,左边为与集合基类型相同的表达式,为布尔值。in测试一个元素是否在集合中。例如:a in[b,c]  为false。 
设集合a:=[1..10]; x 为integer,如x在集合a中即删除a中的元素x,否则把元素x添加到集合a中。程序段如下: 
if x in a then a:=a-[x] else a:=a+[x]  
  
例1、输入一系列字符,对其中的数字字符、字母字符和其它字符分别计数。输入‘?‘后结束。 
var ch:char;
    letter:set of char;
    digit:set of ‘0‘..‘9‘; 
i,j,k:integer;
  begin
   letter:=[‘a‘..‘z‘,‘A‘..‘Z‘]; digit:=[‘0‘..‘9‘];
   i:=0; j:=0; k:=0;
   repeat
    read(ch);
    if ch in letter 
then i:=i+1
      else if ch in digit then j:=j+1 else k:=k+1;
   until ch=‘?‘;
    writeln(‘letter:‘,i,‘digit:‘,j,‘other:‘,k) 
end.

时间: 2024-11-05 22:03:21

集合定义 赋值 运算 特殊操作注意事项..的相关文章

集合的定义与并查操作

集合的定义与并查操作. 1 #define MAXN 1000 /* 集合最大元素个数 */ 2 typedef int ElementType; /* 默认元素可以用非负整数表示 */ 3 typedef int SetName; /* 默认用根结点的下标作为集合名称 */ 4 typedef ElementType SetType[MAXN]; /* 假设集合元素下标从0开始 */ 5 6 void Union( SetType S, SetName Root1, SetName Root2

Effective C++笔记:构造/析构/赋值运算

条款05:了解C++默默编写并调用哪些函数 默认构造函数.拷贝构造函数.拷贝赋值函数.析构函数构成了一个类的脊梁,只有良好的处理这些函数的定义才能保证类的设计良好性. 当我们没有人为的定义上面的几个函数时,编译器会给我们构造默认的. 当成员变量里有const对象或引用类型时,编译器会不能合成默认的拷贝赋值函数:当一个基类把它的拷贝赋值函数定义为private时,它的派生类也不无生成默认的拷贝赋值函数,因为它无法完成基类成份的赋值. 条款06:若不想使用编译器自动生成的函数,就该明确拒绝 将拷贝构

《Effective C++》第2章 构造/析构/赋值运算(2)-读书笔记

章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(2)-读书笔记 <Effective C++>第8章 定制new和delete-读书笔记 条款09:绝不在构造和析构过程中调用virtual函数 你不该在构造和析构函数期间调用virtual函数,因为这样的调用不会带来你预期的结果. (1)在der

C编译器剖析_4.2 语义检查_表达式的语义检查(7)_二元运算符_赋值运算_条件表达式

在前文对语义检查进行简介时,我们已初步介绍过用于对二元运算符表达式进行语义检查的函数CheckBinaryExpression,为了阅读方便,这里我们再次给出图4.2.2.在本小节中,我们准备对第1126至1144行中的各个函数进行讨论. 图4.2.2 CheckBinaryExpression() 对于形如a+b的二元运算表达式,我们要通过在前面章节中介绍的函数CommonRealType来求得整个表达式a+b的类型,如果a为int型且b为double型,则表达式a+b的类型为double.在

《Effective C++》第2章 构造/析构/赋值运算(1)-读书笔记

章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effective C++>第8章 定制new和delete-读书笔记 条款05:了解C++默默编写并调用哪些函数 当C++处理过一个空类后,编译器就会为其声明(编译器版本的):一个拷贝构造函数.一个拷贝赋值运算符和一个析构函数.如果你没有声明任何构造函数,编译器还会声明一个默认构造函数.所有这些函数都被声明为pub

Python - 集合与元素之集合定义和基本操作方法

集合(set) 定义:由不同元素组成的集合,集合中是一组无序排列可hash的值(不可变的值)例如数字.字符串.元组,可以作为字典的key 定义集合: # 定义集合 s = {1, 2, 3, 3, 3, 4, 5} print(s) print(type(s)) 输出: {1, 2, 3, 4, 5} <class 'set'> 定义可变集合set # 定义可变集合 s = set("hello") # ()内为可迭代类型 print(s) 输出: {'l', 'h', '

拷贝构造函数 Vs 赋值运算函数

1.拷贝构造函数:用已经创建对象初始化新的对象,首先是一个构造函数,在调用时候产生对象,通过参数传递对其进行初始化 2.赋值运算函数:operator():将一个对象赋值给一个原有对象,所以原有的对象中的内存必须进行释放同时判断两个对象是是不是同一个对象 1 /*赋值运算符号*/ 2 #include<iostream> 3 #include<string> 4 using namespace std; 5 6 class CMyString 7 { 8 private: 9 ch

java个人学习笔记 自增自减(前后) 赋值运算(扩展的赋值运算)逻辑运算符

++ 自增前置 :先运算后取值 a=3; b=++a; a=4 ; b=4; ++ 自增后置 :先取值后运算 a=3; b=a++; a=4; b=3; -- 自减前置  :先运算后取值 a=3: b=--a:a=2:b=2: -- 自减后置 :先取值后运算 a=3:b=a--:a=2:b=3: 前置的都是先运算后取值 后置的都是先取值后运算. 赋值运算 + 扩展的赋值运算 +=   ,-+  ,*= ,/=,%= short s = 3; s=s+2; ① s+=2; ② ①和②有什么区别?

Java 基础【06】复合赋值运算

这是今天在开发当中遇到的问题,虽然不是很大,但还是花了一点时间去琢磨. 嗯,好了.先看一段源代码 short value=2; value-=2; 源码就是上面这个样子的,我动手写的时候因为理解的问题,把代码改成了这个样子 short value=2; value=value-2; 这时候编译器就和我杠上了,报第二行有错.想想也对, value 变量和一个整型运算后 Java 会自动将运算结果提升到 int 类型,这和 value 定义的时候的 short 类型的产生矛盾. 提供的修改意见有两个