C程序设计教程3

上传人:gp****x 文档编号:243074374 上传时间:2024-09-15 格式:PPT 页数:31 大小:86.50KB
返回 下载 相关 举报
C程序设计教程3_第1页
第1页 / 共31页
C程序设计教程3_第2页
第2页 / 共31页
C程序设计教程3_第3页
第3页 / 共31页
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二层,第三层,第四层,第五层,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二层,第三层,第四层,第五层,*,*,C +,程序设计教程,(,第二版,),第三章 数据类型,Chapter 3,Data Types,03:16:26,1,数据类型:,一定的数据在计算机的内部表示;,该数据所表示的值的集合;,在该数据上的一系列操作。,内部数据类型:,1.,整型,长整型,短整型,字符型,布尔型,2.,浮点型,单精度,双精度,03:16:26,2,第三章内容,整型,( int Types ),整型子类,( sub-int Types ),浮点型,( Floating-Point Type ),C-,串与,string ( C-string & string ),数组,( Arrays ),向量,( vectors ),指针与引用,( Pointer & References ),03:16:26,3,1.,整型,( int Types ),整型数的内部表示:,二进制补码,位数既定的二进制补码运算没有加减的区别;对于溢出,只是简单的舍弃而不是错误,整型数的表示范围:,取决于二进制位数,整型数的操作:,+,,,-,,*,,/,,,%,,,,,=,,,!,,,,,,,,,=,,,=,,,=,,,&,,,|,,,&=,,,|=,,,&,,,|,,,&=,,,|=,,,!=,,,=,,,+=,,,-=,,*,=,,,/=,,,%=,,,+,,,-,,,,,? :,03:16:26,4,编译器的机器字长总是与整型的位长有关如:,32,位编译器的整型数一定为,32,位长,整型字面值分八进制,十进制和十六进制不同表示如:,0123 / 8,进制,0x12af3 / 16,进制,12345 / 10,进制,超过表示范围的整型数其值不可预料或者出错如:,int a = 12345678912345678912345; /,错,03:16:26,5,.,整型子类,( Sub-int Types ),字符型:,表示范围:,有符号:,-128,127,无符号:,0,255,输出形式与整型数不同,:,int a = 65;,char b = 65;,couta,“,n,”,;,coutb,“,n,”,;,结果为:,65,A,03:16:26,6,枚举型:,自定义整数区间,甚至列举单个整数值,enum Week Mon, Tue, Wed, Thu, Fri, Sat, Sun ;,最大特点是可以给每个值指定一个在程序中直接使用的标记,(,枚举符,),编程中将其当作整数常量用如:,int a = 7;,if ( a = Sun) cout “Sundayn”;,03:16:26,7,布尔型:,表示范围仅含整数和,1,,也可以表示成,true,和,false,,相当于:,enum bool false, true ;,因为条件表达式、逻辑运算的结果都是或,所以,相当大数量的表达式的值与布尔型对应,03:16:26,8,3.,浮点型,( Floating-Point Types ),浮点数的内部表示:,国际标准,IEEE754,浮点表示法,它与编程所用的浮点数字面量以及输出的十进制浮点数之间有一个转换关系,浮点数的表示范围:,32,位浮点数,3.410,38,64,位浮点数,1.810,308,浮点数的操作:,常规的加、减、乘、除等操作,03:16:26,9,4. C-,串与,string ( C-string & string,),C-,串结构,每个字符占据,1,个字节,一个,C-,串是一个字符序列,用来表示各种名字或者文字说明,C-,串的字符序列的最后总是添加有一个结束标志,.,即在,6,个字符的字串,(“Hello!”),其空间存储有,7,个字节,左边三图是不同细节的同一空间结构描述,Hello!0,72 101 108 108 111 33 0,03:16:26,10,知道了,C-,串首地址,即可知道整个串,所以可以藉字符首址,(,字符指针,),来操作,C-,串,但要注意,串的第一个字符与整个串的操作不同,如,C-,串的输出操作,:,char* str = ”Hello”;,cout *str endl; /,显示,H,cout str endl; /,显示,Hello,03:16:26,11,C-,串不能直接比较,因为字符指针的比较只是地址值的比较而不是,C-,串的字典序比较,:,cout(“join”=”join” ? ” : ”not “)”equaln”; /,字面值比较,char,* str1=”good”;,char,* str2=”good”;,cout(str1=str2 ? ” : ”not “)”equaln”; /,字符指针比较,char,buffer16=”Hello”;,char,buffer26=”Hello”;,cout(buffer1=buffer2 ? ” : ”not “)”equaln”; /,字符数组比较,结果:,not equal,not equal,not equal,03:16:26,12,不得不配备专门操作,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,中的字符,等等,03:16:26,13,但字符指针操作,C-,串的安全性受到质疑,:,char,* str1;,char,* str2 =,new,char,5;,strcpy(str2, ”ugly”);,strcpy(str1,str2); /,错,: str1,没有空间可储,strcpy(str2, ”Hello”); /,错,: str2,空间不够大,str2 = ”Hello”; /,错:原来的”,ugly”,空间脱钩,导致内存泄漏,根源:复制操作须以足够的目的地空间为前提,而所有,C-,串操作的空间调配都是人为安排的,,C-,串库函数一概不管,03:16:26,14,类串,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)!= -1 ? : not ),的读入方式总是将前导的空格(所谓空格,即包括空格、回车、水平或垂直制表符等)滤掉,将单词读入,在遇到空格时结束本次输入,getline,总是将行末的回车符滤掉,将其整行输入,对字串”,Hello, How are you?”,的两种输入方式,for,( string s; cins; ),couts” “;,coutendl;,string s;,getline(cin, s);,couts a ; sum += a ) ;,cout sum “n” ;,03:16:26,17,5.,数组,( Arrays ),数组是同类元素的集合,它的元素排列在连续的空间中,按下标来标记,描述数组必须给出元素类型,元素个数,元素个数必须在编程时确定,任何变量都不允许,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:,通过初始化确定元素个数,03:16:26,18,数组初始化可选,但须遵循语法无初始化的数组按规定取默认值,int,array15 = 1, 2, 3, 4, 5, 6 ; /,错,:,初始值个数超元素个数,int,array25 = 1, , 2, 3, 4 ; /,错,:,不能以逗号方式省略,int,array35 = 1, 2, 3, ; /,错,:,同上,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 ;,03:16:26,19,数组有诸多缺陷,造成编程艰难和不安全,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; /,初始化呆板,无法获得全初值,03:16:26,20,二维数组的初始化,下标访问及输出,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,03:16:26,21,.,向量,( vector ),向量与数组的共同特征是元素的排列在逻辑上是线性序列结构,可以用下标进行访问,向量可以按需创建,拷贝创建,局部拷贝创建,异类拷贝和创建,灵活的初始化,随意扩容和元素增减,可通过异常来进行下标溢出追踪和处理,可比较,等等,03:16:26,22,int,n=10;,int,t5=1,2,3,4,5;,vector a(n); /,按需创建,vector b(10, 1); /,元素赋全,灵活的初始化,vector c(b); /,整体拷贝创建,vector f(t, t+5); /,异类拷贝创建,vector d(b.begin(), b.begin()+3);,/,局部拷贝创建,d,为,b,的前个元素,a.assign(100); /,动态扩容至,100,个元素,03:16:26,23,向量常用操作,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”; / 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,的向量比较操作,03:16:26,24,向量操作尤其适合于函数参数传递(,-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;,03:16:26,25,7.,指针与引用,( Pointers & Reference ),指针指向存放数据的地址,指针必须初始化或者赋值,(,指向了数据,),后,才能进行间接访问,(,间访,),操作,int,* ip;,int,iCount = 18;,int,* iPtr = /,初始化,ip = /,赋值,*,ip = 8; /,间访操作,03:16:26,26,指针操作与指向数据的类型密切相关,float,f = 34.5;,int,* ip =,reinterpret_cast,(,结果为:,fAddr: 1245064=34.5 iAddr: 1245064=1107951616 int: 100 float: 1.4013e-43,03:16:26,27,指针加减整数的操作表示空间位置上的挪动但是挪动的字节数与其数据类型相关:,对,float,指针加,6,实际增加了,24,个字节对,long int,指针加,5,实际增加了,20,个字节对,char,指针减,7,实际减少了,7,个字节对,double,指针减,2,实际减少了,16,个字节,03:16:26,28,数组名本身就是表示元素集合的首地址,可以将数组名赋给指针,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,03:16:26,29,指针限定,const int,a = 78;,int,b = 10;,int,c = 18;,const int,* ip = / const,修饰指向的实体类型,常量指针,int,*,const,cp = / const,修饰指针*,cp,指针常量,int,const,* dp = /,等价于上一句,指针常量,const int,*,cons,t icp = /,常量指针常量*,ip = 87; /,错:常量指针不能修改指向的常量,*,ip,只能做右值,ip = / ok,:常量指针可以修改指针值*,cp = 81; / ok,:指针常量可以修改指向的实体,cp = /,错:指针常量不能修改指针值,即使是同一个地址*,icp = 33; /,错:常量指针常量不能修改指向的常量,icp = /,错:常量指针常量不能修改指针值,int,d = *icp; / ok,03:16:26,30,引用必须初始化,因为引用总是附属于某个实体,int,someInt = 5;,int, /,初始化,修改引用的值,即是修改了附属的实体值,int,a = 5;,int,结果为:,8,引用多用在函数参数的传递上,03:16:26,31,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


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

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


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