




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第五章循環結構程序設計往前走,直到到達目標為止沒到?往前走YN只要.....
5.1程序中需要用循環結構什么是循環?為什么要使用循環?問題1:問題2:求學生平均成績
分數相加后除以課數在許多問題中需要用到循環控制。循環結構就是用來處理需要重復處理的問題的,所以又稱重復結構。它和順序結構、選擇結構共同作為各種復雜程序的基本構造單元。循環條件(結束條件)循環的內容循環要素:實現循環的方式:whiledowhileforsum=sum+i;i++;sum=0;i=1;i<=100NY輸出sum計算1+2+3+......+100表達式語句非00while(表達式)語句;while語句intmain(){inti,sum=0;i=1;while(i<=100){sum+=i;i++;}printf(“%d\n”,sum);return0;}循環體循環條件說明:(1)循環體如果包含一個以上的語句,應該用花括號括起來,以復合語句形式出現.(2)在循環體中應有使循環趨向于結束的語句。運行結果:
50505.2.2
dowhile語句表達式語句串非00格式:
do{語句串;
}while(表達式);語義:執行語句串直到表達式為假dowhile語句循環體循環條件do{語句串;
}while(表達式);intmain(){inti=1,sum=0;do{sum+=i++;}while(i<=100);printf(“%d”,sum);return0;}表達式語句串非00dowhile語句循環體循環條件while和do-while循環的比較凡是能用while循環處理,都能用do…while循環處理。do…while循環結構可以轉換成while循環結構。在一般情況下,用while語句和用do-while語句處理同一問題時,若二者的循環體部分是一樣的,它們的結果也一樣。但是如果while后面的表達式一開始就為假(0值)時,兩種循環的結果是不同的。例5.11while和do-while循環的比較
(1)(2)
#include<stdio.h>#include<stdio.h>
voidmain()voidmain()
{intsum=0,i;{intsum=0,i;
scanf(“%d″,&i);scanf(”%d″,&i);
while(i<=10)do
{sum=sum+i;{sum=sum+i;
i++;i++;
}}while(i<=10);
printf(“sum=%d\\n”,printf(“sum=%d\\n”,
sum);sum);
}}運行結果:1↙sum=55再運行一次:11↙sum=0運行結果:1↙sum=55再運行一次:11↙sum=11說明:當while后面的表達式的第一次的值為“真”時,兩種循環得到的結果相同。否則,二者結果不相同。表達式語句串非00dowhile語句表達式語句非00while語句表達式語句表達式語句兩類循環的對比當型循環直到型循環說明:設計循環結構,要考慮兩個問題:一是循環體,二是循環結束條件。注意while循環中判斷的條件是循環繼續的條件,而不是結束條件。例如:for(i=1;i<=100;i++)sum=sum+i;相當于:
i=1;while(i<=100){ sum=sum+i; i++; }5.3用for語句實現循環
5.3.1for語句的一般形式和執行過程格式:
for(e1;e2;e3)s語義:
e1;while(e2){s;e3;}e2e1非00e3s循環體for(循環變量賦初值;循環條件;循環變量增值)
for(e1;e2;e3)ssum=0;for(i=1;i<=100;i++)sum=sum+i;for(i=1,sum=0;i<=100;sum=sum+i++);e2e1非00e3s循環控制變量for(i=1,sum=0;i<=100;i++)sum=sum+i;i<=100i=1非00i++sum=sum+i循環體C語言中的for語句使用最為靈活,不僅可以用于循環次數已經確定的情況,而且可以用于循環次數不確定而只給出循環結束條件的情況,它完全可以代替while語句。可以把循環體和一些與循環控制無關的操作也作為表達式1或表達式3出現,這樣程序可以短小簡潔。但過分地利用這一特點會使for語句顯得雜亂,可讀性降低,最好不要把與循環控制無關的內容放到for語句中。16在for和while語句之后一般沒有分號有分號表示循環體就是分號之前的內容,即循環體不存在while(i<100);
i++;for(i=0;i<100;i++);
printf("%d",i);for通常有一個循環變量控制循環的次數,不要在循環體內改變這個變量注意17如果循環次數已知,用for如果循環次數未知,用while如果循環體至少要執行一次,用do-while只是思路,不是定律選擇三種循環的一般思路18輸入全班N個人的分數,求出最高分#include<stdio.h>#defineN10main(){inti,max=0,score;printf(“input%dscore:”,N);for(i=0;i<N;i++){scanf(“%d”,&score);if(score>max)max=score;}printf(“max=%d\n”,max);}19輸入全班N個人的分數,求出最高分#defineN10main(){inti,max=0,score;printf(“input%dscore:”,N);
i=1;while(i<=N){scanf(“%d”,&score);if(score>max)max=score;
i++;}printf(“max=%d\n”,max);}
人口增長預測。據2005年末統計,我國人口為130756萬人,如果人口的年增長率為1%,請計算到哪一年中國總人口超過15億。例題5.5解題思路計算人口增長和計算存款利息的公式是相同的。假設原來人口為p0,則一年后的人口:其中r是年增長率。用此公式依次計算出每年的人口,每算出一年的人口后就檢查一下是否達到或超過15億?如果未達到或超過15億,就再計算下一年的人口,直到某一年的人口達到或超過15億為止。編寫程序 #include<stdio.h>
voidmain()
{
doublep=1.30756e9,r=0.01;
inty;
for(y=2006;p<1.5e9;y++)
{/*賦值號兩側的變量p代表不同含義*/
p=p*(1+r);
}
printf("year=%d,p=%e\n",y-1,p);
}運行結果:year=2019,p=1.503007e+009說明: y代表年份。循環體中只有一個語句,用來計算從2006年開始的各年的人口數。在for語句中設定的循環條件是p<15億,當某一年的p達到或超過15億,就停止循環,輸出年份和當年的人口數。由于在最后結束循環前y又加了1,因此在輸出年份時應輸出y-1的值而不是y的值。
一個變量開始時有一初值,通過一定的運算,可以推算出一個新的值,再從這個新值又推出下一個新值,即不斷用計算出的新值去取代原有的值,這種方法稱為迭代。上面的計算公式p=p*(1+r)稱迭代公式。迭代算法一般是用循環來實現的。迭代是一種常用的算法,用人工實現很麻煩,而用計算機實現卻十分方便。總結:要寫出一個正確的循環結構,對循環控制變量要做三方面的工作:
1、對循環控制變量賦初值。
2、將循環控制變量寫入正確的控制條件。
3、對循環控制變量值的更新。如x=1;
/*給x賦初值*/
while(x<10)
/*循環條件*/
{s=s+x;x++;
/*對x的值做更新、調整*/
}找問題:(1)while(count!=10);{count=1;sum=sum+x;count=count+1;}(2)name=10;do{name=name+1;printf(“ok”);}while(name=1)5.4循環的嵌套一個循環體內又包含另一個完整的循環結構稱為循環的嵌套。內嵌的循環中還可以嵌套循環,這就是多層循環。三種循環(while循環、do-while循環和for循環)可以互相嵌套。5.4循環的嵌套下面幾種都是合法的形式:(1)
while()(2)do(3)for(;;){…{…{while()dofor(;;){…}{…}{…}}while();}}while();5.4循環的嵌套(4)while()(5)for(;;)(6)do{…{…{…do{…}while()for(;;){}while(){}…{…}…}}}while()
s=0;for(i=0;i<10;i++)
for(j=0;j<10;j++)s+=i*10+j;printf(“s=%d\n”,s);i=1i<10s=0j=0j<10s+=i*10+jj++i++NNyy輸出s讀程序?s=0;for(i=0;i<10;i++);for(j=0;j<10;j++);s+=i*10+j;區別!s=0;for(i=0;i<10;i++)for(i=0;i<10;i++)s+=i*10+i;s=0;for(i=0;i<10;i++)for(j=0;j<10;j++)s+=i*10+j;31編程輸出如下形式的乘法九九表32#include<stdio.h>main(){ intm,n; for(m=1;m<10;m++) printf("%4d",m);/*打印表頭*/ printf("\n"); for(m=1;m<10;m++) printf("-"); printf("\n"); for(m=1;m<10;m++) { for(n=1;n<10;n++) { printf("%4d",m*n); } printf("\n"); }}33將上例輸出格式改成如下的下三角格式打印34#include<stdio.h>main(){ intm,n; for(m=1;m<10;m++) printf("%4d",m);/*打印表頭*/ printf("\n"); for(m=1;m<10;m++) printf("-"); printf("\n"); for(m=1;m<10;m++) { for(n=1;n<=m;n++) { printf("%4d",m*n); } printf("\n"); }}5.5提前結束循環
5.5.1用break語句提前退出循環
break語句可以用來從循環體內跳出循環體,即提前結束循環,接著執行循環下面的語句。一般形式:
break;說明:
break語句不能用于循環語句和switch語句之外的任何其他語句中。
統計各班級的學生的平均成績。已知各班人數不等,但都不超過30人。編一個程序能處理人數不等的各班學生的平均成績。例題5.6解題思路
如果各班人數相同,問題比較簡單,只需用一個for語句控制即可:
for(i=1;i<31;i++)
但是現在有的班不足30人,應當設法告訴計算機本班的人數,使程序也能統計出該班的平均成績。可以約定,當輸入的成績是負數時,就表示本班數據已結束(一般情況下成績不會是負數)。在程序接收到一個負的分數時就提前結束循環,計算出本班平均成績。用break語句可以用來實現提前結束循環。5.5提前結束循環編寫程序5.5提前結束循環#include<stdio.h>
voidmain()
{
floatscore,sum=0,average;
inti,n;
for(i=1;i<31;i++)
{
scanf("%f",&score);/*輸入一個學生的成績*/
if(score<0)break;/*如果輸入負值,則跳出循環*/
sum=sum+score;/*把該成績累加到sum*/
}
n=i-1;/*學生數應是i-1*/
average=sum/n;/*計算平均成績*/
/*輸出學生數和平均成績*/
printf("n=%d,average=%7.2f\n",n,average);}運行結果:100↙(輸入一個學生成績)80↙70↙-1↙(輸入負數,表示本班數據結束)n=3,average=90.00說明:如果一個班有30人,則輸入完30人的成績后累計總分后自動結束循環,不必再輸入負數作為結束標志。在結束循環后i的值等于31(因為執行完30次循環后,i再加1,變成31,此時才終止循環),因此學生數n應該等于i-1。如果一個班人數少于30人,則在輸入完全班學生的成績后,輸入一個負數,此時程序就跳過循環體其余的語句,也不再繼續執行其余的幾次循環。直接跳到循環下面的語句(n=i-1;)繼續執行。剛輸入的數不進行累加(不執行sum=sum+score;)。注意此時i的值,假如已輸入了25個有效分數,在第26次循環時輸入一個負數,此時i的值是26,而學生數n應是i-1。5.5提前結束循環5.5提前結束循環
5.5.2用continue語句提前結束本次循環continue語句作用為結束本次循環,即跳過循環體中下面尚未執行的語句,接著進行下一次是否執行循環的判定.一般形式:
continue;5.5提前結束循環
5.5.2用continue語句提前結束本次循環continue語句和break語句的區別:
continue語句只結束本次循環,而不是終止整個循環的執行。while(表達式1)
{…
if(表達式2)continue;
…}continue語句和break語句的區別:
break語句則是結束整個循環過程,不再判斷執行循環的條件是否成立。
while(表達式1)
{…if(表達式2)break;…}5.5提前結束循環
5.5.2用continue語句提前結束本次循環
輸入一個班全體學生的成績,把不及格的學生成績輸出,并求及格學生的平均成績。例題5.7解題思路
在進行循環中,檢查學生的成績,把其中不及格的成績輸出,然后跳過后面總成績的累加和求平均成績的語句。用continu語句即可處理此問題。5.5提前結束循環#include<stdio.h>
voidmain()
{
floatscore,sum=0,average;
inti,n=0;
for(i=1;i<6;i++)/*假設有5個學生*/
{
printf("pleaseenterscore:");
scanf("%f",&score);/*輸入學生成績*/
if(score<60)/*如不及格*/
{/*輸出不及格的成績*/
printf("Fail:%7.2f\n",score);
continu;}/*跳過下面的語句,結束本次循環*/
sum=sum+score;
n=n+1;/*n是用來統計及格學生人數*/
}
average=sum/n;/*及格學生平均分數*/
/*輸出及格學生人數和平均分數*/
printf("\nn=%d,average=%7.2f\n",n,average}運行結果:pleaseenterscore:89↙pleaseenterscore:56↙Fail:56pleaseenterscore:76↙pleaseenterscore:58↙Fail:58pleaseenterscore:98↙n=3average=87.675.5提前結束循環編寫程序說明:輸入不及格學生成績后,輸出該成績,然后跳過循環體中未執行的語句,即不參加累計總分sum,也不累計合格學生數n。但是,繼續執行后面的幾次循環。5.5提前結束循環5.6幾種循環的比較(1)三種循環都可以用來處理同一問題,一般情況下它們可以互相代替。(2)在while循環和do-while循環中,只在while后面的括號內指定循環條件,因此為了使循環能正常結束,應在循環體中包含使循環趨于結束的語句(如i++,或i=i+1等)。5.6幾種循環的比較for循環可以在表達式3中包含使循環趨于結束的操作,甚至可以將循環體中的操作全部放到表達式3中。因此for語句的功能更強,凡用while循環能完成的,用for循環都能實現。(3)用while和do-while循環時,循環變量初始化的操作應在while和do-while語句之前完成。而for語句可以在表達式1中實現循環變量的初始化。5.6幾種循環的比較(4)while循環、do…while循環和for循環,都可以用break語句跳出循環,用continue語句結束本次循環。
有一對兔子,出生后第3個月起每個月都生一對兔子。小兔子長到第3個月后每個月又生一對兔子。假設所有兔子都不死,問40個月的兔子總數為多少?例題5.8解題思路5.7程序舉例
第幾個月小兔子對數中兔子對數老兔子對數兔子總數110012010131012411135212563238753513┆┆┆┆┆可以看到每個月的兔子總數依次為
1,1,2,3,5,8,13…這就是有名的費波那西(Fibonacci)數列。
5.7程序舉例
編寫程序5.7程序舉例
#include<stdio.h>
voidmain()
{
longintf1,f2;
inti;
f1=1;f2=1;
for(i=1;i<=20;i++)
{
printf("%12ld%12ld",f1,f2);
if(i%2==0)printf("\n");
f1=f1+f2;
f2=f2+f1;
}
}運行結果:
11235813213455891442333776109871597258441816765109461771128657463687502512139319641831781151422983204013462692178309352457857022887922746514930352241578173908816963245986102334155說明:(1)變量f1和f2用長整型,在printf函數中輸出格式符用“%12ld”,而不是用“%12d”,這是由于在第23個數后,整數值已超過整數最大值32767,因此必須用長整型變量才能容納,并用“%ld”格式輸出。(2)if語句的作用是使輸出4個數后換行。i是循環變量,當i為偶數時換行,而i每增值1,就要計算和輸出2個數(f1,f2),因此i每隔2換一次行相當于每輸出4個數后換行輸出。5.7程序舉例
給一個整數m,判斷它是否素數。例題5.9解題思路5.7程序舉例
讓m被i(i由2變到k=)除,如果m能被某一個i(2~k之間的任何一個整數)整除,則m必然不是素數,不必再進行下去。此時的i必然小于或等于k;如果m不能被2-k之間的任一整數整除,則m應是素數,此肘在完成最后一次循環后,使i再加1,因此i的值就等于k+1,這時才終止循環。在循環結束之后判別i的值是否大于或等于k+1,若是,則表明未曾被2-k之間任一整數整除過,因此輸出“是素數”。53判斷m是否是素數輸入m判斷m是否是素數輸出結果一個自然數,若除了1和它本身外不能被其他整數整除,則稱為素數。54k=sqrt(m)i=2i<=ki能被m整除m不是素數i++yNm是素數yNi>kyN#include<stdio.h>
#include<math.h>
voidmain()
{intm,i,k;
printf(“pleaseenteraintegernumber:”);
scanf(“%d”,&m);/*輸入一個整數m*/
k=(int)sqrt(m);/*對m求平方根,再取整*/
for(i=2;i<=k;i++)/*i作為除數*/
/*如果m被i整除,m肯定不是素數*/
if(m%i==0)break;
if(i>k)printf("%disaprimenumber.\n",m);
elseprintf("%disnotaprimenumber.\n",m);
}編寫程序5.7程序舉例
運行結果:
pleaseenteraintegernumber:17↙17isaprimenumber.
譯密碼。為使電文保密,往往按一定規律將其轉換成密碼,收報人再按約定的規律將其譯回原文。例題5.10解題思路5.7程序舉例
可以按以下規律將電文變成密碼:將字母A變成字母E,a變成e,即變成其后的第4個字母,W變成A,X變成B,Y變成C,Z變成D。ABCDEFGHIJKLMNOPQRSTUVWXYZ#include<stdio.h>
voidmain()
{charc;
while((c=getchar())!=‘\n’)
{/*判定c是否字母*/
if((c>=‘a'&&c<='z')||(c>='A'&&c<='Z'))
{c=c+4;/*是字母就加4*/
/*如在字母范圍外就減26*/
if(c>'Z'&&c<='Z'+4||c>'z')c=c-26;
}
printf("%c",c);
}
printf("\n");
}編寫程序5.7程序舉例
運行結果:
China!↙
Glmre!
說明:內嵌的if語句不能寫成:if(c>’Z’||c>’z’)/*請和程序笫7行比較*/c=c-26;因為如果所有小寫字毋都滿足“c>′Z′”的條件,從而也都執行“c=c-26;”語句,這就會出錯。因此必須限制其范圍為“c>′Z′&&c<=′Z′+4”,即原字母為W到Z。只有符合此條件才減26,否則,不應按此規律轉換。5.7程序舉例
5.8提高部分
5.8.2for語句的各種形式for語句相當靈活,形式變化多樣:
(1)for語句的一般形式中的“表達式1”可以省略,此時應在for語句之前給循環變量賦初值。注意省略表達式1時,其后的分號不能省略。如:
for(;i<=100;i++)sum=sum+i;
執行時,跳過“求解表達式1”這一步,其他不變。(2)如果表達式2省略,即不判斷循環條件,循環無終止地進行下去。也就是認為表達式2始終為真。如:
for(i=1;;i++)sum=sum+i;
表達式1是一個賦值表達式,表達式2空缺。它相當于:
i=1;while(1){sum=sum+1;i++;}5.8提高部分
5.8.2for語句的各種形式(3)表達式3也可以省略,但此時程序設計者應另外設法保證循環能正常結束。如:
for(i=1;i<=100;){sum=sum+i;i++;}
在上面的for語句中只有表達式1和表達式2,而沒有表達式3。i++的操作不放在for語句的表達式3的位置處,而作為循環體的一部分,效果是一樣的,都能使循環正常結束。5.8提高部分
5.8.2for語句的各種形式(4)可以省略表達式1和表達式3,只有表達式2,即只給循環條件。如:
for(;i<=100;)while(i<=100){sum=sum+i;相當于
{sum=sum+i;i++;}i++;}
在這種情況下,完全等同于while語句。可見for語句比while語句功能強,除了可以給出循環條件外,還可以賦初值,使循環變量自動增值等。5.8提高部分
5.8.2for語句的各種形式(5)3個表達式都可省略,如:
for(;;)語句相當于
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電氣機械機械工程設計與模擬化仿真考核試卷
- 煤制液體燃料的生產設備選型與優化考核試卷
- 皮革保養店客戶投訴處理與風險防范考核試卷
- 泡沫塑料的耐磨擦性能考核試卷
- 畜牧機械牧場養殖場養殖設備維護保養實操考核試卷
- 健身器材行業標準化建設考核試卷
- 畜牧業廢棄物資源化利用技術考核試卷
- 中藥行業2025年3月月報:內需韌性凸顯看好品牌OTC
- 2025標準個人借款合同協議書范本
- 云南省景東縣二中2025屆招生全國統一考試廣東省數學試題模擬試卷(一)
- 科研誠信與學術規范第六講課件
- 筏板基礎計算書
- 新高考數學二輪復習講練專題06 函數與導數常見經典壓軸小題歸類(26大核心考點)(講義)(解析版)
- 高速公路改到封閉施工方案
- 防塵天幕施工方案
- 胸椎骨折的護理課件
- 機械CAD、CAM-形考任務一-國開-參考資料
- 公路工程道路保通施工安全專項方案(3篇)
- 省考試錄用公務員面試通知書
- 第9課《美麗的顏色》說課稿 2024-2025學年統編版語文八年級上冊
- 人工智能訓練師(中級)職業技能鑒定參考題庫-上(單選題)
評論
0/150
提交評論