版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C++高級語言程序設計第5章函數(shù)北京郵電大學信息與通信工程學院程序設計中,把具有一定功能的程序模塊用函數(shù)或類來實現(xiàn)。2025/10/22北京郵電大學信息與通信工程學院-2-第5章函數(shù)內容函數(shù)定義、聲明、函數(shù)的調用、函數(shù)參數(shù)傳遞機制函數(shù)的特殊形式,包括遞歸函數(shù)、內聯(lián)函數(shù)、帶默認參數(shù)值的函數(shù)標識符的作用域和可見性變量的存儲類型和生存期2025/10/22北京郵電大學信息與通信工程學院-3-5.1函數(shù)概述結構化程序設計,將整個程序自頂向下分為若干個程序模塊,每個模塊用來實現(xiàn)一個特定的功能。C++中的模塊以函數(shù)和類的形式實現(xiàn)。函數(shù)是具有一定功能又經常使用的相對獨立代碼段。無論是面向過程的程序設計還是面向對象的程序設計,函數(shù)都是一種實現(xiàn)算法的重要形式。2025/10/22北京郵電大學信息與通信工程學院-4-5.1函數(shù)概述函數(shù)接口(規(guī)定接口形式)函數(shù)名(命名規(guī)則與變量相同,見名知意)函數(shù)類型(返回值類型)形式參數(shù)表函數(shù)體(實現(xiàn)算法—三種基本結構組合而成)常用的函數(shù)C++的庫函數(shù)自定義的函數(shù)2025/10/22北京郵電大學信息與通信工程學院-5-5.1.1自定義函數(shù)概述編程者在處理具體問題時,將程序中多處使用的、實現(xiàn)一定功能的特定代碼段定義成函數(shù)。這樣的函數(shù)稱為自定義函數(shù)。在同一個程序中,一個函數(shù)只能定義一次。一般是通過函數(shù)調用來使用函數(shù)。函數(shù)調用需要指定函數(shù)名并且提供被調用函數(shù)所需的信息(即函數(shù)參數(shù))。2025/10/22北京郵電大學信息與通信工程學院-6-5.1.1自定義函數(shù)概述例如要打印某一年某一月的月歷2025/10/22北京郵電大學信息與通信工程學院-7-5.1.2庫函數(shù)概述C++
標準庫提供了豐富的函數(shù)集合,可以進行常用的數(shù)學計算、字符串操作、字符操作、輸入/輸出、錯誤檢查和許多其他操作。要熟悉C++
標準庫提供的類和函數(shù)集合,不要事事從頭做起,要盡可能利用C++
標準庫提供的函數(shù),以便減少程序開發(fā)的時間。這是程序設計的技巧之一。2025/10/22北京郵電大學信息與通信工程學院-8-5.1.2庫函數(shù)概述數(shù)學庫函數(shù)實現(xiàn)常見的數(shù)學計算使用時,在程序中嵌入cmath頭文件,按對應庫函數(shù)的接口形式寫調用語句。調用數(shù)學函數(shù):函數(shù)名(參數(shù)1,…,參數(shù)n)
例如:doublex;x=sqrt(900.0);cout<<x;數(shù)學函數(shù)庫中的多數(shù)函數(shù)都返回double類型結果。2025/10/22北京郵電大學信息與通信工程學院-9-2025/10/22北京郵電大學信息與通信工程學院-10-常用數(shù)學庫函數(shù)函
數(shù)說
明舉
例ceil(x)將x取整為不小于x的最小整數(shù)ceil(9.2)
=
10ceil(?9.8)
=
?9cos(x)x(弧度)的余弦cos(0.0)
=
1.0exp(x)指數(shù)函數(shù)exexp(1.0)=
2.71828exp(2.0)
=
7.38906fabs(x)x的絕對值fabs(?5)
=
5floor(x)將x取整為不大于x的最大整數(shù)floor(9.2)
=
9floor(?9.8)
=
?10fmod(x,y)x/y的浮點數(shù)余數(shù)fmod(13.657,2.333)
=
1.992log(x)x的自然對數(shù)(底數(shù)為e)log(2.718282)
=
1.0
log(7.389056)
=
2.0log10(x)x的對數(shù)(底數(shù)為10)log(10.0)
=
1.0 log(100.0)
=
2.0pow(x,y)x的y次方(xy)pow(2,7)
=
128pow(9,0.5)
=
3sin(x)x(弧度)的正弦sin(0.0)
=
0sqrt(x)x的平方根sqrt(900.0)
=
30.0tan(x)x(弧度)的正切tan(0.0)
=
02025/10/22北京郵電大學信息與通信工程學院-11-#include<iostream>#include<cmath>usingnamespacestd;intmain(){ cout<<"EnterQuadraticcoefficients:"; doublea,b,c; cin>>a>>b>>c; if((a!=0)&&(b*b-4*a*c>0)){ doubleradical=
sqrt(b*b-4*a*c);
doubleroot1=(-b+radical)/(2*a); doubleroot2=(-b-radical)/(2*a); cout<<"Roots:"<<root1<<""<<root2; } else{ cout<<"Doesnothavetworealroots"; } return0;}調用函數(shù)或主調函數(shù)被調函數(shù)庫函數(shù)2025/10/22北京郵電大學信息與通信工程學院-12-#include<iostream>usingnamespacestd;floatCircleArea(floatr);intmain()//managecirclecomputation{cout<<"Enterradius:";floatMyRadius;cin>>MyRadius;floatArea=
CircleArea(MyRadius);
cout<<"Circlehasarea"<<Area;return0;}//CircleArea():computeareaofradiusrcirclefloatCircleArea(floatr){constfloatPi=3.1415;returnPi*r*r;}自定義函數(shù)5.2函數(shù)定義及使用2025/10/22北京郵電大學信息與通信工程學院-13-一個C++控制臺程序可以由一個主函數(shù)(main()函數(shù))和若干子函數(shù)構成。主函數(shù)main()是程序執(zhí)行的開始點,由主函數(shù)調用子函數(shù),子函數(shù)還可以再調用其他子函數(shù)。調用其他函數(shù)的函數(shù)被稱為主調函數(shù)。被其他函數(shù)調用的函數(shù)稱為被調函數(shù)。一個函數(shù)既可以是主調函數(shù),又可以是被調函數(shù)(main()除外)。5.2.1函數(shù)的定義
每一個函數(shù)都是一個具有一定功能的語句模塊,函數(shù)定義的語法形式:
返回值類型
函數(shù)名(形式參數(shù)表){
函數(shù)體(變量聲明和執(zhí)行語句)}2025/10/22北京郵電大學信息與通信工程學院-14-約定接口形式函數(shù)體完成功能intmaximum(intx,inty){intmaxv;maxv=x>=y?x:y;returnmaxv;}2025/10/22北京郵電大學信息與通信工程學院-15-
floatCircleArea(floatr){ constfloatPi=3.1415; returnPi*r*r; }5.2.1函數(shù)的定義
函數(shù)體返回值語句局部變量定義形式參數(shù)函數(shù)類型函數(shù)名5.2.1函數(shù)的定義函數(shù)名是函數(shù)體代碼段的外部標識符函數(shù)定義之后,即可通過函數(shù)名調用函數(shù)。例://Sum():computesumofintegersina...bint
Sum(inta,intb){ intTotal=0; for(inti=a;i<=b;++i) { Total+=i; } returnTotal;} 2025/10/22北京郵電大學信息與通信工程學院-16-5.2.1函數(shù)的定義函數(shù)的形式參數(shù)表,簡稱形參表形式:
(類型1形式參數(shù)1,…,類型n
形式參數(shù)n)
2025/10/22北京郵電大學信息與通信工程學院-17-//Sum():computesumofintegersina...bintSum(inta,intb){ intTotal=0; for(inti=a;i<=b;++i){ Total+=i; } returnTotal;}形式參數(shù)表示主調函數(shù)和被調函數(shù)之間需要交換的信息(1)傳給被調函數(shù)的待處理的數(shù)據(jù);(2)控制被調函數(shù)執(zhí)行操作的信息;(3)被調函數(shù)執(zhí)行的結果。形式參數(shù)表從參數(shù)的類型、個數(shù)、排列順序上規(guī)定了主調函數(shù)和被調函數(shù)之間信息交換的形式。floatfunc(intk,intb,floatx){returnk*x+b;}2025/10/22北京郵電大學信息與通信工程學院-18-5.2.1函數(shù)的定義如果函數(shù)之間沒有需要交換的信息,也可以沒有形參,形參表內寫void或空著。intRead(){ cout<<"Enternumber(integer):"; intResponse; cin>>Response; returnResponse;}2025/10/22北京郵電大學信息與通信工程學院-19-5.2.1函數(shù)的定義5.2.1函數(shù)的定義函數(shù)體是實現(xiàn)函數(shù)功能的代碼部分變量聲明完成函數(shù)功能的語句兩部分從組成結構看,函數(shù)體是由程序的三種基本控制結構即順序、選擇、循環(huán)結構組合而成的。2025/10/22北京郵電大學信息與通信工程學院-20-intSum(inta,intb){ intTotal=0; for(inti=a;i<=b;++i)Total+=i; returnTotal;}2025/10/22北京郵電大學信息與通信工程學院-21-函數(shù)是由函數(shù)名、函數(shù)類型、形參表和函數(shù)體四部分組成的,使用時通過函數(shù)名和參數(shù)表調用函數(shù).
例:編寫一個函數(shù)cube,計算整數(shù)的立方。調用函數(shù)cube計算從1到10相鄰整數(shù)的立方差。2025/10/22北京郵電大學信息與通信工程學院-22-盡可能避免在循環(huán)體內調用函數(shù)!!!//計算整數(shù)的立方#include<iostream>using
namespace
std;int
cube(int);//函數(shù)原型聲明void
main(){
int
last,cb;
last=1;
cout<<"thedifferenceofcube:"<<endl;for(int
x=2;x<=10;x++){cb=cube(x);
cout<<cb-last<<"";
last=cb;}
cout<<endl;}
//函數(shù)定義int
cube(int
y){
return
y*y*y;}2025/10/22北京郵電大學信息與通信工程學院-23-//在三個浮點中找出最大值#include<iostream>using
namespace
std;float
maximum(float
x,float
y,float
z);//函數(shù)原型聲明
void
main(){
float
a,b,c;
cout<<"Enterthreefloatingnumbers:";
cin>>a>>b>>c;
//調用maximum函數(shù),a,b,c為實際參數(shù)
cout<<"Maximumis:"<<maximum(a,b,c)<<endl;//函數(shù)調用}例:在三個浮點中確定最大值,使用自定義函數(shù)maximum完成。2025/10/22北京郵電大學信息與通信工程學院-24-//maximum函數(shù)定義//函數(shù)的形式參數(shù)x,y,zfloat
maximum(float
x,float
y,float
z){
float
max;
max=x>=y?x:y;
max=max>=z?max:z;
return
max;}5.2.1函數(shù)的定義注意如果沒有函數(shù)原型聲明,要先寫函數(shù)定義,后調用函數(shù)。C
++
語言不允許函數(shù)嵌套定義,所有函數(shù)的定義都是自成一體,即函數(shù)體中只包含實現(xiàn)其自身功能的基本語句,不可包含其他函數(shù)的定義體。2025/10/22北京郵電大學信息與通信工程學院-25-5.2.2函數(shù)原型引用函數(shù)之前,要先指定函數(shù)的接口形式函數(shù)原型函數(shù)定義函數(shù)原型聲明格式:
函數(shù)類型函數(shù)名(形式參數(shù)表);例:intMax(inta,intb);函數(shù)原型聲明使編譯器獲得關于函數(shù)名稱、函數(shù)類型、函數(shù)形參個數(shù)、形參類型和形參順序的信息。函數(shù)調用時,編譯器根據(jù)函數(shù)原型聲明驗證函數(shù)調用正確與否。
2025/10/22北京郵電大學信息與通信工程學院-26-5.2.2函數(shù)原型程序中,如果調用自定義的函數(shù),且函數(shù)定義在后,調用在先,則必須在調用函數(shù)之前有函數(shù)原型聲明。voidsubfun1(intx,floata,floatb);//原型聲明main(){
intx=20;floata=1.0f,b=0.5f;subfun1(…);//函數(shù)調用┆}voidsubfun1(intx,floata,floatb)//函數(shù)定義{
…}2025/10/22北京郵電大學信息與通信工程學院-27-5.2.2函數(shù)原型如果是函數(shù)定義在先,調用在后,則不必進行函數(shù)原型聲明。因為編譯器已經從函數(shù)定義得到關于函數(shù)的信息。voidsubfun1(intx,floata,floatb)//函數(shù)定義{
…}main(){
┆subfun1(i,f1,f2);//函數(shù)調用┆}
2025/10/22北京郵電大學信息與通信工程學院-28-5.2.2函數(shù)原型源文件中,如果在所有函數(shù)定義體之外聲明函數(shù)原型,則該函數(shù)可被位于其原型聲明之后的所有函數(shù)調用。2025/10/22北京郵電大學信息與通信工程學院-29-voidsubfun1(…);//原型聲明main(){
┆subfun1(…);//函數(shù)調用┆}voidsubfun2(){
┆subfun1(…);//函數(shù)調用┆}voidsubfun1(…)//函數(shù)定義{
…}main(){voidsubfun1(…);//函數(shù)原型聲明
┆
subfun1(…);//函數(shù)調用┆}voidsubfun2(){
┆subfun1(…);//函數(shù)調用,┆}voidsubfun1(…){
…}2025/10/22北京郵電大學信息與通信工程學院-30-錯誤,編譯器不識別sunfun1標識符。5.2.2函數(shù)原型庫函數(shù)的聲明在相應庫的頭文件中,使用庫函數(shù)時要包含對應的頭文件。例:#include<cmath>
調用數(shù)學庫函數(shù):
sqrt(…)sin(…)abs(…)
……2025/10/22北京郵電大學信息與通信工程學院-31-2025/10/22北京郵電大學信息與通信工程學院-32-常用C++標準庫頭文件cassert包含增加診斷以幫助程序調試的宏和信息cctype包含測試某些字符屬性的函數(shù)原型和將小寫字母變?yōu)?/p>
大寫字母、將大寫字母變?yōu)樾懽帜傅暮瘮?shù)原型cmath包含數(shù)學庫函數(shù)的函數(shù)原型cstdio包含標準輸入/輸出庫函數(shù)的函數(shù)原型及其使用的信息cstdlib包含將數(shù)字變?yōu)槲谋尽⑽谋咀優(yōu)閿?shù)字、內存分配、隨機數(shù)和各種其他工具函數(shù)的函數(shù)原型cstring包含C語言方式的字符串處理函數(shù)原型ctime 包含操作時間和日期的函數(shù)原型和類型iostream包含標準輸入/輸出函數(shù)原型iomanip包含能夠格式化數(shù)據(jù)流的流操縱運算子的函數(shù)原型fstream包含和磁盤文件讀/寫有關的函數(shù)原型5.2.2函數(shù)原型例5-2計算3個整數(shù)絕對值的平均值。2025/10/22北京郵電大學信息與通信工程學院-33-2025/10/22北京郵電大學信息與通信工程學院-34-//例5-2計算3個數(shù)絕對值的平均值#include<iostream>#include<cmath>usingnamespacestd;intCalAbsMean(inta,intb,intc);//自定義函數(shù)的原型聲明voidmain(){inta,b,c;cout<<"輸入a,b,c:";cin>>a>>b>>c;cout<<"絕對值的均值為:"<<CalAbsMean(a,b,c)<<endl;}intCalAbsMean(inta,intb,intc){intsum=abs(a)+abs(b)+abs(c);sum/=3;returnsum;}運行結果:輸入a,b,c:-1020-30
絕對值的均值為:205.2.3return語句return語句使程序執(zhí)行流程從被調函數(shù)返回主調函數(shù),有兩種形式:(1)不返回值的形式
return;(2)返回值的形式
return表達式;2025/10/22北京郵電大學信息與通信工程學院-35-intSum(inta,intb){ intTotal=0; for(inti=a;i<=b;++i) Total+=i;
returnTotal;}void
DisplayMessage(){
cout<<"只顯示確定信息的簡單函數(shù)不帶參數(shù)"<<endl;return;}函數(shù)返回值類型規(guī)定了函數(shù)返回給主調函數(shù)的值的類型,也稱為函數(shù)類型。
當被調函數(shù)只需要把一個數(shù)值結果返回給主調函數(shù)時,使用return語句返回比較合適。由return語句返回的值的類型必須與函數(shù)返回值類型一致。若表達式的結果與函數(shù)類型不一致,不能通過編譯,需要作強制類型轉換,將表達式的類型強制成與函數(shù)類型。例如,如果mean是float型,而函數(shù)是int型,則return語句應為:
return(int)mean;
2025/10/22北京郵電大學信息與通信工程學院-36-intSum(inta,intb){ intTotal=0; for(inti=a;i<=b;++i) Total+=i;
returnTotal;}5.2.3return語句5.2.3return語句注意如果不需要向主調函數(shù)返回值,函數(shù)可以定義成無類型的,函數(shù)類型寫成void,函數(shù)結束時也不必用return語句。例:
voiddisplay(){cout<<“noreturn”<<endl;}2025/10/22北京郵電大學信息與通信工程學院-37-5.2.3return語句例5-3根據(jù)輸入的顏色符號,顯示不同的字符串表示的不同顏色。2025/10/22北京郵電大學信息與通信工程學院-38-2025/10/22北京郵電大學信息與通信工程學院-39-//例5-3根據(jù)輸入的顏色符號,顯示不同的字符串表示的不同顏色#include<iostream>usingnamespacestd;voidDispColor(charcolor);voidmain(){charcolor;cout<<"選擇顏色(r-read,g-green,b-blue):";cin>>color;DispColor(color);}2025/10/22北京郵電大學信息與通信工程學院-40-//根據(jù)輸入,顯示顏色字符串voidDispColor(charcolor){switch(color){case'r':cout<<"red.";break;case'g':cout<<"green.";break;case'b':cout<<"blue";break;default:break;}return;}5.2.3return語句例5-4從輸入文件中讀入學生人數(shù)和每人考試成績,統(tǒng)計成績的平均值。2025/10/22北京郵電大學信息與通信工程學院-41-2025/10/22北京郵電大學信息與通信工程學院-42-//例5-4.從輸入文件中讀入學生人數(shù)和每人考試成績,統(tǒng)計成績均值。#include<iostream>#include<fstream>usingnamespacestd;intCalMean(charchFileName[]); //函數(shù)原型聲明voidmain(){charchFileName[80]="";cout<<"輸入文件名:";cin>>chFileName;//輸入文件名
intmean=ChlMean(chFileName);//得到平均值
cout<<"平均值="<<mean<<endl;}2025/10/22北京郵電大學信息與通信工程學院-43-//計算均值,函數(shù)定義如下intCalMean(charchFileName[]) {intcount; //數(shù)據(jù)個數(shù)
intscore; //分數(shù)
intsum(0),mean;ifstreaminfile(chFileName);if(!infile)cout<<"!infile"<<endl;infile<<count;cout<<"成績個數(shù):";
cout<<count<<endl;cout<<"成績:"<<endl;while(infile>>score)//從文件讀取成績,并累計總成績;
{ cout<<score<<""; sum+=score; //累積分數(shù)
}cout<<endl;if(count>0)mean=sum/count; //計算平均值
elsemean=0;returnmean;//將平均值返回主調函數(shù)}運行結果:
成績個數(shù):10
成績:59392436879852675260
平均值=575.2.4函數(shù)調用方式函數(shù)語句函數(shù)語句形式:函數(shù)名(實參數(shù)表);TriAreabySide(a,b,c);
函數(shù)表達式函數(shù)調用出現(xiàn)在表達式中,形式:函數(shù)名(實際參數(shù)表)x=max(a,b);y=sqrt(x);此時函數(shù)要使用return語句向主調函數(shù)返回一個確定的值,參與它所在的表達式的運算。floatmax(floata,floatb){returna>=b?a:b;}函數(shù)參數(shù)
函數(shù)參數(shù)調用方式是將函數(shù)調用寫在另一次函數(shù)調用的實際參數(shù)位置。例如:
m=max(a,max(b,c));
2025/10/22北京郵電大學信息與通信工程學院-44-5.2.4函數(shù)調用方式實際參數(shù)表可簡稱為實參表,是按與被調函數(shù)形式參數(shù)表一一對應的格式組織的參數(shù)表,即參數(shù)的類型、個數(shù)和排列順序必須與被調函數(shù)聲明的形式參數(shù)表嚴格一致。實際參數(shù)表的各實際參數(shù)以逗號間隔,實際參數(shù)可以是常量、變量或表達式,變量和表達式必須具有確定值。如果被調函數(shù)無形式參數(shù),則實參表也是空的。實際編程中,從可讀性考慮,一般使用變量作為實際參數(shù)。2025/10/22北京郵電大學信息與通信工程學院-45-例:計算y=kx+b的函數(shù)floatfunc(intk,intb,floatx){returnk*x+b;}voidmain(){intk,b;floatx,y;cin>>k>>b>>x;y=func(k,b,x);}例:找最高分數(shù)
intFindMaxValue(intarray[],intn){intmaxValue=array[0];for(intk=1;k<n;k++){if(array[k]>maxValue)maxValue=array[k];}returnmaxValue;}
voidmain(){intscore[30],num=30;for(intk=0;k<num;k++){cin>>score[k];}intmaxScore=FindMaxScore(score,num);cout<<maxScore<<endl;}2025/10/22北京郵電大學信息與通信工程學院-46-實際參數(shù)以數(shù)據(jù)值(值傳遞)或實際存儲空間(地址傳遞)提供了形式參數(shù)所需的內容。#include<iostream>using
namespace
std;void
DisplayMessage();void
main(){
DisplayMessage();//函數(shù)調用語句}void
DisplayMessage(){
cout<<"只顯示確定信息的簡單函數(shù)不帶參數(shù)"<<endl;}2025/10/22北京郵電大學信息與通信工程學院-47-如果被調函數(shù)無形參,則實參表也是空的。5.2.4函數(shù)調用方式5.2.4函數(shù)調用方式例5-5編寫程序,實現(xiàn)坐標旋轉公式:2025/10/22北京郵電大學信息與通信工程學院-48-2025/10/22北京郵電大學信息與通信工程學院-49-//實現(xiàn)坐標旋轉公式#include<iostream>#include<cmath>using
namespace
std;
void
main(){ const
double
PI=3.14;
int
x,y;//旋轉后坐標
int
x0,y0;//原始坐標
int
angle;//旋轉角度//輸入數(shù)據(jù)
cout<<"inputpoint(x,y):";
cin>>x0>>y0;
cout<<"inputangleofrotation:";
cin>>angle;
//計算旋轉后的坐標
double
theta=angle*PI/180;
x=x0*cos(theta)-y0*sin(theta);
y=x0*sin(theta)+y0*cos(theta);
//輸出結果
cout<<"x="<<x<<endl;
cout<<"y="<<y<<endl;}5.3函數(shù)調用的執(zhí)行機制和參數(shù)傳遞方式函數(shù)調用過程是如何實現(xiàn)的?程序執(zhí)行流程能夠從主調函數(shù)到被調函數(shù),再由被調函數(shù)正確返回主調函數(shù)的斷點繼續(xù)執(zhí)行,是基于函數(shù)調用工作棧來實現(xiàn)的。函數(shù)的參數(shù)傳遞方式值傳遞地址傳遞2025/10/22北京郵電大學信息與通信工程學院-50-5.3.1函數(shù)調用的執(zhí)行機制棧是函數(shù)調用正確執(zhí)行的物理基礎.棧是一種數(shù)據(jù)結構,它的工作原理就像在子彈匣壓子彈一樣,最先壓入的子彈要等到最后才飛射出去,而最后壓入的子彈則首先飛射出去。2025/10/22北京郵電大學信息與通信工程學院-51-004010560040105700401058004010590040105A0040106BABCD棧的管理原則:先進后出或后進先出5.3.1函數(shù)調用的執(zhí)行機制函數(shù)調用能夠正確執(zhí)行的物理基礎是操作系統(tǒng)在內存中開辟了一塊叫做棧的內存空間。斷點工作記錄斷點地址被調函數(shù)的形式參數(shù)自動局部變量2025/10/22北京郵電大學信息與通信工程學院-52-5.3.1函數(shù)調用的執(zhí)行機制例5-6從鍵盤輸入屏幕上兩點的坐標(x,y),計算兩點之間的距離。(分析函數(shù)調用時活動記錄)2025/10/22北京郵電大學信息與通信工程學院-53-2025/10/22北京郵電大學信息與通信工程學院-54-void
main(){ int
x1,y1,x2,y2;//兩點坐標
float
dist;//兩點間距離
cout<<"inputpoint1(x1,y1):";
cin>>x1>>y1;
cout<<"inputpoint2(x2,y2):";
cin>>x2>>y2;
dist=CalDistance(x1,y1,x2,y2);
cout<<"distancebetweenpoint("<<x1<<","<<y1<<")andpoint("<<x2<<","<<y2<<"):"<<dist<<endl;}
棧main函數(shù)中的自動局部變量斷點地址…僅一個工作記錄活動工作記錄2025/10/22北京郵電大學信息與通信工程學院-55-//計算距離float
CalDistance(int
xx1,int
yy1,int
xx2,int
yy2){ int
dx,dy;
dx=xx2-xx1;
dy=yy2-yy1;
float
dist=sqrt(dx*dx+dy*dy);
return
dist;}
棧main函數(shù)中的自動局部變量斷點地址…工作記錄示意工作記錄CalDistance函數(shù)中的自動局部變量斷點地址…活動工作記錄5.3.2函數(shù)的參數(shù)傳遞方式函數(shù)之間的信息交換的一種重要形式是函數(shù)的參數(shù)傳遞,由函數(shù)的形式參數(shù)和實際參數(shù)實現(xiàn)。函數(shù)在沒有被調用時,函數(shù)的形式參數(shù)并不占有實際的內存空間,也沒有實際的值。C++語言中函數(shù)的參數(shù)傳遞方式分為兩種:·值傳遞·地址傳遞2025/10/22北京郵電大學信息與通信工程學院-56-2025/10/22北京郵電大學信息與通信工程學院-57-值傳遞如果函數(shù)的形式參數(shù)為普通變量,當函數(shù)被調用時,系統(tǒng)為這些形式參數(shù)分配內存空間,并用實際參數(shù)值初始化對應的形式參數(shù),形式上實際參數(shù)的值傳遞給了形式參數(shù)。這就是函數(shù)調用時參數(shù)的值傳遞。值傳遞方式,實際參數(shù)和形式參數(shù)各自占有自己的內存空間;參數(shù)傳遞方向只能由實際參數(shù)到形式參數(shù);不論函數(shù)對形式參數(shù)作任何修改,對相應的實際參數(shù)都沒有影響。5.3.2函數(shù)的參數(shù)傳遞方式5.3.2函數(shù)的參數(shù)傳遞方式例5-7從鍵盤輸入兩整數(shù),交換次序后輸出。
2025/10/22北京郵電大學信息與通信工程學院-58-2025/10/22北京郵電大學信息與通信工程學院-59-//演示函數(shù)參數(shù)值傳遞單向性的例程#include<iostream.h>void
swap(int
a,int
b);int
main(){
int
x(5),y(10);
cout<<"x="<<x<<"y="<<y<<endl;
swap(x,y);
cout<<"x="<<x<<"y="<<y<<endl;
return0;}510xy10241028運行結果:
x=5y=10 x=5y=102025/10/22北京郵電大學信息與通信工程學院-60-void
swap(int
a,int
b){
int
t;
t=a;
a=b;
b=t;}5a204810b2052t20565105編程技巧:交換兩個變量的值,需要引入第三個變量緩存數(shù)據(jù)。例如果一個數(shù)的所有真因子(包括1,但不包括這個數(shù)本身)之和正好等于這個數(shù)本身,則稱此數(shù)為完美數(shù)。例如:6=1×2×3,而1+2+3=6;28=1×4×7=1×2×14,而1+2+4+7+14=28。如何確定完美數(shù),歐幾里得發(fā)現(xiàn),只要是一個素數(shù),則一定是一個完美數(shù)。編寫程序找出最小的5個完美數(shù)。2025/10/22北京郵電大學信息與通信工程學院-61-體會函數(shù)參數(shù)的值傳遞2025/10/22北京郵電大學信息與通信工程學院-62-//尋找最小的五個完美數(shù)#include<iostream>#include<cmath>using
namespace
std;
bool
DecidePrime(unsigned
int
number);unsigned
int
power(unsigned
int
x,unsigned
int
y);
void
main(){
unsigned
int
perfect_number;
unsigned
int
num,temp;
short
n(2);
short
counter(0);//計數(shù)器
2025/10/22北京郵電大學信息與通信工程學院-63-
while(counter<5) { temp=power(2,n);
num=temp-1;
if(DecidePrime(num)) {perfect_number=temp/2*num;
cout<<"n="<<n<<","<<"perfectnumber="<<perfect_number<<endl;
counter++; }
n++; }}2025/10/22北京郵電大學信息與通信工程學院-64-//計算指數(shù)unsigned
int
power(unsigned
int
x,unsigned
int
y){
unsigned
int
mul(1);
for(int
i=1;i<=y;i++)
mul*=x;
return
mul;}2025/10/22北京郵電大學信息與通信工程學院-65-
//判別素數(shù)bool
DecidePrime(unsigned
int
number){ unsigned
int
i,k;k=sqrt(number);
for(i=2;i<=k;i++){
//找number的因數(shù)
if(number%i==0)
break; }if(i>=k+1)//判斷number是否被小于number的數(shù)整除
return
true;
else
return
false;}5.3.2函數(shù)的參數(shù)傳遞方式地址傳遞地址變量做形參數(shù)組名指針變量引用2025/10/22北京郵電大學信息與通信工程學院-66-5.3.2函數(shù)的參數(shù)傳遞方式冒泡排序intarray[5]={5,4,3,2,1};2025/10/22北京郵電大學信息與通信工程學院-67-5.3.2函數(shù)的參數(shù)傳遞方式例5-9用整型數(shù)組存儲數(shù)據(jù),編寫冒泡排序函數(shù)BubbleSort(),在主調函數(shù)中用隨機數(shù)產生函數(shù)生成數(shù)組元素,并輸出排序的結果。2025/10/22北京郵電大學信息與通信工程學院-68-2025/10/22北京郵電大學信息與通信工程學院-69-//例5-9基于數(shù)組的冒泡排序例#include<iostream>#include<ctime>usingnamespacestd;voidBubbleSort(intarray[],intn);//函數(shù)原型聲明2025/10/22北京郵電大學信息與通信工程學院-70-voidmain(){constintN=20;intarray[N]={0};srand((unsignedint)time(NULL));intk;cout<<"待排序數(shù)據(jù):"<<endl;for(k=0;k<N;k++)//數(shù)據(jù)生成
{ array[k]=rand()%100; cout<<array[k]<<",";}BubbleSort(array,N); //調用排序函數(shù)
cout<<endl<<"排序后數(shù)據(jù):"<<endl;for(k=0;k<N;k++)//數(shù)據(jù)生成
{ cout<<array[k]<<",";}cout<<endl;}2025/10/22北京郵電大學信息與通信工程學院-71-//冒泡排序voidBubbleSort(inta[],intn){inttemp;for(intpass=1;pass<n;pass++) //共比較size-1輪
{ for(intk=0;k<n-pass;k++)//比較一輪
{ if(a[k]>a[k+1]){temp=a[k];a[k]=a[k+1];a[k+1]=temp;}}}}運行結果:待排序數(shù)據(jù):37,99,56,87,48,96,71,88,63,44,34,21,59,0,36,92,53,25,4,20
排序后數(shù)據(jù):0,4,20,21,25,34,36,37,44,48,53,56,59,63,71,87,88,92,96,99注意(1)數(shù)組名作為形式參數(shù),只將數(shù)組的起始地址傳遞給了被調函數(shù),數(shù)組的大小需要單獨通過值傳遞的方式傳給被調函數(shù)。例5-9中的用法是一維數(shù)組名形式參數(shù),只傳一個大小即可;如果是多維數(shù)組名作為函數(shù)的形式參數(shù),則數(shù)組的每一維的大小都需要傳給被調函數(shù)。例如,定義求一個矩陣的轉置矩陣的函數(shù)TransposeMatrix(),矩陣用二維數(shù)組表示,函數(shù)接口如下:voidTransposeMatrix(intmatrix[][N],inttMatrix[][M],introws,intcols);2025/10/22北京郵電大學信息與通信工程學院-72-注意(2)多維數(shù)組名作為形式參數(shù),只可以省略第一維(最左邊)的大小,也可以不省略。在被調函數(shù)中訪問這個形式上的數(shù)組時,切忌下標越界問題。2025/10/22北京郵電大學信息與通信工程學院-73-5.4遞歸函數(shù)和遞歸調用遞歸函數(shù)是函數(shù)的一種特殊形式,適合實現(xiàn)數(shù)學上的一些遞歸問題。使用遞歸函數(shù)可以簡單明了地表達算法(算法的可讀性好),但算法的效率一般不高。2025/10/22北京郵電大學信息與通信工程學院-74-5.4.1嵌套調用C++的函數(shù)不能嵌套定義
C++的函數(shù)可以嵌套調用
2025/10/22北京郵電大學信息與通信工程學院-75-不能嵌套定義voidmain(){intx,y;
intsub(inta,intb){intc=a+b;}}
可以嵌套調用main()DecidePrime(…)sqrt(…)if(DecidePrime(num))k=sqrt(number);
5.4.2遞歸函數(shù)和遞歸調用遞歸函數(shù)是函數(shù)體內有調用函數(shù)自己的語句或通過其它函數(shù)間接調用函數(shù)自己的函數(shù)。遞歸調用是調用遞歸函數(shù)而形成的一種函數(shù)調用方式。遞歸函數(shù)用于實現(xiàn)數(shù)學中的遞歸問題比較直觀方便。2025/10/22北京郵電大學信息與通信工程學院-76-經典遞歸調用問題
階乘定義式:
2025/10/22北京郵電大學信息與通信工程學院-77-2025/10/22北京郵電大學信息與通信工程學院-78-#include<iostream>using
namespace
std;int
factorial(int
n);void
main(){
cout<<"enterapositioninteger:";
int
n,n_fact;
cin>>n;
n_fact=factorial(n);
cout<<"thefactorialof"<<n<<"is:"<<n_fact<<endl;}返回地址12025/10/22北京郵電大學信息與通信工程學院-79-int
factorial(int
n){
intfn;
if(n==0)fn=1;
elsefn=n*factorial(n-1);
returnfn;}返回地址2n=3地址1棧狀態(tài)fn=?n=2地址2fn=?n=1地址2fn=?n=0地址2斷點地址參數(shù)局部變量toptoptoptop實例演示2025/10/22北京郵電大學信息與通信工程學院-80-int
factorial(int
n){
intfn;
if(n==0)fn=1;
elsefn=n*factorial(n-1);
returnfn;}返回地址2n=3地址1棧狀態(tài)fn=?n=2地址2fn=?n=1地址2fn=1n=0地址2topfn=1n=1地址2fn=2n=2地址2toptoptop遞歸問題的求解實際分成兩個階段:化簡問題的遞推階段;達到遞歸終止條件得到基本情況的結果,并逐步回推結果階段。遞歸函數(shù)的主要兩部分
具有更簡單參數(shù)的遞歸調用
停止遞歸的終止條件(遞歸終止條件)
2025/10/22北京郵電大學信息與通信工程學院-81-例5-11
整數(shù)x和y的最大公約數(shù)是x和y能夠整除的最大整數(shù)。編寫一個遞歸函數(shù)GcommonDivisor,返回整數(shù)x和y的最大公約數(shù)。算法:整數(shù)x和y的最大公約數(shù)的遞歸實現(xiàn):如果y等于0,則GcommonDivisor(x,y)為x;否則GcommonDivisor(x,y)為GcommonDivisor(y,x%y).其中%是求余運算符。2025/10/22北京郵電大學信息與通信工程學院-82-xy1088220xy1228281212440理解遞歸問題2025/10/22北京郵電大學信息與通信工程學院-83-//計算x和y的最大公約數(shù)(遞歸函數(shù))#include<iostream>using
namespace
std;
int
GcommonDivisor(int
x,int
y);
void
main(){int
x,y;cout<<"inputx,y:";
cin>>x>>y;
cout<<"thegreatestcommondivisorof"<<x<<"and"<<y<<":" <<GcommonDivisor(x,y)<<endl;}
地址12025/10/22北京郵電大學信息與通信工程學院-84-int
GcommonDivisor(int
x,int
y){intgcd;
if(y==0)
gcd=x;
else
gcd=GcommonDivisor(y,x%y);returngcd;}
以輸入10,8為例地址2X(10)y(8)地址1gcd=?X(8)y(2)地址2gcd=?X(2)y(0)地址2gcd=?X(2)y(0)地址2gcd=2X(2)y(0)地址2gcd=2X(8)y(2)地址2問題:用循環(huán)能實現(xiàn)嗎?(作業(yè))5.5內聯(lián)函數(shù)
函數(shù)調用時,系統(tǒng)首先要保存主調函數(shù)的相關信息,再將控制轉入被調函數(shù),這些操作增加了程序執(zhí)行的時間開銷。C++提供的內聯(lián)函數(shù)形式可以減少函數(shù)調用的額外開銷(時間空間開銷),特別是一些常用的短小的函數(shù)適合采用內聯(lián)函數(shù)形式。2025/10/22北京郵電大學信息與通信工程學院-85-5.5內聯(lián)函數(shù)內聯(lián)函數(shù)的定義形式:inline函數(shù)類型函數(shù)名(形式參數(shù)表){函數(shù)體}
2025/10/22北京郵電大學信息與通信工程學院-86-5.5內聯(lián)函數(shù)例5-13
使用內聯(lián)函數(shù)求三個整數(shù)中的最大值。
2025/10/22北京郵電大學信息與通信工程學院-87-2025/10/22北京郵電大學信息與通信工程學院-88-//內聯(lián)函數(shù)例#include<iostream>using
namespace
std;inline
int
max(int
x,int
y,int
z){return((x>=y)?(x>=z?x:z):(y>=z?y:z));}
void
main(){int
a,b,c;
cout<<"enterthreeintegers:"
cin>>a>>b>>c;
cout<<"Maximumis"<<max(a,b,c)<<endl;}(a>=b)?(a>=c?a:c):(b>=c?b:c)2025/10/22北京郵電大學信息與通信工程學院-89-
內聯(lián)函數(shù)之所以能夠減少函數(shù)調用時的系統(tǒng)空間和時間開銷,是因為系統(tǒng)在編譯程序時就已經把內聯(lián)函數(shù)的函數(shù)體代碼插入到相應的函數(shù)調用位置,成為主調函數(shù)內的一段代碼,可以直接執(zhí)行,不必再轉換流程控制權。這樣的結構,自然節(jié)省了時間和空間開銷,但使得主調函數(shù)代碼變長。一般是只把短小的函數(shù)寫成內聯(lián)函數(shù)。2025/10/22北京郵電大學信息與通信工程學院-90-注意:(1)內聯(lián)函數(shù)體不能包含循環(huán)語句、switch語句和異常接口聲明。(2)內聯(lián)函數(shù)要先定義,后調用。因為編譯器需要用內聯(lián)函數(shù)的函數(shù)體代碼替換對應的函數(shù)調用。如果內聯(lián)函數(shù)不符合要求,編譯器就將內聯(lián)函數(shù)當一般函數(shù)處理。5.6重載函數(shù)重載函數(shù)也是函數(shù)的一種特殊情況。C++允許幾個功能類似函數(shù)同名,但這些同名函數(shù)的形式參數(shù)必須不同,稱這些同名函數(shù)為重載函數(shù)。例:intmax(intx,inty){returnx>y?x:y;}floatmax(floatx,floaty){returnx>y?x:y;}2025/10/22北京郵電大學信息與通信工程學院-91-2025/10/22北京郵電大學信息與通信工程學院-92-各重載函數(shù)形式參數(shù)的不同是指參數(shù)的個數(shù)、類型或順序彼此不同,不包括參數(shù)標識符的不同。如:①intmax(inta,intb){returna>b?a:b;}②intmax(intx,inty){returnx>y?x:y;}③intmax(intx,inty,intz){return(x>y?x:y)>z?(x>y?x:y):z;}①②實際是一個函數(shù),如果寫在同一個文件中,編譯時會出現(xiàn)編譯錯誤。若①③或②③在同一個文件中可形成重載函數(shù)。編譯器將以形式參數(shù)個數(shù)的不同來認定和區(qū)分重載函數(shù)。2025/10/22北京郵電大學信息與通信工程學院-93-#include<iostream>using
namespace
std;
int
min(int
x,int
y){return
x<y?x:y;}double
min(double
x,double
y){return
x<y?x:y;}void
main(){int
ia(10),ib(20);
double
da(0.1),db(0.5);
cout<<"minimumofinteger.is"<<min(ia,ib)<<endl;
cout<<"minimumofdoubleis"<<min(da,db)<<endl;}2025/10/22北京郵電大學信息與通信工程學院-94-在使用重載函數(shù)時需要注意下面三點:編譯器不以形式參數(shù)的標識符區(qū)分重載函數(shù)。例intmax(inta,intb);intmax(intx,inty);編譯器認為這是同一個函數(shù)聲明兩次,編譯時出錯。2025/10/22北京郵電大學信息與通信工程學院-95-(2)
編譯器不以函數(shù)類型區(qū)分重載函數(shù)。floatfun(intx,inty);intfun(intx,inty);如果函數(shù)名和形式參數(shù)表相同,只是函數(shù)類型不同,編譯器同樣認為它們是同一個函數(shù)聲明兩次,編譯出錯。(3)不應該將完成不同功能的函數(shù)寫成重載函數(shù),破壞程序的可讀性。2025/10/22北京郵電大學信息與通信工程學院-96-重載函數(shù)常用于實現(xiàn)功能類似而所處理的數(shù)據(jù)類型不同的問題5.7默認參數(shù)值的函數(shù)具有默認參數(shù)值的函數(shù)是一種特殊的函數(shù)形式,C++允許函數(shù)的形式參數(shù)有默認值。例如:計算圓面積的函數(shù):double
CircleArea(double
radius=1.0){
const
double
PI=3.14;
return
PI*radius*radius;}
2025/10/22北京郵電大學信息與通信工程學院-97-2025/10/22北京郵電大學信息與通信工程學院-98-調用具有默認參數(shù)值的函數(shù)時,如果提供實際參數(shù)值,則函數(shù)的形參值取自實際參數(shù);如果不提供實際參數(shù)值,函數(shù)的形參采用默認參數(shù)值。例如調用CircleArea函數(shù):#include<iostream>using
namespace
std;void
main(){
cout<<CircleArea(10.0)<<endl;//提供實際參數(shù)值
cout<<CircleArea()<<endl;//不提供實際參數(shù)值}2025/10/22北京郵電大學信息與通信工程學院-99-默認參數(shù)值函數(shù)如果有多個參數(shù),而其中只有部分參數(shù)具有默認值,則這些具有默認值的參數(shù)值應該位于形參表的最右端?;蛘哒f,形參表中具有默認參數(shù)值的參數(shù)的右邊,不能出現(xiàn)沒有默認值的參數(shù)。例如:intCuboidVolume(intlength=1,intwidth=1,intheight=1);//正確intCuboidVolume(intlength,intwidth=1,intheight=1);//正確intCuboidVolume(intlength,intwidth,intheight=1);//正確
intCuboidVolume(intlength=1,intwidth,intheight=1);//錯誤intCuboidVolume(intlength,intwidth=1,intheight);//錯誤intCuboidVolume(intlength=1,intwidth=1,intheight);//錯誤2025/10/22北京郵電大學信息與通信工程學院-100-如果默認參數(shù)值函數(shù)是先聲明,后定義的,則在聲明函數(shù)原型時就指定默認參數(shù)值。如果函數(shù)定義在先(無需原型聲明),則在函數(shù)定義的形參表中指定默認值。
例5-13
編寫具有默認函數(shù)值的函數(shù),計算直角三角形的面積。
//使用默認形式參數(shù)值的函數(shù)編寫計算直角三角形面積的程序#include<iostream>using
namespace
std;float
areaRATriangle(int
side1=3,int
side2=4);void
main(){ cout<<"Theareaofdefaultright-angledtriangle(3,4)is:“<<areaRATriangle()<<endl;
cout<<"Theareaofright-angledtriangle(6,4)is:“<<areaRATriangle(6)<<endl;
cout<<"Theareaofright-angledtriangle(6,8)is:"
<<areaRATriangle(6,8)<<endl;}//計算直角三角形面積
float
areaRATriangle(int
side1,int
side2){ return
side1*side2/2.0;}//使用默認形式參數(shù)值的函數(shù)編寫計算直角三角形面積的程序#include<iostream>using
namespace
std;//計算直角三角形面積float
areaRATriangle(int
side1=3,int
side2=4){ return
side1*side2/2.0;}void
main(){ cout<<"Theareaofdefaultright-angledtriangle(3,4)is:“<<areaRATriangle()<<endl;
cout<<"Theareaofright-angledtriangle(6,4)is:“<<areaRATriangle(6)<<endl;
cout<<"Theareaofright-angledtriangle(6,8)is:"
<<areaRATriangle(6,8)<<endl;}5.8全局變量與局部變量程序內存空間2025/10/22北京郵電大學信息與通信工程學院-103-代碼區(qū)(存放程序的代碼)全局區(qū)(存放程序中的全局數(shù)據(jù)和靜態(tài)數(shù)據(jù))堆區(qū)(存放程序的動態(tài)數(shù)據(jù))棧區(qū)(存放程序的局部數(shù)據(jù))5.8全局變量與局部變量編譯器根據(jù)變量定義的位置局部變量(在函數(shù)內部定義的變量、函數(shù)的形參)全局變量(在函數(shù)外部定義的變量為全局變量)作用域由于變量定義的位置不同,所以變量起作用的范圍也不同。我們把程序中一個標識符起作用的范圍稱為其作用域。
2025/10/22北京郵電大學信息與通信工程學院-104-5.8.1局部變量局部變量包括在函數(shù)體內定義的變量和函數(shù)的形式參數(shù),它們的作用域就在函數(shù)體內,只能在本函數(shù)內使用,不能被其它函數(shù)直接訪問。
2025/10/22北京郵電大學信息與通信工程學院-105-2025/10/22北京郵電大學信息與通信工程學院-106-#include<iostream>using
namespace
std;int
fun1(int
x,int
y);int
fun2(int
x,int
y);void
main(){int
a,b
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年信息化施工管理合同
- 2025年在線教育平臺搭建可行性研究報告
- 2025年特色小鎮(zhèn)開發(fā)與建設項目可行性研究報告
- 2025年農田灌溉智能監(jiān)控系統(tǒng)項目可行性研究報告
- 2025年生態(tài)友好型農業(yè)示范項目可行性研究報告
- 2025年面向未來的城市生態(tài)公園項目可行性研究報告
- 消毒鍋租賃協(xié)議書
- 乙方解除協(xié)議書
- 紫蘇種植合同范本
- 港口轉讓協(xié)議合同
- HY/T 0457-2024藍碳生態(tài)系統(tǒng)碳儲量調查與評估技術規(guī)程海草床
- 幼兒園食品儲存安全自查報告的范文
- 貴州省2023年7月普通高中學業(yè)水平合格性考試地理試卷(含答案)
- 實施“十五五”規(guī)劃的發(fā)展思路
- 東航心理測試題及答案
- 資金無償贈予協(xié)議書
- 課件王思斌:社會工作概論
- 2025年度交通運輸安全生產費用使用計劃
- 防水工程驗收單
- 2025年高考數(shù)學總復習《立體幾何》專項測試卷及答案
- 2025工程質檢部工作計劃
評論
0/150
提交評論