c《面向?qū)ο蟪绦蛟O(shè)計》第三章.ppt
2020/7/27,北京科技大學(xué)計算機系,-1-,C+大學(xué)基礎(chǔ)教程,第3章 C+控制語句 北京科技大學(xué)計算機系,2020/7/27,北京科技大學(xué)計算機系,-2-,用計算機解決實際問題,首先要分析問題,設(shè)計合適的算法,然后編程實現(xiàn)算法。,2020/7/27,北京科技大學(xué)計算機系,-3-,第3章 過程化語句,3.0 算法的基本控制結(jié)構(gòu): 算法,基本控制結(jié)構(gòu),基本控制語句 3.1 順序結(jié)構(gòu)程序設(shè)計 3.2 if選擇語句 語句格式,IF嵌套,考點說明 3.3 switch選擇語句 語句格式和執(zhí)行順序,例子,考點說明 3.4 循環(huán)語句 使用場合,基本概念,格式 轉(zhuǎn)向語句 3.5 循環(huán)嵌套 國際象棋,例2 3.6 應(yīng)用舉例 素數(shù),按位翻轉(zhuǎn),小球落地(不要求), 小牛家族,最大公約數(shù),階乘 課堂練習(xí),總結(jié)和作業(yè),2020/7/27,北京科技大學(xué)計算機系,-4-,算法,什么是算法 為解決某一應(yīng)用問題而采用的解題步驟 算法 1、計算機執(zhí)行的操作 2、這些操作的順序,2020/7/27,北京科技大學(xué)計算機系,-5-,算法,算法的描述方式 用自然語言描述算法 用流程圖描述算法 用N-S結(jié)構(gòu)圖描述算法,例如:輸出兩個數(shù)中的最大數(shù),2020/7/27,北京科技大學(xué)計算機系,-6-,用自然語言描述算法,第一步:輸入x和y的值 第二步:比較x和y的值,如果x大于y,則輸出x的值,否則輸出y的值。,易于理解,但冗長,不夠精確,難于描述復(fù)雜算法。,例如當描述“輸出10個數(shù)中最大數(shù)”的算法時,會冗長、難于理解,2020/7/27,北京科技大學(xué)計算機系,-7-,用流程圖描述算法,用流程圖描述算法,起止框,輸入/輸出框,判斷框,處理框,流程線,2020/7/27,北京科技大學(xué)計算機系,-8-,3.1 算法的基本控制結(jié)構(gòu),流程圖 開始/結(jié)束 執(zhí)行 判斷 聯(lián)系,2020/7/27,北京科技大學(xué)計算機系,-9-,用N-S結(jié)構(gòu)圖描述算法,用N-S結(jié)構(gòu)圖描述的算法,2020/7/27,北京科技大學(xué)計算機系,-10-,3.1 算法的基本控制結(jié)構(gòu),程序的三種基本控制結(jié)構(gòu) 小結(jié) (1)順序結(jié)構(gòu) (2)選擇結(jié)構(gòu) (3)循環(huán)結(jié)構(gòu),已經(jīng)證明,任何復(fù)雜的問題都可以三種基本算法結(jié)構(gòu)來描述:順序、選擇、循環(huán)。因此用計算機語句描述的程序也包含三種基本結(jié)構(gòu)。,2020/7/27,北京科技大學(xué)計算機系,-11-,順序結(jié)構(gòu)流程圖,A,B,A,B可以是一條語句,也可以是一條復(fù)合語句,,C+中默認的語句執(zhí)行次序為:順序執(zhí)行。,2020/7/27,北京科技大學(xué)計算機系,-12-,分支結(jié)構(gòu)流程圖,2020/7/27,北京科技大學(xué)計算機系,-13-,循環(huán)結(jié)構(gòu)流程圖,2020/7/27,北京科技大學(xué)計算機系,-14-,總結(jié)以上三種結(jié)構(gòu)有以下的共同特點: )只有一個入口。 )只有一個出口。 )結(jié)構(gòu)內(nèi)的每一個部分都有機會被執(zhí)行到 )結(jié)構(gòu)內(nèi)不存在死循環(huán)。,2020/7/27,北京科技大學(xué)計算機系,-15-,3.1 算法的基本控制結(jié)構(gòu),流程控制語句 選擇語句:if.else、switch 選擇結(jié)構(gòu) 循環(huán)語句: while、for 、do.while 循環(huán)結(jié)構(gòu) 轉(zhuǎn)向語句:break、continue,2020/7/27,北京科技大學(xué)計算機系,-16-,順序結(jié)構(gòu)程序是按照語句的先后順序依次執(zhí)行。一般而言,順序結(jié)構(gòu)的算法中應(yīng)包括幾個基本操作步驟。各操作步驟的邏輯順序關(guān)系如圖3-1所示。,圖3-1 順序程序的一般算法,2020/7/27,北京科技大學(xué)計算機系,-17-,【例3-2】數(shù)據(jù)交換。從鍵盤輸入x、y的值,輸出交換以后的值。,#include using namespace std; int main( ) int x,y,c; cout xy; cout <<n<<before exchange: x=<<x<< y=<<y<<endl; c=x; x=y; y=c; cout <<n<<after exchange: x=<<x<< y=<<y<<endl; return 0; ,2020/7/27,北京科技大學(xué)計算機系,-18-,1. 簡單分支(無else分支) if (表達式) 語句 例:if (xy) coutb) c=a;a=b;b=c; 2. 雙分支 if (表達式) 語句1 else 語句2 例:if (a=b) cout<<a; else cout<<b; 3. 多分支 if (表達式1) 語句1 else if (表達式2) 語句2 else if (表達式3) 語句3 else 語句 n,if 語句 三種形式,1條內(nèi)嵌語句,表達式是邏輯表達式,例子:閏年,2020/7/27,北京科技大學(xué)計算機系,-19-,例子,任意輸入一個4位整數(shù)的年份,判斷該年是否是閏年?,閏年的條件: 能夠被4整除,但不能被100整除的年份 能夠被4整除,同時也能被400整除的年份,是指年份能被4整除的那些年,但不包括能被100整除而不能被400整除的年,if (year % 4 = 0 void main() int year; cinyear; if (year % 4 = 0 ,2020/7/27,北京科技大學(xué)計算機系,-21-,2020/7/27,北京科技大學(xué)計算機系,-22-,例子:輸出學(xué)生的成績,#include using namespace std; void main() int x; cinx; if(x=90) cout=80) cout=60) cout<<“合格”<<endl; else cout<<“不及格”<<endl; ,2020/7/27,北京科技大學(xué)計算機系,-23-,3.2 if選擇語句,4、if 語句的嵌套,if (表達式1) if (表達式2) 語句1 else 語句2 else if (表達式3) 語句3 else 語句4,2020/7/27,北京科技大學(xué)計算機系,-24-,2020/7/27,北京科技大學(xué)計算機系,-25-,例子:輸出a,b,c中最大的數(shù),#include using namespace std; void main() int a,b,c; cinabc; if (a<b) if (b<c) cout<<c<<endl; else cout<<b<<endl; else if (a<c) cout<<c<<endl; else cout<<a<<endl; ,cout<< (a<b?(b<c?c:b):(a<c?c:a ) );,演示,2020/7/27,北京科技大學(xué)計算機系,-26-,1.內(nèi)嵌語句只能是一條語句。 eg. a,b,c的值分別為1,2,3 if(a+b) c=a; a=b;b=c; c=3; a=2;b=3;,考點注意:,c=3;a=2;b=2;,2020/7/27,北京科技大學(xué)計算機系,-27-,2.條件表達式是邏輯值,但可以使用任何類型的表達式,結(jié)果非0為真,結(jié)果0為假。 思考執(zhí)行下面語句后,變量b的值是多少? a = 10; b = 30; if (a = 0) b = 15; else b = 20 ; if (a = 1) b = 15; else b = 20 ; if (a = 1) b = 15; else b = 20 ; 注意: 賦值表達式 a = 1與關(guān)系表達式 a = = 1 的區(qū)別。 表達式的值為0時語句的執(zhí)行情況。,注意:,2020/7/27,北京科技大學(xué)計算機系,-28-,3.2 if選擇語句,3 注意:二義性(出現(xiàn)嵌套) int x=-1; if (x0) if (x<50) cout<<“x is <50”endl; else cout<<“x is <=0”<<endl;,if和else的對應(yīng)關(guān)系,else總是與離它最近的if匹配。,2020/7/27,北京科技大學(xué)計算機系,-29-,說明:C+規(guī)定,在if嵌套時,else總是與最近的if配對 eg. if (b1) if (b2) x=1; else x=2; if (b1) if (b2) x=1; else x=2; if (b1) if (b2) x=1; else x=2; 如果內(nèi)嵌的if是簡單分支,沒有else子句(即if和else的數(shù)目不一樣),必須用 將其括起,2020/7/27,北京科技大學(xué)計算機系,-30-, if (c=50) cout 150n; if (c=50) cout << 50<=c<=100n; else cout << c<50n;,例如:, if (c=50) cout <<50<=c<=100n;,與哪個if 配對?,2020/7/27,北京科技大學(xué)計算機系,-31-,再例如:,if(ab) /1 if(ac) /2 if(ad) flag=1; /3 else flag=2; /4 else flag=3; /5,問題:第4 行和第5 行的 else 和哪一個 if 相匹配? 分析:匹配方案可以有很多種:(2-4,1-5)、(3-4, 2-5),(1-4,),匹配規(guī)則:在嵌套的ifelse語句中,else總是與上面的、離它最近的、在同一復(fù)合語句中還沒有配對的if配對。,2020/7/27,北京科技大學(xué)計算機系,-32-,等價于:, if (ab) if (ac) if (ad) flag=1; else flag=2; else flag=3;, if (ab) if (ac) if (ad) flag=1; else flag=2; else flag=3;,flag=3的條件:,flag=3 的條件:,當 cab 時,當 a b 時,2020/7/27,北京科技大學(xué)計算機系,-33-,一般形式 switch (表達式) case 常量表達式 1:語句1 case 常量表達式 2:語句2 case 常量表達式 n:語句n default : 語句n+1 ,switch 語句,執(zhí)行順序 以case中的常量表達式值為入口標號,由此開始順序執(zhí)行。因此,每個獨立的case分支最后應(yīng)該加break語句,跳出整個switch語句。,2020/7/27,北京科技大學(xué)計算機系,-34-,2020/7/27,北京科技大學(xué)計算機系,-35-,例子:輸出學(xué)生的成績,int x; cinx; switch(x/10) case 10: case 9:cout<<“優(yōu)秀”<<endl; break; case 8: cout<<“良好”<<endl; break; case 7: case 6: cout<<“合格”<<endl; break; default: cout<<“不及格”<<endl; ,2020/7/27,北京科技大學(xué)計算機系,-36-,使用switch語句應(yīng)注意的問題,case分支可包含多個語句,且不用 。 表達式、常量表達式值都是int型或char型。 若干分支執(zhí)行內(nèi)容相同可共用一組語句。 Break退出switch結(jié)構(gòu),2020/7/27,北京科技大學(xué)計算機系,-37-,例子,k=23,int v1=0,v2=0,v3=0,v4=0,k; cin k; switch(k) default:v4+; case 1:v1+; case 2:v3+; case 3:v2+; ,v1=1, v2=1, v3=1, v4=1,2020/7/27,北京科技大學(xué)計算機系,-38-,問題1:如何根據(jù)收入,確定一個人的納稅比例及納稅額?,當一個公司有多名員工時,如何計算每個人的納稅比例及納稅額?,提出問題:,C+語言:循環(huán)語句,?,?,問題2 :如何根據(jù)學(xué)生的分數(shù)判斷是否及格?,如何根據(jù)全班學(xué)生的分數(shù),分別判斷他們是否及格?,2020/7/27,北京科技大學(xué)計算機系,-39-,#include #include using namespace std; void main() cout<<setfill(*) <<setw(2)<<n <<setw(3)<<n <<setw(4)<<n <<setw(5)<<n <<setw(6)<<n <<setw(7)<<n <<setw(8)<<n; ,* * * * * * *,2020/7/27,北京科技大學(xué)計算機系,-40-,#include #include using namespace std; void main() int i=2; cout<<setfill(*); while( ) cout<<setw( )<<n; ,* * * * * * *,循環(huán)變量,循環(huán)體,循環(huán)控制條件,i<=8,i,i+;,2020/7/27,北京科技大學(xué)計算機系,-41-,3.4 循環(huán)語句,主要包括3個部分: 1、循環(huán)控制條件: 判斷循環(huán)操作是否進行的條件; 2、循環(huán)體: 重復(fù)進行的操作; 3、循環(huán)控制變量: 記錄循環(huán)體執(zhí)行的次數(shù),或控制循環(huán)的結(jié)束條件。,2020/7/27,北京科技大學(xué)計算機系,-42-,3.4 循環(huán)語句,三種基本語法 1、 while 語句 格式和順序,例子 2、 dowhile 語句格式和順序,對比,例子 3、 for 語句 格式和順序,例子,說明 三種語句的應(yīng)用區(qū)別,2020/7/27,北京科技大學(xué)計算機系,-43-,3.4 循環(huán)語句,while循環(huán)語句,while(表達式) 循環(huán)體語句;,2020/7/27,北京科技大學(xué)計算機系,-44-,例1:編程循環(huán)輸出1-9這9個數(shù)字?,#include using namespace std; void main() int i=1; while ( ) cout<<“循環(huán)結(jié)束”<<endl; ,運行結(jié)果: 1 2 3 4 5 6 7 8 9 循環(huán)結(jié)束,i<=9,cout<<i<<endl; i+;,2020/7/27,北京科技大學(xué)計算機系,-45-,例2:編程計算1+3+5+.+99的值,#include using namespace std; void main() int sum=0,i=1; while( ) cout<<sum<<endl; ,2500,sum+=i; i+=2;,i<=99,2020/7/27,北京科技大學(xué)計算機系,-46-,注意:,如果while的 (表達式) 值為0,則循環(huán)體一次也不執(zhí)行 (例如當i的初值=100) 。 在循環(huán)體中必須有使循環(huán)趨向結(jié)束的操作,否則循環(huán)將無限進行(死循環(huán))。 在循環(huán)體中,語句的先后位置必須符合邏輯,否則會影響運算結(jié)果。,思考程序段的輸出? while (i<=99) i+=2; sum=sum+i; ,運行后,輸出: sum=2600 原因是什么?,2020/7/27,北京科技大學(xué)計算機系,-47-,其他的while 語句形式,while (0) . 由于表達式恒等于0,所以循環(huán)體永遠也不會執(zhí)行,是一個邏輯錯誤的語句,while (1) . 由于表達式恒等于1,所以不可能通過循環(huán)控制條件來結(jié)束循環(huán)體的執(zhí)行,即死循環(huán)。 為了保證循環(huán)正常運行,應(yīng)該特別注意: 循環(huán)控制條件的描述 控制條件的初始狀態(tài)(初始值) 循環(huán)體內(nèi)部對控制條件的影響,2020/7/27,北京科技大學(xué)計算機系,-48-,例3:打印可視字符,#include using namespace std; void main() unsigned char ch=32; while(ch<128) cout<<(int)ch<<t<<ch<<t; ch+; ,2020/7/27,北京科技大學(xué)計算機系,-49-,例4:編程計算 的值,#include using namespace std; void main() int k=1,sum=0,n; cout0):; cinn; while( ) if(n0) cout<<sum/n<<endl; else cout<<n不能<=0<<endl; ,k<=n,sum=sum+k*k; k+;,2020/7/27,北京科技大學(xué)計算機系,-50-,3.4 循環(huán)語句,do.while循環(huán)語句,do 循環(huán)體語句; while(表達式);,2020/7/27,北京科技大學(xué)計算機系,-51-,do-while 語句,執(zhí)行順序 先執(zhí)行循環(huán)體語句,后判斷條件。表達式為 true 時,繼續(xù)執(zhí)行循環(huán)體 與while 語句的比較: do-while語句至少執(zhí)行循環(huán)體一次; While語句有可能一次也不執(zhí)行循環(huán)體,2020/7/27,北京科技大學(xué)計算機系,-52-,對比下列程序:,程序1: #include void main( ) int i, sum(0); cini; while(i<=10) sum+=i; i+; cout<<sum=<<sum<<endl; ,程序2: #include void main( ) int i, sum(0); cini; do sum+=i; i+; while(i<=10); cout<<sum=<<sum<<endl; ,2020/7/27,北京科技大學(xué)計算機系,-53-,#include #include using namespace std; void main() int i=2; cout<<setfill(*); while(i<=8) cout<<setw(i)<<n; i+; ,* * * * * * *,do while( );,i<=8,cout<<setw(i)<<n; i+;,2020/7/27,北京科技大學(xué)計算機系,-54-,例子:編程計算 的值,#include using namespace std; void main() int k=1,sum=0,n; cout0):; cinn; while(k0) cout<<sum/n<<endl; else cout<<n不能<=0<<endl;,do sum=sum+k*k; k+; while(k<=n);,2020/7/27,北京科技大學(xué)計算機系,-55-,3.4 循環(huán)語句,for循環(huán)語句 循環(huán)結(jié)構(gòu) 1、表達式1 循環(huán)變量初始化; 2、表達式2 循環(huán)控制條件; 3、表達式3 循環(huán)變量的變化;,for (表達式1; 表達式2; 表達式3) 循環(huán)體;,2020/7/27,北京科技大學(xué)計算機系,-56-,例1:編程循環(huán)輸出1-9這9個數(shù)字?,#include using namespace std; void main() for (int i=1; i<10; i+) cout<<i<<endl; cout<<“循環(huán)結(jié)束”<<endl; ,運行結(jié)果: 1 2 3 4 5 6 7 8 9 循環(huán)結(jié)束,2020/7/27,北京科技大學(xué)計算機系,-57-,例2:編程計算1+2+3+.+10的值,#include using namespce std; void main() int sum=0; for (int i=1;i<=10;i+) sum+=i; cout<<sum<<endl; ,運行結(jié)果:55,2020/7/27,北京科技大學(xué)計算機系,-58-,#include #include using namespace std; void main() cout<<setfill(*); ,* * * * * * *,例3,for(int i=2;i<=8;i+) cout<<setw(i)<<n;,2020/7/27,北京科技大學(xué)計算機系,-59-,for 語句說明,1,for語句中的表達式可以部分或全部省略,但兩個“;”不可省略。省略表達式1時,此時應(yīng)在for語句之前給循環(huán)變量賦初值。如果省略表達式2,即不判斷循環(huán)條件,循環(huán)無終止地進行下去。省略表達式3時,此時程序設(shè)計者應(yīng)另外設(shè)法保證循環(huán)能正常結(jié)束。 2,for后一對圓括號中的表達式可以是任意有效的C+語言表達式。例如: for(sum=0,i=1;i<=100;sum=sum+i,i+) ,2020/7/27,北京科技大學(xué)計算機系,-60-,省略for語句的表達式, 表達式1、2、3全省略,即: for ( ; ; ) 就等同于:while (1),會無限循環(huán)(死循環(huán)),注意:在省略某個表達式時,應(yīng)在適當位置進行循環(huán)控制的必要操作,以保證循環(huán)的正確執(zhí)行, 省略表達式1和表達式3,即: for(;表達式2;) 就等同于:while( 表達式2 ) 省略表達式2,即: for(表達式1; ;表達式3) 就等同于:表達式1; while(1)表達式3;,2020/7/27,北京科技大學(xué)計算機系,-61-,例如:, i=1; for ( ; i<=100; i+) sum+=i;, for (i=1; ; i+) if(i100) for (i=1; i100) i+; ,2020/7/27,北京科技大學(xué)計算機系,-62-,例4:判斷輸出結(jié)果?,#include using namespace std; void main() for(int i=0,j=10,k=0; i<j; i+,j-) k+=i*j; cout<<k<<endl; ,分析: i j k 0 10 0 1 9 9 2 8 25 3 7 46 4 6 70 5 5 跳出,2020/7/27,北京科技大學(xué)計算機系,-63-,3.4 循環(huán)語句,1、for: 最適合循環(huán)次數(shù)固定,循環(huán)規(guī)律非常明顯程序。 2、while: 使用最多最頻繁的循環(huán)結(jié)構(gòu),具有普適性。 3、do_while: 最適合至少循環(huán)一次的循環(huán)結(jié)構(gòu)。,2020/7/27,北京科技大學(xué)計算機系,-64-,3.4.4 轉(zhuǎn)向語句,1、break語句 可以用在switch和循環(huán)結(jié)構(gòu),用在循環(huán)退出本層循環(huán) 2、continue語句 只能用在循環(huán)結(jié)構(gòu)中,表示退出本次循環(huán),2020/7/27,北京科技大學(xué)計算機系,-65-,3.4.4 轉(zhuǎn)向語句break,用途: 常用在while、do-while、for和switch語句中,用來跳出循環(huán)或switch語句。,2020/7/27,北京科技大學(xué)計算機系,-66-,5.5.2 循環(huán)中break的應(yīng)用,break;,while語句,break;,do-while語句,break;,for語句,2020/7/27,北京科技大學(xué)計算機系,-67-,例如:, int x,n=0,s=0; while (nx; if (x<0) break; s+=x; n+; ;, int x,n=0,s=0; do cin x; if (x<0) break; s+=x; n+; while (n<10);, for (n=0,s=0; nx; if (x<0) break; s+=x; ,2020/7/27,北京科技大學(xué)計算機系,-68-,例1:判斷輸出結(jié)果?,#include using namespace std; void main() int sum=0; for (int i=1;i<10;i+) if (i % 3=0) break; sum+=i; cout<<sum<<endl; ,分析 i sum 1 1 2 3 3 跳出,2020/7/27,北京科技大學(xué)計算機系,-69-,3.4.4 轉(zhuǎn)向語句continue,用途 用于循環(huán)語句中,結(jié)束本次循環(huán),進行下一次循環(huán);即跳過循環(huán)體中尚未執(zhí)行的部分。,2020/7/27,北京科技大學(xué)計算機系,-70-,continue;,while語句,continue;,do-while語句,continue;,for語句,2020/7/27,北京科技大學(xué)計算機系,-71-,例如:, int x,n=0,s=0; while (nx; if (x<0) continue; s+=x; n+; ;, int x,n=0,s=0; do cin x; if (x<0) continue; s+=x; n+; while (n<10);, for (n=0,s=0; nx; if (x<0) continue; s+=x; ,2020/7/27,北京科技大學(xué)計算機系,-72-,例1:判斷輸出結(jié)果?,#include using namespace std; void main() int sum=0; for (int i=1;i<10;i+) if (i % 3=0) continue; sum+=i; cout<<sum<<endl; ,分析 i sum 1 1 2 3 3 3 7 12 12 19 27 27 跳出,2020/7/27,北京科技大學(xué)計算機系,-73-,3.5 循環(huán)嵌套,編程輸出國際象棋棋盤 #include using namespace std; void main() for (int i=0;i<8;i+) for (int j=0;j<8;j+) cout<< else cout<< ; cout<<n; , ,0 1 2 3 4 5 6 7,0 1 2 3 4 5 6 7,if (i+j)%2=0),2020/7/27,北京科技大學(xué)計算機系,-74-,3.3.5 循環(huán)嵌套,【例3-15】打印由數(shù)字組成的如下所示的金字塔圖案。 1 222 33333 4444444 555555555 66666666666 7777777777777 888888888888888 99999999999999999 分析:打印圖案一般可由多重循環(huán)實現(xiàn),外循環(huán)用來控制打印的行數(shù),內(nèi)循環(huán)控制每行的空格數(shù)和字符個數(shù)。實現(xiàn)打印上金字塔圖案的程序如下。,2020/7/27,北京科技大學(xué)計算機系,-75-,注意:,#include using namespace std; int main( ) char c=48; int i, k, j; for(i=1; ;i+) / 外循環(huán)控制打印行數(shù) for(k=1; ;k+) /每行起始打印位置 cout << ; for (j= 1 ; ; j+)/內(nèi)循環(huán)控制打印個數(shù) cout <<(char)(c+i); /打印內(nèi)容數(shù)字字符19 cout << n; / 換行 return 0; ,i<=9,k<=10-i,j<= 2* i- 1,2020/7/27,北京科技大學(xué)計算機系,-76-,注意:,while、do-while、for循環(huán)語句可以并列,也可以相互嵌套,但要層次清楚,不能出現(xiàn)交叉。 多重循環(huán)程序執(zhí)行時,外層循環(huán)每執(zhí)行一次,內(nèi)層循環(huán)都需要循環(huán)執(zhí)行多次。 例如:,for(a=1;a<=10;a+) for (b=0;b<=5;b+) ,外循環(huán)執(zhí)行了10次,內(nèi)循環(huán)執(zhí)行6次 循環(huán)正常結(jié)束時,內(nèi)循環(huán)執(zhí)行了106=60次,2020/7/27,北京科技大學(xué)計算機系,-77-,3.6 應(yīng)用舉例1,任意輸入一個整數(shù),判斷是否是素數(shù)? 問題:什么是素數(shù)?,2020/7/27,北京科技大學(xué)計算機系,-78-,#include using namespace std; void main() int n,i; cinn; for (i=2;i<n;i+) if (n%i=0) break; if (i<n) cout<<n<<不是素數(shù)!n; else cout<<n<<是素數(shù)n; ,2020/7/27,北京科技大學(xué)計算機系,-79-,改進:輸出2-100之間的素數(shù),#include #include using namespace std; void main() for(int k=2;kn) cout<<k<<t; ,2020/7/27,北京科技大學(xué)計算機系,-80-,3.6 應(yīng)用舉例2,題目 任意輸入一個整數(shù),按位翻轉(zhuǎn)輸出。例如輸入124,輸出421。,2020/7/27,北京科技大學(xué)計算機系,-81-,#include using namespace std; void main() int i, n, result=0; coutn; cout<<按位翻轉(zhuǎn)的結(jié)果為:; while (n!=0) i =n % 10; result=result*10+i; n /= 10; cout<<result<<endl; ,2020/7/27,北京科技大學(xué)計算機系,-82-,do-while語句的簡單應(yīng)用,【例3-9】用輾轉(zhuǎn)相除法求m和n的最大公約數(shù)。,思路: 先求m和n相除的余數(shù)r 然后將mn,將nr,并判斷r(或n) 如果r0,再重復(fù)求余數(shù),直到 r 等于 0 時結(jié)束循環(huán) 此時的m為最大公約數(shù),2020/7/27,北京科技大學(xué)計算機系,-83-,算法和程序:,#include using namespace std; int main( ) int m,n,r; cin mn; do r=m%n; m=n; n=r; while(r!=0); cout << 最大公約數(shù)是: << m <<n; return 0; ,程序運行情況如下: 60, 96 12,2020/7/27,北京科技大學(xué)計算機系,-84-,3.6 應(yīng)用舉例3,題目 一球從100米高度落下,每次落地后反彈回原高度的一半,再落下。編程求解它在第n次落地時,共經(jīng)過多少米?,2020/7/27,北京科技大學(xué)計算機系,-85-,#include using namespace std; void main() int n=10; double height=100; double sum=height; for (int i=1;i<n;i+) sum+=height; height/=2; cout<<sum<<endl; ,2020/7/27,北京科技大學(xué)計算機系,-86-,3.6 應(yīng)用舉例4,題目 若一頭小母牛,從出生起第四個年頭開始每年開始生一頭小母牛,按此規(guī)律,第n年時有多少頭母牛?,f(1)=1; f(2)=1; f(3)=1; f(n)=f(n-1)+f(n-3);,2020/7/27,北京科技大學(xué)計算機系,-87-,#include using namespace std; void main() int n; long a=1, b=1, c=1, temp; cout n; for(int i=4; i<=n; i+) temp=a+c; a=b; b=c; c=temp; cout << c <<endl; ,2020/7/27,北京科技大學(xué)計算機系,-88-,for語句的簡單應(yīng)用,【例3-13 】求n! ,即計算p=123n的值。,思路:求階乘與求累加的運算處理過程類似,只要將“+”變?yōu)椤?”。,設(shè)置: 乘數(shù)i ,初值為1,終值為n(n是循環(huán)控制終值,需要從鍵盤輸入) 累乘器 p ,每次循環(huán)令p = p*i,2020/7/27,北京科技大學(xué)計算機系,-89-,程序:,#include using namespace std; int main( ) int i,n,p=1; cout n; for (i=1; i<=n; i+) p = p * i; cout << n << != << p << n ; return 0; ,思考: 如何輸出1!, 2!, , n! ? 如何求s =1!+ 2!+ + n! ?,2020/7/27,北京科技大學(xué)計算機系,-90-,總結(jié),三種基本結(jié)構(gòu):順序、選擇和循環(huán) 流程圖和偽碼,幫助我們設(shè)計算法、完善算法,增強算法的可讀性,2020/7/27,北京科技大學(xué)計算機系,-91-,作業(yè),P61 9,10,11,2020/7/27,北京科技大學(xué)計算機系,-92-,課堂練習(xí),選擇題 例題1:如果有以下語句: int a,b; char m,n; cinabmn; 則下列輸入數(shù)據(jù)的方式中正確的是( )。 A10,20,X,Y B1020 XY C10 20 X Y D10、20、X、Y,C,用cin輸入時,空格和回車鍵均可作為輸入字符之間的分隔符,逗號不能作為分隔符。字符型變量只能容納一個字符。,2020/7/27,北京科技大學(xué)計算機系,-93-,課堂練習(xí),選擇題 以下不正確的語句是( ) 。 Aif(xy); Bif(x=y) if(a5) a-=1; b+=1; else a+=1; b-=1; cout<<”a=”<<a<<endl; cout<<”b=”<<b; ,D,在ifelse語句的中間應(yīng)為單條語句或復(fù)合語句,不能為多條語句。,A5 Ba=5 Ca=5 D編譯時出錯 7 b=7 b=6,2020/7/27,北京科技大學(xué)計算機系,-95-,課堂練習(xí),以下不正確的是 ( )。 A語句for(i=0;i+)表示無限循環(huán) Bfor(;)表示無限循環(huán) Cfor()也表示無限循環(huán) Dwhile(1)表示無限循環(huán),C,for循環(huán)語句中的表達式可以省略,但分號不可省略。,2020/7/27,北京科技大學(xué)計算機系,-96-,課堂練習(xí),下面循環(huán)體的執(zhí)行次數(shù)為 ( )。 #include void main() int a,b; for(a=0,b=5;a<=b+1;a+=2,b-) cout<<a<<endl; A3 B2 C1 D0,A,在for語句的表達式中使用了逗號運算符對變量a和b 進行賦初值,每次循環(huán)后改變變量a和b 的值,直到a=b.,分析 a b 0 5 2 4 4 3 6 2,2020/7/27,北京科技大學(xué)計算機系,-97-,課堂練習(xí),有以下程序段: int n=0; while(n=1)n+; while循環(huán)執(zhí)行次數(shù)是_ _ 。,無限次,下面程序運行結(jié)束后,k的值為_ _ 。 #include void main() int i,j,k; for(i=0,j=10;i<=j;i+,j-) k=i+j; cout<<k; ,10,2020/7/27,北京科技大學(xué)計算機系,-98-,課堂練習(xí),有以下程序段: int n=0; while(n=1)n+; while循環(huán)執(zhí)行次數(shù)是_ _ 。,無限次,下面程序運行結(jié)束后,k的值為_ _ 。 #include void main() int i,j,k; for(i=0,j=10;i<=j;i+,j-) k=i+j; count<<k; ,10,2020/7/27,北京科技大學(xué)計算機系,-99-,課堂練習(xí),下面的程序存在著語法錯誤,請指出并予以修改 。 #include void main() float x,y; /1 if(x0); /2 x=x+y; /3 cout<<x<endl; /4 else cout<<-x; /5 ,選擇結(jié)構(gòu)語句的語法要求,條件表達式放在括號內(nèi),后面不加逗號。if 語句后面有多于一個語句時要加大括號“”,成為復(fù)合語句。,錯,2020/7/27,北京科技大學(xué)計算機系,-100-,第七周實驗,補充實驗:編寫一個程序根據(jù)輸入的三角形的三條邊判斷是否能組成三角形,如果可以則輸出它的面積和三角形類型。 實驗: 實驗3 P62 14(評分系統(tǒng)),