循環(huán)結構程序設計小結_第1頁
循環(huán)結構程序設計小結_第2頁
循環(huán)結構程序設計小結_第3頁
循環(huán)結構程序設計小結_第4頁
循環(huán)結構程序設計小結_第5頁
已閱讀5頁,還剩60頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

在C語言中可以用以下語句來實現(xiàn)循環(huán):1.用while語句;2.用do--while語句;3.用for語句。循環(huán):就是在給定的條件成立時反復執(zhí)行某一程序段,被反復執(zhí)行的程序段稱為循環(huán)體。2023/1/131aS=1+2+3+…+1000S12100S+1SS+2SS+100S作100次加法S+iS累加器計數(shù)器2023/1/132a1while語句真(非零)表達式

循環(huán)體假(零)1、while語句的形式:

while(表達式)循環(huán)體;

2、

while語句常稱為“當型”循環(huán)語句。2023/1/133a3、說明:先判斷表達式,后執(zhí)行語句。表達式同if語句后的表達式一樣,可以是任何類型的表達式。循環(huán)體多于一句時,用一對{}括起。while循環(huán)結構常用于循環(huán)次數(shù)不固定,根據(jù)是否滿足某個條件決定循環(huán)與否的情況。2023/1/134ai=1;s=0;while(i<=100){s=s+i;i++;

}printf(“\n1+2+3+…+100=%d”,s);

循環(huán)變量的初始化計數(shù)器的初始化累加器的初始化循環(huán)控制條件累加修改循環(huán)變量循環(huán)語句的三要素循環(huán)次數(shù)固定的循環(huán)語句2023/1/135a#include"stdio.h"intmain(){floatx;scanf("%f",&x);【例1】輸入一系列整數(shù),判斷其正負號,當輸入0時,結束循環(huán)。輸入數(shù)據(jù),為第一次判斷做準備while(x!=0)判斷是否結束{if(x>0)printf("+");elseprintf("-");

scanf("%f",&x);}return0;}判斷正負號2023/1/136a#include"stdio.h"intmain(){charch;intnum=0;ch=getchar();【例2】統(tǒng)計從鍵盤輸入的一行字符的個數(shù)(以回車鍵作為輸入結束標記)。while(ch!='\n')判斷是否輸入結束{num++;ch=getchar();}printf(“%d\n”,num);return0;}2023/1/137a注意表達式在判斷前,必須要有明確的值。循環(huán)體中一般有改變條件表達式的語句。while(表達式)后面沒有分號。#include"stdio.h"intmain(){charch;intnum=0;

ch=getchar();while(ch!='\n'){num++;

ch=getchar();}printf(“%d\n”,num);}2023/1/138a2do--while語句1)、do--while的形式:

do{循環(huán)體;}

while(表達式);2)、do--while語句常稱為“直到型”循環(huán)語句。真(非零)表達式

循環(huán)體假(零)2023/1/139a3)、說明:先執(zhí)行語句,后判斷表達式。第一次條件為真時,while,do-while等價;第一次條件為假時,二者不同。2023/1/1310a【例3】用do-while語句編寫程序統(tǒng)計從鍵盤輸入的一行非空字符的個數(shù)(以回車鍵作為輸入結束標記)。#include"stdio.h"intmain(){charch;intnum=0;ch=getchar();do{num++;ch=getchar();}while(ch!='\n');printf("num=%d\n",num);}2023/1/1311a注意在if、while語句中,表達式后面都沒有分號,而在do-while語句的表達式后面則必須加分號。do-while和while語句相互替換時,要注意修改循環(huán)控制條件。2023/1/1312a3for語句for的形式:for(初始表達式1;條件表達式2;循環(huán)表達式3){循環(huán)體;}

表達式1:用于循環(huán)開始前為循環(huán)變量設置初始值。表達式2:控制循環(huán)執(zhí)行的條件,決定循環(huán)次數(shù)。表達式3:循環(huán)控制變量修改表達式。循環(huán)體語句:被重復執(zhí)行的語句。2023/1/1313a表達式3計算表達式1循環(huán)體判斷表達式2零非零for的下一條語句執(zhí)行過程2023/1/1314a

for(i=1;i<=100;i++)sum=sum+i;

例如:它相當于以下語句:

i=1;

while(i<=100){sum=sum+i;i++;

}表達式1;while(表達式2)表達式3;2023/1/1315a3、說明三個表達式都可以是逗號表達式。三個表達式都是任選項,都可以省略,但要注意省略表達式后分號間隔符不能省略。2023/1/1316afor語句中表達式省略的形式(1)for語句一般形式中的“表達式1”可以省略;如:sum=0;i=1;for(;i<=100;i++)sum=sum+i;

2023/1/1317a(2)表達式2省略,即不判斷循環(huán)條件,循環(huán)無終止地進行下去;如:for(sum=0,i=1;;i++){if(i>100)break;sum=sum+i;}

2023/1/1318a(3)表達式3也可以省略,但此時保證循環(huán)能正常結束如:for(sum=0,i=1;i<=100;){sum=sum+i;i++;}2023/1/1319a(4)可以省略表達式1和表達式3,只有表達式2,如:

i=1;sum=0;for(;i<=100;){sum=sum+i;i++;}i=1;sum=0;while(i<=100)

{sum=sum+i;i++;}相當于2023/1/1320awhile(1)循環(huán)體;即不設初值,不判斷條件,循環(huán)變量不增值。無終止地執(zhí)行循環(huán)體。(5)三個表達式都可省略,如

for(;;)循環(huán)體;如:sum=0,i=1;for(;;){if(i>100)break;sum=sum+i;i++;}相當于2023/1/1321a(6)循環(huán)體為空語句對for語句,循環(huán)體為空語句的一般形式為:

for(表達式1;表達式2;表達式3);如:for(sum=0,i=1;i<=100;sum+=i,i++);要在顯示器上復制輸入的字符,輸入的字符為’.’時,結束循環(huán)。輸入abcdefg.輸出abcdefg.while(putchar(getchar())!=’.’);2023/1/1322a(1)在進入累加前先給累加器賦初值(一般為0);(2)用循環(huán)語句實現(xiàn)累加;for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量改變規(guī)律)(3)循環(huán)體語句的設計。累加器當前值=累加器原值+循環(huán)變量當前值;典型例題分析【例4】求累加和1+2+3+…+1000基本方法:屬于“累加器”類型問題。2023/1/1323a累加器賦初值求偶數(shù)和?奇數(shù)和?2+4+6+…+…1+3+5+…+…參考程序:voidmain(){longintk,s;s=0;for(k=1;k<=1000;k++)s=s+k;printf("s=%ld",s);}累加思考for(s=0,k=1;k<=1000;k++,s=s+k);2023/1/1324a(1)給累乘器賦初值,一般為1;(2)用循環(huán)語句實現(xiàn)累乘;for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量改變規(guī)律)(3)循環(huán)體設計。累乘器當前值=累乘器原值*循環(huán)變量當前值;例5:求累乘積。如:1×2×3×...×100基本方法:屬于“累乘器”類型問題。2023/1/1325a累乘器賦初值求n!=1×2×3×…n參考程序:voidmain(){doubles=1;intk;for(k=1;k<=100;k++)s=s*k;printf("s=%lf",s);}累乘思考整數(shù)連乘結果一定是整數(shù),而本例中結果數(shù)值相當大,用long型都無法存放,因此將存放累乘結果的變量s定義為double型。2023/1/1326a例6判斷一個數(shù)是否為素數(shù)?一個數(shù)x在[2,sqrt(x)]范圍內(nèi)沒有因子,我們就稱其為素數(shù)(質(zhì)數(shù))主要編程方法:循環(huán)變量終值法、標記變量法2023/1/1327a#include"math.h"voidmain(){intx,k;scanf("%d",&x);排除法:如果有因子,不再往下判斷是否是素數(shù)循環(huán)變量終值法for(k=2;k<=sqrt(x);k++)if(x%k==0)break;if(k>sqrt(x))printf("%disaprime",x);elseprintf("%disnotaprime",x);}在判斷范圍內(nèi)無因子,程序正常終止有因子,程序非正常終止2023/1/1328a#include"math.h"voidmain(){intx,k,f=1;scanf("%d",&x);排除法:如果有因子,不再往下判斷是否是素數(shù)for(k=2;k<=sqrt(x);k++)if(x%k==0){f=0;break;}if(f==1)printf("%disaprime",x);elseprintf("%disnotaprime",x);}在判斷范圍內(nèi)無因子,程序正常終止有因子,程序非正常終止標記變量法2023/1/1329a例7用0--9這十個數(shù)字可以組成多少無重復的三位數(shù)?

編程方法:“枚舉法”按問題本身的性質(zhì),一一列舉出該問題所有可能的解,并在逐一列舉的過程中,檢驗每個可能解是否是問題的真正解,若是,我們采納這個解,否則拋棄它。對于所列舉的值,既不能遺漏也不能重復。2023/1/1330a#include"stdio.h"voidmain()/*a,b,c代表百位、十位、個位*/{intx,a,b,c,num=0;/*num存放滿足條件的數(shù)的個數(shù),注意num要賦初值*/

for(x=100;x<=999;x++)

{a=x/100;b=x/10%10;c=x%10;if(a!=b&&a!=c&&b!=c)

{

num++;printf("%5d",x);}

}printf("\nnumber=%d",num);}2023/1/1331a編程方法:“遞推法”

例8

裴波那契數(shù)列的第1、2項分別為1、1,以后各項的值均是其前兩項之和。求前30項菲波那契數(shù)。所謂遞推法就是從初值出發(fā),歸納出新值與舊值間的關系,直到求出所需值為止。新值的求出依賴于舊值,不知道舊值,無法推導出新值。數(shù)學上遞推公式正是這一類問題。2023/1/1332af1--第一個數(shù)

f2--第二個數(shù)

f3--第三個數(shù)

f1=1;f2=1;f3=f1+f2;

以后只要改變f1,f2的值,即可求出下一個數(shù).f1=f2;f2=f3;f3=f1+f2;遞推2023/1/1333avoidmain(){longf1=1,f2=1,f3;intk;參考程序:printf("%ld\t%ld\t",f1,f2);for(k=3;k<=30;k++){f3=f1+f2;printf("%ld\t",f3);f1=f2;f2=f3;}}遞推2023/1/1334a問題:如果要求每行輸出5項,且每項的輸出寬度等寬,程序應如何改寫?#include<stdio.h>voidmain(){longf1=1,f2=1,f3;intk;printf("%12ld%12ld",f1,f2);for(k=3;k<=30;k++){f3=f1+f2;printf("%12ld",f3);f1=f2;f2=f3;}}if(k%5==0)printf(“\n”);2023/1/1335a

4.循環(huán)語句的選擇if(循環(huán)次數(shù)已知) 使用for語句else /*循環(huán)次數(shù)未知*/

if(循環(huán)條件在進入循環(huán)時明確) 使用while語句

else /*循環(huán)條件需要在循環(huán)體中明確*/ 使用do-while語句2023/1/1336a1).break語句(1)語句形式:

break;(2)作用:結束break所在的switch語句。結束當前循環(huán),跳出break所在的循環(huán)結構。5.break語句和continue語句2023/1/1337a【例10】求300以內(nèi)能被17整除的最大的數(shù)。#include"stdio.h"voidmain(){intx,k;for(x=300;x>=1;x--)if(x%17==0)break;printf("x=%d\n",x);}找到滿足條件的最大數(shù),結束循環(huán)2023/1/1338a(1)語句形式:

continue;(2)語句作用:結束本次循環(huán)。2)、continue語句(3)語句執(zhí)行流程:

continue語句可以結束本次循環(huán),即不再執(zhí)行循環(huán)體中continue語句之后的語句,轉(zhuǎn)入下一次循環(huán)條件的判斷與執(zhí)行。

2023/1/1339a【例11】求300以內(nèi)能被17整除的所有整數(shù)。#include"stdio.h"voidmain(){intx,k;for(x=1;x<=300;x++){if(x%17!=0)continue;printf("%d\t",x);}}2023/1/1340awhile(條件){語句A;

break;語句B;}真語句B條件語句Abreak假結束循環(huán)語句與continue語句的區(qū)別至此位置2023/1/1341awhile(條件){語句A;

continue;語句B;}真語句B條件語句Acontinue假結束循環(huán)至此位置2023/1/1342a#include"stdio.h"voidmain(){inta,b;for(a=1,b=1;a<=10;a++){if(b>=10)break;if(b%3==1){b+=3;continue;}}printf("%d\n",a);}【例12】分析以下程序的運行結果。程序運行結果:42023/1/1343a在循環(huán)體語句中又包含有另一個完整的循環(huán)結構的形式,稱為循環(huán)的嵌套。如果內(nèi)循環(huán)體中又有嵌套的循環(huán)語句,則構成多重循環(huán)。7.循環(huán)的嵌套嵌套在循環(huán)體內(nèi)的循環(huán)體稱為內(nèi)循環(huán),外面的循環(huán)稱為外循環(huán)。while、do-while、for三種循環(huán)都可以互相嵌套。2023/1/1344a循環(huán)語句之間的關系for(...){...for(...){...}...}內(nèi)循環(huán)外循環(huán)并列循環(huán)for(....){...}for(...){...}嵌套循環(huán)錯誤2023/1/1345a真真外循環(huán)初始條件內(nèi)循環(huán)初始條件內(nèi)循環(huán)體外循環(huán)條件假內(nèi)循環(huán)條件假內(nèi)循環(huán)循環(huán)條件外循環(huán)循環(huán)條件循環(huán)結束二重循環(huán)嵌套結構執(zhí)行流程2023/1/1346a例13:輸出圖形:

****************編程分析:采用雙重循環(huán),一行一行輸出。每一行輸出步驟:一般3步。1)光標定位3)每輸完一行光標換行(\n)2)輸出圖形。例如本題:共4行,若行號用k表示,則每一行有2*k-1個*號。2023/1/1347a

#include"stdio.h“voidmain(){intk1,k2;for(k1=1;k1<=4;k1++){putchar(‘\t’);for(k2=1;k2<=k1;k2++)putchar(‘\b’);for(k2=1;k2<=k1*2-1;k2++)putchar(‘*’);putchar(‘\n’);}}定位(還可以用空格的方法)輸出2023/1/1348a#include"stdio.h"voidmain(){intk1,k2,k3;for(k1=1;k1<=4;k1++){for(k2=1;k2<=8-k1*2;k2++)printf("");

for(k3=1;k3<=k1*2-1;k3++)printf("*");printf("\n");}for(k1=3;k1>=1;k1--){for(k2=1;k2<=8-2*k1;k2++) printf(""); for(k3=1;k3<=k1*2-1;k3++)printf("*");printf("\n");}}控制行數(shù)控制每行的起始位控制每行要輸出的個數(shù)

************************

*2023/1/1349a8.循環(huán)結構程序設計舉例【例14】求#include"stdio.h"voidmain(){floats=0,f1=2,f2=1,f=1,t,n;/*累加器賦初值*/

for(n=1;n<=10;n++){s=s+f*f1/f2;/*累加器當前值=累加器原來的值+新的要加的數(shù)據(jù)*/

f=f*(-1);t=f2;f2=f1;f1=f1+t;/*為求下一個要加的數(shù)據(jù)做準備*/}printf("s=%f\n",s);}2023/1/1350a循環(huán)程序設計循環(huán)程序的實現(xiàn)要點:歸納出哪些操作需要反復執(zhí)行?循環(huán)體這些操作在什么情況下重復執(zhí)行?循環(huán)條件選用合適的循環(huán)語句forwhiledo-while循環(huán)具體實現(xiàn)時考慮(循環(huán)條件):事先給定循環(huán)次數(shù),首選for通過其他條件控制循環(huán),考慮while或do-while2023/1/1351a#include<stdio.h>voidmain(){inti,mark,max,n;

printf("Entern:");

scanf("%d",&n);printf("Enter%dmarks:",n);scanf("%d",&mark); /*讀入第一個成績*/

max=mark;/*假設第一個成績是最高分*/

for(i=1;i<n;i++){

scanf("%d",&mark);

if(max<mark)

max=mark;}

printf("Max=%d\n",max);}【例15】輸入一批學生的成績,求最高分(for)markmaxmaxmarkEntern:5Enter5maks:6788735482Max=88Entern:02023/1/1352a#include<stdio.h>voidmain(){intmark,max;

printf(“Entermarks:");

scanf("%d",&mark);/*讀入第一個成績*/

max=mark;/*假設第一個成績最高分*/

while(mark>=0)

{if(max<mark)

max=mark;

scanf("%d",&mark);}

printf("Max=%d\n",max);}輸入一批學生的成績,求最高分(while)Entermarks:6788735482-1Max=88Entermarks:-12023/1/1353a【例16】將一個正整數(shù)逆序輸出確定:循環(huán)條件和循環(huán)體(循環(huán)不變式)

123455432112345%10=512345/

10=

1234

1234%

10=4

1234

/

10=

123

123

%

10=3

123

/

10=

12

12

%

10=2

12

/

10=

1

1

%

10

=

1

1

/

10

=

0

結束循環(huán)體x%10x=x/10循環(huán)結束條件x==0scanf(“%d”,&x);while(x!=0){

digit=x%10;x=x/10;printf("%d",digit);}用do-while實現(xiàn)?2023/1/1354a循環(huán)程序設計-習題

輸入一個整數(shù),從高位開始逐個數(shù)字輸出。12345/10000=112345%10000=23452345/1000=22345%1000=345345/100=3345%100=4545/10=445%10=55/1=55%1=0(1)如何得到10000找輸入數(shù)據(jù)對應的冪

pow=1;temp=x;

while(x!=0){

pow=pow*10;x=x/10;}pow=pow/10;(2)

每次循環(huán)pow縮小1/10(3)pow=0結束2023/1/1355a#include<stdio.h>voidmain(){intx,pow,temp,y;scanf("%d",&x);pow=1;temp=x;while(x!=0) {pow=pow*10;x=x/10;}pow=pow/10; while(pow!=0) {y=temp/pow; temp=temp%pow; printf("%d\n",y); pow=pow/10; }}參考程序:2023/1/1356a【例17】古典算術問題-搬磚頭某地需要搬運磚塊,已知男人一人搬3塊,女人一人搬2塊,小孩兩人搬一塊。問用45人正好搬45塊磚,有多少種搬法?for(men=0;men<=45;men++)for(women=0;women<=45;women++)for(child=0;child<=45;child++)

if((men+women+child==45)&&(men*3+women*2+child*0.5==45))printf("men=%dwomen=%dchild=%d\n",men,women,child);}2023/1/1357afor(men=0;men<=15;men++)for(women=0;women<=22;women++){

child=45–women–men;

if(men*3+women*2+child*0.5==45)printf("men=%dwomen=%dchild=%d\n",men,women,child);}for(men=0;men<=45;men++)for(women=0;women<=45;women++)for(child=0;child<=45;child++)

if((men+women+child==45)&&(men*3+women*2+child*0.5==45))printf("men=%dwomen=%dchild=%d\n",men,women,child);}比較循環(huán)次數(shù)2023/1/1358a1、寫出程序運行結果:(1)voidmain(){inti,j,x=0;for(i=0;i<2;i++){x++;for(j=0;j<=3;j++){if(j%2)continue;x++;}x++;}printf(“x=%d\n”,x);}運行結果:x=8練習2023/1/1359a(2)voidmain(){intx=1,y=0,a=0,b=0;switch(x){case1:switch(y){case0:a++;break;

溫馨提示

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

評論

0/150

提交評論