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

下載本文檔

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

文檔簡介

第5章

C語言循環(huán)結構程序設計

下一頁返回本章要點

while語句、do-while語句、for語句

continue語句、break語句循環(huán)的嵌套循循環(huán)結構程序設計學習方法建議學習本章內容時,應重點掌握三種循環(huán)語句的語法格式及執(zhí)行過程,并在此基礎上理解循環(huán)嵌套的應用,要多讀程序,理解編程思想,并多上機練習。目錄5.1while語句

5.2

do-while語句5.3

for語句

5.4

循環(huán)的嵌套

返回上一頁5.5

break語句和continue語句5.6

循環(huán)結構應用舉例

5.7

本章小結

5.1while語句while語句用來實現“當型”循環(huán)結構。其一般形式如下:while(表達式)語句while語句的執(zhí)行過程是:下一頁返回

首先計算表達式的值,若結果是“真”(非0)值時,執(zhí)行while語句中的內嵌語句,即循環(huán)體;然后再計算表達式的值,重復上述過程,直到表達式的值為“假”(0)時結束,流程控制轉到while語句的下一個語句繼續(xù)執(zhí)行

。

while語句中的“表達式”就是循環(huán)的條件,其執(zhí)行流程見圖5.1,其特點是:先判斷表達式,后執(zhí)行語句。

表達式語句0非0圖5.1while語句執(zhí)行過程

例5.1】求。

上一頁下一頁返回【編程思路】(1)定義變量i、sum,并分別賦初值為1和0,用i表示累加數,sum表示累加和。(2)在while語句中,使sum在原有值的基礎上加上i的值,加完后再使i值自動增1。(3)用i<=100作為循環(huán)的條件,若i的值超過100就停止循環(huán)。(4)最后輸出累加和sum?!境绦虼a】#include"stdio.h"main(){inti=1,sum=0;while(i<=100){sum=sum+i;i++;}printf(“sum=%d\n",sum);}運行結果如下:上一頁下一頁返回【例5.2】求n!,n由鍵盤輸入。【編程思路】求階乘就是求累乘,即求1*2*3*…n。這里除用于存放累乘積的變量的應置為1外,其執(zhí)行過程與累加相同?!境绦虼a】#include"stdio.h"main(){inti=1,n,s=1;printf("Inputn:");scanf("%d",&n);while(i<=n){s*=i;i++;}printf("%d!=%d\n",n,s);}運行結果如下:do-while語句的特點是先執(zhí)行循環(huán)體,然后判斷循環(huán)條件是否成立。其一般形式為do

語句while(表達式);上一頁下一頁返回5.2do-while語句do-while語句的執(zhí)行過程是:先執(zhí)行一次循環(huán)體語句,然后判斷表達式,當表達式的值為非0時,返回重新執(zhí)行循環(huán)體語句,如此反復,直到表達式值等于0為止,此時循環(huán)結束??梢杂脠D5.2表示其流程。語句0(假)表達式圖5.2do-while語句執(zhí)行過程【例5.3】

用do-while語句改寫例5.1的程序。上一頁下一頁返回【程序代碼】#include"stdio.h“main(){inti=1,sum=0;do{sum=sum+i;i++;}while(i<=100);printf(“sum=%d\n",sum);}運行結果如下:for語句的一般形式為:

for(表達式1;表達式2;表達式3)語句For語句的執(zhí)行過程是:(1)求解表達式1;(2)求解表達式2,若其值為真(值為非0),則執(zhí)行for語句中指定的內嵌語句,然后執(zhí)行下面第(3)步。若為假(值為0),則結束循環(huán),轉到第(5)步;(3)求解表達式3。(4)轉回上面第(2)步驟繼續(xù)執(zhí)行。(5)循環(huán)結束,執(zhí)行for語句下面的一條語句??梢杂脠D5.3來表示for語句的執(zhí)行過程。上一頁下一頁返回5.3for語句非0求解表達式1表達式2語句求解表達式30圖5.3for語句執(zhí)行過程for語句最簡單的應用形式也就是最易理解的如下形式:

for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值)語句【例5.4】用for語句改寫例5.1的程序【程序代碼】#include"stdio.h"main(){inti,sum=0;for(i=1;i<=100;i++)sum+=i;printf("sum=%d\n",sum);}運行結果如下:

上一頁下一頁返回說明:有時根據需要可以將for語句中的部分或所有表達式省略,省略“表達式1”時,應在for語句之前給循環(huán)變量賦初值。省略“表達式2”時,在循環(huán)體中通常要有能使循環(huán)結束的語句,否則就成了無限循環(huán)了。省略“表達式3”時,通常在循環(huán)體中要有使循環(huán)變量增值的語句。不管省略幾個表達式,分隔符分號“;”是不能省的。如例5.4中的代碼可以改寫成:

inti=1,sum=0;for(;i<=100;i++)sum+=i;上一頁下一頁返回

一個循環(huán)的循環(huán)體內又包含另一個完整的循環(huán)結構,稱為循環(huán)的嵌套。內嵌的循環(huán)中還可以嵌套循環(huán),這就是多重循環(huán)。各種語言中關于循環(huán)的嵌套的概念都是一樣的。三種循環(huán)(while循環(huán),do-while循環(huán)和for循環(huán))即可以自身嵌套,也可以互相嵌套。

【例5.5】用一元紙幣換一分、兩分及五分的硬幣,要求換到的硬幣總數為50枚,問有多少種換法?每種換法中各種硬幣分別是多少?【編程思路】設x,y,z分別代表五分、二分、及一分的硬幣數目。三變量只有兩個是獨立的,第三個必須滿足z=100–5*x–2*y及x+y+z==50的條件。因此可用雙重循環(huán)解此問題。其中x可由1到20,y可由0到50。上一頁下一頁返回5.4循環(huán)的嵌套【程序代碼】#include"stdio.h"main(){intx,y,z;printf("FIVE\tTWO\tONE\n");for(x=0;x<=20;x++)for(y=0;y<=50;y++){z=100-5*x-2*y;if(x+y+z==50)printf("%3d\t%3d\t%3d\n",x,y,z);}}運行結果如下:上一頁下一頁返回【例5.6】編寫程序,輸出下列圖形上一頁下一頁返回【編程思路】((1)圖形共有5行,定義i表示行數,即外循環(huán)的循環(huán)控制變量,其值從1到5遞增。(2)每行前空格的數量分別為5、4、3、2、1,如果用i表示行數,則每行前的空格數據與行號i的關系為6-i;(3)每一行“*”的數量分別為1、3、5、7、9,與行號的關系為2*i-1。(4)定義變量j、k表示空格數和“*”數,它們作為內循環(huán)的循環(huán)控制變量。【程序代碼】#include"stdio.h"main(){inti,j,k;for(i=1;i<=5;i++){for(j=1;j<=6-i;j++)printf("");for(k=1;k<=2*i-1;k++)printf("*");printf("\n");}}說明:本程序用雙重循環(huán)實現,外循環(huán)控制行數,內循環(huán)控制每行的內容,每行內容均包括三部分,行前空格、一行*、換行。行前空格和每行的*的輸出均用內嵌的循環(huán)實現。上一頁下一頁返回break語句的一般形式為:

break;該語句的功能有兩個:(1)在switch語句的程序段中,遇到break語句,則退出switch語句,執(zhí)行后繼語句。(2)在循環(huán)體中,遇到break語句,則退出包含break語句的那層循環(huán),一般和if語句連用。

【例5.7】判斷正整數m是否素數,m由鍵盤輸入。

【編程思路】判斷m是否是素數,可以有三種方法:(1)用m依次除以2~m-1之間的所有數,若都不能除盡,則m是素數,否則就不是素數。(2)用m依次除以2~之間的所有數,若都不能除盡,則m是素數,否則就不是素數。上一頁下一頁返回5.5break語句和continue語句5.5.1break語句

(3)用m依次除以m/2之間的所有數,若都不能除盡,則m是素數,否則就不是素數。 本題采用第(2)種方法,其算法是這樣的:

將的值賦給變量k,讓m被2到k除,如果m能被2~k之中任何一個整數整除,則提前結束循環(huán),此時i必然小于或等于k,如果m不能被2~k之間的任一整數整除,則在完成最后一次循環(huán)后,i還要加1,因此i=k+1,然后才終止循環(huán)。在循環(huán)之后判別i的值是否大于等于k+1,若是,則表明未曾被2~k之間任一整數整除過,因此輸出“是素數”?!境绦虼a】#include<stdio.h>#include<math.h>main(){intm,i,k;scanf("%d",&m);k=sqrt(m);for(i=2;i<=k;i++)if(m%i==0) break;上一頁下一頁返回if(i>=k+1)printf("%disaprimenumber\n",m);else printf("%disnotaprimenumber\n",m);}運行結果如下: 上一頁下一頁返回5.5.2continue語句continue語句的一般形式為:

continue;

該語句只能用在循環(huán)體中,執(zhí)行該語句則結束本次循環(huán),再去判斷是否繼續(xù)下次循環(huán)。該語句通常是用于循環(huán)體中if語句內,即滿足某種條件才結束本次循環(huán)。

continue語句和break語句的區(qū)別是:continue語句只結束本次循環(huán),而不是終止整個循環(huán)的執(zhí)行。而break語句則是結束整個循環(huán)過程,不再判斷執(zhí)行循環(huán)的條件是否成立?!纠?.8】把100~200之間的不能被3整除的數輸出,每行輸出10個數。

【編程思路】(1)定義一個循環(huán)控制變量和統(tǒng)計輸出數量的變量

。(2)循環(huán)的初值和終值分別取100和200。(3)用對3取余的運算判斷是否能被3整除?!境绦虼a】#include"stdio.h"main(){intn,s=0;for(n=100;n<=200;n++){if(n%3==0)continue;printf("%d",n);s++;if(s%10==0)printf("\n");}printf("\n");}上一頁下一頁返回說明:在while語句和do-while語句中,continue語句使得流程直接跳到循環(huán)控制條件的測試部分,然后決定循環(huán)是否繼續(xù)進行。在for循環(huán)中,遇到continue后,流程跳過循環(huán)體中余下的語句,而去對for語句中的“表達式3”求值,然后進行“表達式2”的條件測試,最后根據“表達式2”的值來決定for語句是否執(zhí)行。上一頁下一頁返回運行結果如下:5.6循環(huán)結構應用舉例【例5.9】輸出九九表,格式如下:上一頁下一頁返回【編程思路】(1)用雙重循環(huán)實現,外循環(huán)控制行數,內循環(huán)控制列數。(2)定義變量i表示行數,作外循環(huán)的循環(huán)控制變量,使其從1到9遞增。(3)定義j表示列數,作內循環(huán)的循環(huán)控制變量,從1到i遞增?!境绦虼a】#include<stdio.h>main(){inti,j;for(i=1;i<10;i++){for(j=1;j<=i;j++)printf("%d*%d=%-4d",j,i,i*j);printf("\n");}}上一頁下一頁返回說明:由于外循環(huán)變量i表示行數(1到9),內循環(huán)變量j表示列數(1到i),故每一個位置輸出的數據應為行號和列號的乘積?!纠?.10】用π/4≈1-+-+…公式求π的近似值,直到最后一項的絕對值小于10-6為止?!揪幊趟悸贰浚?)定義一個變量pi用來存放右側表達式的值及最終要求的π的近似值。(2)定義一個表示每一項的變量t,并賦初值為1。(3)定義一個表示每一項的分母的變量n,其初值為1,其值每次增2。(4)定義一個用來改變每一項符號的變量s其初值定義為1,由于此題的各項的符號是正負相間,故用循環(huán)處理此題的過程中,s每次都要變換個符號,再用s乘以各項既可改變各項的符號。(5)循環(huán)的條件是fabs(t)>=1e-6,其中fabs是用來求絕對值的函數,但使用前在代碼前要用#include對"math.h"頭文件進行包含。上一頁下一頁返回【程序代碼】#include"stdio.h"#include"math.h"main(){ints;floatn,t,pi;t=1;pi=0;n=1;s=1;while(fabs(t)>=1e-6){pi=pi+t;n=n+2;s=-s;t=s/n;}pi=pi*4;printf("pi=%10.6f\n",pi);}運行結果如下:上一頁下一頁返回【例5.11】求100~200間的全部素數,每行輸出10個。【編程思路】(1)定義一個循環(huán)控制變量m其取值從101到200,循環(huán)增量為2,因為此范圍內的素數一定為奇數,定義一個統(tǒng)計素數個數的變量n,初值為0,通過對10取余運算可控制每行輸出10個。(2)用每個循環(huán)變量除以2到該變量的平方根之間的每一個數,若都除不盡,則該變量所存放的數為素數。(3)平方根的函數為sqrt(),其對應的頭文件為"math.h“【程序代碼】#include"stdio.h"#include"math.h"main(){intm,k,i,n=0;for(m=101;m<=200;m=m+2){k=sqrt(m);上一頁下一頁返回for(i=2;i<=k;i++)if(m%i==0)break;if(i>=k+1){printf("%d",m);n=n+1;}if(n%10==0)printf("\n");}printf("\n");}運行結果如下:【例5.12】求Fibonacci數列前20項,這個數列有如下的特點:第1,2兩個數為1,1。從第3個數開始,每一個數都是其前面兩個數之和。即:F(1)=1(n=1)F(2)=1(n=2)F(n)=F(n-1)+F(n-2)(n≥3)上一頁下一頁返回【編程思路】(1)本題屬于遞推問題。即不斷地用舊值推算出新值,在程序中表現為不斷地用新值取代舊值的過程。(2)定義循環(huán)變量n,用來表示數列的項,由于前兩項已經給出,所以n從3開始。(3)定義變量f1、f2、fn,每次計算完通項后,那么在計算下一項時,原來的f2就成為新的f1,剛計算出的fn就成為新的f2。(4)為了更清晰地輸出數列,每行輸出4個數?!境绦虼a】#include"stdio.h"main(){intf1=1,f2=1,n,fn;printf("%12d%12d",f1,f2);for(n=3;n<=20;n++){fn=f1+f2;f1=f2;f2=fn;printf("%12d",fn);if(n%5==0)printf("\n");}}運行結果如下:上一頁下一頁返回通過本章

溫馨提示

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

評論

0/150

提交評論