第3章C程序的控制結(jié)構(gòu).ppt_第1頁
第3章C程序的控制結(jié)構(gòu).ppt_第2頁
第3章C程序的控制結(jié)構(gòu).ppt_第3頁
第3章C程序的控制結(jié)構(gòu).ppt_第4頁
第3章C程序的控制結(jié)構(gòu).ppt_第5頁
已閱讀5頁,還剩72頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、3.1 算法與程序,第3章 C程序的控制結(jié)構(gòu),程序 用編程語言編寫,完成特定功能的語句的集合。 編程步驟: 1. 明確問題 2. 問題:若干具體步驟(算法) 3. 算法:程序 4. 上機(jī)調(diào)試運(yùn)行 算法 解題方法或解題步驟的精確描述。,3.1 語句分類,1、控制語句 2、函數(shù)調(diào)用:scanf () , printf() 3、表達(dá)式語句: a=i+; i+; 4、空語句: ; 5、復(fù)合語句:, z=x+y; t=z/100; printf(“%fn”,t) ; ;,選擇語句:if , switch 循環(huán)語句:for , while , do_while 轉(zhuǎn)移語句:break , continue

2、, return , goto,;不能省,; 不能有,判斷是針對命題的“真”、“假”進(jìn)行的。例如: 1. ab。 2. abc,即ab 且bc。 3. ab 或cb。 4. 如果a不能被b整除。 它們的值都只能是一個(gè)邏輯(布爾)值:“真”或“假”。 早期的C語言不提供專門的邏輯(布爾)類型,規(guī)定用非0值表示“真”,用0值表示“假”。這樣,不管任何表達(dá)式,只要其值為非0(包括負(fù)數(shù)),就說明其為“真”;只要其值為0,就說明其為“假”。從而給判斷帶來很大的靈活性。 在C99中,增加了_Bool類型,并增加了頭文件,在其中定義了宏bool、true和false,用true存儲1,用false存儲0。,

3、3.2 判斷,3.2.1 命題的“真”、“假”與C語言中的邏輯值,比較兩個(gè)量(x, y)之間的關(guān)系 x y x = y x != y 比較的結(jié)果: 真 31 假 13,int x=2, y=6; x = (y 3) x = (x y),1 0,x=1 x=0,3.2.2 關(guān)系運(yùn)算與關(guān)系表達(dá)式,關(guān)系運(yùn)算符的優(yōu)先級,d = b+2 = 3 d = (b+2) = 3) b - 1 = a != c (b 1) = a) != c,運(yùn)算符優(yōu)先級: 算術(shù)運(yùn)算符 高 = = != = 低,關(guān)系表達(dá)式,3 x 5 x=1時(shí) x=4時(shí) ( 3x ) 5 恒為 1,.2.3 邏輯運(yùn)算和邏輯表達(dá)式,3 3 并且

4、 x 5 3 x /* 假設(shè)每次運(yùn)算后,將x的值置1 */ y = (3 1 exp1 else y=x*x;,1、 if else結(jié)構(gòu),if (exp) statement_1 else statement_2,scanf(%d%d, ,1、 if else結(jié)構(gòu),2、省略 else 的 if 結(jié)構(gòu) if (exp) statement_1,ch=getchar(); if(ch=a,ch=getchar(); if(ch=a ,2、省略 else 的 if 結(jié)構(gòu) if (exp) statement_1,/* 文件名:ex030301.c */ double abstr (double x)

5、 if (x0.0) x=-x; else x=x; return (x); ,double abstr (double x) if (x0.0) x=-x; return (x); ,不平衡的ifelse結(jié)構(gòu)會增加閱讀和理解程序的困難。,輸入3個(gè)數(shù),輸出其中的最大值。 #include void main( ) int a, b, c, max; printf(input a, b, c:n); scanf(%d%d%d, ,a max b c,max,max,3.3.2 嵌套的 if 語句,if (exp) statement1 else statement2,1、 else if 結(jié)構(gòu)(

6、 if-else if ) if (exp_1) statement_1 else if(exp_2) statement_2 else if(exp_n-1) statement_n-1 else statement_n,if 語句,if 語句,嵌套的if語句,if (exp_1) statement_1 else if(exp_2) statement_2 else if(exp_n-1) statement_n-1 else statement_n,n個(gè)分支需要n-1次比較,輸入變量x, 計(jì)算符號函數(shù): 1 當(dāng) x0 y = 0 當(dāng) x=0 -1 當(dāng) x0,計(jì)算符號函數(shù),if (x0)

7、y = 1; else if (x=0) y = 0; else y = -1;,輸入變量x, 計(jì)算y: x+1 x=3,if (x1) y = x+1; else if (x2) y = x+2; else if(x3) y = x+3; else y = x+4;,3.3.2 嵌套的 if 語句,if (exp) statement1 else statement2,2、嵌套的 if else 結(jié)構(gòu) if (exp_1) if(exp_2) statement_1 else statement_2 else if(exp_3) statement_3 else statement_4,if

8、 語句,if 語句,嵌套的if語句,輸入變量x, 計(jì)算符號函數(shù): 1 當(dāng) x0 y = 0 當(dāng) x=0 -1 當(dāng) x0,if (x=0) if(x0) y = 1; else y = 0; else y = -1;,嵌套的if語句,輸入變量x, 計(jì)算y: x+1 x=3,if (x2) if(x1) y = x+1; else y = x+2; else if(x3) y = x+3; else y = x+4;,if (x0) y = 1; else if (x=0) y = 0; else y = -1;,if (x=0) if(x0) y = 1; else y = 0; else y

9、= -1;,2種嵌套if語句的比較,else 和 if 的匹配,if (exp_1) if(exp_2) statement_1 else statement_2 else if(exp_3) statement_3 else statement_4,if (exp_1) if(exp_2) statement_1 else if(exp_3) statement_3 else statement_4,else 與最靠近它的、沒有與別的 else 匹配過的 if 匹配,if (exp_1) if(exp_2) statement_1 else if(exp_3) statement_3 els

10、e statement_4,改變else 和 if 的配對,if (exp_1) if(exp_2) statement_1 else if(exp_3) statement_3 else statement_4,if (exp_1) if(exp_2) statement_1 else if(exp_3) statement_3 else statement_4,if (exp_1) if(exp_2) statement_1 else if(exp_3) statement_3 else statement_4,if (exp_1) if(exp_2) statement_1 else e

11、lse if(exp_3) statement_3 else statement_4,3.3.3 switch結(jié)構(gòu)的應(yīng)用,switch(表達(dá)式) case 常量表達(dá)式1:語句段1 case 常量表達(dá)式2:語句段2 . case 常量表達(dá)式n:語句段n default :語句段n+1 ,switch(表達(dá)式) case 常量表達(dá)式1:語句段1 case 常量表達(dá)式2:語句段2 . case 常量表達(dá)式n:語句段n default :語句段n+1 ,表達(dá)式的值=常量表達(dá)式 2 的值,表達(dá)式,語句段1,語句段2,語句段n,語句段n+1,表達(dá)式的值=常量表達(dá)式 1 的值,表達(dá)式的值=常量表達(dá)式 n 的

12、值,其他,# include void main( ) int k; scanf(%d, ,輸入 2,輸入 6,# include void main( ) int k; scanf(%d, ,輸入 2,輸入 6,if(k=1) printf ( Im in the case1n ); else if(k=2) printf ( Im in the case2n ); else if(k=3) printf ( Im in the case3n ); else printf ( Im in the defaultn);,void main( ) char c; printf(Please in

13、put a character:n); c = getchar(); switch(c) case : case n: printf(This is a blank or enter); break; case 0 : case 1 : case 2 : case 3 : case 4 : case 5 : case 6 : case 7 : case 8 : case 9 : printf(This is a digit.n); break; default: printf(This is an other character. n); ,輸入 2,輸入 a,幾個(gè)常量表達(dá)式共有一個(gè)語句段,#

14、 include void main( ) char c; printf(Please input a character:n); c = getchar(); if(c= | c=n) printf(This is a blank or enter); else if(c=0 ,3.3.4 條件表達(dá)式,exp1 ? exp2 : exp3,非0,0,y = (x0) ? x+2 : x*x;,int n; (n0) ? 2.9 : 1 n = 10 n = -10,2.9 1.0,x+2 x0 y = x2 x=0,if ( x0 ) y=x+2; else y=x*x;,例3.10 計(jì)算a

15、+b的值。,/* 文件名:ex031001.c */ /* 計(jì)算絕對值 */ #include int main(void) /*計(jì)算a+b的值*/ float a,b; printf (input 2 reals please:); scanf (%f%f, ,input 2 reals please: 10-90 10.000000+-90.000000=100.000000,例3.11 輸入兩數(shù),輸出大者。,/* 兩數(shù)中取大 */ /* 文件名:ex031101.c */ #include int main(void) float a,b, max; printf (input 2 re

16、als please:); scanf (%f%f, ,input 2 reals please: -100 89 The max is 89.000000,問題 打印整數(shù)110 打印整數(shù)1100 打印整數(shù)1n,printf(%d, 1); printf(%d, 2); printf(%d, 10);,i=1; printf(%d, i); i+; printf(%d, i); i+; printf(%d, i); i+;,3.4 循環(huán)型程序設(shè)計(jì),迭代,i=1; while(i=10) printf(%d, i); i+; ,3.4.1 迭代與窮舉算法,1. 迭代迭代是一個(gè)不斷用新值取代變量的

17、舊值,或由舊值遞推出 變量的新值的過程。 例3.12 人口增長問題。按年0.2%的增長速度,現(xiàn)有13億人, 10年后將有多少人? 設(shè)現(xiàn)人口數(shù)為m,則第1年后人口變?yōu)椋?m = m*(1+0.2%) 即將 m 的值用m*(1+2%)替代。 第2年后,把上述替代(賦值表達(dá)式)再執(zhí)行一次。 要計(jì)算10年后的人口,就是把上述表達(dá)式執(zhí)行10次。,迭代與下列因素有關(guān): 初值; 迭代公式; 迭代次數(shù)或迭代終止標(biāo)志。,循環(huán)控制有兩種辦法:計(jì)數(shù)法與標(biāo)志法。計(jì)數(shù)法要先確定循環(huán)次數(shù),然后逐次測試,完成測試次數(shù)后,循環(huán)結(jié)束。標(biāo)志法是達(dá)到某一目標(biāo)后,使循環(huán)結(jié)束。,. 窮舉窮舉是另一種重復(fù)型算法。它的基本思想是,對問題的

18、所 有可能狀態(tài)一一測試,直到找到解或?qū)⑷靠赡軤顟B(tài)都測試過為止。 例3.15 輸入10個(gè)數(shù),將最大的一個(gè)數(shù)打印出來。 算法:S1:輸入1個(gè)數(shù),暫時(shí)作為擂主最大數(shù)。 S2:輸入9個(gè)數(shù)窮舉這9個(gè)數(shù),每輸入一個(gè),打一次擂臺把 最大數(shù)與剛輸入的數(shù)據(jù)進(jìn)行比較,把大者作為新擂主最大數(shù)。 S3:輸出最大數(shù)。,3.4.2 while結(jié)構(gòu),while (表達(dá)式) 語句;,語 句,表達(dá)式,非0,0,i=1; while(i=10) printf(%d, i); i+; ,循環(huán)體 循環(huán)不變式(迭代公式) 改變循環(huán)條件,10 求 sum= i i=1 sum=0 sum+1 sum sum+2 sum sum+3 s

19、um sum+10 sum,sum=sum+?,sum=0; i=1; while(i=10) sum=sum+i; i+; ,循環(huán)不變式,例3.17 計(jì)算人口增長的C程序。 按照圖所示的算法,可以很容易地得到下面的C程序。 程序的主體結(jié)構(gòu)是一個(gè)while重復(fù)結(jié)構(gòu)。,/* 文件名:ex031701.c */ /* 計(jì)算人口增長 */ #include int main(void) double m=13; int i=1; while(i=10) m=m*(1+0.002); i+; printf(“Population after 10 yers is:%fn”,m); return 0;

20、,Population after 10 yers is: 13.262353,例3.20 輸入多個(gè)數(shù),輸出其中最大者的C程序(根據(jù)圖3.25),/* 文件名:ex032001.c */ #include #define FLAG -32768 int main(void) int max,n; printf(“Input a number:”); scanf(“%d”, ,這個(gè)例子中使用了“-32768”作為判斷循環(huán)結(jié)束的一個(gè)標(biāo)志。當(dāng)處理字符時(shí),可以使用系統(tǒng)定義的標(biāo)志“EOF”(操作Ctrl+z 即+z),例3.21 將輸入的字符原樣輸出。,/* 文件名:ex032101.c */ /* 測

21、試字符結(jié)束符 */ include int main(void) int c; while (c=getchar()!=EOF) putchar(c); return 0; ,e e h h z,include int main(void) int c; c=getchar(); while (c!=EOF) putchar (c); c=getchar(); return 0; ,程序中的“EOF”是一個(gè)符號常數(shù),稱為文件結(jié)束標(biāo)志,它是在文件stdio.h中定義的: define EOF -1 當(dāng)從鍵盤輸入Z(或遇文件結(jié)束標(biāo)記),c的值得到-1,等于EOF。,do 語句 while (表達(dá)式

22、);,i=1; do printf(%d, i); i+; while(i=10);,語 句,表達(dá)式,非0,0,3.4.3 do while結(jié)構(gòu),while (表達(dá)式) 語句;,語 句,表達(dá)式,非0,0,while 和 do-while,do 語句 while (表達(dá)式);,語 句,表達(dá)式,非0,0,先循環(huán),后判斷,先判斷,后循環(huán),while 和 do-while 的用法比較,輸入一些數(shù),求和,直到輸入負(fù)數(shù)為止。 void main( ) int x, sum=0; do scanf(%d, ,void main( ) int x, sum=0; scanf(%d, ,輸入 1 2 5 -10

23、,輸入 -10 1 2 5,sum-x,for (exp1; exp2; exp3) 語句;,exp3,exp2,非0,0,exp1,語 句,循環(huán)體,3.4.4 for 結(jié)構(gòu),while (表達(dá)式) 語句;,語 句,表達(dá)式,非0,0,for (exp1; exp2; exp3) 語句;,exp3,exp2,非0,0,exp1,語 句,exp1; while(exp2) 語句; exp3; ,while 和 for,while 和 for,while (表達(dá)式) 語句;,for (exp1; exp2; exp3) 語句;,exp1; while(exp2 語句; exp3; ,sum=0; i

24、=1; while(i=10) sum=sum+i; i+; ,sum=0; for(i=1; i=10; i+) sum=sum+i;,程序舉例,例T1-1 求1+2+3+4+ n 例T1-2 求1+1/2+1/3+1/4+ 1/n 例T1-3 求1-1/2+1/3-1/4+ 1/n 例T1-4 求1-1/3+1/5-1/6+ 前n項(xiàng)之和 例T2-1 求n! 例T2-2 求xn 例T3-1 求1-1/3+1/5-1/7+ ,直到最后1項(xiàng)的絕對值10-5 例T4-1 輸入100個(gè)整數(shù),求其中正數(shù)之和 例T4-2 輸入一個(gè)正整數(shù)n, 再輸入n個(gè)數(shù),輸出最大值 例T5 輸出Fibonacci序列前

25、20個(gè)數(shù),例T1-1 求1+2+3+4+ n,算法: i =1 to n s=s+t t+ i+,程序段: s=0; for(i=1; i=n; i+) s=s+i;,算法: i =1 to n s=s+i i+,例T1-2 求1+1/2+1/3+ 1/n,算法: i =1 to n s=s+t t=1.0/i i+,程序段: s=0; for(i=1; i=n; i+) s=s+1.0/i;,算法: i =1 to n s=s+t t+ i+,例T1-3 求1-1/2+1/3-1/4+ 1/n,i =1 to n s=s+t t=1.0/i i+,程序段: s=0; flag=1; for(

26、i=1; i=n; i+) s=s+1.0/i*flag; flag=-flag; ,算法: i =1 to n s=s+t t=1.0/i*flag flag=-flag i+,例T1-4 求1-1/3+1/5- 前n項(xiàng)和,算法: i =1 to n s=s+t t=1.0/i*flag flag=-flag i+,程序段: s=0;flag=1;tt=1; for(i=1; i=n; i+) s=s+1.0/tt*flag; tt+=2; flag=-flag; ,算法: i =1 to n s=s+t t=1.0/tt*flag flag=-flag tt=tt+2 i+,例T2-1 求

27、n!,算法: i =1 to n f=f*t t+ i+,程序段: f=1; for(i=1; i=n; i+) f=f*i;,算法: i =1 to n f=f*i i+,例T2-2 求xn,算法: i =1 to n f=f*t t+ i+,程序段: f=1; for(i=1; i=n; i+) f=f*x;,算法: i =1 to n f=f*t t=x i+,例T3-1 求1-1/3+1/5-直到最后1項(xiàng)的絕對值10-5,程序段: s=0; flag=1; tt=1; t=1; while(fabs(t) = 1E-5) s = s+t; flag = -flag; tt += 2;

28、t = 1.0/tt*flag; ,i =1 to n s=s+t t=1.0/tt*flag flag=-flag tt=tt+2 i+,算法: while |t|=1E-5 s=s+t flag=-flag tt=tt+2 t=1.0/tt*flag,例T4-1 輸入100個(gè)整數(shù),求其中正數(shù)之和,# include void main() int i , sum=0, x; for (i=0; i0) sum=sum+x; printf(%d,sum); ,輸入3個(gè)數(shù),輸出其中的最大值。 #include void main( ) int a, b, c, max; printf(inpu

29、t a, b, c:n); scanf(%d%d%d, ,a max b c,max,max,例T4-1輸入一個(gè)正整數(shù)n, 再輸入n個(gè)數(shù),輸出最大值,void main() int i , max, n, x; scanf(%d, ,max,x,例T5 輸出Fibonacci序列前20個(gè)數(shù),1, 1, 2, 3, 5, 8, x1 x2 t x1 x2 t,程序段: x1=x2=1; printf(%d %d, x1, x2); for(i=1; i=18; i+) t=x1+x2; printf(%d , t); x1=x2; x2=t; ,x1=x2=1; t=x1+x2; x1=x2;

30、x2=t;,3.4.5 break 和 continue 語句,#include stdio.h void main( ) char c; int i=0; for (i=0; i10;i+) c=getchar(); if (c=n) break; putchar(c); ,循環(huán)何時(shí)結(jié)束?,c=getchar(); for (i=0; i10 ,for (i=0; ;i+) c=getchar(); if ( i = 10 | c = n) break; putchar(c); ,1,break 流程,結(jié)束循環(huán) while(exp) 語句1 if (expb) break; 語句2 ,非0,

31、0,exp,語句1,0,expb,語 句2,循環(huán)體,非0,continue 流程,跳過continue后面的語句,繼續(xù)下一次循環(huán) while(exp) 語句1 if (expc) continue; 語句2 ,非0,0,exp,語句1,0,expb,語 句2,循環(huán)體,非0,break 和 continue,#include stdio.h void main( ) char c; int i=0; for (i=0; i10;i+) c=getchar(); if (c=n) break; putchar(c); ,#include stdio.h void main( ) char c; int i=0; for (i=0; i10;i+) c=getchar(); if (c=n) continue; putchar(c); ,輸入:abc efgh 123 ,輸出:abcefgh1,輸出:abc,例T6 輸入m,判斷m是否為素?cái)?shù),算法:除了1和m,不能被其它數(shù)整除。 m %2 %3 %4 %5 不是素?cái)?shù) | =0 =0 是素?cái)?shù) for(i=2; in) printf(yesn) else

溫馨提示

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

評論

0/150

提交評論