C++ 程序設(shè)計教程(第二版):第3章 數(shù)據(jù)類型_第1頁
C++ 程序設(shè)計教程(第二版):第3章 數(shù)據(jù)類型_第2頁
C++ 程序設(shè)計教程(第二版):第3章 數(shù)據(jù)類型_第3頁
C++ 程序設(shè)計教程(第二版):第3章 數(shù)據(jù)類型_第4頁
C++ 程序設(shè)計教程(第二版):第3章 數(shù)據(jù)類型_第5頁
已閱讀5頁,還剩92頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

14:38:381C++程序設(shè)計教程(第二版)第三章數(shù)據(jù)類型

Chapter3

DataTypes14:38:382第三章內(nèi)容

整型(intTypes)

整型子類(sub-intTypes)

浮點型(Floating-PointType)

C-串與string(C-string&string)

數(shù)組(Arrays)

向量(vectors)

指針與引用(Pointer&References)14:38:383數(shù)據(jù)類型:一定的數(shù)據(jù)在計算機的內(nèi)部表示;該數(shù)據(jù)所表示的值的集合;在該數(shù)據(jù)上的一系列操作。14:38:384C++中的數(shù)據(jù)類型,有語言既定的內(nèi)部數(shù)據(jù)類型,也有程序員自定義的外部數(shù)據(jù)類型。內(nèi)部數(shù)據(jù)類型:

1.整型長整型,短整型,字符型,布爾型

2.浮點型單精度,雙精度外部數(shù)據(jù)類型:程序員自定義的數(shù)據(jù)類型

1、以class構(gòu)造的類2、enum,union,struct基于內(nèi)部和外部數(shù)據(jù)類型的變異類型

1、數(shù)組2、指針3、引用14:38:3853.1整型(intTypes)整型規(guī)定了整數(shù)的表示形式,整數(shù)的運算(操作),以及整數(shù)在計算機中的表示范圍。1、整型數(shù)的內(nèi)部表示:二進制補碼相關(guān)概念:原碼、反碼、補碼。在二進制補碼運算中,將加減運算統(tǒng)一為加法運算;將乘除運算轉(zhuǎn)換為加法運算和移位。

14:38:3862、整型數(shù)的表示范圍:取決于二進制位數(shù)

1)整型類型標(biāo)識符:int2)類型修飾符:long,short,signed,unsigned3)c++規(guī)定:

char<=shortint<=int<=longint4)在32位編譯器中(P67表3-2):

int:4字節(jié)32位

signed和unsigned:只能修飾char和int

char,int默認(rèn)為有符號類型

unsignedint~unsigned;4字節(jié)14:38:387short:只能修飾整型intshortint~short,2字節(jié)long:只能修飾int和double,longint,4字節(jié);

longint~long;longdouble10字節(jié)、19位有效位注意:使用sizeof(類型標(biāo)識符/變量名);可以得到相應(yīng)數(shù)據(jù)類型所占的字節(jié)數(shù)。

eg:cout<<sizeof(int);//4cout<<sizeof(8);//414:38:388類型字節(jié)數(shù)位數(shù)表示范圍解釋下限上限char18-128127-27~(27-1)signedchar18-128127-27~(27-1)unsignedchar1802550~(28-1)shortint216-3276832767-215~(215-1)signedshortint216-3276832767-215~(215-1)unsignedshortint2160655350~(216-1)int432-21474836482147483647-231~(231-1)signedint432-21474836482147483647-231~(231-1)unsignedint432042949672950~(232-1)longint432-21474836482147483647-231~(231-1)signedlongint432-21474836482147483647-231~(231-1)unsignedlongint432042949672950~(232-1)表3-2:整型數(shù)表示范圍14:38:3893、編譯器與整型長度

編譯器的機器字長總是與整型的位長有關(guān)。如:32位編譯器的整型數(shù)一定為32位長。

所謂32位編譯器是指它能將程序源代碼編譯成最高為32位的CPU指令系統(tǒng)代碼,或者直接說int類型的長度是32位的。14:38:38104、整數(shù)字面值

整數(shù)用具體的數(shù)值表示就是整數(shù)的字面值。

分為八進制、十進制和十六進制不同表示.

eg:

0123//8進制,0開頭

0x1af3//16進制,0X或0x開頭

12345//10進制,非0數(shù)字開頭

系統(tǒng)默認(rèn)為signedint,在數(shù)字后加u或l可以表示unsignedint和longint。eg:123u;654l;

注意:超過表示范圍的整型數(shù)其值不可預(yù)料或者出錯.

如:inta=12345678912345678912345;//錯14:38:38115、整型數(shù)的操作

+,-,*,/,%,<<,>>,<<=,>>=,!,^,<,<=,>,>=,==,^=,&,|,&=,|=,&&,||,&&=,||=,!=,=,+=,-=,*=,/=,%=,++,--,,,?:主要有:

a、算術(shù)運算;

b、比較運算;

c、邏輯運算

d、位操作的;

e、賦值操作的;14:38:3812其中:/

兩個整數(shù)相除,結(jié)果為舍去小數(shù)部分、截取整數(shù)部分;兩個實數(shù)相除是一般意義上的除法。

5/2=25.0/2=2.5%取余運算兩邊的操作數(shù)必須為整型數(shù),余數(shù)的正負取決于被除數(shù)的正負

11%(-5)=1-11%(-5)=-114:38:38133.2整型子類(Sub-intTypes)1、字符型

ASCII碼有128個字符:

不可見字符:ASCII碼值從0~31和127的字符,也可以稱為控制符;

可見字符:是可以用單引號括起來的字符,如:‘a(chǎn)’,‘x’,‘?’,‘$’;14:38:3814ASCII碼表碼值字符碼值字符碼值字符碼值字符0~31控制字符或通訊專用字符(不可見)34“46.92\0NUL(空值)35#47/93]1SOH(文頭)36$48~57‘0’~’9’94^4EOT(文尾)37%58:95_6ACK(確認(rèn))38&59;96`7BEL(響鈴)39‘60<97~122‘a(chǎn)’~’z’8BS(退格)40(61=123{10LF(換行)41)62>124|12FF(換頁)42*63?125}13CR(回車)43+64@126~32SP(空格)44,65~90‘A’~’Z’127DEL33!45-91[14:38:3815轉(zhuǎn)義字符:以轉(zhuǎn)義符“\”開頭的格式字符。使用轉(zhuǎn)義字符的目的是表示不可見的字符。經(jīng)常用的不可見字符用一個轉(zhuǎn)義符后跟一個專門的字符來表示;可見字符在知道其ASCII碼值的前提下也可以用轉(zhuǎn)移符的形式表示。例如:P70表3-3。字符形式整數(shù)值代表符號字符形式整數(shù)值代表符號\a0x07BEL(Bell)\”0x22”\b0x08BS(BackSpace)\’0x27’\t0x09HT(HorizontalTabulate)\?0x3F?\n0x0ALF(LineFeed)\\0x5C\\v0x0BVF(VerticalTabulate)\ooo0ooo1~3位八進制數(shù)\r0x0DCR(CarriageReturn)\xhh0xhh1~2位十六進制數(shù)14:38:3816類型標(biāo)識符:char占1字節(jié)表示范圍:

有符號:-128~127

無符號:0~255字符常量:用單引號括起來的一個字符。如:‘a(chǎn)’,‘x’,‘?’,‘$’字符變量:

charc=‘A’;14:38:3817在內(nèi)存中,字符數(shù)據(jù)以ASCII碼存儲,即以整數(shù)表示,所以C++中字符數(shù)據(jù)和整型數(shù)據(jù)之間可以相互賦值,相互運算,只要注意其表示的范圍合理。字符型輸出形式與整型數(shù)不同:

intx1='A',x2='0',x3=0;charc=97;cout<<x1<<""<<x2<<""<<x3<<""<<c<<endl;

//執(zhí)行結(jié)果:65480a14:38:38182、枚舉型:是對整數(shù)區(qū)間的自定義類型,用戶可以為區(qū)間中的值取名

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

注意:

1)

enum是C++的保留字,用來定義類型

2)Week是一個自定義的類型名。{}內(nèi)部為枚舉符,代表某個整數(shù)值,默認(rèn)時分別為:0,1,2,3…

也可以在定義枚舉類型時指定:

enumWeek{Mon=1,Tue,Wed,Thu,Fri,Sat,Sun};3)定義枚舉變量:

Weekday;day=Sun;//714:38:38194)枚舉變量應(yīng)該用枚舉值進行賦值。

day=Mon;

day=1;//錯,非枚舉型值5)最大特點是可以給每個值指定一個在程序中直接使用的標(biāo)記(枚舉符).

編程中將其當(dāng)作整數(shù)常量用.如:

inta=7;if(a==Sun)cout<<“Sunday\n”;

14:38:38203、布爾型表示范圍僅含整數(shù)0和1,也可以表示成true和false,相當(dāng)于:enumbool{false,true};

A、因為C++表達式值的大小比較、條件真假判斷、邏輯運算的結(jié)果都是0或1,所以,相當(dāng)大數(shù)量的表達式的值與布爾型對應(yīng);

B、用任何非0整數(shù)給bool變量賦值時,其值都為1,非整數(shù)的其他類型,只要非0,其值也為1;

boola=3;//a為trueboolb=1;//b為trueboolc=a+b;//c為true(1+1=2)boold=a-b;//d為false(1-1=0)14:38:3821

C、bool型的輸出形式可以選擇,默認(rèn)為0和1;

boold=false;cout<<false<<endl;//0cout<<true<<endl;//1cout<<boolalpha<<d<<endl;//false

D、true和false兩個關(guān)鍵字相當(dāng)于兩個枚舉符,可以代替整型常量(0和1)使用,但不方便理解,不建議使用;

boolb=false+true;//b為trueinti=true*2;//i=214:38:38223.3浮點型(Floating-PointTypes)1、浮點數(shù)的內(nèi)部表示:浮點數(shù)N通常表示為:N=S·RJ。其中,N為浮點數(shù),S為尾數(shù)(純小數(shù)),R為基數(shù),J為階碼(純整數(shù))。1)十進制浮點數(shù)常用科學(xué)記數(shù)法表示。

規(guī)格化形式:小數(shù)點前不含有效數(shù)字,小數(shù)點后第一位由非0數(shù)字表示。eg:123.45規(guī)格化表示為:0.12345*10314:38:38232)十進制浮點數(shù)轉(zhuǎn)換成二進制浮點數(shù)

(因為在計算機內(nèi)部,浮點數(shù)都是以二進制表示的)轉(zhuǎn)換分兩步:

整數(shù)部分轉(zhuǎn)換,采用“除2取余法”;

小數(shù)部分轉(zhuǎn)換,采用“乘2取整法”,直到小數(shù)部分為0或者已經(jīng)取到了足夠位數(shù)。14:38:38243)二進制浮點數(shù)的尾數(shù)及規(guī)格化a.計算機內(nèi)部采用國際標(biāo)準(zhǔn)IEEE754浮點表示法。將二進制浮點數(shù)分為三段,第一段是符號段,占1位;第二段是階碼段,第三段是尾數(shù)段。b.二進制浮點數(shù)規(guī)格化是通過調(diào)整浮點數(shù)的階碼使得該數(shù)的有效值在1與2之間,即二進制浮點數(shù)的整數(shù)部分為1。例:0.8125=0.1101(2)=1.101×2-1符號段階碼段尾數(shù)段float:1-8-23double:1-11-5214:38:38254)二進制浮點數(shù)的階碼32位浮點數(shù)規(guī)定:規(guī)格化的浮點數(shù)階碼在-126~127之間;用-127表示非規(guī)格化的數(shù),所以,尾數(shù)全0、階碼為-127即表示0;用-128表示非法操作數(shù)。

為了使浮點數(shù)0和整數(shù)0統(tǒng)一,即位碼全0表示0。標(biāo)準(zhǔn)單精度浮點數(shù)對所有規(guī)格化和非規(guī)格化二進制數(shù)階碼一律做+127的偏移操作。而在取出該浮點數(shù)時,再做一個-127的逆操作。14:38:3826例如:

35.6=100011.1001(2)=1.00011100110011001100110×25=0,10000100,00011100110011001100110第一段表示該數(shù)為正數(shù),第二段10000100為指數(shù)5加上127所得,第三段是規(guī)格化后的23位尾數(shù)。14:38:38275)浮點數(shù)的書寫及內(nèi)部表示

定點方式(非指數(shù)方式),例35.623;

科學(xué)計數(shù)法(指數(shù)方式),例0.35623e+02;注意:直接寫出的浮點數(shù)字面值,默認(rèn)為double類型,如果要表示成float型,則要在浮點數(shù)后面加上字母F或f。

floatf1=19.2f;floatf2=0.192e+02;//將double數(shù)轉(zhuǎn)化為floatdoubled1=19.2;doubled2=0.192e+02f;//將float轉(zhuǎn)換為doublelongdoubleld1=19.2L;longdoubleld2=0.192e+02;//將double轉(zhuǎn)化為longdouble14:38:38282、浮點型表示范圍floatdoublelongdouble說明單精度雙精度長雙精度位數(shù)32位64位80位長度4字節(jié)8字節(jié)10字節(jié)表示范圍±3.4×1038±1.8×10308±1.2×104932規(guī)格化近0數(shù)±1.2×10-38±2.2×10-308±3.4×10-4932非規(guī)格化近0數(shù)±1.4×10-45±4.9×10-324±1.8×10-4951階碼8位11位15位尾數(shù)23位52位64位二進制有效位數(shù)24位53位65位十進制有效位數(shù)7位15位19位規(guī)格化數(shù)階值范圍-126~127-1022~1023-16382~16383非規(guī)格化數(shù)階值-127-1023-16383NaN階值-128-1024-1638414:38:38293.4C-串與string(C-string&string

)3.4.1C-串結(jié)構(gòu) 在C++中有兩種字符串,一種是string,一種是從C沿襲過來的,稱為C-字符串,簡稱為C-串。C-串是以一個全0位字節(jié)作為結(jié)束符的字符序列。

C-串為字符串常量,類型為constchar*,其空間長度為字符串長度加1?!瓾’‘e’‘l’‘l’‘o’‘!’0‘H’‘e’‘l’‘l’‘o’‘!’‘\0’例:charbuffer[7]=“Hello!”;7210110810811133000000000001000010110111101101100011011000110010101001000124306212430611243060124305912430581243057124305614:38:38303.4.2字符指針與字符數(shù)組知道了C-串首地址,即可知道整個串,所以可以借助字符首址(字符指針)來操作C-串;①

串的第一個字符與整個串的操作不同。輸出字符指針就是輸出整個C-串,輸出字符指針的間接引用,就是輸出單個字符。例如:

inta=12,*pa=&a;cout<<*pa<<endl;cout<<pa<<endl;

char*str=”Hello”;cout<<*str<<endl;cout<<str<<endl;//輸出:12//輸出:1245064//輸出:H//輸出:Hello14:38:3831②C-串不能直接比較,因為字符指針的比較只是地址值的比較而不是C-串的字典序比較,例如:f0303輸出:notequal輸出:notequal輸出:notequal#include<iostream.h>intmain(){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”;//字符數(shù)組比較,}14:38:3832#include<iostream.h>intmain(){char*s1="Hello";char*s2="123";chara[20];

strcpy(a,s1);//copycout<<(strcmp(a,s1)==0?"":"not")<<"equal\n";

//compare:cout<<strcat(a,s2)<<endl;//catenate:cout<<strrev(a)<<endl;//reverse:cout<<strset(a,'c')<<endl;//set:cout<<(strstr(s1,"ell")?"":"not")<<"found\n";

//findstring:cout<<(strchr(s1,'c')?"":"not")<<"found\n";

//findchar:}③為了操作C-串,在C庫函數(shù)中,專門設(shè)計了操作C-串的庫函數(shù):equalHello123321olleHcccccccccfoundnotfound14:38:3833④字符指針操作C-串的安全性受到質(zhì)疑:char*str1;char*str2=newchar[5];strcpy(str2,”ugly”);//okstrcpy(str1,str2);//錯:str1沒有空間可儲

strcpy(str2,”Hello”);//錯:str2空間不夠大

str2=”Hello”;

//錯:與原來的”ugly”空間脫鉤,導(dǎo)致內(nèi)存泄漏根源:復(fù)制操作須以足夠的目的地空間為前提,而所有C-串操作的空間調(diào)配都是人為安排的,C-串庫函數(shù)一概不管。14:38:38343.4.3string

字符串類,能夠執(zhí)行C-串不能執(zhí)行的一切操作,它處理空間占用問題是自動的。#include<iostream.h>#include<algorithm.h>intmain(){stringa,s1="Hello";strings2="123";

a=s1;

//copycout<<(a==s1?"":"not")<<"equal\n";//compare:cout<<a+s2<<endl;//catenate:

reverse(a.begin(),a.end());//reverse:cout<<a<<endl;cout<<a.replace(0,9,9,'c')<<endl;//set:

//從0開始,替換到第9個字符,顯示9個字符

cout<<(s1.find("ell")!=-1?"":"not")<<"found\n";//

cout<<(s1.find('c')!=-1?"":"not")<<"found\n";//

}equalHello123olleHcccccccccfoundnotfound14:38:38353.4.4string與C-串的輸入輸出cin>>的讀入方式總是將前導(dǎo)的空格(所謂空格,即包括空格、回車、水平或垂直制表符等)濾掉,將單詞讀入,當(dāng)遇到空格時結(jié)束本次輸入。getline總是將行末的回車符濾掉,將其整行輸入。14:38:3836for(charch;(ch=cin.get())!='\n';)cout<<char(ch);cout<<endl;逐個字符輸入:例:對字符串”Hello,Howareyou?”的幾種輸入方式strings;getline(cin,s);cout<<s<<endl;for(strings;cin>>s;)cout<<s<<“”;cout<<endl;chara[40];cin.getline(a,40);cout<<a<<endl;for(chara[40];cin>>a;)cout<<a<<“”;cout<<endl;14:38:38373.4.5string流例:如果一個文件aaa.txt,有若干行,不知道每行中含有幾個整數(shù),編程輸出每行的整數(shù)和。由于cin不能辨別空格與回車的差異,因此只能用getline的方式逐行讀入數(shù)據(jù)到string變量中,但是在string變量中分離若干個整數(shù)還是顯得困難。

一個比較好的方法是用string流。將string實體看作是一個輸入設(shè)備,給它一個像cin這樣的取名,作為流來操作,會很有用。14:38:3838#include<iostream.h>#include<sstream.h>#include<fstream.h>intmain(){

ifstream

in(“d:\\aaa.txt");for(strings;getline(in,s);){inta,sum=0;for(istringstream

sin(s);sin>>a;sum+=a);cout<<sum<<'\n';}}//f030614:38:38393.5.1數(shù)組的定義數(shù)組是具有一定順序關(guān)系的若干相同類型變量的集合體,組成數(shù)組的變量稱為該數(shù)組的元素。數(shù)組屬于變異類型.

可以由除void類型以外的任何一種類型構(gòu)成.3.5數(shù)組(Arrays)

14:38:3840①一維數(shù)組的聲明類型說明符數(shù)組名[常量表達式];

注意:常量表達式可以包含數(shù)值常量、枚舉常量和字符常量,該常量表達式的值是在編譯時確定的,不允許是變量。

例:inta[5];

表示a為整型數(shù)組,有5個元素:a[0]...a[4]數(shù)組名的構(gòu)成方法與一般變量名相同元素的個數(shù),即數(shù)組長度,必須是正整數(shù)14:38:3841②一維數(shù)組的使用只能引用數(shù)組元素(數(shù)組名[下標(biāo)]),而不能引用數(shù)組整體。例:a[0]=a[2]+a[3]-a[2*3]C++中,所有數(shù)組均由連續(xù)的存儲單元組成,起始地址對應(yīng)于數(shù)組的第一個元素,下標(biāo)是距數(shù)組開始的偏移量。長度為n的數(shù)組,其下標(biāo)范圍為0~(n-1)。數(shù)組元素在內(nèi)存中順序存放,它們的地址是連續(xù)的。

例:inta[5];//下標(biāo)范圍0~4數(shù)組aa[0]a[1]a[2]a[3]a[4]數(shù)組下標(biāo)14:38:3842…………1243078124307912430801243081124308212430831243084124308512430861243087124308812430891243090例:inta[3]={6,7,8};7a[0]的地址86a[0]a[1]a[2]a[1]的地址a[2]的地址數(shù)組a的地址數(shù)組下標(biāo)…………1243078124307912430801243081124308212430831243084124308512430861243087124308812430891243090內(nèi)存空間內(nèi)存地址存儲單元(1Byte)例:intb=12;12變量b的地址變量b的數(shù)值14:38:3843③

數(shù)組下標(biāo)值規(guī)定*

在編譯時,數(shù)組定義中的下標(biāo)必須確定。

所以,不能用變量確定數(shù)組長度。

voidmain(){intsize=50;intarray[size];//error,不能用變量來描述數(shù)

//組定義中的元素個數(shù)

//…}

intsize=50;voidmain(){intarray[size];//error,全局變量也不能

//…}14:38:3844*

應(yīng)該用常量來規(guī)定數(shù)組元素的個數(shù):

constintsize=50;constintn=size*sizeof(int);voidmain(){intarray[size];//okcharcharray[n];//ok//…}

size和n都是常量,n的常量定義中,初始化值是個表達式,但在編譯時,該表達式的值能被確定下來。14:38:38453.5.2數(shù)組的初始化①數(shù)組可以初始化,即在定義時,使它包含程序馬上能使用的值。

intiArray[10]={1,1,2,3,5,8,13,21,34,55};//初始化a.初始化數(shù)組的值的個數(shù)不能多于數(shù)組元素個數(shù),初始值不能通過跳過逗號的方式來省略,也不能為空.intarray1[5]={1,2,3,4,5,6};

//錯:初始值個數(shù)超元素個數(shù)

intarray2[5]={1,,2,3,4};

//錯:不能以逗號方式省略

intarray3[5]={1,2,3,};//錯:同上

intarray4[5]={};//錯:初始值不能為空14:38:3846b.初值可以是已賦過值的變量、表達式、常量。

c.如果初始化值的個數(shù)少于等號左邊方括號中的數(shù)組元素個數(shù),則后面的元素值全為0。

intarray5[5]={1,2,3};

//ok:后面元素取0intarray6[5]={0};

//ok:元素全為0d.在對全部數(shù)組元素賦初值時,可以不指定數(shù)組長度.

例:inta[]={1,1,2,3,5,8,13,21,34,55};

注意:如果沒有初始化部分,則數(shù)組定義的方括號內(nèi)的表達式不能省略。如:inta[];//錯誤;14:38:3847#include<iostream.h>intmain(){

inta[]={1,2,3,4,5};for(inti=0;i<sizeof(a)/sizeof(a[0]);++i){cout<<a[i]<<“”;}cout<<endl;}例:f030714:38:3848②初始化字符數(shù)組a.初始化字符數(shù)組第一種方法: chararray[10]={"hello"}; chararray[10]="hello";

注意:系統(tǒng)自動在數(shù)組沒有填值的位置用‘\0’補上。另外,這里不要忘記為最后的‘\0’分配空間。

b.另一種方法是:

chararray[10]={'h','e','l','l','o','\0'};

一次一個元素地初始化數(shù)組,如同初始化整型數(shù)組。這種方法通常用于輸入不容易在鍵盤上生成的那些不可見字符。例如,下面的代碼中初始化值為若干制表符:

charchArray[5]={'\t','\t','\t','\t','\0'};

14:38:38493.5.3默認(rèn)值對于沒有初始化的數(shù)組,分兩種情況:①全局?jǐn)?shù)組和靜態(tài)數(shù)組:元素值全被清0;②局部數(shù)組:元素值不確定。例:f0308intarray1[5]={1,2,3};//全局?jǐn)?shù)組,有初始化

intarray2[5];//全局?jǐn)?shù)組,無初始化

intmain(){

intarray3[5]={2};//局部數(shù)組,有初始化

intarray4[5];//局部數(shù)組,無初始化

static

intarray4[5];//靜態(tài)數(shù)組,無初始化

//…}

注意:在使用局部數(shù)組之前應(yīng)該先進行初始化,或賦值。14:38:38503.5.4二維數(shù)組定義①

類型說明數(shù)組名[數(shù)組長度1][數(shù)組長度2];

例inta[3][4];說明:1)二維數(shù)組可看成是:一維數(shù)組中的每個元素是一維數(shù)組

a[0]------a[0][0]a[0][1]a[0][2]a[0][3]aa[1]------a[1][0]a[1][1]a[1][2]a[1][3] a[2]------a[2][0]a[2][1]a[2][2]a[2][3]2)分配內(nèi)存單元時,按行優(yōu)先順序,即:先行后列3)通常把有m行和n列的數(shù)組稱為m×n數(shù)組。數(shù)組a中的每個元素用元素名a[i][j]識別,a是數(shù)組名,i和j是唯一標(biāo)識數(shù)組a中每個元素的下標(biāo)(0≤i≤m-1,0≤j≤n-1

)元素所在行元素所在列14:38:3851②二維數(shù)組的初始化(同一維數(shù)組類似)a.初始化形式多樣,但是總是從首元素開始分配。b.按行進行初始化,每行用一對花括號括起,之間用逗號分隔。例:inta[2][3]={{1,2,3},{4,5,6}};c.整個數(shù)組按行順序進行初始化:一對花括號。例:intb[2][2]={0,1,2,3};d.部分元素初始化:自每行的首元素起被分配初值。例:intc[5][5]={{1},{2}};

注意:

intc[5][5]={{1,2,3,4},{},{1}};//errore.行維長度可省,列維長度不可省。例:inta[][5]={0,1,2,3,4,5,6,7,8,9,10};

共11個元素,系統(tǒng)自動判斷行維長度為3;

即:inta[3][5]={0,1,2,3,4,5,6,7,8,9,10};14:38:3852#include<iostream.h>intmain(){intarray1[2][3]={1,2,3,4,5};intarray2[2][3]={{1,2},{4}};inti,j;cout<<"array1:";for(i=0;i<2;++i){for(j=0;j<3;++j){cout<<array1[i][j]<<",";}}cout<<"\narray2:";for(i=0;i<2;++i){for(j=0;j<3;++j){cout<<array2[i][j]<<",";}}cout<<endl;getchar();}f0309:14:38:3853③數(shù)組有諸多缺陷,造成編程艱難和不安全

例:inta[5]={1,2,3,4,5},c[5];intb[5]=a;//錯:無法拷貝創(chuàng)建

c=a;//錯:無法整體拷貝和局部拷貝

a[8]=10;//錯:無法動態(tài)擴容和隨意增減元素

for(inti=0;i<=5;++i)//錯:無法防范下標(biāo)溢出

a[i]=i+1;if(a==c)a[0]=2;//錯:不可比較

inta[5]={1};//初始化呆板,無法獲得全1初值14:38:38543.6向量(vector)

向量與數(shù)組的共同特征是元素的排列在邏輯上是線性序列結(jié)構(gòu),可以用下標(biāo)進行訪問.3.6.1向量的定義和操作

vector是向量類型,它是一種對象實體,具有值,所以可以看作是變量。它可以容納許多其它類型的相同實體,如若干個整數(shù),所以稱其為容器。

vector是C++STL(StandardTemplateLibrary,標(biāo)準(zhǔn)模板類庫)的重要一員,使用它,只需要包含頭文件<vector>即可。14:38:3855①vector定義方式:定義格式:vector<數(shù)據(jù)類型>向量名;

或:vector<數(shù)據(jù)類型>向量名(參數(shù)表);A.vector<int>a(10);//定義了10個整數(shù)元素的向量,但是沒有給出初值,因而其值不確定;B.vector<int>b(10,1);//定義了10個元素的向量,且每個元素初值是1;C.vector<int>c(b);//用一個現(xiàn)有的向量來創(chuàng)建一個新的向量;D.vector<int>d(b.begin(),b.begin()+3);

//局部拷貝創(chuàng)建d為b的前3個元素(從第0到第2個)其中b.begin():指向向量的起始元素位置;

b.end():指向向量的最后一個元素之外的位置。14:38:3856②向量賦值:

創(chuàng)建向量時,不但可以整體向量復(fù)制性賦值,還可以選擇其他容器的部分元素來定義向量或者賦值。特別地,向量還可以從數(shù)組獲得初值。例:

a=b;//把向量b整體賦值給a

inta1[7]={1,2,3,4,5,6,7};vector<int>va(a1,a1+7);//異類拷貝創(chuàng)建14:38:3857③向量元素位置:遍歷器向量元素位置也屬于一種類型,稱為遍歷器(迭代器)。

遍歷器不但表示元素位置,還可以在容器中前后挪動。每種容器都有對應(yīng)的遍歷器,向量中遍歷器的類型:

vector<數(shù)據(jù)類型>::iterator輸出向量中的元素,可以有兩種循環(huán)控制方式:A.for(inti=0;i<a.size();++i)cout<<a[i]<<"";

B.for(vector<int>::iteratorit=va.begin();it!=va.end();++it)cout<<*it<<“”;

即:

vector<int>::iteratorit;for(it=va.begin();it!=va.end();++it)cout<<*it<<“”;14:38:3858④向量操作向量的操作都是通過調(diào)用成員函數(shù)來完成的。⒈a.assign(b.begin(),b.begin()+3);//b的前3個元素賦給a⒉a.assign(4,2);//a向量含4個元素,全初始化為2⒊inty=a.front();//a的第一個元素值賦給變量y⒋intx=a.back(); //a的最后一個元素賦給變量x⒌a.clear();//a向量清空(不再有元素)⒍if(a.empty())cout<<”empty”;//a判空操作14:38:3859⒎a.pop_back();//刪除a的最后一個元素⒏a.push_back(5);//a最后插入一個元素,其值為5⒐a.resize(10);//a元素個數(shù)調(diào)至10。多刪少補,其值隨機⒑a.resize(10,2);//a元素個數(shù)調(diào)至10。多刪少補,新添元素初值為2⒒if(a==b)cout<<”equal”;//a與b的向量比較操作④向量操作向量的操作都是通過調(diào)用成員函數(shù)來完成的。14:38:38603.6.2添加元素例:讀入一個文件aaa.txt的數(shù)據(jù)到向量中,文件中為一些整數(shù)(不知個數(shù)),要判斷向量中的元素有多少個兩兩相等的數(shù)對。

//f0310#include<iostream>#include<fstream>#include<vector>usingnamespacestd;14:38:3861intmain(intargc,char*argv[]){

ifstreamin("d:\\aaa.txt");//in是對文件讀取的對象

vector<int>s;for(inta;in>>a;)

s.push_back(a);//在s向量最后插入元素aintpair=0;cout<<s.size()<<endl;for(inti=0;i<s.size();++i)for(intj=i+1;j<s.size();++j)if(s[i]==s[j])pair++;//每次讀出一個元素和后面所有的元素相比較

cout<<pair<<"\n";return0;}14:38:38623.6.3二維向量定義格式:vector<vector<數(shù)據(jù)類型>>二維向量名;

注:vector中的swap操作:交換兩個向量。例如對于兩個向量a和b,可使用a.swap(b);

對其進行交換。例:文件aaa.txt中含有一些行,每行中有一些整數(shù),可以構(gòu)成一個向量。整個文件可以看成一組向量,其中每個元素又都是向量,只不過作為元素的向量其長度參差不齊。設(shè)計一個排序程序,使得按從短到長的順序輸出每個向量。14:38:3863#include<iostream>#include<fstream>#include<sstream>#include<vector>usingnamespacestd;typedefvector<vector<int>>Mat;Matinput();voidmySort(Mat&a);voidprint(constMat&a);intmain(intargc,char*argv[]){Mata=input();mySort(a);print(a);return0;}f0311:14:38:3864Matinput(){ifstreamin("d:\\aaa.txt");

Mata;for(strings;getline(in,s);){vector<int>b;

istringstreamsin(s);for(intia;sin>>ia;){b.push_back(ia);}a.push_back(b);}

returna;}intmain(){Mata=input();mySort(a);print(a);return0;}14:38:3865voidmySort(Mat&a){for(unsignedintpass=1;pass<a.size();++pass){for(unsignedinti=0;i<a.size()-pass;++i){if(a[i+1].size()<a[i].size()){a[i].swap(a[i+1]);}}}

return;//可以省略}intmain(){Mata=input();mySort(a);print(a);return0;}14:38:3866voidprint(constMat&a){for(unsignedinti=0;i<a.size();++i){for(unsignedintj=0;j<a[i].size();++j){cout<<a[i][j]<"";}cout<<endl;}return;//可以省略}intmain(){Mata=input();mySort(a);print(a);return0;}14:38:38673.7指針與引用(Pointers&Reference)3.7.1指針概念1.地址和指針

inti=18;直接訪問:指按變量地址存取變量值的方式間接訪問:把變量的地址存放在另一變量中,先找到變量地址,再存取變量值的方式0000F822

18

0000F822iPtri18i0000F82214:38:3868地址“指向”存儲單元地址形象化的稱為指針變量i的地址就稱為該變量的指針指針變量:存放地址(指針)的變量(iptr)指針變量的值:地址(指針)注意:指針和指針變量的區(qū)別!14:38:38692.指針變量的定義一般形式:類型標(biāo)識符*變量名;例:int*p1;char*p2;float*p3;說明:(1)*

表示指針型變量,意為“指向…的指針”。(2)指針變量有確定的指向的數(shù)據(jù)類型(void*除外)。(3)指針位置可以靠左、靠右、也可以兩邊都不靠。14:38:38703.指針變量的初始化和賦值初始化:在指針變量定義的時候給指針變量一個初始指向;賦值:指針名=地址;

說明:地址中存放的數(shù)據(jù)類型與指針類型必須相符;操作符

&

:獲取變量的地址14:38:3871例如:

inta=12;int*iPtr=&a;//初始化

int*iPtr2;

iPtr2=&a;//賦值1243082

12

iPtra(*iPtr)指針的工作方式…………1243078124307912430801243081124308212430831243084124308512430861243087124308812430891243090內(nèi)存空間內(nèi)存地址存儲單元(1Byte)12變量a的地址變量a的數(shù)值iPtr14:38:38724.間接引用指針變量操作符*:取指針變量所指向的單元內(nèi)的內(nèi)容例,下面的程序間接引用指針iPtr,輸出iCount的內(nèi)容:

voidmain(){int*iPtr;intiCount=18;

iPtr=&iCount;cout<<*iPtr<<endl;//間接引用指針

}

該運行結(jié)果就是指針iPtr所指向的變量iCount的內(nèi)容程序運行結(jié)果:

18注意:指針必須初始化或者賦值(指向了數(shù)據(jù))后,才能進行間接訪問(間訪)操作14:38:38735.指針變量的地址指針本身是變量,所以指針變量也有地址,指針的地址是“指針的指針”。例:intmain() {intiCount=18;int*iPtr=&iCount;

*iPtr=58;cout<<iCount<<endl;cout<<iPtr<<endl;cout<<&iCount<<endl;cout<<*iPtr<<endl;cout<<&iPtr<<endl;}

//58//1245064//1245064//58//1245060注意:iPtr;*iPtr,&iPtr的不同!14:38:38746.指針與整型數(shù)的區(qū)別向指針變量賦的值必須是地址常量或變量,不能是普通整數(shù),但是可以賦值為整數(shù)0,表示空指針。例如:intiCount=26;int*iPtr=&iCount;//定義語句:*在此處作定義指針變量用,而非間接引用*iPtr=&iCount;//error:不能將整型地址轉(zhuǎn)換成整型數(shù)

//cannotconvertfrom'int*'to'int'*iPtr=50;//執(zhí)行語句:*在此處作間接引用int*iPtr2=iPtr;iPtr2=&iCount;iPtr2=NULL;//或者:iPtr2=0;iPtr2=1;//error:cannotconvertfrom'int'to'int*'14:38:38753.7.2指針的類型

指針是有類型的。給指針賦值,不但必須是一個地址,而且應(yīng)該是一個與該指針類型相符的變量或常量的地址。#include<iostream.h>intmain(){floatf=34.5;float*fptr=&f;//浮點指針

//int*iPtr=&f;

//error:將浮點變量的地址賦給整型指針

//cannotconvert‘float*’to‘int*’cout<<“f=”<<f<<endl;cout<<"fPtr:“<<fptr<<"=>“<<*fptr<<endl;}運行結(jié)果為:f=34.5fPtr:1245064=>34.514:38:3876#include<iostream.h>intmain(){floatf=34.5;

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

cout<<“floataddress:”<<&f<<“=>”<<f<<endl;cout<<“intaddress:”<<ip<<“=>”<<*ip<<endl;*ip=100;cout<<“int:”<<*ip<<endl;cout<<"float:“<<f<<endl;}//f0312floataddress:1245064=>34.5intaddress:1245064=>1107951616int:100float:1.4013e-4314:38:387734.5的二進制補碼:

(float:1-8-23)01000010000010100000000000000000按int類型進行解釋:

230+225+219+217=1107951616100的二進制補碼:

00000000000000000000000001100100按float類型進行解釋:

(1.000000000000000011001×2-127(2))

0.000000000000000011001×2-126(2)=2-143+2-144+2-147

=1.4013×10-43=1.4013e-4314:38:3878類型轉(zhuǎn)換:(P417,CH12.7)①重解釋轉(zhuǎn)換:reinterpret_cast<數(shù)據(jù)類型>(表達式)②靜態(tài)轉(zhuǎn)換:static_cast<數(shù)據(jù)類型>(表達式)③動態(tài)轉(zhuǎn)換:dynamic_cast<數(shù)據(jù)類型>(表達式)④常量轉(zhuǎn)換:const_cast<數(shù)據(jù)類型>(表達式)14:38:38793.7.3指針運算指針變量描述的是地址,是無符號量,不同于整數(shù)和無符號整數(shù),因為他們表示的是不同的類型。指針變量所占有的空間大小總是等同于整型變量的大小,即4字節(jié)。指針間的算術(shù)運算(指針相加、相乘、相除、模)均無意義!但是,在一定的條件下,指針可進行以下運算。兩個指針變量的比較運算兩個指針變量的減法運算一個指針變量與整數(shù)的運算14:38:38801.兩個指針變量的比較運算①當(dāng)指針變量p1和p2指向某一變量時,可進行如下邏輯判斷:

p1==p2―如果相等,則p1和p2指向同一變量

p1!=p2―如果不等,則p1和p2指向的不是同一變量②當(dāng)指針變量p1和p2指向同一個數(shù)組時,可進行如下邏輯判斷:

p1==p2―如果相等,則表示指向數(shù)組的同一元素

p1!=p2―如果不等,則表示指向的不是數(shù)組中的同一元素

p1>p2―如果成立,則表示p1指向的數(shù)組元素在p2指向的數(shù)組元素之后14:38:38812.兩個指針變量的減法運算(兩個指針變量的加法無意義)當(dāng)兩個指針p1和p2指向同一數(shù)組時,可進行減法運算:

p1-p2――表示p1指向的數(shù)組元素的下標(biāo)減去p2指向的數(shù)組元素的下標(biāo)#include<iostream>usingnamespacestd;intmain(){ inta[5]={1,2,3,4,5}; int*p=&a[0]; int*q=&a[2]; cout<<q-p<<endl;}//輸出:214:38:38823.一個指針變量與整數(shù)的運算當(dāng)指針指向數(shù)組時,可進行加、減一個整數(shù)的運算:

p±n

:從當(dāng)前指向的數(shù)組元素上移或下移n個元素

即:指針的增減是以該類型的實體大小為單

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論