




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、15:12:131C + 程序设计教程(第二版)第三章 数据类型 Chapter 3 Data Types清华大学出版社 钱 能15:12:132n数据类型:u一定的数据在计算机的内部表示;u该数据所表示的值的集合;u在该数据上的一系列操作。n内部数据类型: 1.整型长整型,短整型,字符型,布尔型 2.浮点型单精度,双精度15:12:133第三章内容 整型整型 ( int Types ) 整型子类整型子类 ( sub-int Types ) 浮点型浮点型 ( Floating-Point Type ) C-串与串与string ( C-string & string ) 数组数组 ( Arra
2、ys ) 向量向量 ( vectors ) 指针与引用指针与引用 ( Pointer & References ) 15:12:1341. 整型整型 ( int Types )n整型数的内部表示:二进制补码 位数既定的二进制补码运算没有加减的区别;对于溢出,只是简单的舍弃而不是错误n整型数的表示范围:取决于二进制位数n整型数的操作:+,-,*,/,%,=,!,=,=,=,&,|,&=,|=,&,|,&=,|=,!=,=,+=,-=,*=,/=,%=,+,-,,,? :15:12:135编译器的机器字长总是与整型的位长有关如: 32位编译器的整型数一定为32位长整型字面值分八进制,十进制和十六进
3、制不同表示如: 0123 / 8进制 0 x12af3 / 16进制 12345 / 10进制 超过表示范围的整型数其值不可预料或者出错如: int a = 12345678912345678912345; / 错15:12:146. 整型子类整型子类( Sub-int Types )字符型:表示范围: char 有符号:-128127unSigned char 无符号:0255 输出形式与整型数不同: int a = 65; char b = 65; couta“n”; coutb“n”; 结果为: 65 A 15:12:147枚举型:enum 自定义整数区间,甚至列举单个整数值 enum
4、Week Mon, Tue, Wed, Thu, Fri, Sat, Sun ; 最大特点是可以给每个值指定一个在程序中直接使用的标记(枚举符) 编程中将其当作整数常量用如: int a = 4; if ( a =Fri) cout “Fridayn”; 15:12:148布尔型:bool表示范围仅含整数0和1,也可以表示成true和false,相当于: enum bool false, true ;因为条件表达式、逻辑运算的结果都是因为条件表达式、逻辑运算的结果都是或,所以,相当大数量的表达式的值与或,所以,相当大数量的表达式的值与布尔型对应布尔型对应15:12:1493. 浮点型浮点型 (
5、 Floating-Point Types )浮点数的内部表示: 国际标准IEEE754浮点表示法,它与编程所用的浮点数字面量以及输出的十进制浮点数之间有一个转换关系浮点数的表示范围:32位浮点数3.41038 64位浮点数1.810308浮点数的操作: 常规的加、减、乘、除等操作15:12:14104. C-串与串与string ( C-string & string )C-串结构每个字符占据1个字节一个C-串是一个字符序列,用来表示各种名字或者文字说明C-串的字符序列的最后总是添加有一个结束标志0.即在6个字符的字串(“Hello!”)其空间存储有7个字节左边三图是不同细节的同一空间结构描
6、述Hello!0 72 101 108 108 111 33 001001000011001010110110001101100011011110010000100000000n字符型为char, C-串的类型为char*,确切的说是const char*.nChar*称为字符指针,与字符数组操作上一样,都表示C-串的起始地址。15:12:141115:12:1412知道了知道了C-C-串首地址串首地址, ,即可知道整个串即可知道整个串, ,所所以可以藉字符首址以可以藉字符首址( (字符指针字符指针) )来操来操作作C-C-串串, ,但要但要注意注意,串的第一个字符,串的第一个字符与整个串的操
7、作不同与整个串的操作不同, ,如如,C-,C-串的输串的输出操作出操作: : char* str = ”Hello”; cout *str endl; / 显示显示H cout str endl; / 显示显示Hello15:12:1413C-串不能直接比较,因为字符指针的比较只是地址值的比较而不是C-串的字典序比较: cout(“join”=”join” ? ” : ”not “)”equaln”; / 字面值比较 charchar* str1=”good”; charchar* str2=”good”; cout(str1=str2 ? ” : ”not “)”equaln”; / 字符指
8、针比较 charchar buffer16=”Hello”; charchar buffer26=”Hello”; cout(buffer1=buffer2 ? ” : ”not “)”equaln”; / 字符数组比较 结果:结果:not equal not equal not equal15:12:1414C-串可以复制: char char* str1=”good”; charchar* str2= str1; /STR1和STR2共享”good”空间数组复制被禁止: char char buffer16=”Hello”; charchar buffer26=buffer16; /错,数
9、组不能复制 15:12:1415不得不配备专门操作C-串的库函数:nstrcpy(s1, s2); /从从s2拷贝到拷贝到s1nstrcmp(s1, s2); /比较比较s1与与s2nstrcat(s1, s2); /连接连接s2到到s1nstrrev(s); /将将s倒排倒排 nstrset(s, c); /将将s全置为全置为cnstrstr(s, “ell”); /查找查找s中的子串中的子串nstrchr(s,c); /查找查找s中的字符中的字符 等等等等15:12:1416但字符指针操作C-串的安全性受到质疑:char* str1;char* str2 = new char5;strcp
10、y(str2, ”ugly”);strcpy(str1,str2); / 错: str1没有空间可储strcpy(str2, ”Hello”); / 错: str2空间不够大str2 = ”Hello”; / 错:原来的”ugly”空间脱钩,导致内存泄漏根源:复制操作须以足够的目的地空间为前提,而所有C-串操作的空间调配都是人为人为安排的,C-串库函数一概不管15:12:1417StringString是C+提供的一种自定义的类型,可以方便的执行C-串所不能直接执行的一切操作。它处理空间占用问题是系统自动的,需要多少用多少。15:12:1418类串string串类自定义串对应字符指针的C-串操
11、作:/-f0305.cpp 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)!= -1 ? : not )的
12、读入方式总是将前导的空格(所谓空格,即包括空格、回车、水平或垂直制表符等)滤掉,将单词读入,在遇到空格时结束本次输入ngetline总是将行末的回车符滤掉,将其整行输入对字串”Hello, How are you?”的两种输入方式 for ( string s; cins; ) couts” “; coutendl; string s; getline(cin, s); couts a ; sum += a ) ; cout sum “n” ; 15:12:14215. 数组数组( Arrays ) 数组是同类元素的集合,它的元素排列在连续的空间中,按下标来标记描述数组必须给出元素类型,元素个
13、数元素个数必须在编程时确定,任何变量都不允许 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:通过初始化确定元素个数15:12:1422数组初始化可选,但须遵循语法无初始化的数组按规定取默认值 nint array15 = 1, 2, 3, 4, 5, 6 ; / 错: 初始值个数超元素个数nint array25 = 1, , 2, 3, 4 ; / 错: 不能
14、以逗号方式省略nint array35 = 1, 2, 3, ; / 错: 同上nint array45 = ; / 错: 初始值不能为空nint 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 ; 15:12:1423数组有诸多缺陷,造成编程艰难和不安全 int a5 = 1,2,3,4,5, c5; int b5 = a; / 错:无法拷贝创建 c
15、= a; / 错:无法整体拷贝和局部拷贝 a8 = 10; / 错:无法动态扩容和随意增减元素 for(int i=0; i=5; +i) / 错:无法防范下标溢出 ai = i+1; if(a=c) a0 = 2; / 错:不可比较 int a5 = 1; / 初始化呆板,无法获得全初值n字符数组书写上的特殊性:(1)char chs16=“hello”;(2)Char chs25=h,e.l,l,o;(3)Chchar chs36=“hello”;n注(1)和(3)的实际字符数应为6个。(2)有5个。15:12:142415:12:1425二维数组的初始化,下标访问及输出 int arra
16、y123=1,2,3,4,5; /最后一个默认为最后一个默认为0 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,15:12:1426.向量向量( vector ) 向量
17、与数组的共同特征是元素的排列在逻辑上是线性序列结构,可以用下标进行访问 向量可以按需创建,拷贝创建,局部拷贝创建,异类拷贝和创建 灵活的初始化 随意扩容和元素增减 可通过异常来进行下标溢出追踪和处理 可比较 等等15:12:1427.向量向量( vector ) 1、基本操作向量相当于容器,有四种定义方式:(1)vector a(10);(2)vector b(10,1); /10个元素初值都为1(3) vector c(b); /用现成的向量来创建一个向量(4)vector d(b.begin(),b.begin()+3); /定义了其值依次为b向量中第0到第2个元素的向量15:12:142
18、8nint 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个元素15:12:1429向量常用操作na.assign(b.begin(), b.begin()+3); / b的前3个元素赋给ana.assign(4,2); / a向量含4个元素,全初始化为2
19、nint 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);/a元素个数调至10。多删少补,新添元素初值为2nif(a=b) cout”equal”; / a与b的向量比较操作添加
20、元素n例:读入一个文件aaa.text的数据向量中,文件中为一些整数(不知个数)。要判断向量中的元素有多少个两两相等的数对。 F0310.cpp15:12:143015:12:1431向量操作尤其适合于函数参数传递(-D以上的数组参数的传递十分丑陋):传递一个矩阵,无论其每行中的元素个数不同传递一个矩阵,无论其每行中的元素个数不同. .输出之输出之: :typedef vectorvector Mat;void print(const Mat& a) for(int i=0; ia.size(); +i) for(int j=0; jai.size(); +j) coutaij ; coute
21、ndl; 15:12:14327. 指针与引用指针与引用 ( Pointers & Reference ) n指针指向存放数据的地址n指针必须初始化或者赋值(指向了数据)后,才能进行间接访问(间访)操作nint* ip;nint iCount = 18;nint* iPtr = &iCount; / 初始化nip = &iCount; / 赋值n*ip = 8; / 间访操作15:12:1433指针操作与指向数据的类型密切相关 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=1107951616 int: 100 float: 1.4013e-4315:12:1434指针加减整数的操作表示空间位置上的挪动但是挪动的字节数与其数据类型相关:对float指针加6实际增加了24个字节对long int指针加5实际增加了20个字节对char指针减7实际减少了7个字节对double指针减2实际减少了16个字节15:12:1435数组名本身就是表示元素集合的首地址数组名本身就是表示元素集合的首地址可以将数组名赋给指
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- Cefadroxil-13C6-BL-S-578-sup-13-sup-C-sub-6-sub-生命科学试剂-MCE
- 江门职业技术学院《数字合成基础(AE)》2023-2024学年第一学期期末试卷
- 武汉晴川学院《理论与实践(二)》2023-2024学年第一学期期末试卷
- 浙江长征职业技术学院《案例与论文写作》2023-2024学年第一学期期末试卷
- 2024-2025学年宿州市重点中学数学七年级第一学期期末学业水平测试模拟试题含解析
- 江苏省南通港闸区五校联考2024-2025学年化学九年级第一学期期末监测试题含解析
- 大连海洋大学《全科医学》2023-2024学年第一学期期末试卷
- 企业资金流动的审计策略分析
- 辽宁特殊教育师范高等专科学校《现代食品营养与安全自科类》2023-2024学年第一学期期末试卷
- 2025届北京理工大附中分校七年级数学第一学期期末教学质量检测试题含解析
- 2025中考(传统文化)类满分作文10篇
- 标准检验指导书(SIP)-钣金
- 交易员心理培训课件
- 京东笔试题库及答案
- 城市公园绿化施工安全措施方案
- DB11 T 627-2009 好氧降解法治理生活垃圾非卫生填埋场监测技术规范
- 建筑工程赶工计划措施
- 第十三讲先锋队与中华民族独立解放(1919-1949)-中华民族共同体概论专家大讲堂课件
- ICU发热与体温管理课件
- 职业中等专业学校计算机应用专业课程标准
- 《工业战略性新兴产业分类目录(2023)》
评论
0/150
提交评论