面向?qū)ο蟪绦蛟O計——基于Visual C++:第2章 C++語言基礎_第1頁
面向?qū)ο蟪绦蛟O計——基于Visual C++:第2章 C++語言基礎_第2頁
面向?qū)ο蟪绦蛟O計——基于Visual C++:第2章 C++語言基礎_第3頁
面向?qū)ο蟪绦蛟O計——基于Visual C++:第2章 C++語言基礎_第4頁
面向?qū)ο蟪绦蛟O計——基于Visual C++:第2章 C++語言基礎_第5頁
已閱讀5頁,還剩128頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第2章 C+語言基礎,1,本節(jié)主要內(nèi)容: 2.1.1 C+的主要特點 2.1.2 C+程序與C程序 2.1.3 C+對C的一般擴充 2.1.4 利用Visual C+編制和運行C+程序,2.1 C+概述,C+語言是由貝爾實驗室的Bjarne Stroustrup 在1980年創(chuàng)建的。自90年代后,C+越來越受到重視并得到廣泛的應用,C+是由C擴充而來,因此,除了與C兼容,C+還繼承了C的以下特點:豐富的運算符和數(shù)據(jù)類型、結構化的程序設計方法、高效的機器代碼、良好的可移植性。 支持面向?qū)ο蟪绦蛟O計的方法。 C+的錯誤檢查機制強,提供了專門的機制檢查類和異常處理功能。 C+有很多成熟的編譯器:Vi

2、sual C+、Inprise(被Borland兼并)的C+ Builder、Borland的Borland C+和IBM的VisualAge C,2.1.1 C+的主要特點,C語言程序: /* 這是一個簡單的C程序: simple.c */ #include void main(void) printf( Hello World !n ) ; / 輸出字符串 用C+語言編寫同樣功能的程序,2.1.2 C+程序與C程序,C+語言程序: / 這是一個簡單的C+程序:simple.cpp #include void main(void) cout Hello World !n ; / 輸出字符串,

3、程序運行后在屏幕上輸出: Hello World,1)C+程序與C程序的結構完全相同。 (2)C源程序文件的擴展名為C,C+源程序文件的擴展名為CPP。 (3)C注釋使用符號“/*”和“*/”,表示符號“/*”和“*/”之間的內(nèi)容都是注釋;C+除了支持這種注釋,還提供了一個雙斜線“/”注釋符,表示“/”之后的本行內(nèi)容是注釋,注釋在行尾自動結束。 (4)C程序所包含的標準輸入、輸出的頭文件是stdio.h,輸入、輸出通常通過調(diào)用函數(shù)來完成;而C+程序可以包含標準輸入、輸出流的頭文件iostream.h,輸入、輸出可以通過使用標準輸入、輸出流對象來完成,C+程序與C程序的比較,一個C+程序可以由多

4、個函數(shù)構成; 每個程序都從主函數(shù)main()開始執(zhí)行,從主函數(shù)返回時結束執(zhí)行; 組成程序的語句主要包括聲明語句和執(zhí)行語句; 聲明語句用于聲明變量和函數(shù),變量聲明語句說明變量的名稱和數(shù)據(jù)類型,函數(shù)聲明語句說明函數(shù)的名稱、參數(shù)類型和返回值; 執(zhí)行語句包括:賦值語句、表達式語句、函數(shù)調(diào)用語句和流程控制語句等,它們寫在一個函數(shù)中(包括主函數(shù))。 例,C+程序基本結構,include void main() int math, chem, phy, ave; coutmathchemphy; ave=(math+chem+phy)/3.0+0.5;/ 0.5用于四舍五入 if (ave=90)/ 使用i

5、felse if語句 cout=60,例 輸入一個學生三門課的成績,計算其平均值,并根據(jù)其值輸出評語,1)當函數(shù)定義放在函數(shù)調(diào)用之后時,C程序函數(shù)原形(function prototype)有時可省略,而C+函數(shù)原形(聲明)必不可少。一個不帶參數(shù)的C函數(shù)原形必須使用void,而C+可以使用空參數(shù)列表。C+還要求函數(shù)所有參數(shù)在函數(shù)原形的圓括號中聲明。 (2)在C語言中,函數(shù)和語句塊(花括號“”之間的代碼)的所有變量聲明語句必須放在所有執(zhí)行語句之前。而C+中變量聲明語句不要求放在函數(shù)和語句塊的開始位置,可以把變量聲明放在首次使用變量的附近位置,這樣可提高程序的可讀性,2.1.3 C+對C的一般擴充

6、,3)C+用new和delete運算符取代C的內(nèi)存分配和釋放函數(shù)malloc()和free()。 (4)標準C+提供了字符串類,可以替代C函數(shù)庫中的字符數(shù)組處理函數(shù)。 (5)進行輸入、輸出操作時,C+用控制臺輸入、輸出流對象(在頭文件iostream.h中進行了類的聲明)替代C的stdio函數(shù)庫,利用“”流提取運算符或“”流插入運算符,分別將數(shù)據(jù)對象從輸入流提取出來或插入到輸出流,從而完成數(shù)據(jù)的輸入和輸出。 使用C+面向流的輸入、輸出方式提高了程序的可讀性,減少了錯誤的發(fā)生。 例,2.1.3 C+對C的一般擴充,include / 使用輸入、輸出流 void main(void) coutxy

7、z ;/ 從鍵盤讀取數(shù)據(jù)給變量x、y、z coutThe sum is x+y+zn ;/ 輸出結果,例 編寫程序利用標準輸入流接收用戶從鍵盤輸入的數(shù)據(jù),利用標準輸出流將運算結果輸出到屏幕,程序運行的結果為:please enter the value of x , y , z :2 4 6The sum is 12,1)啟動Visual C+,執(zhí)行“File|New”菜單命令,在New對話框的Projects頁面左側項目類型列表中選擇Win32 Console Application項,在對話框右側的Location和Project Name框中分別輸入路徑和項目名稱,單擊OK按鈕,2.1.

8、4 利用Visual C+編制和運行C+程序,2)進入Win32 Console Application step-1 of 1對話框,選擇An Empty Project項,單擊Finish按鈕。最后在New Project Information對話框單擊OK按鈕完成項目的建立,3)建立和編輯C+源程序文件。執(zhí)行“Project|Add to Project|New”菜單命令,在New對話框的File頁面選擇C+ Source File項,在File框中填入C+源文件名,確認選擇Add to project,單擊OK按鈕將打開文本編輯器。輸入并編輯C+源程序代碼,4)建立可執(zhí)行程序。執(zhí)行“

9、Build|Build”菜單命令(快捷鍵F7)即可建立可執(zhí)行程序,若程序有語法錯誤,則在屏幕下方的輸出窗口中顯示錯誤信息,5)執(zhí)行“Build|Execute”菜單命令即可在偽DOS狀態(tài)下運行程序,也可進入DOS狀態(tài)后運行已建立的程序。 注意不能在Windows中直接運行一個控制臺程序。 也可采用另一種簡單的方法編寫C+程序,即執(zhí)行“File|New|Files|C+ Source File”菜單命令直接創(chuàng)建一個C+源文件,在執(zhí)行Build命令時再建立項目工作區(qū),作業(yè):P60,2-2,2-3 上機作業(yè):P63,2-43,2-44,2.2 C+程序基本要素,程序由語句組成,語句由基本要素組成。任

10、何一種程序設計語言都有自己的一套語法規(guī)則以及按照語法規(guī)則構成的元素,程序基本要素就是這樣一種具有獨立語法意義的元素。C+程序基本要素主要包括標識符、關鍵字、常量、變量、運算符和表達式等,標識符是程序員或系統(tǒng)定義的符號,用以標識變量、函數(shù)、對象等。 標識符由字母、數(shù)字和下劃線組成,它必須以字母或下劃線開始。 為標識符取名時,盡量使用能夠反映其用途的單詞或縮寫,這樣可提高程序的可讀性,2.2.1 標識符,例如: x,y,sum,length,Area,Myfun,m_xPos,CPerson,person1,關鍵字是C+編譯器預定義的、具有固定含義的保留字,在程序中它們不能被作為一般的標識符使用。

11、 C+增加了C不具有的關鍵字,并且不同C+編譯器含有不同的關鍵字,2.2.2 關鍵字,例如: auto,bool,break,case,char,class,const,continue,default,delete,do,double,else,enum,extern,false,float,for,friend,goto,if,inline,int,long,new,operator,private,protected,public,return,short,signed,sizeof,static,struct,switch,template,this,true,try,typedef,

12、union,unsigned,using,virtual,void,while,在程序中使用的數(shù)據(jù)有常量和變量兩種形式; 常量是不能被程序改變的固定值; 變量是可以被程序改變的數(shù)據(jù)。 常量和變量的主要區(qū)別在于:常量不占內(nèi)存空間,不能為常量賦值;而變量需要占內(nèi)存空間,可以給變量賦不同的值。 不管常量還是變量,程序中使用的每一個數(shù)據(jù)都屬于一種特定的數(shù)據(jù)類型。 在使用變量之前,必須先利用標識符聲明變量。 變量聲明的形式,2.2.3 常量和變量,變量聲明的一般形式如下: =, =,,變量聲明語句說明了變量的名稱和數(shù)據(jù)類型,程序中通過變量名來存取其中的數(shù)據(jù),數(shù)據(jù)類型定義了變量的存儲結構和可以進行的運算。

13、編譯程序要為聲明的變量分配存儲空間,并可以給變量賦一個初始值。 例如: int x; float radius=123.56 int x, y=100,2.2.4 運算符和表達式,運算符: 運算是對數(shù)據(jù)進行加工的過程,表示各種不同運算的符號稱為運算符,而參與運算的數(shù)據(jù)稱為操作數(shù)。 運算符實質(zhì)上是系統(tǒng)預定義的函數(shù)名,而進行運算就是調(diào)用一個函數(shù)。 按運算符和操作數(shù)的運算性質(zhì),運算符可分為算術運算符、邏輯運算符、關系運算符和其它運算符(見表2-1)。 例如:+、-、*、/、%、+、()、=、+=、-、 float v, r, h; int a=3; / 等價于:int a(3); char c=A;

14、 long lx=12345678; unsigned int nWidth,可以使用運算符“( )”進行強制類型轉換: float x=123.56; int i=(int)x;/ i=123,2.3.2 const常量類型,const常量類型表示一個“常值變量”,即值不能被改變的變量。 聲明一個const型變量只需在數(shù)據(jù)類型說明前加上關鍵字const。例如: const int size=20 ; 用const聲明的變量必須用常量或常量表達式初始化。一旦變量被聲明為const型,禁止任何試圖修改該變量的操作。如果知道一個變量賦初值后在生命周期里其值不變,用const限定該變量是程序設計的好

15、習慣,如數(shù)組長度,前面介紹了基本數(shù)據(jù)類型,后面開始介紹指針類型和構造類型,包括數(shù)組、指針、字符串、結構和枚舉等類型,數(shù)組屬于構造類型,它是一組具有相同類型數(shù)據(jù)的有序集合,其中每個數(shù)據(jù)稱為數(shù)組的元素。數(shù)組按其下標的個數(shù)分為一維數(shù)組、二維數(shù)組和多維數(shù)組。 一維數(shù)組的聲明方式如下: 常量表達式; 二維數(shù)組的聲明方式如下: 常量表達式 常量表達式; 數(shù)組名后括號中的常量表達式表示數(shù)組的長度,即數(shù)組所包含元素的數(shù)量。 例如. .,2.3.3 數(shù)組,數(shù)組的使用: 數(shù)組聲明后,可以引用數(shù)組每個元素,但不能一次引用整個數(shù)組。數(shù)組元素作為一個簡單的變量對待。數(shù)組元素的引用方式如下: 下標表達式 下標表達式 下標

16、表達式,數(shù)組聲明語句: float score30; / 數(shù)組score有30個元素,其數(shù)據(jù)類型是float型 int Array124; / 數(shù)組Array有124個元素,其數(shù)據(jù)類型是int型,注意: 數(shù)組元素的下標從0開始,直到數(shù)組長度減1,如:score0,score1,score29。 在編譯C+源程序時,為了保證程序編譯和運行的效率,C+編譯系統(tǒng)不對數(shù)組下標進行越界檢查,程序運行時系統(tǒng)也不會提出越界警告。因此在對數(shù)組元素進行操作時應格外注意,以免破壞其它存儲單元的數(shù)據(jù),否則可能造成不可預料的后果,數(shù)組的初始化 聲明數(shù)組時可以用一個用花括號括起的常量列表對數(shù)組進行初始化,例如: flo

17、at grade3=90.0, 75.0, 85.0; 二維數(shù)組和多維數(shù)組的初始化可以按照數(shù)組的排列順序或分行賦初始值的方法。例如: int a23=2, 4, 6, 8, 10, 12; / 按數(shù)組的排列順序 int a23=2, 4, 6,8, 10, 12; / 分行賦初始值 其中,2、4、6分別為a0的元素a00、a01和a02的初始值,數(shù)組的初始化 初始值的個數(shù)可以比數(shù)組元素的個數(shù)少,這時未提供初始值的元素被置為0。例如: int a23=2, 4, 6; 當提供全部的初始值時,數(shù)組第一維的長度可以省略。例如: float grade = 90.0, 75.0, 85.0; int

18、a 3 = 2, 4, 6,8, 10, 12; 數(shù)組使用舉例,例 輸入10個學生某門課的成績,然后按與輸入次序相 反的順序輸出成績。 #include void main() int i; float score10; coutscorei;/ 輸入數(shù)據(jù) cout=0; i-) coutscorei ;/ 逆向輸出結果 coutn;,任何變量都有一個內(nèi)存地址,這種地址稱為指針,而指針變量是一種存放內(nèi)存地址的變量。每一個指針變量都有相應的數(shù)據(jù)類型,該類型用以說明指針所指內(nèi)存單元中存放的數(shù)據(jù)的類型。 指針變量聲明的一般形式為: * ; 符號“*”是指針類型說明符,聲明變量是一個指針型變量。例如:

19、 int* pointer ; int *pointer ; / 兩條語句功能相同,2.3.4 指針,有兩個與指針有關的運算符:取地址運算符“”和指針運算符“*”; 運算符“”用于取一個變量的地址; 運算符“*”以一個指針作為其操作數(shù),其運算結果表示所指向的變量; “”運算和“*”運算互為逆運算。 指針使用舉例,與指針有關的運算符,include void main() int a, b, *pa, *pb; a=10; b=20; pa= 運行結果,例 指針的使用,程序運行結果: 10,20 20,10 200,100,如果先聲明了變量,就可以在聲明指針變量時對指針進行初始化。如下所示: i

20、nt a, b; int *pa,指針與數(shù)組,指針與數(shù)組關系密切,編程時可以用指針代替下標引用數(shù)組元素,指針使數(shù)組的使用更為靈活、有效; 當聲明一個數(shù)組后,編譯程序會按照數(shù)組的類型和長度為它分配內(nèi)存空間,數(shù)組名表示數(shù)組在內(nèi)存中的首地址; 當用一個指針變量存儲數(shù)組首地址時,該指針就指向這個數(shù)組,就可以通過指針運算間接訪問數(shù)組的元素。 例,例2 利用指針引用數(shù)組的方法求一個數(shù)組中所有元素之和,include void main() int a =2, 4, 6, 8, 10; int* pa=a;/ 或pa=,C+語言沒有提供字符串類型,字符串變量是作為一維字符數(shù)組來處理。 字符串末尾必須加上一個

21、字符串結束符“0”,但“0”不是字符串的有效字符,求字符串的長度時不能將它計算在內(nèi)。 對于字符串常量(用一對雙引號括起來的字符序列),C+編譯程序自動在字符串的末尾加上字符0,因此,可以直接用一個字符串常量來初始化一個字符數(shù)組。 例如 . .,2.3.5 字符串,例:字符串的初始化 char s =Hello; 初始化后,字符數(shù)組中每個元素的初始值如下: s0=H,s1=e, s2=l,s3=l, s4=o,s5=0。 該字符數(shù)組長度為6,但字符串長度為5,轉義字符“”的使用: 由于雙引號用作字符串的界限符,所以在字符串中必須以轉義字符“”表示雙引號。例如:Please enter good,

22、編譯器將這個字符串解釋為:Please enter good,通過指針使用字符串: 可以通過指針引用字符數(shù)組,即可以通過指針來使用字符串。初始化語句可寫為: char* ps=Hello; 例,例 輸入一個字符串,計算字符串的長度,include void main(void) char* pStr1=Enter a string:;/ 使用字符指針 char* pStr2=The length of string is:; char string100;/ 使用字符數(shù)組 coutstring;/ 輸入字符串 int length=0; while(stringlength!=0)/ 計算字符

23、串長度 length+; coutpStr2lengthn;/ 輸出結果,結構(structure)屬于構造類型,它是由多種類型的數(shù)據(jù)成分組成的數(shù)據(jù)類型。例如,一個職員的信息由ID號、姓名、性別、出生日期和工資等數(shù)據(jù)項組成,可采用結構類型來表示。 區(qū)別以前所介紹過的數(shù)據(jù)類型,結構的具體構成需要用戶自己定義,即定義一個結構類型。 結構中的每個數(shù)據(jù)項稱為成員,成員的類型可以是基本數(shù)據(jù)類型,也可以是一個諸如結構這樣的構造類型。 結構類型的定義形式,2.3.6 結構,結構類型定義的一般形式為: struct ; ; . . . . . . ; ; 例,下面定義職員結構類型: struct staffe

24、r intID; charname20; bool sex; float salary;,定義了結構(類型),就可以用結構聲明結構變量,結構變量的聲明形式如下: ; 例如 . .,例如,利用定義的職員結構staffer聲明一個職員結構變量: staffer employee1,注意: 不能在定義結構時對成員進行初始化,因為結構是一種數(shù)據(jù)類型,而不是一個變量。只有在聲明一個結構變量時才可以對該結構變量的成員進行初始化。如下所示: staffer employee1= 110105, LiMing, 1, 3809.80,結構變量是一種組合類型的變量,結構變量的引用包括整個變量的引用和其成員的引用

25、。 作為變量,整個結構變量可以進行賦值、作為函數(shù)參數(shù)和返回值。 結構變量成員的使用與同類型的普通變量完全一樣,但必須使用成員運算符“.”說明是哪一個結構變量的成員。結構成員引用的形式為: . 例如 . .,結構變量的引用,employee1=employee2;/ 引用整個結構變量 employee1.ID=110108;/ 引用結構成員 strcpy(, WangPing); / 結構成員,結構變量及其成員的引用,指向結構變量的指針: 結構變量的指針的聲明、賦值和使用規(guī)則同普通指針一樣??梢酝ㄟ^使用指向運算符“-”引用結構成員。引用的形式如下: - 例如 . .,

26、staffer* pStaff= / 引用結構成員,通過指向運算符“-”引用結構成員,include struct student/ 定義結構 charname20; intscore4; intaverage;,例 利用結構編程,計算一個學生4門課的平均分數(shù),void main(void) student stu;/ 聲明結構變量 int i, sum=0; ;/ 輸入姓名 coutstu.scorei;/ 輸入4門課分數(shù) for(i=0; i4; i+) sum+=stu.scorei;/ 計算平均分數(shù) stu.average=sum/4; coutThe aver

27、age score of is:stu.averagen; / 輸出結果,枚舉類型(enum)也是程序員定義的類型,它是一種允許用符號常量代表數(shù)據(jù)的數(shù)據(jù)類型。 在定義枚舉類型時必須指定一組被命名的符號常量的集合,該集合決定了該枚舉類型的變量可以具有的合法值。 枚舉類型定義的一般形式為: enum , , ; 枚舉常量是C+標識符,每一個枚舉常量對應一個整數(shù)值,第1個常量值為0,第2個常量值為1,依此類推。 使用舉例,2.3.7 枚舉,使用舉例,以下定義了一個表示顏色的枚舉類型: enum ColorRed, Green, Blue; 定義好的枚舉類型可作為數(shù)據(jù)類型用于聲明枚舉

28、型變量,例如: enum Color MyColor ; 聲明了枚舉型變量,就可以將定義枚舉類型時所列舉的枚舉常量集合中的任何一個常量賦值給枚舉型變量。例如: MyColor = Green; 在定義枚舉類型時,可以為枚舉常量指定其對應的整型值,例如: enum ColorRed = -1, Green, Blue =3,用typedef語句定義類型是指對原有的數(shù)據(jù)類型定義一個新的名稱,而不是真正定義一個新的數(shù)據(jù)類型。 typedef語句的使用形式為: typedef ; 其中的數(shù)據(jù)類型可以是簡單的數(shù)據(jù)類型,如int、float和char等,也可以是諸如結構、枚舉等組合數(shù)據(jù)類型。 使用type

29、def的目的有兩個:移植程序,增加程序的可讀性。 使用舉例,2.3.8 用typedef定義類型,typedef int INTEGER; typedef unsigned char BYTE; typedef struct tagDate int year; int month; int day; DATE; 新定義數(shù)據(jù)類型如INTEGER(一般用大小字母) 與int完全一樣,可以用它進行變量的聲明。如: INTEGER i,例如,2.4 控制語句,從結構化程序設計的觀點考慮問題,任何算法功能都可以通過三種流程控制結構來實現(xiàn)。為了實現(xiàn)復雜的算法功能,除了采用一般的按照源代碼編寫順序執(zhí)行程序的

30、順序結構,還需要采用另外兩種能夠控制語句執(zhí)行順序的控制結構:分支結構和循環(huán)結構。 分支結構是根據(jù)某個條件來決定執(zhí)行哪些源代碼,循環(huán)結構是根據(jù)某個條件來決定是否重復執(zhí)行一段源代碼。C+提供了多種不同形式的流程控制語句,包括if語句和switch語句,用于實現(xiàn)分支結構。 if 語句的一般形式: if() 如果表達式的值為真(非0),則執(zhí)行其中的語句(塊),否則跳過該語句,2.4.1 條件語句,if語句的另一種形式: if() else,if語句的嵌套形式,if() else if() else if() . . . . . . else if() else,例 輸入一個學生三門課的成績,計算其平均

31、值,并根據(jù)其值輸出評語,include void main() int math, chem, phy, ave; coutmathchemphy; ave=(math+chem+phy)/3.0+0.5; / 0.5用于四舍五入 if (ave=90) / 使用ifelse if語句 cout=60 運行. .,switch() case : break; case : break; . . . . . . case : break; default: ;,多分支結構switch語句的一般形式,switch語句使用說明,執(zhí)行switch語句時將其中表達式的值與一些常量進行比較,當某case語

32、句中的常量與該表達式的值相等時,就執(zhí)行該case語句后的語句(塊),直到遇到break語句或到達switch語句末尾時退出switch結構。 如果未出現(xiàn)相等的情況,則執(zhí)行default后的語句。default語句可缺省,此時如果未出現(xiàn)相等的情況則不執(zhí)行任何語句。 在switch語句中,表達式與常量的類型必須一致,且只能是字符型、整形或枚舉型,例 鍵盤輸入一個字符,判斷輸入的字符是數(shù)字、空格,還是其它字符,并給出相應的提示信息,include void main() char ch; coutch不能輸入空格 switch(ch) case 0: case 1: . . . . . . case

33、 9: coutIt is a digit.endl; break; case : coutIt is a space.endl; break; default: coutIt is not a digit or space.endl; 運行. .,循環(huán)結構在很大程度上簡化了順序結構程序設計,特別是在一段代碼執(zhí)行次數(shù)未知的情況下,只能采用循環(huán)結構。 循環(huán)語句:for語句、while語句、do-while語句 循環(huán)條件和循環(huán)體是循環(huán)語句所必備的組成部分,重復執(zhí)行的程序段稱為循環(huán)體,循環(huán)語句根據(jù)循環(huán)條件判斷是否執(zhí)行循環(huán)體,2.4.2 循環(huán)語句,1. for語句,for(;),表達式2是循環(huán)條件表達

34、式,其值為真時執(zhí)行循環(huán),為假時終止循環(huán)。 在進入for循環(huán)時,先對表達式l求值,然后對表達式2求值,如果表達式2的值為真,執(zhí)行循環(huán)體中的語句,最后對表達式3求值。每執(zhí)行一次循環(huán)后再對表達式2求值,以決定是否進行下次循環(huán)。 表達式l用于設置進入for循環(huán)時的初始狀態(tài),表達式3用于改變某些變量的值,以便使表達式2的值為假,最終使for循環(huán)結束,例 顯示一個攝氏溫度和華氏溫度的對照表,include void main( ) float degCel; int degFahr; for(degFahr=0; degFahr=300; degFahr+=10) / 從華氏零度到300度每隔10度顯示一

35、項 degCel=(5.0/9.0)*(degFahr-32.0); coutFahrenheit:degFahr ttCelsius:degCelendl; 運行. .,for語句的其他使用形式,在for循環(huán)后面的圓括號內(nèi)可以聲明變量,還可使用逗號表達式,如: for (int i=0, j=0; i100; i+, j+=5) coutij,組成for循環(huán)的表達式可以部分或全部省略掉。 int n= -1; for ( ; nn; 程序不斷讀入整數(shù),直到遇到一個大于零的整數(shù)為止,2. while語句,while() 表達式是循環(huán)條件表達式,為真時執(zhí)行循環(huán)體中的語句,為假時終止循環(huán),do w

36、hile(); do-while語句與while語句功能類似,只是循環(huán)條件的判斷是在循環(huán)語句的末尾進行。do-while語句的循環(huán)體至少執(zhí)行一次,3. do-while語句,例 利用while語句編程,要求用戶輸入字符Y或N,并給出對應的提示信息。如果輸入其它字符,程序顯示一條出錯信息,并要求用戶重新進行輸入,include main( ) char response; coutresponse; while (response !=Y 運行. .,作業(yè):P61-63,2-24,2-26 上機:2-47,2-48,2.5 函數(shù),當設計一個解決復雜問題的程序時,常常將一個復雜的任務分解為若干簡單

37、的子任務,為每一個子任務設計一個子程序。在C+中,利用函數(shù)實現(xiàn)子程序的編程。函數(shù)是一個具有獨立功能的程序模塊,這種功能一般是一種通用的功能,通過在不同程序中或程序不同地方調(diào)用函數(shù),可以反復使用一個函數(shù)所實現(xiàn)的功能。 如將求平方根、解一元二次方程等算法分別用一個函數(shù)來實現(xiàn),程序員就可以在程序中需要使用求解算法的地方直接調(diào)用已設計好的函數(shù),2.5.1 函數(shù)定義、函數(shù)調(diào)用和函數(shù)聲明,1. 函數(shù)定義: 編寫一個實現(xiàn)特定功能的函數(shù)代碼就稱為函數(shù)定義。函數(shù)定義的一般形式是,() 函數(shù)的組成: 函數(shù)類型、函數(shù)名、形參表、函數(shù)體,函數(shù)類型: 函數(shù)頭中的數(shù)據(jù)類型稱為函數(shù)類型,它規(guī)定了所定義函數(shù)返回值的類型。 如

38、果函數(shù)沒有返回值,則函數(shù)類型應指定為void類型。如果不指定函數(shù)類型,則其默認類型為int型,形參表: 函數(shù)定義中的形參表是一個用逗號分隔的變量聲明列表,這些變量稱作函數(shù)的形參,它們用于接收調(diào)用函數(shù)時傳遞的參數(shù)值。 形參表可以為空。 函數(shù)定義舉例,例 以下函數(shù)sum()用于求兩個形參x與y的和,int sum(int x , int y) int temp; temp=x+y; return temp;/ 將temp返回給主調(diào)函數(shù),注意: C+不允許嵌套定義函數(shù),即將一個函數(shù)定義放在另一個函數(shù)的函數(shù)體內(nèi),2. 函數(shù)調(diào)用: 使用一個已定義的函數(shù)稱為函數(shù)調(diào)用。調(diào)用某個函數(shù)的函數(shù)稱為該函數(shù)的主調(diào)函數(shù)

39、,被調(diào)用的函數(shù)簡稱為被調(diào)函數(shù),函數(shù)定義后便可以反復多次調(diào)用,每次調(diào)用通過不同的參數(shù)值(實參)可以處理不同的數(shù)據(jù)函數(shù)調(diào)用的一般形式為: (實參1,實參2,實參n) 例如: c=sum (a, b); 功能:將實參a和b相加,其和放于c中,函數(shù)調(diào)用時的執(zhí)行流程: 當出現(xiàn)函數(shù)調(diào)用語句時,中斷當前函數(shù)(主調(diào)函數(shù))的執(zhí)行,將程序的執(zhí)行流程轉移到被調(diào)用函數(shù),并將實參傳遞給形參。實參是一個實際的參數(shù)值,它可以是常量、變量或表達式,參數(shù)傳遞方式: 值傳遞:單向 按地址傳遞:雙向 引用傳遞:雙向,例 實參與形參的值傳遞。調(diào)用函數(shù)后,實參a、b的值并沒有發(fā)生改變,include void swap(int x,

40、int y)/ 函數(shù)定義 cout x=x y=yendl; int temp=x;/ 交換形參x和y x=y; y=temp; coutafter swap:endl; cout x=x y=yendl;,main() int a=20, b=40; coutbefore swap:endl; cout a=a b=bendl; swap(a, b);/ 函數(shù)調(diào)用 cout a=a b=bendl;,程序的輸出結果為: before swap: a=20 b=40 x=20 y=40 after swap: x=40 y=20 a=20 b=40,按地址傳遞參數(shù),如果希望通過被調(diào)函數(shù)改變主調(diào)

41、函數(shù)中實參的值,可以采用“按地址傳遞”或“引用傳遞”兩種方式。 當采用按地址傳遞方式時,函數(shù)定義以指針(包括數(shù)組)作為函數(shù)的形參,函數(shù)調(diào)用的實參必須是指針變量或一般類型變量的地址(包括數(shù)組名)。 例,例 實參與形參按地址傳遞,以指針作為函數(shù)參數(shù),include void swap(int*, int*);/ 函數(shù)聲明 main( ) int a=20, b=40; swap(,運行結果:a=40,b=20,3. 函數(shù)聲明,C+允許函數(shù)調(diào)用在前,函數(shù)定義在后,但此時要求在調(diào)用函數(shù)前必須先進行函數(shù)聲明,以便告訴編譯程序被調(diào)用函數(shù)的類型和參數(shù)類型。 函數(shù)聲明的一般形式為: (形參表,例如: 只列出參

42、數(shù)類型: void swap(int*, int*); 列出參數(shù)類型和參數(shù)名: void swap(int* px, int* py,函數(shù)的存儲類型,與變量類似,函數(shù)也具有存儲類型。 函數(shù)被分為內(nèi)部函數(shù)(static)和外部函數(shù)(extern,默認值),內(nèi)部函數(shù)只能被同一個源文件中的函數(shù)調(diào)用,而外部函數(shù)可以被其它源文件中的函數(shù)調(diào)用。 調(diào)用外部函數(shù)前必須先進行外部函數(shù)聲明,例如:在源文件File1.cpp中定義函數(shù)YourFun(),而在源文件File2.cpp中調(diào)用函數(shù)YourFun(,File1.cpp源文件: int YourFun(int x , int y) / 默認為外部函數(shù) int

43、 temp; temp=x+y; return temp;,File2.cpp源文件: #include /外部函數(shù)聲明,可省略extern extern int YourFun(int, int); main() int sum, a=20, b=40; sum=YourFun(a, b); coutsum=sum endl;,通??蓪⑺型獠亢瘮?shù)的聲明放在一個頭文件中,然后用 #include 指令包含頭文件,2.5.2 函數(shù)參數(shù)的默認值,1. 什么是函數(shù)參數(shù)的默認值(缺省值): C+允許在函數(shù)聲明或函數(shù)定義時為形參指定一個默認值。在調(diào)用此類含默認值形參的函數(shù)時,如果形參有對應的實參,則將

44、實參傳遞給形參;如果省略了實參,則將上述默認值傳遞給形參,例如,下面聲明一個帶缺省值參數(shù)的函數(shù): void MyFun(int val=10); 而如果函數(shù)調(diào)用省略實參,則把缺省值10傳遞給形參,如下所示: MyFun();/ 等同于MyFun(10,2. 含有多個函數(shù)參數(shù)的默認值,如果函數(shù)有多個形參,則聲明和定義函數(shù)時,必須將帶缺省值的形參放在參數(shù)表的右部,即在帶缺省值的形參的右邊不能有未指定缺省值的形參。例如: void fun1(int w, int x=1, int y=1, int z=1); / 正確的函數(shù)聲明 void fun2(int w=1, int x=2, int y=3

45、, int z); / 錯誤的函數(shù)聲明 void fun3(int w=1, int x=2, int y, int z=3); / 錯誤的函數(shù)聲明,3. 含有多個參數(shù)默認值的函數(shù)調(diào)用,當編譯器將實參與形參相聯(lián)系時,其順序是從左到右,如果只省略前面的實參,編譯器將無法區(qū)分隨后的實參與哪個形參相對應。因此,在調(diào)用函數(shù)時,如果省略某個實參,則該實參右邊的所有實參都必須省略。 例如: fun1(10, 3); / 等同于fun1(10, 3, 1, 1); fun1(10, 3, 5); / 等同于fun1(10, 3, 5, 1); fun1(10, , 5);/ 錯誤的函數(shù)調(diào)用,2.5.3 內(nèi)聯(lián)

46、函數(shù),在調(diào)用函數(shù)時,系統(tǒng)要進行現(xiàn)場處理工作,需要占用附加的現(xiàn)場處理時間。若把函數(shù)體直接嵌入函數(shù)調(diào)用處,則可消除附加的現(xiàn)場處理的時間開銷,提高程序的運行效率。 C+提供了實現(xiàn)上述嵌入功能的函數(shù),這種函數(shù)稱為內(nèi)聯(lián)(inline)函數(shù)。 定義一個內(nèi)聯(lián)函數(shù)只需在函數(shù)頭前加入關鍵字inline。當編譯程序遇到內(nèi)聯(lián)函數(shù)調(diào)用語句時,需要將該內(nèi)聯(lián)函數(shù)的函數(shù)體替換調(diào)用語句。當然,這樣將會加大代碼占用內(nèi)存的空間開銷,因此,內(nèi)聯(lián)函數(shù)一般適用于代碼較短的函數(shù)。 例,例 將函數(shù)sum()改為內(nèi)聯(lián)函數(shù)。 inline int sum(int x , int y) int temp; temp=x+y; return te

47、mp;,2.5.4 引用,引用(reference)是為一個已聲明的變量起一個別名。聲明一個引用時需要在其名稱前加符號“ int,運行結果: i=11,r=11 i=88,r=88,引用作為函數(shù)參數(shù),引用作為一般變量使用幾乎沒有什么意義,它的最大用處莫過于將其作為函數(shù)參數(shù)。在前面學習了按值傳遞和按地址傳遞兩種參數(shù)傳遞方式,而引用傳遞與按地址傳遞在功能上很相象,可以在被調(diào)函數(shù)中通過改變形參來改變主調(diào)函數(shù)中的實參,但引用傳遞比按地址傳遞更簡捷直觀,也更好理解。 采用引用傳遞方式,只需在函數(shù)定義時使用引用作為形參,在函數(shù)調(diào)用時直接使用一般變量作為實參,當引用被用作函數(shù)參數(shù)時,被調(diào)函數(shù)任何對引用的修改

48、都將影響主調(diào)函數(shù)中的實參,被調(diào)函數(shù)對引用的操作即是通過實參的別名對實參進行操作,例 引用作為參數(shù),include void swap(int,void swap(int,程序運行結果: a=40,b=20,問題: 如果形參使用簡單變量, 輸出結果如何,2.6 變量的作用域與存儲類型,變量的作用域是指變量的可以被引用的區(qū)域,變量的生存期是指變量的生命周期,變量的作用域與生存期是密切相關的。 C+程序中的變量有兩種屬性:數(shù)據(jù)類型和存儲類型,進行完整的變量聲明,除了聲明其數(shù)據(jù)類型,有時還需要聲明其存儲類型。 存儲類型說明了變量在內(nèi)存中存儲的方式,它決定了變量的作用域和生存期,2.6.1 作用域和生存

49、期,變量的作用域決定了變量的可見性,說明變量在程序哪個區(qū)域可用,即程序中哪些區(qū)域的語句可以使用變量。 作用域有三種:局部作用域、全局作用域和文件作用域。 具有局部作用域的變量稱為局部變量,它們聲明在函數(shù)(包括main)的內(nèi)部,又稱為內(nèi)部變量。其作用域在函數(shù)結束時結束。 具有全局作用域和文件作用域的變量稱為全局變量,它們聲明在函數(shù)的外部,其作用域在程序源文件結束處結束,例 局部變量(包括塊內(nèi)聲明的變量)和函數(shù)的形參具有局部作用域,void Myfun(int x) / 形參x的作用域開始于此 int y=3; / 局部變量y的作用域開始于此 int z=x+y;/ 塊內(nèi)局部變量z的作用域開始于此

50、, / x和y在該語句塊內(nèi)可用 . . . . . . / 局部變量k的作用域不包含該塊 / 局部變量z的作用域結束 int k; / 局部變量k的作用域開始于此 . . . . . . / 局部變量y、k和形參x的作用域結束,例 具有全局作用域的全局變量,. . . . . int x=1; / 全局變量x的作用域開始于此, / 結束于整個程序源文件 void Myfun() . . . . . . . . . . .,注意: 在同一作用域內(nèi)聲明的變量不能同名; 不同作用域聲明的變量可以同名,作用域與生存期的區(qū)別與關系,變量的作用域是指一個范圍,是指變量在源程序中的一段靜態(tài)區(qū)域,作用域是從代

51、碼空間的角度考慮問題。 變量的生存期是從時間的角度考慮問題,是指在程序執(zhí)行的過程中一個變量從創(chuàng)建到被撤消的一段動態(tài)時間。當系統(tǒng)為變量分配內(nèi)存空間后,變量即開始處于生存期,當變量所占用的內(nèi)存空間被釋放,這個變量即結束了生存期。 變量的生存期與作用域是密切相關的,一般變量只有在生存后才能可見(在作用域內(nèi))。 有些變量(如函數(shù)參數(shù))沒有生存期,但有作用域,而有時變量雖然在生存期,但卻不在作用域內(nèi),例 局部變量的生存期和作用域void Myfun() int x=1; int x(2), y(2);/ 變量“x=1”失去作用域cout“x=”xn;FuncA(); / 變量x和y在調(diào)用函數(shù)時失去作用域

52、,第一個聲明的局部變量x在語句塊內(nèi)雖然存在,但卻是不可見(不可用)的,因為它被語句塊內(nèi)同名的局部變量x所屏蔽了。局部變量x和y在語句塊內(nèi)雖然存在,但在進入函數(shù)FuncA()后也是不可見的,2.6.2 存儲類型,程序運行時,系統(tǒng)為不同存儲屬性的變量分配不同類型的內(nèi)存空間,決定了變量的作用域和生存期。變量有以下三種內(nèi)存分配方式:靜態(tài)分配、自動分配和動態(tài)分配。 系統(tǒng)為每個程序開辟一個固定的靜態(tài)存儲區(qū),靜態(tài)分配是指在這個固定區(qū)域為變量分配內(nèi)存空間。對于靜態(tài)分配內(nèi)存的變量,在編譯時就分配了內(nèi)存地址(相對地址),在程序開始執(zhí)行時變量就占用內(nèi)存,直到程序結束時變量才釋放內(nèi)存。全局變量就是靜態(tài)分配方式的變量,

53、程序運行后,系統(tǒng)將為程序開辟一塊稱為棧的活動存儲區(qū)。自動分配是指在棧中為變量臨時分配內(nèi)存空間。對于自動分配內(nèi)存的變量,程序運行后,在變量作用域開始時由系統(tǒng)自動為變量分配內(nèi)存,在作用域結束后即釋放內(nèi)存。一般方式聲明的局部變量就是自動分配方式的變量。 動態(tài)分配是指利用一個被稱為堆的內(nèi)存塊為變量分配內(nèi)存空間,堆使用了靜態(tài)存儲區(qū)和棧之外的部分內(nèi)存。動態(tài)分配是一種完全由程序本身控制內(nèi)存的使用的分配方式。對于動態(tài)分配內(nèi)存空間的變量,程序運行后,利用new運算符分配內(nèi)存,利用delete運算符或程序結束運行釋放內(nèi)存,對于非動態(tài)分配內(nèi)存的變量,決定變量采用哪種內(nèi)存分配方式,是由聲明變量時指定的存儲類型和變量聲

54、明語句的位置所決定的。 變量的存儲類型有以下四種:auto、register、extern和static。在聲明變量時可以指定變量的存儲類型,其一般形式為:,存儲類型決定內(nèi)存分配方式,例如: auto int a ;/ a為自動存儲類型 static float b, c ; / b和c為靜態(tài)存儲類型,auto和register用于聲明內(nèi)部變量,auto變量存儲在棧中,register變量存儲寄存器中。 extern用于聲明外部變量,static用于聲明內(nèi)部變量或外部變量,extern變量和static變量是存儲在靜態(tài)存儲區(qū)中。 當聲明變量時未指定存儲類型,則內(nèi)部變量的存儲類型隱含為auto類

55、型,外部變量的存儲類型隱含為extern類型,說明,例如: auto int a ;/ 變量a存儲在棧中 static float b, c ; / b和c存儲在靜態(tài)存儲區(qū),外部變量的聲明分為定義性聲明和引用性聲明。定義性聲明表示變量需要分配內(nèi)存;引用性聲明表示要引用的變量已在程序源文件中其它地方進行過定義性聲明。 定義性聲明只能放在函數(shù)的外部,引用性聲明可放在函數(shù)的外部,也可放在函數(shù)的內(nèi)部。 extern修飾符主要用于外部變量的引用性聲明,外部變量的定義性聲明可以不加extern修飾符。 進行外部變量的extern引用性聲明時一般不能進行初始化,除非定義性聲明該外部變量時沒有進行初始化。 例

56、,外部變量的聲明,. . . . . extern int b;/ 引用性聲明。 void fun() coutb; / 輸出5 extern int b=5; / 定義性聲明,可省略extern . . . . .,例 外部變量的使用出現(xiàn)在定義性聲明之前需要先進行變量的引用性聲明,聲明變量時使用static修飾符的變量是靜態(tài)變量。 靜態(tài)變量可以是全局變量,也可以是局部變量,但都具有全局的生存壽命,即其生存期從程序啟動時開始直到程序結束時才終止。這種存儲類型的變量雖然只在其作用域內(nèi)可以使用,但它一直存在,靜態(tài)變量,include void fun() / 靜態(tài)變量a是局部變量,但具有全局的生存

57、期 static int a=5; a+; couta= a endl; void main () for ( int i =0 ; i 2; i + ) fun();,例 靜態(tài)局部變量的使用,程序輸出: a=6 a=7,問題: 如果a不是靜態(tài)變量, 結果如何,作業(yè):P61-65,2-39(1),2-82(上機),2-85,2.6.3 作用域限定符,我們知道,如果局部變量和全局變量同名,在局部作用域內(nèi)只有局部變量才起作用。在C+中可通過使用作用域限定符:來標識同名的全局變量,int amount=123;/ 全局變量 void main() int amount=456;/ 局部變量 cout

58、:amount,;/ 輸出全局變量 coutamount,; / 輸出局部變量 :amount=789;/ 訪問全局變量 cout:amount,;/ 輸出全局變量 coutamountn; / 輸出局部變量,程序輸出:123,456,789,456,2.6.4 動態(tài)內(nèi)存分配,對于程序中一般聲明的變量,其所占內(nèi)存空間不需要程序員管理,編譯器在編譯階段就自動將管理這些空間的代碼加入到目標文件中。程序運行后由系統(tǒng)自動為變量分配內(nèi)存空間,在作用域結束后釋放內(nèi)存空間,有時程序只能在運行時才能確定需要多少內(nèi)存空間來存儲數(shù)據(jù),這時程序員就需要采用動態(tài)內(nèi)存分配的方法設計程序。動態(tài)內(nèi)存分配是指在程序運行時為程

59、序中的變量分配內(nèi)存空間,它完全由應用程序自己進行內(nèi)存的分配和釋放。動態(tài)內(nèi)存分配是在一些被稱為堆的內(nèi)存塊中為變量分配內(nèi)存空間,動態(tài)內(nèi)存分配方法,在C中動態(tài)內(nèi)存分配是通過調(diào)用標準庫函數(shù)malloc()和free()實現(xiàn)的。在C+中最常用的方法是利用new和delete運算符進行動態(tài)內(nèi)存的分配和釋放,使用這種方法能夠檢測內(nèi)存漏洞,運算符new的使用形式: p = new size ; type是數(shù)據(jù)類型,表示要為哪種數(shù)據(jù)類型的變量分配空間;size表示要為多少個變量分配空間,可以省略size(缺省值為1);p是一個type類型的指針變量,指向所分配的存儲單元,例,使用new運算符的例子,為一個整型變

60、量(其指針為pNum)分配內(nèi)存空間: int* pNum=new int; 為一個單精度變量(其指針為px)分配內(nèi)存空間: float* px=new float; 為一個字符串分配內(nèi)存空間: char* pBuffer=new char256; 為一個整型數(shù)組(動態(tài)數(shù)組)分配內(nèi)存空間: int* pa=new int100; 分配內(nèi)存的同時進行初始化: pi=new int(555); / 區(qū)別:pi = new int555,內(nèi)存空間的釋放,運算符delete用于釋放new運算符所分配的內(nèi)存空間,其一般使用形式為: delete p ; 如果要釋放一個動態(tài)數(shù)組所占用的內(nèi)存空間,采用如下形式

溫馨提示

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

評論

0/150

提交評論