C--程序設計教程完整版教學課件-整套教程電子講義(最全最新)_第1頁
C--程序設計教程完整版教學課件-整套教程電子講義(最全最新)_第2頁
C--程序設計教程完整版教學課件-整套教程電子講義(最全最新)_第3頁
C--程序設計教程完整版教學課件-整套教程電子講義(最全最新)_第4頁
C--程序設計教程完整版教學課件-整套教程電子講義(最全最新)_第5頁
已閱讀5頁,還剩483頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、第1章 C+及其開發環境概述 本章內容提要1.1 面向對象的程序設計概述1.2 從C到C+的演變1.3 認識C+程序及其開發環境1.1 面向對象的程序設計概述1.1.1 什么是面向對象的程序設計思想1對象 將用于描述對象屬性的數據,以及對這些數據施加的一組操作封裝起來,就是對象。 2類 類是具有相同屬性和行為的一組對象的集合,它為屬于該類的全部對象提供了統一的抽象描述。 類是對象的抽象,對象是類的實例化。3封裝 相關的數據和操作代碼都被放在了類及對象內部。4繼承 在定義和實現一個類的時候,可以在一個與其內容基本相同的類的基礎之加入若干新的內容。5多態 對于不同的對象,當它們收到同一消息時會調用

2、不同的方法(程序),從而執行不同的操作。1.1.2 面向過程與面向對象程序設計特點比較1面向過程的程序設計方法的缺陷(1)程序的開發效率低下2面向對象的程序設計方法的優勢(2)程序的可重用性差(3)程序的維護成本高(4)無法適應信息的快速膨脹和多樣化(1)程序的開發效率高(2)程序代碼的可重用性高(3)程序易于維護1.1.3 兩種程序設計方法對比分析1以面向過程的程序設計方式思考(1)確定所求長方形的長和寬。(2)確定計算長方形的周長和面積的公式并計算。(3)輸出計算結果。2以面向對象的程序設計方式思考(1)將長方形類的共性,即兩個基本屬性(長和寬)和兩個行為(求周長和求面積)抽取出來,設計一

3、個長方形類。(2)根據長方形類創建一個對象。(3)通過調用對象的行為求出其周長和面積。1.2 從C到C+的演變C+主要的特點: (1)C+可以被看成C語言的一個超集,是對C的增強和擴展。 (2)C+保留了C語言的全部特征,并支持所有面向對象的程序設計特征。 (3)C+很好地保持了C的簡潔、高效、靈活和接近匯編語言的特點。1.3 認識C+程序及其開發環境1.3.1 C+程序的開發過程1編寫程序2編譯程序3連接目標文件4運行程序C+程序的開發流程1.3.2 認識C+程序1第一個C+程序#include /包含頭文件iostream.h#include /包含頭文件string.h,字符串using

4、 namespace std;/使用標準命名空間/=int main() string greeting=hello world!;/定義一個字符串對象變量,并賦初值 couthello world!n;/在屏幕上輸出字符串“hello world!”并換行 coutwelcome to C+!endl;/在屏幕上輸出“welcome to C+!”并換行 coutgreeting“新建”菜單,打開“新建”對話框,然后打開“工作區”選項卡,如圖1-11所示。 步驟一圖1-11 在“工作空間名稱”編輯框中輸入myworkspace(工作區名稱只能為英文);單擊“位置”編輯框右側的 按鈕,打開“選

5、擇目錄”對話框,選擇希望在其中創建工作區文件夾的目錄,如圖1-12所示。 步驟二圖1-12 步驟三單擊“確定”按鈕,返回“新建”對話框。再次單擊“確定”按鈕,確認創建工作區并關閉“新建”對話框。此時系統將在所選目錄中創建一個工作區文件夾,并創建了myworkspace.dsw工作區文件和其他兩個文件。 按【Ctrl+N】組合鍵,再次打開“新建”對話框,然后打開“工程”選項卡。在工程類型列表區選擇“Win32 Console Application”,在“工程名稱”編輯框中輸入myproj1(工程名稱同樣只能為英文),選中“添加到當前工作空間”單選按鈕,如圖1-13所示。 步驟四圖1-13 單擊

6、“確定”按鈕,系統將打開如圖1-14左圖所示“Win32 Console Application”對話框。直接單擊“完成”按鈕,創建一個空工程。系統將顯示如圖1-14右圖所示“新建工程信息”對話框,它提示系統將為用戶創建一個空的控制臺應用程序,并顯示了工程目錄。 步驟五圖1-14 步驟六單擊“確定”按鈕,此時系統將在當前工作區目錄下創建一個工程文件夾,并在其中創建了一個myproj1.dsp工程文件。 參照步驟4至步驟6,再創建一個名為myproj2的工程。圖1-15分別顯示了創建工作區和兩個工程后的文件夾結構和Visual C+中的文件視圖(FileView)。 步驟七圖1-15 步驟八如果

7、當前工作區中包含了多個工程,每個時刻只能有一個工程為活動工程。要將某個工程設置為活動工程,可在FileView視圖下右擊該工程,然后從彈出的快捷菜單中選擇“設為活動工程”,如圖1-16所示。 圖1-16 步驟九如果希望在工程中創建一個C+源程序,可再次按【Ctrl+N】組合鍵,打開“新建”對話框,然后打開“文件”選項卡。在對話框左側的文件類型列表區選擇“C+ Source File”,在右側的“文件名”編輯框中輸入文件名,單擊“確定”按鈕,即可在當前活動工程中新建一個C+源文件,如圖1-17所示。 圖1-17 如果希望將現有文件添加到某個工程中,可在FileView視圖中右擊工程,然后從彈出的

8、快捷菜單中選擇“添加文件到工程”,打開“插入文件到工程”對話框。選擇要插入工程的文件,然后單擊“確定”按鈕,如圖1-18左圖所示。圖-18右圖顯示了分別為兩個工程插入C+源文件后的FileView視圖。 步驟十圖1-18 步驟十一要編譯并鏈接某個工程中的全部程序,應首先參照前面介紹的方法將該工程設置為活動工程,然后選擇“組建”菜單中的“組建 工程名.exe”,如圖1-19所示。 圖1-19 步驟十二步驟十三編譯和鏈接工程成功后,系統將生成“工程名.exe”文件,此時按【Ctrl+F5】組合鍵或者選擇“組建”“執行 工程.exe”菜單,均可執行程序。 以后無論是修改工程,還是修改工程中的文件,都

9、最好通過雙擊工作區文件打開工作區,然后再執行修改工作,從而保證工程的完整性。 第2章 C+程序設計基礎(上) 本章內容提要2.1 C+的數據類型2.2 常量和變量2.3 C+的運算符、表達式和優先級2.1 C+的數據類型2.1.1 C+數據類型概述2.1.2 關于數值的范圍 例如,unsigned short(無符號短整型)數據類型的長度為2字節,那么,它所能表示的最小數為0,最大數為1111 1111 1111 1111,具體如下:2.1.3 數據類型的轉換1數據類型的隱含轉換2賦值表達式中的數據類型轉換 在賦值表達式中,系統會自動將賦值運算符“=”右側表達式的值轉換為左側變量的數據類型,并

10、賦值給變量。3強制數據類型轉換一般形式:(類型名)變量 ,(類型名)(表達式)或 類型名(變量) ,類型名(表達式)例如:(int)a/將變量a強制轉換成int型(double)(m+n)/將m與n的和強制轉換成double型(char)(8%3)/將8與3取余的結果強制轉換成char型(double)(7/4)/將7/4的結果強制轉換成double型(double)7/4/將7的數據類型強制轉換為double型,/再與4求商,結果是雙精度型數據1.752.1.4 sizeof 操作符一般形式:sizeof(type) 或 sizeof(變量/表達式)sizeof(double)=8sizeo

11、f(8)=4sizeof(r)=1 sizeof(p)/假設p已定義,則求出變量p所屬類型所占的字節數 sizeof(struct Eg)/求出簡單結構體Eg的長度例如,以下形式為合法的。sizeof操作符的操作對象不能是函數、不完全類型或位字段。2.2 常量和變量(1)整型常量十進制整型常量:由正、負號和數字09組成,但數字部分不能以0開頭。如12、7、0等。2.2.1 常量的類型與符號常量的聲明1常量類型八進制整型常量:由正、負號和數字07組成,數字部分以0開頭,如0408、07761等。十六進制整型常量:由正、負號,數字09和字母AF(或af)組成,數字部分以0X或0 x開頭,用AF(或

12、af)分別表示數值從1015的數,如0XFFFF、0 x2D等。(2)實型常量十進制小數形式:由數字09和小數點組成,例如3.9,4.112。實型常量默認為double型,如果在數字后添加字母F或f,可使其成為float型。指數形式:也稱科學計數法,其格式為“小數E或e指數”,表示“小數10指數”。當用指數形式表示實型常量時,E前面的小數可以省略整數部分或小數部分,但不能同時省略。例如,.12E2、11.E3都是正確的,而E5是錯誤的。(3)字符常量普通字符常量:用單引號括起來的一個字符。轉移字符常量:由“”開頭的一個或多個字符的序列,用于表示一些無法顯示的字符。(4)字符串常量 由一對雙引號

13、括起來的零個或多個字符序列,每一個字符占一個字節,并在末尾添加“0”作為字符串結尾標志或結束標志。字符型常量與字符串常量的存儲方式(5)布爾型常量 只有兩個值,即整數0(表示邏輯假)和1(表示邏輯真)。在C+語言中還定義了這兩個布爾型常量所對應的符號常量false和true,false的值為0,表示邏輯假,true的值為1,表示邏輯真。2符號常量的聲明一般形式:const 數據類型 常量名=數值/表達式;例如, const float PI=3.141592; /定義符號常量PI代替數值3.141592const int S=sin3*(1.2); /定義符號常量S代替表達式sin3*(1.2

14、) 由字母、數字和下劃線組成,且第一個字符必須是字母或下劃線。2.2.2 變量的命名、定義與聲明1變量的命名原則例如,下面變量名為合法變量名: std,code1,n_date,_kufun,i_jing,WAN,S_name,c_Code 非法變量名:Mr.Smith,$dollar,+y,7rain,li hua,C#,car-clour,stdn,U.S.A變量名不允許使用C+關鍵字 、系統函數名和系統類名C+關鍵字C+語言中區分字母大小寫標識符采用英文單詞或其組合。通常會對變量名做一些約束:遵循最小化長度與最大化信息量原則。避免標識符過于相似。用正確的反義詞組命名具有互斥意義的標識符。

15、除非邏輯上的確需要編號,否則盡量避免名字中出現數字編號。保持在整個模塊中命名風格的統一性。2變量的定義一般形式:數據類型 變量名1,變量名2,變量名n;例如:int n;char a,b; 在定義變量的同時,還可以給它賦予一個初值,即對變量進行初始化。初值可以是常量,也可以是一個有確定值的表達式。例如:int n=6;float pi=3.1415*3;char a=V,b,c=C;3變量的聲明及其與變量定義的區別 變量聲明用于向程序表明變量的類型和名字,它并不一定為變量分配存儲單元。由于在定義變量時聲明了它的類型和名字,因此變量定義可以看作是變量聲明的一種,我們可稱其為“定義性聲明”。 除此

16、之外,我們還可以在程序的其他地方聲明已經定義的變量,這時變量的聲明只是表明了變量的類型和名稱,并不會為其分配存儲空間。在C+程序中,可以通過使用extern關鍵字聲明變量名而不定義它。2.3 C+的運算符、表達式和優先級C+中的運算符2.3.1 算術運算符與算術表達式 算術表達式:用算術運算符和括號將操作數連接起來的、符合C+語法規則的式子。算術運算符 自增與自減運算符:+ + i:在使用i之前,先使i加1,例如:i=3,運行j= + +i之后,j=4,i=4。 i:在使用i之前,先使i減1,例如:i=3,運行j=i之后,j=2,i=2。i + +:在使用i之后,再使i加1,例如:i=3,運行

17、j=i + +之后,j=3,i=4。i:在使用i之后,再使i減1,例如:i=3,運行j=i之后,j=3,i=2。2.3.2 賦值運算符與賦值表達式賦值表達式一般形式: 變量名=數值/表達式例如:a=5a=sin(2.0)a=b+c結合方向: 自右向左復合的賦值運算符: +=、=、*=、/=、%=、=、 &=、=和|=。2.3.3 關系運算符與關系表達式關系運算符前4種優先級相同,后2種優先級相同,且前者級別高于后者。優先級關系關系表達式一般形式: 表達式 關系運算符 表達式結合方向是自左向右,其比較結果是布爾型(bool)的邏輯值。2.3.4 邏輯運算符與邏輯表達式邏輯運算符優先級關系真值表2

18、.3.5 條件運算符及其表達式一般形式: 表達式1?表達式2:表達式3 如果表達式1的值為true,則整個表達式的值為表達式2的值;如果為false,則整個表達式的值為表達式3的值。表達式1的值必須為bool型,表達式2與表達式3的值可以為任意類型,且類型可以互不相同。當表達式2與表達式3的數據類型不相同時,條件表達式的值的數據類型為二者中較高級的數據類型。優先級關系2.3.6 逗號運算符及其表達式一般形式: 表達式1,表達式2 或 表達式1,表達式2,. ,表達式n按順序執行由逗號運算符分隔的各表達式,并且逗號表達式的值是最右邊的子表達式的值。結合方向:自左向右2.3.7 位運算符和位運算位

19、運算符符號及其功能描述“”是右移運算符,表示按照指定的位數將一個數的二進制值向右移位,低位右移后溢出舍棄。“”是左移運算符,表示按照指定的位數將一個數的二進制值向左移位,高位左移后溢出舍棄,低位順序補0。位運算實例2.3.8 運算符的優先級綜合實例1 輸出多種立體的的體積/實例2-1.cpp#include #include using namespace std;float VolumeCube();/以下四行代碼用于聲明函數。其中,如果函數定義float VolumeSphere();/在前,函數調用在后,則不必進行函數聲明float VolumeCone();float VolumeCu

20、be();void ThreeDArea(const char&,bool&);const double PI=3.1415;/聲明符號常量PI/主程序int main()char ch= ;/定義字符串變量,用于接受選擇信息bool flag=1;/布爾型變量,用作退出標記,為0退出或返回上級coutInput Corresponding Number n;do/dowhile循環,首先無條件執行一次dowhile循環體coutch;/從鍵盤接收字符,作為選擇信息switch(ch)/多分支選擇結構case 1:do/dowhile循環coutch;/再次從鍵盤接收字符ThreeDArea(

21、ch,flag);/調用ThreeDArea函數,根據前面的選擇/確定立體類型,然后調用相應函數。如果/前面選擇5或其他字符,則將flag標志置/0,然后結束dowhile循環while(flag);/dowhile循環結束do/dowhile循環,首先無條件執行一次dowhile循環體coutch;/從鍵盤接收字符,作為選擇信息switch(ch)/多分支選擇結構case 1:do/dowhile循環coutch;/再次從鍵盤接收字符ThreeDArea(ch,flag);/調用ThreeDArea函數,根據前面的選擇/確定立體類型,然后調用相應函數。如果/前面選擇5或其他字符,則將flag

22、標志置/0,然后結束dowhile循環while(flag);/dowhile循環結束flag=1;/將flag重新置1break;/用于跳出switch語句default: return 0;/輸入“1”之外的其他字符,結束程序運行while(flag);/若flag為1,繼續循環;若flag為0,循環結束return 0;/求立方體體積函數。將所有求體積函數的返回值均定義為float型,以保證/體積值的精確度float VolumeCube()unsigned L=0;/無符號變量L,賦初值為0coutL;return L*L*L;/求球體體積函數float VolumeSphere()u

23、nsigned R=0;coutR;return 4*PI*R*R*R/3;/求圓錐體體積函數float VolumeCone()unsigned R=0,h=0;coutRh;return h*PI*R*R/3;/求長方體體積函數float VolumeCuboid()unsigned L=0,W=0,H=0;coutL;coutW;coutH;return L*W*H;/根據選擇調用不同的求立體體積函數void ThreeDArea(const char & ch,bool & flag)switch(ch) case 1:coutVolume:VolumeCube()endl;break

24、;case 2:coutVolume:VolumeSphere()endl;break;case 3:coutVolume:VolumeCone()endl;break;case 4:coutVolume:VolumeCuboid()endl;break;default:flag=0;/無效選擇,將flag置0Input Corresponding Number【1】Volumes of Solids【2】Exit1【1】Cube【2】Sphere【3】Cone【4】Cuboid【5】Return3Please Input radius and height:5 8volume:209.433

25、【1】Cube【2】Sphere【3】Cone【4】Cuboid【5】Return5【1】Volumes of Solids【2】Exit2測試數據與運行結果:綜合實例2 判斷三角形類型并求解 其面積/實例2-2.cpp#include #include /由于程序中用到sqrt(),所以包含了math.h文件using namespace std;int main()double a,b,c,s,area;couta;coutb;coutc;if(a+bc&a+cb&b+ca)/此表達式相當于/(a+bc)&(a+cb)&(b+ca)s=(a+b+c)/2;area=sqrt(s*(s-a)

26、*(s-b)*(s-c);cout三條邊組成三角形的面積:area邏輯運算符cout此三角形是等邊三角形!邏輯運算符cout此三角形是等腰三角形!endl;else if(a*a=b*b+c*c|b*b=a*a+c*c|c*c=a*a+b*b)/相當于(a2=b2+c2)|(b2= a2+c2)|(c2=a2+b2)cout此三角形是直角三角形!endl;elsecout此三角形是不規則三角形!endl;elsecout三條邊不能組成三角形!ab;/輸入語句couta+b;/輸出語句3控制語句選擇語句: if( )else(條件語句) switch(多分支選擇語句)循環語句: for( )(f

27、or循環語句) while( )(while循環語句) dowhile( )(dowhile循環語句)轉向語句: break(終止執行switch或循環語句) continue(結束本次循環) goto(轉向語句) return(從函數返回語句)3.1.3 空語句只有一個分號組成的語句,它不執行任何操作例如:for(i=1;i100;i+);/起延時的作用3.1.4 復合語句 將若干條語句用括起來,又稱為塊語句。通常作為函數的函數體、循環語句的循環體、if語句的分支等例如:if(b) a=a+b;if(a=b)couta=0表達式1表達式2表達式n; 兩個數據之間用空格(Space)、制表符(

28、Tab)或換行符(Enter)分隔開3.2.1 輸入語句例如:char a, b;float c;int d;cinabcd;如果輸入1 234.5678結果:a=1,b= 2,c=34.56,d=78cout表達式1表達式2表達式nendl;3.2.2 輸出語句例如: cout變量score1的值是:score1t 變量score2的值是:score2endl;也可以寫成:cout變量score1的值是:;/雙引號中的字符串在屏幕上原樣輸出coutscore1;/輸出變量score1的值coutt;/輸出轉義字符,移動一個制表位cout變量score2的值是:/雙引號中的字符串在屏幕上原樣輸

29、出coutscore2;/輸出變量score2的值coutendl;/輸出全部數據并換行3.2.3 輸入/輸出的格式控制常用的輸入/輸出流格式控制符3.3 程序的流程控制3.3.1 選擇結構簡化的if語句:1if語句if(表達式)語句;ifelse語句:if(表達式)語句1;else 語句2;ifelse if語句:if(表達式1)語句1;else if(表達式2)語句2;else if(表達式n)語句n;else 語句n+1;2if語句的嵌套注:else必須與if配對使用,它總是與它上面最近的且未配對的if配 對。3switch語句switch(表達式)case 常量表達式1:語句1; br

30、eak;case 常量表達式2:語句2; break;case 常量表達式n:語句n; break;default: 語句n+1; break;注意:每個case后面的常量表達式必須各不相同,否則會出現矛盾,即一個值有多種選擇。各個case語句和default語句出現的順序對執行結果沒有影響。若case后面沒有break,則執行完case語句后不再進行判斷,程序將轉到下一個case語句繼續執行,直至遇到break,程序才能退出switch語句。default后面的break可以省略。多個case可以共用一組執行語句。3.3.2 循環結構for(表達式1;表達式2;表達式3)循環體語句;1for

31、語句while(表達式)循環體語句;2while語句do循環體語句;while(表達式);3dowhile語句 在一個循環的循環體中又包含另一個循環語句稱為循環嵌套,又稱多重循環。三種循環語句for、while和dowhile可以互相嵌套,執行順序是先執行最里層的循環語句,依次往外執行,最后執行最外層的循環。4循環嵌套3.3.3 轉向語句break;1break語句continue;2continue語句goto 語句標號;3goto語句return 表達式;4return語句3.4 預處理命令3.4.1 宏定義#define 標識符 字符串例如: #define PI 3.1415926#d

32、efine 宏名(參數表) 字符串例如: #define L(a,b) (a+b)/2另外,還可以用#define命令定義帶參數的宏:3.4.2 文件包含#include 文件名或 #include 3.4.3 條件編譯(1)#ifdef 標識符程序段1#else程序段2#endif(2)#ifndef 標識符程序段1#else程序段2#endif(3)#if 表達式程序段1#else程序段2#endif綜合實例1 根據輸入的年齡判斷 所屬年齡階段/實例3-1.cpp#include void main()int n;/局部聲明語句do/循環結構,輸入年齡信息 coutn;/輸入年齡if(n=

33、0)/如果年齡=0,顯示出錯信息,結束循環 cout輸入錯誤!0&n10)cout“小孩”;/多重選擇語句,用于進行年齡階段的判定else if(n20)cout少年;else if(n30)cout青年;else if(n50)cout=50)cout老年;coutendl;while(n200);/循環條件請輸入年齡:45中年請輸入年齡:15少年請輸入年齡:0輸入錯誤!測試數據與運行結果:綜合實例2 將輸入數字轉換為以漢字 形式輸出的貨幣金額/實例3-2.cpp#include #include void main() double x,i=10000000;int j=0;unsigne

34、d int quotient,remainder;bool beginFlag=0,zeroFlag=0;coutx;while (x=100000000)/如果連續三次輸入的數字不符合要求,則退出程序 if (j=2)/控制連續輸入無效數字的次數 cout你的錯誤輸入已達3次,你無權再輸入!endl;return;cout輸入金額無效,請重新輸入!endl;coutx;j+;/累計輸入次數x=floor(x*100+0.5)/100;/實現輸入數值的小數點后2位四舍五入while(i0.001) if(i=1)quotient=(unsigned int)floor(x/i);/將不大于x/

35、i的最大整數轉換成無符號整數else if(i=0.1)quotient=(unsigned int)floor(x*10);/取第一位小數elsequotient=(unsigned int)floor(x*100);/取第二位小數remainder=quotient%10;/取個位數字if(remainder!=0)/如果當前數字不等于0 beginFlag=1;/置beginFlag標記位為1/根據標記位判斷是否將數字之間的0轉換為零if(zeroFlag=1)&(beginFlag=1)&(i=1)&(remainder0)cout零;switch(remainder)/將數字轉換為相

36、應的漢字 case 0:break;case 1:cout壹;break;case 2:cout貳;break;case 3:cout叁;break;case 4:cout肆;break;case 5:cout伍;break;case 6:cout陸;break;case 7:cout柒;break;case 8:cout捌;break;case 9:cout0)/如果當前數字不為零zeroFlag=0;/置zeroFlag標記位為0else if(beginFlag=1)/如果當前數字為零且不是第一個非零數字zeroFlag=1;/置zeroFlag標記位為1if(beginFlag=1)/

37、對于非0數字,輸出各位數字后面的單位 if(i=10000000)&(remainder0)cout0)cout0)cout拾;if(i=10000)cout0)cout0)cout0)cout拾;if(i=1)cout0)cout0)cout分;i=i/10;cout整endl;/每個金額的最后一個字為整請輸入要轉換的數字(小于1億):-144.35輸入金額無效,請重新輸入!請輸入要轉換的數字(小于1億):4050076.5364肆佰零伍萬零柒拾陸元伍角肆分整測試數據與運行結果:綜合實例3 輸出楊輝三角/實例3-3.cpp#include void main() int n,r,c,m,j=

38、0;coutm;while (m=14)/如果連續三次輸入的數字不符合要求,則退出程序 if (j=2) cout你的錯誤輸入已達3次,你無權再輸入!endl;return;cout你輸入的行數超出范圍,請重新輸入!endl;coutm;j+;/累計輸入次數for (n=0;n=m-1;n+)/逐行輸出數字和空格 for(r=1;r15-n;r+)/輸出第一個數字之前的空格,為了打印出金字cout ;/塔形狀,要保證各行依次遞減2個空格c=1;/第一個數字總為1coutc ;/輸出第一個數字以及3個空格for(r=1;r=n;r+)/輸出各行的其他數字和空格 c=c*(n-r+1)/r;/計算

39、應輸出數字if(c100)/根據數值大小確定數字后面的空格個數if(c10)coutc ;/一位數的后面輸出3個空格elsecoutc ;/兩位數的后面輸出2個空格elsecoutc ;/三位數的后面輸出1個空格couty?x:y;return z;(2)函數名 函數名通常用一個能反映函數功能的單詞表示,它必須要符合C+標識符命名規則,由字母、數字和下劃線組成。函數名后面必須跟一對括號,用來與其他標識符區分開。例如:int max(int x,int y) int z;z=xy?x:y;return z;(3)函數體 函數體是實現函數功能的主體部分,一般是一條復合語句,用花括號括起來,中間可以

40、是一條或若干條語句。(4)參數列表 參數列表由0個或多個參數組成,寫在函數名后面的圓括號內,用于向函數傳送數值或從函數帶回數值。參數列表內給出的每一個參數都要指出其類型和參數名。根據參數列表中給出的參數的個數,函數可分為無參函數和有參函數。當參數個數多于1個時,參數之間用逗號隔開。4.1.2 函數原型的聲明函數類型 函數名(參數列表); 當在一個函數中調用另一個函數時,調用其他函數的函數稱為主調函數,被其他函數調用的函數稱為被調函數。 如果被調函數在使用時尚未定義,即調用在前,定義在后,則必須在函數調用前對被調函數原型進行聲明。函數原型的聲明形式如下:例如:int max(int a,int

41、b);void line();double area(double r);或int max(int a,int b);4.2 函數的參數與返回值 定義函數時,函數名后面括號中的變量名稱為形式參數(簡稱形參)。 調用函數時,函數名后面括號中的參數(或表達式)稱為實際參數(簡稱實參)。4.2.1 函數的參數1形參和實參 形參和實參用于實現主調函數與被調函數之間數據的傳遞。例如:int max(int a,int b)/該語句中定義了兩個形式參數a和bcout9和5中較大的數是max(9,5)endl;/該語句中定義了兩個形式參數a和b2參數的傳遞 函數調用過程中的數據傳遞是由實參向形參進行的。 在

42、函數調用時,首先要計算出實參表達式的值,然后給對應的形參變量分配存儲單元,并將實參的值復制到形參的存儲空間中,即對形參進行初始化后執行該函數。這種傳遞方式稱為值傳遞。 值傳遞的特點是:在函數執行過程中形參的變化不會影響實參的值。也就是說,即使形參的值在函數中發生了變化,實參的值也不會改變,仍為調用前的值。3設置函數參數的默認值 函數調用過程中的數據傳遞是由實參向形參進行的。 在函數調用時,首先要計算出實參表達式的值,然后給對應的形參變量分配存儲單元,并將實參的值復制到形參的存儲空間中,即對形參進行初始化后執行該函數。這種傳遞方式稱為值傳遞。 值傳遞的特點是:在函數執行過程中形參的變化不會影響實

43、參的值。也就是說,即使形參的值在函數中發生了變化,實參的值也不會改變,仍為調用前的值。4.2.2 函數的返回值 通過函數的調用使主調函數得到一個確定的函數值,就是函數的返回值。函數的返回值是通過函數中的return語句給出的。 在定義函數時應指定函數類型,通常,return語句中表達式的類型應與函數類型相一致。如果二者不一致,則應以函數類型為準,自動進行類型轉換,即函數類型決定返回值類型。例如: int area(double r)/函數類型為int型 double s; s=3.1415926*r*r; return s; /返回值類型為double型,返回時被轉換為int型數據4.3 函數

44、調用函數名(實參列表);常見的函數調用方式:4.3.1 函數調用的一般形式若函數沒有返回值,可將函數調用單獨作為一個語句使用,用于完成一定的操作。若函數有返回值,可將函數調用作為語句的一部分,利用返回值參與表達式的運算或執行某種操作。4.3.2 函數的嵌套調用 C+中不允許函數的嵌套定義,但允許函數的嵌套調用,即在調用一個函數的過程中又調用另一個函數。兩層嵌套函數的調用過程4.3.3 函數的遞歸調用 一個函數直接或間接地調用該函數本身,稱為函數的遞歸調用。執行過程直接遞歸函數是指在一個函數中直接調用自身。例如:int f (int x) int y;z=f(y);/在調用函數f的過程中,又調用

45、了函數freturn z;執行過程間接遞歸調用是指在一個函數中調用其他函數,而在其他函數中又調用了本函數。例如:f1()f2()/在調用函數f1的過程中,又調用了函數f2f1()/在調用函數f2的過程中,再次調用了函數f1/f1既是主調函數,又是被調函數首先從原問題出發,按遞歸公式遞推,最終達到遞歸終止條件,從而將一個復雜問題分解為一個相對簡單且可直接求解的子問題,這個過程為遞推階段。遞歸調用的過程分為兩個階段:然后將這個子問題的結果逐層代入遞歸公式求值,最終求得原問題的解,這個過程為回歸階段。4.4 內聯函數inline 函數類型 函數名(形參列表) 函數體 ;定義內聯函數的格式為: C+允

46、許在編譯時將被調用的代碼直接嵌入到主調函數中,這種嵌入到主調函數中的函數稱為內聯函數(inline function),又稱內嵌函數或內置函數。注:一般只將函數規模很?。ㄒ话銥?個語句以下)且使用頻繁的函數聲明為內聯函數,并且內聯函數內不能包括循環語句和switch語句。4.5 函數重載例如:int sum(int x,int y) return x+y; float sum(float x,float y) return x+y; int sum(int x,int y,int z) return x+y+z; 所謂函數重載是指同一個函數名可以對應著多個不同的函數實現。每一類實現對應著一個函

47、數體,這些函數的名字相同,功能相同,只是參數的類型或參數的個數不同。例如:int f(int x,int y) float f(int x,inty) double f(int x,int y) 若多個同名函數只是函數類型不同時,則它們不是重載函數。4.6 變量的存儲屬性任何變量都有其有效作用范圍,稱為變量的作用域。 在函數內部定義的變量稱為局部變量,它只在該函數范圍內有效。也就是說,只有在該函數內才能使用這些變量。4.6.1 變量的作用域1局部變量關于局部變量的幾點說明:不同的函數中可以使用相同的變量名,它們代表不同的對象,相互之間也不會干擾。形參也是局部變量。在一個函數內復合語句中定義的變

48、量,只在本復合語句中有效。與其他函數相同,在main函數中定義的變量,只在主函數中有效,主函數也不能使用其他函數中定義的變量。在函數原型聲明語句中出現的參數名,其作用范圍只限于本行的括號內。 在函數外部定義的變量稱為全局變量,其作用范圍是從定義變量的位置開始到本源文件結束。2全局變量關于全局變量的幾點說明:全局變量增加了函數之間數據聯系的渠道。由于全局變量不屬于任何一個函數,所以它可被作用域內的所有函數直接引用。如果在一個函數中改變了全局變量的值,那么也同時改變了其他函數中引用的該變量的值。在同一個源文件中,允許全局變量與局部變量同名。此時,在局部變量的作用范圍內,全局變量被屏蔽而不起作用。通

49、常情況下,應盡量不要使用全局變量,因為全局變量在程序全部執行過程中都占用存儲單元,且降低了函數的通用性、可靠性和可移植性。靜態存儲方式是指在程序運行期間,系統對變量分配固定的存儲空間。4.6.2 變量的存儲類別動態存儲方式是指在程序運行期間,系統對變量動態地分配存儲空間。變量在內存中的存在時間稱為變量的存儲期。數據在內存中的存儲方法又稱存儲類別。存儲類別 數據類型 變量名;在定義局部變量時,如果用關鍵字auto加以聲明,則這類局部變量稱為自動變量,系統對自動變量是動態分配存儲空間的。1自動變量例如:int fun(int a)auto int x,y;int b;用關鍵字static可以聲明靜

50、態局部變量和靜態全局變量。其中,靜態局部變量的作用域與自動變量相同,都是從定義的位置起,到函數體結束為止,但它們的存儲期不同。由于系統為靜態局部變量在靜態存儲區分配存儲單元,因此在函數調用后,靜態局部變量并不釋放存儲空間,并且保留函數調用結束時的值,在下一次調用該函數時仍使用原來的存儲單元。2靜態變量 為靜態變量賦初值是在編譯時進行的,即只賦值一次,以后每次調用函數時不再重新賦初值。如果在定義局部變量時未賦初值,編譯系統自動為其賦初值0(整型變量)或空字符(字符型變量)。如果局部變量用關鍵字register作聲明,則允許將該局部變量的值保存在寄存器中,需要用時直接從寄存器中取出,不必再到內存中

51、去取了,則這類變量稱為寄存器變量。3寄存器變量例如:int f(int n) register int i,j;/將i和j定義為寄存器變量for(i=1,i=n,i+)j*=i;return j;用extern可以在同一文件中聲明全局變量。如果全局變量不在程序開頭定義,當需要在定義位置之前引用該全局變量時,則可以在引用之前用關鍵字extern對該變量作外部變量聲明,告訴編譯系統該變量是將在后面定義的全局變量。這種聲明被稱為提前引用聲明。4用extern聲明全局變量與外部變量例如:void main() extern int i,j;/提前引用聲明,全局變量i、j將在后面定義/從而可以在main

52、函數中使用該全局變量couti,jendl;int i=5,j=6;/定義全局變量i、j,其作用域從此處開始到本程序文件結束void f()用extern可以在包含多個文件的程序中聲明外部變量。一個完整的C+程序往往包括多個源文件,當其他文件中要引用某一文件中定義的全局變量時,則應在引用全局變量的文件中用extern對該全局變量作外部變量聲明。例如:/file1.cppextern int i,j; void main() couti,jendl; /file2.cppint i=5,j=0;/定義全局變量void f()4.7 內部函數和外部函數按照存儲類別的不同,函數可分為:只能被本文件中

53、其他函數調用的函數稱為內部函數,也稱為靜態函數。定義內部函數時,需在函數類型的前面加關鍵字static。如果一個函數既能被本文件調用也能被其他文件調用,則表示此函數時外部函數。定義外部函數時,在函數類型的前面加關鍵字extern,關鍵字extern可以省略。例如:static int fun(int a,int b) 例如:extern int fun(int a,int b) 綜合實例1 編排日歷/實例4-1.cpp# include # include # include void coutmonth(int m);/函數原型的聲明void couthead(int m);int days

54、ofmonth(int m);int firstday(int y);int year,weekday;/定義全局變量void main() int i;coutyear;weekday=firstday(year);/計算該年的元旦是星期幾coutn;cout year年endl;for(i=1;i=12;i+)/按月顯示該年的日歷 coutmonth(i);/顯示一個月的日歷coutn;void coutmonth(int m)/顯示一個月的日歷 int i,days;couthead(m);/輸出該月日歷的第一行標題days=daysofmonth(m);/計算該月的天數for(i=1;

55、i=days;i+)/按格式輸出該月的日歷 coutsetw(5)i;/setw(n)用于設置輸出內容的寬度,數據右對齊weekday=(weekday+1)%7;/計算星期幾if (weekday=0) coutn ;/輸出一個星期后換行void couthead(int m)/輸出每月日歷的第一行標題 int i;coutn;coutm月 日 一 二 三 四 五 六n;cout ;for(i=0;iweekday;i+)/確定每月第一天的位置cout ;int daysofmonth(int m)/計算每月的天數 switch (m) case 1:/1、3、5、7、8、10、12月有31

56、天case 3:case 5:case 7:case 8:case 10:case 12:return 31;case 4:/4、6、9、11月有30天case 6:case 9:case 11:return 30;case 2:if (year%4=0 & year%100!=0)|year%400=0)/閏年2月有29天return 29;else /平年2月有28天return 28;default: return 0;int firstday(int y)/判斷某年元旦是星期幾 double s ;s=floor(year-1+(year-1)/4.0-(year-1)/100.0+(

57、year-1)/400.0+1);return (int)s%7;請輸入年份:1984 1984年1月 日 一 二 三 四 五 六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 312月 日 一 二 三 四 五 六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29測試數據與運行結果:12月 日 一 二 三 四 五 六 1 2 3 4 5 6 7 8 9 10 11 12 13

58、 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 28 30 31綜合實例2 求兩點間距離/綜合實例4-2.cpp#include #include float s(int a1,int b1,int a2,int b2);/函數原型的聲明float s(float a1,float b1,float a2,float b2);void main() int x1,y1,x2,y2;float i;float d1,d2,d3,d4,d;coutx1y1x2y2;i=s(x1,y1,x2,y2);/計算坐標為整數的兩點之間的距離coutd=iendl;

59、coutd1d2d3d4;d=s(d1,d2,d3,d4); /計算坐標為浮點數的兩點之間的距離coutd=dendl;/定義重載函數float s(int a1,int b1,int a2,int b2) /定義形參為整型的函數s() return sqrt(b2-b1)*(b2-b1)+(a2-a1)*(a2-a1); float s(float a1,float b1,float a2,float b2) /定義形參為浮點型的函數s() return sqrt(b2-b1)*(b2-b1)+(a2-a1)*(a2-a1); 輸入兩個整型的點:34 66 7 13d=59.4811輸入兩個

60、實型的點:23.7 45.33 8.6 5.89d=42.2318測試數據與運行結果:綜合實例3 漢諾塔問題求解/綜合實例4-3.cpp#includevoid move(char one,char anoth)/將一個柱子上的盤子移動到另一個柱子 coutone anothendl; void hanoi(int n,char no1,char no2,char no3)/求解漢諾塔問題 if (n=1) move(no1,no3);/只有一個盤子時,從A移動到Celse hanoi(n-1,no1,no3,no2);/將n-1個盤子借助C從A移動到Bmove(no1,no3);/將最后一個

溫馨提示

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

評論

0/150

提交評論