版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第3章 C語(yǔ)言控制語(yǔ)句 北京科技大學(xué)C 語(yǔ)言程序設(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)沒(mé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輸出:回車(chē)換行輸出:A2022/7/10說(shuō)明 putchar是C語(yǔ)言的標(biāo)準(zhǔn)庫(kù)函數(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ù)的類(lèi)型、格式、個(gè)數(shù)包括:非格式字符和格式字符照原樣輸出 printf (c=%d+%d=%dn, a, b, a+b );格式字符:指定輸出3個(gè)十進(jìn)制整型數(shù),分別為變量 a、b、ab的值2022/7/10輸出格式說(shuō)明符整型數(shù)據(jù) %d以有符號(hào)十進(jìn)制形式輸出整型數(shù)%o以無(wú)符號(hào)八進(jìn)制形式輸出整型數(shù)%x以無(wú)符號(hào)十六進(jìn)制形式輸出整型數(shù)%u以無(wú)符號(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輸出字符串其他 %輸出字符 % 本身在和格式符之間可以使用附加說(shuō)明符2022/7/10附加格式說(shuō)明符 l輸出長(zhǎng)整型數(shù)(只可與d、o、x、u結(jié)合用)m指定數(shù)據(jù)輸出的寬度(即域?qū)挘?n對(duì)實(shí)型數(shù)據(jù),指定輸出 n 位小數(shù);對(duì)字符串,指定左端截取n 個(gè)字符輸出+使輸出的數(shù)值數(shù)據(jù)無(wú)論正負(fù)都帶符號(hào)輸出-使數(shù)據(jù)在輸出域內(nèi)按左對(duì)齊方式輸出整數(shù)位數(shù)+小數(shù)位數(shù)+小數(shù)點(diǎn) 自動(dòng)對(duì)n位后小數(shù)四舍五入 例如:%ld 輸出十進(jìn)制長(zhǎng)整型數(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ù)和類(lèi)型必須一一對(duì)
9、應(yīng)。 格式說(shuō)明符的 % 和后面的描述符之間不能有空格。除 %X、%E、%G外類(lèi)型描述符必須是小寫(xiě)字母。 長(zhǎng)整型數(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è)備(即鍵盤(pán))上輸入一個(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 并按回車(chē)鍵后輸出結(jié)果是: m 109M 772022/7/10說(shuō)明:getchar是C語(yǔ)言的標(biāo)準(zhǔn)庫(kù)函數(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è)備(即鍵盤(pán))交互輸入數(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ù)的類(lèi)型、格式、個(gè)數(shù)以及輸入的形式 包括:非格式字符和格式字符照原樣輸入 scanf (a=%d, b=%d, &a, &b);格式字符:
12、指定輸入2個(gè)十進(jìn)制整型數(shù)賦給變量 a 和 b2022/7/10輸入格式說(shuō)明符整型數(shù)據(jù) %d輸入十進(jìn)制整型數(shù)%u輸入無(wú)符號(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è)字符串在和格式符之間可以使用附加說(shuō)明符2022/7/10附加格式說(shuō)明符 l與d、o、x、u結(jié)合輸入長(zhǎng)整型數(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)制長(zhǎng)整型數(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鍵或回車(chē)鍵)分隔 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(回車(chē)) 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ù)和類(lèi)型必須與格式說(shuō)明符一一對(duì)應(yīng)。地址參數(shù)形式:&變量名(除數(shù)組或指針變量)。 格式控制中有非格式字符時(shí),必須照原樣輸入。格式控制中無(wú)非格式字符時(shí),輸入的數(shù)值型數(shù)據(jù)和字符串用空白符分隔,字符型數(shù)據(jù)不必分隔。 double型數(shù)據(jù)輸入時(shí),必須用%lf或%le格式。實(shí)型數(shù)輸入時(shí)域?qū)挷荒苡胢.n形式的附加說(shuō)明。 為了減少不必要的輸入量,格式控制中盡量不要出現(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ù)) :格式符之間若無(wú)普通字符,則:輸入的數(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é)果可用:變量初始化賦值語(yǔ)句輸入函數(shù)調(diào)用語(yǔ)句注意各個(gè)語(yǔ)句的順序2022/7/103.2.
18、5 順序結(jié)構(gòu)程序設(shè)計(jì)舉例 【例3-11】數(shù)據(jù)交換。從鍵盤(pán)輸入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】從鍵盤(pán)輸入兩個(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ù)類(lèi)型如何處理?2022/7/1040提出問(wèn)題:自然語(yǔ)言:如果 則 否則C語(yǔ)言:分支語(yǔ)句?問(wèn)題1:如何根據(jù)收入,確定他的納稅比例及納稅額?? 問(wèn)題2如何根據(jù)學(xué)生的分?jǐn)?shù)判斷是否及格?2022/7/10413.3 分支結(jié)構(gòu)程序設(shè)計(jì)3.3.1 if條件分支語(yǔ)句3.3.2 switch多路開(kāi)關(guān)語(yǔ)句2022/7/1042單分支語(yǔ)句語(yǔ)句一般格式 if (表達(dá)式) 語(yǔ)句功能:計(jì)算表達(dá)式的值,如果是一個(gè)非0值(即邏輯真),就執(zhí)行內(nèi)嵌語(yǔ)句,否則(即邏輯假)跳過(guò)內(nèi)嵌語(yǔ)句,順序執(zhí)行后續(xù)語(yǔ)句。 內(nèi)嵌語(yǔ)句,可為:賦值語(yǔ)句函數(shù)調(diào)用語(yǔ)句控制語(yǔ)句復(fù)合語(yǔ)句空語(yǔ)句可為算術(shù)、關(guān)系、邏輯、賦值等合法的表達(dá)
23、式2022/7/1043單分支語(yǔ)句的算法:例如: if (x0) m+; if ( ab ) c=a; a=b; b=c; 表達(dá)式非0 T F 語(yǔ)句N(xiāo)-S結(jié)構(gòu)圖語(yǔ)句流程圖NY表達(dá)式非0?2022/7/1044雙分支語(yǔ)句 語(yǔ)句一般格式if (表達(dá)式) 語(yǔ)句1 else 語(yǔ)句2 功能:計(jì)算表達(dá)式的值,如果它的值是一個(gè)非0值(邏輯真),就執(zhí)行內(nèi)嵌語(yǔ)句1,之后跳過(guò)內(nèi)嵌語(yǔ)句2,執(zhí)行后續(xù)語(yǔ)句;否則跳過(guò)內(nèi)嵌語(yǔ)句1,執(zhí)行內(nèi)嵌語(yǔ)句2,之后執(zhí)行后續(xù)語(yǔ)句。 2022/7/1045雙分支語(yǔ)句的算法:例如: 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 語(yǔ)句1 語(yǔ)句2N-S結(jié)構(gòu)圖 語(yǔ)句1 語(yǔ)句2流程圖NY表達(dá)式非0?2022/7/1046多分支語(yǔ)句 語(yǔ)句一般格式if (表達(dá)式1) 語(yǔ)句1 else if (表達(dá)式2) 語(yǔ)句2 else if (表達(dá)式n-1) 語(yǔ)句n-1 else 語(yǔ)句 n功能:依次計(jì)算并判斷表達(dá)式i,為非0時(shí)執(zhí)行后面的語(yǔ)句,都為0時(shí),執(zhí)行語(yǔ)句n無(wú)論執(zhí)行完哪個(gè)語(yǔ)句分支,都轉(zhuǎn)到后續(xù)語(yǔ)句2022/7/1047多重分支語(yǔ)句的算法流程圖表達(dá)式2?表達(dá)式1?語(yǔ)句n 語(yǔ)句1 語(yǔ)句2語(yǔ)句n-1YNYNNY表達(dá)式n-1 ?2022/7/1048多重分
25、支語(yǔ)句的算法N-S結(jié)構(gòu)圖 表達(dá)式1? T F 表達(dá)式2? 語(yǔ)句1 T F 語(yǔ)句2 表達(dá)式n-1? T F 語(yǔ)句n-1 語(yǔ)句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語(yǔ)句的嵌套如果if的內(nèi)嵌語(yǔ)句中又使用了一個(gè)if語(yǔ)句
26、,則構(gòu)成if語(yǔ)句的嵌套。 【例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);提倡縮格書(shū)寫(xiě)有利于閱讀程序2022/7/1055雙(或多)分支if語(yǔ)句的嵌套形式 if (表達(dá)式) if 語(yǔ)句 else if 語(yǔ)句 if語(yǔ)句嵌套的形式單if
27、語(yǔ)句的嵌套形式 if (表達(dá)式) if 語(yǔ)句 可以是各種形式的if語(yǔ)句可以是各種形式的if語(yǔ)句如果是簡(jiǎn)單if語(yǔ)句,必須用“ ”括起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語(yǔ)句中,else總是與上面的、離它最近的、在同一復(fù)合語(yǔ)句中還沒(méi)有配對(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).思考:如果沒(méi)有 ,算法和輸出如何?2022/7/1060學(xué)習(xí)if語(yǔ)句的難點(diǎn)正確用表達(dá)式描述條件例如:當(dāng)x大于5小于10時(shí)令x自增 if ( 5x10 ) x+;if else 語(yǔ)句的配對(duì)正確判斷內(nèi)嵌語(yǔ)句例如: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問(wèn)題1:如何根據(jù)收入,確定一個(gè)人的納稅比例及納稅額?當(dāng)一個(gè)公司有多名員工時(shí),如何計(jì)算每個(gè)人的納稅比例及納稅額?提出問(wèn)題:C語(yǔ)言:循環(huán)語(yǔ)句? 問(wè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)控制 語(yǔ)句一般格式 while (表達(dá)式) 語(yǔ)句 一般為關(guān)系表達(dá)式或邏輯表達(dá)式,也可以是C語(yǔ)言其他類(lèi)型的合法表達(dá)式 用來(lái)控制循環(huán)體是否執(zhí)行稱為內(nèi)嵌語(yǔ)句,可以是基本語(yǔ)句、控制語(yǔ)句,也可以是復(fù)合語(yǔ)句是循環(huán)重復(fù)執(zhí)行的部分 2022/7/1078功能: 計(jì)算表達(dá)式的值,當(dāng)為非0(邏輯真)時(shí),執(zhí)行內(nèi)嵌語(yǔ)句,每執(zhí)行一次,就判斷一次表達(dá)式的值,當(dāng)表達(dá)式的值為0 時(shí)結(jié)束循環(huán),轉(zhuǎn)去執(zhí)行while后面的語(yǔ)句。 當(dāng)表達(dá)式為
35、真 語(yǔ)句N(xiāo)-S結(jié)構(gòu)圖NY流程圖表達(dá)式非0?語(yǔ)句循環(huán)控制條件循環(huán)體2022/7/1079例如:【例3.14】編寫(xiě)程序,求100個(gè)自然數(shù)的和即: s=1+2+3+ +100 思路:尋找加數(shù)與求和的規(guī)律 加數(shù)i從1變到100,每循環(huán)一次,使i增1,直到i的值超過(guò)100。i的初值設(shè)為1。求和設(shè)變量 sum 存放和,循環(huán)求sum=sum+i,直至i超過(guò)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)將無(wú)限進(jìn)行(死循環(huán))。 在循環(huán)體中,語(yǔ)句的先后位置必須符合邏輯,否則會(huì)影響運(yùn)算結(jié)果。 思考如下的輸出? while (i=100) i+; sum=sum+i; printf(sum=%dn,sum);運(yùn)行后,輸出:sum=5150原因是什么?如何修改程序使結(jié)果正確? 2022/7/1082其他的while 語(yǔ)句形式while (0) . 由于表達(dá)式恒等于0
37、,所以循環(huán)體永遠(yuǎn)也不會(huì)執(zhí)行,是一個(gè)邏輯錯(cuò)誤的語(yǔ)句while (1) . 由于表達(dá)式恒等于1,所以不可能通過(guò)循環(huán)控制條件來(lái)結(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語(yǔ)句語(yǔ)句一般格式 do 語(yǔ)句 while (表達(dá)式); 功能:先執(zhí)行內(nèi)嵌語(yǔ)句(循環(huán)體),之后計(jì)算表達(dá)式的值,不為0(邏輯真)時(shí),再執(zhí)行循環(huán)體并判斷條件,直到表達(dá)式的值為 0 結(jié)束循環(huán),轉(zhuǎn)去執(zhí)行while下面的語(yǔ)句。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語(yǔ)句求1+2+100 2022/7/1085說(shuō)明: while和do-while都能實(shí)現(xiàn)循環(huán)控制,while結(jié)構(gòu)程序通常都可以轉(zhuǎn)換成do-while結(jié)構(gòu)區(qū)別:do- while 語(yǔ)句先執(zhí)行循環(huán)體再判斷條件,循環(huán)體至少執(zhí)行一次; while 語(yǔ)句先判斷條件再執(zhí)行循環(huán)體,循環(huán)體有可能一次也不執(zhí)行dowhile循環(huán)體中一定要有能使表達(dá)式值趨于0的操作(如i+),否則會(huì)出現(xiàn)死循環(huán)。 2022/7/1086d
39、o-while語(yǔ)句的簡(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語(yǔ)句 語(yǔ)句一般格式 for (表達(dá)式1;表達(dá)式2;表達(dá)式3) 語(yǔ)句 功能:計(jì)算表達(dá)式1的值,再判斷表達(dá)
40、式2,如果其值為非0(邏輯真),則執(zhí)行內(nèi)嵌語(yǔ)句(循環(huán)體),并計(jì)算表達(dá)式3;之后再去判斷表達(dá)式2,一直到其值為0時(shí)結(jié)束循環(huán),執(zhí)行后續(xù)語(yǔ)句。循環(huán)初始條件循環(huán)控制條件循環(huán)體2022/7/1089for語(yǔ)句的算法N-S結(jié)構(gòu)圖for (表達(dá)式1;表達(dá)式2;表達(dá)式3) 語(yǔ)句N(xiāo)Y流程圖計(jì)算表達(dá)式1 語(yǔ)句計(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語(yǔ)句的表達(dá)式 表達(dá)式1、2、3全省略,即: for ( ; ;
41、 ) 等同于:while (1),會(huì)無(wú)限循環(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說(shuō)明:所有用 while 語(yǔ)句實(shí)現(xiàn)的循環(huán)都可以用for 語(yǔ)句實(shí)現(xiàn)。 等價(jià)于:for(表達(dá)式1;表達(dá)式2 ;表達(dá)式3) 語(yǔ)句;表達(dá)式1;whil
42、e (表達(dá)式2) 語(yǔ)句; 表達(dá)式3; 2022/7/1093for語(yǔ)句的簡(jiǎn)單應(yīng)用【例3.16】求n! ,即計(jì)算p=123n的值。 思路:求階乘與求累加的運(yùn)算處理過(guò)程類(lèi)似,只要將“+”變?yōu)椤?”。設(shè)置:乘數(shù)i ,初值為1,終值為n(n是循環(huán)控制終值,需要從鍵盤(pá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)語(yǔ)句的比較while和do-while語(yǔ)句的表達(dá)式只有一個(gè),for語(yǔ)句有三個(gè)。while 和for先判斷循環(huán)條件后執(zhí)行循環(huán)體,do-while語(yǔ)句先執(zhí)行循環(huán)體后判斷循環(huán)條件。while語(yǔ)句多用于循環(huán)次數(shù)不定的情況do-while語(yǔ)句多用于至少要運(yùn)行一次的情況for語(yǔ)句多用于要賦初值或循環(huán)次數(shù)固定的情況2022/7/10963.4.5 循環(huán)的嵌套如果循環(huán)語(yǔ)句的循環(huán)體內(nèi)又包含了另一條循環(huán)語(yǔ)句,則稱為循環(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)語(yǔ)句內(nèi)循環(huán)語(yǔ)句外循環(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)語(yǔ)句內(nèi)循環(huán)語(yǔ)句外循環(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)語(yǔ)句可以并列,也可以相互嵌套,但要層次清楚,不能出現(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語(yǔ)句結(jié)構(gòu)化程序設(shè)計(jì)中有如下2種語(yǔ)句實(shí)現(xiàn)跳轉(zhuǎn):continue語(yǔ)句break語(yǔ)句在循環(huán)語(yǔ)句的循環(huán)體中使用,可以進(jìn)行循環(huán)的流程控制2022
46、/7/101013.5.1 break語(yǔ)句功能:利用break語(yǔ)句能夠強(qiáng)迫終止本層循環(huán),轉(zhuǎn)到后續(xù)語(yǔ)句執(zhí)行。2022/7/10102后續(xù)語(yǔ)句語(yǔ)句YN表達(dá)式?后續(xù)語(yǔ)句語(yǔ)句表達(dá)式?YN3.5.1 break的應(yīng)用break;while語(yǔ)句break;do-while語(yǔ)句后續(xù)語(yǔ)句計(jì)算表達(dá)式3計(jì)算表達(dá)式1語(yǔ)句表達(dá)式2?YNbreak;for語(yǔ)句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ǔ)句及應(yīng)用 功能:中斷循環(huán)體的本次執(zhí)行(即跳過(guò)循環(huán)體中尚未執(zhí)行的語(yǔ)句),立即開(kāi)始執(zhí)行下一次循環(huán)。2022/7/10105后續(xù)語(yǔ)句語(yǔ)句YN表達(dá)式?后續(xù)語(yǔ)句語(yǔ)句表達(dá)式?YN3.5.2 continue語(yǔ)句及應(yīng)用(續(xù)) continue;while語(yǔ)句continue;do-while語(yǔ)句后續(xù)語(yǔ)句計(jì)算表達(dá)式3計(jì)算表達(dá)式1語(yǔ)句表達(dá)式2?YNcontinue;for語(yǔ)句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ì)于窮舉法來(lái)說(shuō),為了提高程序的效率,就要減少嘗試次數(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的近似根,過(guò)(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. 本站所有資源如無(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度個(gè)人創(chuàng)業(yè)無(wú)息貸款支持合同(二零二五版)3篇
- 2025年度個(gè)人房屋抵押貸款合同標(biāo)準(zhǔn)范本4篇
- 2025年度勞動(dòng)合同終止及離職員工離職手續(xù)辦理協(xié)議4篇
- 建筑用木材采購(gòu)合同(2篇)
- 工廠交叉作業(yè)安全管理協(xié)議書(shū)(2篇)
- 2025年消防設(shè)施技術(shù)改造合作協(xié)議范本3篇
- 2024年咨詢工程師(經(jīng)濟(jì)政策)考試題庫(kù)(a卷)
- 水管檢修口施工方案
- 二零二五年度門(mén)窗行業(yè)市場(chǎng)調(diào)研與分析合同7篇
- 春節(jié)最幸福的描寫(xiě)作文四篇
- 衡水市出租車(chē)駕駛員從業(yè)資格區(qū)域科目考試題庫(kù)(全真題庫(kù))
- 護(hù)理安全用氧培訓(xùn)課件
- 《三國(guó)演義》中人物性格探析研究性課題報(bào)告
- 注冊(cè)電氣工程師公共基礎(chǔ)高數(shù)輔導(dǎo)課件
- 土方勞務(wù)分包合同中鐵十一局
- 乳腺導(dǎo)管原位癌
- 冷庫(kù)管道應(yīng)急預(yù)案
- 司法考試必背大全(涵蓋所有法律考點(diǎn))
- 公共部分裝修工程 施工組織設(shè)計(jì)
- 《學(xué)習(xí)教育重要論述》考試復(fù)習(xí)題庫(kù)(共250余題)
- 裝飾裝修施工及擔(dān)保合同
評(píng)論
0/150
提交評(píng)論