C++语言程序设计课件_第1页
C++语言程序设计课件_第2页
C++语言程序设计课件_第3页
C++语言程序设计课件_第4页
C++语言程序设计课件_第5页
已阅读5页,还剩637页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C++簡單程式設計

2C++語言的產生C++是從C語言發展演變而來的,首先是一個更好的C引入了類的機制,最初的C++被稱為“帶類的C”1983年正式取名為C++從1989年開始C++語言的標準化工作於1994年制定了ANSIC++標準草案於1998年11月被國際標準化組織(ISO)批准為國際標準,成為目前的C++C++語言概述3C++的特點全面相容C它保持了C的簡潔、高效和接近組合語言等特點對C的類型系統進行了改革和擴充C++也支持面向過程的程式設計,不是一個純正的面向對象的語言支持面向對象的方法C++語言概述4C++程式實例—例2-1//2_1.cpp#include<iostream>usingnamespacestd;intmain(){cout<<"Hello!\n";cout<<"Welcometoc++!\n";}運行結果:Hello!Welcometoc++!C++語言概述5C++字元集大小寫的英文字母:A~Z,a~z數字字元:0~9特殊字元:空格 ! # % ^ & *

_(下划线) + = - ~ < > / \ ' " ; . , () [] {}C++語言概述6詞法記號關鍵字

C++預定義的單詞識別字

程式員聲明的單詞,它命名程式正文中的一些實體文字

在程式中直接使用符號表示的數據操作符

用於實現各種運算的符號分隔符號

(){},:;

用于分隔各个词法记号或程序正文空白符 空格、跳位字元(TAB鍵產生的字元)、換行符(Enter鍵所產生的字元)和注釋的總稱C++語言概述7識別字的構成規則以大寫字母、小寫字母或下劃線(_)開始。可以由以大寫字母、小寫字母、下劃線(_)或數字0~9組成。大寫字母和小寫字母代表不同的識別字。C++語言概述8

數據類型

——常量與變數#include<iostream>usingnamespacestd;intmain(){constintPRICE=30;intnum,total;floatv,r,h;num=10;total=num*PRICE;cout<<total<<endl;r=2.5;h=3.2;v=3.14159*r*r*h;cout<<v<<endl;}常量變數變數先聲明後使用符號常量基本數據類型和運算式9#include<iostream>usingnamespacestd;intmain(){constintPRICE=30;intnum,total;floatv,r,h;num=10;total=num*PRICE;cout<<total<<endl;r=2.5;h=3.2;v=3.14159*r*r*h;cout<<v<<endl;}

數據類型

——整型數據整型常量shortunsignedshort2位元組intunsignedint

4字节longunsignedlong4位元組整型變數整型變數聲明基本數據類型和運算式10數據類型

—整型數據及取值範圍類型 說明符 位數 數值範圍 短整 short 16 -32768~32767基本 int 32 -231~(231-1)長整 long 32 -231~(231-1)無符號

unsignedshort 16 0~65535

unsigned[int] 32 0~(232-1)

unsignedlong 32 0~(232-1) 基本數據類型和運算式11#include<iostream>usingnamespacestd;intmain(){constintPRICE=30;intnum,total;floatv,r,h;num=10;total=num*PRICE;cout<<total<<endl;r=2.5;h=3.2;v=3.14159*r*r*h;cout<<v<<endl;}

數據類型

——實型數據實型常量float4位元組精度:3.4×10±387位有效數字double8位元組精度:1.7×10±30815位有效數字longdouble8位元組精度:1.7×10±30815位有效數字實型變數默認為double型尾碼F(或f)

为float型尾碼L(或l)

为longdouble

型基本數據類型和運算式12

數據類型

——字元型數據(一)字元常量單引號括起來的一個字元,

如:'a','D','?','$'字元變數用來存放字元常量

例:charc1,c2;

c1='a';

c2='A';字符数据在内存中的存储形式以ASCII碼存儲,占1位元組,用7個二進位位基本數據類型和運算式13字元數據的使用方法字元數據和整型數據之間可以運算。字元數據與整型數據可以互相賦值。字串常量例:"CHINA"

"a"

'a'所以:charc;

c="a";CHINA\0a

\0aPage13

數據類型

——字元型數據(二)基本數據類型和運算式14

數據類型

——布爾型數據布爾型變數的說明:

例:boolflag;布爾型數據的取值:

只有false

和true

兩個值基本數據類型和運算式15

數據類型

——變數初始化例:

inta=3;

doublef=3.56;

charc='a';

intc(5);Page15基本數據類型和運算式16數據類型

—混合運算時的類型轉換不同類型數據進行混合運算時,C++編譯器會自動進行類型轉換。為了避免不同的數據類型在運算中出現類型問題,應儘量使用同種類型數據。可以採用強制類型轉換:例如:

floatc;

inta,b;

c=float(a)/float(b);或c=(float)a/(float)b;

基本數據類型和運算式17變數的存儲類型auto屬於一時性存儲,其存儲空間可以被若干變數多次覆蓋使用。register存放在通用寄存器中。extern在所有函數和程式段中都可引用。static在內存中是以固定地址存放的,在整個程式運行期間都有效。基本數據類型和運算式18算術運算符與算術運算式基本算術運算符

+-*/(若整數相除,結果取整)%(取餘,運算元為整數)優先順序與結合性先乘除,後加減,同級自左至右++,--(自增、自減)例:i++;--j;Page18基本數據類型和運算式19賦值運算符和賦值運算式

简单的赋值运算符"="舉例

n=n+5運算式的類型

等號左邊對象的類型運算式的值

等號左邊對象被賦值後的值Page19基本數據類型和運算式20賦值運算符和賦值運算式

复合的赋值运算符有10種複合運算符:

+=,-=,*=,/=,%=,

<<=,>>=,&=,^=,|=例

a+=3

等價於a=a+3

x*=y+8

等價於x=x*(y+8)基本數據類型和運算式21賦值運算符和賦值運算式

——賦值運算式舉例a=5 運算式值為5a=b=c=5

運算式值為5,a,b,c均為5a=5+(c=6)

運算式值為11,a為11,c為6a=(b=4)+(c=6)

運算式值為10,a為10,b為4,c為6a=(b=10)/(c=2)

運算式值為5,a為5,b為10,c為2a+=a-=a*a相當於

a=a+(a=a-a*a)Page21基本數據類型和運算式22逗號運算和逗號運算式格式運算式1,運算式2求解順序及結果先求解1,再求解2,最終結果為運算式2的值例a=3*5,a*4

最終結果為60Page22基本數據類型和運算式23關係運算與關係運算式關係運算是比較簡單的一種邏輯運算,優先次序為:

<<=>>===!=

優先順序相同(高)優先順序相同(低)關係運算式是一種最簡單的邏輯運算式其結果類型為bool,值只能為true

或false。例如:a>b,c<=a+b,x+y==3基本數據類型和運算式24邏輯運算與邏輯運算式邏輯運算符

!(非)&&(與)||(或)

优先次序:高→低邏輯運算式

例如:(a>b)&&(x>y)

其结果类型为bool,值只能為true

或false基本數據類型和運算式25條件運算符與條件運算式一般形式運算式1?運算式2:運算式3運算式1必須是bool類型執行順序先求解運算式1,若運算式1的值為true,則求解運算式2,運算式2的值為最終結果若運算式1的值為false,則求解運算式3,運算式3的值為最終結果例:x=a>b?a:b;基本數據類型和運算式26條件運算符與條件運算式注意:條件運算符優先順序高於賦值運算符,低於邏輯運算符運算式2、3的類型可以不同,條件運算式的最終類型為2和3中較高的類型。例:x=a>b?a:b;基本數據類型和運算式①②27sizeof運算符語法形式

sizeof(類型名)

或sizeof(運算式)結果值:

“類型名”所指定的類型或“運算式”的結果類型所占的位元組數。例:sizeof(short)sizeof(x)基本數據類型和運算式28位運算——按位與(&)運算規則將兩個運算量的每一個位進行邏輯與操作舉例:計算3&53:000000115:(&)000001013&5:00000001用途:將某一位置0,其他位不變。例如:

將char型變數a的最低位置0:

a=a&0376;取指定位。

例如:有charc;inta;

取出a的低位元組,置於c中:c=a&0377;基本數據類型和運算式29位運算——按位或(|)運算規則將兩個運算量的每一個位進行邏輯或操作舉例:計算3|53:000000115:(|)000001013|5:00000111用途:將某些位置1,其他位不變。

例如:將int

型變數a

的低位元組置

1

a=a|0xff;基本數據類型和運算式30位運算——按位異或(^)運算規則兩個運算元進行異或:

若對應位相同,則結果該位為0,

若对应位不同,則結果該位為1,舉例:計算071^052071: 00111001052:(^)00101010071^052: 00010011基本數據類型和運算式31位運算——按位異或(^)用途:使特定位翻轉(與0異或保持原值,與1異或取反)例如:要使01111010

低四位翻轉:

01111010(^) 00001111 01110101基本數據類型和運算式32位運算——取反(~)單目運算符,對一個二進位數按位取反。例:025:0000000000010101~025:1111111111101010基本數據類型和運算式33位運算——移位左移運算(<<)左移後,低位補0,高位捨棄。右移運算(>>)右移後,低位:捨棄高位:無符號數:補0

有符號數:補“符號位”基本數據類型和運算式34運算符優先順序++,--,sizeof*,/,%+,-==,!=位運算&&||?:賦值運算逗號運算低高基本數據類型和運算式35混合運算時數據類型的轉換

——隱含轉換一些二元運算符(算術運算符、關係運算符、邏輯運算符、位運算符和賦值運算符)要求兩個運算元的類型一致。在算術運算和關係運算中如果參與運算的運算元類型不一致,編譯系統會自動對數據進行轉換(即隱含轉換),基本原則是將低類型數據轉換為高類型數據。

char,short,int,unsigned,long,unsignedlong,float,double

低高基本數據類型和運算式36混合運算時數據類型的轉換

——隱含轉換當參與運算的運算元必須是bool型時,如果運算元是其他類型,編譯系統會自動將非0數據轉換為true,0轉換為false。位運算的運算元必須是整數,當二元位運算的運算元是不同類型的整數時,也會自動進行類型轉換,賦值運算要求左值與右值的類型相同,若類型不同,編譯系統會自動將右值轉換為左值的類型。基本數據類型和運算式37混合運算時數據類型的轉換

——強制類型轉換語法形式:類型說明符(運算式)或(類型說明符)運算式強制類型轉換的作用是將運算式的結果類型轉換為類型說明符所指定的類型。基本數據類型和運算式38語句聲明語句運算式語句選擇語句迴圈語句跳轉語句複合語句標號語句

39運算式語句格式:運算式;運算式語句與運算式的區別:運算式可以包含在其他運算式中,而語句不可。例如:if((a=b)>0)t=a;不可寫為:if((a=b;)>0)t=a;語句40複合語句將多個語句用一對大括弧包圍,便構成一個複合語句例如{ sum=sum+i; i++;} 語句41簡單的輸入、輸出向標準輸出設備(顯示器)輸出例:intx;cout<<"x="<<x;從標準輸入設備(鍵盤)輸入例:intx;cin>>x;42順序結構分支結構迴圈結構演算法的基本控制結構43如何解決分支問題?例2-2輸入一個年份,判斷是否閏年。演算法的基本控制結構#include<iostream>usingnamespacestd;intmain(){ intyear;boolIsLeapYear;cout<<"Entertheyear:";cin>>year; IsLeapYear=((year%4==0&&

year%100!=0)||(year%400==0));

if(IsLeapYear)

cout<<year<<"isaleapyear"<<endl;

else

cout<<year<<"isnotaleapyear"<<endl;}44運行結果:Entertheyear:20002000isaleapyear4546if(運算式)語句例:if(x>y)cout<<x;if(運算式)語句1else語句2例:if(x>y)cout<<x;elsecout<<y;if(運算式1)語句1

elseif(表达式2)語句2

elseif(表达式3)語句3

else语句nif語句

——三種形式演算法的基本控制結構47如何解決多分問題?例2-3輸入兩個整數,比較兩個數的大小。演算法的基本控制結構#include<iostream>usingnamespacestd;intmain(){intx,y;cout<<"Enterxandy:";cin>>x>>y;if(x!=y)if(x>y)cout<<"x>y"<<endl;elsecout<<"x<y"<<endl;elsecout<<"x=y"<<endl;}48運行結果1:Enterxandy:58x<y運行結果2:Enterxandy:88x=y運行結果3:Enterxandy:128x>y4950一般形式if()if()語句1else語句2elseif()語句3else語句4注意語句1、2、3、4可以是複合語句,每層的if與else配對,或用{}來確定層次關係。if語句

——嵌套演算法的基本控制結構51特殊的多分支結構例2-4輸入一個0~6的整數,轉換成星期輸出。演算法的基本控制結構#include<iostream>usingnamespacestd;intmain(){ intday; cin>>day; switch(day)

{

case0:

cout<<"Sunday"<<endl;

break;

case1:

cout<<"Monday"<<endl;

break;

case2:

cout<<"Tuesday"<<endl;

break;

case3:cout<<"Wednesday"<<endl;

break;

case4:

cout<<"Thursday"<<endl;

break;

case5:

cout<<"Friday"<<endl;

break;

case6:

cout<<"Saturday"<<endl;

break;

default:

cout<<"DayoutofrangeSunday..Saturday"

<<endl;

break; }}5253一般形式switch(運算式){case常量運算式1:語句1case常量運算式2:語句2┆case常量運算式n:語句ndefault:語句n+1}switch語句執行順序以case中的常量運算式值為入口標號,由此開始順序執行。因此,每個case分支最後應該加break語句。每個常量運算式的值不能相同,次序不影響執行結果。可以是多個語句,但不必用{}。可以是整型、字元型、枚舉型演算法的基本控制結構54使用switch語句應注意的問題case分支可包含多個語句,且不用{}。運算式、判斷值都是int型或char型。若干分支執行內容相同可共用一組語句。演算法的基本控制結構55如何有效地完成重複工作例2-5求自然數1~10之和分析:本題需要用累加演算法,累加過程是一個迴圈過程,可以用while語句實現。演算法的基本控制結構#include<iostream>usingnamespacestd;intmain(){inti(1),sum(0);

while(i<=10)

{sum+=i;//相當於sum=sum+i;i++;

}cout<<"sum="<<sum

<<endl;}運行結果:sum=555657while語句形式while(運算式)語句

可以是複合語句,其中必須含有改變條件運算式值的語句。執行順序先判斷運算式的值,若為true時,執行語句。演算法的基本控制結構58先執行循環體,後判斷條件的情況例2-6

輸入一個整數,將各位數字反轉後輸出。演算法的基本控制結構#include<iostream>usingnamespacestd;intmain(){ intn,right_digit,newnum=0; cout<<"Enterthenumber:"; cin>>n;

cout<<"Thenumberinreverseorderis";

do { right_digit=n%10; cout<<right_digit; n/=10;

//相當於n=n/10

} while(n!=0);cout<<endl;

}59運行結果:Enterthenumber:365Thenumberinreverseorderis5636061do-while語句一般形式do語句while(運算式)可以是複合語句,其中必須含有改變條件運算式值的語句。執行順序先執行循環體語句,後判斷條件。

運算式为true時,繼續執行循環體與while語句的比較:While語句執行順序

先判断表达式的值,为true時,再執行語句演算法的基本控制結構對比下列程式:程式1:#include<iostream>usingnamespacestd;intmain(){inti,sum(0);cin>>i;while(i<=10){sum+=i;i++;}cout<<"sum="<<sum<<endl;}演算法的基本控制結構程式2:#include<iostream>usingnamespacestd;intmain(){inti,sum(0);cin>>i;do{sum+=i;i++;}while(i<=10);

cout<<"sum="<<sum<<endl;}6263for語句語法形式for(運算式1;運算式2;運算式3)語句

迴圈前先求解為true時執行循環體每次執行完循環體後求解演算法的基本控制結構64例2-8輸入一個整數,求出它的所有因數。演算法的基本控制結構#include<iostream>usingnamespacestd;intmain(){ intn,k; cout<<"Enterapositiveinteger:"; cin>>n; cout<<"Number"<<n<<"Factors"; for(k=1;k<=n;k++) if(n%k==0) cout<<k<<"";cout<<endl;}65運行結果1:Enterapositiveinteger:36Number36Factors123469121836運行結果2:Enterapositiveinteger:7Number7Factors176667例2-9編寫程式輸出以下圖案*************************演算法的基本控制結構#include<iostream>usingnamespacestd;intmain(){inti,j,n=4;for(i=1;i<=n;i++)//輸出前4行圖案

{for(j=1;j<=30;j++)cout<<'';//在圖案左側空30列

for(j=1;j<=8-2*i;j++)cout<<'';for(j=1;j<=2*i-1;j++)cout<<'*';cout<<endl;}68for(i=1;i<=n-1;i++)//輸出後3行圖案

{for(j=1;j<=30;j++)cout<<'';//在圖案左側空30列

for(j=1;j<=7-2*i;j++)cout<<'*';cout<<endl;}}6970迴圈結構與選擇結構相互嵌套#include<iostream>usingnamespacestd;intmain(){ intn;

for(n=100;n<=200;n++) {if(n%3!=0) cout<<n; }}演算法的基本控制結構71例2-10讀入一系列整數,統計出正整數個數i和負整數個數j,讀入0則結束。分析:需要讀入一系列整數,但是整數個數不定,要在每次讀入之後進行判斷,因此使用while迴圈最為合適。迴圈控制條件應該是n!=0。由於要判斷數的正負並分別進行統計,所以需要在迴圈內部嵌入選擇結構。演算法的基本控制結構#include<iostream>usingnamespacestd;intmain(){inti=0,j=0,n;cout<<"請輸入若干整數(輸入0則結束):";cin>>n;while(n!=0){if(n>0)i++;if(n<0)j++;cin>>n;}cout<<"正整數個數:"<<i<<"負整數個數:"<<j<<endl;}7273break和continue語句break語句使程式從循環體和switch語句內跳出,繼續執行邏輯上的下一條語句。不宜用在別處。continue語句結束本次迴圈,接著判斷是否執行下一次迴圈。演算法的基本控制結構74typedef語句為一個已有的數據類型另外命名語法形式typedef已有類型名新類型名表;例如typedefdoublearea,volume;typedefintnatural;naturali1,i2;areaa;volumev;自定義數據類型75枚舉類型—enum只要將需要的變數值一一列舉出來,便構成了一個枚舉類型。枚舉類型的聲明形式如下:enum枚舉類型名{變數值列表};例如:enumweekday{sun,mon,tue,wed,thu,fri,sat};自定義數據類型76枚舉類型—enum枚舉類型應用說明:對枚舉元素按常量處理,不能對它們賦值。例如,不能寫:sun=0;枚舉元素具有默認值,它們依次為:0,1,2,。也可以在聲明時另行指定枚舉元素的值,如:enumweekday{sun=7,mon=1,tue,wed,thu,fri,sat};枚舉值可以進行關係運算。整數值不能直接賦給枚舉變數,如需

要將整數賦值給枚舉變數,應進行強

制类型转换。自定義數據類型77例2-11設某次體育比賽的結果有四種可能:勝(win)、負(lose)、平局(tie)、比賽取消(cancel),編寫程式順序輸出這四種情況。分析:由於比賽結果只有四種可能,所以可以聲明一個枚舉類型,聲明一個枚舉類型的變數來存放比賽結果。自定義數據類型#include<iostream>usingnamespacestd;enumgame_result{WIN,LOSE,TIE,CANCEL};intmain(){game_resultresult;enumgame_resultomit=CANCEL;intcount;for(count=WIN;count<=CANCEL;count++){result=(game_result)count;if(result==omit){cout<<"Thegamewascancelled\n";}else{cout<<"Thegamewasplayed";if(result==WIN)cout<<"andwewon!";if(result==LOSE)cout<<"andwelost.";cout<<"\n";}}return0;}78運行結果

Thegamewasplayedandwewon!Thegamewasplayedandwelost.ThegamewasplayedThegamewascancelled7980結構體——結構的聲明結構的概念結構是由不同數據類型的數據組成的集合體。聲明結構類型

struct結構名

{

數據類型成員名1;數據類型成員名2;:數據類型成員名n;

};自定義數據類型81結構體——結構的聲明舉例:structstudent//學生資訊結構體{intnum;//學號

charname[20];//姓名

chargender;//性別

intage;//年齡

floatscore;//成績

charaddr[30];//住址}自定義數據類型82結構體——結構變數說明變數說明形式結構名結構變數名;注意:結構變數的存儲類型概念、它的壽命、可見性及使用範圍與普通變數完全一致。結構變數說明在結構類型聲明之後,二者也可同時進行。結構變數占記憶體大小可用sizeof運算求出:

sizeof(運算量)自定義數據類型83結構體

——結構變數的初始化和使用初始化說明結構變數的同時可以直接設置初值。使用結構體成員的引用形式:

結構變數名.成員名自定義數據類型84例2-12結構體變數的初始化和使用#include<iostream>#include<iomanip>usingnamespacestd;structstudent//學生資訊結構體{intnum;//學號

charname[20];//姓名

chargender;//性別

intage;//年齡}stu={97001,"LinLin",'F',19};intmain(){cout<<setw(7)<<stu.num<<setw(20)<<

<<setw(3)<<stu.sex<<setw(3)<<stu.age;}自定義數據類型運行結果:97001LinLinF1985聯合體聲明形式:union聯合名{

數據類型成員名1;數據類型成員名2;:數據類型成員名n;};聯合體類型變數說明的語法形式聯合名聯合變數名;引用形式:聯合名.成員名自定義數據類型86例:unionuarea{charc_data;shorts_data;longl_data;}uareac_datal_datas_data聯合體自定義數據類型87無名聯合無名聯合沒有標記名,只是聲明一個成員項的集合,這些成員項具有相同的記憶體地址,可以由成員項的名字直接訪問。例:union{inti;floatf;}在程式中可以這樣使用:i=10;f=2.2;自定義數據類型88小結與復習建議主要內容C++語言概述、基本數據類型和運算式、數據的輸入與輸出、演算法的基本控制結構、自定義數據類型達到的目標掌握C++語言的基本概念和基本語句,能夠編寫簡單的程式段。實驗任務實驗二第三章函數清華大學鄭莉C++語言程式設計90本章主要內容函數的聲明和調用函數間的參數傳遞內聯函數帶默認形參值的函數函數重載C++系統函數91函數的聲明函數是面向對象程式設計中,對功能的抽象函數聲明的語法形式類型識別字函數名(形式參數表){

語句序列}函數的聲明與使用是被初始化的內部變數,壽命和可見性僅限於函數內部若無返回值,寫void92函數的聲明形式參數表<type1>name1,<type2>name2,...,<typen>namen函數的返回值由return語句給出,例如:

return0無返回值的函數(void類型),不必寫return語句。函數的聲明與使用93函數的調用調用前先聲明函數原型:在調用函數中,或程式檔中所有函數之外,按如下形式說明:

類型識別字被調用函數名(含類型說明的形參表);調用形式

函數名(實參列表)嵌套調用函數可以嵌套調用,但不允許嵌套定義。遞歸調用函數直接或間接調用自身。函數的聲明與使用94例3-1編寫一個求x的n次方的函數#include<iostream>usingnamespacestd;double

power(doublex,intn);intmain(){ cout<<"5tothepower2is"

<<power(5,2)<<endl;}double

power(doublex,intn){ doubleval=1.0; while(n--)

val=val*x; return(val);}函數的聲明與使用95運行結果:5

tothepower2is25例3-1編寫一個求x的n次方的函數函數的聲明與使用96例3-2數制轉換題目:輸入一個8位二進位數,將其轉換為十進位數輸出。例如:11012=1(23)+1(22)+0(21)+1(20)=1310所以,如果輸入1101,則應輸出13函數的聲明與使用#include<iostream>usingnamespacestd;doublepower(doublex,intn);intmain(){ inti; intvalue=0; charch; cout<<"Enteran8bitbinarynumber"; for(i=7;i>=0;i--) { cin>>ch; if(ch=='1') value+=int(power(2,i)); } cout<<"Decimalvalueis"<<value<<endl;}doublepower(doublex,intn){ doubleval=1.0; while(n--)

val*=x; return(val);}運行結果:Enteran8bitbinarynumber01101001Decimalvalueis1059798例3-3編寫程式求π的值其中arctan用如下形式的級數計算:直到級數某項絕對值不大於10-15為止;π和x均為double型。函數的聲明與使用#include<iostream>usingnamespacestd;intmain(){doublea,b;doublearctan(doublex);//函數原型聲明

a=16.0*arctan(1/5.0);b=4.0*arctan(1/239.0);//注意:因為整數相除結果取整,

//如果參數寫1/5,1/239,結果就都是0cout<<"PI="<<a-b<<endl;}99doublearctan(doublex){inti;doubler,e,f,sqr;sqr=x*x;r=0;e=x;i=1;while(e/i>1e-15){f=e/i;r=(i%4==1)?r+f:r-f;e=e*sqr;i+=2;}returnr;}運行結果:PI=33-4尋找並輸出11~999之間的數m,它滿足m、m2和m3均為回文數。回文:各位數字左右對稱的整數。

例如:11滿足上述條件

112=121,113=1331。分析:10取餘的方法,從最低位開始,依次取出該數的各位數字。按反序重新構成新的數,比較與原數是否相等,若相等,則原數為回文。函數的聲明與使用#include<iostream>usingnamespacestd;intmain(){boolsymm(longn);longm;for(m=11;m<1000;m++)if(symm(m)&&symm(m*m)&&symm(m*m*m))cout<<"m="<<m<<"m*m="<<m*m<<"m*m*m="<<m*m*m<<endl;}102boolsymm(longn){longi,m;i=n;m=0;while(i){m=m*10+i%10;i=i/10;}return(m==n);}103運行結果:m=11m*m=121m*m*m=1331m=101m*m=10201m*m*m=1030301m=111m*m=12321m*m*m=1367631104105例3-5計算如下公式,並輸出結果:其中r、s的值由鍵盤輸入。sinx的近似值按如下公式計算,計算精度為10-6:函數的聲明與使用#include<iostream>#include<cmath>usingnamespacestd;intmain(){doublek,r,s;doubletsin(doublex);cout<<"r=";cin>>r;cout<<"s=";cin>>s;if(r*r<=s*s)k=sqrt(tsin(r)*tsin(r)+tsin(s)*tsin(s));elsek=tsin(r*s)/2;cout<<k<<endl;}106doubletsin(doublex){doublep=0.000001,g=0,t=x;intn=1;do{g=g+t;n++;t=-t*x*x/(2*n-1)/(2*n-2);}while(fabs(t)>=p);returng;}運行結果:r=5s=81.37781107108例3-6投骰子的隨機遊戲每個骰子有六面,點數分別為1、2、3、4、5、6。遊戲者在程式開始時輸入一個無符號整數,作為產生亂數的種子。每輪投兩次骰子,第一輪如果和數為7或11則為勝,遊戲結束;和數為2、3或12則為負,遊戲結束;和數為其他值則將此值作為自己的點數,繼續第二輪、第三輪...直到某輪的和數等於點數則取勝,若在此前出現和數為7則為負。由rolldice函數負責模擬投骰子、計算和數並輸出和數。函數的聲明與使用#include<iostream>#include<cstdlib>usingnamespacestd;introlldice(void);intmain(){intgamestatus,sum,mypoint;unsignedseed;cout<<"Pleaseenteranunsignedinteger:";cin>>seed;//輸入亂數種子

srand(seed);//將種子傳遞給rand()sum=rolldice();//第一輪投骰子、計算和數109switch(sum){case7://如果和數為7或11則為勝,狀態為1case11:gamestatus=1;break;case2://和數為2、3或12則為負,狀態為2case3:case12:gamestatus=2;break;default://其他情況,遊戲尚無結果,狀態為0,記下點數,為下一輪做準備

gamestatus=0;mypoint=sum;cout<<"pointis"<<mypoint<<endl;break;}110while(gamestatus==0)//只要狀態仍為0,就繼續進行下一輪

{sum=rolldice();if(sum==mypoint)//某輪的和數等於點數則取勝,狀態置為1gamestatus=1elseif(sum==7)//出現和數為7則為負,狀態置為2gamestatus=2;}//當狀態不為0時上面的迴圈結束,以下程式段輸出遊戲結果

if(gamestatus==1)cout<<"playerwins\n";elsecout<<"playerloses\n";}111rand函數原型:intrand(void);所需頭檔:<cstdlib>功能和返回值:求出並返回一個偽亂數srand函數原型:voidsrand(unsignedintseed);參數:seed產生亂數的種子。所需頭檔:<cstdlib>功能:為使rand()產生一序列偽隨機整數而設置起始點。使用1作為seed參數,可以重新初化rand()。112introlldice(void){//投骰子、計算和數、輸出和數

intdie1,die2,worksum;die1=1+rand()%6;die2=1+rand()%6;worksum=die1+die2;cout<<"playerrolled"<<die1<<'+'<<die2<<'='<<worksum<<endl;returnworksum;}113運行結果2:Pleaseenteranunsignedinteger:23playerrolled6+3=9pointis9playerrolled5+4=9playerwins114115函數調用的執行過程函數的聲明與使用main()調fun()結束fun()返回①②④⑥⑦保存:返回地址當前現場③恢復:主調程式現場返回地址⑤116嵌套調用函數的聲明與使用main{}調fun1()結束fun1()調fun2()返回fun2()返回①②③⑦④⑤⑥⑧⑨117例3-6輸入兩個整數,求平方和。#include<iostream>usingnamespacestd;intmain(){inta,b;intfun1(intx,inty);cin>>a>>b;cout<<"a、b的平方和:"

<<fun1(a,b)<<endl;}函數的聲明與使用intfun1(intx,inty){intfun2(intm);return(fun2(x)+fun2(y));}intfun2(intm){return(m*m);}運行結果:34a、b的平方和:25118119遞歸調用函數直接或間接地調用自身,稱為遞歸調用。遞歸過程的兩個階段:遞推:

4!=4×3!→3!=3×2!→2!=2×1!→1!=1×0!→0!=1未知已知回歸:4!=4×3!=24←3!=3×2!=6←2!=2×1!=2←1!=1×0!=1←0!=1未知已知函數的聲明與使用120例3-8求n!分析:計算n!的公式如下:這是一個遞歸形式的公式,應該用遞歸函數實現。函數的聲明與使用根源程式:#include<iostream>usingnamespacestd;longfac(intn){longf;if(n<0)cout<<"n<0,dataerror!"<<endl;

elseif(n==0)f=1;elsef=fac(n-1)*n;return(f);}121intmain(){longfac(intn);intn;longy;cout<<"Enterapositiveinteger:";cin>>n;y=fac(n);cout<<n<<"!="<<y<<endl;}運行結果:Enterapositiveinteger:88!=40320122123例3-9用遞歸法計算從n個人中選擇k個人組成一個委員會的不同組合數。分析:由n個人裏選k個人的組合數

=由n-1個人裏選k個人的組合數

+由n-1個人裏選k-1個人的組合數當n==k或k==0時,組合數為1函數的聲明與使用#include<iostream>usingnamespacestd;intmain(){intn,k;intcomm(intn,intk);cin>>n>>k;cout<<comm(n,k)<<endl;}intcomm(intn,intk){if(k>n)return0;elseif(n==k||k==0)return1;elsereturncomm(n-1,k)+comm(n-1,k-1);}運行結果:1858568124125例3-10漢諾塔問題有三根針A、B、C。A針上有N個盤子,大的在下,小的在上,要求把這N個盤子從A針移到C針,在移動過程中可以借助B針,每次只允許移動一個盤,且在移動過程中在三根針上都保持大盤在下,小盤在上。函數的聲明與使用ABC分析:將n個盤子從A針移到C針可以分解為下麵三個步驟:①將A上n-1個盤子移到B針上(借助C針);②把A針上剩下的一個盤子移到C針上;③將n-1個盤子從B針移到C針上(借助A針);事實上,上面三個步驟包含兩種操作:①將多個盤子從一個針移到另一個針上,這是一個遞歸的過程。hanoi函數實現。②將1個盤子從一個針上移到另一針上。

用move函數實現。126#include<iostream>usingnamespacestd;voidmove(chargetone,charputone){cout<<getone<<"-->"<<putone<<endl;}voidhanoi(intn,charone,chartwo,charthree){ voidmove(chargetone,charputone); if(n==1)move(one,three); else {hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three); }}127intmain(){ voidhanoi(intn,charone,chartwo,charthree); intm; cout<<"Enterthenumberofdiskes:"; cin>>m; cout<<"thestepstomoving"<<m<<"diskes:"<<endl; hanoi(m,'A','B','C');}128運行結果:Enterthenumberofdiskes:3thestepstomoving3diskes:A-->CA-->BC-->BA-->CB-->AB-->CA-->C129130函數的參數傳遞機制

——傳遞參數值在函數被調用時才分配形參的存儲單元。實參可以是常量、變數或運算式。實參類型必須與形參相符。傳遞時是傳遞參數值,即單向傳遞。函數的聲明與使用131函數的參數傳遞機制

——參數值傳遞舉例XN被調函數:主調函數:32.5AD=power(A,3)2.53doublepower(doubleX,intN)函數的聲明與使用132例3-11輸入兩個整數交換後輸出#include<iostream>usingnamespacestd;voidSwap(inta,intb);intmain(){ intx(5),y(10); cout<<"x="<<x<<"y="<<y<<endl;

Swap(x,y); cout<<"x="<<x<<"y="<<y<<endl; return0;}函數的聲明與使用voidSwap(inta,intb){ intt; t=a; a=b; b=t;}運行結果: x=5y=10 x=5y=10133a=b;5x10y5a10b執行主函數中的函數調用Swap(x,y);t=a;5x10y5a10b5tb=t;5x10y10a5b5t5x10y10a10b5t在Swap子函數中返回主函數以後5x10y134134135函數的參數傳遞

——用引用做形參引用(&)是識別字的別名,例如:inti,j;

int&ri=i;

//建立一個int型的引用ri,並將其

//初始化為變數i的一個別名

j=10;

ri=j;//相当于i=j;聲明一個引用時,必須同時對它進行初始化,使它指向一個已存在的對象。一旦一個引用被初始化後,就不能改為指向其他對象。引用可以作為形參

voidswap(int&a,int&b){...}函數的聲明與使用136例3-12輸入兩個整數交換後輸出#include<iostream>usingnamespacestd;voidSwap(int&a,int&b);intmain(){ intx(5),y(10); cout<<"x="<<x<<"y="<<y<<endl;

Swap(x,y); cout<<"x="<<x<<"y="<<y<<endl; return0;}voidSwap(int&a,int&b){ intt; t=a; a=b; b=t;}函數的聲明與使用運行結果:x=5y=10x=10y=5t=a;x5t5x的別名axy510y的別名x的別名aby的別名x的別名abx10y10a=bb=t;y5t5y的地址bxy105Swap(x,y);137138內聯函數聲明與使用聲明時使用關鍵字inline。編譯時在調用處用函數體進行替換,節省了參數傳遞、控制轉移等開銷。注意:內聯函數體內不能有迴圈語句和switch語句。內聯函數的定義必須出現在內聯函數第一次被調用之前。對內聯函數不能進行異常介面聲明。內聯函數139例3-14內聯函數應用舉例#include<iostream>usingnamespacestd;inlinedoubleCalArea(doubleradius){ return3.14*radius*radius;}intmain(){ doubler(3.0); doublearea; area=CalArea(r); cout<<area<<endl; return0;}內聯函數140默認形參值的作用函數在聲明時可以預先給出默認的形參值,調用時如給出實參,則採用實參值,否則採用預先給出的默認形參值。例如:intadd(intx=5,inty=6){returnx+y;}intmain(){add(10,20);//10+20add(10);//10+6add();//5+6}帶默認形參值的函數141默認形參值的說明次序默認形參值必須從右向左順序聲明,並且在默認形參值的右面不能有非默認形參值的參數。因為調用時實參取代形參是從左向右的順序。例:intadd(intx,inty=5,intz=6);//正確intadd(intx=1,inty=5,intz);//錯誤intadd(intx=1,inty,intz=6);//錯誤帶默認形參值的函數142默認形參值與函數的調用位置調用出現在函數體實現之前時,默認形參值必須在函數原形中給出;而當調用出現在函數體實現之後時,默認形參值需在函數實現時給出。例:intadd(intx=5,inty=6);intmain(){add();

//調用在實現前}intadd(intx,inty){returnx+y;}intadd(intx=5,inty=6){returnx+y;}intmain(){add();

//調用在實現後}帶默認形參值的函數143默認形參值的作用域在相同的作用域內,默認形參值的說明應保持惟一,但如果在不同的作用域內,允許說明不同的默認形參。例:intadd(intx=1,inty=2);intmain(){intadd(intx=3,inty=4);add();//使用局部默認形參值(實現3+4)}voidfun(){...

add();//使用全局默認形參值(實現1+2)}帶默認形參值的函數144重載函數的聲明C++允許功能相近的函數在相同的作用域內以相同函數名聲明,從而形成重載。方便使用,便於記憶。例:形參類型不同intadd(intx,inty);floatadd(floatx,floaty);形參個數不同intadd(intx,inty);intadd(intx,inty,intz);

函數重載145注意事項不要將不同功能的函數聲明為重載函數,以免出現調用結果的誤解、混淆。這樣不好:intadd(intx,inty);intadd(inta,intb);編譯器不以形參名來區分intadd(intx,inty);voidadd(intx,inty);編譯器不以返回值來區分intadd(intx,inty){returnx+y;}floatadd(floatx,floaty){returnx-y;}

函數重載重載函數的形參必須不同:個數不同或類型不同。編譯程序將根據實參和形參的類型及個數的最佳匹配來選擇調用哪一個函數。146例3-16重載函數應用舉例編寫三個名為add的重載函數,分別實現兩整數相加、兩實數相加和兩個複數相加的功能。#include<iostream>usingnamespacestd;structcomplex{ doublereal; doubleimaginary;};

函數重載intmain(){ intm,n; doublex,y; complexc1,c2,c3; intadd(intm,intn); doubleadd(doublex,doubley); complexadd(complexc1,complexc2); cout<<"Entertwointeger:"; cin>>m>>n; cout<<"integer<<m<<'+'<<n<<"="<<add(m,n)<<endl;147 cout<<"Entertworealnumber:"; cin>>x>>y; cout<<"realnumber"<<x<<'+'<<y<<"="<<add(x,y)<<endl; cout<<"Enterthefirstcomplexnumber:"; cin>>c1.real>>c1.imaginary; cout<<"Enterthesecondcomplexnumber:"; cin>>c2.real>>c2.imaginary; c3=add(c1,c2); cout<<"complexnumber("<<c1.real<<','<<c1.imaginary<<")+("<<c2.real<<','<<c2.imag

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论