上海交通大學(xué)C++課程課件_1-9章_第1頁
上海交通大學(xué)C++課程課件_1-9章_第2頁
上海交通大學(xué)C++課程課件_1-9章_第3頁
上海交通大學(xué)C++課程課件_1-9章_第4頁
上海交通大學(xué)C++課程課件_1-9章_第5頁
已閱讀5頁,還剩586頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

C+程序設(shè)計(jì),沈紅斌Email:hbshen,課程目標(biāo),進(jìn)一步掌握程序設(shè)計(jì),包括過程化程序設(shè)計(jì)和面向?qū)ο蟮某绦蛟O(shè)計(jì)掌握C+語言了解常用的算法及算法設(shè)計(jì)過程,期末成績的組成,期末考試:50%期中考試:20%大作業(yè):30%,教材及參考教材,C+程序設(shè)計(jì)思想與方法(第2版)人民郵電出版社翁惠玉C+Primer人民郵電出版社C程序設(shè)計(jì)(第3版)譚浩強(qiáng)C+大學(xué)教程(第5版)電子工業(yè)出版社程序設(shè)計(jì)基礎(chǔ)(第2版)吳文虎清華大學(xué)出版社,作業(yè)的相關(guān)規(guī)定及注意事項(xiàng),本學(xué)期將布置若干個(gè)作業(yè),在課后獨(dú)立完成作業(yè)環(huán)境:VC6.0、VC2008、VC2010助教每周有兩個(gè)晚上在機(jī)房答疑作業(yè)要求:必須獨(dú)立、按時(shí)地完成每次上機(jī)作業(yè)每次上機(jī)作業(yè)的具體要求參見每次作業(yè)的文檔說明上傳的作業(yè)必須符合下述的“上傳作業(yè)命名規(guī)則”作業(yè)上傳地址:67用戶碼/密碼:sjtu/sjtu,作業(yè)命名規(guī)則,使用WinRAR軟件將上機(jī)作業(yè)(包括工程文件、資源文件、源文件和頭文件等)的多個(gè)文件直接壓縮為一個(gè)壓縮文件,該壓縮文件必須命名為:”學(xué)號(hào)_作業(yè)號(hào).rar”。若一次作業(yè)中包含多個(gè)小題,則每個(gè)小題應(yīng)分別放入一個(gè)單獨(dú)文件夾,多個(gè)文件夾直接壓縮為一個(gè)壓縮文件。其中,每個(gè)小題的文件夾應(yīng)命名為:”學(xué)號(hào)_作業(yè)號(hào)_題號(hào)”;上傳的作業(yè)中應(yīng)該不包括Debug文件夾以及某些聲音、圖像文件命名規(guī)則示例:以學(xué)號(hào)為5030309999,上傳第四次作業(yè)(第四次作業(yè)中含有兩個(gè)獨(dú)立的小作業(yè))為例:兩個(gè)小作業(yè)的文件夾名字應(yīng)為:5030309999_4_1和5030309999_4_2壓縮文件名應(yīng)為:5030309999_4.rar,評分標(biāo)準(zhǔn),“完成截止日期”后、“上傳截止日期”前仍可上傳作業(yè),但視為“遲交”,遲交的作業(yè)將被扣除一定的分?jǐn)?shù)。在“上傳截止日期”后,將停止該次作業(yè)批改。一經(jīng)發(fā)現(xiàn)作業(yè)抄襲情況,無論任何原因,抄襲者與被抄襲者的當(dāng)次作業(yè)一律記為0分,第二章通過例子學(xué)習(xí),第一個(gè)程序第二個(gè)程序變量定義數(shù)據(jù)類型符號(hào)常量算術(shù)表達(dá)式,賦值表達(dá)式自增自減運(yùn)算符強(qiáng)制類型轉(zhuǎn)換數(shù)據(jù)的輸入輸出,C+程序的基本組成,基本的C+程序結(jié)構(gòu),/File:hello.cpp/thisprogramprintsthemessage/“helloeveryone”onthescreen#includeintmain()std:cout“helloeveryone”std:endl;return0;,程序注釋,預(yù)處理命令,主程序,注釋,C+的注釋是從/開始到本行結(jié)束,也可以采用C風(fēng)格的注釋,即從/*與*/之間所有的文字都是注釋,可以是連續(xù)的幾行。注釋是寫給人看的,而不是寫給計(jì)算機(jī)的。程序注釋:從整體描述程序操作過程注釋也可以出現(xiàn)在主程序中,解釋主程序中一些比較難理解的部分。給程序添加注釋是良好的程序設(shè)計(jì)風(fēng)格,C程序的基本組成,基本的C程序結(jié)構(gòu),/File:hello.cpp/thisprogramprintsthemessage/“helloeveryone”onthescreen#includeintmain()std:cout“helloeveryone”std:endl;return0;,程序注釋,預(yù)處理命令,主程序,編譯預(yù)處理,C+的編譯分成兩個(gè)階段:預(yù)編譯和編譯預(yù)編譯處理程序中的預(yù)編譯命令,即那些以#開頭的指令編譯預(yù)處理主要有:庫包含:用#include實(shí)現(xiàn),表示程序使用了某個(gè)庫宏定義:用#define實(shí)現(xiàn)。宏包括不帶參數(shù)的宏和帶參數(shù)的宏。不帶參數(shù)的宏通常用來定義符號(hào)常量。帶參數(shù)的宏用來定義一些較為復(fù)雜的操作。,庫包含的格式,庫是預(yù)先做好的一些工具程序。每個(gè)庫要提供一個(gè)接口,告訴庫的用戶如何使用庫提供的功能。庫包含就是把庫的接口文件放入源文件,以便編譯器檢查程序中對庫的調(diào)用是否正確。庫包含格式:#include:包含了一個(gè)系統(tǒng)庫#include“filename”:包含了一個(gè)用戶自定義的庫,宏定義,不帶參數(shù)的宏定義通常用于為程序中的常量取一個(gè)名字,稱為符號(hào)常量。格式:#define標(biāo)識(shí)符替換文本如:#defineRADIUS5#definePI3.14159#defineAREAPI*RADIUS*RADIUS用define定義宏是C語言的習(xí)慣,在C+中有更好的解決方案,使用符號(hào)常量的好處,含義清楚,提高了程序的可讀性。在需要改變一個(gè)常量時(shí)能做到“一改全改”,C程序的基本組成,基本的C程序結(jié)構(gòu),/File:hello.cpp/thisprogramprintsthemessage/“helloeveryone”onthescreen#includeintmain()std:cout“helloeveryone”std:endl;return0;,程序注釋,預(yù)處理命令,主程序,主程序,主程序由一個(gè)或多個(gè)函數(shù)組成每個(gè)程序都必須有一個(gè)名為main的函數(shù),它是程序的入口。,函數(shù)的構(gòu)成,intmain()函數(shù)頭std:cout“helloeveryone”std:endl;return0;,函數(shù)體,與PYTHON不同,C+的函數(shù)體必須用一對花括號(hào)括起來。事實(shí)上,PYTHON中所有必須縮進(jìn)的語句,在C+中都必須用花括號(hào)括起來。,輸出流對象std:cout,“流”指的是設(shè)備之間傳遞的數(shù)據(jù)流輸出流是傳給輸出設(shè)備的數(shù)據(jù)流cout代表顯示器格式將hello顯示在屏幕上:std:cout“hello”std:cout“hello,everyone”std:endlstd:endl表示換行,名字空間,在大型的程序時(shí),每個(gè)源文件可能由不同的開發(fā)者開發(fā)。不同的源文件中可能有同樣的名字。當(dāng)這些源文件連接起來形成一個(gè)可執(zhí)行文件時(shí),就會(huì)造成重名。名字空間是把一組程序?qū)嶓w組合在一起,構(gòu)成的一個(gè)作用域。一個(gè)名字空間中不能有重名,不同的名字空間中可以定義相同的實(shí)體名。當(dāng)引用某個(gè)實(shí)體時(shí),需要加上名字空間的限定程序中的std是C+中所有標(biāo)準(zhǔn)庫的名字空間名。,使用名字空間的指令,格式:usingnamespace名字空間名;一旦用了使用名字空間的指令,該名字空間中的所有的實(shí)體在引用時(shí)就不需要再加名字空間的限定了。第一個(gè)程序可以改寫為:,/file:hello.cpp/Thisprogramprintsthemessage“Helloworld.”/Onthescreen#includeusingnamespacestd;intmain()cout“Helloworld.”radius;area=PI*radius*radius;circum=2*PI*radius;coutendl;cout園的面積為:areaendl;cout園的周長為:circumendl;return0;,變量定義,輸入階段,計(jì)算階段,輸出階段,程序的組成,變量定義:C+中的變量在使用前都必須被定義。變量定義嚴(yán)格指出變量中可以存放的數(shù)據(jù)類型。輸入階段:獲取執(zhí)行時(shí)才能確定的用戶數(shù)據(jù)。輸入過程一般包括兩步:顯示提示信息讀取數(shù)據(jù)計(jì)算階段:由輸入推導(dǎo)出輸出的過程。通常通過各種計(jì)算得到。輸出階段:顯示程序執(zhí)行的結(jié)果,第二章通過例子學(xué)習(xí),第一個(gè)程序第二個(gè)程序變量定義數(shù)據(jù)類型符號(hào)常量算術(shù)表達(dá)式,賦值表達(dá)式自增自減運(yùn)算符強(qiáng)制類型轉(zhuǎn)換數(shù)據(jù)的輸入輸出,變量定義,變量,也稱為對象,是數(shù)據(jù)的存放之處變量有三個(gè)重要屬性:名稱、值、類型。變量定義就是告訴編譯器變量的名字及該變量中可以存放哪一類數(shù)據(jù)類型的值C+中變量定義的格式:類型名變量名1,變量名2,變量名n;如:intnum1,num2;doublearea;在C+中,每個(gè)變量在使用前必須被定義,以便編譯器檢查變量使用的合法性。,變量命名,名字必須以字母或下劃線開頭。C+語言中,名字中出現(xiàn)的大寫和小寫字母被看作是不同的字符,因此ABC,Abc,abc是三個(gè)獨(dú)立的變量名。名字中的其它字符必須是字母、數(shù)字或下劃線,不得使用空格或其它特殊符號(hào)名字不可以是系統(tǒng)的保留詞,如:int,double,for,return等,它們在C+語言中有特殊用途C+沒有規(guī)定過名字的長度,但各個(gè)編譯系統(tǒng)都有自己規(guī)定。名字應(yīng)使讀者易于明白其存儲(chǔ)的值是什么,做到“見名知意”。,第二章通過例子學(xué)習(xí),第一個(gè)程序第二個(gè)程序變量定義數(shù)據(jù)類型符號(hào)常量算術(shù)表達(dá)式,賦值表達(dá)式自增自減運(yùn)算符強(qiáng)制類型轉(zhuǎn)換數(shù)據(jù)的輸入輸出,數(shù)據(jù)類型,整型實(shí)型字符型布爾型,枚舉類型變量賦初值了解占用的內(nèi)存量,數(shù)據(jù)類型整型,整型數(shù)的表示范圍:由各個(gè)編譯器指定。整型數(shù)有三種存儲(chǔ)方式,在VC中占用的空間如下所示基本型int:4byte(PC)231(2311)長整型long:long/longint4byte(PC)231(2311)短整型short:2byte(PC)-215(2151)允許的操作:算術(shù)運(yùn)算、比較大小等,整型數(shù)的表示碼制,討論如何將符號(hào)位數(shù)字化。0表示正數(shù),1表示負(fù)數(shù)。數(shù)字的三種編碼方式為:原碼反碼補(bǔ)碼,原碼,用符號(hào)位和數(shù)值表示帶符號(hào)數(shù)。正數(shù)的符號(hào)位為0,負(fù)數(shù)的符號(hào)位為1。數(shù)值部分用二進(jìn)制表示。如用一個(gè)字節(jié)表示數(shù)值:62原=00111110-62原=10111110,反碼,正數(shù)的反碼與原碼相同,負(fù)數(shù)的反碼為該數(shù)的絕對值的原碼取反。如:62反=00111110-62反=11000001,補(bǔ)碼,正數(shù)的補(bǔ)碼與原碼相同,負(fù)數(shù)的補(bǔ)碼為該數(shù)的反碼加1。如:62補(bǔ)=00111110-62補(bǔ)=11000010大多數(shù)計(jì)算機(jī)系統(tǒng)都用補(bǔ)碼表示整數(shù),整數(shù)的內(nèi)部表示,整數(shù)在計(jì)算機(jī)內(nèi)部通常用補(bǔ)碼表示,在VC中也是如此。整數(shù)運(yùn)算時(shí)要注意數(shù)據(jù)的表示范圍。如整數(shù)用兩個(gè)字節(jié)表示時(shí),正整數(shù)32767加1的結(jié)果為-32768。這稱為整數(shù)運(yùn)算的溢出,系統(tǒng)不檢查這樣的錯(cuò)誤,程序員必須自己保證程序中不出現(xiàn)這樣的錯(cuò)誤。,無符號(hào)整數(shù),在某些應(yīng)用中,不可能出現(xiàn)負(fù)數(shù),則整型數(shù)中有一半的數(shù)值范圍是被浪費(fèi)的。因此在C/C+中可以將所有的數(shù)都看成正整數(shù),稱為無符號(hào)數(shù)無符號(hào)數(shù)的定義:在各種整數(shù)類型前加上關(guān)鍵詞unsigned,變成unsignedint,unsignedshort,unsignedlong,整型常量,整型常量可用十進(jìn)制、八進(jìn)制和十六進(jìn)制表示十進(jìn)制:123,-234八進(jìn)制:0123十六進(jìn)制:0 x123,0 x3a2f一旦定義了一個(gè)整型變量,可以將一個(gè)整型常量賦給該整型變量。如inta;a=123;或a=0 x123;都是正確的,數(shù)據(jù)類型,整型實(shí)型字符型布爾型,枚舉類型變量賦初值了解占用的內(nèi)存量,數(shù)據(jù)類型浮點(diǎn)數(shù),VC中,實(shí)型數(shù)以浮點(diǎn)形式表示一個(gè)浮點(diǎn)數(shù)分成尾數(shù)和階碼兩部分。階碼表示小數(shù)點(diǎn)在該數(shù)中的位數(shù),尾數(shù)表示數(shù)的有效數(shù)值。浮點(diǎn)類型的分類單精度float:占用4字節(jié),3字節(jié)尾數(shù),1字節(jié)指數(shù),精確度7位,范圍10381038雙精度double:占用8字節(jié),5字節(jié)尾數(shù),3字節(jié)指數(shù),精確度1516位,范圍1030710308浮點(diǎn)數(shù)無法精確表示,浮點(diǎn)數(shù)常量,浮點(diǎn)數(shù)常量有兩種表示法:十進(jìn)制表示:1.233.14-5.988科學(xué)計(jì)數(shù)法:尾數(shù)*10指數(shù)尾數(shù)e指數(shù)123e2=123002.25e-3=0.00225注意:尾數(shù)不能為空e31e3指數(shù)必須為整數(shù)2.5e2.3是非法的,數(shù)據(jù)類型,整型實(shí)型字符型布爾型,枚舉類型變量賦初值了解占用的內(nèi)存量,數(shù)據(jù)類型字符類型,字符類型:存放一個(gè)字母或符號(hào),占一個(gè)字節(jié),存放的是字符的內(nèi)碼。字符類型名:char,字符的機(jī)內(nèi)表示,字符的機(jī)內(nèi)表示用字符編碼表示。常用的有ASCII,BCD,EBCDIC等。PC機(jī)中都用ASCII.ASCII碼的重要特性數(shù)字0到9是順序存放的字母被分成二段:大寫的和小寫的。大寫字母是連續(xù)的,小寫字母也是連續(xù)的,可打印字符和非打印字符,可打印字符:小寫字母、大寫字母、數(shù)字、標(biāo)點(diǎn)符號(hào)、空格等非打印字符:換行和報(bào)警字符或響鈴等控制字符,可打印字符的使用,字符常量a,S,2等用一對單引號(hào)括起來的數(shù)據(jù)稱為字符常量與PYTHON不同,C+中的單引號(hào)和雙引號(hào)有不同的用處。單引號(hào)括起來的是一個(gè)字符,雙引號(hào)括起來的是字符串,可打印字符的使用,賦值charc1,c2;c1=a;c2=b;c1=97;c2=98;比較c=9和c=9?運(yùn)算如:c1=a;c1=c1+2;c1的值應(yīng)為?如c中存放的是小寫字母,則c-a+1表示什么?如c中存放的是數(shù)字(09),則c-0表示什么?如c1,c2存放的是小寫字母,則c2-c1表示什么?,轉(zhuǎn)義字符,一些非打印和難以打印的字符需要用轉(zhuǎn)義序列表示換行符寫為n,雖然它由兩個(gè)字符和n來描述,但它表示一個(gè)ASCII字符。反斜杠符號(hào)稱為轉(zhuǎn)義字符。雙引號(hào)和單引號(hào)的轉(zhuǎn)義如果在一個(gè)串中把雙引號(hào)”用作一個(gè)字符,必須要對它轉(zhuǎn)義,否則它會(huì)終結(jié)該字符串。cout實(shí)型數(shù):數(shù)值不變,但以浮點(diǎn)的形式保存在相應(yīng)的變量中Double-float:截取前面七位有效數(shù)字存放到float變量中Float-double:將有效位擴(kuò)展到16位字符型-整型變量:將字符型數(shù)據(jù)放入整型變量的最后一個(gè)字節(jié)。如果所用系統(tǒng)將字符處理成無符號(hào)量,則前面補(bǔ)0。如果所用系統(tǒng)將字符處理成有符號(hào)量,則擴(kuò)展符號(hào)。整型-字符類型:直接將整型數(shù)據(jù)的最低八位賦給字符變量。,賦值的嵌套,將賦值表達(dá)式作為更大的表達(dá)式的一部分。如:a=(x=6)+(y=7)等價(jià)于分別將x和y的值設(shè)為6和7,并將6和7相加,結(jié)果存于變量a賦值運(yùn)算符=的優(yōu)先級比算術(shù)運(yùn)算符低,多重賦值,a=b=c=5,給a,b,c均賦值5,當(dāng)用到多重賦值時(shí),要保證所有的變量都是同類型的,以避免在自動(dòng)類型轉(zhuǎn)換時(shí)出現(xiàn)與預(yù)期不相符的結(jié)果的可能性。如變量d定義為double,變量i定義為int,語句d=i=1.5;的結(jié)果是:i等于1,d等于1.0,復(fù)合賦值運(yùn)算,其他運(yùn)算符與賦值運(yùn)算符結(jié)合的運(yùn)算符稱為復(fù)合賦值運(yùn)算符常用的復(fù)合賦值運(yùn)算符有:+=,-=,*=,/=,%=變量op=表達(dá)式;等價(jià)于:變量=變量op表達(dá)式;如:balance+=deposit;balance-=surcharge;x/=10;salary*=2;,第二章通過例子學(xué)習(xí),第一個(gè)程序第二個(gè)程序變量定義數(shù)據(jù)類型符號(hào)常量算術(shù)表達(dá)式,賦值表達(dá)式自增自減運(yùn)算符強(qiáng)制類型轉(zhuǎn)換數(shù)據(jù)的輸入輸出,自增、自減運(yùn)算符,自增、自減運(yùn)算符:+,-相當(dāng)于+=1和-=1,它有前綴和后綴兩種用法+k,k+,-k,k-,但含義有所不同。如:i=3,j=i+,i=4j=3,j=+i,i=4j=4,j=i-,i=2j=3,j=-i,i=2j=2,第二章通過例子學(xué)習(xí),第一個(gè)程序第二個(gè)程序變量定義數(shù)據(jù)類型符號(hào)常量算術(shù)表達(dá)式,賦值表達(dá)式自增自減運(yùn)算符強(qiáng)制類型轉(zhuǎn)換數(shù)據(jù)的輸入輸出,強(qiáng)制類型轉(zhuǎn)換,賦值和算術(shù)運(yùn)算時(shí)會(huì)執(zhí)行自動(dòng)類型轉(zhuǎn)換如要想使4/5的結(jié)果是0.8,而不是0,該怎么辦?可以將其中一個(gè)寫成浮點(diǎn)數(shù)。例如:4.0/5或4/5.0intx=4,y=5;要想使x/y的結(jié)果為0.8而不是0,該怎么辦?答案是:用強(qiáng)制類型轉(zhuǎn)換,強(qiáng)制類型轉(zhuǎn)換,強(qiáng)制類型轉(zhuǎn)換格式:(類型名)(表達(dá)式)類型名(表達(dá)式)例如,要想使兩個(gè)整型變量x和y出的結(jié)果為double型,可以用下列語句,doublez;z=(double)x/y;,轉(zhuǎn)換類型,強(qiáng)制類型轉(zhuǎn)換在C+類型系統(tǒng)中引入了一個(gè)漏洞為了方便查找這些錯(cuò)誤,C+提供了在強(qiáng)制類型轉(zhuǎn)換時(shí)指明轉(zhuǎn)換的性質(zhì)。轉(zhuǎn)換的性質(zhì)有四種:靜態(tài)轉(zhuǎn)換(static_cast):用于編譯器隱式執(zhí)行的任何類型轉(zhuǎn)換重解釋轉(zhuǎn)換(reinterpret_cast)常量轉(zhuǎn)換(const_cast)動(dòng)態(tài)轉(zhuǎn)換(dynamic_cast)格式轉(zhuǎn)換類型(表達(dá)式)z=static_cast(x)/y;,第二章通過例子學(xué)習(xí),第一個(gè)程序第二個(gè)程序變量定義數(shù)據(jù)類型符號(hào)常量算術(shù)表達(dá)式,賦值表達(dá)式自增自減運(yùn)算符強(qiáng)制類型轉(zhuǎn)換數(shù)據(jù)的輸入輸出,輸入流對象cin,鍵盤流入的數(shù)據(jù)流,將鍵盤輸入的數(shù)據(jù)存入變量格式:cin變量cin變量1變量2變量n,用戶的響應(yīng),當(dāng)程序執(zhí)行到這個(gè)語句時(shí)會(huì)停下來等待用戶的輸入用戶可以輸入數(shù)據(jù),用回車()結(jié)束。當(dāng)有多個(gè)輸入數(shù)據(jù)時(shí),一般用空白字符(空格、制表符和回車)分隔。如:a為整型,d為double,則對應(yīng)于cinad,用戶的輸入可以為1213.212(tab鍵)13.21213.233,cin.get,作用:從鍵盤接受一個(gè)字符用法:cin.get(ch);或ch=cin.get(),都是從鍵盤輸入一個(gè)字符并存放到變量ch中對應(yīng)的用戶輸入:cin.get()可以接收任意的字符,包括空白字符。,如a,b,c為字符型變量,對應(yīng)語句a=cin.get();b=cin.get();c=cin.get();如果輸入abc,則a的值是a,b的值是空格,c的值是b。如果將這個(gè)輸入用于語句:cinabc,那么變量a、b、c的內(nèi)容分別為a、b、c,因?yàn)榭崭癖蛔鳛檩斎胫抵g的分隔符。,輸出流對象cout,將變量或表達(dá)式的內(nèi)容顯示在顯示器上格式輸出一個(gè)變量的值:couta;輸出多個(gè)變量的值:coutabc;輸出表達(dá)式的結(jié)果:cout“Helloworld”上述情況的組合:couta+b=a+b=,=,=,!=優(yōu)先級:高于賦值運(yùn)算符,低于算術(shù)運(yùn)算符。關(guān)系運(yùn)算符內(nèi)部:=和!=較低結(jié)合性:左結(jié)合關(guān)系表達(dá)式用關(guān)系運(yùn)算符將二個(gè)表達(dá)式連接起來稱為關(guān)系表達(dá)式關(guān)系表達(dá)式的結(jié)果是:true或false,eg.xy,ab=cd都是合法的關(guān)系表達(dá)式,注意:-2(62),第3章邏輯思維及分支程序設(shè)計(jì),關(guān)系表達(dá)式邏輯表達(dá)式If語句Switch語句,邏輯表達(dá)式,邏輯表達(dá)是用于實(shí)現(xiàn)更復(fù)雜的判斷邏輯運(yùn)算符elsecoutyear;result=(year%4=0,if語句的嵌套,if語句的then子句或else子句是if語句,稱為if語句的嵌套歧義性:if語句可以沒有else子句,如if(x100)if(x90)語句1elseif(x80)語句2else語句3else語句4;配對原則:每個(gè)else子句是和在它之前最近的一個(gè)沒有else子句的if語句配對。,縮進(jìn)對齊,可以清晰地表示出層次,便于程序員閱讀,if(x100)if(x90)語句1elseif(xy)?x:y;?:運(yùn)算符用于輸出。例如,想輸出一個(gè)布爾變量flag的值,如果直接用coutflag;那么當(dāng)flag為“真”時(shí),輸出為1;當(dāng)flag為“假”時(shí),輸出為0。如果我們想讓flag為“真”時(shí)輸出true,為“假”時(shí)輸出false,可以用if語句if(flag)cout“true”;elsecout“false”;看上去太羅嗦。但如果用?:運(yùn)算符只需要一行cout(flag?true:false)=90:cout=80:cout=70:cout=60:coutD;break;default:coutE;,表達(dá)式=成績/10,switch(score/10)case10:case9:coutA;break;case8:coutB;break;case7:coutC;break;case6:coutD;break;default:coutresult1;if(num1-num2=result1)coutresult1;if(num1*num2=result1)coutyouarerightn;elsecoutresult2;if(num1/num2=result1),該程序的缺陷,每次執(zhí)行只能出一道題減法可能出現(xiàn)負(fù)值除法可能出現(xiàn)除0結(jié)果太單調(diào),小結(jié),本章主要介紹了計(jì)算機(jī)實(shí)現(xiàn)邏輯思維的機(jī)制。主要包括兩個(gè)方面:如何表示一個(gè)邏輯判斷如何根據(jù)邏輯判斷的結(jié)果執(zhí)行不同的處理邏輯判斷關(guān)系表達(dá)式實(shí)現(xiàn)邏輯表達(dá)式根據(jù)邏輯判斷執(zhí)行不同的處理if語句switch語句,第4章循環(huán)控制,重復(fù)N次循環(huán)While循環(huán)Dowhile循環(huán)循環(huán)的中途退出枚舉法貪婪法,for循環(huán)語句,格式:for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語句執(zhí)行過程:1.執(zhí)行表達(dá)式12.執(zhí)行表達(dá)式23.如果表達(dá)式2的結(jié)果為“true”,則執(zhí)行循環(huán)體和表達(dá)式3,然后回到2,否則for語句執(zhí)行結(jié)束,循環(huán)體,循環(huán)控制行,for循環(huán)語句續(xù),作為計(jì)數(shù)循環(huán),可以理解為for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值)符合循環(huán)條件時(shí)的執(zhí)行語句循環(huán)體所有語句的一次完全執(zhí)行稱為一個(gè)循環(huán)周期循環(huán)體可以是復(fù)合語句或空語句,逗號(hào)表達(dá)式,格式:表達(dá)式1,表達(dá)式2,,表達(dá)式n執(zhí)行過程:先執(zhí)行表達(dá)式1,再執(zhí)行表達(dá)式2,再執(zhí)行表達(dá)式n,整個(gè)表達(dá)式的計(jì)算結(jié)果為最后一個(gè)表達(dá)式的值逗號(hào)運(yùn)算符的優(yōu)先級是所有運(yùn)算符中最低的如a的初值為0,則表達(dá)式a+=1,a+=2,a+=3,a+=4,a+=5的結(jié)果為15,有了逗號(hào)表達(dá)式,從1加到100的問題就可以只用一個(gè)語句:for(i=1,s=0;i=100;+i)s+=i;或?qū)⑺械某跏蓟挤旁谘h(huán)外,即i=1;s=0;for(;i=100;+i)s+=i;建議還是用s=0;for(i=1;i=100;+i)s+=i;,for循環(huán)的進(jìn)一步討論續(xù),表達(dá)式2也不一定是關(guān)系表達(dá)式。它可以是邏輯表達(dá)式,甚至可以是算術(shù)表達(dá)式。當(dāng)表達(dá)式2是算術(shù)表達(dá)式時(shí),只要表達(dá)式的值為非0,就執(zhí)行循環(huán)體,表達(dá)式的值為0時(shí)退出循環(huán)。如果表達(dá)式2省略,即不判斷循環(huán)條件,循環(huán)將無終止地進(jìn)行下去。無終止的循環(huán)稱為“死循環(huán)”最簡單的死循環(huán)是for(;);要結(jié)束一個(gè)無限循環(huán),必須從鍵盤上輸入特殊的命令以中斷程序執(zhí)行并強(qiáng)制退出,For循環(huán)的進(jìn)一步討論續(xù),表達(dá)式3也可以是任何表達(dá)式,一般為賦值表達(dá)式或逗號(hào)表達(dá)式。表達(dá)式3是在每個(gè)循環(huán)周期結(jié)束后對循環(huán)變量的修正。表達(dá)式3也可以省略,此時(shí)做完循環(huán)體后直接執(zhí)行表達(dá)式2。如從1加到100,可以寫為s=0;for(i=1;ib;coutdlt;for(doublex=a+dlt/2;xb;x+=dlt)integral+=(x*x+5*x+1)*dlt;cout積分值為:integralx;ex=0;p=1;i=0;while(p1e-6)ex+=p;+i;p=p*x/i;coute的x次方等于:ex0)x1=x;elsex2=x;while(fabs(fx)1e-7);cout方程的根為:xendl;return0;,第4章循環(huán)控制,重復(fù)N次循環(huán)While循環(huán)Dowhile循環(huán)循環(huán)的中途退出枚舉法貪婪法,循環(huán)的中途退出,考慮一個(gè)讀入數(shù)據(jù)直到讀到標(biāo)志值的問題。如用自然語言描述,基于標(biāo)志的循環(huán)的結(jié)構(gòu)由以下步驟組成:讀入一個(gè)值如果讀入值與標(biāo)志值相等,則退出循環(huán)執(zhí)行在讀入那個(gè)特定值情況下需要執(zhí)行的語句當(dāng)一個(gè)循環(huán)中有一些操作必須在條件測試之前執(zhí)行時(shí),稱為循環(huán)的中途退出問題。,問題,由于循環(huán)語句是先判斷條件再?zèng)Q定是否執(zhí)行循環(huán)體,循環(huán)的中途退出將使得循環(huán)體中的某些語句必須重復(fù)出現(xiàn)?;跇?biāo)志的循環(huán)結(jié)構(gòu)被改為:讀入一個(gè)值While(讀入值與標(biāo)志值不相等)執(zhí)行在讀入那個(gè)特定值情況下需要執(zhí)行的語句讀入一個(gè)值,解決方案,break語句:跳出循環(huán)上述問題可以用下列方案解決:while(true)提示用戶并讀入數(shù)據(jù)if(value=標(biāo)志)break;根據(jù)數(shù)據(jù)作出處理continue語句:跳出當(dāng)前循環(huán)周期,第4章循環(huán)控制,重復(fù)N次循環(huán)While循環(huán)Dowhile循環(huán)循環(huán)的中途退出枚舉法貪婪法,枚舉法,對所有可能的情況一種一種去嘗試,直到找到正確的答案。枚舉法的實(shí)現(xiàn)基礎(chǔ)是循環(huán)。,枚舉法實(shí)例一,用50元錢買了三種水果。各種水果加起來一共100個(gè)。西瓜5元一個(gè),蘋果1元一個(gè),桔子1元3個(gè),設(shè)計(jì)一程序輸出每種水果各買了幾個(gè)它有兩個(gè)約束條件:第一是三種水果一共100個(gè);第二是三種水果一共花了50元可以按一個(gè)約束條件列出所有可行的情況,然后對每個(gè)可能解檢查它是否滿足第二個(gè)約束條件。也可以用第二個(gè)約束條件列出所有情況,然后對每個(gè)可能解檢查它是否滿足第一個(gè)約束條件。,#includeusingnamespacestd;intmain()intmellon,apple,orange;/分別表示西瓜數(shù)、蘋果數(shù)和桔子數(shù)for(mellon=1;mellon10;+mellon)/對每種可能的西瓜數(shù)for(apple=1;apple50-5*mellon;+apple)/當(dāng)西瓜數(shù)給定后可能的蘋果數(shù)orange=3*(50-5*mellon-apple);/剩下的錢全買了桔子if(mellon+apple+orange=100)/三種水果數(shù)之和是否為100coutmellon:mellon;coutapple:apple;coutorange:orangeendl;return0;,執(zhí)行結(jié)果,Mellon:1apple:18orange:81Mellon:2apple:11orange:87Mellon:3apple:4orange:93,實(shí)例二四大湖問題,上地理課時(shí),四個(gè)學(xué)生回答我國四大湖的大小時(shí)分別說:甲:洞庭最大,洪澤最小,鄱陽第三乙:洪澤最大,洞庭最小,鄱陽第二,太湖第三丙:洪澤最小,洞庭第三?。痕蛾栕畲?,太湖最小,洪澤第二,洞庭第三對于每個(gè)湖的大小,每個(gè)人僅答對一個(gè),設(shè)計(jì)一程序讓計(jì)算機(jī)通過這些信息去判別四個(gè)湖的大小。,解題思路,如果用a,b,c,d分別表示四個(gè)湖的排序。a表示洞庭湖,b表示洪澤湖,c表示鄱陽湖,d表示太湖。我們可以假設(shè):洞庭最大,洪澤第二,鄱陽第三,太湖第四,然后檢查每位同學(xué)是否都講對了一個(gè)。如果不是,再嘗試下一種情況:洞庭最大,洪澤第二,鄱陽第四,太湖第三,再檢查每位同學(xué)是否都講對了一個(gè)。嘗試所有可能的情況,直到滿足每位同學(xué)都講對一個(gè)為止。,枚舉法續(xù),為了嘗試所有情況,我們需要假設(shè)洞庭湖可能是最大,也可能是第二、第三或第四。因此,a的值可能從1變到4。同樣,b,c,d的值也都可能從1變到4。為此,我們需要一個(gè)控制結(jié)構(gòu),使a,b,c,d的值能自動(dòng)從1變到4。這種結(jié)構(gòu)就是循環(huán)結(jié)構(gòu)。,四大湖排列問題的解,main()inta,b,c,d;for(a=1;a=4;+a)for(b=1;b=4;+b)if(a=b)continue;elsefor(c=1;c=4;+c)if(c=a|c=b)continue;elsed=10ab-c;if(a=1)+(b=4)+(c=3)=1,問題:效率差解決方法:一旦找到答案就應(yīng)該結(jié)束,main()inta,b,c,d;boolflag=false;for(a=1;a=4;+a)for(b=1;b=4;+b)if(a=b)continue;elsefor(c=1;c=4;+c)if(c=a|c=b)continue;elsed=10ab-c;if(a=1)+(b=4)+(c=3)=1,改進(jìn)版1:,程序不夠簡練,main()inta,b,c,d;boolflag=false;for(a=1;a=4,改進(jìn)版2,列出ABC三個(gè)字母的全排列,解題思路:讓第一個(gè)位置的值從A依次變到C讓第一個(gè)位置的值從A依次變到C讓第一個(gè)位置的值從A依次變到C注意三個(gè)位置的值不能相同可以用一個(gè)三層的嵌套循環(huán)實(shí)現(xiàn),循環(huán)變量是字符類型,intmain()charc1,c2,c3;for(c1=A;c1=C;+c1)for(c2=A;c2=C;+c2)if(c1=c2)continue;elsefor(c3=A;c3=C;+c3)if(c3=a1|c3=c2)continue;elsecoutc1c2c3=ONEJIAO)onejiao+;money-=ONEJIAO;while(money=FIVEFEN)fivefen+;money-=FIVEFEN;while(money=TWOFEN)twofen+;money-=TWOFEN;while(money=ONEFEN)onefen+;money-=ONEFEN;/輸出結(jié)果cout1角硬幣數(shù):onejiaoendl;cout5分硬幣數(shù):fivefenendl;cout2分硬幣數(shù):twofenendl;cout1分硬幣數(shù):onefenintarrayidx;coutendl;for(idx=0;idx=9;+idx)coutsheepi;for(i=0;imax)max=sheepi;maxNum=i;cout“最重的羊是第”maxNum“只”endl;cout“它的重量是”maxsheepi;for(i=0;imax)max=sheepi;maxNum=i;cout“最重的羊是第”maxNum“只”endl;cout“它的重量是”maxx;for(k=0;k10;+k)if(x=arrayk)coutk;break;if(k=10)coutx;lh=0;rh=9;while(lhrh)cout沒有找到endl;return0;,搜索算法的效率,順序搜索的平均時(shí)間性能(1+2+3+n)/n=(n+1)/2二分查找的最壞情況的時(shí)間性能n/2/2/2/2=1k=log2n,N和log2N的值,排序與查找,順序查找二分查找選擇排序法氣泡排序法,選擇排序,使數(shù)組元素按某種次序排列選擇排序法:在所有元素中找到最小的元素放在數(shù)組的第0個(gè)位置在剩余元素中找出最小的放在第一個(gè)位置。以此類推,直到所有元素都放在適當(dāng)?shù)奈恢糜脗未a表示,intlh,rh,array;輸入要排序的元素,存入array;for(lh=0;lhn;lh+)在array的從lh到n1的元素之間找出最小的放入rh;交換下標(biāo)lh和rh中的值;輸出排好序的元素;,選擇排序?qū)嵗?選擇排序的完善,intmain()intlh,rh,k,tmp;intarray=2,5,1,9,10,0,4,8,7,6;for(lh=0;lh10;lh+)rh=lh;for(k=lh;k10;+k)if(arraykarrayrh)rh=k;tmp=arraylh;arraylh=arrayrh;arrayrh=tmp;for(lh=0;lh10;+lh)coutarraylh;return0;,選擇排序的效率,對n個(gè)元素的排序來說,找出第一個(gè)元素要比較n次,找出第二個(gè)元素比較n-1次,找出第n個(gè)元素比較一次。因此,總的比較次數(shù)為:1+2+3+n=n(n+1)/2則稱時(shí)間復(fù)雜性為O(n2),排序與查找,順序查找二分查找選擇排序法氣泡排序法,氣泡排序法,對數(shù)組元素進(jìn)行掃描。第一遍掃描冒出一個(gè)最大的氣泡,放入最后一個(gè)位置。然后對剩余元素再進(jìn)行第二次冒泡,冒出最大的泡放入倒數(shù)第二個(gè)位置,依次執(zhí)行到最后一個(gè)元素。偽代碼表示,For(i=1;in;+i)從元素0到元素n-i進(jìn)行冒泡,最大的泡放入元素n-i;,冒泡過程,將待冒泡的數(shù)據(jù)從頭到尾依次處理:比較相鄰的兩個(gè)元素,如果大的在前小的在后,就交換這兩個(gè)元素。這樣經(jīng)過從頭到尾的檢查,最大的一個(gè)就被交換到最后了如果在一次起泡中沒有發(fā)生交換,則表示數(shù)據(jù)都已排好序,不需要再進(jìn)行起泡,進(jìn)一步細(xì)化,for(i=1;in;+i)從元素0到元素n-i進(jìn)行起泡,最大的泡放入元素n-i;if(沒有發(fā)生過數(shù)據(jù)交換)break;,待冒泡的元素,待冒泡的元素,待冒泡的元素,待冒泡的元素,待冒泡的元素,待冒泡的元素,intmain()inta=0,3,5,1,8,7,9,4,2,10,6;inti,j,tmp,n=11;boolflag;for(i=1;in;+i)flag=false;for(j=0;jn-i;+j)if(aj+1aj)tmp=aj;aj=aj+1;aj+1=tmp;flag=true;if(!flag)break;/*一趟冒泡中沒有發(fā)生交換,排序結(jié)束*/coutendl;for(i=0;in;+i)coutaiNumOfColANumOfColB;,/輸入數(shù)組Acoutaij;/輸入數(shù)組Bcoutbij;,/執(zhí)行A*Bfor(i=0;iNumOfRowA;+i)for(j=0;jNumOfColB;+j)cij=0;for(k=0;kNumOfColA;+k)cij+=aik*bkj;,/輸出數(shù)組Ccoutn輸出數(shù)組C:;for(i=0;iNumOfRowA;+i)coutendl;for(j=0;jNumOfColB;+j)coutcijt;return0;,程序舉例-打印N階魔陣,第一個(gè)元素:第一行中間一列,下一單元:行-1,列+1,如行-1,列+1有內(nèi)容,則下一單元為“行+1,列不變”,填寫魔陣的思想,row=0;col=N/2;magicrowcol=1;for(i=2;iscale;,/生成魔陣row=0;col=(scale-1)/2;magicrowcol=1;for(count=2;count=scale*scale;count+)if(magic(row-1+scale)%scale(col+1)%scale=0)row=(row-1+scale)%scale;col=(col+1)%scale;elserow=(row+1)%scale;magicrowcol=count;/輸出for(row=0;rowscale;row+)for(col=0;colscale;col+)coutmagicrowcolt;coutch;要輸出ch的內(nèi)容??芍苯佑胏outb)return(a)elsereturn(b);,函數(shù)體,函數(shù)的命名,函數(shù)名是一個(gè)標(biāo)識(shí)符,符合標(biāo)識(shí)符命名規(guī)范函數(shù)名要有意義函數(shù)名一般是一個(gè)動(dòng)詞短語,表示函數(shù)的行為,函數(shù)舉例無參數(shù)、無返回值的函數(shù),打印一個(gè)由五行組成的三角形,*,voidprintstar()cout“*n”;cout“*n”;cout“*n”;cout“*n”;cout“*n”;,函數(shù)舉例有參數(shù)、無返回值的函數(shù),打印一個(gè)由n行組成的三角形,voidprintstar(intnumOfLine)inti,j;for(i=1;i=numOfLine;+i)coutendl;for(j=1;j=numOfLine-i;+j)cout;for(j=1;j=2*i-1;+j)coutnum;if(num=1,函數(shù)舉例有參數(shù)、有返回值的函數(shù),計(jì)算n!,intp(intn)ints=1,i;if(nxy;coutb)return(a);elsereturn(b);,函數(shù)原型說明,函數(shù)調(diào)用,函數(shù)實(shí)現(xiàn),函數(shù)調(diào)用,#includeintmax(inta,intb)if(ab)return(a);elsereturn(b);main()intx,y;cinxy;coutxy;coutn2?n1:n2);,第6章過程封裝函數(shù),函數(shù)自己編寫函數(shù)函數(shù)的使用數(shù)組作為參數(shù)帶默認(rèn)值的函數(shù)內(nèi)聯(lián)函數(shù),重載函數(shù)函數(shù)模板變量的作用域變量的存儲(chǔ)類別遞歸函數(shù)基于遞歸的算法,數(shù)組作為函數(shù)的參數(shù),設(shè)計(jì)一函數(shù),統(tǒng)計(jì)10位同學(xué)的平均成績設(shè)計(jì)考慮:如何傳遞參數(shù)參數(shù)是10位同學(xué)的考試成績,可以用10個(gè)整型數(shù)來表示。所以有10個(gè)整型的形式參數(shù)一組同類數(shù)據(jù)可以用一個(gè)數(shù)組來描述,所以參數(shù)也可以是一個(gè)10個(gè)元素的整型數(shù)組第二種方法更加簡練返回值是平均成績,統(tǒng)計(jì)函數(shù)的實(shí)現(xiàn),intaverage(intarray10)inti,sum=0;for(i=0;iscorei;cout平均成績是:average(score)side;coutcube(side)b?a:b;,函數(shù)模板的使用,maxNum=max(3,7);maxChar=max(z,a);maxDouble=max(3.5,4.6);函數(shù)模板的實(shí)例化:根據(jù)實(shí)際參數(shù)確定模板參數(shù)的值將模板參數(shù)的值代入函數(shù)模板,形成一個(gè)真正的函數(shù),第6章過程封裝函數(shù),函數(shù)自己編寫函數(shù)函數(shù)的使用數(shù)組作為參數(shù)帶默認(rèn)值的函數(shù)內(nèi)聯(lián)函數(shù),重載函數(shù)函數(shù)模版變量的作用域變量的存儲(chǔ)類別遞歸函數(shù)基于遞歸的算法,標(biāo)識(shí)符的作用域,一個(gè)標(biāo)識(shí)符能被存取的程序部分,稱為標(biāo)識(shí)符的作用域標(biāo)識(shí)符的作用域與程序塊有關(guān)。所謂的程序塊是帶有聲明的復(fù)合語句如右框中有兩塊,Intmain(void)inta=2,b=3;coutab;inta=4;coutab;coutab;,標(biāo)識(shí)符的作用域續(xù),在塊中說明的標(biāo)識(shí)符是局部的,僅能在本塊中和內(nèi)部的塊中存取。當(dāng)內(nèi)部塊與外部塊有同名標(biāo)識(shí)符時(shí),在內(nèi)部塊中屏蔽外部塊的同名標(biāo)識(shí)符。在一個(gè)函數(shù)中,我們不能存取主調(diào)程序的變量,即使知道該變量的名字。函數(shù)參數(shù)對該函數(shù)也是局部的,可以將它看成在塊內(nèi),即函數(shù)體內(nèi)說明的說明的變量。,局部變量和全局變量,局部變量:在塊內(nèi)定義的變量稱為局部變量,即使是main函數(shù)中定義的變量也是局部的。全局變量:在所有的函數(shù)外面定義的變量稱為全局變量作用范圍:從定義位置到文件結(jié)束。如在作用范圍外的函數(shù)要使用此變量,用關(guān)鍵詞extern在函數(shù)內(nèi)說明此全局變量。作用:方便函數(shù)間的數(shù)據(jù)傳遞請寫出下列程序的執(zhí)行結(jié)果:,intp=1,q=5,r=3;intf1()intp=3,r=2;q=p+q+r;cout“f1:p,q,r=“pqr;intf2()p=p+q+r;cout“f2:p,q,r=“pqr;intf3()intq;r=2*r;q=r+p;cout“f3:p,q,r=“pqr;main()f3();cout“afterf3:p,q,r=”pqr;f1();cout“

溫馨提示

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

最新文檔

評論

0/150

提交評論