




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第6章循環(huán)結(jié)構(gòu)程序設(shè)計制作人:sss第6章:循環(huán)結(jié)構(gòu)程序設(shè)計
學(xué)習(xí)的意義
語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C
許多實(shí)際問題中往往需要有規(guī)律地重復(fù)某些操作,如菜譜中可以有:“打雞蛋直到泡沫狀”這樣的步驟,也就是說,在雞蛋沒有打成泡沫狀時要反復(fù)地打。相應(yīng)的操作在計算機(jī)程序中就體現(xiàn)為某些語句的重復(fù)執(zhí)行,這就時所謂的循環(huán)。
下面來思考一個問題:如何編程來計算1+2+3+…+100?程序如下:ints=0;s=s+1;s=s+2;s=s+3;
……s=s+100;printf(“s=%d”,s);重復(fù)100次,暈!??!有沒有更好的方法來計算呢?有!就是用循環(huán)來編程。第4章已討論程序結(jié)構(gòu)順序結(jié)構(gòu)選擇結(jié)構(gòu)循環(huán)結(jié)構(gòu)本章討論第5章已討論While、do-while、for語句循環(huán)嵌套
Break、continue、goto語句
exit()函數(shù)循環(huán)結(jié)構(gòu)類型的選擇及轉(zhuǎn)換循環(huán)結(jié)構(gòu)程序設(shè)計舉例本章小結(jié)學(xué)習(xí)目標(biāo)
理解循環(huán)結(jié)構(gòu)的含義;掌握C語言三種循環(huán)結(jié)構(gòu)的特點(diǎn);掌握while、do-while、for、goto、break、continue語句的使用方法;掌握不同循環(huán)結(jié)構(gòu)的選擇及其轉(zhuǎn)換方法;掌握混合控制結(jié)構(gòu)程序設(shè)計的方法。
學(xué)習(xí)內(nèi)容
語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C6.1循環(huán)結(jié)構(gòu)的程序設(shè)計
1.while語句
一般形式:while(表達(dá)式)
循環(huán)體語句;
執(zhí)行流程:expr
T循環(huán)體Fwhile其中:while后面的括號()不能省。while后面的表達(dá)式可以是任意類型的表達(dá)式,但一般是條件表達(dá)式或邏輯表達(dá)式。表達(dá)式的值是是循環(huán)的控制條件。語句部分稱為循環(huán)體,當(dāng)需要執(zhí)行多條語句時,應(yīng)使用復(fù)合語句。
特點(diǎn):先判斷表達(dá)式,再執(zhí)行循環(huán)體語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C【例】用while語句求1~100的累計和。
語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C解題思路:在處理這個問題時,先分析此題的特點(diǎn):這是一個累加的問題,需要先后將100個數(shù)相加,要重復(fù)進(jìn)行100次加法運(yùn)算,顯然可以用循環(huán)結(jié)構(gòu)來實(shí)現(xiàn)。重復(fù)執(zhí)行循環(huán)體100次,每次加一個數(shù)。分析每次所加的數(shù)有無規(guī)律。發(fā)現(xiàn)每次累加的數(shù)是有規(guī)律的,后一個數(shù)是前一個數(shù)加1,因此不需要每次用scanf語句從鍵盤臨時輸入數(shù)據(jù),只須在加完上一個數(shù)i后,使i加1就可得到下一個數(shù)。sum+=ii=i+1i≤100TFsum=0i=1傳統(tǒng)流程圖sum=0,i=1當(dāng)i≤100sum+=ii=i+1N-S流程圖具體程序如下:#include<stdio.h>intmain(){inti=1,sum=0;
while(i<=100){sum+=i; i++; }printf("sum=%d\n",sum);return0;}循環(huán)初值循環(huán)終值循環(huán)條件循環(huán)體循環(huán)變量增值運(yùn)行結(jié)果:sum=5050語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C【例】顯示1~10的平方
#include<stdio.h>
intmain(){inti=1;while(i<=10){printf("%d*%d=%d\n",i,i,i*i);i++;}return0;}運(yùn)行結(jié)果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=649*9=8110*10=100語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C(1)如果while后的表達(dá)式的值一開始就為假,循環(huán)體將一次也不執(zhí)行。(2)循環(huán)體中的語句可為任意類型的C語句。(3)遇到下列情況,退出while循環(huán):表達(dá)式為假(為0)。循環(huán)體內(nèi)遇到break、return或goto語句(break和goto語句將在隨后介紹)。
while語句注意事項:inta=0,b=0;while(a>0)//a>0為假,b++不可能執(zhí)行
b++;intnum=0;//字符計數(shù)while(1){if(getche()=='\n')//如果輸入的字符是回車符,則返回
return;num++;}語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C(4)在執(zhí)行while語句之前,循環(huán)控制變量必須初始化,否則執(zhí)行的結(jié)果將是不可預(yù)知的。(5)要在while語句的某處(表達(dá)式或循環(huán)體內(nèi))改變循環(huán)控制變量,否則極易構(gòu)成死循環(huán)。(6)允許while語句的循環(huán)體又是while語句,從而形成雙重循環(huán)。
語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C
while語句注意事項:例:計算10!#include<stdio.h>intmain(){inti;//i應(yīng)賦初始值10longs=1;while(i>=1)s*=i--;printf("10!=%ld\n",s);return0;}i=1;while(i<100)//死循環(huán),因?yàn)閕的值沒變化,永遠(yuǎn)小于100sum+=i;printf("sum=%d\n",sum);i=1;while(i<=9){j=1;
while(j<=9){printf("%d*%d=%d\n",i,j,i*j);j++;}i++;}【例】求兩個正整數(shù)的最大公因子。語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C算法思想:我們采用Euclid(歐幾里德)算法來求最大公因子,其算法是:(1)輸入兩個正整數(shù)m和n。(2)用m除以n,余數(shù)為r,如果r等于0,則n是最大公因子,算法結(jié)束,否則(3)。(3)把n賦給m,把r賦給n,轉(zhuǎn)(2)。r=m%nm=n,n=r傳統(tǒng)流程圖n≠0TF輸入m,n輸出最大公因子mN-S流程圖輸出最大公因子m輸入m,n當(dāng)n≠0r=m%nm=n,n=r#include<stdio.h>intmain(){intm,n,r;printf("Pleaseinputtwopositiveinteger:");scanf("%d%d",&m,&n);while(n!=0){r=m%n;//求余數(shù)
m=n;n=r;}printf("Theirgreatestcommondivisoris%d\n",m);return0;}運(yùn)行結(jié)果:Pleaseinputtwopositiveinteger:2456↙Theirgreatestcommondivisoris82.do_while語句
一般形式:do
循環(huán)體語句;while(表達(dá)式);
執(zhí)行流程:其中:while后面的括號()不能省。while最后面的分號;不能省。while后面的表達(dá)式可以是任意類型的表達(dá)式,但一般是條件表達(dá)式或邏輯表達(dá)式。表達(dá)式的值是是循環(huán)的控制條件。語句部分稱為循環(huán)體,當(dāng)需要執(zhí)行多條語句時,應(yīng)使用復(fù)合語句。
expr循環(huán)體
TFdowhile特點(diǎn):先執(zhí)行循環(huán)體,再判斷表達(dá)式語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C【例】用do_while語句求1~100的累計和。
語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計Csum=0,i=1當(dāng)i≤100sum+=ii=i+1N-S流程圖sum+=ii=i+1傳統(tǒng)流程圖i≤100TFsum=0i=1輸出sum算法流程圖如下:#include<stdio.h>intmain(){inti=1,sum=0;
do{sum+=i; i++; }while(i<=100);printf("sum=%d\n",sum);return0;}運(yùn)行結(jié)果:sum=5050(1) 如果do-while后的表達(dá)式的值一開始就為假,循環(huán)體還是要執(zhí)行一次。(2) 在if語句、while語句中,表達(dá)式后面都不能加分號,而在do-while語句的表達(dá)式后面則必須加分號,否則將產(chǎn)生語法錯誤。(3) 循環(huán)體中的語句可為任意類型的C語句。(4) 和while語句一樣,在使用do-while語句時,不要忘記初始化循環(huán)控制變量,否則執(zhí)行的結(jié)果將是不可預(yù)知的。(5) 要在do-while語句的某處(表達(dá)式或循環(huán)體內(nèi))改變循環(huán)控制變量的值,否則極易構(gòu)成死循環(huán)。(6) do-while語句也可以組成多重循環(huán),而且也可以和while語句相互嵌套。
do_while語句注意事項:inta=0,b=0;dob++;while(a>0);
語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C3.for語句
一般形式:for(表達(dá)式1;表達(dá)式2;表達(dá)式3)
循環(huán)體語句;
執(zhí)行流程:其中:for后面的括號()不能省。表達(dá)式1:一般為賦值表達(dá)式,給控制變量賦初值。表達(dá)式2:關(guān)系表達(dá)式或邏輯表達(dá)式,循環(huán)控制條件。表達(dá)式3:一般為賦值表達(dá)式,給控制變量增量或減量。表達(dá)式之間用分號分隔。語句部分稱為循環(huán)體,當(dāng)需要執(zhí)行多條語句時,應(yīng)使用復(fù)合語句。expr2T循環(huán)體forexpr1expr3Ffor語句很好地體現(xiàn)了正確表達(dá)循環(huán)結(jié)構(gòu)應(yīng)注意的三個問題:控制變量的初始化。循環(huán)的條件。循環(huán)控制變量的更新。語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C【例】用for語句求1~100的累計和。
#include<stdio.h>intmain(){inti,sum=0;
for(i=1;i<=100;i++)sum+=i; printf("sum=%d\n",sum);return0;}運(yùn)行結(jié)果:sum=5050語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C
for語句注意事項:例:計算1*2+3*4+5*6+…+99*100。
inti,j;longsum=0;for(i=1,j=2;i<=99;i=i+2,j=j+2)sum+=i*j;printf("sum=%ld\n",sum);(1)表達(dá)式1、表達(dá)式2、和表達(dá)式3可以是任何類型的表達(dá)式。比方說,這三個表達(dá)式都可以是逗號表達(dá)式,即每個表達(dá)式都可由多個表達(dá)式組成。
逗號表達(dá)式逗號表達(dá)式語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C#include<stdio.h>intmain(){inti,sum=0;i=1;for(;i<=100;i++)sum+=i;printf("sum=%d\n",sum);return0;}#include<stdio.h>intmain(){inti,sum=0;i=1;for(;i<=100;)sum+=i++;printf("sum=%d\n",sum);return0;}省掉表達(dá)式1,3省掉表達(dá)式1(2)表達(dá)式1、表達(dá)式2、和表達(dá)式3都是任選項,可以省掉其中的一個、兩個或全部,但其用于間隔的分號是一個也不能省的。#include<stdio.h>intmain(){inti,sum=0;i=1;for(;;){if(i>100)break;sum+=i++;}printf("sum=%d\n",sum);return0;}省掉表達(dá)式1,2,3語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C
for語句注意事項:for(a=1;;a++)printf("&d\n",a);(3)表達(dá)式2如果為空,則相當(dāng)于表達(dá)式2的值是真。死循環(huán)!(4)循環(huán)體中的語句可為任意類型的C語句。
(5)for語句也可以組成多重循環(huán),而且也可以和while語句和do-while語句相互嵌套。
(6)循環(huán)體可以是空語句。例:計算用戶輸入的字符數(shù)(當(dāng)輸入是回車符時統(tǒng)計結(jié)束)。
#include<stdio.h>intmain(){intn=0;printf("inputastring:\n");for(;getchar()!='\n';n++);
printf("%d",n);return0;}表示循環(huán)體為空語句,并非表示for語句結(jié)束!語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C
for語句注意事項:
三種循環(huán)可互相嵌套,層數(shù)不限外層循環(huán)可包含兩個以上內(nèi)循環(huán),但不能相互交叉嵌套循環(huán)的執(zhí)行流程(1)while(){……while(){……}…...}(2)do{……do{……}while();…...}while();(3)while(){……do{……}while();…….}
嵌套循環(huán)的跳轉(zhuǎn)禁止:從外層跳入內(nèi)層跳入同層的另一循環(huán)向上跳轉(zhuǎn)4.循環(huán)嵌套(4)for(;;){……do{……}while();……while(){……}…...}外循環(huán)內(nèi)循環(huán)內(nèi)循環(huán)語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C【例】循環(huán)嵌套,輸出九九表1234567891234567892468101214161836912151821242791827364554637281……………..ij#include<stdio.h>intmain(){inti,j;for(i=1;i<10;i++)printf("%4d",i);printf("\n---------------------------------------\n");for(i=1;i<10;i++)for(j=1;j<10;j++)printf((j==9)?"%4d\n":"%4d",i*j);return0;}語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計Ci<10printf假(0)真(非0)i=1j++j=1j<10真(非0)假(0)i++外循環(huán)內(nèi)循環(huán)for(i=1;i<10;i++)for(j=1;j<10;j++)printf((j==9)?"%4d\n":"%4d",i*j);語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C5.break與continue語句
break語句功能:在循環(huán)語句和switch語句中,終止并跳出循環(huán)體或開關(guān)體說明:break不能用于循環(huán)語句和switch語句之外的任何其它語句之中。break只能終止并跳出最近一層的結(jié)構(gòu)。while(表達(dá)式1){……if(表達(dá)式2)break;……}語句……do{……if(表達(dá)式2)break;……}while(表達(dá)式1);語句……for(;表達(dá)式1;){……if(表達(dá)式2)break;……}語句……語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C【例】將用戶輸入的小寫字母轉(zhuǎn)換成大寫字母,直到輸入非小寫字母字符。
語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C
解題思路:根據(jù)題目要求用戶輸入的小寫字母可以是若干個,每個都必須轉(zhuǎn)換成大寫字母輸出,因此應(yīng)采用循環(huán)結(jié)構(gòu)來實(shí)現(xiàn)。本程序?qū)ρh(huán)條件設(shè)置為1(即恒為真),循環(huán)看似是一個死循環(huán),但在循環(huán)體內(nèi)通過對輸入字符進(jìn)行判斷:如果是小寫字母,則將其轉(zhuǎn)換為大寫字母并輸出,否則通過break語句結(jié)束循環(huán)。
另外,還有兩個問題要解決:(1)判斷字符變量c為小寫字母:26個小寫字母在ASCII碼表(見附錄E)中是連續(xù)的,中間不存在其它字符,因此判別的條件表達(dá)式是c>='a'&&c<='z',當(dāng)然也可以通過調(diào)用庫函數(shù)islower(c)來實(shí)現(xiàn)。(2)將字符變量c由小寫字母轉(zhuǎn)換為大寫字母:26個大寫字母在ASCII碼表中也是連續(xù)的,因此可先計算該小寫字母相對于'a'的偏移量,然后再加上'A'即可,也就是c-'a'+'A',當(dāng)然也可以通過調(diào)用庫函數(shù)toupper(c)來實(shí)現(xiàn)。算法流程圖:輸入字符c傳統(tǒng)流程圖1TF小寫字母T轉(zhuǎn)換為大寫輸出breakN-S流程圖1輸入字符c小寫字母T轉(zhuǎn)換為大寫輸出breakF#include<stdio.h>intmain(){charc;while(1){c=getchar();//讀取一個字符
if(c>='a'&&c<='z')//是小寫字母
putchar(c-'a'+'A');//輸出其大寫字母
else//不是小寫字母
break;
//循環(huán)退出
}return0;}運(yùn)行結(jié)果:howareyou↙HOWAREYOU
方法:通過設(shè)置一標(biāo)志變量tag,然后在每層循環(huán)后加上一條語句:if(tag)break;其值為1表示跳出循環(huán)體,為0則不跳出。for(…){while(…){……if(…)break;…}while循環(huán)后的第一條語句}inttag=0;for(…){while(…){……if(…){tag=1;break;}……}if(tag)break;……}for循環(huán)后的第一條語句
多重循環(huán)中,break的使用問:在嵌套循環(huán)的情況下,如何讓break語句跳出最外層的的循環(huán)體?語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計Ccontinue語句功能:結(jié)束本次循環(huán),跳過循環(huán)體中尚未執(zhí)行的語句,進(jìn)行下一次是否執(zhí)行循環(huán)體的判斷。說明:僅用于循環(huán)語句中。在嵌套循環(huán)的情況下,continue語句只對包含它的最內(nèi)層的循環(huán)體語句起作用。for(…){while(…){……if(…)continue;……}while循環(huán)后的第一條語句}語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C【例】求輸入的十個整數(shù)中正數(shù)的個數(shù)及其平均值。語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C
解題思路:定義兩個變量num和sum(初始值均為0),分別用于正數(shù)的計數(shù)和正數(shù)的和數(shù),使用循環(huán)結(jié)構(gòu)通過調(diào)用scanf函數(shù)完成十個整數(shù)的輸入,每輸入一個整數(shù),判斷是否為非正數(shù),若是則利用continue語句結(jié)束本次循環(huán),進(jìn)入下一輪循環(huán)輸入下一個整數(shù),若是正數(shù)則num計數(shù)加1,sum累計求和,然后進(jìn)入下一輪循環(huán)。循環(huán)結(jié)束后,輸出正數(shù)的個數(shù)num及平均值sum/num。輸入整數(shù)=>anum=0,sum=0i=0num++sum+=ai=i+1輸出num,sum輸出平均值sum/numa≤0i<10continueTFTFTFnum=0,sum=0,i=0當(dāng)i<10輸入整數(shù)==>aa≤0num++sum+=acontinuei=i+1輸出num,sum輸出平均值sum/num算法流程圖#include<stdio.h>intmain(){inti,a,num=0;floatsum=0;for(i=0;i<10;i++){scanf("%d",&a);//輸入一整數(shù)
if(a<=0)continue;
//如果為負(fù),則輸入下一個整數(shù)
num++;//正數(shù)個數(shù)增1sum+=a;//正數(shù)和累加
}printf("%dplusinteger'ssum:%.0f\n",num,sum);printf("averagevalue:%.2f\n",sum/num);return0;}運(yùn)行結(jié)果:8plusinteger'ssum:45averagevalue:5.63假設(shè)輸入的10個整數(shù)為:123–45–678910
語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C具體程序如下:6.goto語句
一般形式goto語句標(biāo)號;……語句標(biāo)號:……語句標(biāo)號:…………goto語句標(biāo)號;或
說明
語句標(biāo)號是按標(biāo)識符規(guī)定書寫的符號,放在某一語句行的前面,標(biāo)號后加冒號(:)。語句標(biāo)號起標(biāo)識語句的作用,與goto語句配合使用。
作用goto語句的作用是在不需要任何條件的情況下直接使程序跳轉(zhuǎn)到該語句標(biāo)號所標(biāo)識的語句去執(zhí)行。
語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C例:求1~100的累計和
#include<stdio.h>intmain(){inti=1,sum=0;
loop:sum+=i++;if(i<=100)//如果i小于或等于100
gotoloop;
//轉(zhuǎn)到標(biāo)號為loop的語句去執(zhí)行
printf("sum=%d\n",sum);return0;}goto語句的應(yīng)用(1)goto語句可與條件語句配合使用來實(shí)現(xiàn)條件轉(zhuǎn)移,構(gòu)成循環(huán)。
(2)在嵌套循環(huán)的情況下,利用goto語句可以直接從最內(nèi)層的循環(huán)體跳出最外層的循環(huán)體。
語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計Cinttag=0;for(…){while(…){……if(…)gotostop;……}……}stop:for循環(huán)后的第一條語句
注意:在結(jié)構(gòu)化程序設(shè)計中一般不主張使用goto語句,以免造成程序流程的混亂,使理解和調(diào)試程序都產(chǎn)生困難。7.exit()函數(shù)
功能
說明
參數(shù)status為int型,status的值傳給調(diào)用進(jìn)程(一般為操作系統(tǒng))。按照慣例,當(dāng)status的值為0或?yàn)楹瓿A縀XIT_SUCCESS時,表示程序正常退出;當(dāng)status的值為非0或?yàn)楹瓿A縀XIT_FAILURE時,表示程序出現(xiàn)某種錯誤后退出。
void表示exit()函數(shù)沒有返回值。終止整個程序的執(zhí)行,強(qiáng)制返回操作系統(tǒng)。
調(diào)用形式voidexit(intstatus);頭文件<stdlib.h>語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C【例】
輸入三角形的邊長,求三角形面積。
程序設(shè)計分析:由數(shù)學(xué)知識可知,求三角形面積的公式是:其中,a、b、c是三角形的三個邊長,s=(a+b+c)/2。因此,程序中應(yīng)該有三個float型變量用來存放a、b、c的值,為了方便起見,還應(yīng)有一個變量存放s,最后有必要設(shè)置一個變量來存放三角形的面積值。公式中存在求平方根的操作,這要用到C語言數(shù)學(xué)庫函數(shù)sqrt。sqrt函數(shù)帶有一個參數(shù),它的功能是返回參數(shù)的平方根。程序在開始接受用戶輸入的三角形的三個邊長后,首先要對這三邊作合法性檢查,如三邊中有某一邊長度小于或等于0,則終止程序的執(zhí)行,同樣如果s*(s-a)*(s-b)*(s-c)為負(fù),也要終止程序的執(zhí)行。#include<stdio.h>#include<stdlib.h>#include<math.h>intmain(){floata,b,c;floats,area;printf("inputthelengthofthreeedgesoftriangle:");scanf("%f%f%f",&a,&b,&c);if(a<=0||b<=0||c<=0){printf("thelengthofthreeedgesoftriangleiserror!\n");
exit(-1);}
s=(a+b+c)/2;s=s*(s-a)*(s-b)*(s-c);if(s<0){printf("thelengthofthreeedgesoftriangleiserror!\n");
exit(-1);}area=(float)sqrt(s);printf("area=%.2f\n",area);return0;}運(yùn)行結(jié)果:inputthelengthofthreeedgesoftriangle:345↙area=6.00inputthelengthofthreeedgesoftriangle:3-45↙thelengthofthreeedgesoftriangleiserror!語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C6.2循環(huán)結(jié)構(gòu)類型的選擇及轉(zhuǎn)換
1.循環(huán)結(jié)構(gòu)類型的選擇原則如果循環(huán)次數(shù)在執(zhí)行循環(huán)體之前就已確定,一般用for循環(huán);如果循環(huán)次數(shù)是由循環(huán)體的執(zhí)行情況確定的,一般用while循環(huán)或者do-while循環(huán)。當(dāng)循環(huán)體至少執(zhí)行一次時,用do-while循環(huán),反之,如果循環(huán)體可能一次也不執(zhí)行,選用while循環(huán)。2.循環(huán)結(jié)構(gòu)類型之間的相互轉(zhuǎn)換
盡管上面對于循環(huán)結(jié)構(gòu)的選擇給出了原則性指導(dǎo)意見,但是我們應(yīng)注意到其實(shí)這三種循環(huán)結(jié)構(gòu)彼此之間可以相互轉(zhuǎn)換,象前面我們分別用while循環(huán)、do-while循環(huán)、for循環(huán)來求1~100的累計和的例子就說明了這一點(diǎn)。語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C【例】判定某整數(shù)是否為素數(shù)。
這一思路的算法如下:(1)從鍵盤輸入一正整數(shù)m。(2)計算k=
(3)i從2變化到k,依次檢查m%i是否為0。(4)若m%i為0,則判定m不是素數(shù),并終止對其余i值的檢驗(yàn);否則,令i=i+1;并繼續(xù)對其余i值進(jìn)行檢驗(yàn),直到全部檢驗(yàn)完畢為止,這時判定m是素數(shù)。問題分析:
素數(shù)是指除了能被1和它本身整除外,不能被其它任何整數(shù)整除的數(shù)。例如,17就是一個素數(shù),除了1和17之外,它不能被2~16之間的任何整數(shù)整除。根據(jù)素數(shù)的這個定義,可得到判斷素數(shù)的方法:把m作為被除數(shù),把i=2~(m-1)依次作為除數(shù),判斷被除數(shù)m與除數(shù)i相除的結(jié)果,若都除不盡,即余數(shù)都不為0,則說明m是素數(shù),反之,只要有一次能除盡(余數(shù)為0),則說明m存在一個1和它本身以外的另一個因子,它不是素數(shù)。事實(shí)上,根本用不著除那么多次,用數(shù)學(xué)的方法可以證明:只需用2~之間(取整數(shù))數(shù)去除m,即可得到正確的判定結(jié)果。
語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計Ci≤kF輸入m,k=i=2m%i==0i=i+1i>kTTFm不是素數(shù)m是素數(shù)TF結(jié)束break輸入m,k=,i=2當(dāng)i≤kTi=i+1m%i==0Fbreaki>kTFm是素數(shù)m不是素數(shù)算法流程圖#include<stdio.h>#include<math.h>intmain(){intm,i,k;printf("inputanumber:“);scanf("%d",&m);
k=sqrt(m);i=2;
while(i<=k)
{if(m%i==0)break;i++;}if(i>k)printf("yes\n");elseprintf("no\n");return0;}while循環(huán)#include<stdio.h>#include<math.h>intmain(){intm,i,k;printf("inputanumber:“);scanf("%d",&m);k=sqrt(m);
for(i=2;i<=k;i++)if(m%i==0)break;if(i>k)printf("yes\n");elseprintf("no\n");return0;}for循環(huán)#include<stdio.h>#include<math.h>intmain(){intm,i,k;printf("inputanumber:“);scanf("%d",&m);
k=sqrt(m);i=2;
do
{if(m%i==0)break;i++;}while(i<=k);
if(i>k)printf("yes\n");elseprintf("no\n");return0;}do_while循環(huán)語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C6.3循環(huán)結(jié)構(gòu)程序設(shè)計舉例
【例1】驗(yàn)證哥德巴赫猜想:任一充分大的偶數(shù),可以用兩個素數(shù)之和表示。例如:4=2+2,6=3+3,98=19+79這一思路的算法如下:
讀入大于3的偶數(shù)n。
p=1do{p=p+1;q=n-p;p是素數(shù)嗎?
q是素數(shù)嗎?
}whilep、q有一個不是素數(shù)。輸出n=p+q。
問題分析:讀入一個偶數(shù)n,將它分成p和q,使n=p+q。怎樣分呢?可以令p從2開始,每次加1,而令q=n-p,如果p、q均為素數(shù),則正為所求,否則令p=p+1再試。flagp=1;for(j=2;j<=(int)sqrt(p);j++)if(p除以j的余數(shù)==0){flagp=0;break;}
flagq=1;for(j=2;j<=(int)sqrt(q);j++)if(q除以j的余數(shù)==0){flagq=0;break;}
設(shè)置兩個標(biāo)志量flagp和flagq,0—不是素數(shù),1—是素數(shù)
}while(flagp*flagq==0);
語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C輸入偶數(shù)np=1p++q=n-pflagp=1p是素數(shù)flagp=0flagq=1q是素數(shù)flagq=0flagp*flagq==0輸出p、q結(jié)束TFFTTFp=1TFp++,q=n-pflagp=1輸入偶數(shù)np是素數(shù)flagp=0flagq=1q是素數(shù)flagq=0TF當(dāng)flagp*flagq==0輸出p、q算法流程圖#include<stdio.h>#include<stdlib.h>#include<math.h>intmain(){inti,n,p,q,flagp,flagq;printf("pleaseinputn:");scanf("%d",&n);//輸入一偶數(shù)
if(n<4||n%2!=0)//如果該數(shù)不是偶數(shù)
{printf("inputdataerror!\n");exit(-1);//程序結(jié)束
}p=1;
do{p++;q=n-p;flagp=1;for(i=2;i<=(int)sqrt(p);i++){if(p%i==0){flagp=0;break;}}flagq=1;for(i=2;i<=(int)sqrt(q);i++){if(q%i==0){flagq=0;break;}}}while(flagp*flagq==0);printf("%d=%d+%d\n",n,p,q);return0;}判斷p是否為素數(shù)
判斷q是否為素數(shù)
運(yùn)行結(jié)果:pleaseinputn:98↙98=19+79pleaseinputn:9↙inputdataerror!語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C【例】利用下面的公式求π的近似值,要求累加到最后一項小于10-6為止。問題分析:這是一個累加求和的問題,但這里的循環(huán)次數(shù)是預(yù)先未知的,而且累加項以正負(fù)交替的規(guī)律出現(xiàn),如何解決這類問題呢?
在本例中,累加項的構(gòu)成規(guī)律可用尋找累加項通式的方法得到,具體表示為t=s/n;即累加項由分子和分母兩部分組成,分子s按+1,-1,+1,-1,…交替變化,可用賦值語句s=-s;實(shí)現(xiàn),s的初始值取為1,分母n按1,3,5,7,…變化,用n=n+2;語句實(shí)現(xiàn)即可,n的初始值取為1.0。語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計CFTpi*=4s=1,n=1.0|t|≥10-6pi=0,t=1pi+=t,n+=2s=-s,t=s/n結(jié)束pi=0,t=1s=1,n=1.0當(dāng)|t|≥10-6pi+=t,n+=2s=-s,t=s/npi*=4算法流程圖#include<stdio.h>#include<math.h>intmain(){ints=1;floatn=1.0,t=1,pi=0;while(fabs(t)>=1e-6){pi+=t;n+=2;s=-s;t=s/n;}pi*=4;printf("pi=%.6f\n",pi);return0;}運(yùn)行結(jié)果:pi=3.141594【例】打印大小可變的菱形圖案(下面菱形的大小是7)。
﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡問題分析:菱形的大小size其實(shí)就是中間行中*號的個數(shù),也是整個菱形的行數(shù),其值必須是奇數(shù)。
問題的關(guān)鍵之一是如何確定每行中*號的個數(shù)。經(jīng)過分析得知:當(dāng)行數(shù)i(假設(shè)最上面的一行為第1行)≦(size+1)/2時,該行上的*號個數(shù)為n=2*i-1,否則n=2*(size-i+1)-1。
問題的關(guān)鍵之二是如何確定每行顯示的第一個*號的位置,也就是顯示第一個*號之前應(yīng)顯示多少個空格。經(jīng)過分析得知:每行應(yīng)顯示的空格數(shù)為m=(size-n)/2個。
語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計Ck≤mk=1打印空格k=k+1j=1j≤n打印*號j=j+1FTTF回車換行i=i+1T輸入大小sizei=1n=(i<=(size+1)/2)?i:size-i+1n=2*n-1計算第i行*號個數(shù)nm=(size-n)/2+15計算第i行打印空格數(shù)mi≤size結(jié)束F輸入大小sizefori=1tosize計算第i行*號個數(shù)nn=(i<=(size+1)/2)?i:size-i+1n=2*n-1計算第i行打印空格數(shù)mm=(size-n)/2+15fork=1tom打印空格k=k+1forj=1ton打印*號j=j+1回車換行i=i+1算法流程圖#include<stdio.h>#include<stdlib.h>intmain(){inti,j,k,m,n,size;printf("inputsize:");//輸入大小提示
scanf(“%d”,&size);//輸入大小
//如果為小于或等于0的數(shù)或?yàn)榕紨?shù)
if(size<=0||size%2==0){printf("thesizeiserror!\n");exit(-1);//程序結(jié)束
}
for(i=1;i<=size;i++)//控制行數(shù)
{n=(i<=(size+1)/2)?i:size-i+1;//每行中"*"號的個數(shù)
n=2*n-1;m=(size-n)/2+15;//每行打印"*"之前應(yīng)打印的空格數(shù)
for(k=1;k<=m;k++)//打印每行前面的空格
printf("");for(j=1;j<=n;j++)//打印每行的"*"printf("*");printf("\n");//打印一行后,回車換行
}return0;}語言程序設(shè)計教程第三版第六章循環(huán)結(jié)構(gòu)程序設(shè)計C【例】計算用戶輸入的兩正整數(shù)之間的所有整數(shù)中0,1,2,…,9數(shù)碼的個數(shù)。例如,101~104之間總共包含四個整數(shù)101,102,103,104,其中0的個數(shù)為4,1的個數(shù)為5,2、3、4的個數(shù)都為1,其余數(shù)碼沒出現(xiàn)都為0。問題分析:問題的關(guān)鍵是要計算某整數(shù)中包含的各個數(shù)碼的個數(shù),必須對該整數(shù)進(jìn)行分解,求得所包含的各個數(shù)碼,其方法可以通過每次除以10取余數(shù)得到,然后再對商進(jìn)行同樣的處理,直到商為0時為止
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 六一物業(yè)公司活動策劃方案
- 六一端午節(jié)活動方案
- 六一藝術(shù)節(jié)活動方案
- 六一英文活動方案
- 六一迷宮活動方案
- 六一魔術(shù)活動方案
- 六年級套圈游戲活動方案
- 安全設(shè)備操作試題及答案
- 蘭山區(qū)政府招商活動方案
- 蘭州蘭山冬雪活動方案
- 殯儀館物業(yè)服務(wù)管理制度
- 電大:理論聯(lián)系實(shí)際闡述文化在社會發(fā)展中具有什么樣的作用?參考答案03
- 2025貴州醫(yī)科大學(xué)輔導(dǎo)員考試試題及答案
- 原發(fā)性肝癌診療指南(2024年版)解讀
- 2025-2030中國自動鉚接機(jī)行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報告
- 2025年餐飲管理與服務(wù)質(zhì)量考試試卷及答案
- 廣東省風(fēng)力發(fā)電內(nèi)蒙古分公司廣東能源集團(tuán)招聘筆試題庫2025
- 父親節(jié)你了解你的爸爸嗎禮贊父親學(xué)會感恩模板
- 2023-2024學(xué)年安徽省合肥市六校聯(lián)盟高一下學(xué)期期末聯(lián)考地理試題(解析版)
- 新設(shè)備專項安全風(fēng)險辨識評估報告示例-副本
- 蘇州市昆山市惠民物業(yè)管理有限公司招聘筆試真題2024
評論
0/150
提交評論