




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第3章 C語言控制語句 北京科技大學(xué)C 語言程序設(shè)計(jì)2022/7/10本章介紹數(shù)據(jù)輸出數(shù)據(jù)輸入順序結(jié)構(gòu)程序設(shè)計(jì)分支結(jié)構(gòu)程序設(shè)計(jì)循環(huán)結(jié)構(gòu)程序設(shè)計(jì)2022/7/10程序的三種基本結(jié)構(gòu) 順序結(jié)構(gòu)N-S結(jié)構(gòu)圖流程圖ABAB選擇結(jié)構(gòu)YNABP成立? P T F A B2022/7/10程序的三種基本結(jié)構(gòu)循環(huán)結(jié)構(gòu)NYP成立?A當(dāng)P成立時(shí) A直到型循環(huán) A當(dāng)P成立時(shí)YNAP成立?當(dāng)型循環(huán)N-S結(jié)構(gòu)圖流程圖2022/7/103.1 結(jié)構(gòu)化程序設(shè)計(jì)3種基本結(jié)構(gòu)特點(diǎn):只有一個(gè)入口和一個(gè)出口結(jié)構(gòu)內(nèi)的每一個(gè)框都有機(jī)會(huì)被執(zhí)行結(jié)構(gòu)內(nèi)沒有死循環(huán)僅包含3種基本結(jié)構(gòu)的程序稱為結(jié)構(gòu)化程序2022/7/103.2順序結(jié)構(gòu)程序設(shè)計(jì)主
2、要內(nèi)容:字符輸出函數(shù)格式輸出函數(shù)字符輸入函數(shù)格式輸入函數(shù)順序結(jié)構(gòu)程序設(shè)計(jì)舉例2022/7/103.2.1 字符輸出函數(shù) 函數(shù)調(diào)用的一般形式 putchar(ch) 功能:在標(biāo)準(zhǔn)輸出設(shè)備(即顯示器屏幕)上輸出一個(gè)字符。例如:putchar(b); putchar(n); putchar(101); putchar(st); 輸出:b輸出:回車換行輸出:A2022/7/10說明 putchar是C語言的標(biāo)準(zhǔn)庫函數(shù),使用時(shí)必須加編譯預(yù)處理命令:#include stdio.h 或 #include 【例3.1】利用putchar函數(shù)輸出字符。#include stdio.h main( ) char
3、 c1,c2; c1=a ; c2=b ; putchar(c1);putchar(c2); putchar(n); putchar(c1-32);putchar(c2-32); putchar(n);也可改為c1=97 ; c2=98 ; 輸出結(jié)果:ab AB2022/7/103.2.2 格式輸出函數(shù) 函數(shù)調(diào)用的一般形式 printf(格式控制字符串, 輸出表列) 功能:按格式控制所指定的格式,在標(biāo)準(zhǔn)輸出設(shè)備上輸出 輸出表列各項(xiàng)的值。 例如有程序段 :int a=123,b=100; printf(%d %d %dn,a,b,a+b); printf (c = %d + %d = %dn,a
4、,b,a+b ); 2022/7/10輸出: 123 100 223 輸出: c = 123 + 100 = 223 2022/7/10格式控制字符串 用雙引號(hào)括起的字符串,用于指定輸出數(shù)據(jù)的類型、格式、個(gè)數(shù)包括:非格式字符和格式字符照原樣輸出 printf (c=%d+%d=%dn, a, b, a+b );格式字符:指定輸出3個(gè)十進(jìn)制整型數(shù),分別為變量 a、b、ab的值2022/7/10輸出格式說明符整型數(shù)據(jù) %d以有符號(hào)十進(jìn)制形式輸出整型數(shù)%o以無符號(hào)八進(jìn)制形式輸出整型數(shù)%x以無符號(hào)十六進(jìn)制形式輸出整型數(shù)%u以無符號(hào)十進(jìn)制形式輸出整型數(shù)實(shí)型數(shù)據(jù) %f以小數(shù)形式輸出實(shí)型數(shù)%e以指數(shù)形式輸出
5、實(shí)型數(shù)%g按數(shù)值寬度最小的形式輸出實(shí)型數(shù)字符型數(shù)據(jù) %c輸出一個(gè)字符%s輸出字符串其他 %輸出字符 % 本身在和格式符之間可以使用附加說明符2022/7/10附加格式說明符 l輸出長整型數(shù)(只可與d、o、x、u結(jié)合用)m指定數(shù)據(jù)輸出的寬度(即域?qū)挘?n對(duì)實(shí)型數(shù)據(jù),指定輸出 n 位小數(shù);對(duì)字符串,指定左端截取n 個(gè)字符輸出+使輸出的數(shù)值數(shù)據(jù)無論正負(fù)都帶符號(hào)輸出-使數(shù)據(jù)在輸出域內(nèi)按左對(duì)齊方式輸出整數(shù)位數(shù)+小數(shù)位數(shù)+小數(shù)點(diǎn) 自動(dòng)對(duì)n位后小數(shù)四舍五入 例如:%ld 輸出十進(jìn)制長整型數(shù) %m.nf 右對(duì)齊,m位域?qū)?,n位小數(shù)或n個(gè)字符%-m.nf 左對(duì)齊 2022/7/10例3.2 整型數(shù)據(jù)的輸出mai
6、n( ) int a=11,b=22; int m=-1; long n=123456789; printf(%d%dn,a,b); printf(a=%d, b=%dn,a,b); printf(m: %d, %o, %x, %un,m,m,m,m); printf(n=%dn,n); printf(n=%ldn,n);程序輸出:1122a=11, b=22m: -1, 37777777777, ffffffff, 4294967295n=123456789n=1234567892022/7/10例3.3 實(shí)型數(shù)據(jù)的輸出main( ) float x=1234.56,y=1.23456789
7、; double z=1234567.123456789; printf(x=%f, y=%f n,x,y); printf(z=%fn,z); printf(z=%en,z); printf(z=%18.8fn,z); printf(x=%10.3fn,x); printf(x=%-10.3fn,x); printf(x=%4.3fnn,x); 程序輸出:x=1234.560059, y=1.234568z=1234567.123457z=1.23457e+06z= 1234567.12345679x= 1234.560 x=1234.560 x=1234.5602022/7/10例3.4
8、字符型數(shù)據(jù)的輸出main( ) int m=97; char ch=B; printf(m: %d %cn,m,m); printf(ch: %d %cn,ch,ch); printf(%sn,student); printf(%10sn,student); printf(%-10sn,student); printf(%10.3sn,student); printf(%.3snn,student); 程序輸出:m: 97 ach: 66 Bstudent studentstudent stustu2022/7/10注意:printf函數(shù)格式控制中的格式字符與輸出表列參數(shù)的個(gè)數(shù)和類型必須一一對(duì)
9、應(yīng)。 格式說明符的 % 和后面的描述符之間不能有空格。除 %X、%E、%G外類型描述符必須是小寫字母。 長整型數(shù)應(yīng)該用ld(或lo、lx、lu)格式輸出,否則會(huì)出現(xiàn)輸出錯(cuò)誤。 printf函數(shù)的參數(shù)可以是常量、變量或表達(dá)式。2022/7/103.2.3 字符輸入函數(shù) 函數(shù)調(diào)用的一般形式 getchar( ) 功能:從標(biāo)準(zhǔn)輸入設(shè)備(即鍵盤)上輸入一個(gè)字符。例如:getchar( ) ; c = getchar( ); printf(%c n,getchar( );2022/7/10例如:【例3.5】getchar函數(shù)的應(yīng)用。 #include stdio.hmain( ) char ch; ch
10、=getchar( ); printf(%c %dn,ch,ch); printf(%c %dnn,ch-32,ch-32); 程序運(yùn)行時(shí)輸入:m 并按回車鍵后輸出結(jié)果是: m 109M 772022/7/10說明:getchar是C語言的標(biāo)準(zhǔn)庫函數(shù),使用時(shí)必須加編譯預(yù)處理命令:#include stdio.h 或 #include getchar函數(shù)需要交互輸入,接收到輸入字符之后才繼續(xù)執(zhí)行程序。 連續(xù)使用getchar函數(shù)時(shí),要注意字符的輸入形式 ,例如執(zhí)行如下程序段:char ch1,ch2;ch1=getchar( );ch2=getchar( );必須連續(xù)輸入兩個(gè)字符,中間不能有其他
11、字符2022/7/103.2.4 格式輸入函數(shù) 函數(shù)調(diào)用的一般形式 scanf(格式控制字符串, 地址表列); 功能:按格式控制指定的格式,從標(biāo)準(zhǔn)輸入設(shè)備(即鍵盤)交互輸入數(shù)據(jù),并依次存放到對(duì)應(yīng)地址表列參數(shù)指定的變量中(即將輸入值賦給變量)。 例如:scanf (%d%f,&a, &f); scanf (%o, %f , &b,&x); scanf (a=%d, b=%d,&a,&b); 2022/7/10格式控制字符串 用雙引號(hào)括起的字符串,用于指定輸入數(shù)據(jù)的類型、格式、個(gè)數(shù)以及輸入的形式 包括:非格式字符和格式字符照原樣輸入 scanf (a=%d, b=%d, &a, &b);格式字符:
12、指定輸入2個(gè)十進(jìn)制整型數(shù)賦給變量 a 和 b2022/7/10輸入格式說明符整型數(shù)據(jù) %d輸入十進(jìn)制整型數(shù)%u輸入無符號(hào)的十進(jìn)制整型數(shù)%o輸入八進(jìn)制整型數(shù)%x輸入十六進(jìn)制整型數(shù)實(shí)型數(shù)據(jù) %f輸入小數(shù)形式的單精度實(shí)型數(shù)%e輸入指數(shù)形式的單精度實(shí)型數(shù)字符型數(shù)據(jù) %c輸入單個(gè)字符%s輸入一個(gè)字符串在和格式符之間可以使用附加說明符2022/7/10附加格式說明符 l與d、o、x、u結(jié)合輸入長整型數(shù)與 f 結(jié)合輸入double型數(shù)h與d、o、x、u結(jié)合輸入短整型數(shù)m指定輸入數(shù)據(jù)的寬度*忽略讀入的數(shù)據(jù)(即不將讀入數(shù)據(jù)賦給相應(yīng)變量)例如:%ld、%lo輸入十進(jìn)制、八進(jìn)制長整型數(shù)%lf、%le輸入雙精度實(shí)型數(shù)
13、%mf輸入m位數(shù)(域?qū)挘?*d忽略輸入的一個(gè)整型數(shù)此變量接收下一個(gè)數(shù)據(jù)對(duì)float和double型指整數(shù)位數(shù)+小數(shù)點(diǎn) +小數(shù)位數(shù)2022/7/10例如:scanf (%d%d%d, &a, &b, &c); 輸入3個(gè)十進(jìn)制整型數(shù),以空白符(空格、tab鍵或回車鍵)分隔 scanf (%d, %o, %f , &a, &b, &x); 輸入3個(gè)數(shù),以“,”分隔scanf (a=%d, b=%d, &a, &b); 輸入的形式是:a=32, b=28 (普通字符要照原樣輸入)2022/7/10程序舉例例1:格式控制串中分隔符的應(yīng)用。main() int a,b,c,d; scanf(%d%d,&a
14、,&b); scanf(%d,%d,&c,&d); printf(n%d,%d,%d,%d,a,b,c,d);運(yùn)行時(shí)輸入:1 23,4輸出:?可以這樣輸入嗎?1 2 3,4輸出:1,2,3,41,2,3,42022/7/10例2:c格式符的使用。main() char c1,c2,c3; scanf(%c %c,&c1,&c2); scanf(%c,&c3); printf(“%c,%c,%cn,c1,c2,c3);運(yùn)行時(shí)輸入:ABC輸出:?思考:若輸入:A B(回車) C輸出:?2022/7/10例3: f格式符的使用。main() float x,y; double z; scanf(%f
15、,&x); scanf(%6f%6lf,&y,&z); printf(x=%f,y=%f,z=%12.8fn,x,y,z);運(yùn)行時(shí)輸入:531.56212.345678.315輸出:注意:float型7位有效,double型1516位有效。x=531.562012,y=12.345000,z=678.310000002022/7/10例4s格式符的使用。main()char a10,b10; scanf(“%s%s”,a,b); printf(“%sn%sn”,a,b);運(yùn)行時(shí)輸入:How do you do!輸出:Howdo2022/7/10例5抑制符的使用。main()int a,b; s
16、canf(“%2d%*3d%2d”,&a,&b); printf(“a=%d b=%d”,a,b);輸入:1234567輸出:?a=12 b=672022/7/10使用scanf函數(shù)應(yīng)注意: 要求在程序運(yùn)行中輸入數(shù)據(jù),輸入的數(shù)據(jù)個(gè)數(shù)和類型必須與格式說明符一一對(duì)應(yīng)。地址參數(shù)形式:&變量名(除數(shù)組或指針變量)。 格式控制中有非格式字符時(shí),必須照原樣輸入。格式控制中無非格式字符時(shí),輸入的數(shù)值型數(shù)據(jù)和字符串用空白符分隔,字符型數(shù)據(jù)不必分隔。 double型數(shù)據(jù)輸入時(shí),必須用%lf或%le格式。實(shí)型數(shù)輸入時(shí)域?qū)挷荒苡胢.n形式的附加說明。 為了減少不必要的輸入量,格式控制中盡量不要出現(xiàn)普通字符,也不要使
17、用 n 、t 等轉(zhuǎn)義字符。2022/7/10scanf (%c%c%c, &ch1, &ch2, &ch3);要輸入:abc不能輸入:abc注意數(shù)值型數(shù)據(jù)與char型數(shù)據(jù)的混合輸入注意(續(xù)) :格式符之間若無普通字符,則:輸入的數(shù)值型數(shù)據(jù)用空白符分隔輸入的 char型數(shù)據(jù)不必分隔 例如:scanf (%d%d, &m, &n);scanf (%c, &ch); 錯(cuò)誤輸入:3228a 正確輸入:3228a 2022/7/103.2.5 順序結(jié)構(gòu)程序設(shè)計(jì)舉例順序結(jié)構(gòu)程序的一般算法描述變量定義變量賦值運(yùn)算處理輸出結(jié)果可用:變量初始化賦值語句輸入函數(shù)調(diào)用語句注意各個(gè)語句的順序2022/7/103.2.
18、5 順序結(jié)構(gòu)程序設(shè)計(jì)舉例 【例3-11】數(shù)據(jù)交換。從鍵盤輸入a、b的值,輸出交換以后的值。 思路:在計(jì)算機(jī)中交換變量a和b的值:a=b ; b=a ; ?正確的交換方法:a123b78c?12378123c=a ; a=b ; b=c;2022/7/10程序:main( ) int a,b,c; printf(ninput a, b: ); scanf(%d,%d,&a,&b); printf(nbefore exchange:a=%d b=%dn,a,b); c=a; a=b; b=c; /*數(shù)據(jù)交換*/ printf(after exchange: a=%d b=%dn,a,b);程序運(yùn)行
19、情況如下:input a, b: 32, 57 before exchange: a=32 b=57 after exchange: a=57 b=32 2022/7/10舉例(補(bǔ)充) 【例3. 6】已知三條邊a、b、c,求三角形面積。計(jì)算三角形面積的海倫公式: 其中:設(shè)定義:整型變量 a、b、c實(shí)型變量 s 、 area2022/7/10程序如下: #include math.hmain( ) int a,b,c; float s,area ; scanf(%d, %d, %d,&a,&b,&c); s =1/2*(a+b+c) ; area = sqrt(s(s-a)(s-b)(s-c)
20、; printf(area = %8.3f n,area) ;程序運(yùn)行情況如下:3,4,5 area = 6.000 實(shí)際上還需要判斷a、b、c是否能構(gòu)成三角形,即應(yīng)該進(jìn)行選擇判斷處理 2022/7/10舉例(補(bǔ)充)【例3.7】從鍵盤輸入兩個(gè)整數(shù),輸出它們相除的余數(shù)及商(要求保留2位小數(shù)) 。 例如輸入的m和n分別為100和18,輸出形式為:mn10m/n=5.56 main( ) int m,n; printf(ninput m, n: ); scanf(%d,%d,&m,&n); printf(nm%n=%dn, m%n); printf(m/n=%.2fn, (float) m/n);
21、2022/7/10舉例: 【例3-12】輸入時(shí)間(時(shí)、分、秒),然后打印輸出共計(jì)多少秒? 分析:2022/7/10程序如下: #include void main()short hour, min, sec;long total;printf(%nEnter hour:min:sec:);scanf(%d:%d:%d,&hour,&min,&sec);total = hour *3600+min*60+sec;printf(n The total second=%ld,total);程序運(yùn)行情況如下:Enter hour:min:sec:3:10:50 The total second=114
22、50思考: total 的數(shù)據(jù)類型如何處理?2022/7/1040提出問題:自然語言:如果 則 否則C語言:分支語句?問題1:如何根據(jù)收入,確定他的納稅比例及納稅額?? 問題2如何根據(jù)學(xué)生的分?jǐn)?shù)判斷是否及格?2022/7/10413.3 分支結(jié)構(gòu)程序設(shè)計(jì)3.3.1 if條件分支語句3.3.2 switch多路開關(guān)語句2022/7/1042單分支語句語句一般格式 if (表達(dá)式) 語句功能:計(jì)算表達(dá)式的值,如果是一個(gè)非0值(即邏輯真),就執(zhí)行內(nèi)嵌語句,否則(即邏輯假)跳過內(nèi)嵌語句,順序執(zhí)行后續(xù)語句。 內(nèi)嵌語句,可為:賦值語句函數(shù)調(diào)用語句控制語句復(fù)合語句空語句可為算術(shù)、關(guān)系、邏輯、賦值等合法的表達(dá)
23、式2022/7/1043單分支語句的算法:例如: if (x0) m+; if ( ab ) c=a; a=b; b=c; 表達(dá)式非0 T F 語句N-S結(jié)構(gòu)圖語句流程圖NY表達(dá)式非0?2022/7/1044雙分支語句 語句一般格式if (表達(dá)式) 語句1 else 語句2 功能:計(jì)算表達(dá)式的值,如果它的值是一個(gè)非0值(邏輯真),就執(zhí)行內(nèi)嵌語句1,之后跳過內(nèi)嵌語句2,執(zhí)行后續(xù)語句;否則跳過內(nèi)嵌語句1,執(zhí)行內(nèi)嵌語句2,之后執(zhí)行后續(xù)語句。 2022/7/1045雙分支語句的算法:例如: if (x0) m+; else m-; if ( ch= a & ch= z ) ch=ch-32 ; pri
24、ntf( %cn,ch); else printf( %cn,ch) ; 表達(dá)式非0 T F 語句1 語句2N-S結(jié)構(gòu)圖 語句1 語句2流程圖NY表達(dá)式非0?2022/7/1046多分支語句 語句一般格式if (表達(dá)式1) 語句1 else if (表達(dá)式2) 語句2 else if (表達(dá)式n-1) 語句n-1 else 語句 n功能:依次計(jì)算并判斷表達(dá)式i,為非0時(shí)執(zhí)行后面的語句,都為0時(shí),執(zhí)行語句n無論執(zhí)行完哪個(gè)語句分支,都轉(zhuǎn)到后續(xù)語句2022/7/1047多重分支語句的算法流程圖表達(dá)式2?表達(dá)式1?語句n 語句1 語句2語句n-1YNYNNY表達(dá)式n-1 ?2022/7/1048多重分
25、支語句的算法N-S結(jié)構(gòu)圖 表達(dá)式1? T F 表達(dá)式2? 語句1 T F 語句2 表達(dá)式n-1? T F 語句n-1 語句n例如:if (a0)2 (x=0)3x2 (x0)2022/7/1050程序分析: 2022/7/1051程序: #include void main() float x,y;printf(n);scanf(%f,&x);if(x0)y=x-7;if(x=0) y=2;if(x=A & ch=65 & ch =A & ch=A & ch=Z ? ch+32:ch);putchar ( n)2022/7/1054(3) if語句的嵌套如果if的內(nèi)嵌語句中又使用了一個(gè)if語句
26、,則構(gòu)成if語句的嵌套。 【例3.9】比較兩個(gè)整數(shù)的關(guān)系。#include main( ) int x, y; printf (Enter integer X and Y:); scanf (%d%d, &x, &y); if ( x != y ) if ( x y ) printf (XYn); else printf (X y ) printf (XYn); else printf (XYn); else printf (X=Yn);提倡縮格書寫有利于閱讀程序2022/7/1055雙(或多)分支if語句的嵌套形式 if (表達(dá)式) if 語句 else if 語句 if語句嵌套的形式單if
27、語句的嵌套形式 if (表達(dá)式) if 語句 可以是各種形式的if語句可以是各種形式的if語句如果是簡(jiǎn)單if語句,必須用“ ”括起2022/7/1056 if (c=50) printf(50=c=100n); else printf(c50n);else if (c=150) printf(100c150n); if (c=50) printf(50=c=100n);else printf(c50n);例如: if (c=50) printf(50=c=100n);與哪個(gè)if 配對(duì)?匹配規(guī)則:在嵌套的ifelse語句中,else總是與上面的、離它最近的、在同一復(fù)合語句中還沒有配對(duì)的if配對(duì)。
28、 else printf(cb)if (ac) if (ad) flag=1; else flag=2;else flag=3; if (ab) if (ac) if (ad) flag=1; else flag=2; else flag=3;flag=3的條件:flag=3 的條件:當(dāng) cab 時(shí)當(dāng) a b 時(shí)例如:2022/7/1058舉例 【例3.10】輸入一個(gè)數(shù),判斷它是奇數(shù)還是偶數(shù),如果是奇數(shù)則進(jìn)一步判斷它是否為5的倍數(shù)。 定義變量x輸入x的值 x是奇數(shù) T F 輸出“odd” x是5的倍數(shù) 輸出“even” T F是5的倍數(shù)x%2!=0?x%5等于0?2022/7/1059程序:m
29、ain( ) int x; scanf (%d,&x); if (x%2 != 0) printf(%d is an odd n,x) ; if (x%5=0) printf(%d is the times of 5 n,x) ; else printf(%d is an even n,x) ;等價(jià)于if(x%2).等價(jià)于if(!(x%5).思考:如果沒有 ,算法和輸出如何?2022/7/1060學(xué)習(xí)if語句的難點(diǎn)正確用表達(dá)式描述條件例如:當(dāng)x大于5小于10時(shí)令x自增 if ( 5x10 ) x+;if else 語句的配對(duì)正確判斷內(nèi)嵌語句例如:if(x 0時(shí),方程有兩個(gè)不相等的實(shí)根:x1=(
30、-b+sqrt(d)/(2*a) x2=(-b-sqrt(d)/(2*a) 當(dāng)d 0 計(jì)算重根 T F 輸出重根 計(jì)算實(shí)根 計(jì)算虛根 輸出實(shí)根 輸出虛根2022/7/1070程序:#include math.hmain( ) float a,b,c,d,x1,x2,lp,ip; scanf(%f%f%f,&a,&b,&c); printf(the equation ); if (fabs(a)1e-6) printf(is not quadratic); else d=b*b-4*a*c; if (fabs(d)1e-6) /* 不相等的實(shí)根 */ x1=(-b+sqrt(d)/(2*a);
31、x2=(-b-sqrt(d)/(2*a); printf(has two real roots:n) ; printf(x1=%8.4f, 2=%8.4fn,x1,x2); else /* 虛根 */ lp=-b/(2*a);ip=sqrt(-d)/(2*a); printf(has two complex roots: n); printf(x1=%8.4f+%8.4fin,lp,ip); printf(x2=%8.4f-%8.4fin,lp,ip); 2022/7/1072舉例(續(xù)):【例3.13】輸入年份,判別該年是否為閏年。 思路:年份year為閏年的條件為 能夠被4整除,但不能被10
32、0整除的年份; 能夠被400整除的年份。只要滿足任意一個(gè)就可以確定它是閏年。例如:1996年、2008年是閏年2006年、1900年不是閏年設(shè)定標(biāo)志變量leap,只要符合其中一個(gè)條件的就是閏年,令 leap =1;否則令 leap=0 2022/7/1073算法:定義變量year、leap 輸入年份year 能被4整除且 不能被100整除? T F 能被400整除? leap=1 T F leap = 1 leap = 0 leap=1? T F 是閏年 不是閏年year%400=0year%4=0 & year%100 !=02022/7/1074程序:main( ) int year, l
33、eap ; scanf(%d, &year); if (year%4=0 & year%100!=0) leap=1; else if (year%400=0) leap=1; else leap=0; if (leap = 1) printf(%d is a leap year n, year); else printf(%d is not a leap year n, year); 2022/7/1075問題1:如何根據(jù)收入,確定一個(gè)人的納稅比例及納稅額?當(dāng)一個(gè)公司有多名員工時(shí),如何計(jì)算每個(gè)人的納稅比例及納稅額?提出問題:C語言:循環(huán)語句? 問題2如何根據(jù)學(xué)生的分?jǐn)?shù)判斷是否及格?如何根據(jù)全
34、班學(xué)生的分?jǐn)?shù),分別判斷他們是否及格?2022/7/10763.4 循環(huán)結(jié)構(gòu)程序設(shè)計(jì)while循環(huán)控制do-while循環(huán)控制for循環(huán)控制循環(huán)的嵌套2022/7/10773.4.1 while循環(huán)控制 語句一般格式 while (表達(dá)式) 語句 一般為關(guān)系表達(dá)式或邏輯表達(dá)式,也可以是C語言其他類型的合法表達(dá)式 用來控制循環(huán)體是否執(zhí)行稱為內(nèi)嵌語句,可以是基本語句、控制語句,也可以是復(fù)合語句是循環(huán)重復(fù)執(zhí)行的部分 2022/7/1078功能: 計(jì)算表達(dá)式的值,當(dāng)為非0(邏輯真)時(shí),執(zhí)行內(nèi)嵌語句,每執(zhí)行一次,就判斷一次表達(dá)式的值,當(dāng)表達(dá)式的值為0 時(shí)結(jié)束循環(huán),轉(zhuǎn)去執(zhí)行while后面的語句。 當(dāng)表達(dá)式為
35、真 語句N-S結(jié)構(gòu)圖NY流程圖表達(dá)式非0?語句循環(huán)控制條件循環(huán)體2022/7/1079例如:【例3.14】編寫程序,求100個(gè)自然數(shù)的和即: s=1+2+3+ +100 思路:尋找加數(shù)與求和的規(guī)律 加數(shù)i從1變到100,每循環(huán)一次,使i增1,直到i的值超過100。i的初值設(shè)為1。求和設(shè)變量 sum 存放和,循環(huán)求sum=sum+i,直至i超過100。 2022/7/1080算法和程序:main( ) int i,sum; i=1; sum=0; while (i=100) sum=sum+i; i+; printf(sum=%dn,sum);程序輸出結(jié)果:sum=5050i: 循環(huán)控制變量su
36、m: 累加器 i=1,sum=0 當(dāng)i = 100 sum=sum+i i+輸出sum2022/7/1081注意: 如果 (表達(dá)式) 值為0,則循環(huán)體一次也不執(zhí)行 (例如當(dāng)i的初值為101) 。在循環(huán)體中必須有使循環(huán)趨向結(jié)束的操作,否則循環(huán)將無限進(jìn)行(死循環(huán))。 在循環(huán)體中,語句的先后位置必須符合邏輯,否則會(huì)影響運(yùn)算結(jié)果。 思考如下的輸出? while (i=100) i+; sum=sum+i; printf(sum=%dn,sum);運(yùn)行后,輸出:sum=5150原因是什么?如何修改程序使結(jié)果正確? 2022/7/1082其他的while 語句形式while (0) . 由于表達(dá)式恒等于0
37、,所以循環(huán)體永遠(yuǎn)也不會(huì)執(zhí)行,是一個(gè)邏輯錯(cuò)誤的語句while (1) . 由于表達(dá)式恒等于1,所以不可能通過循環(huán)控制條件來結(jié)束循環(huán)體的執(zhí)行,即死循環(huán)。為了保證循環(huán)正常運(yùn)行,應(yīng)該特別注意: 循環(huán)控制條件的描述 控制條件的初始狀態(tài)(初始值) 循環(huán)體內(nèi)部對(duì)控制條件的影響2022/7/10833.4.2 do-while語句語句一般格式 do 語句 while (表達(dá)式); 功能:先執(zhí)行內(nèi)嵌語句(循環(huán)體),之后計(jì)算表達(dá)式的值,不為0(邏輯真)時(shí),再執(zhí)行循環(huán)體并判斷條件,直到表達(dá)式的值為 0 結(jié)束循環(huán),轉(zhuǎn)去執(zhí)行while下面的語句。2022/7/1084 do-while循環(huán)的算法 循環(huán)體當(dāng)表達(dá)式為真N-
38、S結(jié)構(gòu)圖NY循環(huán)體表達(dá)式非0?流程圖main( ) int i=1,sum=0; do sum=sum+i; i+; while (i=100); printf(%dn,sum);用do-while語句求1+2+100 2022/7/1085說明: while和do-while都能實(shí)現(xiàn)循環(huán)控制,while結(jié)構(gòu)程序通常都可以轉(zhuǎn)換成do-while結(jié)構(gòu)區(qū)別:do- while 語句先執(zhí)行循環(huán)體再判斷條件,循環(huán)體至少執(zhí)行一次; while 語句先判斷條件再執(zhí)行循環(huán)體,循環(huán)體有可能一次也不執(zhí)行dowhile循環(huán)體中一定要有能使表達(dá)式值趨于0的操作(如i+),否則會(huì)出現(xiàn)死循環(huán)。 2022/7/1086d
39、o-while語句的簡(jiǎn)單應(yīng)用 【例3.15】用輾轉(zhuǎn)相除法求m和n的最大公約數(shù)2022/7/1087算法和程序:main( ) int m,n,r; scanf(%d, %d,&m,&n); if (mn) r=m; m=n; n=r; do r=m%n; m=n; n=r; while(r!=0); printf(%dn,m); 程序運(yùn)行情況如下:24, 6012定義m、n、rmnT F m和n交換r=m%nm=nn=r 當(dāng)r != 0時(shí)輸出最大公約數(shù)m2022/7/10883.4.3 for語句 語句一般格式 for (表達(dá)式1;表達(dá)式2;表達(dá)式3) 語句 功能:計(jì)算表達(dá)式1的值,再判斷表達(dá)
40、式2,如果其值為非0(邏輯真),則執(zhí)行內(nèi)嵌語句(循環(huán)體),并計(jì)算表達(dá)式3;之后再去判斷表達(dá)式2,一直到其值為0時(shí)結(jié)束循環(huán),執(zhí)行后續(xù)語句。循環(huán)初始條件循環(huán)控制條件循環(huán)體2022/7/1089for語句的算法N-S結(jié)構(gòu)圖for (表達(dá)式1;表達(dá)式2;表達(dá)式3) 語句NY流程圖計(jì)算表達(dá)式1 語句計(jì)算表達(dá)式3表達(dá)式2為真?例如:main( ) int i,sum; for (sum=0,i=1;i=100;i+) sum=sum+i; printf(sum=%dn,sum);可部分或全部省略,但“;”不可省略2022/7/1090省略for語句的表達(dá)式 表達(dá)式1、2、3全省略,即: for ( ; ;
41、 ) 等同于:while (1),會(huì)無限循環(huán)(死循環(huán))注意:在省略某個(gè)表達(dá)式時(shí),應(yīng)在適當(dāng)位置進(jìn)行循環(huán)控制的必要操作,以保證循環(huán)的正確執(zhí)行 省略表達(dá)式1和表達(dá)式3,即: for(;表達(dá)式2;) 等同于:while( 表達(dá)式2 ) 省略表達(dá)式2,即: for(表達(dá)式1; ;表達(dá)式3) 等同于:表達(dá)式1; while(1)表達(dá)式3;2022/7/1091例如: i=1; for ( ; i100) for (i=1; i100) i+; 2022/7/1092說明:所有用 while 語句實(shí)現(xiàn)的循環(huán)都可以用for 語句實(shí)現(xiàn)。 等價(jià)于:for(表達(dá)式1;表達(dá)式2 ;表達(dá)式3) 語句;表達(dá)式1;whil
42、e (表達(dá)式2) 語句; 表達(dá)式3; 2022/7/1093for語句的簡(jiǎn)單應(yīng)用【例3.16】求n! ,即計(jì)算p=123n的值。 思路:求階乘與求累加的運(yùn)算處理過程類似,只要將“+”變?yōu)椤?”。設(shè)置:乘數(shù)i ,初值為1,終值為n(n是循環(huán)控制終值,需要從鍵盤輸入)累乘器 p ,每次循環(huán)令p = p*i2022/7/1094程序:main( ) int i, n; long p; p=1; printf(Enter n:); scanf(%d,&n); for (i=1; i=n; i+) p = p * i; printf(p = %ld n,p);思考:如何求s =1!+ 2!+ + n!
43、? 2022/7/10953.4.4 3種循環(huán)語句的比較while和do-while語句的表達(dá)式只有一個(gè),for語句有三個(gè)。while 和for先判斷循環(huán)條件后執(zhí)行循環(huán)體,do-while語句先執(zhí)行循環(huán)體后判斷循環(huán)條件。while語句多用于循環(huán)次數(shù)不定的情況do-while語句多用于至少要運(yùn)行一次的情況for語句多用于要賦初值或循環(huán)次數(shù)固定的情況2022/7/10963.4.5 循環(huán)的嵌套如果循環(huán)語句的循環(huán)體內(nèi)又包含了另一條循環(huán)語句,則稱為循環(huán)的嵌套例如: #include main( ) int i, j; for ( i=1; i10; i+ ) for ( j=1; j=i; j+ )
44、printf ( (j=i) ? %4dn : %4d , i*j); 外循環(huán)語句內(nèi)循環(huán)語句外循環(huán)體內(nèi)循環(huán)體2022/7/1097例如: #include main( ) int i, j; for ( i=1; i10; i+ ) for ( j=1; j=i; j+ ) printf ( %4d , i*j); printf (n ); 外循環(huán)語句內(nèi)循環(huán)語句外循環(huán)體內(nèi)循環(huán)體3.4.5 循環(huán)的嵌套2022/7/1098運(yùn)行結(jié)果:12 43 6 94 8 12 165 10 15 20 256 12 18 24 30 367 14 21 28 35 42 498 16 24 32 40 48
45、56 649 18 27 36 45 54 63 72 812022/7/1099注意:while、do-while、for循環(huán)語句可以并列,也可以相互嵌套,但要層次清楚,不能出現(xiàn)交叉。多重循環(huán)程序執(zhí)行時(shí),外層循環(huán)每執(zhí)行一次,內(nèi)層循環(huán)都需要循環(huán)執(zhí)行多次。例如:for(a=1;a=10;a+) for (b=0;b=5;b+) 外循環(huán)執(zhí)行了10次,內(nèi)循環(huán)執(zhí)行6次循環(huán)正常結(jié)束時(shí),內(nèi)循環(huán)執(zhí)行了106=60次 2022/7/101003.5 break和continue語句結(jié)構(gòu)化程序設(shè)計(jì)中有如下2種語句實(shí)現(xiàn)跳轉(zhuǎn):continue語句break語句在循環(huán)語句的循環(huán)體中使用,可以進(jìn)行循環(huán)的流程控制2022
46、/7/101013.5.1 break語句功能:利用break語句能夠強(qiáng)迫終止本層循環(huán),轉(zhuǎn)到后續(xù)語句執(zhí)行。2022/7/10102后續(xù)語句語句YN表達(dá)式?后續(xù)語句語句表達(dá)式?YN3.5.1 break的應(yīng)用break;while語句break;do-while語句后續(xù)語句計(jì)算表達(dá)式3計(jì)算表達(dá)式1語句表達(dá)式2?YNbreak;for語句2022/7/10103例如: int x,n=0,s=0;while (n10) scanf(%d,&x); if (x0) break; s+=x; n+; ; int x,n=0,s=0;do scanf(%d,&x); if (x0) break; s+=
47、x; n+; while (n10); for (n=0,s=0; n10; n+ ) scanf(%d,&x); if (x0) break; s+=x; 2022/7/101043.5.2 continue語句及應(yīng)用 功能:中斷循環(huán)體的本次執(zhí)行(即跳過循環(huán)體中尚未執(zhí)行的語句),立即開始執(zhí)行下一次循環(huán)。2022/7/10105后續(xù)語句語句YN表達(dá)式?后續(xù)語句語句表達(dá)式?YN3.5.2 continue語句及應(yīng)用(續(xù)) continue;while語句continue;do-while語句后續(xù)語句計(jì)算表達(dá)式3計(jì)算表達(dá)式1語句表達(dá)式2?YNcontinue;for語句2022/7/10106例如
48、: int x,n=0,s=0;while (n10) scanf(%d,&x); if (x0) continue; s+=x; n+; ; int x,n=0,s=0;do scanf(%d,&x); if (x0) continue; s+=x; n+; while (n10); for (n=0,s=0; n10; ) scanf(%d,&x); if (x0) continue; s+=x; n+ 2022/7/10107應(yīng)用舉例 【例3.17】把100200之間能被7整除的數(shù),以十個(gè)數(shù)為一行的形式輸出,最后輸出一共有多少個(gè)這樣的數(shù)。 思路:設(shè)變量n,從100變化到200;對(duì)每個(gè)n進(jìn)
49、行判斷,當(dāng)n不能被7整除時(shí),終止本次循環(huán),否則就輸出這個(gè)數(shù);設(shè)變量j作為輸出個(gè)數(shù)的計(jì)數(shù)器,每輸出一個(gè)數(shù)就令j+;當(dāng)輸出了10個(gè)數(shù)時(shí)(即j%10等于0),輸出n退出循環(huán)后輸出j的值。 2022/7/10108算法和程序main( ) int n,j=0; for(n=100;n=200;n+) if (n%7!=0) continue; printf(%6d,n); j+; if (j%10=0) printf(n); printf(n); printf(j=%dn,j); for (n=100; n=200; n+) n不能被7整除 T F 終止本次循環(huán) 輸出n 輸出10個(gè)數(shù) T F 換行20
50、22/7/101093.6 程序設(shè)計(jì)舉例及案例研究【例3-21】判斷輸入的某個(gè)數(shù)m是否為素?cái)?shù)。若是素?cái)?shù),輸出“YES”,若不是,輸出“NO”。 思路:素?cái)?shù)是指只能被1和它本身整除的數(shù),如5、7、11、17、等。 分別用2、3、,m-1嘗試能否整除整數(shù)m。如果m能被某個(gè)數(shù)整除,則m就不是素?cái)?shù)。這是一種窮舉算法設(shè)除數(shù)為j,從2循環(huán)到m-12022/7/10110算法和程序: 輸入一個(gè)數(shù)mfor (j=2; jm-1 T F輸出YES“ 輸出NO#include math.hmain( ) int j,m,k; printf(Enter an integer number: ); scanf(%d,
51、&m); if (m=0|m=1) printf(NOn); for (j=2; jm-1) printf(YESn); else printf(NOn);2022/7/10111程序的優(yōu)化對(duì)于窮舉法來說,為了提高程序的效率,就要減少嘗試次數(shù)。#include math.hmain( ) int j,m,k; printf(Enter an integer number: ); scanf(%d,&m); if (m=0|m=1) printf(NOn); k=sqrt(m); for (j=2; jk) printf(YESn); else printf(NOn);思考:如何輸出100200
52、中所有的素?cái)?shù) 2022/7/10112舉例2【例】用牛頓迭代法求方程 2x3+4x2-7x-6=0 在x=1.5附近的根。 思路:設(shè)xn為一個(gè)接近xa的近似根,過(xn, f(xn) 點(diǎn)做切線,切線方程為:即:xnxn+1xy0f(x)(xn, f(xn)(xn+1, f(xn+1) xa 方程的根牛頓迭代公式 2022/7/10113算法基本步驟: 先設(shè)一個(gè)方程近似根x0,求出方程f的值和方程導(dǎo)數(shù)f1的值;f=2x03+4x02-7x0-6f1=6x02+8x0-7 用迭代公式x=x0-f/f1進(jìn)行迭代,求出x比x0要接近方程真實(shí)的根; 當(dāng)|x-x0|大于某個(gè)很小的數(shù)時(shí)(如10-6),認(rèn)為未
53、找到,此時(shí)將xx0,再次求f、f1,并迭代,又求出一個(gè)新的更接近方程根的x; 一直到 |x-x0|10-6時(shí)得到方程近似根:x或x0。這是一種迭代算法用循環(huán)實(shí)現(xiàn)2022/7/10114算法和程序:#include math.hmain( ) float x,x0,f,f1; x=1.5; do x0=x; f=2*x0*x0*x0+4*x0*x0-7*x0-6; f1=6*x0*x0+8*x0-7; x=x0-f/f1; while(fabs(x-x0)1e-6); printf(%fn,x);x賦初值x0=x計(jì)算f計(jì)算f1 計(jì)算x=x0-f/f1當(dāng) |x-x0|10-6時(shí)輸出x2x3+4x2-7x-6=02022
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年勁截紓行業(yè)深度研究分析報(bào)告
- 2024年全球及中國變頻增壓泵行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 角質(zhì)溶解藥項(xiàng)目風(fēng)險(xiǎn)識(shí)別與評(píng)估綜合報(bào)告
- 眼鏡促銷方案策劃書3
- 2024-2030全球絕緣干式電力變壓器行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 外貿(mào)出口貿(mào)易采購代理合同
- 毛石施工合同協(xié)議書
- 汽車租賃公司租賃合同
- 2025年企業(yè)標(biāo)志旗項(xiàng)目投資可行性研究分析報(bào)告
- 房地產(chǎn)銷售項(xiàng)目合作合同書
- 2025年2月時(shí)事政治100題及參考答案
- 2025年湖南鐵道職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫帶答案
- 部編高教版2023·職業(yè)模塊 中職語文 2.《寧夏閩寧鎮(zhèn):昔日干沙灘今日金沙灘》 課件
- 安全環(huán)保職業(yè)健康法律法規(guī)清單2024年
- (正式版)YBT 6328-2024 冶金工業(yè)建構(gòu)筑物安全運(yùn)維技術(shù)規(guī)范
- 2022年袋鼠數(shù)學(xué)競(jìng)賽真題一二年級(jí)組含答案
- 人工智能引論智慧樹知到課后章節(jié)答案2023年下浙江大學(xué)
- 銀行保潔服務(wù)投標(biāo)方案(技術(shù)標(biāo))
- 青島市社會(huì)團(tuán)體換屆工作規(guī)范
- 個(gè)人房屋出租合同協(xié)議書(打印版)
- 公共衛(wèi)生科工作職責(zé)
評(píng)論
0/150
提交評(píng)論