C++程序设计教程3_第1页
C++程序设计教程3_第2页
C++程序设计教程3_第3页
C++程序设计教程3_第4页
C++程序设计教程3_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

07:42:021C++程序设计教程(第二版)第三章数据类型Chapter3

DataTypes清华大学出版社钱能07:42:022数据类型:一定的数据在计算机的内部表示;该数据所表示的值的集合;在该数据上的一系列操作。内部数据类型:

1.整型长整型,短整型,字符型,布尔型

2.浮点型单精度,双精度07:42:023第三章内容

整型(intTypes)

整型子类(sub-intTypes)

浮点型(Floating-PointType)

C-串与string(C-string&string)

数组(Arrays)

向量(vectors)

指针与引用(Pointer&References)

07:42:0241.整型(intTypes)整型数的内部表示:二进制补码位数既定的二进制补码运算没有加减的区别;对于溢出,只是简单的舍弃而不是错误整型数的表示范围:取决于二进制位数整型数的操作:+,-,*,/,%,<<,>>,<<=,>>=,!,^,<,<=,>,>=,==,^=,&,|,&=,|=,&&,||,&&=,||=,!=,=,+=,-=,*=,/=,%=,++,--,,,?:07:42:025编译器的机器字长总是与整型的位长有关.如:

32位编译器的整型数一定为32位长

整型字面值分八进制,十进制和十六进制不同表示.如:

0123//8进制

0x12af3//16进制

12345//10进制

超过表示范围的整型数其值不可预料或者出错.如:

错07:42:0262.整型子类(Sub-intTypes)字符型:表示范围:

char

有符号:-128~127unSignedchar无符号:0~255

输出形式与整型数不同:inta=65;charb=65;cout<<a<<“\n”;cout<<b<<“\n”;

结果为:

65A

07:42:027枚举型:enum

自定义整数区间,甚至列举单个整数值

enumWeek{Mon,Tue,Wed,Thu,Fri,Sat,Sun};

最大特点是可以给每个值指定一个在程序中直接使用的标记(枚举符).编程中将其当作整数常量用.如:

inta=4;if(a==Fri)cout<<“Friday\n”;

07:42:028布尔型:bool表示范围仅含整数0和1,也可以表示成true和false,相当于:

enumbool{false,true};因为条件表达式、逻辑运算的结果都是0或1,所以,相当大数量的表达式的值与布尔型对应07:42:0293.浮点型(Floating-PointTypes)浮点数的内部表示:

国际标准IEEE754浮点表示法,它与编程所用的浮点数字面量以及输出的十进制浮点数之间有一个转换关系浮点数的表示范围:

32位浮点数±3.4×103864位浮点数±1.8×10308浮点数的操作:

常规的加、减、乘、除等操作07:42:02104.C-串与string(C-string&string

)C-串结构每个字符占据1个字节一个C-串是一个字符序列,用来表示各种名字或者文字说明

C-串的字符序列的最后总是添加有一个结束标志0.即在6个字符的字串(“Hello!”)其空间存储有7个字节左边三图是不同细节的同一空间结构描述’H’’e’’l’’l’’o’’!’’\0’7210110810811133001001000011001010110110001101100011011110010000100000000字符型为char,C-串的类型为char*,确切的说是constchar*.Char*称为字符指针,与字符数组操作上一样,都表示C-串的起始地址。07:42:021107:42:0212知道了C-串首地址,即可知道整个串,所以可以藉字符首址(字符指针)来操作C-串,但要注意,串的第一个字符与整个串的操作不同,如,C-串的输出操作:

char*str=”Hello”;cout<<*str<<endl;//显示Hcout<<str<<endl;//显示Hello07:42:0213C-串不能直接比较,因为字符指针的比较只是地址值的比较而不是C-串的字典序比较:cout<<(“join”==”join”?””:”not“)<<”equal\n”;//字面值比较char*str1=”good”;char*str2=”good”;cout<<(str1==str2?””:”not“)<<”equal\n”;//字符指针比较charbuffer1[6]=”Hello”;charbuffer2[6]=”Hello”;cout<<(buffer1==buffer2?””:”not“)<<”equal\n”;//字符数组比较结果:notequalnotequalnotequal07:42:0214C-串可以复制:char*str1=”good”;

char*str2=str1;//STR1和STR2共享”good”空间数组复制被禁止:

charbuffer1[6]=”Hello”;

charbuffer2[6]=buffer1[6];//错,数组不能复制

07:42:0215不得不配备专门操作C-串的库函数:strcpy(s1,s2);//从s2拷贝到s1strcmp(s1,s2);//比较s1与s2strcat(s1,s2);//连接s2到s1strrev(s);//将s倒排strset(s,‘c’);//将s全置为cstrstr(s,“ell”);//查找s中的子串strchr(s,‘c’);//查找s中的字符等等07:42:0216但字符指针操作C-串的平安性受到质疑:char*str1;char*str2=newchar[5];strcpy(str2,”ugly”);strcpy(str1,str2);//错:str1没有空间可储strcpy(str2,”Hello”);//错:str2空间不够大str2=”Hello”;//错:原来的”ugly”空间脱钩,导致内存泄漏根源:复制操作须以足够的目的地空间为前提,而所有C-串操作的空间调配都是人为安排的,C-串库函数一概不管07:42:0217StringString是C++提供的一种自定义的类型,可以方便的执行C-串所不能直接执行的一切操作。它处理空间占用问题是系统自动的,需要多少用多少。07:42:0218类串string—串类—自定义串对应字符指针的C-串操作://------------------f0305.cppstringa,s1="Hello";strings2="123";a=s1;//copycout<<(a==s1?"":"not")<<"equal\n";//comparecout<<a+s2<<endl;//concatenatereverse(a.begin(),a.end());cout<<a<<endl;//reversecout<<a.replace(0,9,9,'c')<<endl;//setcout<<(s1.find("ell")!=-1?"":"not")<<"found\n";//findstringcout<<(s1.find('c')!=-1?"":"not")<<"found\n";//findchar07:42:0219输入C-串的string承载方式:cin>>的读入方式总是将前导的空格〔所谓空格,即包括空格、回车、水平或垂直制表符等〕滤掉,将单词读入,在遇到空格时结束本次输入getline总是将行末的回车符滤掉,将其整行输入对字串”Hello,Howareyou?”的两种输入方式for(strings;cin>>s;)cout<<s<<”“;cout<<endl;

strings;getline(cin,s);cout<<s<<endl;07:42:0220string流:将string实体看作是一个输入设备.给一个像cin这样的取名,作为流来操作,会很有用例如,如果一个文件aaa.txt,有假设干行,每行中含有不知道几个的整数,要输出每行的整数和://p0306.cppifstreamin("aaa.txt");for(strings;getline(in,s);){inta,sum=0;for(istringstreamsin(s);sin>>a;sum+=a);cout<<sum<<“\n”;}07:42:02215.数组(Arrays)

数组是同类元素的集合,它的元素排列在连续的空间中,按下标来标记描述数组必须给出元素类型,元素个数元素个数必须在编程时确定,任何变量都不允许

inta[’a’];//表示inta[97];intn=100;inta[n];//错:元素个数必须预知

constintn=100;inta[n];//ok

inta[];//错:无元素个数

inta[]={1,2,3,4,5};//ok:通过初始化确定元素个数07:42:0222数组初始化可选,但须遵循语法.无初始化的数组按规定取默认值

intarray1[5]={1,2,3,4,5,6};//错:初始值个数超元素个数intarray2[5]={1,,2,3,4};//错:不能以逗号方式省略intarray3[5]={1,2,3,};//错:同上intarray4[5]={};//错:初始值不能为空intarray5[5]={1,2,3};//ok:后面元素取0intarray6[5]={0};//ok:元素全为0intarray7[5];//ok:元素值不确定inta[3][5]={{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}};07:42:0223数组有诸多缺陷,造成编程艰难和不平安

inta[5]={1,2,3,4,5},c[5];intb[5]=a;//错:无法拷贝创立c=a;//错:无法整体拷贝和局部拷贝a[8]=10;//错:无法动态扩容和随意增减元素for(inti=0;i<=5;++i)//错:无法防范下标溢出a[i]=i+1;if(a==c)a[0]=2;//错:不可比较inta[5]={1};//初始化呆板,无法获得全1初值字符数组书写上的特殊性:(1)charchs1[6]={“hello”};(2)Charchs2[5]={‘h’,’e’.’l’,’l’,’o’};(3)Chcharchs3[6]=“hello”;注〔1〕和〔3〕的实际字符数应为6个。〔2〕有5个。07:42:022407:42:0225二维数组的初始化,下标访问及输出

intarray1[2][3]={1,2,3,4,5};//最后一个默认为0intarray2[2][3]={{1,2},{4}};//共两维,一维三个数cout<<"array1:";for(inti=0;i<2;++i)for(intj=0;j<3;++j)cout<<array1[i][j]<<",";cout<<"\narray2:";for(inti=0;i<2;++i)for(intj=0;j<3;++j)cout<<array2[i][j]<<",";cout<<"\n";结果为:

array1:1,2,3,4,5,0,array2:1,2,0,4,0,0,07:42:02266.向量(vector)

向量与数组的共同特征是元素的排列在逻辑上是线性序列结构,可以用下标进行访问向量可以按需创立,拷贝创立,局部拷贝创立,异类拷贝和创立灵活的初始化随意扩容和元素增减可通过异常来进行下标溢出追踪和处理可比较等等07:42:02276.向量(vector)

1、根本操作向量相当于容器,有四种定义方式:(1)vector<int>a(10);(2)vector<int>b(10,1);//10个元素初值都为1(3)vector<int>c(b);//用现成的向量来创立一个向量(4)vector<int>d(b.begin(),b.begin()+3);//定义了其值依次为b向量中第0到第2个元素的向量07:42:0228intn=10;intt[5]={1,2,3,4,5};vector<int>a(n);//按需创立vector<int>b(10,1);//元素赋全1,灵活的初始化vector<int>c(b);//整体拷贝创立vector<int>f(t,t+5);//从数组获得初值vector<int>d(b.begin(),b.begin()+3);//局部拷贝创立d为b的前3个元素a.assign(100);//动态扩容至100个元素07:42:0229向量常用操作a.assign(b.begin(),b.begin()+3);//b的前3个元素赋给aa.assign(4,2);//a向量含4个元素,全初始化为2intx=a.back();//a的最后一个元素赋给变量xa.clear();//a向量清空〔不再有元素〕if(a.empty())cout<<”empty”;//a判空操作inty=a.front();//a的第一个元素赋给变量ya.pop_back();//删除a的最后一个元素a.push_back(5);//a最后插入一个元素,其值为5a.resize(10);//a元素个数调至10。多删少补,其值随机a.resize(10,2);//a元素个数调至10。多删少补,新添元素初值为2if(a==b)cout<<”equal”;//a与b的向量比较操作添加元素例:读入一个文件aaa.text的数据向量中,文件中为一些整数〔不知个数〕。要判断向量中的元素有多少个两两相等的数对。F0310.cpp07:42:023007:42:0231向量操作尤其适合于函数参数传递〔2-D以上的数组参数的传递十分丑陋〕:传递一个矩阵,无论其每行中的元素个数不同.输出之:typedefvector<vector<int>>Mat;voidprint(constMat&a){for(inti=0;i<a.size();++i){for(intj=0;j<a[i].size();++j)cout<<a[i][j]<<"";cout<<endl;}}07:42:02327.指针与引用(Pointers&Reference)

指针指向存放数据的地址指针必须初始化或者赋值(指向了数据)后,才能进行间接访问(间访)操作int*ip;intiCount=18;int*iPtr=&iCount;//初始化ip=&iCount;//赋值*ip=8;//间访操作07:42:0233指针操作与指向数据的类型密切相关

floatf=34.5;

int*ip=reinterpret_cast<int*>(&f);

cout<<“fAddr:”<<&f<<“=>”<<f<<“\n”;

cout<<“iAddr:”<<ip<<“=>”<<*ip<<“\n”;

*ip=100;

cout<<“int:”<<*ip<<“\n”;

cout<<“float:”<<f<<“\n”;

结果为:

fAddr:1245064=>34.5

iAddr:1245064=>1107951616

int:100

float:1.4013e-4307:42:0234指针加减整数的操作表示空间位置上的挪动

但是挪动的字节数与其数据类型相关:

对float指针加6实际增加了24个字节

对longint指针加5实际增加了20个字节

对char指针减7实际减少了7个字节

对double指针减2实际减少了16个字节07:42:0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论