




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、11:38:351C + 程序设计教程(第二版)第三章 数据类型 Chapter 3 Data Types11:38:352n数据类型:u一定的数据在计算机的内部表示;u该数据所表示的值的集合;u在该数据上的一系列操作。n内部数据类型: 1.整型长整型,短整型,字符型,布尔型 2.浮点型单精度,双精度11:38:353第三章内容 整型整型 ( int Types ) 整型子类整型子类 ( sub-int Types ) 浮点型浮点型 ( Floating-Point Type ) C-串与串与string ( C-string & string ) 数组数组 ( Arrays ) 向量
2、向量 ( vectors ) 指针与引用指针与引用 ( Pointer & References ) 11:38:3641. 整型整型 ( int Types )n整型数的内部表示:二进制补码 位数既定的二进制补码运算没有加减的区别;对于溢出,只是简单的舍弃而不是错误n整型数的表示范围:取决于二进制位数n整型数的操作:+,-,*,/,%,=,!,=,=,=,&,|,&=,|=,&,|,&=,|=,!=,=,+=,-=,*=,/=,%=,+,-,,,? :11:38:365编译器的机器字长总是与整型的位长有关如: 32位编译器的整型数一定为32位长整型字面
3、值分八进制,十进制和十六进制不同表示如: 0123 / 8进制 0 x12af3 / 16进制 12345 / 10进制 超过表示范围的整型数其值不可预料或者出错如: int a = 12345678912345678912345; / 错11:38:366. 整型子类整型子类( Sub-int Types )字符型:表示范围: 有符号:-128127 无符号:0255 输出形式与整型数不同: int a = 65; char b = 65; couta“n”; coutb“n”; 结果为: 65 A 11:38:367枚举型: 自定义整数区间,甚至列举单个整数值 enum Week Mon,
4、 Tue, Wed, Thu, Fri, Sat, Sun ; 最大特点是可以给每个值指定一个在程序中直接使用的标记(枚举符) 编程中将其当作整数常量用如: int a = 7; if ( a = Sun) cout “Sundayn”; 11:38:368布尔型:表示范围仅含整数和1,也可以表示成true和false,相当于: enum bool false, true ;因为条件表达式、逻辑运算的结果都是因为条件表达式、逻辑运算的结果都是或,所以,相当大数量的表达式的值与或,所以,相当大数量的表达式的值与布尔型对应布尔型对应11:38:3693. 浮点型浮点型 ( Floating-Poi
5、nt Types )浮点数的内部表示: 国际标准IEEE754浮点表示法,它与编程所用的浮点数字面量以及输出的十进制浮点数之间有一个转换关系浮点数的表示范围:32位浮点数3.41038 64位浮点数1.810308浮点数的操作: 常规的加、减、乘、除等操作11:38:36104. C-串与串与string ( C-string & string )C-串结构每个字符占据1个字节一个C-串是一个字符序列,用来表示各种名字或者文字说明C-串的字符序列的最后总是添加有一个结束标志.即在6个字符的字串(“Hello!”)其空间存储有7个字节左边三图是不同细节的同一空间结构描述Hello!0 7
6、2 101 108 108 111 33 011:38:3611知道了知道了C-C-串首地址串首地址, ,即可知道整个串即可知道整个串, ,所所以可以藉字符首址以可以藉字符首址( (字符指针字符指针) )来操来操作作C-C-串串, ,但要注意,串的第一个字符但要注意,串的第一个字符与整个串的操作不同与整个串的操作不同, ,如如,C-,C-串的输串的输出操作出操作: : char* str = ”Hello”; cout *str endl; / 显示显示H cout str endl; / 显示显示Hello11:38:3612C-串不能直接比较,因为字符指针的比较只是地址值的比较而不是C-串
7、的字典序比较: cout(“join”=”join” ? ” : ”not “)”equaln”; / 字面值比较 charchar* str1=”good”; charchar* str2=”good”; cout(str1=str2 ? ” : ”not “)”equaln”; / 字符指针比较 charchar buffer16=”Hello”; charchar buffer26=”Hello”; cout(buffer1=buffer2 ? ” : ”not “)”equaln”; / 字符数组比较 结果:结果:not equal not equal not equal11:38:3
8、613不得不配备专门操作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中的字符中的字符 等等等等11:38:3614但字符指针操作C-串的安全性受到质疑:char* str1;char* str2 = new char5;strcpy(str2, ”ugly
9、”);strcpy(str1,str2); / 错: str1没有空间可储strcpy(str2, ”Hello”); / 错: str2空间不够大str2 = ”Hello”; / 错:原来的”ugly”空间脱钩,导致内存泄漏根源:复制操作须以足够的目的地空间为前提,而所有C-串操作的空间调配都是人为安排的,C-串库函数一概不管11:38:3615类串string串类自定义串对应字符指针的C-串操作: string a, s1 = Hello ; string s2 = 123; a = s1; / copy cout(a=s1 ? : not)equaln; / compare couta
10、+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 )的读入方式总是将前导的空格(所谓空格,即包括空格、回车、水平或垂直制表符等)滤掉,将单词读入,在遇到空格时结束本次输入ngetline总是将行末的回车符滤掉,将其整行输入对字串”Hello, How are you?”的两
11、种输入方式 for ( string s; cins; ) couts” “; coutendl; string s; getline(cin, s); couts a ; sum += a ) ; cout sum “n” ; 11:38:36185. 数组数组( Arrays ) 数组是同类元素的集合,它的元素排列在连续的空间中,按下标来标记描述数组必须给出元素类型,元素个数元素个数必须在编程时确定,任何变量都不允许 int aa ; / 表示int a97; int n = 100 ; int an ; / 错: 元素个数必须预知 const int n = 100 ; int an ;
12、 / ok int a ; / 错: 无元素个数 int a = 1, 2, 3, 4, 5 ; / ok:通过初始化确定元素个数11:38:3619数组初始化可选,但须遵循语法无初始化的数组按规定取默认值 nint array15 = 1, 2, 3, 4, 5, 6 ; / 错: 初始值个数超元素个数nint array25 = 1, , 2, 3, 4 ; / 错: 不能以逗号方式省略nint array35 = 1, 2, 3, ; / 错: 同上nint array45 = ; / 错: 初始值不能为空nint array55 = 1, 2, 3 ; / ok: 后面元素取0nint
13、 array65 = 0 ; / ok: 元素全为0nint array75 ; / ok: 元素值不确定nint a35 = 1, 2, 3, 4, 5 , 2, 3, 4, 5, 6 , 3, 4, 5, 6, 7 ; 11:38:3620数组有诸多缺陷,造成编程艰难和不安全 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; /
14、 错:不可比较 int a5 = 1; / 初始化呆板,无法获得全初值11:38:3621二维数组的初始化,下标访问及输出 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
15、,0,0,11:38:3622.向量向量( vector ) 向量与数组的共同特征是元素的排列在逻辑上是线性序列结构,可以用下标进行访问 向量可以按需创建,拷贝创建,局部拷贝创建,异类拷贝和创建 灵活的初始化 随意扩容和元素增减 可通过异常来进行下标溢出追踪和处理 可比较 等等11:38:3623nint 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.beg
16、in()+3);/局部拷贝创建d为b的前个元素na.assign(100); /动态扩容至100个元素11:38:3624向量常用操作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的最后一个
17、元素na.push_back(5); / a最后插入一个元素,其值为5na.resize(10); / a元素个数调至10。多删少补,其值随机na.resize(10,2);/a元素个数调至10。多删少补,新添元素初值为2nif(a=b) cout”equal”; / a与b的向量比较操作11:38:3625向量操作尤其适合于函数参数传递(-D以上的数组参数的传递十分丑陋):传递一个矩阵,无论其每行中的元素个数不同传递一个矩阵,无论其每行中的元素个数不同. .输出之输出之: :typedef vectorvector Mat;void print(const Mat& a) for(i
18、nt i=0; ia.size(); +i) for(int j=0; jai.size(); +j) coutaij ; coutendl; 11:38:36267. 指针与引用指针与引用 ( Pointers & Reference ) n指针指向存放数据的地址n指针必须初始化或者赋值(指向了数据)后,才能进行间接访问(间访)操作nint* ip;nint iCount = 18;nint* iPtr = &iCount; / 初始化nip = &iCount; / 赋值n*ip = 8; / 间访操作11:38:3627指针操作与指向数据的类型密切相关 float
19、 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-4311:38:3628指针加减整数的操作表示空间位置上的挪动但是挪动的字节数与其数据类型相关:对float指针加6实际增加了24个字节对long int指针加5实际增加了20个字节对char指针减7实际减少了7个字节对double指针减2实际减少了16个字节11:38:3629数组名本身就是表示元素集合的首地址数组名本身就是表示元素集合的首地址可以将数组名赋给指针可以将数组名赋给指针 int a3; for(int i=0; i3; +i) ai = i*2; for(int* iP=a; iPa+3; iP+=1) coutiP“: ”*iP“n”; 结果为: 1245036: 0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 培训沟通能力课程
- 危险的工地课件
- 科学技术试题库及答案
- 交通银行2025白山市秋招笔试价值观测评题专练及答案
- 农业银行2025海南藏族自治州秋招无领导小组面试案例题库
- 2025年3D打印技术的个性化医疗器械
- 农业银行2025九江市秋招半结构化面试题库及参考答案
- 邮储银行2025长沙市笔试英文行测高频题含答案
- 邮储银行2025达州市秋招无领导小组面试案例题库
- 2025行业未来十年发展趋势预测
- 中国传统故事英文九色鹿二篇
- 突发事件处理记录表(标准范本)
- 房产归属协议书范本
- 学生休学申请表(新)
- 350吨履带吊地基承载力验算
- 影视艺术导论教材课件汇总完整版ppt全套课件最全教学教程整本书电子教案全书教案课件合集
- TSG-R0005-2022《移动式压力容器安全技术监察规程》(2022版)
- 2020 ACLS-PC-SA课前自我测试试题及答案
- 第1章 税务会计与纳税筹划概述
- GB∕T 41181-2021 坐姿椅
- 傅里叶级数及其应用论文
评论
0/150
提交评论