单片机教学第2章数据类型.ppt

上传人:sh****n 文档编号:12817192 上传时间:2020-05-26 格式:PPT 页数:94 大小:262.50KB
返回 下载 相关 举报
单片机教学第2章数据类型.ppt_第1页
第1页 / 共94页
单片机教学第2章数据类型.ppt_第2页
第2页 / 共94页
单片机教学第2章数据类型.ppt_第3页
第3页 / 共94页
点击查看更多>>
资源描述
2020年5月26日9时16分,1,第2章C+数据类型,2.1数据类型2.2常量2.3变量2.4运算符与表达式2.5复合数据类型,C+程序设计,2020年5月26日9时16分,2,数据类型是指定义了一组数据以及定义在这一组数据的操作,它是程序中最基本的元素。C+数据类型十分丰富,大体上可分为基本类型、复合数据类型两种。,2020年5月26日9时16分,3,2.1数据类型,2.1.1基本类型基本数据类型有六种:整型(int)、浮点型(float)、字符型(char)、双精度浮点型(double)、逻辑型(bool)和无值型(void)。整型数在计算机内部一般采用定点表示法,用于存储整型量。(如123,-7等),存储整数的位数依机器的不同而异。浮点数和整数不同的地方是浮点数采用的是浮点表示法,也就是说,浮点数的小数点的位置不同,给出的精度也不相同。字符类型表示单个字符,一个字符用一个字节存储。逻辑类型,也称布尔类型,表示表达式真和假。无值型数据一般表示函数无值返回。,2020年5月26日9时16分,4,整型int:2字节-3276832767无符号整型unsignedint:2字节065535字符型char:1字节-128127浮点型float:4字节3.4e-383.4e38双精度型double:8字节1.7e-3081.7e308,C+提供的数据类型,2020年5月26日9时16分,5,使用sizeof()运算符求字节数,voidmain()coutThesizeofanintis:sizeof(int)bytesn;coutThesizeofashortintis:sizeof(short)bytesn;coutThesizeofalongintis:sizeof(long)bytesn;coutThesizeofacharis:sizeof(char)bytesn;coutThesizeofafloatis:sizeof(float)=(右移赋值),a+=a;表示a=(a+a)=(12+12)=24;又例如:inta=12;a+=a-=a*=a;表示a=a*a/a=12*12=144a=a-a/a=144-144=0a=a+a/a=0+0=0,2020年5月26日9时16分,31,2.3.3关系运算符(1)关系运算符用于两个值进行比较,运算结果为true(真)或false(假),分别用值非0(true)或0(false)表示。C+中的关系运算符如下:(大于),=(大于等于),=(等于),!=(不等于),(2)关系运算符都是双目运算符,其结合性是从左到右,、=运算符的优先级相同,=和!=运算符的优先级相同,前者运算的优先级高于后者。(3)关系运算符的优先级低于算术运算符。例如:a+bc等价于(a+b)ca!=bc等价于a!=(bc),2020年5月26日9时16分,32,逻辑运算符b=a+;等价于b=a;a=a+1;inta=3;b=a-;等价于b=a;a=a-1;(运算符后置用法,代表先使用变量,然后对变量增值)inta=3;b=+a;等价于a=a+1;b=a;inta=3;b=-a;等价于a=a-1;b=a;(运算符前置用法,代表先对变量增值,再使用变量),2020年5月26日9时16分,35,(4)C+编译器在处理时尽可能多的自左向右将运算符结合在一起。例如:a+b表示为(a+)+b而不是a+(+b)。,2020年5月26日9时16分,36,2.3.5条件运算符(1)条件运算符“?:”是C+中唯一三目运算符,其形式为:表达式1?表达式2:表达式3它的运算方式为:先计算表达式1的值,如果其值为非0(真),则表达式2的值就是整个表达式的最终结果;否则表达式3的值就是整个表达式的值。常见的一个例子为:max=(ab)?a:b)上面例子定义了一个求两个数a和b中最大值,其中决定哪一个是最大值用了条件运算符。,2020年5月26日9时16分,37,(2)条件运算符的结合性是自右向左。例如有以下条件表达式:ab?a:cd?c:d相当于ab?a:(cd?c:d)(3)条件运算符的优先级别高于赋值运算符,低于关系运算符和算术运算符。例如有:ab?a-b:b-a相当于ab?(a-b):(b-a),2020年5月26日9时16分,38,2.3.6位运算符(1)位(bit)是计算机中表示信息的最小单位,一般用0和1表示。一个字符在计算机中用8个位表示,8个位组成一个字节。C+语言需要将人们通常所习惯的十进制数表示为二进制、八进制或十六进制数来理解对位的操作。C+中所有的位运算符如下:(按位求反),(右移),a+b,b+c,c+a;则先求解a+b,再求解b+c,最后求解c+a,整个表达式的结果为c+a的结果。,2020年5月26日9时16分,41,2.3.8运算符优先级(1)运算符优先级决定了在表达式中各个运算符执行的先后顺序。高优先级运算符先于低优先级运算符进行运算。在优先级相同的情形下,则按从左到右的顺序进行运算。(2)当表达式中出现了括号时,会改变优先级。先计算括号中的子表达式值,再计算整个表达式的值。相关教材列出了C+的所有运算符集,依优先级从高到低排列。,2020年5月26日9时16分,42,(3)运算符的结合方式有两种:左结合和右结合。左结合表示运算符优先与其左边的标识符结合进行运算,如加法;右结合表示运算符优先与其右边的标识符结合,如单目运算符+、-。(4)同一优先级的优先级别相同,运算次序由结合方向决定。如1*2/3,*和/的优先级别相同,其结合方向自左向右,则等价于(1*2)/3。(5)不同的运算符要求有不同的运算对象个数,单目运算符只需一个运算对象,如i+,-a,sizeof(b)等。,2020年5月26日9时16分,43,优先级排列表,2020年5月26日9时16分,44,(续),2020年5月26日9时16分,45,2.3.9表达式表达式是用于计算的式子,它由运算符、运算数和括号组成。最简单的表达式只有一个常量或变量,当表达式中有两个或多个运算符时,表达式称为复杂表达式,其中运算符执行的先后顺序由它们的优先级和结合性决定。执行表达式所规定的运算,所得到的结果值便是表达式的值。C+中由于运算符很丰富,因此表达式的种类也很多。常用的表达式有6种。,2020年5月26日9时16分,46,1.算术表达式由算术运算符和位操作运算符组成的表达式。其表达式的值是一个数值,表达式的类型由运算符和运算数确定。例如,a+3*(b/2)就是一个算术表达式。2.逻辑表达式由逻辑运算符组成的表达式。其表达式的值的类型为逻辑型,一般地,真用1表示,假用0表示。例如,!aprintf(int)f=%dn,(int)f);/*将f的结果强制转换为整型,输出*/printf(f=%fn,f);/*输出f的值*/结果:(int)f=5f=5.750000,2020年5月26日9时16分,53,2.5.1枚举类型enum类型又称枚举类型,它是一种由用户参与定义的类型。所谓“枚举”是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。如果一个变量只有几种可能的值,可以定义为枚举类型。,2.5复合数据类型,2020年5月26日9时16分,54,定义枚举的方法:enum枚举名符号表;如:enumweekdaySum,Mon,Tue,Wed,Thu,Fri,Sat;上述定义中定义了Sum,Mon,Tue等7个符号,分别表示星期日、星期一、星期二星期六。有了上述定义,weekday本身就成为一个类型说明符,因而可以像char、int那样用于定义变量或函数,例如:weekdayw1,w2=Sat;,2020年5月26日9时16分,55,枚举型与整型的关系:枚举中的符号与整数有一一对应的关系,因此枚举中的符号可以像一般整数那样使用。如:Sun0Mon1Sat6也可以任意规定其对应关系,例如:enumweekdaySun,Mon=2,Tue,Wed=5,Thu,Fri,Sat此时:Sun=0Mon=2Tue=3Wed=5Sat=8,2020年5月26日9时16分,56,n个枚举值全未赋常量值时,它们自左至右分别与整数0n-1对应。若第i个枚举值赋常量值为整数m,则其未赋常量值的后续枚举值陆续递增,直到下一个赋了值的枚举值或结束。枚举类型变量只能赋予其值表中的值,且不能直接赋予数值。同一枚举中的枚举子的取值不需要唯一。,关于enum类型有四点说明:,2020年5月26日9时16分,57,枚举的用途,写程序时,我们常常需要为某个对象关联一组可选属性,例如:学生的成绩分A,B,C,D等,天气分sunny,cloudy,rainy等等。当然,不用枚举常量而直接用常数代表A,B,C,D等也可以。但是:(1)用枚举变量更直观,因为枚举元素都选用了令人“见名知意”的标识符。(2)枚举变量的值限制在定义时规定的几个枚举元素范围内,如果赋予它一个其他的值,就会出现错误信息,便以检查。,2020年5月26日9时16分,58,2.4.2结构体,在实际的处理对象中,有许多信息是由多个不同类型的数据组合在一起进行描述,而且这些不同类型的数据是互相联系组成了一个有机的整体。此时,就要用到一种新的构造类型数据结构体(structure),简称结构。结构体的使用为处理复杂的数据结构(如动态数据结构等)提供了有效的手段,而且,它们为函数间传递不同类型的数据提供了方便。,2020年5月26日9时16分,59,定义一个结构体类型的一般形式为:struct结构体名数据类型成员名1;数据类型成员名2;:数据类型成员名n;在大括号中的内容也称为“成员表列”或“域表”。其中,每个成员名的命名规则与变量名相同;数据类型可以是基本变量类型和数组类型,也可以是指针变量类型,或者是一个结构体类型;用分号“;”作为结束符。整个结构的定义也用分号作为结束符,,2020年5月26日9时16分,60,例如:定义一个职工worker结构体如下:structworkerlongnumber;charname20;charsex;intage;/age是成员名floatsalary;charaddress80;charphone20;/注意分号不要省略intage=10;/age是变量名,2020年5月26日9时16分,61,结构体类型中的成员名可以与程序中的变量名相同,二者并不代表同一对象,编译程序可以自动对它们进行区分。最后,总结一下结构体类型的特点:(1)结构体类型是用户自行构造的。(2)它由若干不同的基本数据类型的数据构成。(3)它属于C+语言的一种数据类型,与整型、实型相当。因此,定义它时不分配空间,只有用它定义变量时才分配空间。,2020年5月26日9时16分,62,结构体类型变量的定义方法,结构体只是用户自定义的一种数据类型,因此要通过定义结构体类型的变量来使用这种类型。通常有三种形式来定义一个结构体类型变量,分别说明如下:先定义结构体类型再定义变量名这是C+语言中定义结构体类型变量最常见的方式,一般语法格式如下:struct结构体名成员表列;struct结构体名变量名;,2020年5月26日9时16分,63,例如,定义几个职工变量:structworkerlongnumber;charname20;charsex;intage;floatsalary;charaddress80;charphone20;structworkerworker1,worker2;,2020年5月26日9时16分,64,注意:“structworker”代表类型名,不能分开写为:structworker1,worker2;/错误,没有指明是哪种结构体类型或workerworker1,worker2;/错误,没有struct关键字/系统不认为worker是结构体类型为了使用上的方便,程序员通常用一个符号常量代表一个结构体类型。即在程序开头加上下列语句:#defineWORKERstructworker;这样在程序中,WORKER与structworker完全等效。,2020年5月26日9时16分,65,例如:WORKERlongnumber;charname20;charsex;intage;floatsalary;charaddress80;charphone20;WORKERworker1,worker2;此时,可以直接用WORKER定义worker1、worker2两个变量,而不必再写关键字struct。,2020年5月26日9时16分,66,如果程序规模比较大,往往将对结构体类型的定义集中写入到一个头文件(以.h为后缀)中。哪个源文件需用到此结构体类型则可用#include命令将该文件包含到本文件中。这样做便于程序的修改和使用。在定义类型的同时定义变量这种形式的定义的一般形式为:struct结构体名成员表列;变量名;,2020年5月26日9时16分,67,例如:structworkerlongnumber;charname20;charsex;intage;floatsalary;charaddress80;charphone20;worker1,worker2;此例与前例作用相同,都定义了两个变量worker1、worker2,它们是结构体类型structworker。,2020年5月26日9时16分,68,直接定义结构类型变量其一般形式为:struct/没有结构体名成员表列变量名;,2020年5月26日9时16分,69,例如:structlongnumber;charname20;charsex;intage;floatsalary;charaddress80;charphone20;worker1,worker2;,2020年5月26日9时16分,70,一个结构体变量占用内存的实际大小,也可以利用sizeof运算求出。它的运算表达式为:sizeof(运算量)/求出给定的运算量占用内存空间的字节数其中运算量可以是变量、数组或结构体变量,也可以是数据类型的名称。例如:sizeof(structworker)sizeof(worker1),2020年5月26日9时16分,71,结构体变量的使用形式在定义了结构体变量以后,就可以使用这个变量。结构体变量是不同数据类型的若干数据的集合体。在程序中使用结构体变量时,一般情况下不能把它作为一个整体参加数据处理,而参加各种运算和操作的是结构体变量的各个成员项数据。结构体变量的成员用以下一般形式表示:结构体变量名.成员名例如,上节给出的结构体变量worker1具有下列七个成员:worker1.number;worker1.name;worker1.sex;worker1.age;worker1.salary;worker1.address;worker1.phone,2020年5月26日9时16分,72,在定义了结构体变量后,就可以用不同的赋值方法对结构体变量的每个成员赋值。例如:strcpy(worker1.name,”ZhangSan”);worker1.age=26;strcpy(worker1.phone,”1234567”);worker1.sex=m;:除此之外,还可以引用结构体变量成员的地址以及成员中的元素。例如:引用结构体变量成员的首地址但是可以如下引用:coutwan.name;,2020年5月26日9时16分,74,(2)如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级成员。只能对最低级的成员进行赋值或存取以及运算。例如,对上面定义的结构体类型变量worker1,可以这样访问各成员:worker1.ageworker1.nameworker1.birthday.yearworker1.birthday.monthworker1.birthday.day注意:不能用worker1.birthday来访问worker1变量中的成员birthday,因为birthday本身是一个结构体变量。,2020年5月26日9时16分,75,(3)对成员变量可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。例如:worker2.age=worker1.age;sum=worker1.age+worker2.age;worker1.age+;(4)在数组中,数组是不能彼此赋值的,而结构体类型变量可以相互赋值。在C+程序中,同一结构体类型的结构体变量之间允许相互赋值,而不同结构体类型的结构体变量之间不允许相互赋值,即使两者包含有同样的成员。,2020年5月26日9时16分,76,结构体变量的初始化与其他类型变量一样,也可以给结构体的每个成员赋初值,这称为结构体的初始化。有两种初始化形式,一种是在定义结构体变量时进行初始化,一般语法格式如下:struct结构体名变量名=初始数据表;另一种是在定义结构体类型时进行结构体变量的初始化。一般语法格式如下:struct结构体名成员表列;变量名=初始数据表;,2020年5月26日9时16分,77,例如,前述student结构体类型的结构体变量wan在说明时可以初始化如下:structstudentwan=”WanJun”,m,20,”SuZhouRoadNo.100”;它所实现的功能,与下列分别对结构体变量的每个成员赋值所实现的功能相同:strcpy(wan.name,”WanJun”);wan.sex=m;wan.age=20;wan.addr=”SuZhouRoadNo.100”;,2020年5月26日9时16分,78,2.4.3共用体,共用体的概念在C+语言中,不同数据类型的数据可以使用共同的存储区域,这种数据构造类型称为共用体,简称共用,又称联合体。共用体在定义、说明和使用形式上与结构体相似。两者本质上的不同仅在于使用内存的方式上。定义一个共用体类型的一般形式为:union共用体名成员表列;,2020年5月26日9时16分,79,例如:uniongyinti;charc;floatf;就定义了一个共用体类型uniongy,它由三个成员组成,这三个成员在内存中使用共同的存储空间。由于共用体中各成员的数据长度往往不同,所以共用体变量在存储时总是按其成员中数据长度最大的成员占用内存空间。如上述共用体类型uniongy的变量占用4个字节的内存。,2020年5月26日9时16分,80,在这一点上共用体与结构体不同,结构体类型变量在存储时总是按各成员的数据长度之和占用内存空间。例如,定义了一个结构体类型:structgyinti;charc;floatf;则结构体类型structgy的变量占用的内存为2+1+4=7个字节。,2020年5月26日9时16分,81,定义共用体类型变量的方法与定义结构体类型变量的方法相似,也有三种方法:1、union共用体名成员表列;变量表列;例如:uniongyinti;charc;floatf;a,b,c;,2020年5月26日9时16分,82,2、将共用体类型定义与共用体变量定义分开:uniongyinti;charc;floatf;uniongya,b,c;,3、直接定义共用体变量:unioninti;charc;floatf;a,b,c;,上面几种方法都是定义了一个共用体类型uniondata,又定义了几个共用体类型变量a,b,c。,2020年5月26日9时16分,83,与结构体类型,也可以定义共用体指针和共用体数组。union共用体名*共用指针名;union共用体名数组名元素个数;例如:uniongy*pu;uniongyu13;分别定义了共用体指针pu和共用体数组u13。,2020年5月26日9时16分,84,共用体变量的使用形式由于共用体变量的各个成员使用共同的内存区域,所以共用体变量的内存空间在某个时刻只能保持某个成员的数据。由此可知,在程序中参加运算的必然是共用体变量的某个成员,而不能直接使用共用体变量。共用体变量成员的表现形式与结构体相同,它们也使用访问成员运算符“.”和“-”表示。例如,前面定义了a,b,c为共用体类型变量,下面的使用形式是正确的:a.i引用共用体变量中的整型变量ia.c引用共用体变量中的字符变量ca.f引用共用体变量中的实型变量f,2020年5月26日9时16分,85,不能只引用共用体类型变量,例如:couta是错误的,a的存储区有好几种类型,分别占不同长度的存储区,仅写共用体类型变量名a难以使系统确定究竟输出的是那一个成员的值。应该写成couta.i或者couta.c等。在使用共用体类型变量的数据时要注意:在共用体类型变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。如有以下赋值语句:a.i=1;a.c=a;a.f=1.5;在完成以上三个赋值运算以后,a.f是有效的,a.i和a.c已经无意义了。,2020年5月26日9时16分,86,共用体类型变量可以向另一个相同共用体类型的变量赋值。此外,共用体类型变量可以作为参数传递给函数,也可以使用地址传送方式把共用体类型变量的地址作为参数在函数间传递。在程序中经常使用结构体与共用体相互嵌套的形式。即共用体类型的成员可以是结构体类型,或者结构体类型的成员是共用体类型。,2020年5月26日9时16分,87,例如,下列结构体类型datas的第三个成员是共用体类型:structdataschar*ps;inttype;unionfloatfdata;intidata;charcdata;udata;,2020年5月26日9时16分,88,2.4.4位域,紧缩结构体类型或者说位域允许我们用更少的空间存放所需要的数据。StructstatusUnsignedintgood;/只取0或1Unsignedintfail;/只取0或1Unsignedintbad;/只取0或1Intval;/取-100100;,2020年5月26日9时16分,89,用位域来重新说明:StructstatusUnsignedintgood:1;/只取0或1Unsignedintfail:1;/只取0或1Unsignedintbad:1;/只取0或1Intval:9;/取-100100,2020年5月26日9时16分,90,2.4.5用typedef定义自己的变量类型,格式:Typedef类型说明Eg:Typedefintwidth;Typedefcharstring10;使用自定义类型定义变量:Widthn;Stringname;,2020年5月26日9时16分,91,习题,#include#includevoidmain()coutsetw(2)ABsetw(4)ABsetw(5)ABendl;coutsetw(3)123setw(5)123setw(6)123endl;coutsetprecision(4)23.45678endl;coutsetprecision(5)23.45678endl;,程序输出结果:ABABAB12312312323.4623.457,2020年5月26日9时16分,92,#includevoidmain()cout将10输出为八进制数:oct10endl;cout将10输出为十六进制数:hex10endl;cout将10输出为十六进制数:10endl;cout将10输出为十进制数:dec10endl;cout将10输出为十制制数:10yz;/从键盘上输入三个任意的数maxv=max(x,max(y,z);/计算最大值minv=min(x,min(y,z);/计算最小值midv=(x+y+z)-(maxv+minv);/通过公式计算中间值cout最大值中间值最小值endl;coutmaxvmidvminvy)returnx;elsereturny;/*/*求最小值的函数的实现*/doublemin(doublex,doubley)if(xy)returnx;elsereturny;/*/,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!