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

上传人:qwe****56 文档编号:70106256 上传时间:2023-01-16 格式:PPT 页数:31 大小:93KB
返回 下载 相关 举报
钱能C++程序设计教程3.ppt_第1页
第1页 / 共31页
钱能C++程序设计教程3.ppt_第2页
第2页 / 共31页
点击查看更多>>
资源描述

《钱能C++程序设计教程3.ppt》由会员分享,可在线阅读,更多相关《钱能C++程序设计教程3.ppt(31页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

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

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

3、5 /10进制 超过表示范围的整型数其值不可预料或者出错如:int a=12345678912345678912345;/错1/15/20235.整型子类整型子类(Sub-int Types)字符型:表示范围:有符号:-128127 无符号:0255 输出形式与整型数不同:int a=65;char b=65;couta“n”;coutb“n”;结果为:65 A 1/15/20236枚举型:自定义整数区间,甚至列举单个整数值 enum Week Mon,Tue,Wed,Thu,Fri,Sat,Sun;最大特点是可以给每个值指定一个在程序中直接使用的标记(枚举符)编程中将其当作整数常量用如:in

4、t a=7;if(a=Sun)cout“Sundayn”;1/15/20237布尔型:表示范围仅含整数和1,也可以表示成true和false,相当于:enum bool false,true;因为条件表达式、逻辑运算的结果都是因为条件表达式、逻辑运算的结果都是或,所以,相当大数量的表达式的值与或,所以,相当大数量的表达式的值与布尔型对应布尔型对应1/15/202383.浮点型浮点型(Floating-Point Types)浮点数的内部表示:国际标准IEEE754浮点表示法,它与编程所用的浮点数字面量以及输出的十进制浮点数之间有一个转换关系浮点数的表示范围:32位浮点数3.41038 64位浮

5、点数1.810308浮点数的操作:常规的加、减、乘、除等操作1/15/202394.C-串与串与string(C-string&string)C-串结构每个字符占据1个字节一个C-串是一个字符序列,用来表示各种名字或者文字说明C-串的字符序列的最后总是添加有一个结束标志.即在6个字符的字串(“Hello!”)其空间存储有7个字节左边三图是不同细节的同一空间结构描述Hello!0 72 101 108 108 111 33 0010010000110010101101100011011000110111100100001000000001/15/202310知道了知道了C-C-串首地址串首地址,

6、即可知道整个串即可知道整个串,所所以可以藉字符首址以可以藉字符首址(字符指针字符指针)来操来操作作C-C-串串,但要注意,串的第一个字符但要注意,串的第一个字符与整个串的操作不同与整个串的操作不同,如如,C-,C-串的输串的输出操作出操作:char*str=”Hello”;cout *str endl;/显示显示H cout str endl;/显示显示Hello1/15/202311C-串不能直接比较,因为字符指针的比较只是地址值的比较而不是C-串的字典序比较:cout(“join”=”join”?”:”not“)”equaln”;/字面值比较 char*str1=”good”;char*s

7、tr2=”good”;cout(str1=str2?”:”not“)”equaln”;/字符指针比较 char buffer16=”Hello”;char buffer26=”Hello”;cout(buffer1=buffer2?”:”not“)”equaln”;/字符数组比较 结果:结果:not equal not equal not equal1/15/202312不得不配备专门操作C-串的库函数:nstrcpy(s1,s2);/从从s2拷贝到拷贝到s1nstrcmp(s1,s2);/比较比较s1与与s2nstrcat(s1,s2);/连接连接s2到到s1nstrrev(s);/将将s倒

8、排倒排 nstrset(s,c);/将将s全置为全置为cnstrstr(s,“ell”);/查找查找s中的子串中的子串nstrchr(s,c);/查找查找s中的字符中的字符 等等等等1/15/202313但字符指针操作C-串的安全性受到质疑:char*str1;char*str2=new char5;strcpy(str2,”ugly”);strcpy(str1,str2);/错:str1没有空间可储strcpy(str2,”Hello”);/错:str2空间不够大str2=”Hello”;/错:原来的”ugly”空间脱钩,导致内存泄漏根源:复制操作须以足够的目的地空间为前提,而所有C-串操作

9、的空间调配都是人为安排的,C-串库函数一概不管1/15/202314类串string串类自定义串对应字符指针的C-串操作:string a,s1=Hello;string s2=123;a=s1;/copy cout(a=s1?:not)equaln;/compare couta+s2endl;/concatenate reverse(a.begin(),a.end();coutaendl;/reverse couta.replace(0,9,9,c)endl;/set cout(s1.find(ell)!=-1?:not)foundn;/find string cout(s1.find(c)

10、!=-1?:not)的读入方式总是将前导的空格(所谓空格,即包括空格、回车、水平或垂直制表符等)滤掉,将单词读入,在遇到空格时结束本次输入ngetline总是将行末的回车符滤掉,将其整行输入对字串”Hello,How are you?”的两种输入方式 for(string s;cins;)couts”“;coutendl;string s;getline(cin,s);couts a;sum+=a);cout sum “n”;1/15/2023175.数组数组(Arrays)数组是同类元素的集合,它的元素排列在连续的空间中,按下标来标记描述数组必须给出元素类型,元素个数元素个数必须在编程时确定

11、,任何变量都不允许 int aa;/表示int a97;int n=100;int an;/错:元素个数必须预知 const int n=100;int an;/ok int a ;/错:无元素个数 int a =1,2,3,4,5 ;/ok:通过初始化确定元素个数1/15/202318数组初始化可选,但须遵循语法无初始化的数组按规定取默认值 nint array15=1,2,3,4,5,6 ;/错:初始值个数超元素个数nint array25=1,2,3,4 ;/错:不能以逗号方式省略nint array35=1,2,3,;/错:同上nint array45=;/错:初始值不能为空nint

12、array55=1,2,3 ;/ok:后面元素取0nint array65=0;/ok:元素全为0nint array75;/ok:元素值不确定nint a35=1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 ;1/15/202319数组有诸多缺陷,造成编程艰难和不安全 int a5=1,2,3,4,5,c5;int b5=a;/错:无法拷贝创建 c=a;/错:无法整体拷贝和局部拷贝 a8=10;/错:无法动态扩容和随意增减元素 for(int i=0;i=5;+i)/错:无法防范下标溢出 ai=i+1;if(a=c)a0=2;/错:不可比较 int a5=1;/初始化呆板,无法获

13、得全初值1/15/202320二维数组的初始化,下标访问及输出 int array123=1,2,3,4,5;int array223=1,2,4;coutarray1:;for(int i=0;i2;+i)for(int j=0;j3;+j)coutarray1ij,;coutnarray2:;for(int i=0;i2;+i)for(int j=0;j3;+j)coutarray2ij,;coutn;结果为:结果为:array1:1,2,3,4,5,0,array2:1,2,0,4,0,0,1/15/202321.向向量量(vector)向量与数组的共同特征是元素的排列在逻辑上是线性序列

14、结构,可以用下标进行访问 向量可以按需创建,拷贝创建,局部拷贝创建,异类拷贝和创建 灵活的初始化 随意扩容和元素增减 可通过异常来进行下标溢出追踪和处理 可比较 等等1/15/202322nint n=10;nint t5=1,2,3,4,5;nvector a(n);/按需创建nvector b(10,1);/元素赋全,灵活的初始化nvector c(b);/整体拷贝创建nvector f(t,t+5);/异类拷贝创建nvector d(b.begin(),b.begin()+3);/局部拷贝创建d为b的前个元素na.assign(100);/动态扩容至100个元素1/15/202323向量

15、常用操作na.assign(b.begin(),b.begin()+3);/b的前3个元素赋给ana.assign(4,2);/a向量含4个元素,全初始化为2nint x=a.back();/a的最后一个元素赋给变量xna.clear();/a向量清空(不再有元素)nif(a.empty()cout”empty”;/a判空操作nint y=a.front();/a的第一个元素赋给变量yna.pop_back();/删除a的最后一个元素na.push_back(5);/a最后插入一个元素,其值为5na.resize(10);/a元素个数调至10。多删少补,其值随机na.resize(10,2);

16、/a元素个数调至10。多删少补,新添元素初值为2nif(a=b)cout”equal”;/a与b的向量比较操作1/15/202324向量操作尤其适合于函数参数传递(-D以上的数组参数的传递十分丑陋):传递一个矩阵,无论其每行中的元素个数不同传递一个矩阵,无论其每行中的元素个数不同.输出之输出之:typedef vectorvector Mat;void print(const Mat&a)for(int i=0;ia.size();+i)for(int j=0;jai.size();+j)coutaij;coutendl;1/15/2023257.指针与引用指针与引用(Pointers&Ref

17、erence)指针指向存放数据的地址指针必须初始化或者赋值(指向了数据)后,才能进行间接访问(间访)操作nint*ip;nint iCount=18;nint*iPtr=&iCount;/初始化nip=&iCount;/赋值n*ip=8;/间访操作1/15/202326指针操作与指向数据的类型密切相关 float f=34.5;int*ip=reinterpret_cast(&f);cout“fAddr:”&f”f“n”;cout“iAddr:”ip”*ip“n”;*ip=100;cout“int:”*ip“n”;cout“float:”f34.5 iAddr:1245064=11079516

18、16 int:100 float:1.4013e-431/15/202327指针加减整数的操作表示空间位置上的挪动但是挪动的字节数与其数据类型相关:对float指针加6实际增加了24个字节对long int指针加5实际增加了20个字节对char指针减7实际减少了7个字节对double指针减2实际减少了16个字节1/15/202328数组名本身就是表示元素集合的首地址数组名本身就是表示元素集合的首地址可以将数组名赋给指针可以将数组名赋给指针 int a3;for(int i=0;i3;+i)ai=i*2;for(int*iP=a;iPa+3;iP+=1)coutiP“:”*iP“n”;结果为:1

19、245036:0 1245040:2 1245044:41/15/202329指针限定指针限定const int a=78;int b=10;int c=18;const int*ip=&a;/const修饰指向的实体类型常量指针int*const cp=&b;/const修饰指针*cp指针常量int const*dp=&b;/等价于上一句指针常量const int*const icp=&c;/常量指针常量*ip=87;/错:常量指针不能修改指向的常量,*ip只能做右值ip=&c;/ok:常量指针可以修改指针值*cp=81;/ok:指针常量可以修改指向的实体cp=&b;/错:指针常量不能修改指针值,即使是同一个地址*icp=33;/错:常量指针常量不能修改指向的常量icp=&b;/错:常量指针常量不能修改指针值int d=*icp;/ok1/15/202330引用必须初始化,因为引用总是附属于某引用必须初始化,因为引用总是附属于某个实体个实体int someInt=5;int&rInt=someIne;/初始化修改引用的值,即是修改了附属的实体值修改引用的值,即是修改了附属的实体值int a=5;int&ra=a;ra=8;couta“n”;结果为:8引用多用在函数参数的传递上引用多用在函数参数的传递上1/15/202331

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

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

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com