循環(huán)控制結(jié)構(gòu)_第1頁
循環(huán)控制結(jié)構(gòu)_第2頁
循環(huán)控制結(jié)構(gòu)_第3頁
循環(huán)控制結(jié)構(gòu)_第4頁
循環(huán)控制結(jié)構(gòu)_第5頁
已閱讀5頁,還剩87頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

哈爾濱工業(yè)大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院蘇小紅

sxh@

第6章循環(huán)控制結(jié)構(gòu)第6章學(xué)習(xí)內(nèi)容循環(huán)結(jié)構(gòu)與循環(huán)控制方法循環(huán)語句流程轉(zhuǎn)移控制語句嵌套循環(huán)結(jié)構(gòu)化程序設(shè)計(jì)的基本思想2/956.1循環(huán)控制結(jié)構(gòu)與循環(huán)語句如何確定程序的輸入和輸出呢?讀入5個(gè)整數(shù),計(jì)算并顯示它們的和.Input: 5個(gè)整數(shù)n1,n2,n3,n4,n5Output:n1,n2,n3,n4,n5的和Inputexample:23456Outputexample:20為什么要用循環(huán)結(jié)構(gòu)呢?3/95Inputn1Inputn2Inputn3inputn4inputn5outputsumsum←n1+n2+n3+n4+n52n1Assumeinputexample:

234563n24n35n46n520sumend使用了6個(gè)不同的變量start若100個(gè)數(shù)累加,必須使用100個(gè)變量嗎?4/956.2計(jì)數(shù)控制的循環(huán)counter←1,sum←0counter<6sum←sum+nfalsetruecounter++outputsuminput

n1countersum01<6 true2n0+2222<6 true32+3533<6 true45+4944<6 true59+51455<6 true614+62066<6 falsecounter-controlled

計(jì)數(shù)器每次增1僅使用3個(gè)變量Assumeinputexample:

23456end5/95循環(huán)的控制方法標(biāo)記控制SentinelControlled計(jì)數(shù)控制CounterControlled1,2,3,4,……,4,3,2,1條件控制ConditionControlled6/95for循環(huán)語句當(dāng)型循環(huán)——Conditionistestedfirst

真假假條件P7/95for循環(huán)語句計(jì)數(shù)控制——LoopiscontrolledbyacounterSyntaxfor

(表達(dá)式1;表達(dá)式2;表達(dá)式3)

語句Or

for

(表達(dá)式1;表達(dá)式2;表達(dá)式3)

{

語句1

語句2 }循環(huán)初始條件循環(huán)控制條件循環(huán)轉(zhuǎn)化條件復(fù)合語句(CompoundStatement)做循環(huán)體被當(dāng)作一條語句看待不要重復(fù)在循環(huán)體內(nèi)改變循環(huán)變量的值控制循環(huán)次數(shù)8/95for循環(huán)語句i←0,sum←0i<5sum←sum+nfalsetruei++outputsuminputninti,sum,n;sum=0;for(i=0;i<5;i++){ scanf("%d",&n); sum=sum+n;}printf("%d",sum);循環(huán)次數(shù)已知,計(jì)數(shù)控制9/95【例6.1】計(jì)算并輸出1+2+3……+n的值循環(huán)次數(shù)從鍵盤輸入,計(jì)數(shù)控制sum=0的作用?10/95【例6.1】計(jì)算并輸出1+2+3……+n的值調(diào)試方法——輸出每次循環(huán)累加的結(jié)果11/95【例6.1】計(jì)算并輸出1+2+3……+n的值調(diào)試方法——輸出每次循環(huán)累加的結(jié)果12/95for循環(huán)語句計(jì)數(shù)控制——LoopiscontrolledbyacounterSyntaxfor

(表達(dá)式1;表達(dá)式2;表達(dá)式3)

語句Or

for

(表達(dá)式1;表達(dá)式2;表達(dá)式3)

{

語句1

語句2 }循環(huán)初始條件循環(huán)控制條件循環(huán)轉(zhuǎn)化條件復(fù)合語句(CompoundStatement)做循環(huán)體被當(dāng)作一條語句看待不要重復(fù)在循環(huán)體內(nèi)改變循環(huán)變量的值控制循環(huán)次數(shù)13/95for循環(huán)語句i←0,sum←0i<5sum←sum+nfalsetruei++outputsuminputninti,sum,n;sum=0;for(i=0;i<5;i++){ scanf("%d",&n); sum=sum+n;}printf("%d",sum);循環(huán)次數(shù)已知,計(jì)數(shù)控制14/95while循環(huán)語句

當(dāng)型循環(huán)——Conditionistestedfirst

Syntax語句0

while(表達(dá)式){

語句1

語句2 }真假假表達(dá)式循環(huán)初始條件循環(huán)控制條件循環(huán)轉(zhuǎn)化條件15/95do-while循環(huán)語句直到型循環(huán)——conditionistestedlastSyntax語句0do{

語句1

語句2}while(表達(dá)式);表達(dá)式假真循環(huán)初始條件循環(huán)控制條件循環(huán)轉(zhuǎn)化條件16/95【例6.1】計(jì)算并輸出1+2+3……+n的值A(chǔ)當(dāng)型循環(huán)真假假條件P假條件P

TestingConditionFirst17/95【例6.1】計(jì)算并輸出1+2+3……+n的值條件P直到型循環(huán)A假真條件PA假Testingconditionlast

循環(huán)體內(nèi)的語句至少被執(zhí)行一次18/95逗號(hào)運(yùn)算符(CommaOperator)多數(shù)情況下,并不使用整個(gè)逗號(hào)表達(dá)式的值更常見的是分別得到各表達(dá)式的值——順序求值運(yùn)算符主要用在循環(huán)語句中,同時(shí)對(duì)多個(gè)變量賦初值等

for(i=1,j=n;i<=j;i++,j--)表達(dá)式1,表達(dá)式2,…,表達(dá)式n循環(huán)初始條件循環(huán)轉(zhuǎn)化條件循環(huán)控制條件19/95【例6.2】計(jì)算并輸出

n!=1×2×3×……×n20/95#include<stdio.h>intmain(void){inti,n;longp=1;printf("Pleaseentern:");scanf("%d",&n);for(i=1;i<=n;i++){p=p*i;}

printf("%d!=%ld\n",i,p);return0;}【例6.3】計(jì)算并輸出

1!,2!,3!,……n!

把它們?nèi)悠饋砣绾危?1/95#include<stdio.h>intmain(void){inti,n;longp=1;printf("Pleaseentern:");scanf("%d",&n);for(i=1;i<=n;i++){p=p*i;

printf("%d!=%ld\n",i,p);}return0;}#include<stdio.h>intmain(void){inti,n;longsum=0,p=1;printf("Inputn:");scanf("%d",&n);for(i=1;i<=n;i++){p=p*i;sum=sum+p;}printf("1!+2!+…+%d!=%ld\n",n,sum);return0;}利用前項(xiàng)計(jì)算后項(xiàng)【例6.4】輸入n值,計(jì)算并輸出

1!+2!+3!+…+n!22/95#include<stdio.h>intmain(void){inti,j,n;longp,sum=0;printf("Inputn:");scanf("%d",&n);for(i=1;i<=n;i++){p=1;for(j=1;j<=i;j++){p=p*j;}sum=sum+p;}printf("1!+2!+…+%d!=%ld\n",n,sum);return0;}每次單獨(dú)計(jì)算累加項(xiàng)—嵌套的循環(huán)【例6.4】輸入n值,計(jì)算并輸出

1!+2!+3!+…+n!23/95111(1!)0121122(2!)133112236(3!)394112236424(4!)933…ij內(nèi)循環(huán)p:累加項(xiàng)外循環(huán)sum舊值外循環(huán)sum新值計(jì)算并輸出1!+2!+3!…+n!

#include<stdio.h>intmain(){inti,j,n;longp,sum=0;printf("Inputn:");scanf("%d",&n);for(i=1;i<=n;i++){

p=1; for(j=1;j<=i;j++) { p=p*j; } sum=sum+p;} printf("sum=%ld\n",sum);

return0;}嵌套循環(huán)的執(zhí)行過程sum=sum+1!sum=sum+2!sum=sum+3!sum=sum+4!#include<stdio.h>intmain(){

intsum=0,m;

do{ printf("Inputm:"); scanf("%d",&m); sum=sum+m;

printf("sum=%d\n",sum);

}while(m!=0); return0;}輸入數(shù)據(jù),顯示每次累加的結(jié)果,直到輸入0時(shí)為止。(循環(huán)次數(shù)未知)標(biāo)記值(SentinelValue)

標(biāo)記控制的循環(huán)25/956.4條件控制的循環(huán)只猜1次直到猜對(duì)為止最多猜10次猜多個(gè)數(shù)10次猜不對(duì)就猜下一個(gè)數(shù)猜數(shù)游戲——循序漸進(jìn)編程例6.6~例6.1026/95猜數(shù)游戲用到的庫函數(shù)隨機(jī)函數(shù)rand(),產(chǎn)生[0,RAND_MAX]間的隨機(jī)數(shù)magic=rand();#include<stdlib.h>RAND_MAX在stdlib.h中定義,不大于雙字節(jié)整數(shù)的最大值32767產(chǎn)生[0,b-1]之間的隨機(jī)數(shù)magic=rand()%b;產(chǎn)生[a,a+b-1]之間的隨機(jī)數(shù)magic=rand()%b+a;怎樣模擬計(jì)算機(jī)想一個(gè)數(shù)呢?27/95#include<stdlib.h>#include<stdio.h>

intmain(void){ intmagic;/*計(jì)算機(jī)"想"的數(shù)*/ intguess;/*人猜的數(shù)*/

magic=rand()%100+1;/*模擬計(jì)算機(jī)想一個(gè)[1,100]之間的數(shù)magic*/ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess);

if(guess>magic) {printf("Wrong!Toohigh!\n"); }

elseif(guess<magic) {printf("Wrong!Toolow!\n"); }

else

{ printf("Right!\n"); printf("Thenumberis:%d\n",magic); }return0;}例6.6只猜一次28/95#include<stdlib.h>#include<stdio.h>intmain(void){ intmagic; intguess;

int

counter;/*記錄人猜次數(shù)的計(jì)數(shù)器變量*/ magic=rand()%100+1;

counter=0;/*計(jì)數(shù)器變量count初始化為0*/

do{ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess);

counter++;/*計(jì)數(shù)器變量count加1*/ if(guess>magic) printf("Wrong!Toohigh!\n"); elseif(guess<magic) printf("Wrong!Toolow!\n");elseprintf("Right!\n");

}while(guess!=magic);

printf("counter=%d\n",counter);return0;}例6.6直到猜對(duì)為止29/95猜數(shù)游戲用到的庫函數(shù)函數(shù)rand()產(chǎn)生的是偽隨機(jī)數(shù)#include<stdio.h>#include<stdlib.h>

intmain(void){inti;for(i=0;i<10;i++){printf("%d\n",rand());}return0;}為什么每次運(yùn)行機(jī)器所想的數(shù)都是一樣呢?30/95猜數(shù)游戲用到的庫函數(shù)隨機(jī)函數(shù)srand()為函數(shù)rand()設(shè)置隨機(jī)數(shù)種子,使產(chǎn)生的隨機(jī)數(shù)“隨機(jī)化”通過鍵入隨機(jī)數(shù)種子,產(chǎn)生[1,100]之間的隨機(jī)數(shù)scanf("%u",&seed);srand(seed);magic=rand()%100+1;如何使生成的隨機(jī)數(shù)足夠隨機(jī)呢?31/95猜數(shù)游戲用到的庫函數(shù)#include<stdio.h>#include<stdlib.h>

intmain(void){ inti,j;for(i=1;i<10;i++){

srand(i);for(j=0;j<5;j++) { printf("%d\t",rand());}printf("\n");}return0;}32/95#include<stdlib.h>#include<stdio.h>intmain(void){ intmagic; intguess; intcounter;/*記錄人猜次數(shù)的計(jì)數(shù)器變量*/

unsignedint

seed;

printf("Pleaseenterseed:"); scanf("%u",&seed); srand(seed); magic=rand()%100+1; counter=0;/*計(jì)數(shù)器變量count初始化為0*/

do{ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess); counter++;/*計(jì)數(shù)器變量count加1*/ if(guess>magic) printf("Wrong!Toohigh!\n"); elseif(guess<magic) printf("Wrong!Toolow!\n");elseprintf("Right!\n"); }while(guess!=magic); printf("counter=%d\n",counter);

return0;}例6.6直到猜對(duì)為止33/95猜數(shù)游戲用到的庫函數(shù)改用系統(tǒng)時(shí)間作為隨機(jī)數(shù)種子更好

#include<time.h>

srand(time(NULL));

magic=rand()%100+1;函數(shù)time()取得系統(tǒng)時(shí)間的方法有兩種:函數(shù)參數(shù),函數(shù)返回值系統(tǒng)時(shí)間為從1970年1月1日0時(shí)0分0秒到time函數(shù)運(yùn)行的那一刻所經(jīng)過的時(shí)間的秒數(shù)使用NULL作為函數(shù)參數(shù),使其不具備相應(yīng)功能僅能從返回值取得系統(tǒng)時(shí)間,便于將函數(shù)寫到表達(dá)式中34/95#include<stdlib.h>#include<stdio.h>#include<time.h>intmain(void){ intmagic; intguess; intcounter;/*記錄人猜次數(shù)的計(jì)數(shù)器變量*/ srand(time(NULL)); magic=rand()%100+1; counter=0;/*計(jì)數(shù)器變量count初始化為0*/ do{ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess); counter++;/*計(jì)數(shù)器變量count加1*/ if(guess>magic) printf("Wrong!Toohigh!\n"); elseif(guess<magic) printf("Wrong!Toolow!\n");elseprintf("Right!\n"); }while(guess!=magic); printf("counter=%d\n",counter);return0;}例6.7直到猜對(duì)為止35/95#include<stdlib.h>#include<stdio.h>#include<time.h>intmain(void){ intmagic; intguess; intcounter;

srand(time(NULL)); magic=rand()%100+1; counter=0;

do{ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess); counter++;

if(guess>magic) printf("Wrong!Toolow!\n");

elseif(guess<magic) printf("Wrong!Toohigh!\n");

elseprintf("Right!\n");

}while(guess!=magic); printf("counter=%d\n",counter);

return0;}例6.7直到猜對(duì)為止錯(cuò)在哪里?36/95#include<stdlib.h>#include<stdio.h>#include<time.h>intmain(void){ intmagic; intguess; intcounter; srand(time(NULL)); magic=rand()%100+1;

printf("magic=%d\n",magic); counter=0;

do{ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess); counter++;

if(guess>magic) printf("Wrong!Toolow!\n");

elseif(guess<magic) printf("Wrong!Toohigh!\n");

else

printf("Right!\n"); }while(guess!=magic); printf("counter=%d\n",counter);

return0;}插入打印語句例6.7直到猜對(duì)為止37/95#include<stdlib.h>#include<stdio.h>#include<time.h>intmain(void){ intmagic; intguess; intcounter;/*記錄人猜次數(shù)的計(jì)數(shù)器變量*/ srand(time(NULL)); magic=rand()%100+1; counter=0;/*計(jì)數(shù)器變量count初始化為0*/ do{ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess); counter++;/*計(jì)數(shù)器變量count加1*/ if(guess>magic) printf("Wrong!Toohigh!\n"); elseif(guess<magic) printf("Wrong!Toolow!\n");elseprintf("Right!\n"); }while(guess!=magic&&counter<10); printf("counter=%d\n",counter);return0;}例6.8最多猜10次38/95……do{ magic=rand()%100+1; counter=0;

do{ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess); counter++; if(guess>magic) printf("Wrong!Toohigh!\n"); elseif(guess<magic) printf("Wrong!Toolow!\n"); else printf("Right!\n");

}while

(guess!=magic&&counter<10); printf("counter=%d\n",counter);

printf("Doyouwanttocontinue(Y/Nory/n)?"); scanf("%c",&reply);

}while((reply=='Y')||(reply=='y'));例6.10猜多個(gè)數(shù)猜多個(gè)數(shù),10次猜不對(duì)就猜下一個(gè),直到用戶選擇結(jié)束為止輸入非法字符會(huì)怎樣?39/95……do{ magic=rand()%100+1; counter=0;

do{ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess); counter++; if(guess>magic) printf("Wrong!Toohigh!\n"); elseif(guess<magic) printf("Wrong!Toolow!\n"); else printf("Right!\n");

}while

(guess!=magic&&counter<10); printf("counter=%d\n",counter);

printf("Doyouwanttocontinue(Y/Nory/n)?"); scanf("%c",&reply);

}while((reply=='Y')||(reply=='y'));例6.10猜多個(gè)數(shù)猜多個(gè)數(shù),10次猜不對(duì)就猜下一個(gè),直到用戶選擇結(jié)束為止printf("guess=%d\n",guess);40/95……do{ magic=rand()%100+1; counter=0;

do{ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess); counter++; if(guess>magic) printf("Wrong!Toohigh!\n"); elseif(guess<magic) printf("Wrong!Toolow!\n"); else printf("Right!\n");

}while(guess!=magic&&counter<10); printf("counter=%d\n",counter); printf("Doyouwanttocontinue(Y/Nory/n)?"); scanf("%c",&reply); }while((reply=='Y')||(reply=='y'));例6.10猜多個(gè)數(shù)scanf()返回值為正確讀入的數(shù)據(jù)項(xiàng)數(shù)如何防止非法字符輸入?清除輸入緩沖區(qū)中的錯(cuò)誤數(shù)據(jù),然后提示重新輸入

41/95累加項(xiàng)的前后項(xiàng)之間無關(guān)尋找累加項(xiàng)的計(jì)算通式

fac=fac*n; term=1.0/fac; e=e+term; e初值為1.0累加項(xiàng)的前后項(xiàng)之間有關(guān)利用前項(xiàng)計(jì)算后項(xiàng)term=term/n;e=e+term;e,term初值為1.0條件控制的循環(huán)練習(xí)(習(xí)題6.9)直到最后一項(xiàng)的絕對(duì)值小于1e-5

42/95直到最后一項(xiàng)的絕對(duì)值小于1e-5

#include<math.h>#include<stdio.h>intmain(void){ int n,count=1; doublee=1.0,term; long fac=1;

for(n=1;fabs(term)>=1e-5;n++) {

fac=fac*n; term=1.0/fac; e=e+term; count++; } printf("e=%f,count=%d\n",e,count);return0;}計(jì)算累加項(xiàng)通式先計(jì)算1!,2!,3!,…,再計(jì)算其倒數(shù)作為累加項(xiàng)term43/95直到最后一項(xiàng)的絕對(duì)值小于1e-5

#include<math.h>#include<stdio.h>intmain(void){ intn=1,count=1; doublee=1.0,term=1.0;

do{

term=term/n; e=e+term; n++; count++; }while(fabs(term)>=1e-5); printf("e=%f,count=%d\n",e,count);return0;}利用前項(xiàng)計(jì)算后項(xiàng)前后項(xiàng)關(guān)系為:term=term/n44/95直到最后一項(xiàng)的絕對(duì)值小于1e-5

#include<math.h>#include<stdio.h>intmain(void){ intn=1; doublee=1.0,term=1.0; do{

term=term/n; e=e+term; n++; }while(fabs(term)>=1e-5); printf("e=%f,n=%d\n",e,n);return0;}利用前項(xiàng)計(jì)算后項(xiàng)前后項(xiàng)關(guān)系為:term=term/n45/95直到最后一項(xiàng)的絕對(duì)值小于1e-5

#include<math.h>#include<stdio.h>intmain(void){ intn=1; doublee=1.0,term=1.0;

while(fabs(term)>=1e-5) {

term=term/n; e=e+term; n++; } printf("e=%f,n=%d\n",e,n);return0;}46/95break語句

continue語句對(duì)for、while、do-while循環(huán)進(jìn)行內(nèi)部手術(shù)6.5流程的轉(zhuǎn)移控制

break?退出一層循環(huán)或switch,轉(zhuǎn)到閉合循環(huán)之后的那一點(diǎn)continue?中斷此次循環(huán),開始下一次循環(huán)47/95n???10Pleaseentern:10↙n=10Pleaseentern:-10↙Programisover!【例6.11】演示break與continue

-10#include<stdio.h>intmain(void){ inti,n; for(i=1;i<=5;i++) { printf("Pleaseentern:"); scanf("%d",&n); if(n<0)

break; printf("n=%d\n",n); } printf("Programisover!\n");return0;}48/95n???10Pleaseentern:10↙n=10Pleaseentern:-10↙Pleaseentern:20↙n=20Pleaseentern:-20↙Pleaseentern:30↙n=30Programisover!-1020-2030#include<stdio.h>intmain(void){ inti,n; for(i=1;i<=5;i++) { printf("Pleaseentern:"); scanf("%d",&n); if(n<0)

continue; printf("n=%d\n",n); } printf("Programisover!\n");return0;}【例6.12】演示break與continue

49/95大多數(shù)for循環(huán)可以轉(zhuǎn)換為while循環(huán)但并非全部,例如當(dāng)循環(huán)體中有continue時(shí)n=0;sum=0;while(n<10){scanf("%d",&i);if(i==0)continue;sum+=i;

n++;}sum=0;for(n=0;n<10;n++){scanf("%d",&i);if(i==0)continue;sum+=i;}i為0時(shí),while循環(huán)沒有執(zhí)行n++,而for循環(huán)執(zhí)行了n++6.5流程的轉(zhuǎn)移控制

50/95語句標(biāo)號(hào)(Label)舉例error:goto語句舉例gotoerror;一般形式goto語句與語句標(biāo)號(hào)51/95韓信有一隊(duì)兵,他想知道人數(shù),便讓士兵排隊(duì)報(bào)數(shù)按從1至5報(bào)數(shù),最末一個(gè)士兵報(bào)的數(shù)為1;按從1至6報(bào)數(shù),最末一個(gè)士兵報(bào)的數(shù)為5;按從1至7報(bào)數(shù),最末一個(gè)士兵報(bào)的數(shù)為4;按從1至11報(bào)數(shù),最末一個(gè)士兵報(bào)的數(shù)為10。你知道韓信至少有多少兵嗎?設(shè)兵數(shù)為x,則x應(yīng)滿足:

x%5==1&&x%6==5&&x%7==4&&x%11==10對(duì)x從1開始試驗(yàn)窮舉法【例6.13】韓信點(diǎn)兵52/95#include<stdio.h>intmain(void){ intx;

for(x=1;x<5000;x++) { if(x%5==1&&x%6==5&&x%7==4&&x%11==10) { printf("x=%d\n",x); } }return0; }

【例6.13】韓信點(diǎn)兵錯(cuò)在哪里?53/95#include<stdio.h>intmain(void){ intx;

for(x=1;;x++) { if(x%5==1&&x%6==5&&x%7==4&&x%11==10) { printf("x=%d\n",x); } }return0; }【例6.13】韓信點(diǎn)兵錯(cuò)在哪里?54/95#include<stdio.h>intmain(void){ intx; for(x=1;;x++) { if(x%5==1&&x%6==5&&x%7==4&&x%11==10) { printf("x=%d\n",x);

gotoEND;

} }END:;

return0;}標(biāo)號(hào)后面必須有語句,空語句在這里再次發(fā)揮作用【例6.13】韓信點(diǎn)兵55/95#include<stdio.h>intmain(void){ intx;

for(x=1;;x++) { if(x%5==1&&x%6==5&&x%7==4&&x%11==10) { printf("x=%d\n",x);

break;

} }return0; }break本質(zhì)上是受限的goto【例6.13】韓信點(diǎn)兵56/95#include<stdio.h>#include<stdlib.h>intmain(void){ intx;

for(x=1;;x++) { if(x%5==1&&x%6==5&&x%7==4&&x%11==10) { printf("x=%d\n",x);

exit(0);

} } return0;}標(biāo)準(zhǔn)庫函數(shù),作用是終止整個(gè)程序的執(zhí)行,強(qiáng)制返回操作系統(tǒng)【例6.13】韓信點(diǎn)兵57/95#include<stdio.h>intmain(void){ intx;

intfind=0;/*置找到標(biāo)志變量為假*/ for(x=1;!find;x++) { if(x%5==1&&x%6==5&&x%7==4&&x%11==10) { printf("x=%d\n",x);

find=1;/*置找到標(biāo)志變量為真*/

} }return0; }使用標(biāo)志變量使程序可讀性更好【例6.13】韓信點(diǎn)兵58/95#include<stdio.h>intmain(void){ intx=1; intfind=0;/*置找到標(biāo)志變量為假*/

while(!find) { if(x%5==1&&x%6==5&&x%7==4&&x%11==10) { printf("x=%d\n",x); find=1;/*置找到標(biāo)志變量為真*/

x++;

} }return0; }【例6.13】韓信點(diǎn)兵錯(cuò)在哪里?59/95#include<stdio.h>intmain(void){ intx=1; intfind=0;/*置找到標(biāo)志變量為假*/

while(!find) { if(x%5==1&&x%6==5&&x%7==4&&x%11==10) { printf("x=%d\n",x); find=1;/*置找到標(biāo)志變量為真*/

}

x++;

}return0; }【例6.13】韓信點(diǎn)兵60/95#include<stdio.h>intmain(void){ intx=1; intfind=0;/*置找到標(biāo)志變量為假*/

do{

find=(x%5==1&&x%6==5&&x%7==4&&x%11==10);

x++; }while(!find);

printf("x=%d\n",x);return0;}【例6.13】韓信點(diǎn)兵錯(cuò)在哪里?61/95#include<stdio.h>intmain(void){ intx=0; intfind=0;/*置找到標(biāo)志變量為假*/

do{

x++;

find=(x%5==1&&x%6==5&&x%7==4&&x%11==10); }while(!find);

printf("x=%d\n",x);return0;}【例6.13】韓信點(diǎn)兵62/95#include<stdio.h>intmain(void){ intx=0;

do{

x++; }while(!(x%5==1&&x%6==5&&x%7==4&&x%11==10)); printf("x=%d\n",x);return0;}【例6.13】韓信點(diǎn)兵63/956.6本章擴(kuò)充內(nèi)容結(jié)構(gòu)化程序設(shè)計(jì)(StructuredProgramming)1965年,最早由E.W.Dijkstra在一次國際會(huì)議上提出1966年,C.Bohm和G.Jacopini首先證明了:只用順序、選擇、循環(huán)三種基本的控制結(jié)構(gòu)就能實(shí)現(xiàn)任何單入口、單出口的程序給結(jié)構(gòu)化程序設(shè)計(jì)奠定了基礎(chǔ)1971年,IBM公司的Mills提出:程序應(yīng)該只有一個(gè)入口和一個(gè)出口進(jìn)一步補(bǔ)充了結(jié)構(gòu)化程序的規(guī)則64/956.6本章擴(kuò)充內(nèi)容目前,還沒有一個(gè)嚴(yán)格的定義1974年,D.Gries教授將已有的對(duì)結(jié)構(gòu)化程序設(shè)計(jì)的不同解釋歸納為13種。一個(gè)比較流行的定義是:結(jié)構(gòu)化程序設(shè)計(jì)是一種進(jìn)行程序設(shè)計(jì)的原則和方法它避免使用goto語句采用“自頂向下、逐步求精”方法進(jìn)行程序設(shè)計(jì)按照這種原則和方法設(shè)計(jì)出的程序的特點(diǎn)為:結(jié)構(gòu)清晰容易閱讀容易修改容易驗(yàn)證65/95START_LOOP:if(fStatusOk){

if(fDataAvaiable){i=10;

gotoMID_LOOP;}else

{

gotoEND_LOOP;}}else

{

for(i=0;i<100;i++){MID_LOOP://lotsofcodehere}

gotoSTART_LOOP;}END_LOOP:糟糕的

goto語句這樣使用goto使程序迅速退化為垃圾代碼但goto不是天生的魔鬼66/95用goto語句跳向共同的出口位置voidInit(void){

char*p1=NULL;

char*p2=NULL;

char*p3=NULL; p1=(char*)malloc(256);

if(p1==NULL)

goto

Exit;

p2=(char*)malloc(256);

if(p2==NULL)

goto

Exit;

p3=(char*)malloc(256);

if(p3==NULL)

goto

Exit;

/*正常處理的代碼*/Exit:

if(p1!=NULL)

free(p1);

if(p2!=NULL)free(p2);if(p3!=NULL)

free(p3);

return;}混亂根源不在goto語句,而在語句標(biāo)號(hào)某些情況下使用goto語句使程序更清晰67/95Evilgoto’s?MaybeNot…

凌波微步,未必摔跤兩種適合使用goto語句的情況跳向共同的出口位置,進(jìn)行退出前的處理工作跳出多重循環(huán)的一條捷徑{…{…{…gotoerror;}}}68/95結(jié)構(gòu)化程序設(shè)計(jì)不能簡單地認(rèn)為避免使用goto語句的程序設(shè)計(jì)方法就是結(jié)構(gòu)化程序設(shè)計(jì)方法結(jié)構(gòu)化程序設(shè)計(jì)關(guān)注的焦點(diǎn)程序結(jié)構(gòu)的好壞有無goto語句,并不是程序結(jié)構(gòu)好壞的標(biāo)志限制和避免使用goto語句,只是得到結(jié)構(gòu)化程序的一種手段,而不是目的69/95結(jié)構(gòu)化程序設(shè)計(jì)如何獲得好結(jié)構(gòu)的程序?采用順序、選擇和循環(huán)三種基本結(jié)構(gòu)作為程序設(shè)計(jì)的基本單元只有一個(gè)入口只有一個(gè)出口無死語句,即不存在永遠(yuǎn)執(zhí)行不到的語句無死循環(huán),即不存在永遠(yuǎn)執(zhí)行不完的循環(huán)70/95打印華氏溫度與攝氏溫度對(duì)照表計(jì)算公式:C=(5/9)(F-32)代碼風(fēng)格(CodingStytle)71/95代碼風(fēng)格(CodingStytle)#include<stdio.h>/*對(duì)fahr=0,20,...,300

打印華氏溫度與攝氏溫度對(duì)照表*/main(){

int

fahr,celsius;

int

lower,upper,step;

lower=0;/*溫度表的下限*/

upper=300;

/*溫度表的上限*/

step=20;/*步長*/

fahr

=lower;

while(fahr<=upper)

{

celsius=5*(fahr

-

32)/9;

printf("%d\t%d\n",fahr,celsius);

fahr=fahr+step;

}}代碼風(fēng)格是一種習(xí)慣目標(biāo)是讓代碼整潔,層次清晰,增強(qiáng)可讀性,可維護(hù)性程序版式—程序員的書法1良好的注釋;2整齊的縮進(jìn)(梯形層次)3適當(dāng)?shù)目招蟹指舳温洌?見名知義的變量命名5行內(nèi)空格,單行清晰度6每行最多有一條語句72/95如果沒有代碼風(fēng)格,…#include<stdio.h>main(){int

fahr,celsius;int

lower,upper,step;lower=0;upper=300;step=20;fahr=lower;while(fahr<=upper){celsius=5*(fahr-32)/9;printf("%d\t%d\n",fahr,celsius);fahr=fahr+step;}}73/95代碼風(fēng)格(CodingStytle)現(xiàn)在的許多開發(fā)環(huán)境、編輯軟件都支持自動(dòng)縮進(jìn)根據(jù)用戶代碼的輸入,智能判斷應(yīng)該縮進(jìn)還是反縮進(jìn),替用戶完成調(diào)整縮進(jìn)的工作VC中有自動(dòng)整理程序版式的功能只要選取需要的代碼,按ALT+F8就能自動(dòng)整理成微軟的cpp文件格式74/95程序改錯(cuò)程序改錯(cuò)是個(gè)大悲大喜的過程,一天之內(nèi)可以讓人在悲傷的低谷和喜悅的巔峰之間跌宕起伏如果改過了成千上萬個(gè)錯(cuò)誤,……改錯(cuò)的第一步是找出錯(cuò)誤的根源,然后對(duì)癥下藥很像偵破案件,有壞事發(fā)生了,而僅有的信息是它的確發(fā)生了必須從結(jié)果出發(fā),逆向思考75/95程序改錯(cuò)程序改錯(cuò)的難點(diǎn)在于癥狀和根源可能相隔很遠(yuǎn)有人問阿凡提:“我肚子疼,該用什么藥?”癥狀可能在另一個(gè)錯(cuò)誤被糾正后暫時(shí)消失時(shí)隱時(shí)現(xiàn),沒有明顯癥狀很難產(chǎn)生完全一樣的輸入條件,難以恢復(fù)“錯(cuò)誤的現(xiàn)場”編譯器不能自動(dòng)發(fā)現(xiàn),在程序運(yùn)行時(shí)才能捕捉到76/95程序改錯(cuò)——例6.15利用前100項(xiàng)之積,計(jì)算

的值#include<stdio.h>intmain(void){

double

term,result=1; intn; for(n=2;n<=100;n=n+2)

{ term=(n*n)/((n-1)*(n+1)); result=result*term; } printf("pi=%f\n",2*result);return0;}VC6.0和CB下運(yùn)行不顯示任何警告信息77/95程序改錯(cuò)——例6.15利用前100項(xiàng)之積,計(jì)算

的值#include<stdio.h>intmain(void){

double

term,result=1; intn; for(n=2;n<=100;n=n+2)

{ term=(n*n)/((n-1)*(n+1));

pr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論