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

下載本文檔

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

文檔簡介

第5章循環(huán)結構程序設計第5章循環(huán)結構程序設計5.1循環(huán)結構程序的引入5.2當型循環(huán)5.3直到型循環(huán)5.4計數(shù)型循環(huán)5.5循環(huán)嵌套與輔助控制5.6循環(huán)結構程序設計及實例5.1循環(huán)結構程序的引入

在日常生活中或是在程序所處理的問題中常常遇到需要重復處理的問題。例如:向計算機輸入全班50個學生的成績;分別統(tǒng)計全班50個學生的平均成績;求30個整數(shù)之和;檢查35個學生的成績是否及格?!疽恳阎嘲嗉?5個學生的C語言程序設計課程的考試成績,求該課程的平均成績,并輸出不及格學生的信息(含學號和成績)。5.1循環(huán)結構程序的引入

5.1.1問題與引例部分程序代碼如下:#include<stdio.h>voidmain(){intnum,score,sum,aver,n;sum=0;//總分變量置為0n=0;//學生人數(shù)變量置為0printf("請輸入學生的學號和成績:");scanf("%d,%d",&num,&score);//輸入學生的學號和成績

if(score<60)printf("%d,%d\n",num,score);//成績小于60時輸出sum=sum+score;//成績求和n=n+1;//人數(shù)加1

printf("請輸入學生的學號和成績:");scanf("%d,%d",&num,&score);if(score<60)printf("%d,%d\n",num,score);sum=sum+score;n=n+1;……

//上述程序段還要重復33次aver=sum/n;printf("平均成績?yōu)?%d\n",aver);}循環(huán):程序中某一程序段反復多次執(zhí)行的過程。循環(huán)結構:實現(xiàn)程序循環(huán)操作時所使用的結構。結構化程序設計三種的基本結構:順序結構、選擇結構、循環(huán)結構,共同作為各種復雜程序的基本構造單元。循環(huán)結構的特點:條件成立時,反復執(zhí)行某個程序段,直到條件不成立為止。給定的條件稱為循環(huán)條件,控制循環(huán)執(zhí)行的變量稱為循環(huán)變量,反復執(zhí)行的程序段稱為循環(huán)體。5.1.2循環(huán)的基本概念C語言中的三種基本循環(huán):當型循環(huán)(while循環(huán))直到型循環(huán)(do-while循環(huán))計數(shù)型(for循環(huán))5.1.2循環(huán)的基本概念5.2當型循環(huán)

5.2.1當型循環(huán)的一般形式while(表達式)

{

語句;}循環(huán)條件循環(huán)體5.2.2當型循環(huán)的執(zhí)行首先計算表達式的值,然后判斷表達式的值是否為真。當值為真(非0)時,執(zhí)行循環(huán)體中的語句。

5.2當型循環(huán)

【例5.1】

用while循環(huán)求sum=算法分析:(1)用sum存放累加和,初值為0;i形成被加的自然數(shù),初值為1;(2)累加用sum=sum+i,形成下一個自然數(shù)用i=i+1;(3)如果i<=100,則重復(2),否則轉(4);(4)輸出sum中的值。5.2當型循環(huán)

#include<stdio.h>intmain(){inti=1,sum=0;//i表示被加的數(shù),sum表示和

while(i<=100))//i小于或等于100時進行循環(huán)

{sum=sum+i;//將i加到sum中i++;//i加1形成下一個數(shù)

}printf("sum=%d\n",sum);}初始化不能少復合語句,用花括號括起來#include<stdio.h>voidmain(){inti=1,sum=0;while(i<=100){sum=sum+i;i++;}printf("sum=%d\n",sum);}不能丟,否則循環(huán)永不結束如何求6!【例5.2】從鍵盤輸入一行字符,并統(tǒng)計其中的字符個數(shù)。算法分析:利用getchar()函數(shù)從鍵盤輸入字符。

當getchar()中的字符不是回車(即為'\n')時就進行循環(huán),在循環(huán)體中通過n++完成對輸入字符個數(shù)統(tǒng)計;當getchar()中的字符是回車時,就結束循環(huán)。#include<stdio.h>voidmain(){intn=0;//n表示字符個數(shù),初值置為0printf("請輸入一行字符:");while(getchar()!='\n')//當輸入的字符不為回車n++;printf("輸入的字符個數(shù)為:%d\n",n);}1.while語句中的表達式一般是關系表達式或邏輯表達式,只要表達式的值為真(非0)就繼續(xù)循環(huán)。例如:#include<stdio.h>voidmain(){inta=0,n;printf("請輸入n:");scanf("%d",&n);

while(n--)printf("%d",a++*2);printf("\n");}5.2.4使用當型循環(huán)注意點程序將執(zhí)行n次循環(huán),每執(zhí)行一次,n值減1,循環(huán)體輸出表達式a++*2的值,該表達式等效于(a*2;a++)2.如果循環(huán)體包括多條語句,則必須用“{、}”括起來組成復合語句。5.3直到型循環(huán)

5.3.1直到型循環(huán)的一般形式為:

do

語句;while(表達式);5.3.2直到型循環(huán)的執(zhí)行5.3直到型循環(huán)

直到型循環(huán)先執(zhí)行循環(huán)體中的語句,然后再判斷表達式是否為真,如果為真則繼續(xù)循環(huán);如果為假,則終止循環(huán)?!纠?.3】用dowhile型循環(huán)求

i=1;sum=0;

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

#include<stdio.h>voidmain(){inti=1,sum=0;

do

{sum=sum+i;i++;}while(i<=100);printf("sum=%d\n",sum);}思考:若將此句去掉,結果怎樣?5.3.3當型和直到型循環(huán)的比較inti,sum=0;printf("i=?");scanf("%d",&i);while(i<=10){sum=sum+i;i++;}printf("sum=%d\n",sum);inti,sum=0;printf("i=?");scanf("%d",&i);do{sum=sum+i;i++;}while(i<=10);printf("sum=%d\n",sum);當while后面的表達式的第一次的值為“真”時,兩種循環(huán)得到的結果相同;否則不相同。結論:當型循環(huán)是先判斷條件后執(zhí)行循環(huán)體,循環(huán)體可能一次也不被執(zhí)行,而直到型循環(huán)是先執(zhí)行循環(huán)體后判斷條件,循環(huán)體至少被執(zhí)行一次。思考與引申(1)求1+3+5+…+49的和(2)求10+20+30+…+90的和(3)求1+1/2+1/3+…+1/80的和(4)1-1/3+1/5-1/7+…+最后一項絕對值小于10-6(5)求1*2*3*4*5的積(6)求10*9*8*7*6的積

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

語句;5.4計數(shù)型循環(huán)

5.4.1計數(shù)型循環(huán)的一般形式(1)先求解表達式1(2)求解表達式2,若其值為真,執(zhí)行循環(huán)體,然后執(zhí)行下面第(3)步。若為假,則結束循環(huán),轉到第(5)步(3)求解表達式3(4)轉回上面步驟(2)繼續(xù)執(zhí)行(5)循環(huán)結束,執(zhí)行for語句下面的一個語句5.4.2計數(shù)型循環(huán)的執(zhí)行求1~100之和程序:#include<stdio.h>voidmain(){inti,sum;sum=0;for(i=1;i<=100;i++)sum=sum+i;printf("1+2+3+……+100=%d\n",sum);}1.for循環(huán)中的“表達式1”、“表達式2”和“表達式3”都是選擇項,即可以缺省,但“;”不能缺省。(1)省略“表達式1(循環(huán)變量賦初值)”,表示不對循環(huán)控制變量賦初值,但可以在循環(huán)開始之前賦值。5.4.3計數(shù)型循環(huán)使用注意點#include<stdio.h>voidmain(){inti,sum;sum=0;i=1;for(;i<=100;i++)//此語句中省略了表達式1sum=sum+i;printf("1+2+3+……+100=%d\n",sum);}5.4.3計數(shù)型循環(huán)使用注意點(2)省略“表達式2(循環(huán)條件)”,則表示不做循環(huán)判斷,因此就成了“死循環(huán)”。例如:for(i=1;;i++)sum=sum+i;相當于:i=1;while(1){sum=sum+i;i++;}5.4.3計數(shù)型循環(huán)使用注意點(3)省略“表達式3(循環(huán)變量增量)”,則表示不對循環(huán)控制變量進行操作,這時可在語句體中加入修改循環(huán)控制變量的語句。例如,前述例5.1省略了“表達式3”,用for循環(huán)實現(xiàn)如下:#include<stdio.h>voidmain(){inti,sum;sum=0;for(i=1;i<=100;)//此語句中省略了表達式3{sum=sum+i;i++;}printf("1+2+3+……+100=%d\n",sum);}5.4.3計數(shù)型循環(huán)使用注意點(4)省略“表達式1(循環(huán)變量賦初值)”和“表達式3(循環(huán)變量增量)”,則表示既不對循環(huán)控制變量賦初值,也不對循環(huán)控制變量進行操作。例如:for(;i<=100;){sum=sum+i;i++;}相當于:while(i<=100){sum=sum+i;i++;}5.4.3計數(shù)型循環(huán)使用注意點(5)表達式1、表達式2、表達式3三個表達式都可以省略,則表示既不對循環(huán)控制變量賦初值,也不對循環(huán)條件進行判斷,也不對循環(huán)控制變量進行操作。例如:for(;;)語句相當于:while(1)語句永遠滿足條件5.4.3計數(shù)型循環(huán)使用注意點2.表達式1可以是設置循環(huán)變量的初值的賦值表達式,也可以是與循環(huán)變量初值無關的其它表達式。例如:for(sum=0;i<=100;i++)sum=sum+i;//表達式1與循環(huán)變量初值無關5.4.3計數(shù)型循環(huán)使用注意點3.表達式1和表達式3可以是一個簡單表達式也可以是逗號表達式。for(sum=0,i=1;i<=100;i++)sum=sum+i;//表達式1是逗號表達式或:for(i=0,j=100;i<=100;i++,j--)k=i+j;//表達式1、表達式3是逗號表達式5.4.3計數(shù)型循環(huán)使用注意點4.表達式2一般是關系表達式或邏輯表達式,但也可以是數(shù)值表達式或字符表達式,只要其值非零,就執(zhí)行循環(huán)體。例如:for(i=0;(c=getchar())!='\n';i+=c);//表達式2是一個關系表達式for(a=1;b+c;c++);//表達式2是一個算術表達式5.4.3計數(shù)型循環(huán)使用注意點5.5循環(huán)嵌套與輔助控制

一個循環(huán)體內(nèi)又包含另一個完整的循環(huán)結構,稱為循環(huán)的嵌套外面的嵌套稱外嵌套,里面的嵌套稱為內(nèi)嵌套,內(nèi)嵌套必須被完整的包含在外嵌套中。

內(nèi)嵌的循環(huán)中還可以嵌套循環(huán),這就是多層循環(huán)3種循環(huán)(while循環(huán)、do…while循環(huán)和for循環(huán))可以互相嵌套5.5.1循環(huán)嵌套【例5.4】計算1!+2!+3!+……+n!。#include<stdio.h>voidmain(){inti,j,n;floatt,s;printf("請輸入n:");scanf("%d",&n);

s=0;for(i=1;i<=n;i++)//外循環(huán),i形成1、2、3、…、n

{t=1;//存放階乘的變量t置初值為1for(j=1;j<=i;j++)//內(nèi)循環(huán),j形成1、2、3、…、it=t*j;//求乘積s=s+t;

//將i的階乘加到s中

}printf("1!+2!+3!+……+%d!=%.0f\n",n,s);}①將賦值語句:s=0;放到語句:for(i=1;i<n;i++)之后#include<stdio.h>voidmain(){inti,j,n;floatt,s;printf("輸入n:");scanf("%d",&n);for(i=1;i<=n;i++)

{s=0;//注意此語句的位置t=1;for(j=1;j<=i;j++)t=t*j;s=s+t;}printf("1!+2!+3!+……+%d!=%.0f",n,s);}②將賦值語句:t=1;放到語句:for(j=1;j<i;j++)之后#include<stdio.h>voidmain(){inti,j,n;floatt,s;printf("請輸入n:");scanf("%d",&n);

s=0;for(i=1;i<=n;i++){for(j=1;j<=i;j++){t=1;//注意此語句的位置t=t*j;}s=s+t;}printf("1!+2!+3!+……+%d!=%.0f",n,s);}使用循環(huán)嵌套結構時,應注意以下幾方面:(1)在多層循環(huán)的嵌套結構中,層次必須清楚,每層循環(huán)的功能應該明確。(2)嵌套結構中,內(nèi)外層循環(huán)的控制變量不能是同一個變量。(3)有關變量賦初值的位置必須在對應循環(huán)的前面或for語句的表達式1中。前面的例5.4已經(jīng)說明了這種情況。循環(huán)嵌套的使用注意點5.5.2循環(huán)的輔助控制

1.Break語句

break語句可以用來從循環(huán)體內(nèi)跳出循環(huán)體,即提前結束循環(huán),接著執(zhí)行循環(huán)下面的語句。例如,break語句在while循環(huán)中的使用形式如下:while(表達式1){……if(表達式2)break;……}break語句在使用時應注意:(1)break語句只能用在三種循環(huán)結構和由開關語句構成的多分支結構中,對條件語句不起作用。(2)在多層循環(huán)中,一個break語句只向外跳一層,即退出本層循環(huán)。

【例5.5】從鍵盤上輸入多行字符并按行顯示內(nèi)容,在每行前顯示字符串是“第幾行字符,遇到Esc鍵結束。#include<stdio.h>voidmain(){inti=0;charc;//i表示第幾行,初值為0;c存放字符

while(1)//設置循環(huán)

{c='\0';//變量賦初值

i++;printf("第%d行字符是:",i);

while(c!=13&&c!=27)//鍵盤接收字符直到按回車鍵

{c=getch();//從鍵盤輸入一個字符,且不回顯if(c!=27)printf("%c",c);}

printf("\n");if(c==27)break;//判斷若按Esc鍵則退出循環(huán)

}printf("結束\n");}2.繼續(xù)語句continue繼續(xù)語句continue的作用是跳過本次循環(huán)中剩余的語句而去執(zhí)行下一次循環(huán)。continue語句只能用在for循環(huán)體中,常與if條件語句一起使用,用來加速循環(huán)。例如:continue語句在for循環(huán)中的使用形式:for(表達式1;表達式2;表達式3){……if(表達式)continue;……}算法分析:如何判斷一個數(shù)是否為素數(shù)?

素數(shù)(prime,又稱質數(shù))是指只能被1和本身整除的數(shù))。從定義出發(fā),將1和本身之外的數(shù),依次與原數(shù)相除,看能否被整除,若能被整除,說明不是素數(shù),提前結束比較。若不能被整除,繼續(xù)比較下一個數(shù),直到不滿足循環(huán)條件。

【例5.6】求100以內(nèi)的所有素數(shù)及其個數(shù)。scanf("%d",&n);for(;;)//多種方法if()break;if(i>n-1)//循環(huán)正常結束printf("%d是素數(shù)",n);解題思路:

如果n能被2~(n-1)之中任何一個整數(shù)整除,則表示n肯定不是素數(shù),不必再繼續(xù)被后面的整數(shù)除,因此,可以提前結束循環(huán)。注意:此時i的值必然小于n。#include<stdio.h>voidmain(){inti,j,n;scanf("%d",&n);

for(i=2;i<=n-1;i++)//多種方法

if(n%i==0)break;if(i>n-1)//循環(huán)正常結束

printf("%d是素數(shù)\n",n);}n/2n/2#include<math.h>kk=sqrt(n);intk;k將100以內(nèi)的素數(shù)依次判斷,若是素數(shù)則輸出。#include<stdio.h>#include<math.h>voidmain(){intm,i,k,f,n;printf("2");//2是特殊的素數(shù),單獨輸出n=1;//置素數(shù)的個數(shù)初值為1

for(m=3;m<=100;m=m+2){f=1;//置素數(shù)的標志為真k=(int)sqrt(m);for(i=2;i<=k;i++)if(m%i==0){f=0;//置素數(shù)的標志為假break;//退出內(nèi)循環(huán)

}if(f==0)continue;printf("%d",m);n=n+1;if(n%5==0)printf("\n");//每輸出5個數(shù)就換行}printf("100以內(nèi)的素數(shù)個數(shù)共有%d個\n",n);}5.6循環(huán)結構程序設計及實例

【例5.7】求兩個正整數(shù)m和n的最大公約數(shù)和最小公倍數(shù)。算法分析:最小公倍數(shù)為兩個正整數(shù)m和n的乘積除以最大公約數(shù),所以只要求兩個正整數(shù)m和n的最大公約數(shù)即可。求兩個正整數(shù)m和n的最大公約數(shù)采用的是歐幾里德算法。#include<stdio.h>voidmain(){intm,n,t,p,r;printf("輸入兩個正整數(shù):");scanf("%d,%d",&m,&n)

;//輸入兩個正整數(shù)if(m<n){t=m;m=n;n=t;}//將m、n中的較大數(shù)放入m中,較數(shù)放入n中

p=m*n;//將m、n的乘積放入p中do//歐幾理德算法求最大公約數(shù){r=m%n;m=n;n=r;}while(r!=0);printf("最大公約數(shù)是:%d\n",m);printf("最小公倍數(shù)是:%d\n",p/m);}

p=m*n;r=m%n;

while(r!=0)

{

m=n;n=r;r=m%n;}printf("最大公約數(shù)是:%d\n",n);printf("最小公倍數(shù)是:%d\n",p/n);

【例5.8】用

公式求

的近似值,直到發(fā)現(xiàn)某一項的絕對值小于10-6

為止(該項不累計加)。循環(huán)程序舉例解題思路:求近似值的方法很多,本題是一種。其他方法:循環(huán)程序舉例每項的分子都是1后一項的分母是前一項的分母加2第1項的符號為正,從第2項起,每一項的符號與前一項的符號相反循環(huán)程序舉例循環(huán)程序舉例#include<stdio.h>#include<math.h>voidmain(){ints=1;doublepi=0,n=1,t=1;

while(fabs(t)>=1e-6){pi=pi+t;n=n+2;s=-s;t=s/n;}pi=pi*4;printf("pi=%10.8f\n",pi);}//求浮點數(shù)絕對值的函數(shù)只保證前5位小數(shù)是準確的#include<stdio.h>#include<math.h>voidmain(){intsign=1;doublepi=0,n=1,term=1;while(fabs(term)>=1e-6){pi=pi+term;n=n+2;sign=-sign;term=sign/n;}pi=pi*4;printf("pi=%10.8f\n",pi);}//改為1e-8

【例5.9】求菲波拉契

(Fibonacci)數(shù)列的前40個數(shù)。這個數(shù)列的特點:第1、2兩個數(shù)為1、1。從第3個數(shù)開始,該數(shù)是其前面兩個數(shù)之和。即:循環(huán)程序舉例算法分析:這是一個有趣的古典數(shù)學問題:有一對兔子,從出生后第3個月起每個月都生一對兔子。小兔子長到第3個月后每個月又生一對兔子。假設所有兔子都不死,問每個月的兔子總數(shù)為多少?循環(huán)程序舉例第幾個月小兔子對數(shù)中兔子對數(shù)老兔子對數(shù)兔子總數(shù)110012010131012411135212563238753513┇┇┇┇┇循環(huán)程序舉例循環(huán)程序舉例#include<stdio.h>voidmain(){intf1=1,f2=1,f3;inti;printf("%12d\n%12d\n",f1,f2);for(i=1;i<=38;i++){f3=f1+f2; printf("%12d\n",f3); f1=f2; f2=f3;}}…代碼可改進!#include<stdio.h>voidmain(){longf1=1,f2=1;inti;for(i=1;i<=20;i++){printf("%12d%12d",f1,f2);if(i%2==0)printf("\n");f1=f1+f2;f2=f2+f1;}}【例5.10】用牛頓迭代法求方程在0.5附近的根,要求精確到10-6。算法分析:牛頓迭代法是逐次使用迭代公式:進行迭代:由x0求出x1,由x1求出x2,由x2求出x3,……,直到連續(xù)兩次差的絕對值小于給定的精度即可。

#include<math.h>main(){floatx1,x0,f,f1;scanf("%f",&x);do{

x0=x1;f=(x0*exp(x0))-1f1=(1+x0)*exp(x0)x=x0-f/f1;

}while(fabs(x-x0)>=0.000001);printf("root=%f\n",x1);}root=0.567143【例5.11】求1---1000之間的完數(shù)。一個數(shù)恰好等于它的因子和,則稱它為完數(shù):如,6=1+2+3。輸出格式為:6的因子是:1,2,3。輸出m及其因子m==s真假求m的因子和s(條件累加)輸入整數(shù)m算法分析:一個整數(shù)是否是完數(shù)?#include<stdio.h>voidmain(){intm,s,i;for(m=1;m<=1000;m++){s=0;//求因子和開始

for(i=1;i<m;i++)if(m%i==0)s=s+i;//求因子和結束

if(m==s){printf("%d的因子是:1",m);for(i=2;i<m;i++)if(m%i==0)printf(",%d",i);printf("\n");}}}

【例5.12】

譯密碼。為使電文保密,往往按一定規(guī)律將其轉換成密碼,收報人再按約定的規(guī)律將其譯回原文。ABCDEFG……WXYZ非字母字符保持原狀不變輸入一行字符,要求輸出其相應的密碼解題思路:問題的關鍵有兩個:(1)決定哪些字符不需要改變,哪些字符需要改變,如果需要改變,應改為哪個字符處理的方法是:輸入一個字符給字符變量c,先判定它是否字母(包括大小寫),若不是字母,不改變c的值;若是字母,則還要檢查它是否’W’到’Z’的范圍內(nèi)(包括大小寫字母)。如不在此范圍內(nèi),則使變量c的值改變?yōu)槠浜蟮?個字母。如果在’W’到’Z’的范圍內(nèi),則應將它轉換為A~D(或a~d)之一的字母。c=getchar();if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))if(c>='W'&&c<='Z'||c>='w'&&c<='z')c=c+4-26;elsec=c+4;(2)怎樣使c改變?yōu)樗付ǖ淖帜??辦法是改變它的ASCII值例如字符變量c的原值是大寫字母'A',想使c的值改變?yōu)?E',只需執(zhí)行“c=c+4”即可,因為'A'的ASCII值為65,而'E'的ASCII值為69,二者相差4。charc;c=getchar();while(c!='\n'){if((c>='a'&&c<='z')||(c>='A'&&c<='Z')){if(c>='W'&&c<='Z'||c>='w'&&c<='z')c=c-22;elsec=c+4; }printf("%c",c);

溫馨提示

  • 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

提交評論