收藏 分享(赏)

C++程序设计教程3.ppt

上传人:saw518 文档编号:4528857 上传时间:2019-01-02 格式:PPT 页数:31 大小:93KB
下载 相关 举报
C++程序设计教程3.ppt_第1页
第1页 / 共31页
C++程序设计教程3.ppt_第2页
第2页 / 共31页
C++程序设计教程3.ppt_第3页
第3页 / 共31页
C++程序设计教程3.ppt_第4页
第4页 / 共31页
C++程序设计教程3.ppt_第5页
第5页 / 共31页
点击查看更多>>
资源描述

1、00:54:59,1,C + 程序设计教程(第二版),第三章 数据类型 Chapter 3 Data Types,清华大学出版社 钱 能,00:54:59,2,数据类型: 一定的数据在计算机的内部表示; 该数据所表示的值的集合; 在该数据上的一系列操作。内部数据类型:1.整型 长整型,短整型,字符型,布尔型2.浮点型 单精度,双精度,00:54:59,3,第三章内容,整型 ( int Types ) 整型子类 ( sub-int Types ) 浮点型 ( Floating-Point Type ) C-串与string ( C-string & string )数组 ( Arrays ) 向

2、量 ( vectors ) 指针与引用 ( Pointer & References ),00:54:59,4,1. 整型 ( int Types ),整型数的内部表示:二进制补码位数既定的二进制补码运算没有加减的区别;对于溢出,只是简单的舍弃而不是错误整型数的表示范围:取决于二进制位数整型数的操作:+,-,*,/,%,=,!,=,=,=,&,|,&=,|=,&,|,&=,|=,!=,=,+=,-=,*=,/=,%=,+,-,,,? :,00:54:59,5,编译器的机器字长总是与整型的位长有关如: 32位编译器的整型数一定为32位长 整型字面值分八进制,十进制和十六进制不同表示如: 0123

3、 / 8进制 0x12af3 / 16进制 12345 / 10进制 超过表示范围的整型数其值不可预料或者出错如: int a = 12345678912345678912345; / 错,00:54:59,6,. 整型子类( Sub-int Types ),字符型:表示范围:有符号:-128127无符号:0255输出形式与整型数不同:int a = 65;char b = 65;couta“n”;coutb“n”;结果为:65A,00:54:59,7,枚举型:自定义整数区间,甚至列举单个整数值enum Week Mon, Tue, Wed, Thu, Fri, Sat, Sun ;最大特点是

4、可以给每个值指定一个在程序中直接使用的标记(枚举符)编程中将其当作整数常量用如:int a = 7;if ( a = Sun) cout “Sundayn”;,00:54:59,8,布尔型:表示范围仅含整数和1,也可以表示成true和false,相当于:enum bool false, true ;因为条件表达式、逻辑运算的结果都是或,所以,相当大数量的表达式的值与布尔型对应,00:54:59,9,3. 浮点型 ( Floating-Point Types ),浮点数的内部表示:国际标准IEEE754浮点表示法,它与编程所用的浮点数字面量以及输出的十进制浮点数之间有一个转换关系 浮点数的表示范

5、围:32位浮点数3.4103864位浮点数1.810308 浮点数的操作:常规的加、减、乘、除等操作,00:54:59,10,4. C-串与string ( C-string & string ),C-串结构每个字符占据1个字节一个C-串是一个字符序列,用来表示各种名字或者文字说明C-串的字符序列的最后总是添加有一个结束标志.即在6个字符的字串(“Hello!”)其空间存储有7个字节左边三图是不同细节的同一空间结构描述,Hello!0,72 101 108 108 111 33 0,00:54:59,11,知道了C-串首地址,即可知道整个串,所以可以藉字符首址(字符指针)来操作C-串,但要注意

6、,串的第一个字符与整个串的操作不同,如,C-串的输出操作:char* str = ”Hello”;cout *str endl; / 显示Hcout str endl; / 显示Hello,00:54:59,12,C-串不能直接比较,因为字符指针的比较只是地址值的比较而不是C-串的字典序比较:cout(“join”=”join” ? ” : ”not “)”equaln”; / 字面值比较char* str1=”good”;char* str2=”good”;cout(str1=str2 ? ” : ”not “)”equaln”; / 字符指针比较char buffer16=”Hello”;

7、char buffer26=”Hello”;cout(buffer1=buffer2 ? ” : ”not “)”equaln”; / 字符数组比较结果:not equalnot equalnot equal,00:54:59,13,不得不配备专门操作C-串的库函数:strcpy(s1, s2); /从s2拷贝到s1 strcmp(s1, s2); /比较s1与s2 strcat(s1, s2); /连接s2到s1 strrev(s); /将s倒排 strset(s, c); /将s全置为c strstr(s, “ell”); /查找s中的子串 strchr(s,c); /查找s中的字符等等,

8、00:54:59,14,但字符指针操作C-串的安全性受到质疑:char* str1; char* str2 = new char5; strcpy(str2, ”ugly”); strcpy(str1,str2); / 错: str1没有空间可储 strcpy(str2, ”Hello”); / 错: str2空间不够大 str2 = ”Hello”; / 错:原来的”ugly”空间脱钩,导致内存泄漏根源:复制操作须以足够的目的地空间为前提,而所有C-串操作的空间调配都是人为安排的,C-串库函数一概不管,00:54:59,15,类串string串类自定义串 对应字符指针的C-串操作:strin

9、g a, s1 = “Hello “;string s2 = “123“;a = s1; / copycout(a=s1 ? “ : “ not“)“equaln“; / comparecouta+s2endl; / concatenatereverse(a.begin(), a.end();coutaendl; / reversecouta.replace(0,9,9,c)endl; / setcout(s1.find(“ell“)!= -1 ? “ : “not “)“foundn“;/ find stringcout(s1.find(c)!= -1 ? “: “not “)“foundn

10、“; / find char,00:54:59,16,输入C-串的string承载方式: cin的读入方式总是将前导的空格(所谓空格,即包括空格、回车、水平或垂直制表符等)滤掉,将单词读入,在遇到空格时结束本次输入 getline总是将行末的回车符滤掉,将其整行输入对字串”Hello, How are you?”的两种输入方式for ( string s; cins; )couts” “;coutendl;string s;getline(cin, s);coutsendl;,00:54:59,17,string流:将string实体看作是一个输入设备给一个像cin这样的取名,作为流来操作,会

11、很有用例如,如果一个文件aaa.txt,有若干行,每行中含有不知道几个的整数,要输出每行的整数和:ifstream in ( “aaa.txt“ ) ;for ( string s ; getline ( in, s ) ; ) int a, sum=0 ;for ( istringstream sin ( s ) ; sin a ; sum += a ) ;cout sum “n” ;,00:54:59,18,5. 数组( Arrays ),数组是同类元素的集合,它的元素排列在连续的空间中,按下标来标记 描述数组必须给出元素类型,元素个数 元素个数必须在编程时确定,任何变量都不允许int a

12、a ; / 表示int a97;int n = 100 ;int an ; / 错: 元素个数必须预知const int n = 100 ;int an ; / okint a ; / 错: 无元素个数int a = 1, 2, 3, 4, 5 ; / ok:通过初始化确定元素个数,00:54:59,19,数组初始化可选,但须遵循语法无初始化的数组按规定取默认值int array15 = 1, 2, 3, 4, 5, 6 ; / 错: 初始值个数超元素个数 int array25 = 1, , 2, 3, 4 ; / 错: 不能以逗号方式省略 int array35 = 1, 2, 3, ;

13、/ 错: 同上 int array45 = ; / 错: 初始值不能为空 int array55 = 1, 2, 3 ; / ok: 后面元素取0 int array65 = 0 ; / ok: 元素全为0 int array75 ; / ok: 元素值不确定 int a35 = 1, 2, 3, 4, 5 , 2, 3, 4, 5, 6 , 3, 4, 5, 6, 7 ;,00:54:59,20,数组有诸多缺陷,造成编程艰难和不安全int a5 = 1,2,3,4,5, c5;int b5 = a; / 错:无法拷贝创建c = a; / 错:无法整体拷贝和局部拷贝a8 = 10; / 错:无

14、法动态扩容和随意增减元素for(int i=0; i=5; +i) / 错:无法防范下标溢出ai = i+1; if(a=c) a0 = 2; / 错:不可比较int a5 = 1; / 初始化呆板,无法获得全初值,00:54:59,21,二维数组的初始化,下标访问及输出int array123=1,2,3,4,5;int array223=1,2,4;cout“array1: “;for(int i=0; i2; +i)for(int j=0; j3; +j)coutarray1ij“,“;cout“narray2: “;for(int i=0; i2; +i)for(int j=0; j3

15、; +j)coutarray2ij“,“;cout“n“;结果为:array1: 1,2,3,4,5,0,array2: 1,2,0,4,0,0,00:54:59,22,.向量( vector ),向量与数组的共同特征是元素的排列在逻辑上是线性序列结构,可以用下标进行访问向量可以按需创建,拷贝创建,局部拷贝创建,异类拷贝和创建灵活的初始化随意扩容和元素增减可通过异常来进行下标溢出追踪和处理可比较等等,00:54:59,23,int n=10; int t5=1,2,3,4,5; vector a(n); /按需创建 vector b(10, 1); /元素赋全,灵活的初始化 vector c(

16、b); / 整体拷贝创建 vector f(t, t+5); /异类拷贝创建 vector d(b.begin(), b.begin()+3); /局部拷贝创建d为b的前个元素 a.assign(100); /动态扩容至100个元素,00:54:59,24,向量常用操作a.assign(b.begin(), b.begin()+3); / b的前3个元素赋给a a.assign(4,2); / a向量含4个元素,全初始化为2 int x = a.back(); / a的最后一个元素赋给变量x a.clear(); / a向量清空(不再有元素) if(a.empty() cout”empty”;

17、 / a判空操作 int y = a.front(); / a的第一个元素赋给变量y a.pop_back(); / 删除a的最后一个元素 a.push_back(5); / a最后插入一个元素,其值为5 a.resize(10); / a元素个数调至10。多删少补,其值随机 a.resize(10,2);/a元素个数调至10。多删少补,新添元素初值为2 if(a=b) cout”equal”; / a与b的向量比较操作,00:54:59,25,向量操作尤其适合于函数参数传递(-D以上的数组参数的传递十分丑陋):传递一个矩阵,无论其每行中的元素个数不同.输出之:typedef vector M

18、at;void print(const Mat ,00:54:59,26,7. 指针与引用 ( Pointers & Reference ),指针指向存放数据的地址 指针必须初始化或者赋值(指向了数据)后,才能进行间接访问(间访)操作int* ip; int iCount = 18; int* iPtr = / 间访操作,00:54:59,27,指针操作与指向数据的类型密切相关 float f = 34.5; int* ip = reinterpret_cast( 结果为: fAddr: 1245064=34.5 iAddr: 1245064=1107951616 int: 100 float

19、: 1.4013e-43,00:54:59,28,指针加减整数的操作表示空间位置上的挪动 但是挪动的字节数与其数据类型相关: 对float指针加6实际增加了24个字节 对long int指针加5实际增加了20个字节 对char指针减7实际减少了7个字节 对double指针减2实际减少了16个字节,00:54:59,29,数组名本身就是表示元素集合的首地址 可以将数组名赋给指针 int a3; for(int i=0; i3; +i) ai = i*2; for(int* iP=a; iPa+3; iP+=1) coutiP“: ”*iP“n”; 结果为: 1245036: 0 1245040: 2 1245044: 4,00:54:59,30,指针限定 const int a = 78; int b = 10; int c = 18; const int* ip = / ok,00:54:59,31,引用必须初始化,因为引用总是附属于某个实体 int someInt = 5; int 结果为: 8 引用多用在函数参数的传递上,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 网络科技 > C/C++资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报