第四章循環(huán)1022_第1頁
第四章循環(huán)1022_第2頁
第四章循環(huán)1022_第3頁
第四章循環(huán)1022_第4頁
第四章循環(huán)1022_第5頁
已閱讀5頁,還剩99頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第四章 循環(huán)結(jié)構(gòu)循環(huán):對同一個程序段重復執(zhí)行若干次。計算機最擅長的工作之一就是重復。本章內(nèi)容for語句語句 1數(shù)列求和數(shù)列求和2輸出階乘表輸出階乘表3素數(shù)判定素數(shù)判定4while語句和語句和do語句語句 54 5打印素數(shù)表打印素數(shù)表54 6求和問題1、求3個數(shù)的和。輸入3個整數(shù),輸出其和。2、求10個數(shù)的和。輸入10個整數(shù),輸出其和。3、求100個數(shù)的和。輸入100個整數(shù),輸出其和。4、求n個數(shù)的和。首先輸入一個整數(shù)n,然后輸入n個整數(shù),輸出他們的和 /求三個數(shù)的和#includeint main() int n1, n2, n3; scanf(%d%d%d, &n1, &n2, &n3);

2、printf(“%dn”, n1 + n2 + n3); return 0;/程序程序4-1:求求10個數(shù)的和個數(shù)的和#includeint main() int n1, n2, n3, n4, n5, n6, n7, n8, n9, n10; int sum=0; scanf(%d%d%d%d%d, &n1,&n2,&n3,&n4,&n5); scanf(%d%d%d%d%d, &n6,&n7,&n8,&n9,&n10); sum=sum+n1+n2+n3+n4+n5; sum=sum+n6+n7+n8+n9+n10; printf(%dn,sum); return 0;求100個數(shù)的和呢?

3、n個數(shù)的和呢?n的值在程序運行中才確定求和問題10個數(shù)求和可以理解為:以下動作重復執(zhí)行10次 (1)讀入一個數(shù)存入number; (2) 將number累加到sum上 C語言提供了循環(huán)語句來實現(xiàn)重復。程序程序4-2/*用for語句實現(xiàn)10個數(shù)的求和*/#includeint main() int number, i, sum; sum=0; for(i=1; i=10; i=i+1) /重復10次 scanf(%d, &number); sum=sum+number; printf(%dn,sum); return 0;到VC中單步執(zhí)行一下,監(jiān)視i、number和sum的變化4.1 求n個數(shù)的

4、和解決問題:解決問題:求n個數(shù)的和。首先輸入一個整數(shù)n,然后輸入n個整數(shù),求他們的和 .分析:(1) 聲明變量i, n, number, sum;(2)sum置為0;(3)讀入n(4)以下重復n次 讀入一個數(shù)存入number,把number累加到sum(5)輸出sum ; int i, n, number, sum;sum=0;for(i=1; i=n; i=i+1) scanf(%d,&number); sum=sum+number;scanf(%d,&n);/求n個數(shù)的和#includeint main() int number, sum; int i, n; /n為數(shù)的個數(shù),i為循環(huán)變量

5、 sum=0; /sum存儲累加和,要初始化為0 scanf(%d,&n); for(i=1; i=n; i+) /用for語句控制循環(huán)n次 scanf(%d,&number); sum=sum+number; printf(%dn,sum); return 0;/循環(huán)體,即重復的內(nèi)容/輸出累加和這里,將i=i+1寫成了i+。+運算符的作用是讓變量的值自增1在此處,以下寫法等價:i=i+1;i+=1;i+;稍后討論源程序4-3具有里程碑意義,要求熟練背默for(i=1; i=n; i+)循環(huán)控制語句:i將從1變到n,i每次增1,故循環(huán)n次真真for(表達式1;表達式2;表達式3) 循環(huán)體語句功

6、能: 實現(xiàn)C語句的重復執(zhí)行4.1.1 for語句3個表達式、循環(huán)體語句個表達式、循環(huán)體語句!書寫順序和執(zhí)行順序不同書寫順序和執(zhí)行順序不同!表達式表達式1只執(zhí)行一次只執(zhí)行一次for ( i = 1; i = n; i+) scanf(%d,&number); sum=sum+number;假假假for (i = 1; i = n; i+) scanf(%d,&number); sum=sum+number;表達式1:給循環(huán)變量賦初值,指定循環(huán)的起點。i = 1;表達式2:給出循環(huán)的條件,決定循環(huán)的繼續(xù)或結(jié)束。i = n;表達式3:設置循環(huán)的步長,改變循環(huán)變量的值,從而可改變表達式2的真假性。i+

7、;語句:被反復執(zhí)行的語句,一條語句。for語句的說明循環(huán)(控制)變量:for語句中,通過改變或判斷某個變量的值來控制循環(huán)的執(zhí)行 for (i = 1; i = n; i+) scanf(%d,&number); sum=sum+number;for語句中的循環(huán)變量賦初值賦初值判斷其值判斷其值 改變其值改變其值/對上例的對上例的for循環(huán)做如下改循環(huán)做如下改寫,看看運行結(jié)果寫,看看運行結(jié)果for (i = 1; i = n; i+) scanf(%d,&number); sum=sum+number;注意復合語句 和空語句 ;for (i = 1; i = n; i+) ; scanf(%d,&

8、number); sum=sum+number;運行結(jié)果運行結(jié)果:輸入輸入n之后,只能讀入一之后,只能讀入一個數(shù),輸出結(jié)果等于第一個數(shù)。個數(shù),輸出結(jié)果等于第一個數(shù)。sum的值等于輸入的最后一個數(shù)的值等于輸入的最后一個數(shù)因為重復執(zhí)行的語句只有因為重復執(zhí)行的語句只有scanf語句,語句,sum=sum+number;不再是循環(huán)的內(nèi)容不再是循環(huán)的內(nèi)容因為循環(huán)體只有一個空語句,因為循環(huán)體只有一個空語句,scanf(“%d”,&number); sum=sum+number; 都不在循環(huán)體內(nèi)。都不在循環(huán)體內(nèi)。注意:注意:循環(huán)體多于循環(huán)體多于1個語句,要用復合語句個語句,要用復合語句 注意:注意:for語

9、句的()后沒有分號語句的()后沒有分號不要在不要在for語句中隨意加分號語句中隨意加分號/左側(cè)的程序段等價于左側(cè)的程序段等價于for (i = 1; i = n; i+) scanf(%d,&number); sum=sum+number;/左側(cè)的程序段等價于左側(cè)的程序段等價于for (i = 1; i = n; i+) ; scanf(%d,&number); sum=sum+number;4.1.2 自增自減運算符 自增(+)自減(-)運算符是具有賦值功能的運算符,例如:a+與a=a+1等價;a-與a=a-1等價 運算對象:只能是變量 運算結(jié)果:變量的值增加1或減少1 寫出如下程序段的結(jié)果

10、int number=5;number+;printf(%dn, number);結(jié)果為6int number=5;number+1;printf(%dn, number);結(jié)果為5for語句中的自增自減運算符以下幾種寫法等價for (i = 1; i = n; i+ ) for (i = 1; i = n; +i ) for (i = 1; i = n; i=i+1 )for (i = 1; i = n; i+=1 )但以下寫法是錯誤的, 可能造成死循環(huán)for (i = 1; i = n; i+1) /i的值沒有得到改變自增自減運算符的前置與后置 如果出現(xiàn)在表達式中,+運算的前置和后置有不同

11、意義。 a+: 先使用變量a的值,然后a自增1 +a: 先讓a自增1,再使用a的值int number=5;printf(%dn, number+);輸出為5輸出number的值之后number的值再變?yōu)?int number=5;printf(%dn, +number);輸出為6先將number的值變?yōu)?,然后輸出其值等價于:printf(%dn, number);number=number+1;等價于:等價于:number=number+1;printf(%dn, number);int i=3, k;k=( i+)*2;printf(%d %dn, i, k);4 6int i=3, k

12、;k=(+i)*2;printf(%d %dn, i, k);4 8將5讀入,存入n4.1.3 求n個數(shù)的最大值擂臺賽的思想: 第1個人先站在擂臺上,后面的n-1個人依次上臺與臺上的人較量,若勝之,則取代之站在擂臺上接受挑戰(zhàn),最后仍站在臺上的就是擂主。 用第一個數(shù)作為臨時最大值max(將第一個數(shù)存入max), 依次讀入其余n-1個數(shù),若當前數(shù)大于max,則其值存入max,循環(huán)結(jié)束時 max中就是最大值。 max56 4 7 9 3number 6將第一個數(shù)讀入,直接存入max循環(huán)4次,將第二個以后的數(shù),依次存入number, 然后跟max比較,若大于max,則存入max輸入: 4 7 7 9

13、9 3最后max中就是最大值解決問題:解決問題:輸入n和n個整數(shù),輸出其最大值。4.1.3 求n個數(shù)的最大值實現(xiàn)過程:(1) 聲明變量i, number, n, max;(2) 讀入n(3) 讀入第一個數(shù),作為臨時最大值(4)以下重復n-1次 讀入一個數(shù)存入number; 如果number大于臨時最大值max 則將number的值賦給max(5)輸出max ; scanf(%d,&n);scanf(%d,&max);for(i=1; imax) max=number;/求n個數(shù)的最大值#includeint main() int a, max; int i, n; /n為數(shù)的個數(shù),i為循環(huán)變量

14、 scanf(%d, &n); scanf(%d, &number); max=number; /max存儲最大值,要用第一個數(shù)作為臨時最大值 for(i=1; i max) max = number; printf(%dn,max); return 0;/其余n-1個數(shù)依次讀入,并與max比較,若大于max,則存入max源程序4-4:求最大值模仿練習 輸入n和n個學生成績(實數(shù)),輸出不及格率,結(jié)果保留兩位小數(shù)。 輸入樣例:898 45 86 79 56 75 90 70 輸出樣例:0.25 分析:(1) 聲明變量i, n, failNum, score;(2) 讀入n;failNum=0;

15、(3)以下重復n次 讀入一個數(shù)存入score; 如果score60 failNum增1(4)輸出1.0*failNum/n ; 模仿練習 輸入n和n個整數(shù),輸出其中負數(shù)、0、和正數(shù)的個數(shù)。 輸入樣例:62 3 0 -1 6 -8 輸出樣例:2 1 3即2個負數(shù)、1個0、3個正數(shù) 求下列數(shù)列的和1、求 1+2+n2、求 的前n項和,保留3位小數(shù)3、求 的前n項和。4、求 的前n項和。5、求 的前n項和。6、求 的前n項和。4.2 數(shù)列求和.917151311.957453321917151311.514131211求 1+2+n#includeint main() in

16、t sum=0, n; scanf(%dn, &n); sum=1+2+3+.+n; printf(%dn,sum);編譯器不認識不要告訴我用高斯公式,我們在討論for循環(huán)!抽取具有共性的算式:sum=sum+i;循環(huán)n次,i從1變到n,循環(huán)內(nèi)容為: sum=sum+i;當i從1變到n,正好將1、2n都累加到sum中源程序4-5#includeint main() int i, n, sum; scanf(%dn, &n); sum=0; for(i=1; i=n; i+) sum = sum + i; printf(%dn, sum); 到VC中單步執(zhí)行一下,監(jiān)視i和sum的變化 初始化:指

17、定循環(huán)起點 給循環(huán)變量賦初值,如i = 1; 進入循環(huán)前,設置相關(guān)變量的初值,如sum = 0。 條件控制: 只要i 100,循環(huán)結(jié)束。for循環(huán)的四個部分求 /求求 1+2+n#includeint main() int i, sum, n; scanf(%d, &n); sum=0; for(i=1; i=n; i+) sum = sum + i; printf(%dn, sum);改寫如下1+2+.+n的程序,求 的前n項和,結(jié)果保留3位小數(shù)。/程序程序4-6:求求 1+1/2+1/n#includeint main() int i, n; double sum; scanf(%d, &

18、n); sum=0; for(i=1; i=n; i+) sum = sum + 1.0/i; printf(%.3fn, sum);.51413121111111.2345結(jié)果sum定義為double注意寫成1.0/i,因為整數(shù)相除結(jié)果是整數(shù)改寫如下程序,求以上序列的前n項和,結(jié)果保留3位小數(shù)。求 /求求 1+1/2+1/n#includeint main() int i, n; double sum; scanf(%dn, n); sum=0; for(i=1; i=n; i+) sum = sum + 1.0/i; printf(%.3fn, sum);11111.3579方法1:第i項

19、的分母是2*i-1第n項的分母是2*n-1故分母的變化是:1、3、5、2*n-1, 每次增2for(i=1; i=2*n-1; i=i+2) sum = sum + 1.0/i;i=2*n-1; i=i+2)/程序程序4-7a求求 1+1/3+1/5+前前n項和項和求 /源程序源程序4-7b:求求 1+1/3+1/5+1/7+#includeint main() int i, n; double sum; scanf(%dn, &n); sum=0; for(i=1; i=n; i+) sum = sum + 1.0/(2*i-1); printf(%.3fn, sum);方法2:循環(huán)變量i只

20、控制項數(shù),每次增1: for(i=1; i=n; i+)觀察分母與循環(huán)變量i的關(guān)系:第i項的分母為2*i-111111.3579求 /源程序源程序4-7c:求求 1+1/3+1/5+1/7+int main() int i, n, deno; double sum; scanf(%dn, &n); sum=0; deno=1; for(i=1; i=n; i+) sum = sum + 1.0/deno; deno=deno+2; /為下次循環(huán)做準備 printf(%.3fn, sum);方法3:循環(huán)變量i只控制項數(shù),每次增1: for(i=1; i=n; i+)觀察分母的變化規(guī)律:每次增加2

21、增加一個變量deno,初始化為1,每次使用完,增加2, 為下一項做準備。11111.3579求 前n項和 11111.3579flag是在+1.0和-1.0之間變換,為避免整數(shù)除法運算,把flag定義為實數(shù)。/源程序源程序4-8:求求 1+1/3+1/5+1/7+int main() int i, n, deno; double sum, flag; scanf(%dn, &n); sum=0; deno=1; flag=1.0; for(i=1; i=n; i+) sum = sum + flag/deno; deno=deno+2; /為下次循環(huán)做準備 flag=-flag; printf

22、(%.3fn, sum);思路分析:有了剛才遞推的思想,符號的變化可以用一個變量flag來控制,使其在+1和-1之間變換,每次循環(huán)使flag符號取反切記循環(huán)開始之前,相關(guān)變量的初始化,如sum清0,分母為1,符號為正模仿練習.16113110171411求如下數(shù)列的前n項和,結(jié)果保留3位小數(shù)。1、2、.116957453321符號每次取反;分母每次增加3符號每次取反;分母每次增加2;分子就用循環(huán)變量i;切記相關(guān)變量的初始化上機練習 1336累加和累加和 1337n個數(shù)求和個數(shù)求和 1338數(shù)列求和數(shù)列求和 1339數(shù)列求和數(shù)列求和 1340數(shù)列求和數(shù)列求和 1341最大值最大值 1342對數(shù)表

23、對數(shù)表 1346數(shù)值統(tǒng)計數(shù)值統(tǒng)計 1347平方和與立方和平方和與立方和 1348奇數(shù)的乘積奇數(shù)的乘積 1359數(shù)列求和數(shù)列求和4.3 階乘表階乘的結(jié)果要存儲為什么類型?n是一個不大于20的整數(shù),估算一下20!是一個多少位的十進制整數(shù)?32位整型顯然表達不了要用double類型或64位整型解決問題: 輸入一個整數(shù)n(n=20),輸出1-n的階乘表:1 12 23 64 24.實現(xiàn)思路fact=1;for (i = 1; i = n ; i+) 計算i的階乘;(前一項結(jié)果*i) 輸出結(jié)果 fact = fact * i; printf(“%d %dn”, i, fact);要充分利用中間結(jié)果,遞推

24、求解,切記不要把本題寫成雙重循環(huán)#include int main() int i, n; double fact; scanf (%d, &n) ; for (fact=1, i = 1; i = n; i+ ) fact = fact * i ; /遞推計算i的階乘 printf ( %d %.0f n, i, fact ); return 0;源程序4-9:輸出階乘表4.3.1逗號運算符及其表達式逗號運算符,又稱為順序求值運算符;用逗號運算符連接起來的式子,稱為逗號表達式1、一般形式 表達式1,表達式2,.,表達式n 例如:3+5, 6*9 x=2, y=x+4, z=x*y2、求解過程

25、:從左至右,依次計算,最后一個表達式的值就是整個表達式的值。 逗號表達式3+5, 4*9的值為36 a= (3+5, 4*9); /則a的值為36逗號表達式的求解逗號運算符的優(yōu)先級低于賦值運算符。a= (3+5, 4*9); /則a的值為36;a= 3+5, 4*9 ; /則a的值為8,雖然整個逗號表達式的值是36b = (a= 3+5, 4*9) ; /則b的值為36,a的值為8x=2, y=x+4, z= x*y; / 則z的值為12, 逗號表達式的值是12z = ( x=2, y=x+4, x*y); / 則z的值為12計算過程如下: (1)執(zhí)行賦值表達式x=2, 把2賦給x; (2)

26、執(zhí)行賦值表達式y(tǒng)=x+4, 把6賦給y; (3) 計算x*y的值12, 并將12作為整個逗號表達式的值 (4)把12賦給z;逗號表達式的應用(1)1、順序求值,如x=2, y=x+4, z=x*y;2、有時可用逗號表達式代替大括號的作用大括號的作用是把多個語句當做一個復合語句,有時候用逗號也可以起到同樣的效果,并使語句更簡化緊湊,特別是多個具有承接而又相對獨立的語句。 舉例:三個整數(shù)排序/三個數(shù)的排序#includeint main() int a,b,t; scanf(%d%d%d, &a,&b,&c); if(ab) /用復合語句 t=a; a=b; b=t; if(ac) /用復合語句

27、t=a; a=c; c=t; if(bc) /用復合語句 t=b; b=c; c=t; printf(%d %d, a,b); return 0;/三個數(shù)的排序#includeint main() int a,b,t; scanf(%d%d%d, &a,&b,&c); if(ab) / 用逗號表達式t=a, a=b, b=t; if(ac) / 用逗號表達式t=a, a=c, c=t; if(bc) / 用逗號表達式t=b, b=c, c=t; printf(%d %d, a,b); return 0;逗號表達式的應用(2)3、在只能用一個表達式的語法限制下,進行多項操作,可用逗號表達式。如:

28、for (fact=1, i=1; i0) 先讀入n,然后判斷n0是否成立,將該結(jié)果作為逗號表達式的結(jié)果模仿練習1、求1! + 2! + . + n!,其中n不大于20.思路分析:(1)定義變量i, n, fact, sum,fact存階乘值,sum存累加和;fact和sum要聲明為什么類型?(2) fact初始化為1,sum初始化為0;(3) for(i=1; i=n; i+) 計算i的階乘fact; 將fact累加到sum中; (4) 輸出sum;課堂練習計算 的前20項和。357sin( ).3!5!7!xxxxx先找規(guī)律:后一項與前一項相比:符號如何變?分子如何變?分母如何變?解題思路

29、(1)定義相關(guān)變量i, num(分子)、demo(分母),flag(符號),sum(累加和)(2)讀入x(3)初始化: flag=1; num=x; demo=1; sum=0;(4)計算前20項for(i=1;i=20;i+) sum=sum+flag*num/demo; /計算當前項并累加 /為下一項做準備 flag=-flag; /符號取反 num=num*x*x; /計算下一項的分子 demo=demo*(2*i)*(2*i+1) ; /計算下一項分母(5)輸出結(jié)果4.3.2 計算a+aa+aaa+解決問題:輸入n和a,求a+aa+aaa+aaa(n個a),0=a,n=9,如當n=3,

30、 a=2時,2+22+222的結(jié)果為246思路分析:(1)定義變量i, n, a, item,sum,item存當前項,sum存累加和;(2) item初始化為0,sum初始化為0;(3) for(i=1; i=n; i+) 計算當前項item(i個a); 將item累加到sum中; (4) 輸出sum;如何遞推計算當前項有同學這樣遞推第i項:item = a * pow(10, i) + item;從理論上是對的,但程序的運行結(jié)果不一定正確。原因是pow函數(shù)的返回值是實數(shù),比如pow(10, 2)可能存儲為99.999999,轉(zhuǎn)換為整數(shù)時截斷取整是99,而不是100,造成結(jié)果錯誤。為避免截斷

31、取整帶來的錯誤,可以加上一個很小的數(shù),如做如下處理,則可得到正確結(jié)果item = a * (pow(10,i) + 0.00001) + item;如何由第i-1得到第i項?找規(guī)律:后一項與前一項相比:第i-1項乘以10,加上aitem = item * 10 + a;建議:整數(shù)運算要避免實型函數(shù)源程序4-10/求a+aa+aaa+.#includeint main() int i, n, a, item, sum; scanf(%d%d, &n, &a); item = 0; /item初始化為0 sum = 0; for(i=1; i=n; i+) /先計算第i項,再累加 item = i

32、tem * 10 + a; sum = sum + item; printf(%dn, sum); return 0;/求a+aa+aaa+.#includeint main() int i, n, a, item, sum; scanf(%d%d, &n, &a); item = a; /item初始化為a sum = 0; for(i=1; i=n; i+) /先累加,再為下一項做準備 sum = sum + item; item = item * 10 + a; printf(%dn, sum); return 0;有同學將sum初始化為a,然后循環(huán)n-1次,這樣做的問題是:當n為0時,

33、結(jié)果是錯誤的。解決問題:解決問題:若m是素數(shù),則輸出“yes”,否則輸出“no”。素數(shù)的定義:除了1和m,不能被其它數(shù)整除。注意,1不是素數(shù)。4.4 素數(shù)判定定義:除了1和m,不能被其它數(shù)整除。數(shù)學理論:若m是合數(shù),必有一個因數(shù)屬于區(qū)間2, ,即若m不能被 2, 的任何整數(shù)整除,m必為素數(shù)。mm4.4 素數(shù)判定以判斷13769是否是素數(shù)為例,討論如何判斷。嘗試用2、3、4、5、117去除m有兩種可能情況:(1)嘗試完所有數(shù),均不能整除m,則m是素數(shù)(2)嘗試到某一個數(shù)i,能整除m,可得出結(jié)論m不是素數(shù),提前結(jié)束嘗試實現(xiàn)思路(1)flag=0; /m被整除的標志,0表示沒有整除,1表示整除 k=

34、sqrt(m); (2)嘗試i=2.k if(m是i的倍數(shù)) 則m不是素數(shù),flag=1; break; 否則,做下一次循環(huán),嘗試下一個整數(shù) (3)若flag=0,則m是素數(shù),否則,m不是素數(shù)只要有一個i能整除m,就可以得到m不是素數(shù)的結(jié)論,提前結(jié)束循環(huán)最后判斷一下flag,若為1就說明m能被某個i整除,m不是素數(shù)。反之,flag是0說明在循環(huán)過程中flag沒有被賦值賦到1,也就是m沒有被整除!flag是m能否被整除的標志,故稱為標志變量主要代碼k=sqrt(m);flag=0; /0代表m沒有被整除,1代表m被某個數(shù)整除for(i = 2; i = k; i+) if(m % i = 0)

35、flag=1; break; if(flag=0) printf(yesn)else printf(non”);break語句用于提前結(jié)束循環(huán)本程序的bug上述程序沒有考慮m為1的情況。在問題描述中,輸入的m是一個“正整數(shù)”,那么對于所有合法輸入,上述程序都應該能得到正確結(jié)果,可是當輸入為1時,上述程序的輸出是錯誤的,因為1不是素數(shù)。k=sqrt(m);flag=0; /0代表m沒有被整除,1代表m被某個數(shù)整除for(i = 2; i = k; i+) if(m % i = 0) flag=1; break; if(m=1) flag=1;if(flag=0) printf(yesn)else

36、 printf(non”);處理m為1的情況4.4.2 循環(huán)中的break利用break語句能夠強制結(jié)束循環(huán),轉(zhuǎn)到后續(xù)語句執(zhí)行。for(i = 2; i k時結(jié)束,一個是當m是某個i的倍數(shù),if (m % i = 0)條件成立時,通過break結(jié)束其實,即使沒有flag變量,循環(huán)結(jié)束后,通過判斷循環(huán)使因為哪種原因結(jié)束的,也可以知道m(xù)是否是素數(shù)。如果循環(huán)是因為m是某個i的倍數(shù),if條件成立,由break結(jié)束循環(huán),則i的值必不大于kif(i=k),則m不是素數(shù)否則,m是素數(shù)4.4.3 循環(huán)中的continue#includeint main() int i; for(i=1; i=100; i+)

37、 if(i%7=0)continue; printf(%d ,i); 輸出結(jié)果: 1 2 3 4 5 6 8 9 10 11 12 13 15 16 17 18 .利用continue語句能中斷循環(huán)體的本次執(zhí)行(即跳過循環(huán)體中尚未執(zhí)行的語句),立即開始執(zhí)行下一次循環(huán)。例子:輸出1-100,遇到7的倍數(shù)則跳過遇到7的倍數(shù),立即執(zhí)行下一次循環(huán)break與continue/分析如下程序的輸出結(jié)果#includeint main() int i; for(i=1;i=100;i+) if(i%7=0) break; printf(%d ,i); 輸出結(jié)果:1 2 3 4 5 6 遇到第一個7,就中斷了

38、循環(huán)continue語句中斷循環(huán)的本次執(zhí)行,立即開始執(zhí)行下一次循環(huán);break是立即結(jié)束循環(huán)把上例中的continue改為break,看看結(jié)果如何明7暗7過(敲7) #includeint main() int i; for(i=1;i=100;i+) if(i%7!=0 & i%10!=7 & i/10!=7) printf(%d ,i); printf(n);#includeint main() int i; for(i=1;i=100;i+) if(i%7=0)continue; if(i%10=7)continue; if(i/10=7)continue; printf(%d ,i);

39、 printf(n);如果i不是7的倍數(shù),且不含有數(shù)字7,則輸出如果i是7的倍數(shù)則跳過如果i個位是7則跳過如果i十位是7則跳過規(guī)則: 按順序從1開始數(shù)數(shù),逢7的倍數(shù)或是帶有7的數(shù)字,必須以敲桌子代替。請用明7暗7過的規(guī)則,輸出100以內(nèi)的整數(shù)。4.4.4 缺省表達式的for語句for(表達式表達式1; 表達式表達式2; 表達式表達式3) 循環(huán)體語句循環(huán)體語句中的三個表達式都可缺省,但兩個分號不能缺省。以下4個程序段等價for (i = 1; i = n; i+) sum = sum + i; i = 1;for ( ; i = n; i+) sum = sum + i; i = 1;for (

40、 ; i n)break; 把初始化放在循環(huán)之前循環(huán)變量增值放在循環(huán)體中缺省表達式2可理解為表達式2為永真,循環(huán)的結(jié)束的控制由break實現(xiàn)上機作業(yè) 1345前n項和 1349階乘的累加和 1350素數(shù)判定 1364 四則運算(多次計算) 1368 求解不等式4.5 求若干學生的總成績從鍵盤輸入一批學生的成績,計算總成績。輸入負數(shù)表示輸入結(jié)束。問題分析:問題分析:求累加和確定循環(huán)條件:不知道輸入數(shù)據(jù)的個數(shù),無法事先確定循環(huán)次數(shù)用一個特殊的數(shù)據(jù)(比如一個負數(shù))作為正常輸入數(shù)據(jù)的結(jié)束標志。思路分析: (1)定義變量score, sum; (2)讀入一個成績score; (3)while(score

41、=0),做 把成績累加到sum上; 讀下一個學生成績score; (4)輸出總成績sum為什么要先讀入一個成績?因為進入while循環(huán)首先先進行score=0的判斷讀入下一個成績,為下一次循環(huán)做準備源程序4-14#include int main(void) double score, sum; sum=0; scanf(%lf, &score); while (score = 0) sum = sum + score; scanf (“%lf”, &score);printf(“%.2fn, sum);return 0;/計算總成績,逗號表達式計算總成績,逗號表達式#include int

42、main(void) double score, sum; sum=0; while ( scanf(“%lf”, &score), score = 0) sum = sum + score; printf(“%.2fn, sum);return 0;while中的表達式是一個逗號表達式,先執(zhí)行scanf,讀入一個實數(shù)存入score,然后判斷score=0,并將其值作為逗號表達式的值4.5.1 while語句while (表達式) 循環(huán)體語句;功能:表達式為真時,重復執(zhí)行循環(huán)體語句 真真假假while下一條語句下一條語句表達式表達式循環(huán)體語句循環(huán)體語句while( n != 0 ) /當n非0

43、 n = n/10; /扔掉n的個位數(shù)字 digits+; /位數(shù)加1n != 0n = n/10;digits+;課堂練習:以下程序段的運行結(jié)果?(1)i=0;while(i5) printf(i=%dn,i);i+;i=0i=1i=2i=3i=4請用請用for循環(huán)改寫這個程序段循環(huán)改寫這個程序段:for( i=0; i5; i+) printf(i=%dn,i);(2)i=k=1;while(i5)k+=i;printf(i=%d,k=%dn,i,k);i=1,k=2i=1,k=3i=1,k=4i=1,k=5i=1,k=6死循環(huán)!死循環(huán)!i5永真永真課堂練習:以下程序段的運行結(jié)果?(3)i

44、=0;while(i=4) printf(*n); i+=2;*死循環(huán)!死循環(huán)!無論無論i值在循環(huán)體中如何變化,賦值表達式值在循環(huán)體中如何變化,賦值表達式i=4 為永真,是死循環(huán)。為永真,是死循環(huán)。課堂練習:以下程序段的運行結(jié)果?(4)i=0;while(i=4) printf(i=%dni); i+=2;無輸出無輸出進入循環(huán)時首先測試進入循環(huán)時首先測試 i=4 的值為假,結(jié)束循環(huán)。的值為假,結(jié)束循環(huán)。循環(huán)體一次也不執(zhí)行,無輸出。循環(huán)體一次也不執(zhí)行,無輸出。課堂練習:以下程序段的運行結(jié)果?while 語句和for語句表達式表達式1;while (表達式表達式2) for的循環(huán)體語句的循環(huán)體語句

45、; 表達式表達式3;把把for語句改寫成語句改寫成while語句語句for(表達式表達式1; 表達式表達式2; 表達式表達式3) 循環(huán)體語句循環(huán)體語句for (i = 1; i = 10; i+) sum = sum + i; i = 1; /循環(huán)變量賦初值循環(huán)變量賦初值while (i = a & ch = A & ch = 0 & ch = 9) digit +; else other +; printf(letter=%d, digit=%d, other=%dn, letter, digit, other); return 0; 源程序4-15while中的表達式是一個逗號表達式,先讀

46、入字符存入ch,然后判斷ch!=n,并將其值作為逗號表達式的值4.5.3 整數(shù)的位數(shù) 解決問題:輸入一個整數(shù)n(int范圍內(nèi)),輸出n的位數(shù)。方法1:n 最多是一個10位數(shù),用10個分支的else if語句不推薦!沒有循環(huán)和結(jié)構(gòu)化變量的程序不值得編寫思路分析:思路分析:反復除以10取整,看看多少次之后n變成0,n就有多少位。digits=0; /位數(shù)初始化為0當n非0,重復如下操作 n = n/10; /扔掉n的個位數(shù)字 digits+; /位數(shù)加1源程序4-16#includeint main() int n, digits; scanf(%d,&n); digits = 0; /位數(shù)初始化

47、為0 while( n != 0 ) /當n非0,重復如下操作 n = n/10; /扔掉n的個位數(shù)字 digits+; /位數(shù)加1 printf(%dn,digits); return 0; while循環(huán):當n!=0為真時,重復執(zhí)行循環(huán)體本程序有bug。考慮:如果輸入0,輸出什么?if(n = 0 )digits = 1;模仿練習輸入一個正整數(shù)n,逆序輸出n的各位數(shù)字,用空格隔開。4.5.4 do語句do 循環(huán)體語句 while (表達式)先執(zhí)行一次循環(huán)先執(zhí)行一次循環(huán)后判斷后判斷真真假假表達式表達式循環(huán)體語句循環(huán)體語句do-while的下一條語句的下一條語句 while 是先判別條件,再決

48、定是否循環(huán); do-while 是先至少循環(huán)一次,然后再根據(jù)循環(huán)的結(jié)果決定是否繼續(xù)循環(huán)。while語句和do語句的比較真真假假表達式表達式循環(huán)體語句循環(huán)體語句do-while的下一條語句的下一條語句真真假假while的下一條語句的下一條語句表達式表達式循環(huán)體語句循環(huán)體語句用while語句實現(xiàn)求位數(shù)/ 求n的位數(shù)int main() int n, digits; scanf(%d,&n); if(n = 0 )digits = 1; digits = 0; /位數(shù)初始化為0 while( n != 0 ) /當n非0,重復如下操作 n = n/10; /扔掉n的個位數(shù)字 digits+; /位數(shù)

49、加1 printf(%dn,digits); return 0; 當n為0時,while循環(huán)一次也不執(zhí)行,所以digits為0;故必須加上語句 if(n = 0 )digits = 1;用do語句實現(xiàn)求位數(shù)#includeint main() int n, digits; scanf(%d,&n); digits = 0; /位數(shù)初始化為0 do n = n/10; /扔掉n的個位數(shù)字 digits+; /位數(shù)加1 while( n != 0 ) printf(%dn, digits); return 0; 即使n為0,也執(zhí)行了一次循環(huán),所以digits增為1,不必再對n為0的情況做特殊處理。

50、課堂練習從鍵盤輸入一批學生的成績,輸出最高分。從鍵盤輸入一批學生的成績,輸出最高分。輸入負數(shù)表示輸入結(jié)束。輸入負數(shù)表示輸入結(jié)束。注意變量的初始化注意變量的初始化4.6 打印素數(shù)表解決問題:輸出100以內(nèi)的所有素數(shù)。思路分析:對n=2、3、.100,做 判斷n是否是素數(shù),若是素數(shù)則輸出n的值 判斷n是否是素數(shù),也需要用循環(huán)實現(xiàn): k=sqrt(n); flag=0; for(i=2; i=k; i+) if(n%i=0) flag=1; break; if(falg = 0)輸出n主要代碼段分析for(n=2; n=100; n+) k=sqrt(n); flag=0; for(i=2; i=k

51、; i+) if(n%i=0) flag=1; break; if(flag=0) printf(%d , n);判斷n是否是素數(shù),若是則輸出n4.6.1 多重循環(huán) 如果循環(huán)語句的循環(huán)體內(nèi)又包含了另一條循環(huán)語句,則稱為多重循環(huán),或循環(huán)的嵌套。for(i=0; i=m; i+) . for(j=0; j=n; j+) . .由i控制的外部循環(huán),每執(zhí)行一次循環(huán)體,都執(zhí)行由j控制的內(nèi)部循環(huán)(j由0變到n)。左側(cè)的二重循環(huán)最內(nèi)層的循環(huán)體會執(zhí)行m*n次其實循環(huán)可以嵌套任意多層。變量初始化的位置 初學多重循環(huán),最容易犯的錯誤時變量初始化的位置不對。flag=0;for(n=2; n=100; n+) k=

52、sqrt(n); for(i=2; i=k; i+) if(n%i=0) flag=1; break; if(flag=0) printf(%d , n);將左側(cè)打印素數(shù)表的程序段改寫成程序后,運行結(jié)果是:2 3分析原因到VC中單步執(zhí)行,發(fā)現(xiàn)當n為4時,flag被置為1之后,其值始終是1,所以4以后的數(shù)都沒有被輸出。flag=1;變量初始化位置不對應該放在每次內(nèi)循環(huán)開始前flag=0;4.6.2 n元錢買n只雞解決問題:n元錢買n只雞。經(jīng)典的百錢買百雞問題是:公雞五文錢一只,母雞三文錢一只,雞仔一文錢三只,用100文錢買100只雞,公雞、母雞、雞仔各買多少只? 本程序要求解的問題是:給定一個正

53、整數(shù)n,用n文錢買n只雞,問公雞、母雞、雞仔各買多少只? 如果問題有解,輸出所有解,每個解占一行,每個整數(shù)用空格隔開;如果問題無解,則輸出” No answer”。問題分析:三個變量,兩個約束條件,如何求解?計算機解決這類問題用的方法是枚舉。枚舉是常用計算思維方法之一。思路分析(1)用flag作為有無解的狀態(tài)標志(2)枚舉公雞的個數(shù),i從0到n/5逐個嘗試 枚舉母雞的個數(shù),j從1到n/3逐個嘗試 雞仔個數(shù)為n-i-j; 若i個公雞,j個母雞和,k個雞仔價格為n 則輸出一個解, 并置標志flag為1; 若flag=0,輸出“No answer”。#includeint main() int i,

54、 j, k, n, flag; scanf(%d,&n); flag=0; /flag為有無解標志,有解為1,無解為0 for(i=0; i=n/5; i+) /窮舉公雞的可能個數(shù) for(j=0; j=n/3; j+) /窮舉母雞的可能個數(shù) k=n-i-j; /其余是雞仔 if( i*15+j*9+k = n*3) /若i, j和k滿足要求 printf(“%d %d %dn”, i, j, k); /輸出一個解 flag=1; /有解標志置為1 if (flag=0) /若無解 printf(No answern); return 0;源程序4-18為什么寫為i*15+j*9+k = n*

55、3,而不是是i*5+j*3+k/3=n到VC中試試,分析為何要避免整數(shù)除法或小數(shù)運算4.6.3 goto 語句繼續(xù)考慮4.14的n元錢買n只雞的問題,若問題的輸出要求變?yōu)椋喝粲薪?,只輸出一個解,即公雞數(shù)量最少的那個解;若無解,輸出” No answer”。問題分析:找到第一個解后如何讓求解過程結(jié)束?方法一:使用break語句,可以實現(xiàn),不過要注意break語句只能停止本層循環(huán),不能停止外層循環(huán),結(jié)束多層循環(huán)需要較為復雜的邏輯。方法二:使用goto語句。方法一:用break語句結(jié)束多層循環(huán)flag=0; for(i=0; i=n/5; i+) for(j=0; j=n/3; j+) k=n-i-

56、j; if( i*15+j*9+k = n*3) /若找到一個解 printf(“%d %d %dn”, i, j, k); /輸出一個解 flag=1; /有解標志置為1 break; /結(jié)束循環(huán)內(nèi)循環(huán)(由j控制的循環(huán)) if(flag=1) break; /若已找到解,結(jié)束外循環(huán)(由i控制的循環(huán)) if (flag=0) /若無解 printf(No answern);若找到解,用break結(jié)束內(nèi)層循環(huán),在外層循環(huán)中也要加上:若flag為1, 結(jié)束外層循環(huán)方法二:使用goto語句跳出多重循環(huán)flag=0; for(i=0; i=n/5; i+) for(j=0; j=n/3; j+) k=

57、n-i-j; if( i*15+j*9+k = n*3) /若找到一個解 printf(“%d %d %dn”, i, j, k); /輸出一個解 flag=1; /有解標志置為1 goto PRN; /使用goto語句直接跳轉(zhuǎn)到循環(huán)結(jié)構(gòu)之后的語句 PRN: if (flag=0) /若無解 printf(No answern); PRN為語句標號,標示程序的特定位置Goto PRN; 直接跳轉(zhuǎn)到語句標號為PRN的位置goto語句的使用 goto語句格式: goto 語句標號;語句標號:語句標號是一個標示符加一個冒號組成,它標示程序地一個特定位置,一般放在一段可執(zhí)行語句的左邊。功能:將程序轉(zhuǎn)到

58、指定的位置繼續(xù)執(zhí)行g(shù)oto語句是一個古老的語句,是循環(huán)語句的前身(在計算機發(fā)展的早期,程序就是由幾個語句+語句標號+跳轉(zhuǎn)語句組成的) goto語句如何實現(xiàn)循環(huán)?#includeint main() int sum,i; sum=0; i=1;loop: sum=sum+i; i+; if(i=100) goto loop; printf(%dn,sum); return 0;如果i=100,跳轉(zhuǎn)到loop處,從而實現(xiàn)循環(huán)goto語句通常不用,主要因為它將使程序?qū)哟尾磺?且不易讀,且?guī)黼[患。但在多層嵌套退出時, 用goto語句則比較合理 2022-5-2684 題目的輸入數(shù)據(jù)和輸出數(shù)據(jù)有多組(不定),對每一組輸入都應有相應的輸出。也就是運行一次程序進行多次計算。通過循環(huán)來實現(xiàn)通過循環(huán)來實現(xiàn)4.7 多實例測試多實例測試先從先從a+b開始:開始:2022-5-2685初學者很常見的一種寫法:初學者很常見的一種寫法: #include int main() int a,b; scanf(“%d %d”,&a,&b); printf(“%d”,a+b); 2022-5-26864.7.1 多實例第一類多實例第一類 例4.19: a+b(一)一) 求a+b,輸入包含N組數(shù)據(jù),下面接著N組數(shù)據(jù),每組數(shù)據(jù)包含兩個整數(shù)a和b,對每組

溫馨提示

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

評論

0/150

提交評論