《C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐》 課件 第6章 函數(shù)_第1頁
《C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐》 課件 第6章 函數(shù)_第2頁
《C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐》 課件 第6章 函數(shù)_第3頁
《C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐》 課件 第6章 函數(shù)_第4頁
《C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐》 課件 第6章 函數(shù)_第5頁
已閱讀5頁,還剩38頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第6章函數(shù)6.1定義及調(diào)用函數(shù)6.2遞歸函數(shù)6.3重載函數(shù)6.4函數(shù)模板6.5參數(shù)默認(rèn)值6.6內(nèi)聯(lián)函數(shù)6.7多文件項(xiàng)目6.8標(biāo)準(zhǔn)庫函數(shù)6.9應(yīng)用6.10小結(jié)1每一個(gè)C++程序都包含main函數(shù)。函數(shù)是程序中實(shí)現(xiàn)某個(gè)功能的代碼模塊。在C++程序設(shè)計(jì)過程中,可以將一個(gè)規(guī)模較大的程序分解成若干規(guī)模較小的模塊,每一個(gè)模塊用一個(gè)函數(shù)來實(shí)現(xiàn),這樣程序會(huì)更容易閱讀、糾錯(cuò)和維護(hù)。26.1函數(shù)返回值類型函數(shù)名(參數(shù)列表){ 函數(shù)體}返回值類型為各類基礎(chǔ)數(shù)據(jù)類型,自定義數(shù)據(jù)類型以及類等。如果函數(shù)不需要返回任何值,返回值類型可以為void。函數(shù)名為標(biāo)識(shí)符。參數(shù)列表為可選項(xiàng)。若有參數(shù)列表,則可以定義傳入函數(shù)的各參數(shù),多個(gè)參數(shù)之間用逗號隔開,若沒有參數(shù),則可以空白,也可以用void填充。有參數(shù)的函數(shù)稱為有參函數(shù),沒有參數(shù)的函數(shù)稱為無參函數(shù)。函數(shù)體即為實(shí)現(xiàn)函數(shù)功能的一組程序語句。3無參函數(shù)實(shí)例01#include<iostream>02usingnamespacestd;03voidprintStars()04{05cout<<"**********"<<endl;06}07intprintHello(void)08{09cout<<"**Hello!**"<<endl;10return0;11}12intmain()13{14printStars();15printHello();16printStars();17return0;18}4有參函數(shù)實(shí)例01#include<iostream>02usingnamespacestd;03voidprintStars(intn)04{05for(inti=0;i<n;i++)06{07cout<<'*';08}09cout<<endl;10}11intmain()12{13printStars(10);14printStars(20);15printStars(30);16return0;17}5顯示行數(shù)列數(shù)可變的星號*01#include<iostream>02usingnamespacestd;03voidprintStars(intm,intn)04{05for(inti=0;i<m;i++)06{07for(intj=0;j<n;j++)08{09cout<<'*';10}11cout<<endl;12}13}14intmain()15{16introws=5;17intcols=10;18printStars(rows,cols);19return0;20}6求解兩個(gè)整數(shù)的較大值01#include<iostream>02usingnamespacestd;03intmax(intx,inty)04{05 intz;06 if(x>y)07 {08 z=x;09 }10 else11 {12 z=y;13 }14 returnz;15}1617intmain()18{19 inta=3,b=4;20 intc=max(a,b);21 cout<<c<<endl; 22 return0;23}7當(dāng)函數(shù)形參的數(shù)據(jù)類型為基礎(chǔ)數(shù)據(jù)類型時(shí),調(diào)用函數(shù)時(shí)候?qū)嶋H參數(shù)將單向復(fù)制給形式參數(shù),形參在函數(shù)內(nèi)部的改變不會(huì)影響主調(diào)函數(shù)的實(shí)參。8例6.5交換兩個(gè)整數(shù)yxtemp123(a)參數(shù)交換原理主函數(shù)作用域被調(diào)函數(shù)作用域

a=20a=7單向按值傳遞返回(b)參數(shù)傳遞原理9交換兩個(gè)整數(shù)01#include<iostream>02usingnamespacestd;03intmyswap(intx,inty)04{05cout<<"enterfunction:x="<<x<<",y="<<y<<endl;06inttemp=x;07x=y;08y=temp;09cout<<"leavefunction:x="<<x<<",y="<<y<<endl;10return0;11}10交換兩個(gè)整數(shù)12intmain()13{14inta=7,b=8;15cout<<"beforeswap:a="<<a<<",b="<<b<<endl;16myswap(a,b);17cout<<"afterswap:a="<<a<<",b="<<b<<endl;18return0;19}11函數(shù)聲明函數(shù)聲明的語法形式為:數(shù)據(jù)類型函數(shù)名(參數(shù)列表);01#include<iostream>02usingnamespacestd;03intgcd(intm,intn);04intmain()05{06inta=32,b=16;07intc=gcd(a,b);08cout<<"greatestcommon

divisor:"<<c<<endl;09cout<<"leastcommonmultiple:"<<a*b/c<<endl;10return0;11}12intgcd(intm,intn)13{14for(inti=m;i>=2;i--)15{16if(m%i==0&&n%i==0)17{18returni;19}20}21return1;22}12變量作用域程序中的每一個(gè)變量都有一定的作用范圍,稱為變量的作用域,不在這個(gè)作用域內(nèi),是不能對變量進(jìn)行操作的,如書寫訪問不在作用域范圍內(nèi)的變量代碼則在編譯階段就會(huì)報(bào)錯(cuò)。變量根據(jù)其作用范圍可以分成全局變量和局部變量兩大類。全局變量的作用域是在全文件范圍內(nèi)有效。局部變量包括函數(shù)內(nèi)部定義的變量,程序塊內(nèi)定義的變量,函數(shù)聲明部分定義的變量。1301#include<iostream>02usingnamespacestd;03boolisPrime(intx);04intgcnt=0;05intmain()06{07intlcnt=0;08for(inti=1;i<=100;i++)09{10if(isPrime(i))11{12lcnt++;13}14}15cout<<"lcnt="<<lcnt<<endl;16cout<<"gcnt="<<gcnt<<endl;17return0;18}例6.7計(jì)算某個(gè)1-100范圍內(nèi)的素?cái)?shù)的個(gè)數(shù)1419boolisPrime(intn)20{21gcnt++;22boolret=true;23for(inti=2;i<=n/2;i++)24{25if(n%i==0)26{27ret=false;28break;29}30}31returnret;32}156.2遞歸函數(shù)直接遞歸間接遞歸voidF(){

;

F();

;}voidF(){

;G();

;}voidF(){

;

F();

;}16F()作用域startreturn直接調(diào)用F()

F()作用域G()作用域調(diào)用G()調(diào)用回F()(a)直接遞歸調(diào)用(b)間接遞歸調(diào)用17例6.8求n的階乘,n為大于0的整數(shù)。問題描述:n的階乘即為n!=1*2*3….*n。當(dāng)n=1的時(shí)候n!=1。6.2.1可用公式描述的問題mainmainmainmainfac(3)fac(2)fac(2)n=3n=2n=1(1)初始(2)運(yùn)行main(3)調(diào)用fac(3)(4)調(diào)用fac(2)(5)調(diào)用fac(1)

mainfac(3)fac(2)fac(1)mainfac(2)fac(3)mainmainfac(3)126(6)從fac(1)返回(7)從fac(2)返回(8)從fac(3)返回(9)繼續(xù)運(yùn)行main(10)結(jié)束1801#include<iostream>02usingnamespacestd;0304intfac(intn)05{06if(n==1)07return1;08returnn*fac(n-1);09}1011intmain()12{13cout<<fac(3)<<endl;14return0;15}19例6.9漢諾塔問題問題描述:有三根相鄰的柱子,標(biāo)號為A,B,C,A柱子上從下到上按金字塔狀疊放著n個(gè)不同大小的圓盤(編號從上到下為從1到n),要把所有盤子一個(gè)一個(gè)從A移動(dòng)到柱子B上(借助于柱子C的輔助),并且每次移動(dòng)同一根柱子上都不能出現(xiàn)大盤子在小盤子上方。6.2.2不可用公式描述的問題11aabcbca、abcbc11aabcbc11aabcbc112001#include<iostream>02usingnamespacestd;0304voidmoveDisks(intn,charfrom,charto,charaux)05{06if(n==1)07{08cout<<"disk"<<n<<":"<<from<<"->"<<to<<endl;09}10else11{12moveDisks(n-1,from,aux,to);13cout<<"disk"<<n<<":"<<from<<"->"<<to<<endl;14moveDisks(n-1,aux,to,from);15}16}18intmain()19{20moveDisks(3,'A','B','C');21return0;22}216.3重載函數(shù)01#include<iostream>02#include<cmath>03usingnamespacestd;0405doublearea(doubler)06{07constdoublePI=3.14;08doubleS=PI*r*r;09returnS;10}1112doublearea(doublea,doubleb,doublec)13{14doublep=(a+b+c)/2;15doubleS=sqrt(p*(p-a)*(p-b)*(p-c));16returnS;17}19doublearea(doublea,doubleb)20{21doubleS=a*b;22returnS;23}2425intmain()26{27doubles1=area(5.0);28cout<<"areaofcircle:\t\t"<<s1<<endl;29doubles2=area(3.0,4.0);30cout<<"areaofrectangle:\t"<<s2<<endl;31doubles3=area(3.0,4.0,5.0);32cout<<"areaoftriangle:\t"<<s3<<endl;33return0;34}226.4函數(shù)模板函數(shù)模板就是形參類型或返回值類型用虛擬類型替代的通用函數(shù)。在調(diào)用該函數(shù)時(shí),系統(tǒng)會(huì)根據(jù)實(shí)參的類型來替代函數(shù)模板中的虛擬類型,從而可以實(shí)現(xiàn)不同類型下的函數(shù)功能,相當(dāng)于一個(gè)通用函數(shù)實(shí)現(xiàn)了多個(gè)相同功能邏輯的不同函數(shù),唯一的區(qū)別就是這些函數(shù)的參數(shù)類型或返回類型不同。2301#include<iostream>02usingnamespacestd;0304template<typenameT>05Ttmin(Ta,Tb)06{07return(a<b)?a:b;08}函數(shù)模板求最小值10intmain()11{12inti1=3,i2=4;13doubled1=3.5,d2=4.5;14charc1='a',c2='b';15inti=tmin(i1,i2);16cout<<i<<endl;17doubled=tmin(d1,d2);18cout<<d<<endl;19charc=tmin(c1,c2);20cout<<c<<endl;21}2401#include<iostream>02usingnamespacestd;0304doubleenerge(doublem,doubleh=1,doubleg=9.8)05{ 06returnm*g*h;07}0809intmain()10{11doublee1=energe(2.5,10,10);12cout<<e1<<endl;13doublee2=energe(3.5,20);14cout<<e2<<endl;15doublee3=energe(4.5);16cout<<e3<<endl;17}6.5參數(shù)默認(rèn)值256.6內(nèi)聯(lián)函數(shù)01#include<iostream>02usingnamespacestd;0304inlineintimax(inta,intb)05{06return(a>b)?a:b;07}0809intmain()10{11inti=20,j=30;12cout<<imax(i,j)<<endl;13return0;14}266.7多項(xiàng)目文件當(dāng)一個(gè)軟件項(xiàng)目的規(guī)模很大時(shí),不可能把所有的函數(shù)都完整定義在包含main函數(shù)所在的文件中,此時(shí)就需要對整個(gè)軟件項(xiàng)目進(jìn)行劃分,一種簡單的劃分方法是將具有類似功能的函數(shù)聲明都放在一個(gè)頭文件(*.h)中,在使用的時(shí)候只要使用include“*.h”這種方法將該頭文件包含進(jìn)來即可以調(diào)用該頭文件中聲明的函數(shù)。下面以codeblocks為例,在現(xiàn)有項(xiàng)目中補(bǔ)充增加”*.h”文件以及”*.cpp”文件。在現(xiàn)有項(xiàng)目中,選擇菜單File->New->File…菜單,彈出如下對話框界面,選擇左側(cè)的Files分支,其中”C/C++header”可以生成頭文件(*.h),而”C/C++source”可以生成源碼文件(*.cpp)。2728例6.14計(jì)算圓柱體的體積和重量01#include<iostream>02#include"volume.h"03usingnamespacestd;0405intmain()06{07doublev=vol(5.0,4.0);08cout<<v<<endl;09doublew=weight(1.0,1.0);10cout<<w<<endl;11}生成volume.h文件01#definePI3.1402constdoubleG=9.8;03doublevol(doubler,doubleh);04doubleweight(double,doubleh);main.cpp01#include"volume.h"02doublevol(doubler,doubleh)03{04returnPI*r*r*h;05}0607doubleweight(doubler,doubleh)08{09returnvol(r,h)*G;10}生成volume.cpp文件29軟件開發(fā)過程中,開發(fā)者不可能事無巨細(xì)地設(shè)計(jì)每一個(gè)廣泛使用的函數(shù),C++編譯器提供了許多普遍適用的標(biāo)準(zhǔn)庫函數(shù),這些函數(shù)覆蓋了從基本輸入輸出,到數(shù)學(xué)處理,字符串處理等,這些都為軟件開發(fā)提供了極大的方便。6.8標(biāo)準(zhǔn)庫函數(shù)306.8.1數(shù)學(xué)函數(shù)01#include<iostream>02#include<cmath>03usingnamespacestd;04intmain(){05constdoublePI=3.1415926;06doublex=4.0;07doubley=3.0;0809//平方根10doublesqrtResult=sqrt(x);1112//絕對值13doubleabsResult=abs(-10.5);15//取整16doublefloorResult=floor(4.8);17doubleceilResult=ceil(4.8);18doubleroundResult=round(4.8);1920//冪運(yùn)算21doublepowResult=pow(x,y);2223//三角函數(shù)24doublesinResult=sin(PI/2);25doublecosResult=cos(PI/3);26doubletanResult=tan(PI/4);27316.8.1數(shù)學(xué)函數(shù)28cout<<"平方根:"<<sqrtResult<<endl;29cout<<"絕對值:"<<absResult<<endl;30cout<<"取整:"<<floorResult<<","<<ceilResult<<","<<roundResult<<endl;31cout<<"冪運(yùn)算:"<<powResult<<endl;32cout<<"正弦:"<<sinResult<<endl;33cout<<"余弦:"<<cosResult<<endl;34cout<<"正切:"<<tanResult<<endl;3536return0;37}326.8.2輸出及輸入格式(1)scanf輸入格式控制C語言中的scanf(格式控制,輸入表列)控制字符說明%c一個(gè)單一的字符%d一個(gè)十進(jìn)制整數(shù)%i一個(gè)整數(shù)%e,%f,%g一個(gè)浮點(diǎn)數(shù)%o一個(gè)八進(jìn)制數(shù)%s一個(gè)字符串%x一個(gè)十六進(jìn)制數(shù)%p一個(gè)指針%n一個(gè)等于讀取字符數(shù)量的整數(shù)%u一個(gè)無符號整數(shù)%[]一個(gè)字符集%%一個(gè)精度符號33(2)printf輸出格式控制C語言中的printf(格式控制,輸出表列)控制字符說明%c字符%d帶符號整數(shù)%i帶符號整數(shù)%e科學(xué)計(jì)數(shù)法,使用小寫”e”%E科學(xué)計(jì)數(shù)法,使用大寫”E”%f浮點(diǎn)數(shù)%g使用%e或%f中較短的一個(gè)%G使用%E或%f中較短的一個(gè)%o八進(jìn)制%s一串字符%u無符號整數(shù)%x無符號十六進(jìn)制數(shù),用小寫字母%X無符號十六進(jìn)制數(shù),用大寫字母%p一個(gè)指針%n參數(shù)應(yīng)該是一個(gè)指向一個(gè)整數(shù)的指針指向的是字符數(shù)放置的位置%%一個(gè)’%’符號34例6.16利用C語言的scanf和printf函數(shù)輸入輸出數(shù)據(jù)示例01#include<cstdio>02intmain(){03//輸入輸出一個(gè)字符04charch;05scanf("%c",&ch);06printf("%c\n",ch);07//輸入輸出一個(gè)整數(shù)08inti1;09scanf("%d",&i1);10printf("%d\n",i1);11//輸入浮點(diǎn)數(shù),并按兩種方式輸出12floatf1;13scanf("%f",&f1);14printf("%f\t%E\n",f1,f1);15//輸入一個(gè)定長的整數(shù)16inti2;17scanf("%2i",&i2);18printf("%i\n",i2);19return0;20}35(3)C++中的格式控制控制符說明dec基數(shù)為10,相當(dāng)于”%d”hex基數(shù)為16,相當(dāng)于”%X”oct基數(shù)為8,相當(dāng)于”%o”setfill(c)填充字符為csetprecision(n)設(shè)顯示小數(shù)精度為n位setw(n)設(shè)置域?qū)挒閚個(gè)字符setioflags(ios::fixed)固定的浮點(diǎn)顯示setioflags(ios::scientific)科學(xué)計(jì)數(shù)法表示(指數(shù)表示)setiosflags(ios::left)左對齊setiosflags(ios::right)右對齊setiosflags(ios::skipws)忽略前導(dǎo)空白setiosflags(ios::uppercase)16進(jìn)制數(shù)大寫輸出setiosflags(ios::lowercase)16進(jìn)制小寫輸出setiosflags(ios::showpoint)強(qiáng)制顯示小數(shù)點(diǎn)setiosflags(ios::showpos)對于正數(shù),強(qiáng)制顯示”+”號36例6.16利用C++語言的格式控制符輸入輸出整數(shù)示例01#include<iostream>02#include<iomanip>03usingnamespacestd;04intmain(){05inta;06//輸入八進(jìn)制07cin>>oct>>a;08cout<<a<<endl;

//輸入十六進(jìn)制09cin>>hex>>a;10cout<<a<<endl;

//輸入十進(jìn)制11cin>>dec>>a;

//不同形式的整數(shù)輸出12cout<<oct<<a<<endl;13cout<<hex<<a<<endl;14cout<<dec<<a<<endl;15cout<<setw(10)<<a<<endl;16

cout<<setiosflags(ios::showpos)<<a<<endl;17cout<<setfill('#')<<setw(10)<<a<<endl;18return0;19}37例6.16利用C++語言的格式控制符輸入輸出浮點(diǎn)數(shù)示例01#include<iostream>02#include<iomanip>03usingnamespacestd;04intmain(){05doublea=1234.56789;06//默認(rèn)格式輸出07cout<<a<<endl;08//設(shè)置8個(gè)有效數(shù)字輸出 09cout<<setprecision(8)<<a<<endl;10//恢復(fù)到默認(rèn)格式輸出11cout<<setprecision(6)<<a<<endl;12//固定小數(shù)點(diǎn)后2位輸出13cout<<setprecision(4)<<setiosflags(ios::fixed)<<a<<endl;14//固定小數(shù)點(diǎn)后6位科學(xué)計(jì)數(shù)法輸出15cout<<resetiosflags(ios::fixed);16cout<<setiosflags(ios::scientific)<<setprecision(6)<<a<<endl;17//固定小數(shù)點(diǎn)后3位輸出18cout<<resetiosflags(ios::scientific);19cout<<setiosflags(ios::fixed)<<setprecision(3)<<a<<endl;20return0;21}386.9應(yīng)用例6.19編碼實(shí)現(xiàn)數(shù)學(xué)函數(shù)sin(x)思路:利用泰勒展開式sin(x)=,可以發(fā)現(xiàn)后一項(xiàng)/前一項(xiàng)的比值為有規(guī)律的值,k從1開始。39程序代碼:01

#include<iostream>02

usingnamespacestd;03

04

doublesin(doublex)05

{06

constdoubleTINY=1e-6;07

doubles=0;08

doublet=1;09

doublexi=x;10

for(inti=0;;i++)11

{12

xi=xi*t;13

s+=xi;14

t=-1.0*x*x/(2*i+2)/(2*i+3);15

if(-1*t<TINY)16

{17

break;18

cout<<i<<endl;19

}20

}21

returns;22

}24

intmain(){25

constdoublePI=3.1415926;26

cout<<sin(0)<<endl;27

cout<<sin(PI/6)<<endl;

溫馨提示

  • 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

提交評論