《《C++語(yǔ)言基礎(chǔ)》PPT課件.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《《C++語(yǔ)言基礎(chǔ)》PPT課件.ppt(496頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、C++語(yǔ)言基礎(chǔ),鹽城工學(xué)院 惠為君,C++概述,C++的特點(diǎn) 發(fā)展歷史和未來 (CC++(AT const int Number_of_Student=100; 常變量必須也只能在說明時(shí)進(jìn)行初始化; 常變量初始化之后,不允許再被賦值; 常變量必須先說明后使用; 常變量存儲(chǔ)在數(shù)據(jù)區(qū),并且可以按地址訪問,編譯時(shí)系統(tǒng)對(duì)常變量進(jìn)行類型檢查。 C++建議使用常變量,而盡量不使用字面常量。,,2.3.3 結(jié)束,,,2.1.7 變 量,,,1 變量說明,2 變量賦初值,變量,在程序中是指可以改變值的量; 變量必須用標(biāo)識(shí)符進(jìn)行標(biāo)識(shí),稱為變量名; 變量有類型之分,如整形變量、字符變量等; 任何變量都必須先說明后
2、使用;一是便于編譯程序?yàn)樽兞糠峙淇臻g,二是便于編譯時(shí)進(jìn)行語(yǔ)法檢查; 變量使用的第一步,是給變量賦初始值;,,ok,,,變量說明,在C++中,變量說明的一般格式為: 存儲(chǔ)類型數(shù)據(jù)類型 變量名1,變量名2, ,變量名n;,下面是變量說明的幾個(gè)例子: int i, j, k; //說明三個(gè)整型變量i, j, k float x, y, z; //說明三個(gè)實(shí)型變量x, y, z char c1, c2; //說明兩個(gè)字符型變量c1, c2 double dx; //說明一個(gè)雙精度型變量dx,,變量說明 結(jié)束,,,變量賦初值,(1)變量說明時(shí)直接賦初值。 例如:int a=3, b=4, c
3、=5; float x=3.0; (2)用賦值語(yǔ)句賦初值。嚴(yán)格的說,只有前者可稱賦初值 例如:float x, e; x=3.5; e=2.71828;,,結(jié)束,,,給變量賦初值稱為初始化,有兩種方法:,2.2 基本運(yùn)算符,,,對(duì)常量和變量進(jìn)行運(yùn)算是通過運(yùn)算符來實(shí)現(xiàn)的. 常量和變量通過運(yùn)算符組成C++表達(dá)式,由表達(dá)式再組成C++語(yǔ)句. 運(yùn)算符是完成對(duì)常量和變量進(jìn)行運(yùn)算的符號(hào). 把參與運(yùn)算的對(duì)象稱為操作數(shù).,按照要求的操作數(shù)的個(gè)數(shù),運(yùn)算符分為單目(一元)運(yùn)算符、雙目(二元)運(yùn)算符和三目(三元)運(yùn)算符。單目運(yùn)算符只對(duì)一個(gè)操作數(shù)運(yùn)算,如負(fù)號(hào)運(yùn)算符“”等;雙目運(yùn)算符要求有兩個(gè)操作數(shù),如乘
4、號(hào)運(yùn)算符“*”等;三目運(yùn)算符要求有三個(gè)操作數(shù),三元運(yùn)算符只有一個(gè)“?:”。,1.算術(shù)運(yùn)算符,ok,,,,運(yùn)算符重載: 當(dāng)兩個(gè)操作數(shù)均為整數(shù)時(shí),*和/重載為整乘和整除,結(jié)果為整數(shù),除法運(yùn)算后舍去小數(shù)取整。如: 5/4//結(jié)果為1,整數(shù),,,當(dāng)兩個(gè)操作數(shù)均為整數(shù),%定義為求余運(yùn)算,也稱求模運(yùn)算,結(jié)果為兩個(gè)整數(shù)相除后的余數(shù)。如果兩個(gè)整數(shù)中有負(fù)數(shù),則先用兩數(shù)絕對(duì)值求余,最后結(jié)果的符號(hào)與被除數(shù)相同。例如 6%3//結(jié)果為0 6%7//結(jié)果為6 7%6//結(jié)果為1,C++中算術(shù)運(yùn)算應(yīng)注意數(shù)據(jù)溢出問題,即運(yùn)算結(jié)果超出對(duì)應(yīng)數(shù)據(jù)類型的表示范圍。編譯程序只會(huì)對(duì)除法運(yùn)算時(shí)除數(shù)為0這種情況提示出錯(cuò),而特別容易溢出的整
5、數(shù)的加、減和乘法運(yùn)算產(chǎn)生溢出的情況,系統(tǒng)不作為錯(cuò)誤處理,程序?qū)⒗^續(xù)執(zhí)行并產(chǎn)生錯(cuò)誤的計(jì)算結(jié)果。因此,程序設(shè)計(jì)者必須在程序中解決檢查并處理整數(shù)溢出問題。,只要有一個(gè)操作數(shù)是實(shí)數(shù),兩個(gè)操作數(shù)均轉(zhuǎn)換為double型,*和/重載為普通的乘和除,結(jié)果是實(shí)數(shù): 5/4.0//結(jié)果為1.25,實(shí)數(shù),,,2.關(guān)系運(yùn)算符和邏輯運(yùn)算符,,ok,關(guān)系運(yùn)算符都是二元運(yùn)算符,包括:(大于)、(不小于)、(小于)、(不小于)、= =(等于)和!=(不等于)。關(guān)系運(yùn)算符完成兩個(gè)操作數(shù)大小的比較,結(jié)果為邏輯值true(真)或false(假)。每種可比較大小的數(shù)據(jù)類型,都重載了關(guān)系運(yùn)算符。不同類型,自動(dòng)轉(zhuǎn)換為同一類型后,采用對(duì)應(yīng)
6、關(guān)系運(yùn)算符進(jìn)行比較。,,,,在C++中這兩個(gè)邏輯值與整數(shù)之間有一個(gè)對(duì)應(yīng)關(guān)系,真對(duì)應(yīng)1,假對(duì)應(yīng)0;反過來,0對(duì)應(yīng)假,非0整數(shù)對(duì)應(yīng)真。所以關(guān)系運(yùn)算結(jié)果可以作為整數(shù)參與算術(shù)運(yùn)算、關(guān)系運(yùn)算、邏輯運(yùn)算及其他運(yùn)算。,2.關(guān)系運(yùn)算符和邏輯運(yùn)算符,設(shè)有定義 float a=3.2;int b=5;則: 3ab//結(jié)果是?,根據(jù)右結(jié)合 原則其運(yùn)算 過程如下:,a,5,b,3.2,3,,,F, 即0,,,,F即0,,,,,,,邏輯運(yùn)算符,邏輯運(yùn)算符用來進(jìn)行邏輯運(yùn)算。其操作數(shù)和運(yùn)算結(jié)果均為邏輯量。運(yùn)算結(jié)果同樣可以作為一個(gè)整數(shù)參與其他運(yùn)算。,由于邏輯值和整數(shù)之間的對(duì)應(yīng)關(guān)系,也允許整型和字符型操作數(shù)進(jìn)行邏輯運(yùn)算: 2
7、1//左值不能是常數(shù) x+y=z;//左值不能是表達(dá)式 const int N=30; N=40;//左值不能是常變量,5.自增自減運(yùn)算,運(yùn)算分前置和后置兩種,前置是先增減后引用,即先對(duì)變量自加或自減,用新的值參與其他運(yùn)算;后置則是先引用后增減,即用變量原來的值參與其他運(yùn)算,然后再對(duì)變量進(jìn)行自加或自減,例如: int i=5, j=5, m, n; m=i++; //后置;相當(dāng)于m=i; i=i+1; //結(jié)果:i的值為6,m的值為5; n=++j; //前置;相當(dāng)于j=j+1;n=j; //結(jié)果:j的值為6,n的值為6;,意義:使變量當(dāng)前值加1或減1,再賦給該變量。 要求:操作數(shù)只能
8、是變量,不能是常量或表達(dá)式;,ok,,,,sizeof( ) 運(yùn)算符,用于計(jì)算一個(gè)操作數(shù)類型或一個(gè)變量的字節(jié)數(shù)。一般格式為:sizeof (數(shù)據(jù)類型) 或 sizeof(變量名) 例如:sizeof(int) 值為4 sizeof( float) 值為4 double x; sizeof( x) 值為8,,結(jié)束,,,2.2.2 表達(dá)式,,,,,,1 算術(shù)表達(dá)式,2 關(guān)系表達(dá)式,3 邏輯表達(dá)式和邏輯表達(dá)式求值的優(yōu)化,4 賦值表達(dá)式與復(fù)合賦值表達(dá)式,5 逗號(hào)表達(dá)式,ok,,,,,1.算術(shù)表達(dá)式,使用時(shí)注意: 1、表達(dá)式中每個(gè)變量都有確定的值時(shí)才能進(jìn)行表達(dá)式求值; 2、考慮到算術(shù)運(yùn)算溢出和精度
9、問題,應(yīng)避免: (1)兩個(gè)很接近的數(shù)直接相減; (2)除數(shù)是一個(gè)很小的數(shù); (3)整數(shù)的連續(xù)乘運(yùn)算。,ok,,,,由算術(shù)運(yùn)算符連接的表達(dá)式稱為算術(shù)表達(dá)式,例如:a+b*3 ;,2.關(guān)系表達(dá)式,例如: abc /*等同于(ab)c,先求ab 的值, 再將結(jié)果0或1與c比較大小*/ a+bc+d /*等同于(a+b)(c+d), 結(jié)果為0或1*/ y=ab /*計(jì)算ab的值0或1 賦給y,y的值為0或1*/,由關(guān)系運(yùn)算符連接的表達(dá)式。值為true或false。,ok,,,,3.邏輯表達(dá)式和邏輯表達(dá)式求值的優(yōu)化,由邏輯運(yùn)算符連接的表達(dá)式稱為邏輯表達(dá)式。邏輯表達(dá)式的值為true或fals
10、e。這個(gè)值可對(duì)應(yīng)整數(shù)1或0參與其他運(yùn)算。,ok,,已知: int a=10, b=20, c=30;float x=1.8, y=2.4;,ay||ay)||(a<(b-(!c))),,,,,,,,,t1=1,t2=0,t4=0,-, 求: a
11、= 表達(dá)式 例如:x=5+6;a=b=c=d+1; 在C++中,所有的雙目算術(shù)運(yùn)算符和位運(yùn)算符均可與賦值運(yùn)算符組合成一個(gè)單一運(yùn)算符,稱為復(fù)合運(yùn)賦值算符。包括以下10個(gè): + = = * = / = % = = int i1, i2; float x1, x2; 則表達(dá)式 x2=c1*i1+c1*x1+c1*c2 的求值過程為:將c1轉(zhuǎn)換成整型,完成c1*i1,結(jié)果表示為t1;將c1和x1均轉(zhuǎn)換成雙精度型,完成c1*x1,結(jié)果表示為t2;將c1和c2均轉(zhuǎn)換成整型,完成c1*c2,結(jié)果表示為t3;然后t1轉(zhuǎn)換成雙精度型,完成t1+t2,結(jié)果表示為t4;將t3轉(zhuǎn)換成雙精度型,完成t4+t3,最后
12、結(jié)果轉(zhuǎn)為單精度型賦給x2。,,,2.賦值類型轉(zhuǎn)換,,2.5.3結(jié)束,系統(tǒng)自動(dòng)進(jìn)行類型轉(zhuǎn)換規(guī)則: 1、實(shí)型數(shù)賦給整形變量:取整;注意溢出; 2、整型數(shù)賦給實(shí)型變量:先轉(zhuǎn)換為實(shí)型數(shù); 3、字符型數(shù)賦給整形變量:ASCII碼為依據(jù);分為兩種情況:符號(hào)位是0或1時(shí)不同; 若符號(hào)位為1,則低位字節(jié)不變,高位字節(jié)全部置1再賦值。 4、絕對(duì)值較大的數(shù)賦給表達(dá)范圍較小的數(shù)據(jù)類型時(shí),注意溢出;,,,2.5.4 強(qiáng)制類型轉(zhuǎn)換運(yùn)算符,ok,,,其格式為: () //形式一 或 ()//形式二,作用:將表達(dá)式強(qiáng)制轉(zhuǎn)換為類型, 但表達(dá)式的值及其類型不變。,,任意數(shù)據(jù)類型,,,,賦值運(yùn)算中,當(dāng)左值與右值類型不一致時(shí),
13、系統(tǒng)將按照左值的類型,自動(dòng)進(jìn)行強(qiáng)制轉(zhuǎn)換。,例如: 設(shè)有以下定義 double x=2.3,y; int i=2,j;,(1) j,2.3,x,,2.3, ,2,2,(1) j=x;(2) y=i;,由系統(tǒng)按 左值j 、y 類型自動(dòng) 完成強(qiáng)制 轉(zhuǎn)換功能,(2) y,2,i,,2, ,2.0,2.0,,,2.5.4 強(qiáng)制類型轉(zhuǎn)換運(yùn)算符,,,第三章: 簡(jiǎn)單輸入/輸出,3.1 cin cin用來在程序執(zhí)行期間給變量輸入數(shù)據(jù), 一般格式為: cin變量名1變量名2變量名n; cout實(shí)現(xiàn)將數(shù)據(jù)輸出到顯示器的操作, 一般格式為: cout,3.1.1十進(jìn)制數(shù)據(jù)的輸入輸出,請(qǐng)看下例: int i, j; f
14、loat x, y; coutij;//D cinxy; cout 則程序輸出: i=10j=20 x+y=13.1 輸出時(shí)各數(shù)據(jù)間是無(wú)間隔的,因此應(yīng)當(dāng)有意輸出一些間隔符,ok,,,3.1.2 輸入字符數(shù)據(jù) cin 與cin.get( )的區(qū)別 (1) cin 例如:char c1, c2, c3; cinc1;//A cinc2c3; 程序執(zhí)行到A行時(shí),等待用戶輸入數(shù)據(jù)。 若輸入:A b c 則cin分別將字符A、b、c賦給變量c1、c2、c3。 cin自動(dòng)跳過輸入的空白字符(包括空格,制表,backspace和回車等)。,(2)cin.get() 例如:char c1, c2, c3, c
15、4; cin.get (c1);//B cin.get (c2); cin.get (c3); 程序執(zhí)行到B行時(shí),若輸入:A b 則執(zhí)行結(jié)果是:字符A、空格、字符b分別賦給變量c1、c2、c3;輸入行中仍保留回車符。cin.get()把從鍵盤上輸入的所有字符,包括空白字符,都作為輸入字符賦給字符變量,關(guān)于字符的輸出,請(qǐng)看下例,假定字符c1、c2、c3的值分別為字符a、b和c,執(zhí)行以下語(yǔ)句序列: cout<
16、,補(bǔ)充.字符串輸入輸出,向一個(gè)字符數(shù)組中輸入字符串時(shí),用函數(shù)getline() 。getline() 以用戶按下回車鍵作為結(jié)束,在此之前的所有輸入都放入字符數(shù)組中: cin.getline (char ,int) 其中第一個(gè)參數(shù)是已經(jīng)定義的字符數(shù)組名,第二個(gè)參數(shù)是讀入字符的最多個(gè)數(shù)n(包括字符串結(jié)束符/0)。,ok,,,常用cout輸出字符串。雙引號(hào)中的字符串常量照原樣輸出,程序中通常通過輸出字符串常量來輸出一些提示信息。字符數(shù)組將輸出串結(jié)束符前所有字符。,補(bǔ)充:字符串輸入輸出,函數(shù)保證在執(zhí)行時(shí)總會(huì)為字符串的結(jié)束符保留一個(gè)字節(jié)。當(dāng)鍵盤的輸入字符(字節(jié))數(shù)多于(n1)時(shí),后面的字符不會(huì)進(jìn)入字符數(shù)
17、組,字符串結(jié)束符自動(dòng)加在字符數(shù)組的最后一個(gè)字節(jié)中。當(dāng)輸入字符數(shù)少于該值時(shí),字符串結(jié)束符自動(dòng)加在輸入到字符數(shù)組中的最后一個(gè)字符的后面。請(qǐng)看下例: char city11; cin.getline(city, 10); // 輸入城市名最多5個(gè)中文字 cout << “城市名:“ << city << endl;,ok,,,如果要求按八進(jìn)制或十六進(jìn)制輸入輸出,在cin或cout中必須指明相應(yīng)的數(shù)據(jù)形式,oct為八進(jìn)制,hex為十六進(jìn)制,dec為十進(jìn)制。例如: int i, j, k, l; cout oct i;//輸入為八進(jìn)制數(shù) cin hex j;//輸入為十六進(jìn)制數(shù) cin k;//輸入仍為
18、十六進(jìn)制數(shù) cin dec l;//輸入為十進(jìn)制數(shù) cout<<” hex:”<<” i=”<< hex<< i<< endl; cout<<” dec:”<<” j=”<< dec<< j<
19、ex:i=1a dec:j=63k=160 oct:l=21 由于已經(jīng)在cin中指明數(shù)制,因此從鍵盤輸入時(shí),八進(jìn)制和十六進(jìn)制數(shù)可以省略其開頭的0和0 x標(biāo)志。 在cin或cout中指明數(shù)制后,該數(shù)制將一直有效,直到重新指明用其他數(shù)制。 特別注意:輸入數(shù)據(jù)的格式、個(gè)數(shù)和類型必須與cin中的變量一一對(duì)應(yīng),否則不僅使輸入數(shù)據(jù)錯(cuò)誤,而且影響后面其他數(shù)據(jù)的正確輸入。,,,輸入輸出的格式控制,為了使數(shù)據(jù)間隔開,還可以用C++提供的函數(shù)setw() 指定輸出數(shù)據(jù)項(xiàng)的寬度。例如: int i=2, j=3; float x=2.6, y=1.8; cout,ok,(2)設(shè)置數(shù)據(jù)間隔,,,,第4章 流程控制語(yǔ)句
20、,,4.1 選擇結(jié)構(gòu)程序設(shè)計(jì),,對(duì)程序的運(yùn)行流程進(jìn)行控制,主要通過執(zhí)行專門用來控制流程的語(yǔ)句來實(shí)現(xiàn)。流程控制語(yǔ)句也稱為過程化語(yǔ)句。分支語(yǔ)句是三種基本流程控制語(yǔ)句之一。C++提供以下三種分支語(yǔ)句:,if 語(yǔ)句 條件運(yùn)算符 “ ? : ” swith 語(yǔ)句,4.2.1 if 語(yǔ)句,if語(yǔ)句有兩種基本格式為: 1、if () ; 2、if () else;,,,if 語(yǔ)句,【例41】 輸入一個(gè)年份,判斷是否閏年。 算法分析:假定年份為year, 閏年的條件是 : year%4==0 ,,ok,分析:讀入三個(gè)數(shù),先求出兩個(gè)數(shù)中較大者,再將該大數(shù)與第三個(gè)數(shù)比較,求出最大數(shù)。 #include
21、void main() int a, b, c, max; coutabc; coutb) max=a; else max=b; if(cmax) cout<< “最大數(shù)為:”<
22、 if else ; 第二種是嵌套在if分支中為: if () if () ; else;,if 語(yǔ)句,//方法1:采用if中嵌套形式 #include void main() int a, b, c, max; coutabc; coutb) if(ac) max=a; //ab且ac else max=c; //ab且ac) max=b; //ac else max=c; //a<=b且b
23、main() int a,b,c,max; coutabc; coutb ,if 語(yǔ)句,,ok,要特別注意else和if的配對(duì)關(guān)系。C++規(guī)定了if和else的“就近配對(duì)”原則,即相距最近且還沒有配對(duì)的一對(duì)if和else首先配對(duì)。按上述規(guī)定,第二種嵌套形式中的else應(yīng)與第二個(gè)if配對(duì)。如果根據(jù)程序的邏輯需要改變配對(duì)關(guān)系,則要將屬于同一層的語(yǔ)句放在一對(duì)“”中。如第二種嵌套形式中,要讓else和第一個(gè)if配對(duì),語(yǔ)句必須寫成: if (表達(dá)式1) if (表達(dá)式2) 語(yǔ)句1 ; else 語(yǔ)句2 ; 第二種嵌套形式較容易產(chǎn)生邏輯錯(cuò)誤,而第一種形式配對(duì)關(guān)系則非常明確,因此從程序可讀性角度出發(fā),建議
24、盡量使用第一種嵌套形式。,請(qǐng)看以下兩個(gè)語(yǔ)句: //語(yǔ)句1: if(n%3==0) if(n%5==0) cout<
25、件) 打8折。設(shè)計(jì)程序根據(jù)客戶的購(gòu)買量計(jì) 算總價(jià)。,if 語(yǔ)句,算法,1、輸入購(gòu)買件數(shù)count,設(shè)置單價(jià)price=80(元) 2、根據(jù)count值確定折扣discount; 3、實(shí)際售價(jià)amount=price*count*discount; 4、輸出amount的值。 算法細(xì)化: 2.1、if(count=5//單價(jià),折扣,總價(jià) int count;//購(gòu)買件數(shù) coutcount; if(count<5) discount=1; else if(count<10) discount=0.9; else discount=0.8; amount=price*cou
26、nt*discount; cout<<購(gòu)買件數(shù):<
27、if 語(yǔ)句,算法,1、輸入系數(shù)a(a0)、b、c; 2、令delta= b24ac; 3、根據(jù)delta的值求方程的根; 4、輸出方程的根; 算法細(xì)化: 3.1、 if(delta==0)方程有兩個(gè)相同實(shí)根;計(jì)算 3.2、 if(delta0)方程有兩個(gè)不同實(shí)根;計(jì)算 3.3、 if(delta<0)方程無(wú)實(shí)根;計(jì)算,,ok,#include #include void main() float a,b,c; float delta,x1,x2; const float zero=0.0001;//定義一個(gè)很小的常數(shù) coutabc; cout<
28、<
29、元運(yùn)算符,其構(gòu)成的表達(dá)式格式為: ? : 執(zhí)行邏輯:先計(jì)算表達(dá)式1,若其值為真(或非0),則計(jì)算表達(dá)式2(不計(jì)算表達(dá)式3),并將該值作為整個(gè)表達(dá)式的值;反之,即表達(dá)式1的值為假或?yàn)?,則計(jì)算表達(dá)式3(不計(jì)算表達(dá)式2),并將該值作為整個(gè)表達(dá)式的值。 例如:int a=6,b=7, min=a
30、現(xiàn)多選一: switch (表達(dá)式) case 常量表達(dá)式: 語(yǔ)句序列break; case 常量表達(dá)式n:語(yǔ)句序列nbreak; default:語(yǔ)句序列 ,,,switch語(yǔ)句格式,(1)各個(gè)case(包括default)分支出現(xiàn)的次序可以任意,通常將default放在最后。 (2)break語(yǔ)句可選,如果沒有break語(yǔ)句,每一個(gè)case分支都只作為開關(guān)語(yǔ)句的執(zhí)行入口,執(zhí)行完該分支后,還將接著執(zhí)行其后的所有分支。因此,為保證邏輯的正確實(shí)現(xiàn),通常每個(gè)case 分支都與break語(yǔ)句聯(lián)用。 (3)每個(gè)常量表達(dá)式的取值必須各不相同,否則將引起歧義。,(4)允許多個(gè)常量表達(dá)式對(duì)應(yīng)同一個(gè)語(yǔ)句序
31、列。 例如: char score; cinscore; switch (score) case A: case a: cout<
32、 2%折扣 500<=s<10005%折扣 1000<=s<20008%折扣 2000<=s<300010%折扣 3000<=s15%折扣 設(shè)每公里每噸的基本運(yùn)費(fèi)為p,貨物重量為w,折扣為d,則總運(yùn)費(fèi)f為:f=p*w*s*(1-d) 設(shè)計(jì)程序,當(dāng)輸入p、w和s后,計(jì)算運(yùn)費(fèi)f。,算法,1、輸入每噸運(yùn)費(fèi)p、貨物重量w、運(yùn)輸里程s; 2、根據(jù)運(yùn)輸里程s計(jì)算折扣d; 3、計(jì)算總運(yùn)費(fèi)f=p*w*s*(1-d); 4、輸出計(jì)算結(jié)果; 算法細(xì)化: 2、根據(jù)運(yùn)輸里程s計(jì)算折扣d 分析:如果用switch語(yǔ)句,必須使表達(dá)式符合語(yǔ)法要求,分析發(fā)現(xiàn),里程s的分段點(diǎn)均是250的倍數(shù),因此,將里程s除以250,取整數(shù)
33、商,便得到若干整數(shù)值。,,ok,switch(c=s/250) case 0: d=0; break; case 1: d=0.02; break; case 2: case 3: d=0.05; break; case 4: case 5: case 6: case 7: d=0.08; break; case 8: case 9: case 10: case 11: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
34、%折扣 3000<=s 15%折扣,,#include #include void main( ) int c,s; float p,w,d,f; coutpws; c=s/250; switch(c) case 0: d=0; break; case 1: d=0.02; break; case 2: case 3: d=0.05; break; case 4: case 5: case 6: case 7: d=0.08; break; case 8:case9:case10:case11:d=0.1;break; default:d=0.15; f=p*w*s*(1-d); cout<<
35、運(yùn)輸單價(jià)為<
36、l; break; case -: cout<
37、程序設(shè)計(jì),,,4.3.1 while 語(yǔ)句,while語(yǔ)句也稱為當(dāng)循環(huán)。 語(yǔ)句格式為: while (表達(dá)式) 循環(huán)體語(yǔ)句;,圖3.1 while語(yǔ)句的執(zhí)行流程圖,,,求表達(dá)式的值,表達(dá)式值為真?,是,,否,執(zhí)行循環(huán)體語(yǔ)句,,,while 語(yǔ)句,【例48】 求1+2+3+4的值。,,ok,N個(gè)連續(xù)整數(shù)相加算法 1、設(shè)置變量i用來放被加數(shù),變量sum用來放和值,并初始化; 2、從第一個(gè)數(shù)開始,依次將被加數(shù)賦給i,并進(jìn)行操作sumsum+i; 3、輸出sum; 細(xì)化算法2: while(還有被加數(shù)) i=當(dāng)前被加數(shù); sum+=i; i準(zhǔn)備接受下一個(gè)被加數(shù); ,,,,源程序如下: #i
38、nclude void main( ) int i=1,sum=0;//循環(huán)初始條件 while(i<=4) sum+=i; i++;//修改循環(huán)條件 cout<
39、后在VC++平臺(tái)上運(yùn)行,看是否正確,,4.3.2 do-while 語(yǔ)句,do-while語(yǔ)句稱為直到循環(huán), 格式為: do 循環(huán)體語(yǔ)句 while( 表達(dá)式 ),否,是,,,,表達(dá)式的 值為真?,執(zhí)行循環(huán)體語(yǔ)句,,求表達(dá)式的值,,,圖3.2 do-while語(yǔ)句的執(zhí)行流程圖,,,do-while 語(yǔ)句,do/while語(yǔ)句和while語(yǔ)句的區(qū)別: 多數(shù)情況下可以互相替代。 區(qū)別是do/while語(yǔ)句至少執(zhí)行一次循環(huán)體后再判斷循環(huán)條件是否滿足; while語(yǔ)句先判斷條件是否滿足,然后才執(zhí)行循環(huán)體。,【例49】 輸入一段文本,統(tǒng)計(jì)文本的行數(shù)、單詞數(shù)及字符數(shù)。假定單詞之間以空格或跳格或換行符間
40、隔,且文本開始沒有空行。 算法分析: 1、逐個(gè)讀入文本中的字符,直到讀到一個(gè)輸入結(jié)束符EOF為止。 2、如何算行數(shù)?行結(jié)束標(biāo)志為讀到字符n; 3、如何算單詞數(shù)?設(shè)一個(gè)變量isword,讀到字符時(shí)isword=1,讀到間隔符時(shí)isword=0;如果讀到一個(gè)間隔符而此時(shí)isword值為1,則說明剛讀完一個(gè)單詞;(如果讀到一個(gè)字符而此時(shí)isword值為0,則說明剛開始讀一個(gè)單詞;) 4、如何算字符數(shù)?,do-while 語(yǔ)句,,ok,算法,1、設(shè)置變量line、word、ch分別代表行數(shù)、單詞數(shù)、非分隔字符數(shù),并初始化;設(shè)置變量isword來輔助統(tǒng)計(jì)單詞數(shù); 2、do從鍵盤讀入一個(gè)字符c; if (
41、 c==n) line++; if (是單詞開頭) word++; if (c不是分隔符) ch++; while (c!= EOF ); 3、輸出統(tǒng)計(jì)結(jié)果。,將下面的程序在VC++平臺(tái)上運(yùn)行,試一試是否正確,#include void main( ) char c; int line=0, word=0, ch=0; //ch為非分隔字符數(shù) int isword=0; do c=cin.get(); if (c== n) line++; //遇換行符行數(shù)+1 if (c!= ,,,4.3.3 for 語(yǔ)句,for循環(huán)語(yǔ)句的格式為: for ( ; ; ) ,,ok,,,for
42、語(yǔ)句、while語(yǔ)句、do/while語(yǔ)句實(shí)現(xiàn)相同的功能:1+2+3+4,int i=1,sum=0; //循環(huán)初始條件 while(i<=4) sum+=i; i++; //修改循環(huán)條件 ,int i=1,sum=0; //循環(huán)初始條件 do sum+=i; i++;//修改循環(huán)條件 while(i<=4);,for( int i=1,sum=0; i<=4; i++ ) sum+=i; /*習(xí)慣上:表達(dá)式1:循環(huán)初始條件;表達(dá)式2:循環(huán)終止條件;表達(dá)式3:修改循環(huán)條件*/,,ok,for 語(yǔ)句的應(yīng)用,for語(yǔ)句的幾點(diǎn)說明: 1、是先判斷型的,同while語(yǔ)句; 2、使用更為靈活: 三個(gè)
43、表達(dá)式可以是任意表達(dá)式,因此他們就可以實(shí)現(xiàn)循環(huán)初始化、計(jì)算、修改循環(huán)條件等任務(wù),而不一定非在循環(huán)體中進(jìn)行;,for 語(yǔ)句的應(yīng)用,【例411】 設(shè)計(jì)程序輸出Fibonacii數(shù)列的前20項(xiàng),要求每行輸出5個(gè)數(shù)據(jù)。 Fibonacii數(shù)列定義如下:,算法分析:除了第0項(xiàng)和第1項(xiàng)外,每一項(xiàng)都是由類似方法產(chǎn)生,即前兩項(xiàng)之和;所以求當(dāng)前項(xiàng)時(shí),只需要記住前兩項(xiàng);程序不需要為每一項(xiàng)設(shè)置專用變量; 屬遞推算法。,算法: 1、設(shè)置變量n表示第幾項(xiàng),變量 f 1和 f 2用來記住當(dāng)前項(xiàng)f 3之前的兩項(xiàng) ;變量初始化n=0; 2、while (當(dāng)前項(xiàng)不到第20項(xiàng)) if (當(dāng)前項(xiàng)是第0項(xiàng)) f 1=0; if (
44、當(dāng)前項(xiàng)是第1項(xiàng)) f 2=1; if (當(dāng)前項(xiàng)是第2項(xiàng)或更高項(xiàng))f 3=f 1+f 2; 按要求輸出 f 3 ; f 1=f 2; f 2=f 3; //記住最近兩項(xiàng) 當(dāng)前項(xiàng)后移一位; ,【例311】 設(shè)計(jì)程序輸出Fibonacii數(shù)列的前20項(xiàng),要求每行輸出2個(gè)數(shù)據(jù)。Fibonacii數(shù)列定義如下: 程序如下: //文件名:Ex3_11.cpp #include #include void main() int fib0=0,fib1=1,fib2; cout<
45、t n=3;n<=20;n++) fib2=fib0+fib1; cout<
46、。 2、將整數(shù)各位數(shù)字分開的方法是,通過求余得到個(gè)位數(shù),然后將整數(shù)縮小十倍,再求余,并重復(fù)上述過程,分別得到十位、百位,直到整數(shù)的值變成0為止。,for 語(yǔ)句的應(yīng)用,,ok,數(shù)據(jù): 1、設(shè)置變量num表示輸入的整數(shù),整型數(shù)組digit5用來存放num 的各個(gè)位;變量i用來表示數(shù)組的當(dāng)前下標(biāo); 算法: 1、輸入num; 變量初始化:i=0; 2、while (num!=0) num對(duì)10取余,得num的當(dāng)前個(gè)位數(shù)digiti; num整除10,即去掉個(gè)位數(shù),十位變個(gè)位,百位變十位,; i++;數(shù)組digit準(zhǔn)備記錄下一位; 3、將數(shù)組元素按下標(biāo)從高到低的順序輸出;,程序如下: #include
47、void main() int num,subscript; int digit5; coutnum; cout0); for(int i=0;i
48、次一般不超過3層,已保證可讀性。,,,循環(huán)的嵌套,分析: 1、計(jì)算機(jī)的輸出是按行進(jìn)行的,因此可以先用一個(gè)循環(huán)語(yǔ)句輸出第一行表頭。 2、表中各行數(shù)據(jù)的輸出可以用下面的算法描述: for (i=1; i<10; i++) cout<
49、下三角形表。進(jìn)一步分析發(fā)現(xiàn)每一行的列數(shù)與所在行數(shù)相關(guān),因此要輸出三角形表,上面的循環(huán)語(yǔ)句需稍作修改: for (j=1; j<=i; j++) cout<
50、include #include void main() cout<
51、eak語(yǔ)句,444 return語(yǔ)句,443 goto 語(yǔ)句,442 continue語(yǔ)句,,4.4.1 break 語(yǔ)句,break語(yǔ)句只能用在switch語(yǔ)句和循環(huán)語(yǔ)句中,用來跳出switch語(yǔ)句或提前終止循環(huán),轉(zhuǎn)去執(zhí)行switch語(yǔ)句或循環(huán)語(yǔ)句之后的語(yǔ)句。 在for循環(huán)中可以用break結(jié)束循環(huán): for(; ;) if() break; ,,,break 語(yǔ)句應(yīng)用,【例4.14】 給定正整數(shù)m,判定其是否為素?cái)?shù)。 分析:如果m2,m是素?cái)?shù)的條件是不能被2,3,,(取整)整除。因此可以用2,3,,(取整)逐個(gè)去除m,如果被其中某個(gè)數(shù)整除了,則m不是素?cái)?shù),否則是素?cái)?shù)。算法屬于窮
52、舉法。 1、輸入被測(cè)數(shù)m(m2);令整型變量 k= sqrt(m) 2、判斷m是否素?cái)?shù):設(shè)置輔助整型變量i, 使i從2開始直到k依次測(cè)試m能否整除i, 若能,則不是素?cái)?shù);for( i=2;i<=k;i++)if(m%i==0) break; /* 條件滿足,m不是素?cái)?shù),停止測(cè)試,結(jié)束for語(yǔ)句。*/ 3、根據(jù)i是否已達(dá)到k,輸出結(jié)果是否為素?cái)?shù)。,#include #include void main() int m,i,k; coutm; if(m==2) coutk) cout<< m<<是素?cái)?shù)<
53、 在VC++平臺(tái)上運(yùn)行,改一下,使程序自動(dòng)算出100以內(nèi)的素?cái)?shù),,,4.3.2 continue 語(yǔ)句,continue語(yǔ)句只能用在循環(huán)語(yǔ)句中,用來終止本次循環(huán)。當(dāng)程序執(zhí)行到continue語(yǔ)句時(shí),將跳過其后尚未執(zhí)行的循環(huán)體語(yǔ)句,開始下一次循環(huán)。下一次循環(huán)是否執(zhí)行仍然取決于循環(huán)條件的判斷。 continue語(yǔ)句與break語(yǔ)句的區(qū)別在于,continue語(yǔ)句結(jié)束的只是本次循環(huán),而break結(jié)束的是整個(gè)循環(huán)。,,,例:輸出1100內(nèi)3的倍數(shù)。 分析:設(shè)置整型變量I從1變化到100,依次測(cè)試I是否3的倍數(shù),算法屬于窮舉法。 for (I=1;I<=100;I++) if ( I%3!=0)
54、 continue; //I不是3的倍數(shù),不輸出,繼續(xù)下一個(gè)I; 輸出I的值;//I是3的倍數(shù)才輸出 ,,4.3.3 goto 語(yǔ)句,goto語(yǔ)句和標(biāo)號(hào)語(yǔ)句一起使用,所謂標(biāo)號(hào)語(yǔ)句是用標(biāo)識(shí)符標(biāo)識(shí)的語(yǔ)句,它控制程序從goto語(yǔ)句所在的地方轉(zhuǎn)移到標(biāo)號(hào)語(yǔ)句處。goto語(yǔ)句會(huì)導(dǎo)致程序結(jié)構(gòu)混亂,可讀性降低,而且它所完成的功能完全可以用算法的三種基本結(jié)構(gòu)實(shí)現(xiàn),因此一般不提倡使用goto語(yǔ)句。但在某些特定場(chǎng)合下goto語(yǔ)句可能會(huì)顯出價(jià)值,比如在多層循環(huán)嵌套中,要從深層地方跳出所有循環(huán),如果用break語(yǔ)句,不僅要使用多次,而且可讀性較差,這時(shí)goto語(yǔ)句可以發(fā)揮作用。,,4.3.4 return 語(yǔ)
55、句,return語(yǔ)句用于結(jié)束函數(shù)的執(zhí)行,返回調(diào)用者,如果是主函數(shù),則返回至操作系統(tǒng)。 利用一個(gè)return語(yǔ)句可以將一個(gè)數(shù)據(jù)返回給調(diào)用者。通常,當(dāng)函數(shù)的返回類型為void時(shí), return語(yǔ)句可以省略,如果使用也僅作為函數(shù)或程序結(jié)束的標(biāo)志。,,,在結(jié)構(gòu)化程序設(shè)計(jì)中,函數(shù)是將任務(wù)進(jìn)行模塊劃分的基本單位。,第四章 函數(shù) 和編譯預(yù)處理,,在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,對(duì)數(shù)據(jù)的操作總是封裝在函數(shù)中,一個(gè)函數(shù)描述一種操作。不要完全按模塊思想講。也是讓學(xué)生處于面向?qū)ο蟪绦蛟O(shè)計(jì)的氛圍中。這樣第5章的教學(xué)會(huì)順利一些。,要掌握函數(shù)的使用,必須理解函數(shù)調(diào)用時(shí)的內(nèi)部實(shí)現(xiàn)機(jī)制,以及與此相關(guān)的內(nèi)存分配機(jī)制、變量生命期和作用域
56、。,本章還將介紹關(guān)于函數(shù)重載的概念,介紹遞歸算法、內(nèi)聯(lián)函數(shù)、默認(rèn)參數(shù)函數(shù)以及多文件組織、編譯預(yù)處理、工程文件的概念和運(yùn)行庫(kù)函數(shù)。,第四章 函數(shù) 和編譯預(yù)處理,51 函數(shù)的定義與調(diào)用,5. 5 內(nèi)聯(lián)函數(shù),54 作用域和存儲(chǔ)類,53 函數(shù)的嵌套和遞歸調(diào)用,52 函數(shù)的參數(shù)傳遞, 返回值及函數(shù)原型說明,5 9 程序多文件組織,58 編譯預(yù)處理,5 7 函數(shù)重載,5 6 具有缺省參數(shù)值的函數(shù),,,5.1 函數(shù)的定義與調(diào)用,5.1.1 函數(shù)概述,5.1.2 函數(shù)定義,5.1.3 函數(shù)調(diào)用,,,,4.1.1 函數(shù)概述,,函數(shù)是C++程序的基本組成模塊。,通過函數(shù),可以把一個(gè)復(fù)雜任務(wù)分解成為若干個(gè)易于解決
57、的小任務(wù)。充分體現(xiàn)結(jié)構(gòu)化程序設(shè)計(jì)由粗到精,逐步細(xì)化的設(shè)計(jì)思想。,組成C++程序的若干函數(shù)中,有一個(gè)稱為main()(Winmain())函數(shù),是程序執(zhí)行的入口,它可以調(diào)用其他函數(shù)。而其他一般函數(shù)既可以調(diào)用也可以被調(diào)用。函數(shù)之間的調(diào)用關(guān)系見下圖:,,,,5.1.1 函數(shù)概述,,,5.1.1 函數(shù)概述,,,,函數(shù)按是否帶有參數(shù),分為: 無(wú)參函數(shù)和有參函數(shù),4.1.1結(jié)束,函數(shù)按其是否系統(tǒng)預(yù)定義分為兩類: 一類是編譯系統(tǒng)預(yù)定義的,稱為庫(kù)函數(shù)或標(biāo)準(zhǔn)函數(shù),如一些常用的數(shù)學(xué)計(jì)算函數(shù)、字符串處理函數(shù)、圖形處理函數(shù)、標(biāo)準(zhǔn)輸入輸出函數(shù)等。這些庫(kù)函數(shù)都按功能分類,集中說明在不同的頭文件中。用戶只需在自己的程序中包
58、含某個(gè)頭文件,就可直接使用該文件中定義的函數(shù)。 另一類是用戶自定義函數(shù),用戶可以根據(jù)需要將某個(gè)具有相對(duì)獨(dú)立功能的程序定義為函數(shù)。,5.1.2 函數(shù)的定義,,,,1. 無(wú)參函數(shù),2. 有參函數(shù),,,,1 無(wú)參函數(shù),定義格式為: 數(shù)據(jù)類型函數(shù)名(void)函數(shù)體,例: 下面函數(shù)的功能是打印一個(gè)表頭 void TableHead ( ) cout<<****************<
59、式參數(shù)2,函數(shù)體,例: 下面函數(shù)的功能是返回兩個(gè)整數(shù)中較大一個(gè)的值 max (int a, int b) return(a=b?a:b); ,,,,定義函數(shù)時(shí)可能會(huì)涉及若干個(gè)變量,究竟哪些變量應(yīng)當(dāng)作為函數(shù)的參數(shù)?哪些應(yīng)當(dāng)定義在函數(shù)體內(nèi)?這有一個(gè)原則:作為一個(gè)相對(duì)獨(dú)立的模塊,函數(shù)在使用時(shí)完全可以被看成 “黑匣子”,除了輸入輸出外,其他部分可不必關(guān)心。從函數(shù)的定義看出,函數(shù)頭正是用來反映函數(shù)的功能和使用接口,它所定義的是“做什么”,在這部分必須明確“黑匣子”的輸入輸出部分,輸出就是函數(shù)的返回值,輸入就是參數(shù)。因此,只有那些功能上起自變量作用的變量才必須作為參數(shù)定義在參數(shù)表中;函數(shù)體中具體描述“如何
60、做”,因此除參數(shù)之外的為實(shí)現(xiàn)算法所需用的變量應(yīng)當(dāng)定義在函數(shù)體內(nèi)。 C++中不允許函數(shù)的嵌套定義,即在一個(gè)函數(shù)中定義另一個(gè)函數(shù)。,提示,,,,5.1.3 函數(shù)的調(diào)用,在C++中,除了主函數(shù)外,其他任何函數(shù)都不能單獨(dú)作為程序運(yùn)行。任何函數(shù)功能的實(shí)現(xiàn)都是通過被主函數(shù)直接或間接調(diào)用進(jìn)行的。所謂函數(shù)調(diào)用,就是使程序轉(zhuǎn)去執(zhí)行函數(shù)體。 無(wú)參函數(shù)的調(diào)用格式為: 函數(shù)名( ) 有參函數(shù)的調(diào)用格式為: 函數(shù)名(實(shí)際參數(shù)表) 其中實(shí)際參數(shù)簡(jiǎn)稱實(shí)參,用來將實(shí)際參數(shù)的值傳遞給形參,因此可以是常量、具有值的變量或表達(dá)式。,,,,,,,,5.1.3 函數(shù)的調(diào)用,,,,main( )函數(shù),,調(diào)用max(2.5,4.
61、7 ),函數(shù)max(2.5,4.7 ),,return 4.7,主程序后續(xù)語(yǔ)句,,,,,【例41】 輸入兩個(gè)實(shí)數(shù),輸出其中較大的數(shù)。其中求兩個(gè)實(shí)數(shù)中的較大數(shù)用函數(shù)完成。 程序如下: #include float max(float x,float y) return(x=y?x:y); void main() float x,y; coutxy; cout<
62、向是由實(shí)參傳遞給形參。傳遞過程是,先計(jì)算實(shí)參表達(dá)式的值,再將該值傳遞給對(duì)應(yīng)的形參變量。一般情況下,實(shí)參和形參的個(gè)數(shù)和排列順序應(yīng)一一對(duì)應(yīng),并且對(duì)應(yīng)參數(shù)應(yīng)類型匹配(賦值兼容),即實(shí)參的類型可以轉(zhuǎn)化為形參類型。而對(duì)應(yīng)參數(shù)的參數(shù)名則不要求相同。,5.2.1 函數(shù)的參數(shù)傳遞及傳值調(diào)用,,,,按照參數(shù)形式的不同,C++有兩種調(diào)用方式:傳值調(diào)用和引用調(diào)用。顧名思義,傳值調(diào)用傳遞的是實(shí)參的值,本章主要介紹傳值調(diào)用。關(guān)于引用調(diào)用,將在第五章類與對(duì)象中介紹。,,,,5.2.1 函數(shù)的參數(shù)傳遞及傳值調(diào)用,調(diào)用power(a,3 ),函數(shù)power(a,3 ),,return 912673,主程序后續(xù)語(yǔ)句,,,,,,
63、【例52】 說明實(shí)參和形參對(duì)應(yīng)關(guān)系的示例。 #include #include float power(float x,int n) //求x的n次冪 float pow=1; while(n--) pow*=x; return pow; void main() int n=3; float x=4.6; char c=a; cout<
64、5.2.2 函數(shù)返回值,return語(yǔ)句的一般格式為: return 表達(dá)式; 函數(shù)的計(jì)算結(jié)果通過該語(yǔ)句傳遞回主調(diào)函數(shù)。,,,,【例43】設(shè)計(jì)函數(shù),根據(jù)三角形的三邊長(zhǎng)求面積。如果不能構(gòu)成三角形,給出提示信息。 分析:函數(shù)為計(jì)算三角形面積,一般三角形返回面積值,若不能構(gòu)成三角形則返回-1。設(shè)計(jì)一個(gè)主函數(shù)完成函數(shù)測(cè)試。根據(jù)返回值情況輸出相應(yīng)結(jié)果。 程序見下頁(yè):,#include #include float TriangleArea(float a, float b, float c) if ((a+babc; area=TriangleArea(a,b,c); if(area==-1
65、) cout<<(<
66、表),,,,語(yǔ)法上對(duì)程序文件中函數(shù)的排列次序是沒有固定要求的,只要滿足先定義后使用即可。但從結(jié)構(gòu)化程序設(shè)計(jì)的角度,通常是先調(diào)用后定義。使用函數(shù)原型,則既符合由粗到精的思維方式,又滿足了語(yǔ)法要求。,其中形參表可以逐個(gè)列出每個(gè)參數(shù)的類型和參數(shù)名,也可以列出每個(gè)形參的類型,參數(shù)名可省略,各形參之間以逗號(hào)分隔。函數(shù)原型和所定義的函數(shù)必須在返回值類型、函數(shù)名、形參個(gè)數(shù)和類型及次序等方面完全對(duì)應(yīng)一致,否則將導(dǎo)致編譯錯(cuò)誤。,下面是一個(gè)使用結(jié)構(gòu)化程序設(shè)計(jì)思想開發(fā)的企業(yè)管理報(bào)表程序的框架。它使用了函數(shù)原型說明。 #include void menu_print(); void account_report(); void engineering_report(); void marketing_report(); void main() int choice; do menu_print(); cinchoice; while(choice=4); switch(choice) case 1: account_report(); break; case 2: engineering_re