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

下載本文檔

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

文檔簡介

第5章循環(huán)結構程序設計

第1頁,共51頁。學習目標理解循環(huán)結構的概念。掌握如何用while語句構成循環(huán)結構。掌握如何用do-while語句構成循環(huán)結構。熟練掌握如何用for語句構成循環(huán)結構。掌握循環(huán)結構的嵌套使用。理解break和continue語句應用于循環(huán)體時的區(qū)別。第2頁,共51頁。在C語言中可以用以下語句來實現(xiàn)循環(huán):1)while語句。2)do--while語句。3)for語句。4)goto語句和if語句。循環(huán)是一種對同一程序段有規(guī)律的重復被重復執(zhí)行的部分叫循環(huán)體。5.1引言第3頁,共51頁。n!=1×2×3×…×n,用fac來存放結果:初始化值為1fac12nfac×1facfac×2facfac×nfac作n次乘法fac×ifac累乘器計數(shù)器例如,求階乘第4頁,共51頁。5.2while語句真(非零)表達式

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

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

while語句常稱為“當型”循環(huán)語句。第5頁,共51頁?!纠?-1】用while語句構成的循環(huán)結構求n!算法:step1:定義初始化變量。本程序需要三個變量,一個用來接收n,一個用來表示求階乘過程中數(shù)據(jù)從1到n的變化,還有一個保存計算結果step2:輸入n,需要考慮輸入數(shù)據(jù)合法性的問題step3:計算n!就是一個循環(huán)累乘求積的過程n!=1*2*3*....(n-1)*n第6頁,共51頁?!纠?-1】n!的C語言程序#include<stdio.h>voidmain(){intn,i=1;longintfac;

printf("pleaseinputn(n>=0):");scanf("%d",&n);if(n>=0)fac=1;else

{printf("Invalidinput!\n");return0;}while(i<=n)

{fac*=i;i++;}printf("%d!=%ld\n",n,fac);}循環(huán)變量的初始化累乘器的初始化循環(huán)控制條件求階乘修改循環(huán)變量第7頁,共51頁?!镒⒁猓合扰袛啾磉_式,后執(zhí)行語句。表達式同if語句后的表達式一樣,可以是任何類型的表達式。循環(huán)體多于一句時,用一對{}括起。while循環(huán)結構常用于循環(huán)次數(shù)不固定,根據(jù)是否滿足某個條件決定循環(huán)與否的情況。第8頁,共51頁。#include"stdio.h"voidmain(){floatn;scanf("%f",&n);例:輸入一系列實數(shù),判斷每個數(shù)的正負,輸入0時,結束循環(huán)輸入數(shù)據(jù),為第一次判斷做準備while(n!=0)判斷是否結束{if(n>0)printf("+");elseprintf("-");scanf("%f",&x);}}判斷正負號繼續(xù)輸入下一個數(shù)第9頁,共51頁。#include"stdio.h"voidmain(){charch;intnum=0;ch=getchar();例:統(tǒng)計從鍵盤輸入的一行字符的個數(shù)(以回車鍵作為輸入結束標記)while(ch!='\n')判斷是否輸入結束{num++;ch=getchar();}printf("num=%d\n",num);}第10頁,共51頁。★注意:表達式在判斷前,必須要有明確的值。循環(huán)體中一般有改變條件表達式的語句。while(表達式)后面沒有分號。第11頁,共51頁?!?/p>

5.3do--while語句

do--while的形式:

do{循環(huán)體;}while(表達式);do--while語句形式與與直到型循環(huán)相似,但它仍然是當型循環(huán)。條件為真時執(zhí)行循環(huán)真(非零)表達式

循環(huán)體假(零)第12頁,共51頁?!纠?-2】用do-while語句構成的循環(huán)結構求n!do{fac*=i;i++;}while(i<=n);說明:先執(zhí)行語句,后判斷表達式。第一次條件為真時,while,do-while等價;第一次條件為假時,二者不同。while(i<=n)

{fac*=i;i++;}第13頁,共51頁。★注意:在if、while語句中,表達式后面都沒有分號,而在do-while語句的表達式后面則必須加分號。do-while和while語句相互替換時,要注意修改循環(huán)控制條件。第14頁,共51頁。5.4for語句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í)行的語句。第15頁,共51頁。表達式3計算表達式1循環(huán)體判斷表達式2假(零)真(非零)for的下一條語句執(zhí)行流程:第16頁,共51頁。

for(fac=1,i=1;i<=n;i++)fac*=i;例如:它相當于以下語句:

fac=1;i=1;

while(i<=n){

fac*=i;i++;

}表達式1;while(表達式2)表達式3;第17頁,共51頁。說明:三個表達式都可以是逗號表達式。三個表達式都是任選項,都可以省略,但要注意省略表達式后,分號間隔符不能省略。第18頁,共51頁。for語句中表達式省略的幾種情況:(1)for語句一般形式中的“表達式1”可以省略;如:fac=1;i=1;for(;i<=n;i++)fac*=i;第19頁,共51頁。(2)表達式2省略,即不判斷循環(huán)條件,循環(huán)會無終止地進行下去,所以此時循環(huán)體中要保證循環(huán)能正常結束;

如:for(fac=1,i=1;;i++){if(i>n)break;fac*=i;}

第20頁,共51頁。(3)表達式3也可以省略,同樣此時循環(huán)體中要保證循環(huán)能正常結束;如:

for(fac=1,i=1;i<=n;){fac*=i;i++;}第21頁,共51頁。

(4)可以省略表達式1和表達式3,只有表達式2如:

fac=1;i=1;for(;i<=n;){fac*=i;i++;}i=1;fac=1;while(i<=n)

{fac*=i;i++;}相當于第22頁,共51頁。fac=1,i=1;while(1)

{if(i>n)break;fac*=i;i++;}(5)三個表達式都可省略,同樣此時循環(huán)體中要保證循環(huán)能正常結束;fac=1;i=1;for(;;){if(i>n)break;fac*=i;i++;}相當于條件始終為真地執(zhí)行循環(huán)體。如:第23頁,共51頁。(6)循環(huán)體為空語句

對for語句,循環(huán)體為空語句的一般形式為:

for(表達式1;表達式2;表達式3);如:

在顯示器上輸出輸入的一串字符,輸入的字符為’*’時,結束循環(huán)。輸入abcd*輸出abcd*while(putchar(getchar())!=’*’);for(fac=1,i=1;i<=n;fac*=i,i++);第24頁,共51頁?!?/p>

5.5continue語句和break語句在循環(huán)體中的應用5.5.1continue語句在循環(huán)體中的應用continue語句的一般形式為:

continue;其作用是結束本次循環(huán),即跳過本次循環(huán)體中continue語句之后的語句,轉入下一次循環(huán)條件的判斷,決定循環(huán)是否繼續(xù)執(zhí)行。第25頁,共51頁。注意:

執(zhí)行continue語句并沒有使整個循環(huán)終止在while和do-while循環(huán)中,continue語句使得流程直接跳到循環(huán)控制條件的測試部分在for循環(huán)中,遇到continue后,跳過循環(huán)體中余下的語句,而轉去對for語句中的“表達式3”求值,然后進行“表達式2”的條件測試,最后根據(jù)“表達式2”的值來決定for循環(huán)是否執(zhí)行。第26頁,共51頁?!?/p>

5.5.2break語句在循環(huán)體中的應用語句形式:

break;用break語句可以使程序執(zhí)行流程跳出switch語句體,從而構成多分支選擇結構。break語句只能使用在循環(huán)體和switch語句內(nèi)。作用:

break出現(xiàn)在循環(huán)體中時,用于結束當前循環(huán),跳出break所在的循環(huán)結構。第27頁,共51頁。break語句和continue語句的區(qū)別:break語句是完全從循環(huán)中跳出continue語句只結束本次循環(huán)。第28頁,共51頁。while(條件){語句A;

break;語句B;}真語句B條件語句Abreak假結束循環(huán)★

break語句與continue語句的區(qū)別至此位置第29頁,共51頁。while(條件){語句A;

continue;語句B;}真語句B條件語句Acontinue假結束循環(huán)至此位置第30頁,共51頁?!纠?-3】編程實現(xiàn)如下要求:找出1到100之間的前10個偶數(shù)并輸出。while(n<100){n++;if(count==10)break;//判斷偶數(shù)個數(shù)是否已滿10個if(n%2!=0)//判斷當前數(shù)據(jù)是否奇數(shù)

continue;//是奇數(shù)結束本次循環(huán)

printf(“%d\t”,n);//打印偶數(shù)count++;//統(tǒng)計偶數(shù)個數(shù)

}程序運行結果:2468101214161820第31頁,共51頁。在一個循環(huán)體內(nèi)又包含有另一個完整的循環(huán)結構,稱為循環(huán)嵌套?!?/p>

5.6循環(huán)的嵌套嵌套時,每一層循環(huán)在邏輯上必須是完整的。

前面介紹的三種類型的循環(huán):while、do-while、for三種都可以互相嵌套。第32頁,共51頁。循環(huán)嵌套時正確和錯誤的邏輯關系for(...){...for(...){...}...}內(nèi)循環(huán)外循環(huán)for(....){...}for(...){...}并列循環(huán)嵌套循環(huán)交叉循環(huán)for(....){...for(...){...}}錯誤第33頁,共51頁。真真外循環(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í)行流程第34頁,共51頁。程序范例★使用雙層循環(huán)輸出下面的圖形************第35頁,共51頁。#include"stdio.h"main(){inti,j,k;for(i=0;i<=2;i++){for(j=0;j<i;j++)printf("");for(k=0;k<=3;k++)printf("*");printf("\n");}}程序代碼如下:第36頁,共51頁。由i控制的外層for循環(huán)中內(nèi)嵌了兩個平行的for循環(huán)由j控制的for循環(huán)體用來輸出空格由k控制的for循環(huán)體用來輸出“*”號當i等于0時,由j控制的循環(huán),因為j的值為0,表達式j<i的值為假,循環(huán)體一次也不執(zhí)行,接著執(zhí)行由k控制的循環(huán),連續(xù)輸出四個“*”號;當i等于1時,由j控制for循環(huán)體執(zhí)行一次,輸出一個空格,這就使得接著輸出的四個“*”號右移一個字符位置第三行續(xù)依次類推代碼分析:第37頁,共51頁。注意:以上內(nèi)嵌的第一個for循環(huán)的結束條件和循環(huán)的控制變量i有關;第二個for循環(huán)結束條件是固定不變的。下面給出了以上雙重循環(huán)中i,j和k值的變化規(guī)律。i的變化 j的變化 k的變化0 0 0,1,2,3,41 0,1 0,1,2,3,42 0,1,2 0,1,2,3,43第38頁,共51頁。★

【例5-4】打印九九乘法表算法分析:采用雙重循環(huán),逐行輸出。外層循環(huán)控制行數(shù),九九乘法表共有九行,因此外層循環(huán)次數(shù)為9每一行的具體輸出一般分為3步:1)確定起始打印位置。本例每行左對齊。2)輸出該行數(shù)據(jù),因為有多項數(shù)據(jù),需要嵌套一個內(nèi)層循環(huán)完成對本例,若行號用i表示,每一行有i個數(shù)據(jù)項式子,所以內(nèi)層循環(huán)次數(shù)與行號相關,從1變化到i。3)每輸完一行進行換行操作。第39頁,共51頁。具體程序如下:#include<stdio.h>voidmain(){inti,j;for(i=1;i<=9;i++){for(j=1;j<=i;j++)printf("%d*%d=%-4d",i,j,i*j);printf("\n");}}第40頁,共51頁。5.7goto語句與標號

goto語句一般形式:

…語句標號:…goto語句標號;作用:無條件轉向“語句標號”處執(zhí)行?!罢Z句標號”是一個標識符,它表示程序指令的地址。語句標號僅僅對goto語句有效,對其它語句不影響。無條件轉向使程序結構無規(guī)律、可讀性差。所以goto語句不符合結構化程序設計準則,一般應避免使用goto語句,除非能在很大程度上提高程序的執(zhí)行效率,才適當使用它。第41頁,共51頁。5.8應用舉例★

【例5-6】判斷一個數(shù)是否為素數(shù)

算法分析:素數(shù)是指那些大于1,且除了1和它本身以外不能被其他任何數(shù)整除的數(shù)。為了判斷某數(shù)x是否為素數(shù),采用最簡單的方法:用2、3、4、…x-1這些數(shù)逐個去除x,只要能被一個數(shù)整除,x就不是素數(shù);否則,x就是素數(shù)。第42頁,共51頁。程序代碼:#include<stdio.h>#include<math.h>voidmain(){intx,k;intflag=1;scanf("%d",&x);for(k=2;k<=x-1;k++)if(x%k==0)flag=0;if(flag)printf("%disaprime",x);elseprintf("%disnotaprime",x);}循環(huán)部分可優(yōu)化化為如下形式:for(k=2;k<=sqrt(x);k++)if(x%k==0){flag=0;break;}第43頁,共51頁?!?/p>

【例5-7】計算裴波那契數(shù)列的前十項算法分析:斐波那契數(shù)列的變化規(guī)律是:第一項和第二項為1從第三項開始,每一項的值為前兩項的和可以用遞推算法來求出斐波那契數(shù)列中每項的值用變量f1和f2存儲第一個數(shù)和第二個數(shù),f3保存第三個數(shù),以后只要改變f1,f2的值,即可求出下一個數(shù)循環(huán)過程:第44頁,共51頁。程序源代碼如下:#include<stdio.h>voidmain(){intcount=3;longintf1,f2,f3;f1=1;f2=1;printf("f1=%d\nf2=%d\n",f1,f2);while(count<=10){f3=f1+f2;printf("f%d=%ld\n",count,f3);f1=f2;f2=f3;count++;}}第45頁,共51頁?!纠?-8】計算a+aa+aaa+aaaa+aa...a總共n項的值算法分析:關鍵是計算出每一項的值每一項與前一項tn的對應關系為:tn=tn+a*10n-1;程序源代碼如下:#include<stdio.h>voidmain(){inta,n,count=1;longintsn=0,tn=0;printf("pleaseinputaandn\n");

scanf("%d,%d",&a,&n);printf("a=%d,n=%d\n",a,n);

while(count<=n){tn=tn+a; sn=sn+tn;a=a*10; ++count;

}printf("a+aa+...=%ld\n",sn);}第46頁,共51頁?!锢?輸入任意一個整數(shù),將其逆序輸出,例如輸入1234,輸出4321。include"stdio.h"voidmain(){longy,n;scanf("%ld",&y)while(y!=0){n=y%10;printf("%ld",n);y=y/10;}}第47頁,共51頁?!锢?猴子第一天摘下若干個桃子,吃了一半,又多吃了一個。以后每天早晨猴子都吃掉前一天剩下的一半多一個。到第10天時,猴子再去吃桃子時發(fā)現(xiàn)只剩下1個桃子。問第一天猴子摘了多少個桃子?#include"stdio.h"voidmain(){intsum=1,n;for(n=10;n>=1;n--)sum=(sum+1)*2;pri

溫馨提示

  • 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

提交評論