版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、結(jié)構(gòu)化程序設(shè)計(jì)(PartI)課件結(jié)構(gòu)化程序設(shè)計(jì)(PartI)課件提要順序結(jié)構(gòu)選擇結(jié)構(gòu)循環(huán)結(jié)構(gòu)2程序設(shè)計(jì)-2005年秋提要順序結(jié)構(gòu)4程序設(shè)計(jì)-2005年秋語(yǔ)句分類C語(yǔ)言的語(yǔ)句可分兩類簡(jiǎn)單語(yǔ)句結(jié)構(gòu)語(yǔ)句簡(jiǎn)單語(yǔ)句:表達(dá)式語(yǔ)句、空語(yǔ)句和控制轉(zhuǎn)移語(yǔ)句結(jié)構(gòu)語(yǔ)句:實(shí)現(xiàn)對(duì)成分語(yǔ)句的順序、選擇和循環(huán)等控制3程序設(shè)計(jì)-2005年秋語(yǔ)句分類C語(yǔ)言的語(yǔ)句可分兩類5程序設(shè)計(jì)-2005年秋什么是順序結(jié)構(gòu)?順序結(jié)構(gòu)描述一個(gè)計(jì)算操作序列,表示從序列的第一個(gè)計(jì)算開(kāi)始,順序執(zhí)行序列中的每個(gè)計(jì)算,直至計(jì)算操作序列的最后一個(gè)計(jì)算操作在C程序中,順序執(zhí)行的語(yǔ)句序列,用花括號(hào)括住,就構(gòu)成C語(yǔ)言的復(fù)合語(yǔ)句在邏輯上,復(fù)合語(yǔ)句是單個(gè)語(yǔ)句,常用作
2、其它結(jié)構(gòu)的成分語(yǔ)句4程序設(shè)計(jì)-2005年秋什么是順序結(jié)構(gòu)?順序結(jié)構(gòu)描述一個(gè)計(jì)算操作序列,表示從序列的第例子為交換變量x、y的值,可表示為以下順序執(zhí)行的三個(gè)計(jì)算:temp = x; /* 將x的值保護(hù)到變量temp */x = y; /* 變量x置y值 */y = temp; /* 變量y置temp的值 */若把交換變量x、y的值作為一個(gè)不可分割的整體來(lái)考慮,應(yīng)把它們寫(xiě)成復(fù)合語(yǔ)句: /* 本復(fù)合語(yǔ)句要求外面為它定義temp變量 */ temp = x ; x = y ; y = temp ; 5程序設(shè)計(jì)-2005年秋例子為交換變量x、y的值,可表示為以下順序執(zhí)行的三個(gè)計(jì)算:7關(guān)于復(fù)合語(yǔ)句在構(gòu)造復(fù)
3、合語(yǔ)句時(shí),為完成復(fù)合語(yǔ)句要做的工作,可能需要臨時(shí)工作變量。如前例中的temp變量在C語(yǔ)言的復(fù)合語(yǔ)句中,在語(yǔ)句序列之前可以插入變量定義,引入只有復(fù)合語(yǔ)句內(nèi)的語(yǔ)句可使用的臨時(shí)變量。如上面的例子改寫(xiě)成以下形式,從邏輯上,它的獨(dú)立性更強(qiáng),它不再要求外面為它定義專用變量 int temp ; /* 定義自己專用的臨時(shí)變量 */ temp = x ; x = y ; y = temp ;在很多場(chǎng)合,復(fù)合語(yǔ)句內(nèi)會(huì)包含其它結(jié)構(gòu)6程序設(shè)計(jì)-2005年秋關(guān)于復(fù)合語(yǔ)句在構(gòu)造復(fù)合語(yǔ)句時(shí),為完成復(fù)合語(yǔ)句要做的工作,可能選擇結(jié)構(gòu)與if語(yǔ)句選擇結(jié)構(gòu)可分為兩路選擇結(jié)構(gòu)和多路選擇結(jié)構(gòu)if語(yǔ)句是一種選擇結(jié)構(gòu),它根據(jù)給定的作為選擇
4、條件的表達(dá)式值為非0或?yàn)?兩種情況,從兩個(gè)供選擇的成分語(yǔ)句中自動(dòng)選取一個(gè)成分語(yǔ)句執(zhí)行if語(yǔ)句用于描述按條件作兩路選擇的程序結(jié)構(gòu)7程序設(shè)計(jì)-2005年秋選擇結(jié)構(gòu)與if語(yǔ)句選擇結(jié)構(gòu)可分為兩路選擇結(jié)構(gòu)和多路選擇結(jié)構(gòu)9if語(yǔ)句if語(yǔ)句的一般形式為 if ( 表達(dá)式 ) 語(yǔ)句1 else 語(yǔ)句2if語(yǔ)句的執(zhí)行過(guò)程是計(jì)算表達(dá)式的值測(cè)試表達(dá)式的值并選擇執(zhí)行語(yǔ)句。若表達(dá)式的值非0,則執(zhí)行語(yǔ)句1,并結(jié)束if語(yǔ)句;否則執(zhí)行語(yǔ)句2,并結(jié)束if語(yǔ)句8程序設(shè)計(jì)-2005年秋if語(yǔ)句if語(yǔ)句的一般形式為10程序設(shè)計(jì)-2005年秋if語(yǔ)句(續(xù))無(wú)論條件表達(dá)式的值為何值,只能執(zhí)行語(yǔ)句1或語(yǔ)句2中的一個(gè)當(dāng)if語(yǔ)句中的else后
5、的語(yǔ)句2為空語(yǔ)句時(shí),可簡(jiǎn)寫(xiě)成: if ( 表達(dá)式 ) 語(yǔ)句這種形式的if語(yǔ)句的執(zhí)行過(guò)程是計(jì)算表達(dá)式的值測(cè)試表達(dá)式的值。若表達(dá)式的值非0,則執(zhí)行它的成分語(yǔ)句,并結(jié)束if語(yǔ)句。否則立即結(jié)束if語(yǔ)句9程序設(shè)計(jì)-2005年秋if語(yǔ)句(續(xù))無(wú)論條件表達(dá)式的值為何值,只能執(zhí)行語(yǔ)句1或語(yǔ)句例子if (a b) printf(MAX = %fn, a); else printf(MAX = %fn, b);if(a != 0 & x/a 0.5) printf(”a != 0 & x/a 0.5n”);if (x+y) printf(”x + y != 0n”);if (!x) printf(“x = 0n”
6、);if (ch = A & ch = Z) ch = ch + a A;if ( a b) 12程序設(shè)計(jì)-2005年秋if語(yǔ)句(續(xù))if語(yǔ)句中的語(yǔ)句、語(yǔ)句1和語(yǔ)句2可以是任何語(yǔ)句當(dāng)它們中的某一個(gè)需用語(yǔ)句序列描述時(shí),必須將這語(yǔ)句序列寫(xiě)成復(fù)合語(yǔ)句當(dāng)它們中的某一個(gè)又是if語(yǔ)句時(shí),就呈現(xiàn)嵌套的if語(yǔ)句形式11程序設(shè)計(jì)-2005年秋if語(yǔ)句(續(xù))if語(yǔ)句中的語(yǔ)句、語(yǔ)句1和語(yǔ)句2可以是任何語(yǔ)句例子已知三角形的三條邊長(zhǎng)a、b、c,求三角形面積if ( a + b c & b + c a & c + a b ) float s ; /* 必須構(gòu)成復(fù)合語(yǔ)句 */ s = ( a + b + c ) / 2.0
7、 ; area = sqrt(s*(s-a)*(s-b)*(s-c); else area = 0.0 ;12程序設(shè)計(jì)-2005年秋例子已知三角形的三條邊長(zhǎng)a、b、c,求三角形面積if ( a例子 if (score = 90) /* 按得分輸出適當(dāng)信息 */ printf(Excellent.n) ; else if( score 60 ) /* 嵌套的if語(yǔ)句 */ printf(Dismal.n) ; else printf(Typical.n);13程序設(shè)計(jì)-2005年秋例子 15程序設(shè)計(jì)-2005年秋if語(yǔ)句(續(xù))因if語(yǔ)句中供選擇的語(yǔ)句也可以又是if語(yǔ)句,這時(shí),if語(yǔ)句呈嵌套的結(jié)構(gòu)
8、形式,應(yīng)注意else與if的對(duì)應(yīng)關(guān)系if ( 表達(dá)式1 ) if ( 表達(dá)式1 ) if ( 表達(dá)式2 ) if ( 表達(dá)式2 ) 語(yǔ)句1 語(yǔ)句1 else else 語(yǔ)句2 語(yǔ)句214程序設(shè)計(jì)-2005年秋if語(yǔ)句(續(xù))因if語(yǔ)句中供選擇的語(yǔ)句也可以又是if語(yǔ)句,這if語(yǔ)句(續(xù))C語(yǔ)言約定:else總是與它前面最接近的if對(duì)應(yīng)if(表達(dá)式1)/* 將分支語(yǔ)句變成一個(gè)復(fù)合語(yǔ)句 */ if (表達(dá)式2) 語(yǔ)句1 else 語(yǔ)句2if (表達(dá)式1) if (表達(dá)式2) 語(yǔ)句1 else ; /* 這里有1個(gè)空語(yǔ)句 */else 語(yǔ)句215程序設(shè)計(jì)-2005年秋if語(yǔ)句(續(xù))C語(yǔ)言約定:else總是
9、與它前面最接近的if對(duì)if語(yǔ)句(續(xù))為了正確書(shū)寫(xiě)if語(yǔ)句,需要說(shuō)明以下幾點(diǎn)若if語(yǔ)句中的語(yǔ)句、語(yǔ)句1、語(yǔ)句2是一個(gè)簡(jiǎn)單語(yǔ)句,則這些簡(jiǎn)單語(yǔ)句之后會(huì)有一個(gè)分號(hào),這是C語(yǔ)言對(duì)這些簡(jiǎn)單語(yǔ)句的要求若if語(yǔ)句中的語(yǔ)句、語(yǔ)句1、語(yǔ)句2要用語(yǔ)句序列(即為順序結(jié)構(gòu))來(lái)實(shí)現(xiàn),則必須將它們改寫(xiě)成復(fù)合語(yǔ)句,即邏輯上把它們變成一個(gè)語(yǔ)句在if語(yǔ)句中,每個(gè)else總要與它前面的if對(duì)應(yīng),不可出現(xiàn)沒(méi)有對(duì)應(yīng)if的else16程序設(shè)計(jì)-2005年秋if語(yǔ)句(續(xù))為了正確書(shū)寫(xiě)if語(yǔ)句,需要說(shuō)明以下幾點(diǎn)18程例子輸入三個(gè)整數(shù),輸出其中的最大數(shù)#include void main() int a, b, c, max; printf(
10、輸入三個(gè)整數(shù)n); scanf(%d%d%d, &a, &b, &c); max = a; if (max b) max = b; if (max c) max = c; printf(最大數(shù)是 %dn, max);17程序設(shè)計(jì)-2005年秋例子輸入三個(gè)整數(shù),輸出其中的最大數(shù)#include st輸入三個(gè)整數(shù),按值從大到小的順序輸出它們例子X(jué) Y ZX1=Max(X,Y) Y1=Min(X, Y) Z1=Z輸入:X2=Max(X1,Z1) Y2=Y1 Z2=Min(X1, Z1)X3=X2 Y3=Min(Y2, Z2) Z3=Min(Y2,Z2)第一步:第二步:第三步:#include voi
11、d main() int x, y, z, temp; printf(Enter x, y, z.n); scanf(%d%d%d, &x, &y, &z); if (x y) temp = x; x = y; y = temp; if (x z) temp = x; x = z; z = temp; if (y z) temp = y; y = z; z = temp; printf(%dt%dt%dn, x, y, z);18程序設(shè)計(jì)-2005年秋輸入三個(gè)整數(shù),按值從大到小的順序輸出它們例子X(jué) #include void main( ) int x, y, z, *big = &x, *m
12、id = &y, *sma = &z, *temp; printf(輸入x,y,z.n); scanf(%d%d%d,big,mid,sma); if (*big*mid) temp = big; big = mid; mid = temp; if (*big*sma) temp = big; big = sma; sma = temp; if (*mid*sma) temp = mid; mid = sma; sma = temp; printf(%dt%dt%dn, x, y, z); printf(%dt%dt%dn, *big, *mid, *sma); 19程序設(shè)計(jì)-2005年秋#i
13、nclude 21程序設(shè)計(jì)-20求一元二次方程的根 設(shè)一元二次方程為ax2+bx+c=0,方程系數(shù)a、b和c從鍵盤(pán)輸入。對(duì)任意的系數(shù)a、b、c,有以下幾種情況需要考慮:a0。方程有兩個(gè)根a=0,b0。方程退化為一次方程b*x+c=0。方程有根 -c/ba=0,b=0。方程或?yàn)橥x反復(fù)(c=0),或矛盾(c0)。由以上分析得到以下程序結(jié)構(gòu): (1) 輸入方程系數(shù)a, b, c; if (a != 0.0) (2)求兩個(gè)根; else if (b != 0.0) (3) 輸出方程根 -c/b; else if (c = 0) (4)輸出方程同義反復(fù)字樣; else (5)輸出方程矛盾字樣;20程序
14、設(shè)計(jì)-2005年秋求一元二次方程的根22程序設(shè)計(jì)-2005年秋用C代碼描述其中計(jì)算步驟 (1)、(3)、(4)、(5)是簡(jiǎn)單的事情。對(duì)于計(jì)算步驟(2),由代數(shù)知識(shí),方程根椐判別式 =b*b-4*a*c大于等于0或小于0,分別有兩個(gè)實(shí)根或復(fù)根: root1,2 = ( - b )/2a , 0;或 root1,2 = ( - b -i)/2a , 4*a*c時(shí),有一個(gè)根就非常接近零。數(shù)值計(jì)算中,兩個(gè)非常接近的數(shù)執(zhí)行減法求出的值的精度很低。為此先求出一個(gè)絕對(duì)值大的根root1。然后,利用根與系數(shù)的關(guān)系 root2 = c/(a*root1)求出root221程序設(shè)計(jì)-2005年秋用C代碼描述其中計(jì)
15、算步驟 (1)、(3)、(4)、(5)是簡(jiǎn)#include #include /* 使用數(shù)學(xué)庫(kù)函數(shù) */void main() double a, b, c, delta, re, im, root1, root2; printf(輸入方程系數(shù)a,b,cn); scanf(%lf%lf%lf, &a, &b, &c); if (a != 0.0) /* 有兩個(gè)根 */ delta = b*b-4.0*a*c; re = -b/(2.0*a); im = sqrt(fabs(delta)/(2.0*a); if (delta = 0.0)/* 兩個(gè)實(shí)根, 先求絕對(duì)值大的根*/ root1 = r
16、e + (b 0.0 ? im : -im); root2 = c/(a*root1); printf(“兩實(shí)根是: %7.5f, %7.5fn, root1, root2); 22程序設(shè)計(jì)-2005年秋#include 24程序設(shè)計(jì)-200 else /* delta 0.0 */ printf(兩復(fù)根 %7.5f+%7.5fi,%7.5f-%7.5fin, re, fabs(im), re, fabs(im); else /* a = 0.0 */ if (b != 0.0) printf(單根 %7.5fn, -c/b); else if (!c) printf(方程同義反復(fù).n); e
17、lse printf(“方程矛盾。n”); 23程序設(shè)計(jì)-2005年秋 else /* delta 0.0 */ 2switch語(yǔ)句C語(yǔ)言提供switch語(yǔ)句用于描述多路選擇情況,其形式是:switch(表達(dá)式) case 常量表達(dá)式1: 語(yǔ)句序列1 ; case 常量表達(dá)式2: 語(yǔ)句序列2 ; . case 常量表達(dá)式n: 語(yǔ)句序列n ; default : 語(yǔ)句序列n+1 ; 24程序設(shè)計(jì)-2005年秋switch語(yǔ)句C語(yǔ)言提供switch語(yǔ)句用于描述多路選擇情switch語(yǔ)句(續(xù))switch語(yǔ)句的執(zhí)行過(guò)程先計(jì)算表達(dá)式值,以該值與各常量比較,如果表達(dá)式的值等于某個(gè)常量,switch語(yǔ)句就
18、從該常量后的語(yǔ)句序列開(kāi)始執(zhí)行,如沒(méi)有執(zhí)行轉(zhuǎn)出該switch語(yǔ)句的語(yǔ)句(如break語(yǔ)句),自動(dòng)進(jìn)入下一個(gè)常量后的語(yǔ)句序列繼續(xù)執(zhí)行?;驁?zhí)行完最后一個(gè)語(yǔ)句序列,或執(zhí)行了轉(zhuǎn)出該switch語(yǔ)句的語(yǔ)句,就結(jié)束switch語(yǔ)句執(zhí)行如果沒(méi)有相匹配的常量,就從以default為情況前綴的語(yǔ)句序列開(kāi)始執(zhí)行。如果也沒(méi)有default情況前綴,則立即結(jié)束switch語(yǔ)句25程序設(shè)計(jì)-2005年秋switch語(yǔ)句(續(xù))switch語(yǔ)句的執(zhí)行過(guò)程27程序設(shè)switch語(yǔ)句(續(xù))在C中,“case常量表達(dá)式”只是起語(yǔ)句序列入口位置的作用在執(zhí)行switch語(yǔ)句時(shí),根據(jù)switch后的表達(dá)式值找到與該值匹配的入口位置,就從
19、此入口處開(kāi)始執(zhí)行,只要未遇到轉(zhuǎn)出該switch語(yǔ)句的break語(yǔ)句或goto語(yǔ)句,就一直向下執(zhí)行,也不再理會(huì)與經(jīng)過(guò)的別的case后的常量值不匹配的情況26程序設(shè)計(jì)-2005年秋switch語(yǔ)句(續(xù))在C中,“case常量表達(dá)式”只是起語(yǔ)switch語(yǔ)句(續(xù))對(duì)switch語(yǔ)句需說(shuō)明以下幾點(diǎn)switch后面括號(hào)內(nèi)的表達(dá)式只限于是整型表達(dá)式或字符型表達(dá)式或枚舉型表達(dá)式case后的常量表達(dá)式稱為情況前綴,要求所有常量表達(dá)式的值互不相同,并與switch后面括號(hào)內(nèi)的表達(dá)式值的類型相一致語(yǔ)句序列由任意條合法的C構(gòu)成,也可以沒(méi)有語(yǔ)句情況前綴default可以缺省,但至多出現(xiàn)一次,習(xí)慣總是將它寫(xiě)在全部情況前
20、綴之后,如有必要也可寫(xiě)在某case之前27程序設(shè)計(jì)-2005年秋switch語(yǔ)句(續(xù))對(duì)switch語(yǔ)句需說(shuō)明以下幾點(diǎn)29例子 char choice; printf(Enter choice !(A, B, C, .n); scanf(%c, &choice); switch (choice) case A : printf( A chosen!n); break; case B : printf( B chosen!n); break; case C : printf( C chosen!n); break; default : printf(default chosen!n); char
21、 choice; printf(Enter choice !(A, B, C, .n); scanf(%c, &choice); switch (choice) case A : printf( A chosen!n); case B : printf( B chosen!n); case C : printf( C chosen!n); default : printf(default chosen!n); 28程序設(shè)計(jì)-2005年秋例子 char choice; char choice;30例子int w_con; /* 天氣情況變量定義 */printf(天氣如何? 1:晴天, 2:多云
22、, 3:下雨 );scanf(%d,&w_con);switch (w_con) case 1 : printf(上街購(gòu)物!n); break; case 2 : printf(去游泳!n); break; case 3 : printf(在家看電視!n);break; default: printf(錯(cuò)誤選擇!n); 29程序設(shè)計(jì)-2005年秋例子int w_con; /* 天氣情況變量定義 */31例子按照考試成績(jī)的等級(jí)打印出百分制分?jǐn)?shù)switch(grade) caseaprintf(85100n);break; casebprintf(7084n); break; casecprint
23、f(6069n); break; caseDprintf(60n); break; defaultprintf(errorn);30程序設(shè)計(jì)-2005年秋例子按照考試成績(jī)的等級(jí)打印出百分制分?jǐn)?shù)switch(grad例子由于switch語(yǔ)句的表達(dá)式不允許是實(shí)型的,當(dāng)應(yīng)用于實(shí)型值選擇情況時(shí),通常需作以下處理:將實(shí)表達(dá)式乘上一個(gè)適當(dāng)?shù)谋壤蜃?,將?shí)表達(dá)式的值映照到一個(gè)較小的范圍上,然后再將它轉(zhuǎn)換到整型教材上的例子,用(income-1)/200轉(zhuǎn)換31程序設(shè)計(jì)-2005年秋例子由于switch語(yǔ)句的表達(dá)式不允許是實(shí)型的,當(dāng)應(yīng)用于實(shí)型switch (int)(income-1.0)/200.0) ca
24、se 0: case 1: case 2: tax = income*0.15; break; case 3: case 4: tax = income*0.19-24; break; case 5: case 6: tax = income*0.23-64; break; case 7: case 8: tax = income*0.28-134; break; case 9: tax = income*0.35-260; break; default: tax = income*0.43-420;(0,600(600,1000(1000,1400(1400,1800(1800,2000(2
25、000,+32程序設(shè)計(jì)-2005年秋switch (int)(income-1.0)/200循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)主要由一個(gè)稱為循環(huán)條件的表達(dá)式和一個(gè)稱為循環(huán)體的要循環(huán)執(zhí)行的語(yǔ)句組成C語(yǔ)言提供描述三種不同的循環(huán)結(jié)構(gòu)的語(yǔ)句while語(yǔ)句do_while語(yǔ)句for語(yǔ)句33程序設(shè)計(jì)-2005年秋循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)主要由一個(gè)稱為循環(huán)條件的表達(dá)式和一個(gè)稱為循環(huán)while語(yǔ)句while語(yǔ)句用來(lái)描述while型循環(huán)結(jié)構(gòu)while語(yǔ)句的一般形式為: while (表達(dá)式) 語(yǔ)句; or 復(fù)合語(yǔ)句;34程序設(shè)計(jì)-2005年秋while語(yǔ)句while語(yǔ)句用來(lái)描述while型循環(huán)結(jié)構(gòu)36while語(yǔ)句while語(yǔ)句的執(zhí)行過(guò)
26、程是(1)計(jì)算while之后的表達(dá)式的值(2)測(cè)試表達(dá)式的值,當(dāng)值為非0時(shí),轉(zhuǎn)步驟(3);如值為0,則結(jié)束while語(yǔ)句(3)執(zhí)行while語(yǔ)句的循環(huán)體,并轉(zhuǎn)步驟(1)35程序設(shè)計(jì)-2005年秋while語(yǔ)句while語(yǔ)句的執(zhí)行過(guò)程是37程序設(shè)計(jì)-2 while造句入口 while (表達(dá)式) 非0 0 語(yǔ)句 while語(yǔ)句出口 while語(yǔ)句執(zhí)行過(guò)程示意圖 while語(yǔ)句36程序設(shè)計(jì)-2005年秋while語(yǔ)句38程序設(shè)計(jì)-2005年秋例子求s = 1 + 2 + 3 + + 100 s = 0; i = 1; while (i = 100) s += i; i+; s = 0; i = 0
27、; while (i 100) s += +i;37程序設(shè)計(jì)-2005年秋例子求s = 1 + 2 + 3 + + 100 s =如用以下代碼實(shí)現(xiàn)跳過(guò)輸入的空白類字符: while(c = getchar()= |c=n|c=t) ; 代碼說(shuō)明當(dāng)循環(huán)體為空時(shí),用空語(yǔ)句代替為使while語(yǔ)句的執(zhí)行能正常結(jié)束,控制循環(huán)條件的變量應(yīng)在循環(huán)體內(nèi)被更新,使表達(dá)式的值會(huì)變?yōu)? 有時(shí),很難寫(xiě)出循環(huán)條件,可用1代之,而在循環(huán)體中有當(dāng)條件滿足時(shí),執(zhí)行break語(yǔ)句,跳出循環(huán)。如: while (1) . if (表達(dá)式) break; . while語(yǔ)句38程序設(shè)計(jì)-2005年秋如用以下代碼實(shí)現(xiàn)跳過(guò)輸入的空白類
28、字符:while語(yǔ)句40程例子問(wèn)題:輸入學(xué)生成績(jī),求平均成績(jī)。約定當(dāng)輸入負(fù)數(shù)時(shí),表示輸入結(jié)束方法:采用成績(jī)逐個(gè)輸入、累計(jì)總分和計(jì)數(shù)學(xué)生人數(shù)的方法,直到輸入成績(jī)是負(fù)數(shù)時(shí)循環(huán)結(jié)束,然后求出平均成績(jī),并輸出39程序設(shè)計(jì)-2005年秋例子問(wèn)題:輸入學(xué)生成績(jī),求平均成績(jī)。約定當(dāng)輸入負(fù)數(shù)時(shí),表示輸#include void main() int sum, count, mark; sum = 0; count = 0; while (1) /* 循環(huán)條件永遠(yuǎn)為真 */ printf(輸入成績(jī)(小于0結(jié)束)n); scanf(%d, &mark); if (mark 0) break; /* 跳出while
29、循環(huán) */ sum += mark; count+; if(count) printf(平均成績(jī)?yōu)?%.2fn, (float)sum)/count); else printf(沒(méi)有數(shù)據(jù)輸入.n);40程序設(shè)計(jì)-2005年秋#include 42程序設(shè)計(jì)-2例子: 統(tǒng)計(jì)輸入字符行中,空白類字符、數(shù)字符和其它字符的個(gè)數(shù)。#include void main() int c, nwhite, nother, ndigit; nwhite=nother=ndigit=0; printf(“輸入字符行n”); while (c = getchar() != n) switch ( c ) case 0
30、: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: ndigit+; break; case : case t: nwhite+; break; default: nother+; break; printf(”digit = %dtwhite space = %dtother = %dn”, ndigit, nwhite, nother);41程序設(shè)計(jì)-2005年秋例子: 統(tǒng)計(jì)輸入字符行中,空白類字符、數(shù)字符和其它字符的個(gè)數(shù)例子問(wèn)題:為使電文保密,往往按一定規(guī)律將其轉(zhuǎn)換成密碼,收?qǐng)?bào)人再按約定的規(guī)律
31、將其譯回原文42程序設(shè)計(jì)-2005年秋例子問(wèn)題:為使電文保密,往往按一定規(guī)律將其轉(zhuǎn)換成密碼,收?qǐng)?bào)人#include main() char c; while(c=getchar()!=n) if(c=a & c=a & cZ & cz) c=c-26; printf(%c,c); 43程序設(shè)計(jì)-2005年秋#include 45程序設(shè)計(jì)-200do-while語(yǔ)句do-while語(yǔ)句的一般形式為 do 語(yǔ)句 while (表達(dá)式);do-while語(yǔ)句的執(zhí)行過(guò)程是(1)執(zhí)行do-while語(yǔ)句的循環(huán)體(2)求while之后的表達(dá)式的值(3)測(cè)試表達(dá)式的值,當(dāng)值為非0時(shí),轉(zhuǎn)步驟(1)(從而構(gòu)成循
32、環(huán));如值為0,則結(jié)束while語(yǔ)句分號(hào)是do-while語(yǔ)句的結(jié)束符決不能省略!循環(huán)體44程序設(shè)計(jì)-2005年秋do-while語(yǔ)句do-while語(yǔ)句的一般形式為分號(hào)是d do-while造句入口 do 語(yǔ)句 while (表達(dá)式) 非0 0 do-while語(yǔ)句出口 do-while語(yǔ)句執(zhí)行過(guò)程示意圖 45程序設(shè)計(jì)-2005年秋47程序設(shè)計(jì)-2005年秋例子求 s = 1 + 2 + 3 + + 100s = 0; i = 1;do s += i; i+ ; while (i = 100); s = 0; i = 1; do s += i+; while (i = 100);46程序設(shè)計(jì)
33、-2005年秋例子求 s = 1 + 2 + 3 + + 100s =do-while語(yǔ)句(續(xù))與while語(yǔ)句一樣,當(dāng)循環(huán)體由多個(gè)語(yǔ)句組成時(shí),必須把它們書(shū)寫(xiě)成復(fù)合語(yǔ)句while語(yǔ)句與用do-while語(yǔ)句的區(qū)別是在于執(zhí)行循環(huán)時(shí),對(duì)循環(huán)條件表達(dá)式的求值和測(cè)試的時(shí)間不同while語(yǔ)句對(duì)循環(huán)條件表達(dá)式求值和測(cè)試在執(zhí)行循環(huán)體之前,而do-while語(yǔ)句對(duì)循環(huán)條件的表達(dá)式求值和測(cè)試在執(zhí)行循環(huán)體之后47程序設(shè)計(jì)-2005年秋do-while語(yǔ)句(續(xù))與while語(yǔ)句一樣,當(dāng)循環(huán)體由多do-while語(yǔ)句(續(xù))對(duì)于do-while語(yǔ)句,它的循環(huán)體至少被執(zhí)行一次,而while 語(yǔ)句的循環(huán)體在循環(huán)條件表達(dá)式值
34、一開(kāi)始就為0的情況下,就一次也未被執(zhí)行如能保證while語(yǔ)句中的循環(huán)條件表達(dá)式在第一次求值總是非0,則把該循環(huán)條件移至循環(huán)體執(zhí)行之后求值和測(cè)試,能起同樣的控制作用。在這種情況下,while語(yǔ)句就能改寫(xiě)成do-while語(yǔ)句48程序設(shè)計(jì)-2005年秋do-while語(yǔ)句(續(xù))對(duì)于do-while語(yǔ)句,它的循環(huán)例子問(wèn)題:求方程f(x)=3x3+4x2-2x+5的實(shí)根方法:用牛頓迭代方法求方程f(x)=0的根的近似解:xk+1=xk-f(xk)/f(xk), k=0,1,當(dāng)修正量dk=f(xk)/f(xk) 的絕對(duì)值小于某個(gè)很小數(shù)時(shí),xk+1就作為方程的近似解49程序設(shè)計(jì)-2005年秋例子問(wèn)題:求方
35、程f(x)=3x3+4x2-2x+5的實(shí)根51#include #include /* 引用數(shù)學(xué)函數(shù) */#define Epsilon 1.0e-6void main() double x, d; x = -2.0; do d = (3.0*x+4.0)*x-2.0)*x+5.0)/(9.0*x+8.0)*x-2.0); x = x-d; while (fabs(d) Epsilon); printf(The root is %.6fn, x);50程序設(shè)計(jì)-2005年秋#include 52程序設(shè)計(jì)-200例子問(wèn)題:尋找一個(gè)最小整數(shù),要求該整數(shù)滿足以下條件被3除余2,被5除余3,被7除余4
36、求解方法若采用變量從初值2開(kāi)始,循環(huán)執(zhí)行變量的值增長(zhǎng)1和測(cè)試該變量是否不滿足問(wèn)題要求的條件,直至變量的值滿足條件結(jié)束51程序設(shè)計(jì)-2005年秋例子問(wèn)題:尋找一個(gè)最小整數(shù),要求該整數(shù)滿足以下條件53程序#include void main() int i = 2; do i+; while(!(i%3 = 2 & i%5 = 3 & i%7 = 4); printf(被3除余2,5除余3,7除余4的最小數(shù)是%dn, i);52程序設(shè)計(jì)-2005年秋#include 54程序設(shè)計(jì)-2如采用分階段的辦法,先讓變量在保證滿足條件被3除余2情況下,尋找被5除余3的解;接著在保證被3除余2和被5除余3的條
37、件下,尋找被7除余4的解,這樣做能簡(jiǎn)化循環(huán)條件,并能加快找解的速度。#include void main() int i = 2; /* 初值i被3除余2 */ do i += 3; while (i % 5 != 3); while (i % 7 != 4) i += 15; printf(“被3除余2,5除余3,7除余4的最小數(shù)是%dnn,i);保證i被3除余2保證i被3除余2并被5除余353程序設(shè)計(jì)-2005年秋保證i被3除余2保證i被3除余2并被5除余355程序設(shè)計(jì)for語(yǔ)句for語(yǔ)句的一般形式為 for(表達(dá)式1;表達(dá)式2;表達(dá)式3) 語(yǔ)句其中,語(yǔ)句是for語(yǔ)句的循環(huán)體,for語(yǔ)句執(zhí)
38、行過(guò)程:(1) 計(jì)算表達(dá)式1;(2) 計(jì)算表達(dá)式2的值,并測(cè)試其值為0或非0。若值為非0,轉(zhuǎn)步驟(3);否則結(jié)束for語(yǔ)句;(3) 執(zhí)行循環(huán)體;(4) 計(jì)算表達(dá)式3;(5) 轉(zhuǎn)向步驟(2)。54程序設(shè)計(jì)-2005年秋for語(yǔ)句for語(yǔ)句的一般形式為56程序設(shè)計(jì)-2005年 for語(yǔ)句入口 for(表達(dá)式1; 表達(dá)式2; 表達(dá)式3) 0 非0 語(yǔ)句 for語(yǔ)句出口 for語(yǔ)句的執(zhí)行流程圖55程序設(shè)計(jì)-2005年秋57程序設(shè)計(jì)-2005年秋for語(yǔ)句 vs. While語(yǔ)句for語(yǔ)句的一般形式也可等價(jià)地用以下形式的while語(yǔ)句來(lái)表達(dá): 表達(dá)式1; while (表達(dá)式2) 語(yǔ)句 表達(dá)式3; fo
39、r語(yǔ)句的表達(dá)式1的作用是對(duì)控制循環(huán)的有關(guān)變量賦初值;表達(dá)式2是控制循環(huán)的條件;表達(dá)式3用于修正有關(guān)變量;語(yǔ)句是循環(huán)體for語(yǔ)句按各部分的功能,可以形象地寫(xiě)成以下形式: for(初值表達(dá)式 ; 控制循環(huán)條件表達(dá)式 ; 修正變量表達(dá)式) 完成循環(huán)計(jì)算語(yǔ)句56程序設(shè)計(jì)-2005年秋for語(yǔ)句 vs. While語(yǔ)句for語(yǔ)句的一般形式也可等例子求s = 1 + 2 + 3 + + 100用for語(yǔ)句可以寫(xiě)成: for(s = 0, i = 1; i = 100; i+) s += i;57程序設(shè)計(jì)-2005年秋例子求s = 1 + 2 + 3 + + 100 forfor語(yǔ)句(續(xù))使用for語(yǔ)句時(shí),
40、需注意的幾種情況:for語(yǔ)句的一般形式中,表達(dá)式1、表達(dá)式2和表達(dá)式3都可以省略如表達(dá)式1省略,表示該for語(yǔ)句沒(méi)有賦初值部分,或前面的程序段已為有關(guān)變量賦了初值,或確實(shí)沒(méi)有特別的初值;如表達(dá)式2省略,表示循環(huán)條件永遠(yuǎn)為真,可能循環(huán)體內(nèi)有控制轉(zhuǎn)移語(yǔ)句轉(zhuǎn)出for語(yǔ)句;表達(dá)式3省略,表示沒(méi)有修正部分,對(duì)變量的修正已在循環(huán)體內(nèi)一起完成。58程序設(shè)計(jì)-2005年秋for語(yǔ)句(續(xù))使用for語(yǔ)句時(shí),需注意的幾種情況:60程例子 s = 0; i = 1; for( ; i = 100; i+) s +=i; for(s = 0, i = 1; ; i+) s += i; if(i = 100) brea
41、k; for(s = 0, i = 1; i = 100;) s += i+;59程序設(shè)計(jì)-2005年秋例子 s = 0; i = 1; for(s = 0, for語(yǔ)句(續(xù))不管表達(dá)式1、表達(dá)式2和表達(dá)式3省略情況如何,其中兩個(gè)分號(hào)都不能省略。對(duì)于三個(gè)表達(dá)式都省略情況for語(yǔ)句呈以下形式: for( ; ; ) 語(yǔ)句表達(dá)式1、表達(dá)式2和表達(dá)式3都可包含逗號(hào)運(yùn)算符由多個(gè)表達(dá)式組成。如上面的例子中,表達(dá)式1為s=0,i=1。對(duì)于s = 1+2+3+100的計(jì)算,下面都是合理的for語(yǔ)句描述for(s = 0, i = 1; i = 100; s += i, i+);for(s = 0, i =
42、1; s += i, i 100; i+);for(s = 0, i = 0; i 100; +i, s += i);60程序設(shè)計(jì)-2005年秋for語(yǔ)句(續(xù))不管表達(dá)式1、表達(dá)式2和表達(dá)式3省略情況如何例子問(wèn)題:編制一個(gè)程序, 實(shí)現(xiàn)輸入n個(gè)整數(shù), 輸出其中的最大數(shù),并指出其是第幾個(gè)數(shù)61程序設(shè)計(jì)-2005年秋例子問(wèn)題:編制一個(gè)程序, 實(shí)現(xiàn)輸入n個(gè)整數(shù), 輸出其中的最大#include void main() int n, i, max, x, index; printf(輸入 n!n); scanf(%d, &n); for(i = 1; i max) /* 輸入了一個(gè)更大的數(shù) */ max
43、 = x; index = i; printf(最大數(shù)是 %d,它是第 %d 個(gè)數(shù)。nn, max, index);62程序設(shè)計(jì)-2005年秋#include 64程序設(shè)計(jì)-200三種循環(huán)語(yǔ)句while語(yǔ)句、do_while語(yǔ)句和for語(yǔ)句對(duì)應(yīng)于三種不同的構(gòu)造循環(huán)計(jì)算的思路當(dāng)某條件成立時(shí)循環(huán)執(zhí)行某個(gè)計(jì)算,直至條件不成立結(jié)束循環(huán)while循環(huán)執(zhí)行某個(gè)計(jì)算,直至條件不成立時(shí)結(jié)束循環(huán)do-while某個(gè)(或某些)變量從初值開(kāi)始,順序變化,對(duì)其中的每一個(gè)(或組)值,當(dāng)條件成立時(shí),循環(huán)執(zhí)行某計(jì)算,直至條件不成立結(jié)束循環(huán)for(;)63程序設(shè)計(jì)-2005年秋三種循環(huán)語(yǔ)句while語(yǔ)句、do_while語(yǔ)句
44、和for語(yǔ)句循環(huán)語(yǔ)句比較:例子求和式: p = 1-1/3+1/5-1/7+要求程序按公式逐項(xiàng)累計(jì)求和,直到某項(xiàng)的絕對(duì)值小于0.000001時(shí)結(jié)束記公式中項(xiàng)的分母為d,d的初值為1.0;引入存儲(chǔ)當(dāng)前項(xiàng)值的變量t用三種循環(huán)實(shí)現(xiàn)代碼64程序設(shè)計(jì)-2005年秋循環(huán)語(yǔ)句比較:例子求和式:66程序設(shè)計(jì)-2005年秋while以當(dāng)前項(xiàng)t的絕對(duì)值不小于0.000001時(shí)循環(huán)求和,并修正變量d和t,有代碼: p = 0.0; d = 1.0; t = 1.0; while (fabs(t) = 1.0e-6) p += t; d += 2.0; t = (d-1)%4)? 1.0/d : 1.0/d; 65程
45、序設(shè)計(jì)-2005年秋while以當(dāng)前項(xiàng)t的絕對(duì)值不小于0.000001時(shí)循環(huán)求和do-while循環(huán)求和,并修正變量d和t,直至新的t的絕對(duì)值小于0.000001時(shí)結(jié)束,有代碼: p = 0.0; d = 1.0; t = 1.0; do p += t; d += 2.0; t = (d-1)%4)? 1.0/d : 1.0/d; while (fabs(t) = 1.0e-6);66程序設(shè)計(jì)-2005年秋do-while循環(huán)求和,并修正變量d和t,直至新的t的絕對(duì)for(;)從變量d為1.0、t為1.0開(kāi)始,當(dāng)t的絕對(duì)值不小于0.000001時(shí)循環(huán)求和,每次循環(huán)后相應(yīng)地修正變量d和t,有代碼
46、:for( p = 0.0, d = 1.0, t = 1.0; fabs(t) = 1.0e-6; d += 2.0, t = (d-1)%4)? 1.0/d : 1.0/d) p += t;67程序設(shè)計(jì)-2005年秋for(;)從變量d為1.0、t為1.0開(kāi)始,當(dāng)t的絕對(duì)值循環(huán)語(yǔ)句比較(續(xù))三種循環(huán)語(yǔ)句在代碼編寫(xiě)時(shí)有一些差別while語(yǔ)句和for語(yǔ)句循環(huán)條件表達(dá)式求值和測(cè)試在前,執(zhí)行循環(huán)體在后。極端情況,循環(huán)體可能一次也沒(méi)有執(zhí)行。do_while語(yǔ)句執(zhí)行循環(huán)體在前,循環(huán)條件表達(dá)式的求值和測(cè)試在后,因此,循環(huán)體至少執(zhí)行一次do_while語(yǔ)句的最后要接上一個(gè)分號(hào),這是其句法的要求。while語(yǔ)句和for語(yǔ)句如果循環(huán)體是一個(gè)表達(dá)式語(yǔ)句,最后也會(huì)以分號(hào)結(jié)束,但這個(gè)分號(hào)是該表達(dá)式語(yǔ)句的要求while語(yǔ)句或do_while語(yǔ)句,通常在它們之前會(huì)有賦值語(yǔ)句給有關(guān)變量賦初值,在循環(huán)體中有對(duì)有關(guān)變量值的修正而for語(yǔ)句的賦初值部分應(yīng)出現(xiàn)在表達(dá)式1中,變量修正出現(xiàn)在表達(dá)式3中。所以for語(yǔ)句更加靈活,應(yīng)用也最多。68程序設(shè)計(jì)-2005年秋循環(huán)語(yǔ)句比較(續(xù))三種循環(huán)語(yǔ)句在代碼編寫(xiě)時(shí)有一些差別70程Break和continue前面,break語(yǔ)句可用于使流程
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 乳制品企業(yè)銷售經(jīng)理合同范本
- 臨時(shí)品牌專員招聘合同模板
- 科技園區(qū)建設(shè)土方開(kāi)挖施工合同
- 銀行員工客戶信息保密承諾書(shū)
- 通信基站維護(hù)員合同范例
- 寫(xiě)字樓水電維修工程師聘用協(xié)議
- 塑料廠給排水暖施工合同
- 互聯(lián)網(wǎng)公司文秘招聘協(xié)議
- 船舶管道保溫施工協(xié)議
- 廣告宣傳皮卡租賃合同
- 幸福在哪里智慧樹(shù)知到期末考試答案2024年
- 電化學(xué)儲(chǔ)能電站檢修規(guī)程
- 《旅游財(cái)務(wù)管理》課件-4旅游企業(yè)籌資管理
- 電力電纜試驗(yàn)報(bào)告
- MOOC 家具·設(shè)計(jì)·生活-北京林業(yè)大學(xué) 中國(guó)大學(xué)慕課答案
- MOOC 國(guó)際金融-江西財(cái)經(jīng)大學(xué) 中國(guó)大學(xué)慕課答案
- 2023年考研政治真題(含答案及解析)
- 教育研究方法智慧樹(shù)知到期末考試答案2024年
- 教師職業(yè)道德與專業(yè)發(fā)展智慧樹(shù)知到期末考試答案2024年
- 會(huì)計(jì)學(xué)原理智慧樹(shù)知到期末考試答案2024年
- 《血站業(yè)務(wù)場(chǎng)所建設(shè)指南 第3部分:獻(xiàn)血屋》
評(píng)論
0/150
提交評(píng)論