《C++語言基礎》全套課件(完整版)_第1頁
《C++語言基礎》全套課件(完整版)_第2頁
《C++語言基礎》全套課件(完整版)_第3頁
《C++語言基礎》全套課件(完整版)_第4頁
《C++語言基礎》全套課件(完整版)_第5頁
已閱讀5頁,還剩492頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

C++語言基礎C++概述C++的特點發展歷史和未來 (C\C++(AT&T)\Java(SUN)\C#(MS))與其它語言比較(7點):面向對象的概念:數據的封裝和隱藏、繼承、多態VC上機過程C++的字符集26個小寫字母

abcdefghijklmnopqrstuvwxyz26個大寫字母

ABCDEFGHIJKLMNOPQRSTUVWXYZ10個阿拉伯數字

0123456789

其他符號

+-*/=,._:;?\"'~|!#%&()[]{}^<>空格C++語言使用下列基本字符來構成詞法單位:結束第二章:數據類型運算符表達式2.1VC++的數據類型計算機所處理的數據以一定形式存放在內存中,數據的存儲方式以及能夠進行的合法運算都與數據類型直接相關。C++的特點之一就是提供了豐富的數據類型,以便處理各種不同的數據。數據類型總是與運算封裝在一起,本質上是面向對象的。本章將簡要介紹C++中的數據類型及相關運算,以及常量、變量、表達式、語句等,最后介紹簡單的輸入輸出方法。2.1.1關鍵字數據類型說明符與修飾符boolcharwchar_tclassconstdoubleenumfloatintlongshortsignedstructunionunsignedvoidvolatile存儲類型說明符autoexterninlineregisterstatic訪問說明符friendprivateprotectedpublic其它說明符asmexplicitnamespaceoperatortemplatethistypedeftypenameusingvirtual

語句與標號breakcasecatchcontinuedefaultdoelseforgotoifreturnswitchthrowtrywhile

運算符及邏輯值deletefalsenewsizeoftrue

還有一些關鍵字本書未介紹:

const_castdynamic_castreinterpret_caststatic_castexportmutabletypeid下面可用一些關鍵字代替邏輯運算符:andand_eqbitandbitorComplnotoror_eqXorxor_eqnot_eq2.1.2標識符標識符(Identifier,ID)是程序員定義的“單詞”,用來給變量、常量、數據類型、函數等命名。合法標識符由字母或下劃線開始,由字母、數字、下劃線組成,其有效長度為1-31個字符,長度超過31個字符者只識別前31個字符,VC++標識符長度為1-247個字符。建議使用有一定含義的英文單詞或拼音序列作標識符,以提高可讀性;另外盡量不用下劃線或雙下劃線打頭,以免與系統定義的關鍵字沖突。ok標識符例:判斷下面哪些是合法的標識符:

MyFileSalary94amountvoid94SalarySalary94$amountf3.5Num_of_Student2.1.2結束2.1.3標點符號標點符號包括:#、()、{}、,、:、;、"、'等。標點符號的作用:有一定的語法意義。如字符和字符串常量分別用‘’和“”引起來。對語法符號起分隔作用。如;等2.1.3結束2.1.5C++的基本數據類型圖2-1C++的數據結構實型float雙精度型doubleC++的數據類型基本數據類型非基本數據類型數組type[]指針type*結構struct聯合union枚舉enum類class整型int字符型char邏輯型bool無值型void實型ok

C++對基本數據類型也分別進行了封裝,稱為內置數據類型,內置數據類型不僅定義了數據類型,還定義了常用操作。本節僅介紹各種基本數據類型的定義,常用操作將在后面介紹。

C++為強類型語言,所有數據的使用嚴格遵從“先說明后使用”的原則,以便編譯器進行編譯。

整型用來存放整數,整數(有符號的整數)在內存中存放的是它的補碼,無符號數沒有符號位,存放的就是原碼。整數占用的字節數與機型有關,32位機上占用4個字節。

字符型用來保存字符,存儲的是該字符的ASCII碼,占用一個字節。如大寫字母A的ASCII碼為65,在對應的一個字節中存放的就是65。字符型數據從本質上說也是整數,可以是任何一個8位二進制整數。由于漢語系字符很多,用ASCII字符集處理遠遠不夠,因此又創立了雙字節字符集(DBCS:double-bytecharacterset),每個字符用兩個字節來編碼。為便于軟件的國際化,國際上一些知名公司聯合制定了新的寬字節字符標準——Unicode。該標準中所有字符都是雙字節的,不同的語言和字符集分別占用其中一段代碼。這種用統一編碼處理西文、中文及其它語言符號,就是unicode碼。C++同時也支持寬字符類型(wchar_t),或稱雙字節字符型。

實型和雙精度型都用來存放實數,兩者表示的實數精度不同。實數在內存中以規范化的浮點數存放,包括尾數、數符和階碼。數的精度取決于尾數的位數,32位機上實型為23位(因規范化數的數碼最高位恒為1,不必存儲,實際為24位),雙精度為52位。邏輯型也稱布爾型,其取值為true(邏輯真)和false(邏輯假),存儲字節數在不同編譯系統中可能有所不同,VC++6.0中為1個字節。布爾型在運算中可以和整型相互轉化,false對應為0,true對應為1或非0無值型主要用來說明函數的返回值類型,將在函數一章中具體介紹。

基本數據類型還可以加上一些修飾詞,包括:signed(有符號)、unsigned(無符號)、long(長)、short(短)。參見下表:2.2結束類型名稱占用字節數取值范圍bool布爾型

true,false(signed)char有符號字符型1-128127unsigedchar無符號字符型10255(signed)short(int)有符號短整型2-3276832767unsignedshort(int)無符號短整型2065535(signed)int(signed)有符號整型4-231

(231-1)unsigned(int)無符號整型40(232-1)(signed)long(int)有符號長整型4-231

(231-1)unsignedlong(int)無符號長整型40(232-1)float實型4-1038

1038double雙精度型8-10308

10308longdouble長雙精度型8-10308

10308void無值型0無值VC++中所有基本數據類型2.1.6常量在程序的執行過程中,值保持不變的量稱為常量字面常量,指程序中直接給出的量;常量的值在程序執行過程中保持不變;并且存儲在程序區,而非數據區;根據取值和表示方法的不同,可分為以下幾種:a.整形常量d.字符串常量c.字符型常量b.實型常量oka整型常量十進制表示法八進制表示法十六進制表示法其他表示法即整數,可以有多種表示方法:ok

整數的十進制表示方法十進制表示與我們熟悉的書寫方式相同。如15-24ok

整數的八進制表示

八進制表示以0開始,由數字07組成,用來表示一個八進制數。如:012 //八進制數12,即十進制數10-0655 //八進制數-655,即十進制數-429ok

整數的十六進制表示

十六進制以0X(大小寫均可)開始,由數字09和字母AF(大小寫均可)組成,用來表示一個十六進制數。以下是一些常整數的例子:0x32A//十六進制數32A,即十進制數810-0x2fe0//十六進制數-2fe0,

//即十進制數-12256ok整數的其他表示方法

整型常量還可以表示長整數和無符號整數。長整型常數以L

或l

結尾,無符號常整數以U

或u

結尾,以UL

或LU(大小寫均可)結尾則可表示無符號長整型常數。例如:-84L //十進制長整數-84026U //八進制表示的無符號整數260X32LU//十六進制表示的無符號長整型數32。整數結束b實型常量(1)一般形式與平時書寫形式相同,由數字09和小數點組成。例如:0.23-125.760.0.46-35.(2)指數形式(也稱為科學表示法)表示為尾數乘以10的次方形式,由尾數、E或e和階數組成。指數形式要求在E或e前面的尾數部分必須有數字,后面的指數部分必須為整數。

例:判斷下列表示是否合法123E12-.34e-2E41.43E3.5包含小數點和10的冪的數為實型常量,有兩種表示方法:實數結束c字符型常量

字符常量是用單引號引起來的單個字符。在內存中保存的是字符的ASCII碼值。在所有字符中,有些是可顯示字符,通常就用單引號引起來表示:′a′ //字符a ′@′ //字符@ ′4′ //字符4 ′′ //空格字符有些是特殊情況字符,如不可顯示的字符等,c++使用轉義序列表示方法,如(祥見表2-3,此處略):

′\n′ //換行

′\\′//字符\字符常結束

d.字符串常量字符串常量與字符型常量的區別字符串常量″a″占兩個字節,存放′a′和′\0′,值為0x6100字符型常量′a′占一個字節,存放′a′,值為0x61\0aa2.3.2結束用雙引號引起來的若干個字符稱為字符串常量。例如:″IamaChinese.″,″123″,″a″,″″2標識符常量及常量說明符const用常量說明符const給字面常量起個名字(標識符),這個標識符就稱為標識符常量;因為標識符常量的說明和引用形式很像變量,所以也稱常變量;例如:constfloatPI=3.14159;constintNumber_of_Student=100;常變量必須也只能在說明時進行初始化;常變量初始化之后,不允許再被賦值;常變量必須先說明后使用;常變量存儲在數據區,并且可以按地址訪問,編譯時系統對常變量進行類型檢查。C++建議使用常變量,而盡量不使用字面常量。2.3.3結束2.1.7變量1變量說明

2變量賦初值

變量,在程序中是指可以改變值的量;變量必須用標識符進行標識,稱為變量名;變量有類型之分,如整形變量、字符變量等;任何變量都必須先說明后使用;一是便于編譯程序為變量分配空間,二是便于編譯時進行語法檢查;變量使用的第一步,是給變量賦初始值;ok變量說明

在C++中,變量說明的一般格式為:《存儲類型》數據類型變量名1《,變量名2,,變量名n》;

下面是變量說明的幾個例子:inti,j,k; //說明三個整型變量i,j,kfloatx,y,z; //說明三個實型變量x,y,zcharc1,c2;//說明兩個字符型變量c1,c2doubledx; //說明一個雙精度型變量dx變量說明結束變量賦初值(1)變量說明時直接賦初值。例如: inta=3,b=4,c=5; floatx=3.0; (2)用賦值語句賦初值。嚴格的說,只有前者可稱賦初值例如: floatx,e; x=3.5; e=2.71828;

結束給變量賦初值稱為初始化,有兩種方法:2.2基本運算符

對常量和變量進行運算是通過運算符來實現的.常量和變量通過運算符組成C++表達式,由表達式再組成C++語句.

運算符是完成對常量和變量進行運算的符號.把參與運算的對象稱為操作數.按照要求的操作數的個數,運算符分為單目(一元)運算符、雙目(二元)運算符和三目(三元)運算符。單目運算符只對一個操作數運算,如負號運算符“”等;雙目運算符要求有兩個操作數,如乘號運算符“*”等;三目運算符要求有三個操作數,三元運算符只有一個“?:”。1.算術運算符優先級運算符名稱3+正,單目

-負,單目5*乘,雙目

/除,雙目

%求余,雙目6+加,雙目

-減,雙目ok運算符重載:當兩個操作數均為整數時,*和/重載為整乘和整除,結果為整數,除法運算后舍去小數取整。如:5/4 //結果為1,整數當兩個操作數均為整數,%定義為求余運算,也稱求模運算,結果為兩個整數相除后的余數。如果兩個整數中有負數,則先用兩數絕對值求余,最后結果的符號與被除數相同。例如6%3 //結果為06%7 //結果為67%6 //結果為1C++中算術運算應注意數據溢出問題,即運算結果超出對應數據類型的表示范圍。編譯程序只會對除法運算時除數為0這種情況提示出錯,而特別容易溢出的整數的加、減和乘法運算產生溢出的情況,系統不作為錯誤處理,程序將繼續執行并產生錯誤的計算結果。因此,程序設計者必須在程序中解決檢查并處理整數溢出問題。

只要有一個操作數是實數,兩個操作數均轉換為double型,*和/重載為普通的乘和除,結果是實數:5/4.0 //結果為1.25,實數2.關系運算符和邏輯運算符ok

關系運算符都是二元運算符,包括:(大于)、(不小于)、(小于)、(不小于)、==(等于)和!=(不等于)。關系運算符完成兩個操作數大小的比較,結果為邏輯值true(真)或false(假)。每種可比較大小的數據類型,都重載了關系運算符。不同類型,自動轉換為同一類型后,采用對應關系運算符進行比較。在C++中這兩個邏輯值與整數之間有一個對應關系,真對應1,假對應0;反過來,0對應假,非0整數對應真。所以關系運算結果可以作為整數參與算術運算、關系運算、邏輯運算及其他運算。2.關系運算符和邏輯運算符

設有定義floata=3.2;intb=5;則:3>a>b //結果是?根據右結合原則其運算過程如下:a5b3.23>F,即0>F即0優先級運算符名稱語義2!邏輯非,單目操作數的值為真,則結果為假;12&&邏輯與,雙目當兩個操作數全為真時,結果為真,否則為假;13||邏輯或,雙目兩個操作數中有一個為真,則結果為真;邏輯運算符

邏輯運算符用來進行邏輯運算。其操作數和運算結果均為邏輯量。運算結果同樣可以作為一個整數參與其他運算。

由于邏輯值和整數之間的對應關系,也允許整型和字符型操作數進行邏輯運算:21&&0 //邏輯與,21與0,結果為假:021||0 //邏輯或,21或0,結果為真:1!21 //邏輯非,21的非,結果為假:0邏輯運算符位運算符(1)按位取反運算符“~”(2)左移運算符“<<”(3)右移運算符“>>”(4)按位與運算符“&”(5)按位或運算符“|”(6)按位異或運算符“^”okc++語言提供字位運算,它對操作數的各個位進行操作。(1)按位取反運算符“~”將操作數的每個二進制位取反,即1變為0,0變為1。例如,整數a的值為10011011,則~a的值為01100100。(2)左移運算符“<<”運算一般格式為:a<<n其中a為整數,n為一個正整數常數。語義為將a的二進制數依次向左移動n個二進制位,并在低位補0。左移n位相當于乘以2的n次方,但移位運算的速度比乘法快。

(3)右移運算符“>>”與左移運算符類同,將左操作數向右移動右操作數指定的二進制位數,忽略移位后的小數部分,并在高位補0。一個整數右移n位相當于除以2的n次方,但比除法快。在VC++6.0中有符號數右移時高位補符號位,嚴格對應除法。以上三種單目運算不影響數據本身的值,而是只產生一個中間量,這個中間量被引用后即不再存在。

(4)按位與運算符“&”將兩個操作數的對應位逐一進行按位邏輯與運算。運算規則為:對應位均為1時,該位運算結果為1;否則為0。例如:a01001101b00001111a&b00001101該運算可用來將整數的某些位置0,而保留所需要的位,上例保留了低四位。(5)按位或運算符“|”將兩個操作數的對應位逐一進行按位邏輯或運算。運算規則為:只要有一個數對應位為1,該位運算結果即為1;兩個數對應位均為0,該位結果為0。例如:a01001101b00001111a|b01001111該運算符可用來將整數的某些位置1。上例高四位不變,低四位全1。(6)按位異或運算符“^”將兩個操作數的對應位逐一進行按位異或運算。運算規則為:當對應位的值不同時,該位運算結果為1,否則為0。例如:a01001101b00001111a^b01000010該運算符可用來將一個整數的某些位取反,或將整型變量的值置0(將整型變量與自身按位異或)。上例低四位取反,高四位不變。需要說明的一點是,以上例子中的整數都只取了低8位一個字節。4.賦值運算符ok

將數據存放到相應存儲單元中稱為賦值,如果該單元中已有值,賦值操作以新值取代舊值;從某個存儲單元中取出數據使用,稱為引用,引用不影響單元中的值,即一個量可以多次引用。常量只能引用,不能賦值。賦值通過賦值運算符“=”來完成,其意義是將賦值號右邊的值送到左邊變量所對應的單元中。賦值號不是等號,它具有方向性。

C++將變量名代表的單元稱為“左值”,而將變量的值稱為“右值”。左值必須是內存中一個可以訪問且可以合法修改的對象,因此只能是變量名,而不能是常量或表達式。4.賦值運算符例如下面的賦值運算是錯誤的:3.1415926=pi;

//左值不能是常數x+y=z;

//左值不能是表達式constintN=30;N=40;

//左值不能是常變量5.自增自減運算運算分前置和后置兩種,前置是先增減后引用,即先對變量自加或自減,用新的值參與其他運算;后置則是先引用后增減,即用變量原來的值參與其他運算,然后再對變量進行自加或自減,例如:inti=5,j=5,m,n;m=i++;//后置;相當于m=i;i=i+1; //結果:i的值為6,m的值為5;n=++j;//前置;相當于j=j+1;n=j;//結果:j的值為6,n的值為6;意義:使變量當前值加1或減1,再賦給該變量。要求:操作數只能是變量,不能是常量或表達式;oksizeof()運算符

用于計算一個操作數類型或一個變量的字節數。一般格式為:sizeof(數據類型)

或sizeof(變量名)

例如:sizeof(int)

值為4

sizeof(float)

值為4

doublex;

sizeof(x)

值為8結束2.2.2表達式1算術表達式

2關系表達式

3邏輯表達式和邏輯表達式求值的優化4賦值表達式與復合賦值表達式5逗號表達式ok1.算術表達式使用時注意:1、表達式中每個變量都有確定的值時才能進行表達式求值;2、考慮到算術運算溢出和精度問題,應避免:(1)兩個很接近的數直接相減;(2)除數是一個很小的數;(3)整數的連續乘運算。ok由算術運算符連接的表達式稱為算術表達式,例如:a+b*3;2.關系表達式例如:a>b>c /*等同于(a>b)>c,先求a>b的值,再將結果0或1與c比較大小*/a+b>c+d/*等同于(a+b)>(c+d),結果為0或1*/y=a>b /*計算a>b的值0或1

賦給y,y的值為0或1*/由關系運算符連接的表達式。值為true或false。ok3.邏輯表達式和邏輯表達式求值的優化由邏輯運算符連接的表達式稱為邏輯表達式。邏輯表達式的值為true或false。這個值可對應整數1或0參與其他運算。ok已知:

inta=10,b=20,c=30;floatx=1.8,y=2.4;a<b&&x>y||a<b-!c按優先級與結合性,其求值順序等同于:(a<b)&&(x>y)||(a<(b-(!c)))t1=1t2=0t4=0-&&t3=0t5=b<t6=1||

得整個表達式的值為:①②③⑥④⑤⑦13.邏輯表達式和邏輯表達式求值的優化在求邏輯表達式值的過程中,一旦表達式的值能夠確定,就不再逐步進行下面的運算。稱為“求值優化”。已知:

inta=10,b=20,c=30;求:a<b||c++ //結果以及a,b,c的值t1=1①整個表達式的值為1可見:表達式c++已不需要計算所以: c不變仍為30編程人員在使用邏輯運算時應當加以小心,優化計算固然提高了運算效率,但可能產生副作用。所謂副作用,就是出乎設計人員的意料,得到預想不到的結果。4.賦值表達式與復合賦值表達式

賦值表達式的格式為:

變量=表達式例如:x=5+6;a=b=c=d+1;

在C++中,所有的雙目算術運算符和位運算符均可與賦值運算符組合成一個單一運算符,稱為復合運賦值算符。包括以下10個:+=–=*=/=%=<<=>>=&=|=^=復合賦值運算符的要求與格式與賦值運算符完全相同,表示為:

變量復合賦值運算符表達式它等同于

變量=變量運算符表達式

例如:x+=5

等同于:x=x+5ok逗號表達式

C++中,逗號既是分隔符,又是運算符,用逗號連接起來的表達式稱為逗號表達式。一般格式為:表達式1,表達式2,…,表達式n

逗號表達式中的每一個表達式都會被運算,整個逗號表達式的值為最后一個表達式的值。例如:a=(x=3,x+=6,5+6);//a=11x=92.5.2結束2.2.3不同類型數據的混合運算和賦值時的類型轉換1不同類型數據的混合運算

2賦值類型轉換

ok運算過程中,當某個二元運算符兩邊的操作數類型不同但屬于類型相容時,系統先將精度低的操作數變換到與另一操作數精度相同,而后再進行運算。

所謂類型相容,指的就是類型不同但系統可以自動進行轉換。當賦值號的左值和右值類型不一致但屬于類型相容時,由系統自動進行類型轉換。具體規則如下:(1)字符可以作為整數參與數值運算,整數值為其ASCII碼。(2)操作數為字符或短整型時,系統自動變換成整型。(3)操作數為實型時,系統自動變換成雙精度型。(4)其余情況,當兩操作數類型不同時,將精度低(或表示范圍小)的操作數的數據類型變換到與另一操作數類型相同再進行運算例如有變量:charc1,c2;inti1,i2;floatx1,x2;則表達式x2=c1*i1+c1*x1+c1*c2的求值過程為:將c1轉換成整型,完成c1*i1,結果表示為t1;將c1和x1均轉換成雙精度型,完成c1*x1,結果表示為t2;將c1和c2均轉換成整型,完成c1*c2,結果表示為t3;然后t1轉換成雙精度型,完成t1+t2,結果表示為t4;將t3轉換成雙精度型,完成t4+t3,最后結果轉為單精度型賦給x2。

2.賦值類型轉換2.5.3結束系統自動進行類型轉換規則:1、實型數賦給整形變量:取整;注意溢出;2、整型數賦給實型變量:先轉換為實型數;3、字符型數賦給整形變量:ASCII碼為依據;分為兩種情況:符號位是0或1時不同;若符號位為1,則低位字節不變,高位字節全部置1再賦值。4、絕對值較大的數賦給表達范圍較小的數據類型時,注意溢出;2.5.4強制類型轉換運算符ok其格式為:

(<type>)<表達式> //形式一或<type> (<表達式>)

//形式二作用:將表達式強制轉換為<type>類型, 但表達式的值及其類型不變。任意數據類型

賦值運算中,當左值與右值類型不一致時,系統將按照左值的類型,自動進行強制轉換。例如: 設有以下定義

doublex=2.3,y;inti=2,j;(1)j2.3x2.3……22(1)j=x; (2)y=i;由系統按左值j、y類型自動完成強制轉換功能(2)y2i2……2.02.02.5.4強制類型轉換運算符第三章:簡單輸入/輸出3.1cincin用來在程序執行期間給變量輸入數據,一般格式為:cin>>變量名1《>>變量名2>>…>>變量名n》;

cout實現將數據輸出到顯示器的操作,一般格式為:cout<<表達式1《<<表達式2<<…<<表達式n》;

同時必須在程序開頭增加一行:#include<iostream.h>3.1.1十進制數據的輸入輸出請看下例:inti,j;floatx,y;cout<<”Inputi,j,x,y:”<<endl;cin>>i>>j; //Dcin>>x>>y; cout<<”i=”<<i<<′\t′<<”j=”<<j<<endl;cout<<”x+y=”<<x+y<<endl;若輸入:10204.58.6<CR>則程序輸出:i=10 j=20x+y=13.1輸出時各數據間是無間隔的,因此應當有意輸出一些間隔符ok3.1.2輸入字符數據cin與cin.get()的區別(1)cin例如: charc1,c2,c3; cin>>c1;

//A

cin>>c2>>c3;

程序執行到A行時,等待用戶輸入數據。若輸入:Abc<CR>則cin分別將字符A、b、c賦給變量c1、c2、c3。cin自動跳過輸入的空白字符(包括空格,制表,backspace和回車等)。

(2)cin.get()例如: charc1,c2,c3,c4; cin.get(c1); //B cin.get(c2); cin.get(c3);程序執行到B行時,若輸入:Ab<CR>則執行結果是:字符′A′、空格、字符′b′分別賦給變量c1、c2、c3;輸入行中仍保留回車符。cin.get()把從鍵盤上輸入的所有字符,包括空白字符,都作為輸入字符賦給字符變量

關于字符的輸出,請看下例,假定字符c1、c2、c3的值分別為字符′a′、′b′和′c′,執行以下語句序列:cout<<c1<<′\t′<<c2<<′\n′;cout<<c3<<endl;cout<<′O′<<′k′<<endl;屏幕上將輸出:a bcOk輸出時字符之間是無間隔的,如果想讓字符間有間隔,必須輸出間隔符

補充.字符串輸入輸出向一個字符數組中輸入字符串時,用函數getline()。getline()以用戶按下回車鍵作為結束,在此之前的所有輸入都放入字符數組中:cin.getline(char[],int)其中第一個參數是已經定義的字符數組名,第二個參數是讀入字符的最多個數n(包括字符串結束符‘/0’)。ok常用cout輸出字符串。雙引號中的字符串常量照原樣輸出,程序中通常通過輸出字符串常量來輸出一些提示信息。字符數組將輸出串結束符前所有字符。補充:字符串輸入輸出函數保證在執行時總會為字符串的結束符保留一個字節。當鍵盤的輸入字符(字節)數多于(n-1)時,后面的字符不會進入字符數組,字符串結束符自動加在字符數組的最后一個字節中。當輸入字符數少于該值時,字符串結束符自動加在輸入到字符數組中的最后一個字符的后面。請看下例:charcity[11];cin.getline(city,10);

//輸入城市名最多5個中文字cout<<“城市名:“<<city<<endl;ok如果要求按八進制或十六進制輸入輸出,在cin或cout中必須指明相應的數據形式,oct為八進制,hex為十六進制,dec為十進制。例如:inti,j,k,l;cout<<”Inputi(oct),j(hex),k(hex),l(dec):”<<endl;cin>>oct>>i; //輸入為八進制數cin>>hex>>j; //輸入為十六進制數cin>>k; //輸入仍為十六進制數cin>>dec>>l; //輸入為十進制數cout<<”hex:”<<”i=”<<hex<<i<<endl;cout<<”dec:”<<”j=”<<dec<<j<<′\t′;cout<<”k=”<<k<<endl;cout<<”oct:”<<”l=”<<oct<<l;cout<<dec<<endl; //恢復十進制輸出狀態ok輸入輸出的格式控制(1)各種進制數據的輸入輸出執行時輸出:Inputi(oct),j(hex),k(hex),l(dec):此時從鍵盤輸入:0320x3f0xa017<CR>則輸出結果為:hex:i=1adec:j=63 k=160oct:l=21由于已經在cin中指明數制,因此從鍵盤輸入時,八進制和十六進制數可以省略其開頭的0和0x標志。

在cin或cout中指明數制后,該數制將一直有效,直到重新指明用其他數制。特別注意:輸入數據的格式、個數和類型必須與cin中的變量一一對應,否則不僅使輸入數據錯誤,而且影響后面其他數據的正確輸入。輸入輸出的格式控制為了使數據間隔開,還可以用C++提供的函數setw()指定輸出數據項的寬度。例如:inti=2,j=3;floatx=2.6,y=1.8;cout<<setw(6)<<i<<setw(10)<<j<<endl;cout<<setw(10)<<i*j<<endl;cout<<setw(8)<<x<<setw(8)<<y<<endl;輸出結果為:

2362.61.8使用setw()必須在程序的開始處增加:#include<iomanip.h>ok(2)設置數據間隔第4章流程控制語句4.1選擇結構程序設計

對程序的運行流程進行控制,主要通過執行專門用來控制流程的語句來實現。流程控制語句也稱為過程化語句。分支語句是三種基本流程控制語句之一。C++提供以下三種分支語句:if語句

條件運算符“?:”

swith語句

4.2.1if

語句if語句有兩種基本格式為:1、if(<表達式>)<語句1>;2、if(<表達式>)<語句1>else <語句2>;if語句【例4.1】輸入一個年份,判斷是否閏年。算法分析:假定年份為year,閏年的條件是:year%4==0&&year%100!=0||year%400==0。#include<iostream.h>voidmain(){ intyear; cout<<"輸入年份:"<<endl; cin>>year; if(year%4==0&&year%100!=0 ||year%400==0) cout<<year<<"是閏年"<<endl; elsecout<<year<<"不是閏年"<<endl;}ok分析:讀入三個數,先求出兩個數中較大者,再將該大數與第三個數比較,求出最大數。#include<iostream.h>voidmain(){inta,b,c,max;cout<<"輸入三個正數:";cin>>a>>b>>c;cout<<"a="<<a<<'\t'<<"b="<<b<<'\t‘ <<"c="<<c<<endl;if(a>b)max=a;elsemax=b;if(c>max)cout<<“最大數為:”<<c<<endl;elsecout<<“最大數為:”<<max<<endl;}if

語句【例4.2】從鍵盤上輸入三個整數,輸出其中的最大數。ok

if語句中,如果內嵌語句又是if語句,就構成了嵌套if語句。if語句可實現二選一分支,而嵌套if語句則可以實現多選一的多路分支情況。嵌套有兩種形式,第一種是嵌套在else分支中:if(<表達式1>)<語句1>;elseif(<表達式2>)語句2;elseif…else<語句n>;

第二種是嵌套在if分支中為:if(<表達式1>)if(<表達式2>)<語句1>;

else<語句2>;

if語句//方法1:采用if中嵌套形式#include<iostream.h>voidmain(){ inta,b,c,max; cout<<"輸入三個正數:"; cin>>a>>b>>c; cout<<"a="<<a<<'\t'<<"b="<<b<<'\t'<<"c="<<c<<endl; if(a>b)if(a>c)max=a;//a>b且a>c elsemax=c;//a>b且a<c else if(b>c)max=b;//a<=b且b>c elsemax=c;//a<=b且b<c cout<<"最大數max="<<max;}if

語句【例3.3】用嵌套if語句完成【例3.2】的任務。ok//方法2:采用else中嵌套形式#include<iostream.h>voidmain(){ inta,b,c,max; cout<<"輸入三個正數:"; cin>>a>>b>>c; cout<<"a="<<a<<'\t'<<"b="<<b<<'\t'<<"c="<<c<<endl; if(a>b&&a>c)max=a; elseif(b>a&&b>c)max=b; elsemax=c; cout<<"最大數為:max="<<max;}if

語句ok

要特別注意else和if的配對關系。C++規定了if和else的“就近配對”原則,即相距最近且還沒有配對的一對if和else首先配對。按上述規定,第二種嵌套形式中的else應與第二個if配對。如果根據程序的邏輯需要改變配對關系,則要將屬于同一層的語句放在一對“{}”中。如第二種嵌套形式中,要讓else和第一個if配對,語句必須寫成:if(表達式1){if(表達式2)語句1;}else語句2;

第二種嵌套形式較容易產生邏輯錯誤,而第一種形式配對關系則非常明確,因此從程序可讀性角度出發,建議盡量使用第一種嵌套形式。請看以下兩個語句://語句1:if(n%3==0)if(n%5==0)cout<<n<<″是15的倍數″<<endl;elsecout<<n<<″是3的倍數但不是5的倍數″<<endl;//語句2:if(n%3==0){if(n%5==0)cout<<n<<″是15的倍數″<<endl;}elsecout<<n<<″不是3的倍數″兩個語句的差別只在于一個“{}”,但表達的邏輯關系卻完全不同。【例4.4】某商場優惠活動規定,某種商品單價為80元,一次購買5件以上(包含

5件)10件以下(不包含10件)打9

折,一次購買10件以上(包含10件)打8折。設計程序根據客戶的購買量計算總價。if

語句算法1、輸入購買件數count,設置單價price=80(元)2、根據count值確定折扣discount;3、實際售價amount=price*count*discount;4、輸出amount的值。算法細化:2.1、if(count<5)discount=1;2.2、if(count>=5&&count<10)discount=0.9;2.3、if(count>=10)discount=0.8;ok#include<iostream.h>voidmain(){floatprice=80,discount,amount;//單價,折扣,總價

intcount; //購買件數

cout<<"輸入購買件數:"<<endl;cin>>count;if(count<5)discount=1;elseif(count<10)discount=0.9;elsediscount=0.8;amount=price*count*discount;cout<<"購買件數:"<<count<<endl;cout<<"單價:"<<price<<'\t'<<"折扣:“

<<discount<<endl;cout<<"總價:"<<amount<<endl;}請在VC++平臺上運行,輸入不同的件數,使程序所有分支都可以被執行一次。ok【例4.5】求一元二次方程

ax2+bx+c=0的根。其中系數a(a≠0)、b、c的值由鍵盤輸入。分析:輸入系數a(a≠0)、b、c后,令delta=b2–4ac,結果有三種情況:若delta=0,方程有兩個相同實根;若delta>0,方程有兩個不同實根;若delta<0,方程無實根。if

語句算法1、輸入系數a(a≠0)、b、c;2、令delta=b2–4ac;3、根據delta的值求方程的根;4、輸出方程的根;算法細化:3.1、if(delta==0)方程有兩個相同實根;計算…3.2、if(delta>0)方程有兩個不同實根;計算…3.3、if(delta<0)方程無實根;計算…ok#include<iostream.h>#include<math.h>voidmain(){ floata,b,c; floatdelta,x1,x2; constfloatzero=0.0001;//定義一個很小的常數

cout<<"輸入三個系數a(a!=0),b,c:"<<endl; cin>>a>>b>>c; cout<<"a="<<a<<'\t'<<"b="<<b<<'\t‘ <<"c="<<c<<endl; delta=b*b-4*a*c;求一元二次方程的根源程序if(fabs(delta)<zero){//絕對值很小的數即被認為是0 cout<<"方程有兩個相同實根:"; cout<<"x1=x2="<<-b/(2*a)<<endl;}elseif(delta>0){ delta=sqrt(delta); x1=(-b+delta)/(2*a); x2=(-b-delta)/(2*a); cout<<"方程有兩個不同實根:"; cout<<"x1="<<x1<<'\t'<<"x2=“ <<x2<<endl;} else //delta<0 cout<<"方程無實根!"<<endl;}請在VC++平臺上運行,輸入不同的系數,使程序所有分支都可以被執行一次。3.1.2條件運算符“?:”

if語句在某些情況下可以用條件運算符“?:”來簡化表達。“?:”是一個三元運算符,其構成的表達式格式為:<表達式1>?<表達式2>:<表達式3>執行邏輯:先計算表達式1,若其值為真(或非0),則計算表達式2(不計算表達式3),并將該值作為整個表達式的值;反之,即表達式1的值為假或為0,則計算表達式3(不計算表達式2),并將該值作為整個表達式的值。例如:inta=6,b=7,min=a<b?a:b;//min=6 min=a<b?++a:++b;//min=7a=7b=7min=a<b?a++:b++;//min=6a=7b=7ok3.1.3switch語句用嵌套if語句可以實現多選一的情況。另外C++中還提供了一個switch語句,稱為開關語句,也可以用來實現多選一:switch(表達式){case常量表達式1:《語句序列1》《break;》……case常量表達式n:《語句序列n》《break;》《default:語句序列》}

switch語句格式(1)各個case(包括default)分支出現的次序可以任意,通常將default放在最后。(2)break語句可選,如果沒有break語句,每一個case分支都只作為開關語句的執行入口,執行完該分支后,還將接著執行其后的所有分支。因此,為保證邏輯的正確實現,通常每個case分支都與break語句聯用。(3)每個常量表達式的取值必須各不相同,否則將引起歧義。(4)允許多個常量表達式對應同一個語句序列。例如:charscore;cin>>score;switch(score){case′A′:case′a′:cout<<″excellent″; break;case′B′:case′b′:cout<<″good″;break;default:cout<<″fair″;}(5)從形式上看,switch語句的可讀性比嵌套if語句好,但不是所有多選一的問題都可由開關語句完成,這是因為開關語句中限定了條件表達式的取值類型。

okswitch語句例子【例3.6】

運輸公司對所運貨物實行分段計費。設運輸里程為s,則運費打折情況如下:

s<250 不打折扣

250<=s<500 2%折扣

500<=s<1000 5%折扣

1000<=s<2000 8%折扣

2000<=s<3000 10%折扣

3000<=s 15%折扣設每公里每噸的基本運費為p,貨物重量為w,折扣為d,則總運費f為:f=p*w*s*(1-d)設計程序,當輸入p、w和s后,計算運費f。算法1、輸入每噸運費p、貨物重量w、運輸里程s;2、根據運輸里程s計算折扣d;3、計算總運費f=p*w*s*(1-d);4、輸出計算結果;算法細化:2、根據運輸里程s計算折扣d分析:如果用switch語句,必須使表達式符合語法要求,分析發現,里程s的分段點均是250的倍數,因此,將里程s除以250,取整數商,便得到若干整數值。okswitch(c=s/250){case0:d=0;break;case1:d=0.02;break;case2:case3:d=0.05;break;case4:case5:case6:case7:d=0.08;break;case8:case9:case10:case11:d=0.1;break;default:d=0.15;}s<250 不打折扣250<=s<500 2%折扣500<=s<1000 5%折扣1000<=s<2000 8%折扣2000<=s<3000 10%折扣3000<=s15%折扣#include<iostream.h>#include<iomanip.h>voidmain(){intc,s;floatp,w,d,f; cout<<"輸入運輸單價p,重量w和里程s:"<<endl; cin>>p>>w>>s;c=s/250; switch(c){ case0:d=0;break; case1:d=0.02;break; case2:case3:d=0.05;break; case4:case5:case6:case7:d=0.08;break; case8:case9:case10:case11:d=0.1;break; default:d=0.15;} f=p*w*s*(1-d); cout<<"運輸單價為"<<p<<'\t'<<"重量為"<<w<<'\t‘ <<"里程為"<<s<<endl; cout<<"折扣為"<<d<<endl; cout<<"運費為"<<f<<endl;}請在VC++平臺上運行,輸入不同的里程,使程序所有分支都可以被執行一次。ok【例3.7】

設計一個計算器程序,實現加、減、乘、除運算。分析:讀入兩個操作數和運算符,根據運算符完成相應運算。#include<iostream.h>voidmain(){floatnum1,num2;charop;cout<<"輸入操作數1,運算符,操作數2:"<<endl;cin>>num1>>op>>num2;switch(op){case'+':cout<<num1<<op<<num2<<"="<<num1+num2<<endl;break;case'-':cout<<num1<<op<<num2<<"="<<num1-num2<<endl;break;case'*':cout<<num1<<op<<num2<<"="<<num1*num2<<endl;break;case'/':cout<<num1<<op<<num2<<"="<<num1/num2<<endl;break;default:cout<<op<<"是無效運算符!";}}常量表達式采用字符型,上機運行一下。循環控制語句是三種基本流程控制語句之一。C++提供以下三種循環語句:while語句

do-while語句

for語句4.3循環結構程序設計4.3.1while語句while語句也稱為當循環。語句格式為:while(表達式)

循環體語句;

圖3.1while語句的執行流程圖求表達式的值表達式值為真?是否執行循環體語句while語句【例4.8】求1+2+3+4的值。okN個連續整數相加算法1、設置變量i用來放被加數,變量sum用來放和值,并初始化;2、從第一個數開始,依次將被加數賦給i,并進行操作sumsum+i;3、輸出sum;細化算法2:

while(還有被加數) { i=當前被加數;

sum+=i;i準備接受下一個被加數;

}源程序如下:#include<iostream.h>voidmain(){inti=1,sum=0;//循環初始條件

while(i<=4){ sum+=i; i++; //修改循環條件

}cout<<"sum="<<sum<<endl;

}在VC++平臺上運行,試一試是否正確okwhile語句注意:在有循環語句的程序中,通常循環開始前對循環條件進行初始化;而在循環體語句中要包含修改循環條件的語句,否則循環將不能終止而陷入死循環。C++表達方式靈活,上例中的循環語句還可以寫成:while(i<=n)sum+=i++;或者while(sum+=i++,i<=n);//循環體為空語句修改程序后在VC++平臺上運行,看是否正確4.3.2do-while語句

do-while語句稱為直到循環,格式為:

do循環體語句

while(表達式)

否是表達式的值為真?執行循環體語句求表達式的值圖3.2do-while語句的執行流程圖do-while語句do/while語句和while語句的區別:多數情況下可以互相替代。區別是do/while語句至少執行一次循環體后再判斷循環條件是否滿足;while語句先判斷條件是否滿足,然后才執行循環體。【例4.9】

輸入一段文本,統計文本的行數、單詞數及字符數。假定單詞之間以空格或跳格或換行符間隔,且文本開始沒有空行。算法分析:1、逐個讀入文本中的字符,直到讀到一個輸入結束符EOF為止。2、如何算行數?行結束標志為讀到字符′\n′;3、如何算單詞數?設一個變量isword,讀到字符時isword=1,讀到間隔符時isword=0;如果讀到一個間隔符而此時isword值為1,則說明剛讀完一個單詞;(如果讀到一個字符而此時isword值為0,則說明剛開始讀一個單詞;)4、如何算字符數?do-while語句ok算法1、設置變量line、word、ch分別代表行數、單詞數、非分隔字符數,并初始化;設置變量isword來輔助統計單詞數;2、do{ 從鍵盤讀入一個字符c;

if(c==’\n’)line++; if(是單詞開頭)word++; if(c不是分隔符)ch++; }while(c!=EOF);3、輸出統計結果。將下面的程序在VC++平臺上運行,試一試是否正確#include<iostream.h>voidmain(){charc;intline=0,word=0,ch=0;//ch為非分隔字符數intisword=0;do{c=cin.get();if(c==′\n′)line++;//遇換行符行數+1if(c!=′′&&c!=′\t′&&c!=′\n′){//讀到非間隔符

if(isword==0)word++;//在單詞的起始處給單詞數+1ch++; //字符數加+1isword=1;}elseisword=0; //讀到間隔符}while(c!=EOF);cout<<”行數:”<<line<<endl;cout<<”單詞數:”<<word<<endl;cout<<”字符數:”<<char<<endl;}4.3.3for語句for循環語句的格式為:for(<表達式1>;<表達式2>;<表達式3>)<循環體語句>圖3.3for語句的執行流程圖否是求表達式1的值求表達式2的值表達式2值為真?執行循環體語句求表達式3的值okfor語句、while語句、do/while語句實現相同的功能:1+2+3+4inti=1,sum=0;

//循環初始條件while(i<=4)

{sum+=i;i++;

//修改循環條件

}inti=1,sum=0;//循環初始條件do{ sum+=i; i++;//修改循環條件

}while(i<=4);for(inti=1,sum=0;i<=4;i++){ sum+=i;}/*習慣上:表達式1:循環初始條件;表達式2:循環終止條件;表達式3:修改循環條件*/okfor語句的應用for語句的幾點說明:1、是先判斷型的,同while語句;2、使用更為靈活:三個表達式可以是任意表達式,因此他們就可以實現循環初始化、計算、修改循環條件等任務,而不一定非在循環體中進行;

for語句的應用【例4.11】設計程序輸出Fibonacii數列的前20項,要求每行輸出5個數據。Fibonacii數列定義如下:算法分析:除了第0項和第1項外,每一項都是由類似方法產生,即前兩項之和;所以求當前項時,只需要記住前兩項;程序不需要為每一項設置專用變量;屬遞推算法。算法:1、設置變量n表示第幾項,變量f1和f2用來記住當前項f3之前的兩項;變量初始化n=0;2、while(當前項不到第20項)

{ if(當前項是第0項)f1=0; if(當前項是第1項)f2=1;if(當前項是第2項或更高項)f3=f1+f2;

按要求輸出f3;f1=f2;f2=f3;//記住最近兩項 當前項后移一位;

}【例3.11】設計程序輸出Fibonacii數列的前20項,要求每行輸出2個數據。Fibonacii數列定義如下:程序如下://文件名:Ex3_11.cpp#include<iostream.h>#include<iomanip.h>voidmain(){intfib0=0,fib1=1,fib2; cout<<setw(5)<<fib0<<setw(5)<<fib1<<endl; for(intn=3;n<=20;n++){ fib2=fib0+fib1; cout<<setw(5)<<fib2; if(n%5==0)cout<<endl;

//控制每行2個數據

fib0=fib1;fib1=fib2;}}for語句的應用在VC++平臺上運行運行結果:0 1 1 2 3 5 8 13 21 3455 89 144 233377610 987 159725844181【例4.12】輸入一個不超過5位的整數,將其反向后輸出。例如輸入247,變成742輸出。算法分析:1、將整數的各個數位逐個位分開,用一個數組保存各個位的值,然后反向組成新的整數。2、將整數各位數字分開的方法是,通過求余得到個位數,然后將整數縮小十倍,再求余,并重復上述過程,分別得到十位、百位……,直到整數的值變成0為止。

for語句的應用ok數據:1、設置變量num表示輸入的整數,整型數組digit[5]用來存放num的各個位;變量i用來表示數組的當前下標;算法:1、輸入num;變量初始化:i=0;2、while(num!=0){ num對10取余,得num的當前個位數digit[i];

num整除10,即去掉個位數,十位變個位,百位變十位,……;

i++;數組digit準備記錄下一位;}3、將數組元素按下標從高到低的順序輸出;程序如下:#include<iostream.h>vo

溫馨提示

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

評論

0/150

提交評論