學(xué)習(xí)工控軟件chap_第1頁
學(xué)習(xí)工控軟件chap_第2頁
學(xué)習(xí)工控軟件chap_第3頁
學(xué)習(xí)工控軟件chap_第4頁
學(xué)習(xí)工控軟件chap_第5頁
已閱讀5頁,還剩117頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1第1章

基本C++語言1.1C++程序結(jié)構(gòu)

1.2數(shù)據(jù)類型和基本輸入輸出

1.3運算符和表達(dá)式

1.4基本語句

1.5函數(shù)和預(yù)處理

1.6數(shù)組1.7指針和引用1.8字符指針和字符串處理1.9結(jié)構(gòu)、共用和自定義21.1.2C++程序創(chuàng)建1.1C++程序結(jié)構(gòu)3C++程序的基本組成:[例Ex_Simple1]一個簡單的C++程序#include<iostream.h>/*C++程序的基本結(jié)構(gòu)*/voidmain(){ doubler,area; //聲明變量 cout<<"輸入圓的半徑:"; //顯示提示信息 cin>>r; //從鍵盤上輸入變量r的值 area=3.14159*r*r; //計算面積 cout<<"圓的面積為:"<<area<<"\n";//輸出面積}1.1C++程序結(jié)構(gòu)預(yù)處理命令:以“#”開頭函數(shù){函數(shù)體}注釋://或/**/

縮進4C++程序的書寫風(fēng)格

標(biāo)識符命名

(1)

合法性:大小寫字母、數(shù)字字符、下劃

線;首字符為字母或下劃線。(2)

有效性:長度最好不超過32個。 (3)

易讀性:“見名知意”。(4)不能用已有的關(guān)鍵字注意:C++中區(qū)分大小寫,data與Data不同1.1C++程序結(jié)構(gòu)5程序編譯過程1.1C++程序結(jié)構(gòu).cpp源文件編譯器.obj目標(biāo)文件連接器.exe可執(zhí)行文件函數(shù)庫文件61.2數(shù)據(jù)類型和基本輸入/輸出基本數(shù)據(jù)類型數(shù)據(jù)類型構(gòu)

型字符型單字符型char寬字符型wchar_t整型int實

型單精度float雙精度double邏輯型bool空值型void派生類型復(fù)合類型指針type*引用type&數(shù)組type[]結(jié)構(gòu)體struct共用體union枚舉enum類class71.2.1基本數(shù)據(jù)類型說明:(1)long和short字節(jié)不同(shortint2字節(jié),longint4字節(jié)),short只能修飾int,long只能修飾int和double。

(2)相同基本數(shù)據(jù)類型的signed和unsigned的數(shù)值范圍是不同。(3)signed和unsigned只能修飾char和int。

缺省是有符號signed的。

1.2

數(shù)據(jù)類型和基本輸入/輸出81.2.2常量

整型常量:十進制、八進制(045)、十六進制(0x7B)

注意:

長整型(long)--以L或小寫字母l結(jié)尾(496L)。

無符號型(unsigned)--以U或u作為結(jié)尾(100ul)。

實數(shù)常量(浮點數(shù))

(1)

十進制數(shù)形式:整數(shù)+小數(shù) (2)

指數(shù)形式:科學(xué)表示法(1.2e9)。1.2數(shù)據(jù)類型和基本輸入/輸出9字符常量:以ASCII碼值來存儲

--’a’,‘%’--轉(zhuǎn)義序列符‘\n’字符串常量:包含字符、空格、其他字符(漢字)

如:“Pleasepress\”F1\”tohelp!”※區(qū)分字符常量和字符串常量:(1)字符串末尾還有個‘\0’字符。

(2)字符常量可以參與運算;字符串常量不能。例:

intb=‘a(chǎn)’+3;//b為100,‘a(chǎn)’=971.2數(shù)據(jù)類型和基本輸入/輸出101.2.3變量三要素:變量名、變量的類型、變量的數(shù)值

變量的定義:“先定義后使用”<類型><變量名>;變量的初始化

例:intnNum1=3;intnX(1);1.2數(shù)據(jù)類型和基本輸入/輸出告訴系統(tǒng)開辟多少存儲空間111.2.4標(biāo)識符常量:用標(biāo)識符代替常量

作用:可讀性高、防止出錯、易修改書寫:標(biāo)識符大寫1.const只讀變量

程序不能修改變量,定義時必須初始化2.#define標(biāo)識符常量

系統(tǒng)編譯時用標(biāo)識符后面的內(nèi)容直接代替標(biāo)識符,不作語法檢查#defineNMAX(30+50)1.2

數(shù)據(jù)類型和基本輸入/輸出12[例]

#include<iostream.h>

constdoublePI=3.14159265;

#definePI3.14159265voidmain() { doubler=100.0,area; area=PI*r*r; cout<<"圓的面積是:"<<area<<"\n";}

1.2數(shù)據(jù)類型和基本輸入/輸出131.2.5枚舉類型枚舉:是一系列的有標(biāo)識名的整型常量的集合定義:enum<枚舉類型名>{<枚舉常量表>}[枚舉變量];例如:enumDays{Sun,Mon,Tue,Wed,Thu,Fri,Sat}today;

默認(rèn)時,系統(tǒng)為每一個枚舉常量都對應(yīng)一個整數(shù),并從0開始,逐個增1。這些默認(rèn)的值也可重新指定,例如:enumColors{Black,Blue,Green=4,Cyan,Red=8,Yellow,White};則各枚舉常量對應(yīng)的整數(shù)依次為0,1,4,5,8,9,10。1.2數(shù)據(jù)類型和基本輸入/輸出141.2.5枚舉類型枚舉變量最終的值只能等于該枚舉類型中的某個枚舉常量,而不能用一個整型數(shù)值直接賦值。例如:today=Mon; //合法,值為1tomorrow=today; //合法,值為1yesterday=3; //不合法,不能直接賦值注意:不要在定義枚舉類型的同時,再對枚舉常量、枚舉變量及枚舉類型名重新定義。例如下列的定義是不合法的:enumDays{Sun,Mon,Tue,Wed,Thu,Fri,Sat}today;int Mon;inttoday;1.2

數(shù)據(jù)類型和基本輸入/輸出151.2.6基本輸入輸出輸入流(cin):獲得多個鍵盤的輸入值

格式:cin>><表達(dá)式1>[>><表達(dá)式2>...]

例:intnNum1,nNum2,nNum3;cin>>nNum1>>nNum2>>nNum3;

注意數(shù)值輸入格式:

129 20

12

9

20

1.2數(shù)據(jù)類型和基本輸入/輸出提取運算符16輸出流(cout):

可以輸出一個整數(shù)、實數(shù)、字符及字符串

例:cout<<“t=”<<t<<endl;[例Ex_Cout]cout的輸出及endl算子#include<iostream.h>intmain(){intt=0;cout<<“ABCD\t”<<1234<<t<<endl; return0;}1.2

數(shù)據(jù)類型和基本輸入/輸出插入運算符相當(dāng)于\n,換行17注意:cout首先將數(shù)據(jù)從右到左入棧,如果數(shù)據(jù)為函數(shù),則先進行計算,然后入棧出棧的時候遵循“先入后出”的原則即:對于cout<<f(a)<<f(b)<<f(c)<<endl;

先入棧endl,然后執(zhí)行最右邊的函數(shù)體f(c),將計算結(jié)果入棧,接著計算f(b),

所有數(shù)據(jù)入棧后,從上往下輸出,所以先輸出f(a),然后是f(b),接著輸出f(c),最后輸出endl。

1.2數(shù)據(jù)類型和基本輸入/輸出18格式算子oct、dec和hex

將輸入或輸出的數(shù)值轉(zhuǎn)換成八進制、十進制及十六進制.[例Ex_Algorism]

格式算子的使用。#include<iostream.h>voidmain(){int nNum;cout<<"PleaseinputaHexinteger:";cin>>hex>>nNum;cout<<"Oct\t"<<oct<<nNum<<endl;cout<<"Dec\t"<<dec<<nNum<<endl;cout<<"Hex\t"<<hex<<nNum<<endl;}1.2數(shù)據(jù)類型和基本輸入/輸出191.3.1算術(shù)運算符

+(正)、-(負(fù))、*、/、%、+、-說明:(1)

除法運算:整數(shù),浮點數(shù),除數(shù)不為0 (2)

求余運算:

要求兩個操作數(shù)都是整型

例如40%11的結(jié)果是7。40%-11結(jié)果是7。

(3)

優(yōu)先級:(+(正)、-(負(fù)))>(*、/、%)>(+、-)

結(jié)合性:算術(shù)運算符中除單目外,均為從左至右1.3運算符和表達(dá)式201.3.2賦值運算符

1.復(fù)合賦值運算符:+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=注意:(1)復(fù)合賦值運算符之間不能有空格(2)結(jié)合性:從右至左例如:a*=b-4/c+d;等效于a=a*(b-4/c+d);而不等效于a=a*b-4/c+d;1.3運算符和表達(dá)式211.3.2賦值運算符

2.多重賦值:一個賦值表達(dá)式中出現(xiàn)兩個或更多的賦值符例如:nNum1=nNum2=nNum3=100;賦值符的結(jié)合性:從右至左例如:a=7+(b=8) (a=15,b=8)a=(c=7)+(b=8) (b=8,c=7,a=15)1.3運算符和表達(dá)式221.3.3數(shù)據(jù)類型轉(zhuǎn)換

1.自動轉(zhuǎn)換:數(shù)據(jù)類型從低到高的順序例如:10+‘a(chǎn)’+2*1.25的運算次序:(1)2和1.25都轉(zhuǎn)換成double型,結(jié)果為double型的2.5。(2)

將‘a(chǎn)’轉(zhuǎn)換成整數(shù)97,運算結(jié)果為107。(3)

整數(shù)107和2.5相加,先將整數(shù)107轉(zhuǎn)換成double型,結(jié)果為double型,值為109.5。1.3運算符和表達(dá)式231.3.3數(shù)據(jù)類型轉(zhuǎn)換

2.強制轉(zhuǎn)換:指定數(shù)據(jù)類型來改變類型轉(zhuǎn)換順序格式:(<類型名>)<表達(dá)式>或<類型名>(<表達(dá)式>)例如:doublef=3.56; intnNum;nNum=(int)f;或者nNum=int(f);都是將使nNum的值變?yōu)?。1.3運算符和表達(dá)式241.3.4關(guān)系運算符(trueorfalse)<,<=,>,>=,==,!=優(yōu)先級:前4種>后兩種。例如:a==b>c 等效于a==(b>c)關(guān)系運算符的優(yōu)先級低于算術(shù)運算符。例如:b<c*4 等效于b<(c*4)1.3運算符和表達(dá)式251.3.5邏輯運算符!、&&、||優(yōu)先級:!>算術(shù)運算符>關(guān)系運算符>&&>||1.3.6位運算符~ (按位求反,單目運算符)<< (左移,雙目,低位補0,高位舍棄)>> (右移,雙目,低位舍棄,高位補0或符號位)& (按位與,雙目)^ (按位異或,雙目)| (按位或,雙目)1.3運算符和表達(dá)式261.3.7三目運算符

條件運算符:<條件表達(dá)式>?<表達(dá)式1>:<表達(dá)式2>例如:nNum=(a>b)?10:8;注意:只有在表達(dá)式2后面才能出現(xiàn)分號結(jié)束符1.3運算符和表達(dá)式271.3.8sizeof運算符作用:返回操作數(shù)所占的內(nèi)存空間大小(字節(jié)數(shù))格式:sizeof(<表達(dá)式>)或sizeof(<數(shù)據(jù)類型>)例如:sizeof(“Hello”) //結(jié)果為6sizeof(int) //16位機是2,32位機是41.3運算符和表達(dá)式281.3.9逗號運算符

優(yōu)先級最低的運算符計算順序:從左至右,表達(dá)式的最終結(jié)果是最后計算的那個表達(dá)式的類型和值例如:j=(i=12,i+8);//j=20再如:d=(a=1,b=a+2,c=b+3);//d=61.3運算符和表達(dá)式291.3.10自增和自減運算符前綴運算符:i++;或++i;后綴運算符:i--;或--i;例如:a=5;b=++a-1; //相當(dāng)于a=a+1;b=a–1;a=5;b=a++-1; //相當(dāng)于b=a–1;a=a+1;1.3運算符和表達(dá)式301.4.1空語句和塊塊(復(fù)合語句):{…..}注意:復(fù)合語句中定義的變量只作用于該復(fù)合語句范圍例:#include <iostream.h>voidmain(){ inti=5,j=6; cout<<i<<j<<endl; //輸出:5和6 { inti=2,j=3,k=4; cout<<i<<j<<k<<endl; //輸出:2、3、4}cout<<i<<j<<endl; //輸出:5和6,如cout<<k;錯誤}1.4基本語句311.4.2選擇結(jié)構(gòu)語句1.條件語句形式:if(<表達(dá)式>) <語句1>[else <語句2>]注意:(1)如果在if、esle后有多條語句,必須用{}括起來,否則只有后面的第一條語句有效。

(2)if語句可嵌套。

(3)else總是和其前面最近的if配套的。1.4基本語句32[例Ex_Compare]輸入兩個整數(shù),比較兩者的大小#include<iostream.h>voidmain(){ intnNum1,nNum2;cout<<"Pleaseinputtwointegernumbers:";cin>>nNum1>>nNum2;if(nNum1!=nNum2){ if(nNum1>nNum2) cout<<nNum1<<">"<<nNum2<<endl; elsecout<<nNum1<<"<"<<nNum2<<endl;}else cout<<nNum1<<"="<<nNum2<<endl;}1.4基本語句332.開關(guān)語句形式:switch(<表達(dá)式>){case<常量表達(dá)式1> :[語句1]case<常量表達(dá)式2> :[語句2]...case<常量表達(dá)式n> :[語句n] [default :語句n+1]}若表達(dá)式滿足某條件,則執(zhí)行“:”后的所有語句,直到break。1.4基本語句34[例Ex_Switch]根據(jù)成績的等級輸出相應(yīng)的分?jǐn)?shù)段#include<iostream.h>voidmain(){ charchGrade; cout<<"Pleaseinputachar(A~E):"; cin>>chGrade; switch(chGrade) { case'A': case'a':cout<<"90--100"<<endl; break; case'B': case'b':cout<<"80--89"<<endl; break;1.4基本語句case'C':case'c': cout<<"70--79"<<endl;break;case'D':case'd': cout<<"60--69"<<endl;break;case'E':case'e': cout<<"<60"<<endl;break;default: cout<<"error!"<<endl; }}35說明:1.多個case可以共用一組執(zhí)行語句2.若一個case之后的語句是復(fù)合語句可以不用{}3.每一個case后的常量表達(dá)式必須互不相同,否則編譯出錯1.4基本語句361.4.3循環(huán)結(jié)構(gòu)語句1.while循環(huán)語句 while(<表達(dá)式>) {<語句>}2.do...while循環(huán)語句 do{<語句>}while(<表達(dá)式>)

3.for循環(huán)語句 for([表達(dá)式1];[表達(dá)式2];[表達(dá)式3]){

<語句>}1.4基本語句37例:求整數(shù)1~50之和#include<iostream.h>voidmain(){ intnNum=1,nTotal=0;do{ nTotal+=nNum;nNum++;}while(nNum<=50)}或

voidmain(){ intnNum,nTotal=0;for(nNum=1;nNum<=50;nNum++) nTotal+=nNum;}1.4基本語句381.4.4break和continue語句break:跳出循環(huán)結(jié)構(gòu)或switch結(jié)構(gòu)continue:結(jié)束本次循環(huán)例:統(tǒng)計100以內(nèi)能被7整除的數(shù)的個數(shù)voidmain(){intn=0;

for(inti=1;i<=100;i++){ if(i%7!=0)continue; n++;}}1.4

基本語句391.5.1函數(shù)的定義和調(diào)用1.

函數(shù)的定義 <函數(shù)類型><函數(shù)名>(<形式參數(shù)表>) { <若干語句> //函數(shù)體

}說明:1.僅當(dāng)函數(shù)被調(diào)用時,才會給形參分配內(nèi)存單元,調(diào)用結(jié)束后,內(nèi)存單元被釋放2.若函數(shù)類型不為void,需用return返回值,return后可以是常量、變量、表達(dá)式。1.5

函數(shù)和預(yù)處理調(diào)用此函數(shù)需要的參數(shù)個數(shù)和類型默認(rèn)為int不可省略401.5.1函數(shù)的定義和調(diào)用2.函數(shù)的調(diào)用<函數(shù)名>(<實際參數(shù)表>);例如:inta[5]={7,9,6,3,4};sum(a[0],6);或sum(a[0]*a[1],a[2]+a[3]);注意:實參與形參的個數(shù)相等,類型一致,順序?qū)?yīng)。調(diào)用一個函數(shù)的方式:

intc=2*sum(4,5);

1.5

函數(shù)和預(yù)處理實際調(diào)用函數(shù)時所給定的常量、變量或表達(dá)式,且必須有確定的值411.5.1函數(shù)的定義和調(diào)用3.函數(shù)的聲明

若函數(shù)調(diào)用在函數(shù)定義之前,需進行函數(shù)聲明。

<函數(shù)類型><函數(shù)名>(<形式參數(shù)表>);

例如對于sum()函數(shù)的聲明: intsum(intx,inty); 和intsum(int,int);等價1.5

函數(shù)和預(yù)處理42[例Ex_Call]函數(shù)的調(diào)用#include<iostream.h>voidprintline(charch,intn){ for(inti=0;i<n;i++) cout<<ch; cout<<endl;}intmain(){ introw=5; for(inti=0;i<row;i++) printline(‘*’,i+1); return0;}1.5

函數(shù)和預(yù)處理431.5.2函數(shù)的參數(shù)傳遞局部變量:函數(shù)體內(nèi)定義,函數(shù)體內(nèi)使用;全局變量:函數(shù)體外定義,后面所有函數(shù)使用。使用:函數(shù)盡量用局部變量,用形參傳遞參數(shù)。值傳遞:函數(shù)本身不對實參操作,返回值用return注意:按值傳遞時,即使形參的值在函數(shù)中發(fā)生變化,實參的值也不會影響。1.5

函數(shù)和預(yù)處理44[例Ex_SwapValue]交換函數(shù)兩個參數(shù)的值。#include<iostream.h>voidswap(floatx,floaty){ floattemp; temp=x;x=y;y=temp; cout<<"x="<<x<<",y="<<y<<"\n";}voidmain(){ floata=20,b=40; cout<<"a="<<a<<",b="<<b<<"\n"; swap(a,b); cout<<"a="<<a<<",b="<<b<<"\n";}1.5

函數(shù)和預(yù)處理451.5.3

帶默認(rèn)形參值的函數(shù)例如:voiddelay(intloops=1000); //函數(shù)聲明…voiddelay(intloops) //函數(shù)定義{ if(loops==0)return; for(inti=0;i<loops;i++); //空循環(huán),起延時作用}delay(); //和delay(1000)等效delay(2000);1.5

函數(shù)和預(yù)處理461.5.3

帶默認(rèn)形參值的函數(shù)注意:(1)當(dāng)函數(shù)既有聲明又有定義時,不能在函數(shù)定義中指定默認(rèn)參數(shù)。(2)當(dāng)一個函數(shù)中有多個默認(rèn)參數(shù)時,則形參分布中,默認(rèn)參數(shù)應(yīng)從右到左逐次定義,中間不能跳開。

voiddisplay(inta,intb=2,intc);//錯誤(3)當(dāng)實參的數(shù)目不足時,系統(tǒng)將按順序用默認(rèn)值來補齊(4)可以是全局變量、全局常量、函數(shù)。不可以是局部

變量1.5

函數(shù)和預(yù)處理47[例Ex_Default]一個設(shè)置多個默認(rèn)參數(shù)的函數(shù)示例#include<iostream.h>voiddisplay(inta,intb=2,intc=3) //設(shè)置默認(rèn)參數(shù){ cout<<"a="<<a<<",b="<<b<<",c="<<c<<"\n";}voidmain(){ display(1); display(1,5); display(1,7,9);}1.5

函數(shù)和預(yù)處理481.5.4函數(shù)的遞歸調(diào)用遞歸調(diào)用:在調(diào)用一個函數(shù)的過程中出現(xiàn)直接

地或間接地調(diào)用函數(shù)本身[例Ex_Factorial]編程n的階乘n! f(n)=1 當(dāng)n=0時 n*f(n-1) 當(dāng)n>0時1.5

函數(shù)和預(yù)處理49#include<iostream.h>longfactorial(intn);voidmain(){ cout<<factorial(4)<<endl;}longfactorial(intn){ longresult=0; if(n==0)result=1; else result=n*factorial(n-1); returnresult;}1.5

函數(shù)和預(yù)處理501.5.4函數(shù)的遞歸調(diào)用factorial(4)result=4*factorial(3);result=3*factorial(2);result=2*factorial(1);result=1*factorial(0);表示調(diào)用“初始化”,執(zhí)行被調(diào)函數(shù)表示調(diào)用“后處理”,返回主調(diào)函數(shù)result=1;result=1*1=1;result=2*1=2;result=3*2=6;result=4*6=24;123456789101.5

函數(shù)和預(yù)處理511.5.5內(nèi)聯(lián)函數(shù)解決小而簡單的函數(shù)調(diào)用的系統(tǒng)開銷。定義:函數(shù)的類型前增加關(guān)鍵字inline功能:把函數(shù)體的代碼直接插入到調(diào)用處[例Ex_Inline]用內(nèi)聯(lián)函數(shù)實現(xiàn)求兩個實數(shù)的最大值#include<iostream.h>inlinefloatfmax(floatx,floaty){ returnx>y?x:y; }voidmain(){ floata=3.6,b=5.0; cout<<"最大的數(shù)為:"<<fmax(a,b)<<"\n";}1.5

函數(shù)和預(yù)處理521.5.5內(nèi)聯(lián)函數(shù)注意:(1)內(nèi)聯(lián)函數(shù)也要遵循定義在前,調(diào)用在后的原則。形參與實參之間的關(guān)系與一般函數(shù)相同。(2)在C++中,需要定義成的內(nèi)聯(lián)函數(shù)不能含有循環(huán)、switch和復(fù)雜嵌套的if語句。(3)遞歸函數(shù)不用做內(nèi)聯(lián)函數(shù)。1.5

函數(shù)和預(yù)處理531.5.6函數(shù)的重載重載:C++允許多個同名的函數(shù)存在,但形參須有區(qū)別:形參個數(shù)不同,或形參個數(shù)相同,但類型不同說明:(1)重載函數(shù)必須具有不同的參數(shù)個數(shù)或不同的參數(shù)類型,若只有返回值的類型不同是不行的。(2)當(dāng)函數(shù)的重載帶有默認(rèn)參數(shù)時,應(yīng)該注意避免二義性。

例如: intfun(inta,intb=0); intfun(inta);1.5函數(shù)和預(yù)處理54[例Ex_OverLoad]編程求兩個或三個操作數(shù)之和#include<iostream.h>intsum(intx,inty);intsum(intx,inty,intz);doublesum(doublex,doubley);doublesum(doublex,doubley,doublez);voidmain(){ cout<<sum(2,5)<<endl; cout<<sum(2,5,7)<<endl; cout<<sum(1.2,5.0,7.5)<<endl;}1.5函數(shù)和預(yù)處理55intsum(intx,inty){ returnx+y; }intsum(intx,inty,intz){ returnx+y+z; }doublesum(doublex,doubley){ returnx+y; }doublesum(doublex,doubley,doublez){ returnx+y+z; }1.5函數(shù)和預(yù)處理561.5.7作用域

1.塊作用域:在塊中聲明的標(biāo)識符,其作用域從聲明處開

始,一直到結(jié)束塊的花括號為止。例如:voidfun(void) //無形參,void可不要 {inta; //a的作用域起始處 cin>>a; if(a<0) {a=-a; intb; //b的作用域起始處 } //b的作用域終止處 }

//a的作用域終止處

1.5

函數(shù)和預(yù)處理57說明:1.當(dāng)標(biāo)識符的作用域完全相同時,不允許出現(xiàn)相同的標(biāo)識符名。當(dāng)標(biāo)識符具有不同的作用域時,允許標(biāo)識符同名。2.VisualC++中,在for語句中聲明的標(biāo)識符,其作用域是包含for語句的那個內(nèi)層塊,即:{ for(inti=0;i<10;i++) {cout<<i; }cout<<i;//正確}1.5

函數(shù)和預(yù)處理581.5.7作用域

2.函數(shù)原型作用域:聲明函數(shù)原型所指定的參數(shù)標(biāo)識符的作用范圍是在函數(shù)原型聲明中的左、右括號之間。例:doublemax(doublex,doubley);

等價 doublemax(double,double);1.5

函數(shù)和預(yù)處理591.5.7作用域3.函數(shù)作用域:goto后的標(biāo)號

標(biāo)識符只在聲明它的函數(shù)內(nèi)可見4.文件作用域:函數(shù)體外定義的標(biāo)識符或用extern 定義的標(biāo)識符為全局標(biāo)識符,自

聲明始,到文件結(jié)束1.5函數(shù)和預(yù)處理601.5.8存儲類型類型:自動、靜態(tài)、寄存器、外部聲明:<存儲類型><數(shù)據(jù)類型><變量名表>;1.自動類型auto:局部變量,動態(tài)分配內(nèi)存空間

autointi1.5

函數(shù)和預(yù)處理612.靜態(tài)類型(static):局部變量,聲明時必須初始化

staticinti;與自動存儲類型的不同:

在內(nèi)存中以固定地址存放的,靜態(tài)分配內(nèi)存空間,靜態(tài)類型變量的值不會隨它所在的函數(shù)或語句塊的結(jié)束而消失。全局變量總是靜態(tài)存儲類型1.5

函數(shù)和預(yù)處理62[例Ex_Static]使用靜態(tài)類型的局部變量#include<iostream.h>voidcount(){ inti=0; staticintj=0; //靜態(tài)類型 cout<<”i=”<<i<<”,j=”<<j<<”\n”; i++; j++;}voidmain(){ count(); count();}1.5

函數(shù)和預(yù)處理i=0,j=0i=0,j=1633.寄存器類型(register)

將所聲明的變量放入寄存器內(nèi)4.外部類型(extern)

定義在本程序外部的變量

使用外部類型的情況:變量使用在前,聲明在后項目中包含多個文件1.5

函數(shù)和預(yù)處理641.5.9編譯預(yù)處理預(yù)處理命令:#,不帶“;”號類型:宏定義、文件包含、條件編譯1.不帶參數(shù)的宏定義宏定義:用指定的標(biāo)識符代替字符串

#define例:#definePI3.1415931.5函數(shù)和預(yù)處理65注意:(1)#define、PI和3.141593之間要有空格,宏名一般大寫

(2)宏被定義后,使用下列命令后可重新定義: #undef 宏名(3)定義過的宏名可用來定義其它新的宏,但要注意其中的括號,例:

#define WIDTH80 #define LENGTH(WIDTH+10)

例:var=LENGTH*20;1.5函數(shù)和預(yù)處理662.帶參數(shù)的宏定義格式:#define<宏名>(參數(shù)名表)字符串例如:#defineMAX(a,b)((a)>(b)?(a):(b))x=MAX(3,9);預(yù)處理后變成:x=((3)>(9)?(3):(9)); //結(jié)果為9優(yōu)點:相當(dāng)于一個函數(shù)的功能,但卻比函數(shù)簡捷。注意:宏名與左圓括號之間不能留有空格。否則,編譯器將該宏視為無參數(shù)的宏定義。1.5函數(shù)和預(yù)處理673.文件包含命令文件包含:將另一個源文件的內(nèi)容合并到源程序

中。#include格式:

#include<文件名>

#include“文件名”例如:

#include<iostream.h> #include“test1.h”1.5函數(shù)和預(yù)處理684.條件編譯命令條件編譯:根據(jù)一定的條件去編譯源文件的不同部分。形式1:#ifdef<標(biāo)識符> <程序段1> [#else <程序段2>] #endif關(guān)鍵字:#ifdef、#else和#endif含義:如果標(biāo)識符已被#define命令定義過,則編譯<程序段1>,否則編譯<程序段2>。1.5函數(shù)和預(yù)處理694.條件編譯命令形式2:#ifndef<標(biāo)識符> <程序段1> [#else <程序段2>] #endif含義:如果標(biāo)識符沒有被#define命令定義過,則編譯<程序段1>,否則編譯<程序段2>。1.5函數(shù)和預(yù)處理704.條件編譯命令形式3:#if<表達(dá)式1> <程序段1> [#elif<表達(dá)式2> <程序段2> ...] [#else <程序段n>] #endif含義:如果<表達(dá)式1>為“真”,就編譯<程序段1>,否則如果<表達(dá)式2>為“真”就編譯<程序段2>,...,如果各表達(dá)式都不為“真”就編譯<程序段n>。1.5

函數(shù)和預(yù)處理71復(fù)合數(shù)據(jù)類型

:數(shù)組、結(jié)構(gòu)體等1.6.1一維數(shù)組定義:type數(shù)組名[常量表達(dá)式]//開辟存儲空間引用:

數(shù)組名[元素的下標(biāo)]注意:

C++數(shù)組的下標(biāo)從0開始說明:1.下標(biāo)從0開始,必須為整型2.對數(shù)組元素的賦值跟變量相同1.6

數(shù)組72初始化:inta[5]={初值列表}1.可以部分賦值注意inta[3];和inta[3]={0};的區(qū)別,前者為亂碼,后者未初始化元素默認(rèn)為02.初值列表中不能有變量3.必須讓系統(tǒng)在編譯時明確數(shù)組大小,inta[]非法例:

intage[5]={20,21,20,19,18} intage[]={20,21,20,19,18} intage[5]={20,21,20}1.6

數(shù)組731.6.2二維數(shù)組:定義:type數(shù)組名[常量表達(dá)式1][常量表達(dá)式2]

例:intage[3][5];//3行5列引用:數(shù)組名[下標(biāo)1][下標(biāo)2]說明:1.多維數(shù)組的維數(shù),最右邊為最低維2.多維數(shù)組在內(nèi)存中依次存放的順序:數(shù)組元素的標(biāo)號從低維到高維順序變化,即a[2][3]:a[0][0],a[0][1],a[0][2],a[1][0],a[1][1],a[1][2]1.6

數(shù)組741.6.2二維數(shù)組:初始化:可部分賦值inta[2][3]={{1,2,3},{4}};inta[2][3]={1,2};初始化的兩種方式:(1)分行賦值:intage[3][4]={{19,21,20,18},{20,20,22,19}, {20,21,21,19} };(2)按順序賦值:intage[3][4]={19,21,20,18,20,20,22,19,20,21,21,19};1.6

數(shù)組751.6.3字符數(shù)組數(shù)據(jù)類型為char

字符數(shù)組:以’\0’作為結(jié)束符初始化: charc[]={“aman”};

或 charc[]=“aman”;

他們等同于 charc[]={’a’,’’,’m’,’a’,’n’,’\0’,};1.6

數(shù)組761.6.3字符數(shù)組說明:1.未初始化的字符數(shù)組元素默認(rèn)值為’\0’2.不能給數(shù)組名直接賦值,即:charstr[10];str=“aman”錯誤3.二維數(shù)組可存取多個字符串,如:charstr[][10]={“how”,“are”,“you”};1.6

數(shù)組771.6.4數(shù)組與函數(shù)數(shù)組元素作函數(shù)的實參和形參時,傳遞的是值數(shù)組名作函數(shù)的實參和形參時,傳遞的是數(shù)組的地址[例Ex_StrChange]改變字符串中的內(nèi)容voidchange(charch[5]);//5可省,[]不可以省voidmain(){charname[5]="Ding"; cout<<name<<endl; change(name); //調(diào)用時,只需指定數(shù)組名 cout<<name<<endl;}voidchange(charch[5]){ strcpy(ch,"Zhen");}1.6

數(shù)組輸出:DingZhen781.7.1指針和指針變量指針:內(nèi)存單元的地址指針變量:存放內(nèi)存地址的變量定義:<數(shù)據(jù)類型>*<指針變量名1>;例1:inti=5; int*p=&i;//稱p是一個指向變量i的指針例2:float *pFloat; //指向?qū)嵭妥兞康闹羔樥f明:1.大多數(shù)情況下,將指針變量簡稱為“指針”。2.給所有指針分配的內(nèi)存單元大小相同。1.7

指針和引用說明符,不是指針變量名的一部分791.7.2&和*運算符

&(取地址運算符):取變量的地址*(取值運算符):取指針或地址所指內(nèi)存單元中存

儲的內(nèi)容。例: int a=3; int *p=&a; //指針,其值等于a的地址 int b=*p; //指針?biāo)傅牡刂分械膬?nèi)容例2:int *pi; pi=p; //p中的地址賦給pi,都是指向a的指針,等價于pi=&a;注意在pi前沒有*。1.7

指針和引用☆注意區(qū)分“*”號的含義801.7.2&和*運算符

說明:(1)使用指針前,一定要進行初始化;(2)兩個指針變量進行賦值,必須使這兩個指針變量類型相同,否則結(jié)果不可預(yù)測;(3)給指針變量賦值實際上是間接地給指針?biāo)赶虻淖兞抠x值.

例:inta=11,*p=&a; (*p)++;//a=121.7

指針和引用81[例Ex_ComUsePointer]輸入兩個數(shù)a和b,按大小順序輸出#include<iostream.h>voidmain(){ int*p1,*p2,*p,a,b; cout<<"輸入兩個整數(shù):"; cin>>a>>b; p1=&a; p2=&b; if(a<b) { p=p1;p1=p2;p2=p; } cout<<"a="<<a<<",b="<<b<<endl; cout<<"最大的值是:"<<*p1<<"最小的值是:"<<*p2<<"\n";}1.7

指針和引用821.7.3指針運算1.指針的算術(shù)運算指針的算術(shù)運算:對指針加上或減去一個整數(shù)。例:int*ptr;ptr=ptr+n;//ptr+sizeof(int)*n,int是ptr的數(shù)據(jù)類型<指針變量>=<指針變量>+n//指針變量所指向的存儲單元向高地址方向移動了sizeof(指針變量類型)*n個字節(jié)。<指針變量>=<指針變量>-n//指針變量所指向的存儲單元向低地址方向移動了sizeof(指針變量類型)*n個字節(jié)。當(dāng)n=1:指針變量的自增(++)、自減(--)運算。1.7

指針和引用831.7.3指針運算2.指針的關(guān)系運算關(guān)系運算:根據(jù)兩個指針變量值的大小來進行

比較。1.7

指針和引用84[例Ex_PointerOp]將a中的n個字符按相反順序存放#include<iostream.h>voidmain(){ chara[]="Chinese"; char*p1=a,*p2=a,temp; while(*p2!=‘\0’) p2++;//最終p2指向‘\0’ p2--; //將p2指向a的最后一個元素 while(p1<p2){ temp=*p1;*p1=*p2;*p2=temp; p1++;p2--; } cout<<a<<endl; //輸出結(jié)果}1.7

指針和引用851.7.4指針和數(shù)組(1)數(shù)組名代表數(shù)組中下標(biāo)為0的元素的地址,即數(shù)組的首地址,為一個地址(指針)常量。

例如:int a[5];

則a所表示的地址就是元素a[0]的地址,a++是不合法的。(2)通過指針能引用數(shù)組元素

例如:int*pi=a;

*(pi+1)等價于pi[1]等價于a[1]等價于*(a+1)

1.7

指針和引用861.7.4指針和數(shù)組有程序:intA[]={2,6,5,1,3};int*p;p=A;1.7

指針和引用*pp*p+2A*(p+2)&A[0]&p&p+1871.7.4指針和數(shù)組[例Ex_SumUsePointer]用指針運算來計算數(shù)組元素的和#include<iostream.h>voidmain(){ inta[6]={1,2,3,4,5,6},sum=0; int*p=a; //用數(shù)組名a給指針初始化 for(inti=0;i<6;i++){ sum+=*p; p++; } cout<<sum<<"\n";}1.7

指針和引用881.7.4指針和數(shù)組多維數(shù)組:inta[2][3]={{1,2,5},{7,9,11}};可認(rèn)為,a包含兩個元素,每個元素是一個一維數(shù)組。int*p1,*p2;p1=a[0];p2=a[1];a又可理解為指向一維數(shù)組的指針的數(shù)組,因此:int**p;p=a;p[0]或*p等價于a[0]或p11.7

指針和引用89多維數(shù)組:[例Ex_MultiArrayAndPointer]分析下列程序的輸出結(jié)果voidmain(){ int a[3][3]={1,2,3,4,5,6,7,8,9}; int y=0; for(inti=0;i<3;i++)for(intj=0;j<3;j++) y+=(*(a+i))[j];//*(a+i)就是a[i] cout<<y<<"\n";}1.7

指針和引用901.7.5指針和函數(shù)1.指針作為函數(shù)的參數(shù)函數(shù)的某個參數(shù)是指針,簡稱傳址調(diào)用。注:此時形參內(nèi)容的改變必將影響實參。1.7

指針和引用91[例Ex_SwapUsePointer]指針作為函數(shù)參數(shù)的調(diào)用方式#include<iostream.h>voidswap(int*x,int*y);voidmain(){ inta=7,b=11; swap(&a,&b); //傳遞的是地址 cout<<“a=”<<a<<“,b=”<<b<<"\n";}voidswap(int*x,int*y){ inttemp; temp=*x;//交換存儲單元中的內(nèi)容 *x=*y; *y=temp; cout<<"x="<<*x<<",y="<<*y<<"\n";}1.7

指針和引用x=11,y=7a=11,n=7921.7.5指針和函數(shù)2.返回指針的函數(shù)指針指向一個已定義的任一類型的數(shù)據(jù)。定義:<函數(shù)類型>*<函數(shù)名>(<形式參數(shù)表>){ <函數(shù)體>}1.7

指針和引用93[例Ex_PointerRreturn]返回指針的函數(shù):將字符串逆序輸出#include<iostream.h>char*flip(char*p){ char*p1,*p2,ch; p1=p2=p; while(*p2!='\0')p2++; p2--; while(p1<p2) {//交換字符 ch=*p2; *p2=*p1;1.7

指針和引用 *p1=ch; p1++; p2--; } returnp;}voidmain(){ charstr[]="ABCDEFGH"; cout<<flip(str)<<"\n";}941.7.5指針和函數(shù)3.指向函數(shù)的指針“函數(shù)指針”:指向函數(shù)地址的指針,通過函數(shù)指針 可以調(diào)用相應(yīng)的函數(shù)。定義:<函數(shù)類型>(*<指針名>)(<參數(shù)表>);例如:int(*func)(chara,charb);說明:由于()的優(yōu)先級大于*,所以下面定義的是返

回指針的函數(shù)而不是函數(shù)指針:int*func(chara,charb);1.7

指針和引用95函數(shù)指針的賦值:函數(shù)指針的返回值類型與參數(shù)個數(shù)、順序要與函數(shù)一致。例:intfn1(chara,charb);intfn2(intn);int(*fp1)(charx,chary);int(*fp2)(intx);fp1=fn1

; //正確

fp1=fn2

; //錯誤fp2=fn2; //正確

fp2=fp1

; //錯誤fp2=fn2(5)

;//錯誤,函數(shù)賦給函數(shù)指針時不能加括號1.7

指針和引用961.7.5指針和函數(shù)用指針來調(diào)用函數(shù)的格式:(*<指針名>)(<實數(shù)表>);或<指針名>(<實數(shù)表>);例如:(*fp2)(5); 或 fp2(5)

;1.7

指針和引用97[例Ex_FuncPointer1]函數(shù)指針的使用#include<iostream.h>doubleadd(doublex,doubley){ return(x+y); }doublemul(doublex,doubley){ return(x*y); }voidmain(){ double (*func)(double,double); //定義函數(shù)指針變量 doublea,b; charop; cout<<“輸入兩個實數(shù)及操作方式,‘+’為‘加’,‘*’為乘:"; cin>>a>>b>>op; if(op=='+')func=add; //將函數(shù)名賦給指針 else func=mul; cout<<a<<op<<b<<"="<<func(a,b)<<endl; //函數(shù)調(diào)用}1.7

指針和引用981.7.6new和delete作用:有效地、直接地進行動態(tài)內(nèi)存的分配和釋放。new:返回指定類型的一個指針,如果分配失敗(如沒有足

夠的內(nèi)存空間),返回0。例如:double*p1,*p2; p1=newdouble; *p1=30.4; //也可寫成p1=newdouble(30.4); p2=newdouble[10];delete:釋放new請求到的內(nèi)存。例如:deletep1,[]p2;注意:內(nèi)存釋放后,指針p仍然有效,可指向另一內(nèi)存單元1.7

指針和引用991.7.6new和delete注意:(1)new和delete須配對使用。(2)運算符delete必須用于先前new分配的有效指針。

(3)釋放時,可告訴delete數(shù)組有多少個元素。例如:int *p; p=newint[10]; if(!p) { cout<<”內(nèi)存分配失敗!”; exit(1); //中斷程序執(zhí)行 } for(inti=0;i<10;i++) p[i]=i; ... delete[10]p;//或delete[]p;1.7

指針和引用1001.7.7引用1.引用定義和使用定義引用類型變量:給一個已定義的變量起一個別名,注意:系統(tǒng)不會為引用類型變量分配內(nèi)存空間。定義格式:<數(shù)據(jù)類型>&<引用名>=<變量名>或<數(shù)據(jù)類型>&<引用名>(<變量名>)其中,變量名必須是一個已定義過的變量。例如:inta=3; int&ra=a; ra=ra+2;//a=51.7

指針和引用注意與取地址符區(qū)分!!101[例Ex_Reference]給引用重新賦值#include<iostream.h>voidmain(){ inta; int&ra=a; a=5; cout<<"a="<<a<<"\n"; cout<<"ra="<<ra<<"\n"; cout<<"a的地址是:"<<&a<<"\n"; cout<<"ra的地址是:"<<&ra<<"\n";1.7

指針和引用intb=8;ra=b;cout<<"a="<<a<<"\n";cout<<"b="<<b<<"\n";cout<<"ra="<<ra<<"\n";cout<<"a的地址是:"<<&a<<"\n";cout<<"b的地址是:"<<&b<<"\n";cout<<"ra的地址是:"<<&ra<<"\n";}a=5ra=5a的地址是:0x0012FF7Cra的地址是:0x0012FF7Ca=8b=8ra=8a的地址是:0x0012FF7Cb的地址是:0x0012FF74ra的地址是:0x0012FF7C102與指針的區(qū)別:指針是一個變量,可以把它再賦值成指 向別處的地址,而引用一旦初始化后, 其地址不會再改變。使用注意:(1)定義引用類型變量時,必須將其初始化。而且引用變量類型必須與為它初始化的變量類型相同。

例如:floatfVal; int&rfVal=fVal; //錯誤:類型不同(2)當(dāng)引用類型變量的初始化值是常數(shù)的,則必須將該引用定義成const類型。

例如:constint&ref=2; //const類型的引用1.7

指針和引用103(3)不能引用數(shù)組,數(shù)組名表示的是地址例如:inta[10];int&ra=a;//

錯,不能建立數(shù)組的引用(4)引用本身不是數(shù)據(jù)類型,所以沒有引用的指針例如:inta; int&ra=a; int&rra=ra;//正確,變量a的另一個引用

int&*p=&ra;//錯誤,企圖定義一個引用的指針1.7

指針和引用1042.引用傳遞

使用引用傳遞的方法:函數(shù)定義時在形參前加“&”[例Ex_SwapUseReference]引用作為函數(shù)參數(shù)的調(diào)用方式#include<iostream.h>voidswap(int&x,int&y){ inttemp;temp=x;x=y;y=temp; cout<<"x="<<x<<",y="<<y<<"\n";}voidmain(){ inta(7),b(11); swap(a,b); cout<<“a=”<<a<<“,b=”<<b<<"\n";}1.7

指針和引用x=11,y=7a=11,b=71051.8.1字符指針

定義:char*例:char*str1,*str2;初始化:1.

char*p1=“Hello”;

//指針p1指向字符串的內(nèi)存空間2.char*p1,str[]=“Hello”;p1=str;//p1指向字符數(shù)組str的首地址1.8

字符指針和字符串處理1061.8.2帶參數(shù)的主函數(shù)main()格式:數(shù)據(jù)類型main(intargc,char*argv[])argv[0]指向命令字argv[1]指向命令行中第一個參數(shù)argv[2]指向命令行中第二個參數(shù)…1.8

字符指針和字符串處理存放命令行參數(shù)的個數(shù),argc比命令行參數(shù)的個數(shù)多1,即將命令字也計算在內(nèi)一維的字符指針型數(shù)組

,指向各實參和命令字的字符串的首地址argc的值和argv[]各元素的值由系統(tǒng)自動賦值1071.8.2帶參數(shù)的主函數(shù)main()例:編寫程序輸出2個整數(shù)的和,運行時,在程序名后帶參數(shù)#include"stdlib.h"/*程序中用到數(shù)據(jù)轉(zhuǎn)換類函數(shù)*/#include<iostream.h>voidmain(intargc,char*argv[]){intx,y,sum;x=atoi(argv[1]);//將第1個實參轉(zhuǎn)換成整數(shù)存入xy=atoi(argv[2]);//將第2個實參轉(zhuǎn)換成整數(shù)存入ysum=x+y;cout<<x<<"+"<<y<<"="<<sum<<endl;}1.8

字符指針和字符串處理1081.8.3字符串處理函數(shù)頭文件:string.h1.strcat和strncatchar*strcat(char*dest,constchar*src);char*strcat(char*dest,constchar*src,size_tmaxlen);功能:

將src指向的字符串連接到dest指向的字符串的末尾,成功返回指向dest的指針,失敗返回NULL說明:1.dest指向的內(nèi)存空間必須足夠大;2.連接時,dest后面的‘\0’被清除。1.8

字符指針和字符串處理1091.8.3字符串處理函數(shù)2.strcpy和strncpychar*strcpy(char*dest,constchar*src);char*strcpy(char*dest,constchar*src,size_tmaxlen);功能:

將src指向的字符串復(fù)制到dest指向的內(nèi)存空間中,調(diào)用成功返回指向dest內(nèi)存空間的指針,調(diào)用失敗返回NULL1.8

字符指針和字符串處理1103.strcmp和strncmpint*strcmp(constchar*s1,constchar*s2);功能:

對兩個字符串從左到右依次比較ASCII碼

若s1=s2,返回0;

若s1>s2,返回正數(shù)(+1);

若s1<s2,返回負(fù)數(shù)(-1);區(qū)分:if(s1==s2),比較的只是s1和s2的首地址1.8

字符指針和字符串處理1111.9.1結(jié)構(gòu)體定義:struct結(jié)構(gòu)體名(大寫){成員列表;}[變量名表];例:structPERSON{ int age;charsex; 或者

float weight; charname[25]; }family_member;

1.9結(jié)構(gòu)、共用和自定義structPERSON{int age;char sex; float weight; char name[25];};PERSONfamily_member;112注意:1.定義結(jié)構(gòu)體時,不要忘記后面的”;”2.結(jié)構(gòu)體的成員變量可以是基本數(shù)據(jù)類型,也可以是數(shù)組、結(jié)構(gòu)體變量等。例如:structSTUDENT { PERSONone; floateng; };1.9結(jié)構(gòu)、共用和自定義113結(jié)構(gòu)體變量的初始化:形式:在變量后面加上:={<初值列表>};例1:structPOINT{intx;

溫馨提示

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

評論

0/150

提交評論