C語(yǔ)言 循環(huán)程序設(shè)計(jì)_第1頁(yè)
C語(yǔ)言 循環(huán)程序設(shè)計(jì)_第2頁(yè)
C語(yǔ)言 循環(huán)程序設(shè)計(jì)_第3頁(yè)
C語(yǔ)言 循環(huán)程序設(shè)計(jì)_第4頁(yè)
C語(yǔ)言 循環(huán)程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩79頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

C語(yǔ)言循環(huán)程序設(shè)計(jì)第1頁(yè)/共84頁(yè)2第5章循環(huán)程序設(shè)計(jì)5.1概述5.2while和dowhile循環(huán)

5.3for循環(huán)5.4循環(huán)的嵌套

5.5

循環(huán)的控制5.6應(yīng)用舉例5.7程序調(diào)試第2頁(yè)/共84頁(yè)3第5章循環(huán)程序設(shè)計(jì)第3頁(yè)/共84頁(yè)4第5章循環(huán)程序設(shè)計(jì)第4頁(yè)/共84頁(yè)5第5章循環(huán)程序設(shè)計(jì)第5頁(yè)/共84頁(yè)6第5章循環(huán)程序設(shè)計(jì)第6頁(yè)/共84頁(yè)7第5章循環(huán)程序設(shè)計(jì)第7頁(yè)/共84頁(yè)8第5章循環(huán)程序設(shè)計(jì)第8頁(yè)/共84頁(yè)9第5章循環(huán)程序設(shè)計(jì)第9頁(yè)/共84頁(yè)10第5章循環(huán)程序設(shè)計(jì)

水溫度的量變引起水的物理形態(tài)的質(zhì)變:水在標(biāo)淮大氣壓下加溫到100攝氏度變成汽降溫到0攝氏度變成冰。第10頁(yè)/共84頁(yè)11第5章循環(huán)程序設(shè)計(jì)

物體從地球上拋射速度的量變引起運(yùn)動(dòng)形式的質(zhì)變:小于7911m/s時(shí),在地面上沿彈道飛行;達(dá)到7911m/s時(shí),繞地球作橢園軌道運(yùn)動(dòng),成為地球的衛(wèi)星;增大到11189m/s時(shí),脫離地球成為繞太陽(yáng)運(yùn)行的一個(gè)行星;速度達(dá)到16662m/s時(shí),脫離太陽(yáng)系成為迢游太空的一個(gè)天體。第11頁(yè)/共84頁(yè)12第5章循環(huán)程序設(shè)計(jì)

計(jì)算機(jī)程序由若干語(yǔ)句順序組成:順序結(jié)構(gòu)的程序只能按照語(yǔ)句的先后順序從前向后依次執(zhí)行分支結(jié)構(gòu)程序雖然允許在執(zhí)行了某個(gè)判斷后跳過(guò)某些語(yǔ)句執(zhí)行后面的語(yǔ)句,但也只能按語(yǔ)句的前后次序執(zhí)行有時(shí),需要在程序中重復(fù)執(zhí)行某個(gè)語(yǔ)句或語(yǔ)句塊,就需要循環(huán)結(jié)構(gòu)第12頁(yè)/共84頁(yè)13第5章循環(huán)程序設(shè)計(jì)生活中的例子:擊鼓傳花:

大家坐成一個(gè)圈,鼓聲響起的時(shí)候?qū)⒒ㄊ樞蚪坏较乱粋€(gè)人的手里,依次向下傳遞,當(dāng)鼓聲突然中斷時(shí)停止傳花,花束落在誰(shuí)的手里便成為輸家4×100米接力賽跑:

第1個(gè)人跑完100米后將接力棒傳給第2個(gè)人,第2個(gè)人再跑100米,然后是第3個(gè)人,直到第4個(gè)人跑完最后一個(gè)100米共同點(diǎn):都要完成相同的任務(wù):量變的重復(fù)內(nèi)容都有結(jié)束條件:發(fā)生質(zhì)變的界限第13頁(yè)/共84頁(yè)14第5章循環(huán)程序設(shè)計(jì)1.計(jì)算sum=1+2+3+……+100第14頁(yè)/共84頁(yè)15第5章循環(huán)程序設(shè)計(jì)1.計(jì)算sum=1+2+3+……+100循環(huán)體循環(huán)控制條件循環(huán)控制變量循環(huán)的初始化#include<stdio.h>voidmain(){ inti=1,sum=0; while(i<=100) { sum=sum+i; i++; } printf(“Sum=%d\n”,sum);}第15頁(yè)/共84頁(yè)16第5章循環(huán)程序設(shè)計(jì)2.計(jì)算sum=2+4+6+……+100循環(huán)體循環(huán)控制條件循環(huán)控制變量循環(huán)的初始化#include<stdio.h>voidmain(){ inti=2,sum=0; while(i<=100) { sum=sum+i; i+=2; } printf(“Sum=%d\n”,sum);}第16頁(yè)/共84頁(yè)175.2while和dowhile循環(huán)格式:

while(表達(dá)式

)語(yǔ)句

do語(yǔ)句

while(表達(dá)式

);說(shuō)明:括號(hào)中的“表達(dá)式”是循環(huán)控制條件,但不限于關(guān)系表達(dá)式和邏輯表達(dá)式“語(yǔ)句”是單一語(yǔ)句,但可以是復(fù)合語(yǔ)句如果while語(yǔ)句的括號(hào)后面只有“;”,則循環(huán)體為空。如果do-while語(yǔ)句的括號(hào)后面(分號(hào)前面)還有其他符號(hào),則出現(xiàn)語(yǔ)法錯(cuò)誤第17頁(yè)/共84頁(yè)185.2while和dowhile循環(huán)while語(yǔ)句的執(zhí)行過(guò)程while語(yǔ)句的執(zhí)行過(guò)程是:計(jì)算“表達(dá)式”的值;若“表達(dá)式”的值不時(shí)0,為“真”,繼續(xù)執(zhí)行③;否則,結(jié)束循環(huán),轉(zhuǎn)到while語(yǔ)句后面的語(yǔ)句繼續(xù)執(zhí)行程序;執(zhí)行“語(yǔ)句”部分,即執(zhí)行循環(huán)體;返回①繼續(xù)執(zhí)行。第18頁(yè)/共84頁(yè)195.2while和dowhile循環(huán)do-while語(yǔ)句的執(zhí)行過(guò)程第19頁(yè)/共84頁(yè)205.2while和dowhile循環(huán)循環(huán)語(yǔ)句的特點(diǎn):while循環(huán)是“先判斷后循環(huán)”,如果開始時(shí)循環(huán)條件不滿足,循環(huán)體就一次也不執(zhí)行do-while循環(huán)是“先循環(huán)后判斷”,即使第一次判斷的結(jié)果為“假”,循環(huán)體也已經(jīng)執(zhí)行了一次但不論哪種循環(huán),循環(huán)體中必須包含能夠使循環(huán)條件變?yōu)椤凹佟钡倪\(yùn)算第20頁(yè)/共84頁(yè)215.2while和dowhile循環(huán)循環(huán)的變化:sum=1+2+3+……+100#include<stdio.h>voidmain(){ inti=1,sum=0; while(i<=100) sum=sum+i++; printf(“Sum=%d\n”,sum);}#include<stdio.h>voidmain(){ inti=1,sum=0; do { sum=sum+i; i++; } while(i<=100); printf(“Sum=%d\n”,sum);}第21頁(yè)/共84頁(yè)225.2while和dowhile循環(huán)幾何級(jí)數(shù)2x的力量:一頁(yè)普通紙的厚度約為0.1mm(1mm=10-3m)珠穆朗瑪峰的高度為8844.43m編寫程序計(jì)算一下,普通紙對(duì)折多少次可以超過(guò)珠穆朗瑪峰的高度?第22頁(yè)/共84頁(yè)235.2while和dowhile循環(huán)#include<stdio.h>voidmain(){ doublepaper_height,mountain_height; intnumber; paper_height=0.0001; mountain_height=8844.43; number=0; while(paper_height<mountain_height) {paper_height*=2; number+=1; printf("對(duì)折第%d次后的高度是%g。\n",number,paper_height); }}第23頁(yè)/共84頁(yè)245.2while和dowhile循環(huán)幾何級(jí)數(shù)2x的力量:中國(guó)戰(zhàn)國(guó)時(shí)期的趙國(guó)辯士公孫龍有一個(gè)著名命題:“一尺之棰,日取其半,萬(wàn)世不竭”。這是說(shuō),一尺長(zhǎng)(0.33m)的一根木棰,每天取它一半,世世代代也取不完。這一命題,包含了某些樸素辯證法的思想,它猜測(cè)到了物質(zhì)的無(wú)限可分性。但嚴(yán)格說(shuō)來(lái)它并不科學(xué)。因?yàn)榫湍骋痪唧w物質(zhì)形態(tài)來(lái)說(shuō),它在被分割到一定程度時(shí)就不再是這一事物了。最大的原子是銫,半徑為225pm(1pm=10-12m)編寫程序計(jì)算一下,這只木棰日取一半,取多少天可以比銫原子的半徑???第24頁(yè)/共84頁(yè)255.2while和dowhile循環(huán)第25頁(yè)/共84頁(yè)265.2while和dowhile循環(huán)#include<stdio.h>voidmain(){ doublehammer_height,cesium_radius; intnumber; hammer_height=0.33; cesium_radius=225e-12; number=0; while(cesium_radius<hammer_height) {hammer_height/=2; number+=1; printf("第%d天后的高度是%g。\n",number,hammer_height); }}第26頁(yè)/共84頁(yè)275.2while和dowhile循環(huán)恩格斯說(shuō):“純粹的量的分割是有一個(gè)極限的,到了這個(gè)極限它就轉(zhuǎn)化為質(zhì)的差別;物體純粹是由分子構(gòu)成的,但它是本質(zhì)上不同于分子的東西,正如分子又不同于原子一樣”。取到第3天,剩下的部分4.125cm長(zhǎng),這時(shí)它還能做為“木棰”嗎?取到第31天,它剩下的部分已經(jīng)沒(méi)有分子那么大了,這時(shí)它不僅不再能成為“木棰”,連木頭的物理分子都已經(jīng)不是了。當(dāng)然,它還可以被取下去,但隨著次數(shù)的變化,它必然會(huì)發(fā)生不同層次的質(zhì)變。嚴(yán)格說(shuō)來(lái),應(yīng)該是“一尺之棰,日取其半,三日可竭”;作為木質(zhì)應(yīng)該是“一只之棰,日取其半,一月乃竭”;作為物質(zhì),應(yīng)該是“一尺之棰,日取其半,萬(wàn)世不蝎”。這就是說(shuō),不同層次的量變,總是引起與之相應(yīng)的質(zhì)變。第27頁(yè)/共84頁(yè)285.2while和dowhile循環(huán)循環(huán)的嵌套如果在一個(gè)循環(huán)的循環(huán)體內(nèi)包含另一個(gè)完整的循環(huán)則稱為循環(huán)的嵌套,其中被嵌套的循環(huán)稱為內(nèi)循環(huán),而嵌套了內(nèi)循環(huán)的是外循環(huán)內(nèi)循環(huán)還可以嵌套循環(huán),形成多級(jí)(層)嵌套第28頁(yè)/共84頁(yè)295.2while和dowhile循環(huán)順序打印1-10的階乘,即1!,2!,…,10!本題的關(guān)鍵是求階乘數(shù)學(xué)上,n!=1·2·3·…·(n-1)·n第29頁(yè)/共84頁(yè)305.2while和dowhile循環(huán)外循環(huán)內(nèi)循環(huán)對(duì)比程序:#include<stdio.h>voidmain(){ inti=1; floatf=1; while(i<=10) { f=f*i; printf("%2d!=%.0f\n",i,f); i++; }}思考一下:8-10的階乘#include<stdio.h>voidmain(){ inti=1,j; floatf; while(i<=10) { j=1; f=1; while(j<=i) { f=f*j; j++; } printf(“%2d!=%.0f\n”,i,f); i++; }}第30頁(yè)/共84頁(yè)315.2while和dowhile循環(huán)

循環(huán)的嵌套不僅可以發(fā)生在相同語(yǔ)句之間,如while嵌套while、do-while嵌套do-while,while語(yǔ)句和do-while語(yǔ)句也可以互相嵌套(1) while(….) (2) while(…) { … { … while(…) do {…} { … … }while(…); } … }(3) do (4) do { … { … while(…) do {…} { … … }while(…); } … }while(…);第31頁(yè)/共84頁(yè)325.2while和dowhile循環(huán)錯(cuò)誤的嵌套形式

循環(huán)必須是完整的,不允許內(nèi)外循環(huán)交叉嵌套

f=1; while(i<10) { i=1; do { f=f*i; i++; } }while(i<10);混亂的控制條件

內(nèi)外循環(huán)的循環(huán)控制條件通常是分開的,相對(duì)獨(dú)立的

i=1;s=0; while(i<3) { s=s+f; i=1;f=1; while(i<5) { i+=2; f=f*i; } i++;}第32頁(yè)/共84頁(yè)335.2while和dowhile循環(huán)應(yīng)用舉例輸入一個(gè)5位數(shù),計(jì)算并輸出各位的和方法一:將輸入的5位數(shù)看作是5個(gè)獨(dú)立的數(shù)字字符,依次讀取每一個(gè)數(shù)字字符,將其轉(zhuǎn)化為對(duì)應(yīng)的數(shù)字后再求和將數(shù)組字符ch轉(zhuǎn)化為數(shù)字的方法為ch-’0’第33頁(yè)/共84頁(yè)345.2while和dowhile循環(huán)輸入一個(gè)5位數(shù),計(jì)算并輸出各位的和#include<stdio.h>voidmain(){ charch; inti=0,sum=0; printf(“Enteranumberwith5digits:”); while(i<5) { ch=getchar(); sum+=ch-‘0’;/*將數(shù)字字符轉(zhuǎn)化為對(duì)應(yīng)的數(shù)字*/ i++; } printf(“Sumofthese5digitsis%d\n”,sum);}第34頁(yè)/共84頁(yè)355.2while和dowhile循環(huán)幾種常見運(yùn)算:如果ch為數(shù)字字符,則表達(dá)式ch-‘0’的值為對(duì)應(yīng)的數(shù)字如果ch為大寫字母,則表達(dá)式ch-‘A’+‘a(chǎn)’

為對(duì)應(yīng)的小寫字母如果ch為小寫字母,則表達(dá)式ch-‘a(chǎn)’+‘A’

為對(duì)應(yīng)的大寫字母技巧第35頁(yè)/共84頁(yè)365.2while和dowhile循環(huán)輸入一個(gè)5位數(shù),計(jì)算并輸出各位的和方法二:將輸入的5位數(shù)看作一個(gè)整數(shù),先讀取該整數(shù),再分離出各位數(shù)字對(duì)于整數(shù)x,其個(gè)位數(shù)為x%10要求整數(shù)x的十位數(shù),可以先令x=x/10,再求x的個(gè)位數(shù)第36頁(yè)/共84頁(yè)375.2while和dowhile循環(huán)輸入一個(gè)5位數(shù),計(jì)算并輸出各位的和#include<stdio.h>voidmain(){ intx,x1,r,sum=0; printf("Enteranumber:"); scanf("%d",&x); x1=x; while(x>0) { r=x%10; sum+=r; x/=10; } printf("Sumofthedigitsin%dis%d\n",x1,sum);}第37頁(yè)/共84頁(yè)385.2while和dowhile循環(huán)任意輸入一行字符,統(tǒng)計(jì)字母a和A的個(gè)數(shù)#include<stdio.h>voidmain(){ charch; intcount=0; printf("Entercharacters:"); do { ch=getchar(); if(ch==‘A’||ch==‘a(chǎn)’)count++; }while(ch!='\n'); printf("Counterof'a'or'A':%d\n",count);}第38頁(yè)/共84頁(yè)395.2while和dowhile循環(huán)第39頁(yè)/共84頁(yè)405.2while和dowhile循環(huán)#include<stdio.h>voidmain(){ intf=-1,n=1; floatt,pi=0; /*t為最后一項(xiàng)的值*/ do { f=-f; /*第n項(xiàng)的符號(hào)*/ t=1.0/(2*n-1); /*用1.0是為了避免整除*/ pi+=f*t; n++; }while(t>1e-5); pi=4*pi; printf("PI=%.4f\n",pi);}第40頁(yè)/共84頁(yè)415.3for語(yǔ)句

for語(yǔ)句是常用的、特殊的循環(huán)控制語(yǔ)句for語(yǔ)句的功能強(qiáng)大,使用靈活,變化多樣for語(yǔ)句優(yōu)點(diǎn):將“循環(huán)初始化條件”、“循環(huán)控制條件”、“循環(huán)控制變量的修改”集中表示將量變與質(zhì)變的因素集中表示第41頁(yè)/共84頁(yè)425.3for語(yǔ)句for語(yǔ)句的用法for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語(yǔ)句“表達(dá)式1”用于循環(huán)的初始化“表達(dá)式2”是for語(yǔ)句的循環(huán)控制條件,當(dāng)循環(huán)控制條件為1(True)或非0時(shí),運(yùn)行代表循環(huán)體的“語(yǔ)句”部分,可以是任何形式的表達(dá)式“表達(dá)式3”用于修改循環(huán)控制變量的值,目的是使“表達(dá)式2”的值變?yōu)?(False),以結(jié)束循環(huán)“語(yǔ)句”部分是for語(yǔ)句的循環(huán)體,可以是單一語(yǔ)句,也可以是復(fù)合語(yǔ)句第42頁(yè)/共84頁(yè)435.3for語(yǔ)句for語(yǔ)句的執(zhí)行過(guò)程第43頁(yè)/共84頁(yè)445.3for語(yǔ)句使用for語(yǔ)句編程。計(jì)算sum=1+2+3+…+100#include<stdio.h>voidmain(){ inti,sum=0; for(i=1;i<=100;i++) sum+=i; printf(“sum=%d\n",sum);}第44頁(yè)/共84頁(yè)455.3for語(yǔ)句任意輸入10個(gè)數(shù),求平均值#include<stdio.h>voidmain(){ inti; floatx,sum=0; printf("Enter10numbersonebyone:\n"); for(i=1;i<=10;i++) { scanf("%f",&x); sum+=x; } printf("Averageis%f\n",sum/10);}第45頁(yè)/共84頁(yè)465.3for語(yǔ)句循環(huán)的嵌套for語(yǔ)句可以嵌套for語(yǔ)句構(gòu)成循環(huán)的嵌套for語(yǔ)句也可以與while語(yǔ)句、do-while語(yǔ)句互相嵌套第46頁(yè)/共84頁(yè)475.3for語(yǔ)句例:順序打印1-10的階乘,即1!,2!,3!,…,10!#include<stdio.h>voidmain(){ inti,j; floatf; for(i=1;i<=10;i++) { f=1; for(j=1;j<=i;j++) f=f*j; printf("%2d!=%.0f\n",i,f); }}#include<stdio.h>voidmain(){ inti=1,j; floatf; while(i<=10) { j=1; f=1; while(j<=i) { f=f*j; j++; } printf(“%2d!=%.0f\n”,i,f); i++; }}第47頁(yè)/共84頁(yè)485.3for語(yǔ)句例:打印幾何圖形對(duì)于這類問(wèn)題,每行中星號(hào)的個(gè)數(shù)、總行數(shù)等都應(yīng)該用循環(huán)結(jié)構(gòu)進(jìn)行控制,而不是直接輸出若干行字符串#include<stdio.h>voidmain(){ inti,j; for(i=1;i<=4;i++) { for(j=0;j<i;j++)putchar(''); for(j=1;j<=6;j++)putchar('*'); putchar('\n'); }}****************第48頁(yè)/共84頁(yè)495.3for語(yǔ)句例:甲、乙兩個(gè)會(huì)計(jì)進(jìn)行點(diǎn)鈔比賽,甲的速度為5張/秒,乙的為8張/秒。乙在甲已經(jīng)點(diǎn)了100張鈔票后才開始,問(wèn):只要幾秒時(shí)間乙就可以超過(guò)甲?

經(jīng)過(guò)t秒,甲點(diǎn)過(guò)的鈔票數(shù)有x=100+5t張,乙的為y=8t張問(wèn)題就是求y≥x時(shí)的t值#include<stdio.h>voidmain(){ intt; intx=100,y=0; for(t=0;x>y;t++) { x=100+5*t; y=8*t; } printf("Timeis%dseconds\n",t);}第49頁(yè)/共84頁(yè)505.3for語(yǔ)句for語(yǔ)句的變化形式可以省略for語(yǔ)句的“表達(dá)式1”或“表達(dá)式3”,也可以都省略(“退化為”while語(yǔ)句)例:將用鍵盤輸入的若干字符順序輸出到屏幕上#include<stdio.h>voidmain(){ charch; for(;(ch=getchar())!=‘\n’;) putchar(ch);}第50頁(yè)/共84頁(yè)515.3for語(yǔ)句如果省略“表達(dá)式2”,則循環(huán)控制條件總為“真”下面的語(yǔ)句是“合法”的,但構(gòu)成了“死循環(huán)”:

for(i=1;;i++)sum+=i;下面的程序在運(yùn)行時(shí)會(huì)因?yàn)椤俺粤恪倍鲥e(cuò):#include<stdio.h>voidmain(){ chari; intsum=0; for(i=1;;i++)sum+=1000/i; printf("sum=%d\n",sum);}第51頁(yè)/共84頁(yè)525.4循環(huán)的控制復(fù)雜的循環(huán)控制條件 對(duì)循環(huán)的控制問(wèn)題,不僅僅是防止“死循環(huán)”,還包括選擇恰當(dāng)?shù)臅r(shí)機(jī),正確地結(jié)束循環(huán)

有的時(shí)候,循環(huán)控制條件是復(fù)雜的,還可能是多種條件的綜合第52頁(yè)/共84頁(yè)53例:假設(shè)每個(gè)班最多有30個(gè)人,依次輸入每個(gè)人的成績(jī),如果輸入的不是0-100之間的數(shù),或者已經(jīng)輸入了30個(gè)數(shù),則結(jié)束輸入,輸出計(jì)算結(jié)果。#include<stdio.h>voidmain(){ inti=0,flag=1; floatscore,ave=0; printf("Enterscoresonebyone:\n"); while(i<30&&flag==1) { scanf("%f",&score); if(score<0||score>100) flag=0;

else { ave+=score; i++; } } if(i>0)ave=ave/i;

printf("Average:%.2f\n",ave);}第53頁(yè)/共84頁(yè)545.4循環(huán)的控制

下面的程序塊常用來(lái)對(duì)輸入的數(shù)據(jù)進(jìn)行限制:

doscanf("%d",&iInput); while(iInput<0||iInput>MAXIMUM);或者,

scanf("%d",&iInput); while(iInput<0||iInput>MAXIMUM)scanf("%d",&iInput);

常用下面的程序塊要求用戶選擇Yes或No,忽略其他輸入:

printf("EnterYes/No?"); doch=getchar(); while(ch!='y'&&ch!='Y'&&ch!='n'&&ch!='N');或者,?(討論一下)技巧第54頁(yè)/共84頁(yè)55例:利用隨機(jī)數(shù)產(chǎn)生一個(gè)乘法算式,用戶輸入算式的運(yùn)算結(jié)果,由程序判斷對(duì)錯(cuò)。#include<stdio.h>#include<stdlib.h>voidmain(){ intiFor=0,iErr=0; intx,y,iAns;charch; do { iFor++; x=rand()%100;

y=rand()%100; printf("%dx%d=?",x,y); scanf("%d",&iAns); if(iAns==x*y)

printf("Right!\n"); else { iErr++;printf("Youarewrong.\n");} printf("Areyouwanttocontinue?(Y/N)"); doch=getchar();

while(ch!='y'&&ch!='Y'&&ch!='n'&&ch!='N'); }while(ch=='y'||ch=='Y');

printf("In%dquestions,",iFor); printf("you'vemade%dright,%dwrong.\n",iFor-iErr,iErr);}第55頁(yè)/共84頁(yè)565.4循環(huán)的控制break語(yǔ)句break語(yǔ)句的格式為:

break;在switch語(yǔ)句中,break語(yǔ)句用于跳過(guò)后面的語(yǔ)句,結(jié)束switch語(yǔ)句在循環(huán)結(jié)構(gòu)中,break語(yǔ)句的作用是跳出循環(huán)結(jié)構(gòu),執(zhí)行循環(huán)后面的語(yǔ)句在下面的程序塊中,由于break語(yǔ)句的作用,循環(huán)只進(jìn)行了1次,printf語(yǔ)句一次也沒(méi)有執(zhí)行,并且永遠(yuǎn)也不會(huì)被執(zhí)行:

for(i=1;i<100;i++) { sum+=i; break; printf("%d",sum); }第56頁(yè)/共84頁(yè)575.4循環(huán)的控制continue語(yǔ)句continue語(yǔ)句的格式為:

continue;continue語(yǔ)句只能用在循環(huán)結(jié)構(gòu)中,用于結(jié)束本次循環(huán),即跳過(guò)循環(huán)體中后面的語(yǔ)句,開始下一次循環(huán)下面的語(yǔ)句塊中,循環(huán)次數(shù)是100次,但printf語(yǔ)句一次也沒(méi)有執(zhí)行:

for(i=1;i<100;i++) { sum+=i; continue; printf("%d",sum); }第57頁(yè)/共84頁(yè)585.4循環(huán)的控制 break語(yǔ)句和continue語(yǔ)句的有效范圍都僅限于所在的循環(huán)語(yǔ)句之內(nèi)。如果想從嵌套的循環(huán)結(jié)構(gòu)的內(nèi)循環(huán)中直接跳出到外循環(huán)之外,使用一個(gè)break語(yǔ)句是不行的??尚械姆椒ㄊ牵涸诔绦蛑幸胍粋€(gè)標(biāo)識(shí)變量,在各循環(huán)的結(jié)束位置檢測(cè)這一標(biāo)識(shí),用多個(gè)break語(yǔ)句作連續(xù)的跳轉(zhuǎn)……flag=1while(i<10){ for(j=i;j<10;j++) if(j==2*i) { flag=0; break; } if(flag!=1)break; printf("%d",i);}……第58頁(yè)/共84頁(yè)595.4循環(huán)的控制例:順序打印100-1000之間所有9的倍數(shù),如果一個(gè)數(shù)同時(shí)也是7的倍數(shù)則停止打印#include<stdio.h>voidmain(){ inti; for(i=100;i<1000;i++) { if(i%9!=0)continue; printf("%5d",i); if(i%7==0)break; }}第59頁(yè)/共84頁(yè)605.4循環(huán)的控制例:求任意正整數(shù)的除了自身以外的最大因數(shù)#include<stdio.h>voidmain(){ inti,n; printf("Enteranumber:"); scanf("%d",&n); for(i=n-1;i>0;i--) if(n%i==0)break; printf("Thebiggestfactorof%dis%d\n",n,i);}第60頁(yè)/共84頁(yè)615.4循環(huán)的控制goto語(yǔ)句goto語(yǔ)句是從早期程序設(shè)計(jì)語(yǔ)言遺留下來(lái)的一個(gè)語(yǔ)句,稱為無(wú)條件跳轉(zhuǎn)語(yǔ)句,已被淘汰goto語(yǔ)句的使用格式是:

goto語(yǔ)句標(biāo)號(hào);“語(yǔ)句標(biāo)號(hào)”是一個(gè)特殊的標(biāo)識(shí)符,由字母、數(shù)字或下劃線組成(第一個(gè)字符不能是數(shù)字),后面跟冒號(hào)“:”,放在語(yǔ)句行的最前頭#include<stdio.h>voidmain(){ inti=100; while(i<1000) { if(i%9!=0)gotoNext; printf(“%5d”,i);Next:i++; }}例:打印所有的100-1000間9的倍數(shù)第61頁(yè)/共84頁(yè)625.5應(yīng)用舉例阿米巴原蟲,以細(xì)菌和更小的原蟲為食中樞神經(jīng)系統(tǒng)的阿米巴原蟲感染水溶組織內(nèi)阿米巴在一個(gè)試管中吞吃細(xì)菌被稱為“食腦變形蟲”的阿米巴原蟲能從人的鼻子里鉆入大腦,將人的腦子“吃”掉。第62頁(yè)/共84頁(yè)635.5應(yīng)用舉例例:阿米巴用簡(jiǎn)單分裂方式繁殖,每分裂一次用時(shí)3分鐘。將若干個(gè)阿米巴放在一個(gè)盛滿營(yíng)養(yǎng)液的容器內(nèi),45分鐘后容器內(nèi)充滿了阿米巴。已知容器最多可以裝阿米巴220個(gè),試問(wèn),開始的時(shí)候往容器內(nèi)放了多少個(gè)阿米巴?分析:根據(jù)題意,阿米巴每3分鐘分裂一次,那么從開始將阿米巴放入容器里面,到45分鐘后充滿容器,需要分裂15次。而“容器最多可以裝阿米巴220個(gè)”,即阿米巴分裂15次以后得到的個(gè)數(shù)是220。題目要求計(jì)算分裂之前的阿米巴數(shù),不妨使用倒推的方法,從第15次分裂之后的220個(gè),倒推出第15次分裂之前(即第14次分裂之后)的個(gè)數(shù),再進(jìn)一步倒推出第14次分裂之前、第13次分裂之前、……第1次分裂之前的個(gè)數(shù)。第63頁(yè)/共84頁(yè)645.5應(yīng)用舉例設(shè)開始時(shí)阿米巴的個(gè)數(shù)為x0,第1次、第2次、第3次……第15次分裂之后的個(gè)數(shù)分別為x1、x2、x3、……、x15,則有以下關(guān)系:

x0=x1/2 x1=x2/2 ……

xn=xn+1/2 …… x14=x15/2已知x15=220,可以利用上面的關(guān)系倒推出x0#include<stdio.h>#include<math.h>voidmain(){ inti; longx=pow(2,20); for(i=15;i>0;i--)x=x/2; printf("Thereare%damebas.\n",x);}第64頁(yè)/共84頁(yè)65例:谷角猜想,對(duì)于任意一個(gè)自然數(shù)n,若n為偶數(shù),則將其除以2;若n為奇數(shù),則將其乘以3,然后再加1。如此反復(fù),經(jīng)過(guò)有限次運(yùn)算后,總可以得到自然數(shù)1。試編程驗(yàn)證之。#include<stdio.h>voidmain(){ intn; printf("Enteranumber:"); scanf("%d",&n); printf("%5d",n); while(n>1) { if(n%2==0)n/=2; elsen=3*n+1; printf("%5d",n); }}第65頁(yè)/共84頁(yè)665.5應(yīng)用舉例例:打印九九乘法口訣表要求:九九乘法口訣表呈三角形,共有9行。第1行有1列,第2行有2列,……,第9行有9列。打印方法是,用外循環(huán)控制行數(shù),包括打印一行中的所有列和換行,在內(nèi)循環(huán)中,打印某一行上的所有列。#include<stdio.h>voidmain(){ inti,j; for(i=1;i<=9;i++) { for(j=1;j<=i;j++) printf("%1dx%1d=%-4d",j,i,j*i); printf("\n"); }}第66頁(yè)/共84頁(yè)67例:利用迭代公式求的近似值,結(jié)果保留5位有效數(shù)字。用該迭代公式求a的平方根x,實(shí)際是求近似值xn+1,即x≈xn+1,“保留5位有效數(shù)字”可理解為|xn+1-xn|/xn+1<10-5#include<math.h>#include<stdio.h>voidmain(){ floatx,y,y0; printf("Enterapositive:"); doscanf("%f",&x); while(x<0); y=1; do { y0=y; y=0.5*(y+x/y); }while(fabs(y-y0)/y>1e-5); printf("Squarerootof%fis%f\n", x,y);}第67頁(yè)/共84頁(yè)68例:利用牛頓迭代法求方程的在2附近的一個(gè)實(shí)根。對(duì)于方程f(x)=0,把f(x)在x0附近展開成泰勒級(jí)數(shù):

f(x)=f(x0)+(x-x0)f'(x0)+(x-x0)2f''(x0)+…取線性部分作為方程f(x)=0的近似方程,則有:

f(x0)+f'(x0)(x-x0)=0設(shè)f'(x0)≠0,則方程的近似解為:

x1=x0-f(x0)/f'(x0)再把f(x)在x1附近展開,也取其線性部分。若f(x1)≠0,則得到方程的另一個(gè)近似解:

x2=x1-f(x1)/f'(x1)這樣,可得到牛頓法的一個(gè)迭代序列:

xn+1=xn-f(xn)/f'(xn)當(dāng)f(xn+1)≈0時(shí)即可認(rèn)為xn+1就是方程f(x)=0的近似解。對(duì)于本題,

f(x)=5x3-3x2-22 f'(x)=15x2-6x x0=2第68頁(yè)/共84頁(yè)69例:利用牛頓迭代法求方程的在2附近的一個(gè)實(shí)根。#include<stdio.h>voidmain(){ floatx,y,y1; x=2; do { y=x*x*(5*x-3)-22; y1=(15*x–6)*x; x=x–y/y1; }while(fabs(y)>1e-5) printf("Therootis%f\n",x);}第69頁(yè)/共84頁(yè)705.6程序調(diào)試對(duì)于程序設(shè)計(jì)而言,即使優(yōu)秀的程序員也不能保證不會(huì)犯錯(cuò)誤一個(gè)優(yōu)秀的程序,不在于使用了先進(jìn)的算法,而在于僅僅包含少量的錯(cuò)誤程序中的錯(cuò)誤是在所難免的,關(guān)鍵是發(fā)現(xiàn)并糾正錯(cuò)誤初學(xué)程序設(shè)計(jì)的人有必要從一開始就養(yǎng)成良好的習(xí)慣,培養(yǎng)嚴(yán)謹(jǐn)?shù)墓ぷ髯黠L(fēng),并逐步掌握一些編程技巧第70頁(yè)/共84頁(yè)715.6程序調(diào)試程序調(diào)試的一般策略程序中的錯(cuò)誤一般可分為:語(yǔ)法錯(cuò)誤比較容易發(fā)現(xiàn),通常,有語(yǔ)法錯(cuò)誤的程序不能通過(guò)編譯和連接,也就不能生成可執(zhí)行的程序邏輯錯(cuò)誤又叫語(yǔ)義錯(cuò)誤,也就是不能正確地表達(dá)所需要的功能,是較常見的錯(cuò)誤之一。其外部表現(xiàn)為,程序可以運(yùn)行,但有時(shí)出錯(cuò),有時(shí)又不出錯(cuò)。邏輯錯(cuò)誤通常比較難于被發(fā)現(xiàn),查錯(cuò)和糾錯(cuò)對(duì)任何程序員來(lái)說(shuō)都是挑戰(zhàn)設(shè)計(jì)錯(cuò)誤比較少見,通常是由于對(duì)問(wèn)題的分析不徹底造成的,糾正這類錯(cuò)誤需要重新設(shè)計(jì)程序第71頁(yè)/共84頁(yè)725.6程序調(diào)試調(diào)試程序的一般步驟為:靜態(tài)檢查,也就是人工檢查,是在完成程序設(shè)計(jì)后,在上機(jī)調(diào)試前,仔細(xì)地對(duì)程序代碼進(jìn)行全面的檢查。通過(guò)靜態(tài)檢查,不僅可以發(fā)現(xiàn)程序中的語(yǔ)法錯(cuò)誤,也可以發(fā)現(xiàn)邏輯錯(cuò)誤,甚至發(fā)現(xiàn)設(shè)計(jì)上的缺陷。為便于查錯(cuò),應(yīng)力求做到編碼的標(biāo)準(zhǔn)化、文檔化,增強(qiáng)編碼的可讀性、可理解性、可維護(hù)性。要做到:采用結(jié)構(gòu)化方法,劃分功能模塊和程序段,采用必要的縮進(jìn)和對(duì)齊,簡(jiǎn)化表達(dá)式,每行只有一個(gè)語(yǔ)句,盡量使用注釋,使用有意義的標(biāo)識(shí)符,……動(dòng)態(tài)檢查,是指通過(guò)上機(jī)調(diào)試發(fā)現(xiàn)錯(cuò)誤的過(guò)程。完成編碼后,可以借助編譯程序檢查隱藏的語(yǔ)法錯(cuò)誤,如錯(cuò)誤標(biāo)識(shí)符、非法的表達(dá)式、錯(cuò)誤的函數(shù)調(diào)用等。利用連接程序,可以檢查連接錯(cuò)誤,如調(diào)用了未定義的函數(shù)、缺乏必要的函數(shù)定義等。通過(guò)試運(yùn)行程序,可以發(fā)現(xiàn)一些邏輯錯(cuò)誤,如錯(cuò)誤的計(jì)算、有問(wèn)題的輸入和輸出等第72頁(yè)/共84頁(yè)735.6程序調(diào)試程序中的錯(cuò)誤有兩種:Error和WarningError是必須要糾正的,任何Error都會(huì)導(dǎo)致編譯或連接失敗Warning一般不影響生成可執(zhí)行的“程序”,但程序有缺陷合格的程序員不僅要糾正致命Error,也要重視并糾正Warning當(dāng)程序中錯(cuò)誤較多時(shí),應(yīng)從最前面的錯(cuò)誤開始逐一改正

有些錯(cuò)誤實(shí)際出自同樣的原因,只要糾正了其中的一個(gè)就會(huì)消除所有這些錯(cuò)誤第73頁(yè)/共84頁(yè)745.6程序調(diào)試程序的跟蹤與調(diào)試,以VisualC++6.0為例1、程序的“調(diào)試”運(yùn)行方式

打開主菜單,點(diǎn)擊“Go”(快捷鍵是F5)第74頁(yè)/共84頁(yè)755.6程序調(diào)試2、使程序暫停的方法執(zhí)行到光標(biāo)處:將光標(biāo)放在一個(gè)語(yǔ)句行上,單擊“debug”工具欄中的“RuntoCursor”按鈕設(shè)置斷點(diǎn):將光標(biāo)放在一個(gè)語(yǔ)句行上,然后點(diǎn)擊“Add/RemoveBreakpoint”按鈕,即可在此設(shè)置(或取消)一個(gè)斷點(diǎn)“中斷”(Break)方式:當(dāng)程序運(yùn)行在調(diào)試方式下時(shí),單擊“Break”按鈕,即可立即“中斷”程序的運(yùn)行;要恢復(fù)暫停程序的執(zhí)行,只要單擊“Go”按鈕即可第75頁(yè)/共84頁(yè)765.6程序調(diào)試3、在“暫?!睜顟B(tài)下常見的操作單步運(yùn)行程序。點(diǎn)擊“StepOver”按鈕或“StepInto”按鈕即可一行一行地執(zhí)行程序,每執(zhí)行完一行都自動(dòng)進(jìn)入暫停狀態(tài)觀察變量的值。使用“Variables”窗口可觀察程序中的各種變量的當(dāng)前值,點(diǎn)擊其中的“Locals”選項(xiàng)卡可以顯示所定義的變量的值。在“Watch”窗口中,也可以添加或刪除要觀察的變量的值。當(dāng)“Watch”有效時(shí),點(diǎn)擊選中源代碼窗口,把鼠標(biāo)指向任何變量,稍待片刻,就會(huì)彈出該變量的值修改變量的值。要臨時(shí)修改變量的值,可以雙擊改變量的“Value”域(在Variables窗口或Watch窗口都有效),進(jìn)行編輯模擬計(jì)算。單擊“QuickWatch”按鈕,彈出“QuckWatch”對(duì)話框,可以用當(dāng)前程序中的變量組成算式進(jìn)行簡(jiǎn)單的模擬運(yùn)算第76頁(yè)/共84頁(yè)775.6程序調(diào)試4、查錯(cuò)的技巧程序中隱藏的錯(cuò)誤通常難于發(fā)現(xiàn),可以采取一些技巧:在程序中加入一些“調(diào)試代碼”,輸出變量的中間值以幫助判斷

但這種辦法并不理想,一來(lái)使用起來(lái)不方便,二來(lái)破壞了程序的原有結(jié)構(gòu),三是在不需要的時(shí)候還要一一刪除,不注意會(huì)遺漏。使用條件編譯會(huì)更好些通過(guò)設(shè)置斷點(diǎn)、跟蹤運(yùn)行等方式調(diào)試程序,這是比較高效的方法

一旦懷疑某段程序有錯(cuò),可以在程序段的開始位置設(shè)置斷點(diǎn),當(dāng)程序運(yùn)行到斷點(diǎn)而暫停時(shí),通過(guò)一步一步地執(zhí)行程序,并觀察變量的變化,判斷錯(cuò)誤是否存在。但這種方法也有不利的地方,比如,如果程序段所表達(dá)的邏輯比較復(fù)雜,或者循環(huán)次數(shù)很多,都會(huì)導(dǎo)致調(diào)試?yán)щy程序的單元測(cè)試法。對(duì)程序段的執(zhí)行邏輯進(jìn)行仔細(xì)分析,劃分程序執(zhí)行路徑的種類,針對(duì)每種路徑設(shè)計(jì)若干組不同的輸入數(shù)據(jù),依次使用這些數(shù)據(jù)來(lái)測(cè)試程序,觀察程序的運(yùn)行狀態(tài)和結(jié)果,以發(fā)現(xiàn)可能隱藏著的錯(cuò)誤第77頁(yè)/共84頁(yè)78小強(qiáng)蛋糕店之“成本核算”

小強(qiáng)蛋糕店開張已經(jīng)快有兩個(gè)月了,小強(qiáng)起

溫馨提示

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

評(píng)論

0/150

提交評(píng)論