抽象数据类型

抽象数据类型
抽象数据类型

专题1 数据结构分类与抽象数据类型

1.1 数据结构分类

数据结构讨论现实世界和计算机世界中的数据及其相互之间的联系,这体现在逻辑和存储两个层面上,相应称之为逻辑结构和存储结构。也就是说,在现实世界中讨论的数据结构是指逻辑结构,在计算机世界中讨论的数据结构是指存储结构,又称为物理结构。

数据的逻辑结构总体上分为4种类型:集合结构、线性结构、树结构和图结构。数据的存储结构总体上也分为4种类型:顺序结构、链接结构、索引结构和散列结构。原则上,一种逻辑结构可以采用任一种存储结构来存储(表示)。

对于现实世界中的同一种数据,根据研究问题的角度不同,将会选用不同的逻辑结构;对于一种逻辑结构,根据处理问题的要求不同,将会选用不同的存储结构。

对于复杂的数据结构,不论从逻辑层面上还是从存储层面上看,都可能包含有多个嵌套层次。如假定一种数据结构包含有两个层次,第一层(顶层)的逻辑结构可能是树结构,存储结构可能是链接结构;第二层(底层)的逻辑结构可能是线性结构,存储结构可能是顺序结构。第一层结构就是数据的总体结构,第二层结构就是第一层中数据元素的结构。

数据的逻辑结构通常采用二元组来描述,其中一元为数据元素的集合,另一元为元素之间逻辑关系的集合,每一个逻辑关系是元素序偶的集合,如就是一个序偶,其中x 为前驱,y为后继。当数据的逻辑结构存在着多个逻辑关系时,通常对每个关系分别进行讨论。

逻辑结构的另一种描述方法是图形表示,图中每个结点表示元素,每条带箭头的连线表示元素之间的前驱与后继的关系,其箭头一端为后继元素,另一端为前驱元素。

数据的存储结构通常采用一种计算机语言中的数据类型来描述,通过建立数据存储结构的算法来具体实现。

数据的逻辑结构或存储结构也时常被简称为数据结构,读者可根据上下文来理解。

下面通过例子来说明数据的逻辑结构。

假定某校教务处的职员简表如表1.1所示。该表中共有10条记录,每条记录都由6个数据项组成。此表整体上被看为一个数据,每个记录是这个数据中的数据元素。由于每条记录的职工号各不相同,所以可把职工号作为记录的关键字,在下面构成的各种数据结构中,将用记录的关键字代表整个记录。

表1.1 教务处职员简表

【例1.1】一种数据结构的二元组表示为set=(K,R),其中

K={01,02,03,04,05,06,07,08,09,10}

R={}

在数据结构set中,只存在有元素的集合,不存在有关系,或者说关系为空。这表明只考虑表中的每条记录,不考虑它们之间的任何关系。把具有此种特点的数据结构称为集合结构。

集合结构中的元素可以任意排列,无任何次序。

【例1.2】一种数据结构的二元组表示为linearity=(K,R),其中

K={01,02,03,04,05,06,07,08,09,10}

R={<05,01>,<01,03>,<03,08>,<08,02>,<02,07>,<07,04>,

<04,06>,<06,09>,<09,10>}

对应的图形表示如图1.1所示。

图1.1 数据的线性结构示意图

结合表1.1,细心的读者不难看出:R是按职员年龄从大到小排列的关系。

在数据结构linearity中,数据元素之间是有序的,每个数据元素有且仅有一个直接前驱元素(除结构中第一个元素05外),有且仅有一个直接后继元素(除结构中最后一个元素10外)。这种数据结构的特点是数据元素之间的1对1(1∶1)联系,即线性关系。我们把具有这种特点的数据结构叫做线性结构。

【例1.3】一种数据结构的二元组表示为tree=(K,R),其中

K={01,02,03,04,05,06,07,08,09,10}

R={<01,02>,<01,03>,<01,04>,<02,05>,<02,06>,<03,07>, <03,08>,<03,09>,<04,10>}

对应的图形表示如图1.2所示。

图1.2 数据的树结构示意图

结合表1.1,细心的读者不难看出:R 是职员之间领导与被领导的关系。

图1.2像倒着画的一棵树,在这棵树中,最上面的一个没有前驱只有后继的结点叫做树根结点,最下面一层的只有前驱没有后继的结点叫做树叶结点,除树根和树叶之外的结点叫做树枝结点。

在一棵树中,每个结点有且只有一个前驱结点(除树根结点外),但可以有任意多个后继结点(树叶结点可看作为含0个后继结点)。这种数据结构的特点是数据元素之间的1对N (1∶N )联系(N ≥0),即层次关系,我们把具有这种特点的数据结构叫做树结构,简称树。

【例1.4】一种数据结构的二元组表示为graph=(K,R),其中

K={01,02,03,04,05,06,07}

R={<01,02>,<02,01>,<01,04>,<04,01>,<02,03>,<03,02>, <02,06>,<06,02>,<02,07>,<07,02>,<03,07>,<07,03>, <04,06>,<06,04>,<05,07>,<07,05>}

对应的图形表示如图1.3所示。

从图1.3可以看出,R 是K 上的对称关系。为了简化起见,我们把〈x,y 〉和〈y,x 〉这两个对称序偶用一个无序对(x,y )或(y,x )来代替;在示意图中,我们把x 结点和y 结点之间两条相反的有向边用一条无向边来代替。这样R 关系可改写为:

R={(01,02),(01,04),(02,03),(02,06),(02,07), (03,07),(04,06),(05,07)}

对应的图形表示如图1.4所示。

如果说R 中每个序偶里的两个元素所代表的职员是好友的话,那么R 关系就是人员之

间的好友关系。

图1.3 数据的图结构示意图图1.4 图1.3的等价表示

从图1.3或1.4可以看出,结点之间的联系是M对N(M∶N)联系(M≥0,N≥0),即网状关系。也就是说,每个结点可以有任意多个前驱结点和任意多个后继结点。我们把具有这种特点的数据结构叫做图结构,简称图。

从图结构、树结构和线性结构的定义可知,树结构是图结构的特殊情况(即M=1的情况),线性结构是树结构的特殊情况(即N=1的情况)。为了区别于线性结构,我们把树结构和图结构统称为非线性结构。

集合结构是整个数据结构中的一种特殊情况,其元素之间不存在任何关系。

【例1.5】一种数据结构的二元组表示为B=(K,R),其中

K={k1,k2,k3,k4,k5,k6}

R={R1,R2}

R1={,,,,}

R2={,,,,}

若用实线表示关系R1

,虚线表示关系R2,则对应的图形表示如图1.5所示。

图1.5 带有两个关系的一种数据结构示意图

从图1.5可以看出:数据结构B是图结构。但是,若只考虑关系R1则为树结构,若只考虑关系R2则为线性结构。

下面简要讨论数据的存储结构。

存储数据不仅要存储数据中的每个数据元素,而且要存储元素之间的逻辑关系。具体地说,若数据是集合结构,则只需要存储所有数据元素,不需要存储它们之间的任何关系;

若数据是线性结构、树结构或图结构,则除了要存储所有数据元素外,还要相应存储元素之间的线性关系、层次关系或网状关系。

数据的存储结构分为顺序、链接、索引和散列4种。

顺序存储对应一块连续的存储空间,该空间的大小要大于等于存储所有元素需占有的存储空间的大小,存储元素之间的联系(即逻辑结构)通常不需要附加空间,而是通过元素下标之间的对应关系反映出来,只要简单的计算就可以得到一个元素的前驱或后继元素的下标。顺序存储空间一般需要通过定义数组类型和数组对象来实现。

在链接存储结构中,元素之间的逻辑关系通过存储结点之间的链接关系反映出来,每个存储结点对应存储一个元素,同时存储该元素的前驱和后继元素所在结点的存储位置,或者说同时存储指向其前驱元素结点和后继元素结点的指针,通过这些指针能够直接访问到其前驱元素和后继元素。链接存储空间通过定义元素的存储结点类型和对象来实现,所有存储结点可以占用连续的存储空间(即数组空间),也可以占用不连续的存储空间,此空间是由动态分配的每个结点的空间形成的。

索引存储是首先把所有数据元素按照一定的函数关系划分成若干个子表,每个子表对应一个索引项,然后采用一种存储结构存储所有子表的索引项和采用另一种存储结构存储所有子表中的元素。如存储汉字字典时,需要采用索引存储,首先按偏旁部首划分所存汉字为若干子表,得到偏旁部首表,对于每个部首再按所属汉字的笔画多少划分子表,得到检字表,检字表中的每个汉字对应汉字解释表(即字典主体)中的一个条目;然后再分别存储部首表、检字表和汉字解释表。这里检字表是汉字解释表的索引,而偏旁部首表又是检字表的索引,它是汉字解释表的二级索引。当存储的数据量很大时,通常都需要采用索引存储,并且时常使用多级索引。

在索引存储中,各级索引表和主表(即数据元素表)通常都以文件的形式保存在外存磁盘上,访问任一数据元素时,都要根据该数据元素的特征依次访问各级索引表和最后访问主表,存取外存的次数至少等于建立索引的级数加1。

散列存储方法是按照数据元素的关键字通过一种函数变换直接得到该元素存储地址的方法,该存储地址为相应数组空间中的下标位置。用于散列存储所有数据元素的相应数组空间称为散列表。通过定义用于计算散列存储地址的函数和定义存储数据元素的散列表能够实现散列存储结构。

以上简要叙述了数据结构的有关概念,在以后的各专题中将会做深入和具体的讨论。

1.2 抽象数据类型

抽象数据类型(Abstract Data Type,ADT)由一种数据结构和在该数据结构上的一组操作所组成。抽象数据类型包含一般数据类型的概念,但含义比一般数据类型更广、更抽

象。一般数据类型由具体语言系统内部定义,直接提供给编程者定义用户数据,因此称它们为预定义数据类型。抽象数据类型通常由编程者定义,包括定义它所使用的数据、数据结构以及所进行的操作。在定义抽象数据类型中的数据部分(含数据结构在内)和操作部分时,可以只定义数据的逻辑结构和操作说明,不考虑具体的存储结构和操作的具体实现,这样能够为用户提供一个简明的使用接口,然后再另外给出具体的存储结构和操作的具体实现,使得操作声明与实现分开,从而符合面向对象的程序设计思想。

抽象数据类型在C++语言中是通过类类型来描述的,其数据部分通常定义为类的私有或保护的数据成员,它只允许该类或派生类直接使用,操作部分通常定义为类的公共的成员函数,它既可以提供给该类或派生类使用也可以提供给外部定义的类和函数使用。

在本书中,为了便于叙述和分析数据结构和算法,使读者容易理解和接受,所以在实现所定义的抽象数据类型时,把数据部分用一种已知的数据类型(如结构或数组等)来实现,把操作部分中的每个操作用普通函数来实现,这样能够同读者熟悉的C语言、C++语言,甚至其他计算机语言很好地兼容起来。

一种抽象数据类型的定义将采用如下书写格式:

ADT <抽象数据类型名> is

Data:

<数据描述>

Operations:

<操作声明>

end <抽象数据类型名>

【例1.6】假定把矩形定义为一种抽象数据类型,其数据部分包括矩形的长度和宽度,操作部分包括初始化矩形的尺寸、求矩形的周长和求矩形的面积。

假定该抽象数据类型名用RECtangle(矩形)表示,定义矩形长度和宽度的数据用length 和width表示,并假定其类型为浮点(float)型,初始化矩形数据的函数名用InitRectangle 表示,求矩形周长的函数名用Circumference(周长)表示,求矩形面积的函数名用Area (面积)表示,则矩形的ADT(抽象数据类型)描述如下:

ADT RECtangle is

Data:

一个矩形r,其长度和宽度分别用length和width表示

Operations:

//初始化矩形r的长度和宽度值为len和wid

void InitRectangle(Rectangle& r, float len, float wid);

//求矩形r的周长并返回

float Circumference(Rectangle& r);

//求矩形r的面积并返回

float Area(Rectangle& r);

end RECtangle

这里假定数据部分的矩形r是类型名为Rectangle的一个结构对象,该类型的具体定义如下:

struct Rectangle{

float length, width;

};

下面给出每个操作的具体实现。

(1)初始化矩形尺寸

void InitRectangle(Rectangle& r, float len, float wid) {

r.length=len; //把len值赋给r的length域

r.width=wid; //把wid值赋给r的width域

}

该函数把两个值参len和wid的值分别赋给引用参数r的length域和width域,实现对一个矩形r的初始化。

(2)求矩形周长

float Circumference(Rectangle& r) {

return 2*(r.length+r.width);

}

(3)求矩形面积

float Area(Rectangle& r) {

return r.length*r.width;

}

求矩形周长和面积的函数分别使用一个矩形引用参数,当然也可以改为值参。

【例1.7】把二次多项式ax2+bx+c设计成一种抽象数据类型,假定起名为QUAdratic,该类型的数据部分为三个系数项a,b和c,操作部分为:

(1)初始化a,b和c的值,假定它们的默认值均为0;

(2)做两个多项式加法,返回它们的和;

(3)根据给定x的值计算多项式的值并返回;

(4)计算方程ax2+bx+c=0的两个实数根,对于有实根、无实根和不是二次方程(即a==0)这三种情况都要返回不同的整数值,以便返回后做不同的处理;

(5)按照ax**2+bx+c的格式输出二次多项式,在输出时要注意去掉系数为0的项,并且当b和c的值为负时,其前不能出现加号。

该抽象数据类型可具体定义如下:

ADT QUAdratic is

Data:

一个二次多项式q,其二次项、一次项和常数项的系数分别用a,b,c表示 Operations:

//初始化二项式,用于赋给a,b,c值的每个对应参数的默认值设为0

void Init(Quadratic& q, float aa=0, float bb=0, float cc=0);

//两个二项式相加

Quadratic Add(Quadratic& q1, Quadratic& q2);

//二项式求值

float Eval( Quadratic& q, float x);

//求二项式方程的根,两个实根由引用参数r1和r2带回

int Root(Quadratic& q, float& r1, float& r2);

//输出二项式

void Print(Quadratic& q);

end QUAdratic

这里假定数据部分的二次多项式q是类型名为Quadratic的一个结构对象,该类型的具体定义如下:

struct Quadratic {

float a,b,c;

};

下面给出每个操作的具体实现。

(1)初始化a,b和c的值

void Init(Quadratic& q, float aa, float bb, float cc)

{

q.a=aa; q.b=bb; q.c=cc;

}

(2)做两个多项式加法,返回它们的和

Quadratic Add(Quadratic& q1, Quadratic& q2)

{

Quadratic q;

q.a=q1.a+q2.a;

q.b=q1.b+q2.b;

q.c=q1.c+q2.c;

return q;

}

(3)根据给定x的值计算多项式的值并返回

float Eval(Quadratic& q, float x)

{

return (q.a*x*x+q.b*x+q.c);

}

(4)求二项式方程的根,两个实根由引用参数r1和r2带回

int Root(Quadratic& q, float& r1, float& r2)

{

if(q.a==0) return -1; //不是二次方程返回-1

float x=q.b*q.b-4*q.a*q.c;

if(x>=0){

r1=float(-q.b+sqrt(x))/(2*q.a);

//sqrt(x)为计算x的平方根,该函数存在于系统头文件math.h中 r2=float(-q.b-sqrt(x))/(2*q.a);

return 1; //有实根返回1

}

else return 0; //无实根返回0

}

(5)输出二项式

void Print(Quadratic& q)

{

if (q.a) cout<

if(q.b){

if(q.b>0) cout<<"+"<

else cout<

}

if(q.c){

if(q.c>0) cout<<"+"<

else cout<

}

cout<

}

假定使用如下调试程序:

#include

#include

struct Quadratic {

float a,b,c;

};

//初始化二项式

void Init(Quadratic& q, float aa=0, float bb=0, float cc=0); //两个二项式相加

Quadratic Add(Quadratic& q1, Quadratic& q2);

//二项式求值

float Eval( Quadratic& q, float x);

//求二项式方程的根,两个实根又引用参数r1和r2带回

int Root(Quadratic& q, float& r1, float& r2);

//输出二项式

void Print(Quadratic& q);

//各函数定义已经在上面给出,这里从略

void main()

{

Quadratic a,b,c;

Init(a,2,5);

Print(a);

cout<

float x1,x2;

int n=Root(a,x1,x2);

if(n==1) cout<

Init(b,3,-8,4);

Print(b);

n=Root(b,x1,x2);

if(n==1) cout<

c=Add(a,b);

Print(c);

}

程序运行结果如下:

2x**2+5x

52

0 -2.5

3x**2-8x+4

2 0.666667

5x**2-3x+4

有理数抽象数据类型定义

ADT Rational { //起名要易懂 数据对象:D={e1,e2|e1,e2∈Z,e2≠0} //分母不为零 数据关系:R={|e1表示分子,e2表示分母} //说明不可丢 基本操作: InitRational (&Q,v1,v2) 初始条件:v2 ≠0 操作结果:构造有理数Q,其分子和分母分别为v1与v2。 DestroyRational(&Q) 初始条件:有理数Q存在 操作结果:有理数Q被撤销。 RationalPrint(Q) 初始条件:Q存在 操作结果:以分数形式输出有理数 RationalAdd (Q1,Q2,&sum)//Substract,Multiply等操作略 初始条件:有理数Q1与Q2存在 操作结果:用sum返回Q1与Q2的和 } ADT Rational //--采用动态分配的“顺序”存储结构-- typedef int ElemType; typedef ElemType * Rational;

Status InitRational(Rational &Q,ElemType v1, ElemType v2){ //构造有理数Q,分子分母分别为v1,v2,若v2=0则Q赋空,返回Error if(v2==0){Q=NULL;return ERROR;} /*return后括号可有可无*/ Q=(ElemType *)malloc(2*sizeof(ElemType)); //莫忘malloc.h if(!Q)exit(OVERFLOW);//分配存储空间失败, stdlib.h,注意!及适用场合用法Q[0]=v1;Q[1]=v2; /*之前的else可省略,若不省略最好加花括号*/ return(OK); } Status DestroyRational(Rational &Q) //销毁有理数Q { if(Q) { free(Q); Q=NULL; return OK; } } void OutputRational(Rational Q){ //以分数形式输出有理数Q if(!Q)printf(“the rational does not exist! \n‘); printf(“ %d/%d ”,Q[0],Q[1]); }

严蔚敏版数据结构课后习题答案-完整版

第1章绪论 1.1 简述下列术语:数据,数据元素、数据对象、数据结构、存储结构、数据类型和抽象数据类型。 解:数据是对客观事物的符号表示。在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。 数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。 数据对象是性质相同的数据元素的集合,是数据的一个子集。 数据结构是相互之间存在一种或多种特定关系的数据元素的集合。 存储结构是数据结构在计算机中的表示。 数据类型是一个值的集合和定义在这个值集上的一组操作的总称。 抽象数据类型是指一个数学模型以及定义在该模型上的一组操作。是对一般数据类型的扩展。 1.2 试描述数据结构和抽象数据类型的概念与程序设计语言中数据类型概念的区别。 解:抽象数据类型包含一般数据类型的概念,但含义比一般数据类型更广、更抽象。一般数据类型由具体语言系统内部定义,直接提供给编程者定义用户数据,因此称它们为预定义数据类型。抽象数据

类型通常由编程者定义,包括定义它所使用的数据和在这些数据上所进行的操作。在定义抽象数据类型中的数据部分和操作部分时,要求只定义到数据的逻辑结构和操作说明,不考虑数据的存储结构和操作的具体实现,这样抽象层次更高,更能为其他用户提供良好的使用接口。 1.3 设有数据结构(D,R),其中 {}4,3,2,1d d d d D =,{}r R =,()()(){}4,3,3,2,2,1d d d d d d r = 试按图论中图的画法惯例画出其逻辑结构图。 解: 1.4 试仿照三元组的抽象数据类型分别写出抽象数据类型复数和有理数的定义(有理数是其分子、分母均为自然数且分母不为零的分数)。 解: ADT Complex{ 数据对象:D={r,i|r,i 为实数} 数据关系:R={} 基本操作: InitComplex(&C,re,im) 操作结果:构造一个复数C ,其实部和虚部分别为re 和im DestroyCmoplex(&C)

数据库常用数据类型

(1) 整数型 整数包括bigint、int、smallint和tinyint,从标识符的含义就可以看出,它们的表示数范围逐渐缩小。 l bigint:大整数,数范围为-263 (-9223372036854775808)~263-1 (9223372036854775807) ,其精度为19,小数位数为0,长度为8字节。 l int:整数,数范围为-231 (-2,147,483,648) ~231 - 1 (2,147,483,647) ,其精度为10,小数位数为0,长度为4字节。 l smallint:短整数,数范围为-215 (-32768) ~215 - 1 (32767) ,其精度为5,小数位数为0,长度为2字节。 l tinyint:微短整数,数范围为0~255,长度为1字节,其精度为3,小数位数为0,长度为1字节。 (2) 精确整数型 精确整数型数据由整数部分和小数部分构成,其所有的数字都是有效位,能够以完整的精度存储十进制数。精确整数型包括decimal 和numeric两类。从功能上说两者完全等价,两者的唯一区别在于decimal不能用于带有identity关键字的列。 声明精确整数型数据的格式是numeric | decimal(p[,s]),其中p为精度,s为小数位数,s的缺省值为0。例如指定某列为精确整数型,精度为6,小数位数为3,即decimal(6,3),那么若向某记录的该列赋值56.342689时,该列实际存储的是56.3427。 decimal和numeric可存储从-1038 +1 到1038 –1 的固定精度和小数位的数字数据,它们的存储长度随精度变化而变化,最少为5字节,最多为17字节。 l 精度为1~9时,存储字节长度为5; l 精度为10~19时,存储字节长度为9; l 精度为20~28时,存储字节长度为13; l 精度为29~38时,存储字节长度为17。 例如若有声明numeric(8,3),则存储该类型数据需5字节,而若有声明numeric(22,5),则存储该类型数据需13字节。 注意:声明精确整数型数据时,其小数位数必须小于精度;在给精确整数型数据赋值时,必须使所赋数据的整数部分位数不大于列的整数部分的长度。 (3) 浮点型 浮点型也称近似数值型。顾名思义,这种类型不能提供精确表示数据的精度,使用这种类型来存储某些数值时,有可能会损失一些精度,所以它可用于处理取值范围非常大且对精确度要求不是十分高的数值量,如一些统计量。

Excel中常用的数据类型

Excel中常用的数据类型 在Excel的单元格中可以输入多种类型的数据,如文本、数值、日期、时间等等。下面简单介绍这几种类型的数据。 1.字符型数据。在Excel中,字符型数据包括汉字、英文字母、空格等,每个单元格最多可容纳32000个字符。默认情况下,字符数据自动沿单元格左边对齐。当输入的字符串超出了当前单元格的宽度时,如果右边相邻单元格里没有数据,那么字符串会往右延伸;如果右边单元格有数据,超出的那部分数据就会隐藏起来,只有把单元格的宽度变大后才能显示出来。 如果要输入的字符串全部由数字组成,如邮政编码、电话号码、存折帐号等,为了避免Excel把它按数值型数据处理,在输入时可以先输一个单引号“'”(英文符号),再接着输入具体的数字。例如,要在单元格中输入电话号码“64016633”,先连续输入“'64016633”,然后敲回车键,出现在单元格里的就是“64016633”,并自动左对齐。 2.数值型数据。在Excel中,数值型数据包括0~9中的数字以及含有正号、负号、货币符号、百分号等任一种符号的数据。默认情况下,数值自动沿单元格右边对齐。在输入过程中,有以下两种比较特殊的情况要注意。 (1)负数:在数值前加一个“”号或把数值放在括号里,都可以输入负数,例如要在单元格中输入“66”,可以连续输入“66”“(66)”,然后敲回车键都可以在单元格中出现“66”。 (2)分数:要在单元格中输入分数形式的数据,应先在编辑框中输入“0”和一个空格,然后再输入分数,否则Excel会把分数当作日期处理。例如,要在单元格中输入分数“2/3”,在编辑框中输入“0”和一个空格,然后接着输入“2/3”,敲一下回车键,单元格中就会出现分数“2/3”。 3.日期型数据和时间型数据。在人事管理中,经常需要录入一些日期型的数据,在录入过程中要注意以下几点: (1)输入日期时,年、月、日之间要用“/”号或“-”号隔开,如“2002-8-16”“2002/8/16”。 (2)输入时间时,时、分、秒之间要用冒号隔开,如“10:29:36”。 (3)若要在单元格中同时输入日期和时间,日期和时间之间应该用空格隔开。 (信息技术教育室供稿)

常用数据类型的使用

刚接触编程地朋友往往对许多数据类型地转换感到迷惑不解,本文将介绍一些常用数据类型地使用. 我们先定义一些常见类型变量借以说明 ; ; ; ; []"程佩君"; []; *; ; ; ; 一、其它数据类型转换为字符串 短整型() ()将转换为字符串放入中,最后一个数字表示十进制 (); 按二进制方式转换 长整型() (); 浮点数() 用可以完成转换,这是中地例子: , ; *; ; ( , , , ); 运行结果: : '' : : 资料个人收集整理,勿做商业用途 表示小数点地位置表示符号为正数,为负数 变量 "北京奥运"; ()(); 变量 ("程序员"); * (); 资料个人收集整理,勿做商业用途 (); (); (); 变量 (""); * (); 资料个人收集整理,勿做商业用途 (); (); 变量 类型是对地封装,因为已经重载了操作符,所以很容易使用 ("");

* 不要修改中地内容 (); 通用方法(针对非数据类型) 用完成转换 []; ''; ; ; ; ( , ""); ( , ""); ( , ""); ( , ""); 二、字符串转换为其它数据类型 (,""); 短整型() (); 长整型() (); 浮点() (); 变量 ; 变量 ("程序员"); 完成对地使用 (); 变量 类型变量可以直接赋值 (""); (); 变量 类型地变量可以直接赋值 (""); (); 三、其它数据类型转换到 使用地成员函数来转换,例如: 整数() (""); 浮点数() (""); 字符串指针( *)等已经被构造函数支持地数据类型可以直接赋值 ; 对于所不支持地数据类型,可以通过上面所说地关于其它数据类型转化到*地方法先转到*,

C语言的基本数据类型及其表示

3.2C语言的基本数据类型及其表示 C语言的基本数据类型包括整型数据、实型数据和字符型数据,这些不同数据类型如何表示?如何使用?它们的数据范围是什么?下面我们分别进行介绍。 3.2.1常量与变量 1.常量 常量是指程序在运行时其值不能改变的量,它是C语言中使用的基本数据对 象之一。C语言提供的常量有: 以上是常量所具有的类型属性,这些类型决定了各种常量所占存储空间的大小和数的表示范围。在C程序中,常量是直接以自身的存在形式体现其值和类型,例如:123是一个整型常量,占两个存储字节,数的表示范围是-32768~32767;123.0是实型常量,占四个存储字节,数的表示范围是-3.410-38~3.41038。 需要注意的是,常量并不占内存,在程序运行时它作为操作对象直接出现在运算器的各种寄存器中。 2.符号常量 在C程序中,常量除了以自身的存在形式直接表示之外,还可以用标识符来表示常量。因为经常碰到这样的问题:常量本身是一个较长的字符序列,且在程序中重复出现,例如:取常数的值为3.1415927,如果在程序中多处出现,直接使用3.1415927的表示形式,势必会使编程工作显得繁琐,而且,当需要把的值修改为3.1415926536时,就必须逐个查找并修改,这样,会降低程序的可修改性和灵活性。因此,C语言中提供了一种符号常量,即用指定的标识符来表示某个常量,在程序中需要使用该常量时就可直接引用标识符。 C语言中用宏定义命令对符号常量进行定义,其定义形式如下: #define标识符常量 其中#define是宏定义命令的专用定义符,标识符是对常量的命名,常量可以是前面介绍的几种类型常量中的任何一种。该使指定的标识符来代表指定的常量,这个被指定的标识符就称为符号常量。例如,在C程序中,要用PAI代表实型常量3.1415927,用W代表字符串常量"Windows98",可用下面两个宏定义命令: #define PAI3.1415927 #define W"Windows98" 宏定义的功能是:在编译预处理时,将程序中宏定义(关于编译预处理和宏定义的概念详见9.10节)命令之后出现的所有符号常量用宏定义命令中对应的常量一一替代。例如,对于以上两个宏定义命令,编译程序时,编译系统首先将程序中除这两个宏定义命令之外的所有PAI替换为3.1415927,所有W替换为Windows98。因此,符号常量通常也被称为宏替换名。 习惯上人们把符号常量名用大写字母表示,而把变量名用小写字母表示。例3-1是符号常量的一个简单的应用。其中,PI为定义的符号常量,程序编译时,用3.1416替换所有的PI。 例3-1:已知圆半径r,求圆周长c和圆面积s的值。

抽象数据类型线性表的定义

抽象数据类型线性表的定义如下: ADT List { 数据对象:D={ a i | a i∈ElemSet, i =1, 2, ……, n, n≥0} 数据关系:R1 = { < a i-1 , a i > | a i-1 , a i ∈D, i =2, ……, n } 基本操作: InitList (&L ) 操作结果:构造一个空的线性表L 。 DestoryList (&L) 初始条件:线性表L已存在。 操作结果:销毁线性表L。 ClearList (&L) 初始条件:线性表L已存在。 操作结果:将L重置为空表。 ListEmpty (L) 初始条件:线性表L已存在。 操作结果:若L 为空表,则返回TRUE,否则返回FALSE。 ListLength (L) 初始条件:线性表L已存在。 操作结果:返回L中数据元素个数。 GetElem ( L, i, &e ) 初始条件:线性表L已存在,1≤i≤ListLength(L)+1。

操作结果:用e返回L中第i个数据元素的值。 LocateElem ( L,e, compare() ) 初始条件:线性表L已存在,compare()是判定函数。 操作结果:返回L中第1个与e满足关系compare() 的数据元素的位序。若这样的数据元素不存在,则返 回值0。 PriorElem ( L, cur_e, &pre_e ) 初始条件:线性表L已存在。 操作结果:若cur_e是L的数据元素且不是第1个, 则用pre_e返回它的前驱,否则操作失败。 NextElem ( L, cur_e, &next_e ) 初始条件:线性表L已存在。 操作结果:若cur_e是L的数据元素且不是最后一个, 则用next_e返回它的后继,否则操作失败。 ListInsert ( &L, i, e ) 初始条件:线性表L已存在,1≤i≤ListLength(L)+1。 操作结果:在L中第i个位置之前插入新的数据元素e, L的长度加1。 ListDelete( &L, i, &e ) 初始条件:线性表L已存在且非空,1≤i≤ListLength(L)。 操作结果:删除L的第i个数据元素,并用e返回其值,

Java中几种常用的数据类型之间转换方法

Java中几种常用的数据类型之间转换方法:1.短整型-->整型 如: short shortvar=0; int intvar=0; shortvar= (short) intvar 2.整型-->短整型 如: short shortvar=0; int intvar=0; intvar=shortvar; 3.整型->字符串型 如: int intvar=1; String stringvar; Stringvar=string.valueOf (intvar); 4.浮点型->字符串型 如: float floatvar=9.99f; String stringvar; Stringvar=String.valueOf (floatvar); 5.双精度型->字符串型 如: double doublevar=99999999.99; String stringvar; Stringvar=String.valueOf (doublevar); 6. 字符型->字符串型 如:char charvar=’a’; String stringvar;

Stringvar=String.valueOf (charvar); 7字符串型->整型、浮点型、长整型、双精度型如:String intstring=”10”; String floatstring=”10.1f”; String longstring=”99999999”; String doubleString=”99999999.9”; Int I=Integer.parseInt (intstring); Float f= Integer.parseInt (floatstring); Long lo=long. parseInt (longstring); Double d=double. parseInt (doublestring); 8字符串型->字节型、短整型 如:String s=”0”; Byte b=Integer.intValue(s); Short sh=Integer.intValue(s); 9字符串型->字符型 如: String s=”abc”; Char a=s.charAt(0); 10字符串型-->布尔型 String s=”true”; Boolean flag=Boolean.valueOf (“s”);

抽象数据类型的表示与实现(实验一)

实验一抽象数据类型的表示与实现 一.实验目的及要求 (1)熟悉类C语言的描述方法,学会将类C语言描述的算法转换为C源程序实现; (2)理解抽象数据类型的定义,编写完整的程序实现一个抽象数据类型(如三元组); (3)认真阅读和掌握本实验的参考程序,上机运行程序,保存和打印出程序的运行结果,并结合程序进行分析。 二.实验内容 (1)编程实现对一组从键盘输入的数据,计算它们的最大值、最小值等,并输出。 要求:将计算过程写成一个函数,并采用引用参数实现值的求解。 (2)编程实现抽象数据类型三元组的定义、存储和基本操作,并设计一个主菜单完成各个功能的调用。 三.实验主要流程、基本操作或核心代码、算法片段(该部分如不够填写,请另加附页)(1)编程实现对一组从键盘输入的数据,计算它们的最大值、最小值等,并输出。 要求:将计算过程写成一个函数,并采用引用参数实现值的求解。 程序代码部分: 头文件: #define N 10000 void comparason(double a[],int n,double &max,double &min); 主函数: #include"" #include"" int main()

{ int n; printf("请输入数据个数\n"); scanf("%d",&n); double a[N],max,min; int i; printf("请输入数据(空格隔开)\n"); for(i=0;i

抽象数据类型

专题1 数据结构分类与抽象数据类型 1.1 数据结构分类 数据结构讨论现实世界和计算机世界中的数据及其相互之间的联系,这体现在逻辑和存储两个层面上,相应称之为逻辑结构和存储结构。也就是说,在现实世界中讨论的数据结构是指逻辑结构,在计算机世界中讨论的数据结构是指存储结构,又称为物理结构。 数据的逻辑结构总体上分为4种类型:集合结构、线性结构、树结构和图结构。数据的存储结构总体上也分为4种类型:顺序结构、链接结构、索引结构和散列结构。原则上,一种逻辑结构可以采用任一种存储结构来存储(表示)。 对于现实世界中的同一种数据,根据研究问题的角度不同,将会选用不同的逻辑结构;对于一种逻辑结构,根据处理问题的要求不同,将会选用不同的存储结构。 对于复杂的数据结构,不论从逻辑层面上还是从存储层面上看,都可能包含有多个嵌套层次。如假定一种数据结构包含有两个层次,第一层(顶层)的逻辑结构可能是树结构,存储结构可能是链接结构;第二层(底层)的逻辑结构可能是线性结构,存储结构可能是顺序结构。第一层结构就是数据的总体结构,第二层结构就是第一层中数据元素的结构。 数据的逻辑结构通常采用二元组来描述,其中一元为数据元素的集合,另一元为元素之间逻辑关系的集合,每一个逻辑关系是元素序偶的集合,如就是一个序偶,其中x 为前驱,y为后继。当数据的逻辑结构存在着多个逻辑关系时,通常对每个关系分别进行讨论。 逻辑结构的另一种描述方法是图形表示,图中每个结点表示元素,每条带箭头的连线表示元素之间的前驱与后继的关系,其箭头一端为后继元素,另一端为前驱元素。 数据的存储结构通常采用一种计算机语言中的数据类型来描述,通过建立数据存储结构的算法来具体实现。 数据的逻辑结构或存储结构也时常被简称为数据结构,读者可根据上下文来理解。 下面通过例子来说明数据的逻辑结构。 假定某校教务处的职员简表如表1.1所示。该表中共有10条记录,每条记录都由6个数据项组成。此表整体上被看为一个数据,每个记录是这个数据中的数据元素。由于每条记录的职工号各不相同,所以可把职工号作为记录的关键字,在下面构成的各种数据结构中,将用记录的关键字代表整个记录。

数据结构 有理数抽象数据类型

#include #include #include #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define TURE 1 #define FLASE 0 typedef int Status; typedef int ElemType; typedef ElemType *Rational; Status InitRational(Rational &Q,ElemType v1, ElemType v2) { Q=(ElemType*)malloc(2*sizeof(ElemType)); if(!Q || v2==0) return ERROR; else Q[0]=v1; Q[1]=v2; if(Q==NULL) exit(OVERFLOW); else return OK; } Status Rationaladd(Rational &Q,Rational Q1,Rational Q2) { if(Q1==NULL || Q2==NULL) exit(OVERFLOW); else Q=(ElemType*)malloc(2*sizeof(ElemType)); Q[0]=(Q1[0]*Q2[1]+Q1[1]*Q2[0]); Q[1]=Q1[1]*Q2[1]; return OK; } Status Rationalsubtraction(Rational &Q,Rational Q1,Rational Q2) { if(Q1==NULL || Q2==NULL) exit(OVERFLOW); else Q=(ElemType*)malloc(2*sizeof(ElemType)); Q[0]=(Q1[0]*Q2[1]-Q1[1]*Q2[0]); Q[1]=Q1[1]*Q2[1]; return OK; }

基本数据类型

S7-300的数据类型分以下三种: 基本数据类型、复合数据类型和参数类型。 一、基本数据类型 1、位(bit) 常称为BOOL(布尔型),只有两个值:0或1。 如:I0.0,Q0.1,M0.0,V0.1等。 2、字节(Byte)一个字节(Byte)等于8位(Bit),其中0位为最低位,7位为最高位。如:IB0(包括I0.0~I0.7位),QB0(包括Q0.0~Q0.7位),MB0,VB0等。范围:00~FF(十进制的0~255)。 3、字(Word) 相邻的两字节(Byte)组成一个字(Word),来表示一个无符号数,因此,字为16位。 如:IW0是由IB0和IB1组成的,其中I是区域标识符,W表示字,0是字的起始字节。 需要注意的是,字的起始字节(如上例中的“0”)都必须是偶数。 字的范围为十六进制的0000~FFFF(即十进制的0~65536)。 在编程时要注意,如果已经用了IW0,如再用IB0或IB1要特别加以小心。 4、双字(Double Word) 相邻的两个字(Word)组成一个双字,来表示一个无符号数。因此,双字为32位。 如:MD100是由MW100和MW102组成的,其中M是区域标识符,D表示双字,100是双字的起始字节。 需要注意的是,双字的起始字节(如上例中的“100”)和字一样,必须是偶数。 双字的范围为十六进制的0000~FFFFFFFF(即十进制的0~4294967295)。 在编程时要注意,如果已经用了MD100,如再用MW100或MW102要特别加以小心。 以上的字节、字和双字数据类型均为无符号数,即只有正数,没有负数。 5、16位整数(INT,Integer) 整数为有符号数,最高位为符号位,1表示负数,0表示正数。范围为-32768~32767。 6、32位整数(DINT,Double Integer) 32位整数和16位整数一样,为有符号数,最高位为符号位,1表示负数,0表示正数。 范围为-2147483648~2147483647。 7、浮点数(R,Real) 浮点数为32位,可以用来表示小数。浮点数可以为:1.m×2e ,其存储结构如图所示:

抽象数据类型-树

数据结构实验报告 题目:树的抽像数据类型实现 一、实验目的 对某个具体的抽象数据类型,运用课程所学的知识和方法,设计合理的数据结构,并在此基础上实现该抽象数据类型的全部基本操作。通过本设计性实验,检验所学知识和能力,发现学习中存在的问题。进而达到熟练地运用本课程中的基础知识及技术的目的。 二、实验编程环境 编程环境:Visual C++。 三、实验要求 利用c语言实现树的抽象数据类型的基本操作。 四、基本操作描述 树的结构定义和树的一组基本操作: ADT Tree{ 数据对象D:D是具有相同特性的数据元素的集合。 数据关系R: 若D为空集,则称为空树; 若D仅含有一个数据元素,则R为空集,否则R={H},H是如下二元关系: (1) 在D中存在唯一的称为根的数据元素root,它在关系H下无前驱; (2) 若D-{root}≠NULL,则存在D-{root}的一个划分D1,D2,D3,…,Dm(m>0), 对于任意j≠k(1≤j,k≤m)有D j∩Dk=NULL,且对任意的i(1≤i≤m),唯一存在 数据元素xi∈Di有∈H;

(3) 对应于D-{root}的划分,H-{,…,}有唯一的一个划 分H1,H2,…,Hm(m>0),对任意j≠k(1≤j,k≤m)有Hj∩Hk=NULL,且对任意i(1 ≤i≤m),Hi是Di上的二元关系,(Di,{Hi})是一棵符合本定义的树,称为根 root的子树。 基本操作P: InitTree(&T); 操作结果:构造空树T。 DestroyTree(&T); 初始条件:树T存在。 操作结果:销毁树T。 CreateTree(&T,definition); 初始条件:definition给出树T的定义。 操作结果:按definition构造树T。 ClearTree(&T); 初始条件:树T存在。 操作结果:将树T清为空树。 TreeEmpty(T); 初始条件:树T存在。 操作结果:若T为空树,则返回TRUE,否则返回FALSE。 TreeDepth(T); 初始条件:树T存在。 操作结果:返回T的深度。 Root(T); 初始条件:树T存在。 操作结果:返回T的根。 Value(T,cur_e); 初始条件:树T存在,cur_e是T中某个结点。 操作结果:返回cur_e的值。 Assign(T,cur_e,value); 初始条件:树T存在,cur_e是T中某个结点。 操作结果:结点cur_e赋值为value。 Parent(T,cur_e); 初始条件:树T存在,cur_e是T中某个结点。 操作结果:若cur_e是T的非根结点,则返回它的双亲,否则函数值为“空”。 LeftChild(T,cur_e); 初始条件:树T存在,cur_e是T中某个结点。 操作结果:若cur_e是T的非叶子结点,则返回它的最左孩子,否则返回“空”。 RightSibling(T,cur_e); 初始条件:树T存在,cur_e是T中某个结点。 操作结果:若cur_e有右兄弟,则返回它的右兄弟,否则返回“空”。 InsertChild(&T,&p,I,c); 初始条件:树T存在,p指向T中某个结点,1≤i≤p指结点的度+1,非空树c与T不相交。 操作结果:插入c为T中p指结点的第i棵子树。

JAVA中常用数据类型之间转换的方法

Java中常用数据类型之间转换的方法 Java中几种常用的数据类型之间转换方法: 1.short-->int转换 exp:short shortvar=0; int intvar=0; shortvar=(short)intvar 2.int-->short转换 exp:short shortvar=0; int intvar=0; intvar=shortvar; 3.int->String转换 exp:int intvar=1; String stringvar; Stringvar=string.valueOf(intvar); 4.float->String转换 exp:float floatvar=9.99f; String stringvar;

Stringvar=String.valueOf(floatvar); 5.double->String转换 exp double doublevar=99999999.99; String stringvar; Stringvar=String.valueOf(doublevar); 6.char->String转换 exp char charvar=’a’; String stringvar; Stringvar=String.valueOf(charvar); 7String->int、float、long、double转换Exp String intstring=”10”; String floatstring=”10.1f”; String longstring=”99999999”; String doubleString=”99999999.9”; Int I=Integer.parseInt(intstring); Float f=Integer.parseInt(floatstring); Long lo=long.parseInt(longstring); Double d=double.parseInt(doublestring); 8String->byte、short转换

二叉树抽象数据类型

数据结构实验报告 题目:二叉树抽象数据类型 学院计算机学院 专业计算机科学与技术 年级班别 学号 学生姓名 指导教师 成绩____________________ XXXXX

一.实验概要 实验项目名称: 二叉树抽象数据类型的实现 实验项目性质: 设计性实验 所属课程名称: 数据结构 实验计划学时: 6 二.实验目的 1.了解二叉树的定义以及各项基本操作。 2.实现二叉树存储、遍历及其他基本功能 三. 实验仪器设备和材料 硬件:PC机 软件:Visual C++ 6.0 四.实验的内容 1.二叉树类型定义以及各基本操作的简要描述; ADT BinaryTree { 数据对象D:D是具有相同特性的数据元素的集合. 数据关系R: 若D=?,则R=,称BinaryTree为空二叉树; 若D≠,则R={H},H是如下二元关系: (1)在D中存在惟一的称为根的数据元素root,它在关系H下无前 驱; (2)若D-{r oot}≠?,则存在D-{root}={D1,Dr},且D1∩Dr=?; (3)若D1≠?,则D1中存在惟一的元素x1,∈H,且存 在Dr上的关系Hr∈H;H={,H1,Hr}; (4)(D1,{H1})是一棵符合本定义的二叉树,称为根的左子树, 是一棵符合本定义的二叉树,称为根的右子树。 基本操作P:

InitBiTree(&T); 操作结果:构造空二叉树T。 DestroyBiTree(&T); 初始条件:二叉树T存在。 操作结果:销毁二叉树T。 CreateBiTree(&T,definition); 初始条件:definition给出二叉树T的定义。 操作结果:按definition构造二叉树T。 ClearBiTree(&T); 初始条件:二叉树T存在。 操作结果:将二叉树T清为空树。 BiTreeEmpty(T); 初始条件:二叉树T存在。 操作结果:若T为空二叉树,则返回TURE,否则FALSE。BiTreeDepth(T); 初始条件:二叉树T存在。 操作结果:返回T的深度。 Root(T); 初始条件:二叉树T存在。 操作结果:返回T的根。 Value(T,e); 初始条件:二叉树T存在,e是T中的某个结点。 操作结果:返回e的值。 Assign(T,&e,value); 初始条件:二叉树T存在,e是T中的某个结点。 操作结果:结点e赋值为value。 Parent(T,e);

c语言的基本数据类型及其表示

3.2 C语言的基本数据类型及其表示 C语言的基本数据类型包括整型数据、实型数据和字符型数据,这些不同数据类型如何表示?如何使用?它们的数据范围是什么?下面我们分别进行介绍。 3.2.1 常量与变量 1. 常量 常量是指程序在运行时其值不能改变的量,它是C语言中使用的基本数据对 象之一。C语言提供的常量有: 以上是常量所具有的类型属性,这些类型决定了各种常量所占存储空间的大小和数的表示范围。在C程序中,常量是直接以自身的存在形式体现其值和类型,例如:123是一个整型常量,占两个存储字节,数的表示范围是-32768~32767;123.0是实型常量,占四个存储字节,数的表示范围是-3.4 10-38~3.4 1038。 需要注意的是,常量并不占内存,在程序运行时它作为操作对象直接出现在运算器的各种寄存器中。 2.符号常量 在C程序中,常量除了以自身的存在形式直接表示之外,还可以用标识符来表示常量。因为经常碰到这样的问题:常量本身是一个较长的字符序列,且在程序中重复出现,例如:取常数的值为3.1415927,如果在程序中多处出现,直接使用3.1415927的表示形式,势必会使编程工作显得繁琐,而且,当需要把的值修改为3.1415926536时,就必须逐个查找并修改,这样,会降低程序的可修改性和灵活性。因此,C语言中提供了一种符号常量,即用指定的标识符来表示某个常量,在程序中需要使用该常量时就可直接引用标识符。 C语言中用宏定义命令对符号常量进行定义,其定义形式如下: #define 标识符常量 其中#define是宏定义命令的专用定义符,标识符是对常量的命名,常量可以是前面介绍的几种类型常量中的任何一种。该使指定的标识符来代表指定的常量,这个被指定的标识符就称为符号常量。例如,在C程序中,要用PAI代表实型常量3.1415927,用W代表字符串常量"Windows 98",可用下面两个宏定义命令: #define PAI 3.1415927

常用的标准数据类型

《C语言的基本数据类型》述课稿 芮城县第一职业学校任中左 尊敬的评委老师,早上好! 今天,我述课的题目是《C语言的基本数据类型》,下面我从教材分析、学情分析、教学目标、教学重点、难点、教学与学法、教学设计六个方面来说明本课,请各位老师提出宝贵意见。 一、教材分析 本节是《C语言程序设计》教材的第二章第一节内容,C 语言是为数不多的与国外保持内容同步的课程之一,是许多后续专业课程的基础,学好C语言对学生今后从事软件开发工作有着重要的基础意义。而数据类型又是学习C语言编程的基础。在教学中我以应用为背景、以知识为主线、以提高能力和兴趣为目的,变应试为应用。 通过本章节内容的学习旨在让学生明确C语言程序处理的数据对象是有类型的;不同类型数据的表示形式、取值范围、占用内存空间的大小及可参与的运算种类也是不同的。学好C语言基本数据类型,对以后构造数据类型的学习和程序设计起到至关重要的作用。 二、学情分析 职业学校的教学目标旨在培养熟练的技能型人才,职业学校的学生他们关注更多的是实际问题以及问题的解决方法。所以教学应从他们的兴奋点入手,注重理论和实践的有机结合,教学要注重实例化,这样很容易引起学生共鸣,提高教学效果。 三、教学目标 根据上述教材分析,考虑到职业学校学生的认知结构和心理特征,制定如下教学目标: (1)知识目标:①基本数据类型的分类 ②整型数据在内存中的存储形式 ③整型常量三种表示方法 ④实型数据在内存中的存储形式 ⑤实型常量两种表示方法 (2)能力目标:①培养学生自主探究能力 ②培养学生发现问题、分析问题、解决问题的能力 ③在小组合作学习中,培养学生团结协作能力 (3)情感目标:①培养学生热爱学习,勤于思考的品德 ②培养学生谦虚诚恳、关心帮助他人的品质 四、教学重点、难点 本节的重点内容为①基本数据类型的分类 ②整型常量三种表示方法

抽象数据类型

数据结构实验报告 1.实验题目 抽象数据类型 2.需求分析 本演示程序用TC编写,完成复数的加、减、乘、除四则运算,并获取和设置复数实、虚部,初始化等操作。 ① 输入的形式和输入值的范围:输入的实部和虚部需为两个单精度的实数。Complex 该结构类型中包括两个基本元素,分别是浮点类型的real和浮点类型的imag。 ②输出的形式:他们的结果是复数类型,返回值为单精度实数。根据复数抽象类型定义中所指的基本操作,定义并实现复数初始化,实部、虚部的获取和设置函数,并根据复数抽象类型定义中所指的基本运算,定义并实现复数的加、减、乘、除四则运算,并输出他们的结果。 ③程序所能达到的功能:完成复数的加、减、乘、除四则运算,并获取和设置复数实、虚部,初始化等操作。 ④测试数据: A.第一个复数的实部为:6.000000 ,虚部为33.000000. B.第二个复数的实部为:3.600000,虚部为7.400000. C.两个复数之和:9.600000 40.400002. D.两个复数之差:2.400000 25.600000. E.两个复数乘积:-222.600006 163.199997. F. 两个复数的商:3.924985 1.098641. 3.概要设计 1)为了实现上述程序功能,首先需要定义抽象数据类型的复数例: ADT Complex { 数据对象:D={real,imag|e1,e2为实数} 数据关系:R={} 基本操作: P:float SetReal(Complex x,float real) 赋值参数:所要操作的复数x和将为复数x赋的实部real. 操作结果:复数x的实部设置为real. float SetImag(Complex x,float imag) 赋值参数:所要操作的复数x和将为复数赋的实部imag. 操作结果:复数x 的虚部设置为imag. Complex add(Complex x,Complex y) 赋值参数:所要相加的两个复数x,y. 操作结果:返回两个复数x与y的和. Complex sub(Complex x,Complex y) 赋值参数:相减操作的被减数x,减数y. 操作结果:返回复数x-y的结果 Complex multi(Complex x,Complex y) 赋值参数:相乘操作的被乘数x,乘数y. 操作结果:返回两个复数x与y的乘积. Complex except(Complex x,Complex y)

PLC基本数据类型

一、基本数据类型 1、位(bit) 常称为BOOL(布尔型),只有两个值:0或1。如:I0.0,Q0.1,M0.0,V0.1等。 2、字节(Byte) 一个字节(Byte)等于8位(Bit),其中0位为最低位,7位为最高位。如:IB0(包括I0.0~I0.7位),QB0(包括Q0.0~Q0.7位),MB0,VB0等。范围:00~FF(十进制的0~255)。 3、字(Word) 相邻的两字节(Byte)组成一个字(Word),来表示一个无符号数,因此此,为16位。如:IW0由IB0和IB1组成的,其中I是区域标识符,W表示字,0是字的起始字节需要注意的是,字的起始字节(如上例中的“0”)都必须是偶数。字的范围为十六进制的0000~ FFFF(即十进制的0~65536)。在编程时要注意,如果已经用了IW0,如再用IB0或IB1 要特别加以小心。 4、双字(Double Word) 相邻的两个字(Word)组成一个双字,来表示一个无符号数。因此,双字为32位。如: MD100是由MW100和MW102组成的,其中M是区域标识符,D表示双字,100是双字的起始字节。需要注意的是,双字的起始字节(如上例中的“100”)和字一样,必须是偶数。双字的范围为十六进制的0000~FFFFFFFF(即十进制的0~4294967295)。在编程时要注意,如果已经用了MD100,如再用MW100或MW102要特别加以小心。以上的字节、字和双字数据类型均为无符号数,即只有正数,没有负数。 5、16位整数(INT,Integer) 整数为有符号数,最高位为符号位,1表示负数,0表示正数。范围为-32768~32767。 6、32位整数(DINT,Double Integer) 32位整数和16位整数一样,为有符号数,最高位为符号位,1表示负数,0表示正数。范围为-2147483648~2147483647。 7、浮点数(R,Real) 浮点数为32位,可以用来表示小数。浮点数可以为:1.m×2e 二、复合数据类型 用户通过复合基本数据类型而生成就是复合数据类型。 复合数据类型包括以下几种: 1、数组(ARRAY) 将一组同一类型的数据组合在一起组成一个单位就是数组。 2、结构(STRUCT) 将一组同不同类型的数据组合在一起组成一个单位就是结构。 3、字符串(STRING) 字符串是由最多254个字符组成的一维数组。 4、日期和时间(DATE-AND-TIME) 用于存储年、月、日、时、分、秒、毫秒和星期的数据。占用8个字节,BCD编码。星期天代码为1,星期一~星期六代码分别是2~7。 如:DT#2004_07_15_12:30:15.200为2004年7月15日12时30分15.2秒。 5、用户定义的数据类型(UDT,User-Defined Data Types) 由用户将基本数据类型和复合数据类型组合在一起形成的数据类型。 可以在数据块DB和变量声明表中定义复合数据类型。

相关文档
最新文档