第3章 語句和函數_第1頁
第3章 語句和函數_第2頁
第3章 語句和函數_第3頁
第3章 語句和函數_第4頁
第3章 語句和函數_第5頁
已閱讀5頁,還剩36頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第3章語句和函數C++程序設計語句聲明語句執行語句

1、表達式語句

2、基本輸入輸出語句

3、控制語句

選擇語句

循環語句

轉向語句空語句復合語句(塊語句)賦值語句“=”是最簡單的賦值運算符,帶有賦值運算符的表達式稱為賦值表達式,由賦值表達式組成的語句就是賦值語句結構:變量標識符賦值運算符表達式;【例3.1】賦值語句。intx,y;floata,b,c;x=36; //賦值語句對x賦值36y=x*2+2*3-12;//賦值語句對y賦表達式x*2+2*3-12的值a=36.5; //賦值語句對a賦值36.5b=2.5*a+1.2; //賦值語句對b賦表達式2.5*a+1.2的值c=2.5*3.14-2.7/1.35+2.2;//賦值語句對c賦表達式2.5*3.14-2.7/1.35+2.2的值復合賦值運算符包括:等號與算術運算符結合:

+=、-=、*=、/=、%=等號與位運算符結合:

<<=、>>=、&=、^=、|=結合性:自右向左例如:Inta=3;a+=a*=2;//a=a+(a=a*2)=12Inta=8;a+=a*=a+a;//a=a+(a=a*(a+a))=256賦值運算的類型轉換賦值運算符兩邊類型不一致,編譯器會將右值的類型轉換成左值的類型字符型賦值給整型變量

將字符型數據放在整型變量低8位,無符號數高8位補0,有符號數高8位補字符型數據的最高位數據Int型賦給longint型,int型數據放在低16位,高位補0Unsigned型賦給longint型,高位補0實型賦給整型,舍棄實數的小數部分整型賦給實數、數值大小不變,存儲形式變為浮點數形式條件語句(if語句)功能:是一種選擇結構,用來判斷給出的條件是否滿足,并根據判定結果來決定要執行的操作If語句的三種形式

1、簡化的if語句

形式:if(表達式)

語句;

說明:

表達式一般是邏輯、關系表達式,值為0或非0;

語句可以是單條語句,也可以是花括號括起來的多條語句

2、If~else語句

形式:if(表達式)

語句1;

else

語句2;

3、if~elseif語句

形式:if(表達式1)

語句1;

elseif(表達式2)

語句2;

elseif(表達式n)

語句n;

else

語句n+1;If語句的嵌套

if語句中又包含一個或多個if語句

形式:if(表達式1)

{if(表達式2)語句1;

else語句2;}

else

{if(表達式3)語句3;

else語句4;}

功能:實現多路選擇功能

注意:else總于最近的未配對的if配對,為了區分層次關系最好用花括弧將相關語句塊括起來【例3.3】判斷一個數是否大于60。#include<iostream.h>voidmain(){inta;cin>>a;cout<<″大于60嗎?″<<endl;if(a>60)cout<<″是″;elsecout<<″否″;}【例3.4】判斷一個整數是正數、負數還是0。Voidmain(){inta;cin>>a;if(a>=0)if(a==0)cout<<″零″;elsecout<<″正數″;elsecout<<″負數″;}開關語句(switch語句)形式:switch(表達式)

{case常量表達式1:語句1;break;

case常量表達式2:語句2;break;

case常量表達式n:語句n;break;

default:語句n+1;break;}功能:首先計算switch語句中表達式的值,當表達式的值與某一個case后面常量表達式的值匹配時,執行該case后的語句,遇到break語句退出switch語句;若表達式值與所有case后面的常量值都不匹配,則執行default語句注意:1、case語句及default語句出現的順序沒有影響,但每個case后的常量表達式值必須各不相同;

2、若case后面無break語句,則在執行完case語句后,不再進行條件判斷,直接轉向下一個case語句繼續執行,直到遇到break才能推出switch語句;

3、default語句后的break可省略;

4、多個case語句可共享一組執行語句;

如:switch(grade)

{case‘A’:

case‘B’:

case‘C’:case‘D’:cout<<“及格\n”;break;

default:cout<<“不及格”;}【例3.5】一個產品分為m、p、q3個等級,根據等級可打印相應的產品的價格。switch(grade){case′m′:cout<<″1500″;break;case′p′:cout<<″1000″;break;case′q′:cout<<″500″;break;defaut:cout<<″沒有這個等級″;}【例3.6】將月份的阿拉伯數字轉換成對應月份的英文單詞。#include<iostream.h>voidmain(){intmonth;cin>>month;switch(month){case1:cout<<″January″<<endl;break;case2:cout<<″February″<<endl;break;case3:cout<<″March″<<endl;break;case4:cout<<″April″<<endl;break;case5:cout<<″May″<<endl;break;case6:cout<<″June″<<endl;break;case7:cout<<″July″<<endl;break;case8:cout<<″August″<<endl;break;case9:cout<<″Septemper″<<endl;break;case10:cout<<″October″<<endl;break;case11:cout<<″November″<<endl;break;case12:cout<<″December″<<endl;break;default:cout<<″沒有這個月份.″;}}循環語句循環語句主要有三種:for循環語句、while語句和do~while循環語句While語句

形式:while(表達式)

循環體語句;

功能:先判斷表達式的值,為真則執行循環體,否則終止循環,循環體內需對循環控制變量進行修改Do~while語句

形式:do循環體語句;

while(表達式);

功能:先執行一次循環體語句,然后判斷是否滿足循環條件。Do~while語句中循環體至少被執行一次。【例3.7】讀入若干個學生的成績,計算他們的平均成績。#include<iostream.h>voidmain(){intsum=0,count=0,grade;cin>>grade;while(grade>=0)//0表示輸入結束{count++;sum+=grade;cin>>grade;}if(count>0)cout<<″平均成績是:″<<sum/count<<endl;}【例3.8】求1~15的和。#include<iostream.h>main(){intj=1,sum=0;Dosum+=j++;while(j<16);cout<<″1~15的和是:″<<sum<<endl;}for循環語句形式:for(表達式1;表達式2;表達式3)

循環體語句;功能:先計算表達式1的值,再判斷表達式2的值決定是否執行循環體,表達式2的值為真則執行,否則退出循環;沒執行完一次循環體后,計算表達式3的值,再判斷表達式2的值決定是否繼續執行循環。說明:

表達式1是用來初始化循環變量的表達式;

表達式2是循環條件表達式,決定什么時候退出循環;

表達式3是增量表達式,決定循環變量的變化方式。注意:for語句括號內的三個表達式都可以省略,但分號不能省略;

1、省略表達式1,應在for語句前給循環變量賦值;

2、省略表達式2,即不判斷結束條件,循環無終止進行,應在循環體中設置轉向語句結束循環;

3、省略表達式3,在循環體中應有改變循環變量值的語句。【例3.9】用for語句求1~15的和。intsum=0;for(intj=1;j<=15;j++)sum+=j;也可寫為:j=1;for(;j<=15;){sum+=j;j++;}例3.31intm=0;for(intj=1;j<=5;j++)for(intk=1;k<=6;k++)for(intp=1;p<=7;p++)m++;//m=5*6*7=210轉向語句轉向語句用于控制程序執行順序,實現程序無條件轉移的語句常見的轉向語句有4種:

1、break語句

形式:break;

功能:

(1)用于switch語句中,可使程序跳出switch語句,繼續執行switch后面的語句;

(2)用于循環語句中,可使程序從最近的封閉循環體中跳出,繼續執行循環體后面的語句

2、continue語句(繼續語句)

形式:continue;

功能:用于循環語句中,可使程序結束本次循環,即跳過continue后面的語句,轉去判斷循環控制條件,決定是否進行下一次循環

注意:continue語句只結束本次循環,不結束整個循環結構;

break語句是結束最近一層循環的整個循環結構。【例3.10】讀入10個學生的成績,計算其平均成績,如果遇到負數則報告出錯并退出。#include<iostream.h>voidmain(){intrecord,sum=0;boolflag=true;for(intj=1;j<=10;j++){cin>>record;if(record<0){flag=false;break;}sum+=record;}if(flag)cout<<″平均成績是:″<<sum/10.0<<endl;elsecout<<″出錯″<<endl;}【例3.11】統計一句話(以′.′結束)里字符a的數目。#include<iostream.h>voidmain(){intcount=0;charc;while(c!=′.′){cin>>c;if(c!=′a′)continue;//如果不是字符′a′,則讀下一個字符,否則計數器加1count++;}cout<<count;}3、goto語句(無條件轉移語句)

形式:goto語句標號;

說明:語句標號是一個標識符,放在某一行語句的前面,后加“:”

功能:使程序無條件跳轉到標號所指的語句處執行

注意:在結構化程序設計中盡量不用goto語句4、return語句

形式:return表達式;

功能:停止執行當前函數,指定函數要返回的值,轉去執行調用函數后面的語句

注意:return語句后表達式的類型必須與函數類型一致循環嵌套(多重循環)概念:在一個循環體中又包含另一個循環語句稱為循環嵌套,又稱多重循環說明:for、while、do~while三種循環語句都可以相互嵌套,先執行最里層的循環語句,再依次執行外層的循環語句,注意內外循環不能交叉【例3.12】給一個二維數組的各個元素賦初值。#include<iostream.h>voidmain(){inta[3][4];cout<<″輸入整數:″;for(intj=0;j<3;j++)for(intk=0;k<4;k++){cout<<″a[″<<j<<″][″<<k<<″]=:″;cin>>a[j][k];}}函數函數是程序設計語言中實現某項功能的基本單位,程序通過在各個函數之間進行調用來實現總體的功能函數可以是用戶自定義的,也可以是系統定義好的標準函數(庫函數)一個C++程序中可以有多個函數,但main函數只能有一個,除main函數外,函數地位平等,可以相互調用,main函數不能被其他函數調用函數的定義C++程序中函數需先聲明或定義后方可調用形式:函數類型函數名(參數列表)

{函數體}說明:

1、函數類型也就是函數的返回值類型,函數的返回值一般由return語句給出;沒有返回值,函數類型為void;沒有指定函數類型,默認類型為int;return語句返回值類型與函數類型不一致將自動轉換為函數名前的類型;

2、函數名需滿足標識符命名規則,后必須跟一對圓括號;

3、函數的參數列表是括號中的0個或多個“,”分隔的形式參數(形參),形參只是一個標識符,用來確定函數參數的個數、位置、類型,在函數調用過程中進行數值傳送

4、函數定義是相互獨立的,不能在一個函數體中定義另一個函數【例3.13】編寫一個返回一個整數的絕對值的函數。intabsolute(ints){intz;//函數體里的變量聲明if(s>=0)z=s;elsez=-s;returnz;}函數原型聲明在C++中,如果被調用函數在使用時尚未定義,即調用在前定義在后,則必須在函數調用前對其函數原型進行聲明形式:函數類型函數名(參數列表);注意:

1、在函數原型聲明中,參數名可以省略,但參數的類型和函數類型不可以省略;

例3.13原型聲明可寫為:intabsolute(int);

2、在函數定義和原型聲明中的參數均為形參,它們間的參數名可以不同,但類型、順序不能變;

3、函數原型聲明可以放在主調函數內部,也可以在外部,位于主調函數內部必須位于調用語句之前,在外部需位于主調函數之前函數的參數與返回值形參:定義(聲明)函數時,函數名后面括號中的變量名實參:調用函數時,函數名后括號中的參數(或表達式)功能:形參和實參用于實現主調函數與被調函數之間數據的傳遞;函數未被調用時,形參并不占用實際內存空間,一旦函數被調用,系統將為形參分配空間,并將實參的值放在所分配的空間中形參與實參的傳遞有兩種形式:

傳值參數傳遞、引用參數傳遞函數的傳值參數傳遞概念:在函數調用時,將實參的值復制到形參的存儲空間中,在執行該函數的參數傳遞方式特點:在函數執行過程中,形參的變化不影響實參的值【例3.21】分析下面的程序,能否實現交換兩個數值#include<iostream.h>voidswap(floatx,floaty){floata=x;x=y;y=a;}voidmain(){floatm=6,n=27;cout<<″交換前:″<<endl;cout<<endl<<″m=″<<m<<endl;cout<<″n=″<<n<<endl;swap(m,n);cout<<″交換后:″<<endl;cout<<endl<<″m=″<<m<<endl;cout<<″n=″<<n<<endl;}運行結果:交換前:m=6n=27交換后:m=6n=27函數的引用參數引用:變量或對象的別名格式:類型名&引用名=變量名;說明:

1、變量名必須已定義過,類型應與引用的類型一致;

2、聲明引用時必須賦初值,且不能在程序中改變引用的目標;一個變量的引用就是它的別名,不能再是其它變量的別名;

3、聲明的引用可當作目標變量一樣使用;

4、引用也可將變量地址賦給一個指針變量。【例3.22】引用的定義。intm;int&n=m; //引用n是變量m的別名m=53;cout<<n; //n也是53n+=22; //n變為75,m也是75cout<<m; //輸出75【例3.23】用引用實現交換兩個數值。#include<iostream.h>voidswap(float&x,float&y) //x和y都是引用參數{floata=x;x=y;y=a;}voidmain(){floatm=6,n=27;cout<<″交換前:″<<endl;cout<<endl<<″m=″<<m<<endl;cout<<″n=″<<n<<endl;swap(m,n);cout<<″交換后:″<<endl;cout<<endl<<″m=″<<m<<endl;cout<<″n=″<<n<<endl;}運行結果:交換前:m=6n=27交換后:m=27n=6設置函數參數的默認值概念:函數的默認參數也稱為缺省參數,是在函數定義或聲明時就將其中一個或多個參數(形參)進行初始化賦值,使調用函數在參數缺省狀態下默認使用該值

例:floatgh(floatm,floatn,floatp=9);

調用gh(6,8)等同于gh(6,8,9)注意:

1、如果不需要使用形參設置的默認值,可以通過實參設置新值;

2、給函數中多個形參部分設置默認值,必須按照從右到左的順序指定默認值,即為某個參數指定默認值時,其后的參數都必須指定默認值,否則已設默認值將被忽略。Voidfl(doublea,floatb=2.5,intc=1);正確的Voidfl(doublea,floatb=2.5,intc);b的默認值無效3、設置默認值后,實參的個數可以與形參的不同,函數調用時,實參與形參按照從左到右的順序進行匹配,沒有給出實參的,形參就取消指定的默認值。例intsum(inta,intb,intc=5,intd=6);調用sum(3,2,1)等價于sum(3,2,1,6)函數的調用對函數進行過定義或原型聲明后即可進行調用,調用過程包括:參數傳遞、函數體執行、返回主調函數形式:函數名(實參列表)注意:

1、調用無參函數,函數后的括號不能省;

2、實參與形參一一對應,即個數相等、類型匹配、順序一致(有默認值的可缺省);

3、若函數無返回值,可將函數單獨調用作為一條語句,完成一定的操作;

4、若函數有返回值,可將函數作為語句的一部分,利用返回值參與表達式的運算或執行某項操作【例3.14】編寫一個程序,輸出一個正整數的全部約數。#include<iostream.h>#include<math.h>//調用系統定義的數學函數需要voidsearch(ints){if(s>0){cout<<endl;inth,j;if(sqrt(s)==int(sqrt(s)))cout<<″″<<sqrt(s);//sqrt(s)==int(sqrt(s))判斷有無平方根;int(sqrt(s))強制類型轉換h=int(sqrt(s));for(j=1;j<=h;j++)//一個整數x,能寫成x=m*n,m的值一定不會超過sqrt(x)的if(s%j==0)cout<<″″<<j<<″″<<s/j;}elsecout<<″不是一個正數″<<endl;}voidmain(void){intr;cout<<″請輸入一個正數:″<<endl;cin>>r;search(r);}【例3.15】編制一個程序,將一個十進制的一位數變為二進制的數輸出。#include<iostream.h>voidconvert(ints){switch(s){case0:cout<<0;break;case1:cout<<1;break;case2:cout<<10;break;case3:cout<<11;break;case4:cout<<100;break;case5:cout<<101;break;case6:cout<<110;break;case7:cout<<111;break;case8:cout<<1000;break;case9:cout<<1001;}cout<<endl;}voidmain(){intp;cout<<″輸入一個數字:″;cin>>p;convert(p);}函數的嵌套調用C++中函數定義不允許嵌套定義,但允許函數嵌套調用,即在調用一個函數的過程中又調用另一個函數【例3.16】計算k=sin2r+a2+sins的值。sin的計算公式是:sinx=x-x3/3!+x5/5!-...【例3.16】計算k=sin2r+a2+sins的值。sin的計算公式是:sinx=x-x3/3!+x5/5!-...include<iostream.h>doublemysin(doublex){doublee=1e-6,k=0,t=x;//e是設定的精度intn=1;do{k+=t;n++;t=-t*x*x/((2*n-1)*(2*n-2));}while(t>=e);//書上fabs(t)表示浮點數t的絕對值returnk;}doublejisuan(doubler,doublea,doubles){returnmysin(r)*mysin(r)+a*a+mysin(s);}voidmain(){doubler,a,s;cout<<″輸入3個數:″;cin>>r>>a>>s;cout<<jisuan(r,a,s);}函數的遞歸調用一個函數直接或間接地調用該函數本身,稱為函數的遞歸調用兩種方式:

1、直接遞歸,一個函數中直接調用自身,例3.17;

2、間接遞歸,一個函數中調用其他函數,其他函數又調用該函數,例3.18;【例3.17】計算函數f(x)。f(x)= 3, 當x=0時 f(x-1)+6, 當x>0時#include<iostream.h>intf(intx){if(x<0)cout<<″參數錯誤″<<endl;elseif(x==0)return3;elsereturnf(x-1)+6;}voidmain(){intg=35;cout<<″結果為:″<<f(g)<<endl;}運行結果為:213(35×6+3=213)【例3.18】計算函數f(x)。f(x)=0, 當x=0時f(x-1)+3, 當x為正奇數時 f(x-1)+5, 當x為正偶數時#include<iostream.h>intfeven(intx);//聲明feven(x)函數,x為偶數時調用intfodd(intx)//fodd(x),x為奇數時調用,x-1為偶數{returnfeven(x-1)+3;}intfeven(intx)//feven(x),x為偶數時調用,x-1為奇數{if(x==0)return0;elsereturnfodd(x-1)+5;}voidmain(){intg=16;if(g%2==0)cout<<feven(g)<<endl;//偶數執行feven(g)elsecout<<fodd(g)<<endl;//奇數執行fodd(g)}執行結果為:64

(g=16,其中有8個奇數、8個偶數,f(g)=8*3+8*5=64)【例3.19】指出下面的程序為什么是錯誤的。main(){intd;df();}intdf(){cout<<d;}1、函數df()需先定義后使用;2、d為局部變量,df()函數無法使用。例3.18Feven(x)偶數Fodd(x-1)奇數Fodd(x)奇數Feven(x-1)偶數調用調用調用調用函數的重載概念:指同一個函數名可以對應多個不同的函數實現,每一類實現對應一個函數體,這類函數名相同,功能相近,只是參數的類型或個數不同函數參數類型重載

函數參數個數相同,但其類型中至少有一個不同函數參數個數重載

利用函數的參數個數不同實現函數的重載【例3.24】重載函數meet。函數meet有兩個功能,如果它的兩個參數是char型的,那么函數meet將兩者連接起來輸出,如果它的兩個參數的類型是double型的,那么函數meet將輸出兩者的和。#include<iostream.h>voidmeet(charx,chary){cout<<″字符串是:″;cout<<x<<y<<endl;}voidmeet(doublex,doubley){cout<<″兩數的和是:″;cout<<x+y<<endl;}voidmain(){meet(′a′,′b′);meet(5.6,7.3);}運行結果為:字符串是:ab兩數的和是:12.9程序在運行時根據參數類型判別執行哪一個函數體【例3.25】重載函數abs(),求int、float和double類型數據的絕對值intabs(intx){if(x>=0)returnx;elsereturn-x;}floatabs(floatx){if(x>=0)returnx;elsereturn-x;}doubleabs(doublex){if(x>=0)returnx;elsereturn-x;}voidmain(){inta=-357;floatb=63.85;doublec=-6974.26;cout<<abs(a)<<′\t′<<abs(b)<<′\t′<<abs(c)<<endl;}輸出結果為:35763.856974.26【例3.26】求若干個參數當中的最大的值,根據參數個數的不同調用不同的max()函數。#include<iostream.h>floatmax(floatx,floaty){if(x>y)returnx;elsereturny;}floatmax(floatx,floaty,floatz){floatb=max(x,y);returnmax(b,z);}Voidmain(){cout<<max(1,2)<<endl;cout<<max(1,2,3);}程序的執行結果是:23系統會根據參數的個數正確地選擇執行函數系統函數的調用系統函數是系統預先定義好的,使用時只要在程序前加入正確的頭文件就可以調用【例3.27】應用math.h中定義的sin()函數,求0.05到π/4之間的正弦函數值#include<iostream.h>#include<math.h>voidmain(){doublepi=3.14,x=0.05;inti=0;while(x<pi/4){cout<<

溫馨提示

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

評論

0/150

提交評論