實用c語言程序設(shè)計第3章三種基本結(jié)構(gòu)程序設(shè)計詳解課件_第1頁
實用c語言程序設(shè)計第3章三種基本結(jié)構(gòu)程序設(shè)計詳解課件_第2頁
實用c語言程序設(shè)計第3章三種基本結(jié)構(gòu)程序設(shè)計詳解課件_第3頁
實用c語言程序設(shè)計第3章三種基本結(jié)構(gòu)程序設(shè)計詳解課件_第4頁
實用c語言程序設(shè)計第3章三種基本結(jié)構(gòu)程序設(shè)計詳解課件_第5頁
已閱讀5頁,還剩47頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第三章 三種基本結(jié)構(gòu)程序設(shè)計3.1 順序結(jié)構(gòu)程序設(shè)計 3.2 選擇結(jié)構(gòu)程序設(shè)計 3.3 循環(huán)結(jié)構(gòu) 2022/8/203.1 順序結(jié)構(gòu)程序設(shè)計順序結(jié)構(gòu)程序:就是執(zhí)行時依語句排列順序一條接著一條地執(zhí)行,不發(fā)生控制流的轉(zhuǎn)移。 特點:每個程序都是按照語句的書寫順序依次執(zhí)行的,它是最簡單的結(jié)構(gòu)。不可或缺的若干語句,用把它們括起來,這樣的語句體稱為復(fù)合語句。復(fù)合語句在邏輯上等價于一條語句,復(fù)合語句內(nèi)部還可嵌套復(fù)合語句。 ABab2022/8/20 3.1.1 程序設(shè)計簡例main()char ch= a; /*定義變量并賦值 */int a= 98; unsigned b=1000;long c= 123

2、456789;float x= 3.14;double y=1.2345678;printf (1) a= % d,a= % c,ch= % d,ch= % cn,a,a,ch,ch);/*輸出*/printf (2) b= % u n,b);printf (3) c= % ld n,c);printf (4) x= % f,y= % fn,x,y);printf (5) x= % e,y= % e n,x,y);printf (6) y= % - 10.2fn,y);【例 1】 分析下列程序,觀察運行結(jié)果 運行結(jié)果 (1) a=98,a= b,ch=97,ch= a(2) b=1000(3)

3、 c=123456789(4) x=3.140000,y=1.234567(5) x=3.14000e+00,y=1.23456e+ 00(6) y=1.232022/8/20程序設(shè)計簡例【例 2】 輸入一個三位的整數(shù),分解它的符號、百位數(shù)字、十位數(shù)字和個位數(shù)字,然后依次輸出。#include #include /* 程序中使用了數(shù)學(xué)函數(shù) abs */ main() char c1,c2,c3,c4; /* 定義變量 */int x;printf(please input a numer: n);/* 輸入提示信息 */ scanf(%d,&x); /* 鍵盤輸入 x 的值 */c4=x=0?

4、+: -; /* 將 x 的符號賦給 c4 */x=abs(x); /* 取 x 的絕對值 */c3=x%10+48; /* 求得 x 的個位數(shù)字,加 48 轉(zhuǎn)換為對應(yīng)數(shù)字字符的 ASCII 碼值*/x=x/10; /* 去掉個位數(shù), 取出 x 的高位 */c2=x%10+48; /* 求得 x 的十位數(shù)字, 加 48 轉(zhuǎn)換為對應(yīng)的 ASCII 碼值 */c3=x/10+48; /* 求得 x 的百位數(shù)字, 加 48 轉(zhuǎn)換為對應(yīng)的 ASCII 碼值 */printf(%cn%cn%cn%cn,c4,c3,c2,c1); /* 輸出符號位,百位,十位,個位 */ 程序的執(zhí)行結(jié)果:please i

5、nput a numer:-321-,3,2,12022/8/20程序設(shè)計簡例【例 3】 在屏幕輸出 “please input your name:”,再從鍵盤上輸入一個名字,然后顯示“Hello!”,在下一行顯示輸入的名字。# include main ()char name 10;/* 存放名子的變量在后面章節(jié)再詳細(xì)介紹 */printf(please input you rname: n);/* 輸出提示信息 */scanf(% s,name); /* 讀入名字 */printf(Hello! n); /* 輸出 Hello!*/printf(% s,name); /* 輸出讀入的名字

6、 */程序的執(zhí)行結(jié)果:please input your name:Li gangHello!Li gang2022/8/20程序設(shè)計簡例【例 4】 讀入一個小寫字母,將其轉(zhuǎn)換成大寫字母后輸出,同時輸出其對應(yīng)的 ASCII 編碼。# include main() char ch1, ch2 ;printf ( Enter a lower letter : ) ;ch1=getchar ( ) ; /*利用字符輸入函數(shù),實現(xiàn)鍵盤輸入一個字符,賦給字符變量 ch1 */printf (letter: %c , ASCII:%dn,ch1,ch1 );/* 屏幕顯示鍵盤輸入的字符,并顯示該字符的 A

7、SCII 代碼值*/ch2=ch1-32; /*將小寫字母轉(zhuǎn)換成對應(yīng)的大寫字母 */ printf (letter: %c , ASCII:%dn,ch2,ch2 );/*屏幕顯示轉(zhuǎn)換后的字符,及該字符的 ASCII 代碼值*/程序運行情況:Enter a lower letter: aletter: a, ASCII: 97letter: A, ASCII: 652022/8/20程序設(shè)計簡例【例 5】 在100.0g苯中加入13.76g聯(lián)苯(MB),所形成溶液的沸點為82.40(t2),計算聯(lián)苯的相對分子量。已知純苯的沸點為80.10(t1),Kb=2.57。# include main(

8、) float mA,mB,MB,Kb,t1,t2; /*定義變量*/printf(please input:mA,mB,Kb ,t1,t2n);/*輸出“輸入數(shù)據(jù)”提示信息*/scanf(% f,% f,% f,%f,% f,& mA,&mB,&Kb ,&t1,&t2); /*讀入數(shù)據(jù)*/MB= (Kb* mB)/ (t1t2) *mA); /*計算聯(lián)苯的分子量*/printf (MB= %6.2f , MB ); /*輸出聯(lián)苯的分子量*/printf (g/mol n ); /*打出分子量的單位*/程序運行情況:please input:mA,mB,Kb ,t1,t2100.0,13.76

9、,2.57,80.10,82.40MB=153.75 g/mol2022/8/203.1.2 格式輸入輸出的一般形式格式、格式輸出函數(shù)printf()printf() 函數(shù)調(diào)用的形式: printf(“格式控制字符串”,輸出項表) 或 printf(字符串)在該函數(shù)調(diào)用時,在其后面加上分號,就構(gòu)成了格式輸出語句。printf 中的輸出項是和前面的格式控制字符串按順序一一對應(yīng)的?!绊棥笨梢允浅A俊⒆兞?、表達式、數(shù)組和函數(shù)調(diào)用,其值應(yīng)和格式說明相容。 1格式控制字符串該字符串放在一對雙引號中,它可以包含以下三部分內(nèi)容。(1)按原樣輸出的字符:(2)轉(zhuǎn)義字符:(3)與輸出項對應(yīng)的“格式說明符”:要求

10、以%開頭,格式說明符在個數(shù)和類型上應(yīng)該與輸出項相對應(yīng)。 2022/8/20 輸出格式字符表 格式符輸出形式輸出項類型數(shù)據(jù)輸出方式-md-mo-mx-mud十進制整數(shù)o八進制整數(shù)x十六進制整數(shù)u無符號整數(shù)int, shortunsigned intunsigned shortchar有-,左對齊;無-,右對齊無 m 或總寬度超過位時按實際寬度輸出;不足m 位時,補空格-mld-mlo-mlx-mluld十進制整數(shù)lo八進制整數(shù)lx十六進制整數(shù)lu 無符號整數(shù)longunsigned long-m.nf-m.nef十進制小數(shù)e十進制指數(shù)自動選定格式floatdouble有-,左對齊;無-,右對齊

11、無 m.n 或總寬度超過時,則按實際寬度輸出;有 m.n 輸出 m 位,其中小數(shù) n 位;不足 m 位時,加空格g自動選定f或e格式floatdouble不輸出尾數(shù)中無效的0 ,以盡可能少地占輸出寬度。-mcc單個字符char有-,左對齊; 無-,右對齊無 m 則輸出單個字符;有 m 則輸出m 位,不足 m 位時補空格-m.nss字符串字符串有-,左對齊;無-,右對齊無 m.n 則按實際輸出全部字符串 有 m.n 則輸出前n 個字符串注意:m、n 均是正整數(shù), m 主要用于控制輸出數(shù)據(jù)的總寬度,n 用于控制輸出實數(shù)的小數(shù)位數(shù)或控制輸出字符串時可以輸出的實際字符數(shù)。2022/8/20格式輸入輸出

12、的一般形式格式2輸出項表 printf函數(shù)中的 “輸出項表”部分由表達式組成,這些表達式應(yīng)與 “格式控制字符串”中的格式說明符的類型一一對應(yīng),若 “輸出項表”中有多個表達式,則每個表達式之間應(yīng)由逗號隔開,各輸出項可以是任意合法的表達式(包括常量、變量和函數(shù)調(diào)用)。因此 printf 函數(shù)也具有計算的功能。 printf ( %dn , 100) ; /*輸出顯示100*/ printf ( %dn , 1234000+5678) ; /*輸出顯示:1234+5678*/ printf ( %fn , (x=123.0)+(y=0.4567) ; /*輸出顯示:123.456700*/ prin

13、tf ( %6.2fn , 123.4567) ; /*輸出顯示:123.46*/ printf ( %.3fn , 123.4567) ; /*輸出顯示:123.457*/2022/8/20格式輸入輸出的一般形式格式3 printf函數(shù)的控制字符的附加說明標(biāo) 記作 用(加號)空格#0*輸出的正數(shù)前面加“+”號,負(fù)數(shù)前面加“”號在輸出的正數(shù)前加一個空格“#o”使輸出的八進制數(shù)前加 0“#x”或“#X”使輸出的十六進制數(shù)前加0 x或0X對沒有小數(shù)部分的浮點數(shù), #迫使 f、e、E、g、G 打印出小數(shù)點且“#g”不去掉尾部的無效0用0(零)去填充域?qū)捴付ǜ↑c數(shù)的輸出位數(shù)2022/8/20格式輸入輸

14、出的一般形式格式二. 格式輸入函數(shù) scanf()scanf()調(diào)用的格式: scanf(格式控制字符串,輸入地址項表列);該函數(shù)具有按格式字符串中規(guī)定的格式,在鍵盤上輸入各輸入項的數(shù)據(jù),并依次賦給各輸入項,且具有對從輸入流中接收到的數(shù)據(jù)進行格式轉(zhuǎn)換的功能。因為要求在內(nèi)存中保存所接收到的數(shù)據(jù),因此,需要提供接收數(shù)據(jù)的變量的地址。地址運算符&用于取得指定變量的地址。當(dāng)以數(shù)值格式從輸入流中讀取數(shù)據(jù)時,scanf()可以跳過空格、換行及跳格符(在輸入流中,數(shù)值型數(shù)據(jù)須以這些空白字符 分隔)。2022/8/20格式輸入輸出的一般形式格式1格式控制字符串格式符輸入形式輸入項類型數(shù)據(jù)輸入方式mdmomxd

15、十進制整數(shù)o八進制整數(shù)x十六進制整數(shù)int, shortunsigned intunsigned short無 m 按實際位數(shù)輸入 有 m只能輸入 m 位 不足 m 位,以 Enter 鍵或空格結(jié)束mldmlomlxld十進制整數(shù)lo八進制整數(shù)lx十六進制整數(shù)longunsigned longmfmef十進制小數(shù)e十進制指數(shù)floatdoublemlfmlelf十進制小數(shù)le十進制指數(shù)floatdouble mcc單個字符char無 m僅取單個字符,以 Enter 結(jié)束有 m 輸入 m 個字符,僅取第一個 mss字符串字符串無 m 輸入字符至回車或空格結(jié)束 有 m 僅取前 m 個字符 2022

16、/8/20格式輸入輸出的一般形式格式2輸入地址表列 scanf函數(shù)中的 “地址表列”部分是由變量的地址組成的,如果有多個變量,則各變量之間用逗號隔開。地址運算符為 “&”,如變量 a的地址可以寫為 &a。輸入項表中的各輸入項,應(yīng)該是存放輸入數(shù)據(jù)存儲單元的地址。使用時一定注意,各輸入項之間用“,”號分隔開,各變量名前一定要加“&”求地址運算符。3說明(1)在 scanf函數(shù) “格式控制”部分中的每個格式說明符都必須在 “地址表”中有一個變量與之對應(yīng),格式說明符必須要與相應(yīng)變量的類型一致。而且,輸入的數(shù)據(jù)必須是常量,不能是表達式,而且按輸入項的前后次序順序輸入數(shù)據(jù)。 (2)在輸入數(shù)據(jù)時,各數(shù)據(jù)之間

17、要使用 “空格”、“Tab”或 “回車”鍵(Enter 鍵)作為分隔;如果格式說明符之間包含其他字符,則輸入數(shù)據(jù)時,應(yīng)輸入與這些字符相同的字符做間隔。 2022/8/20格式輸入輸出的一般形式格式(3)在輸入字符型數(shù)據(jù)時,由于 “空格”也作為有效字符輸入,因此,不需要用 “空格”做分隔,只要輸入一個字符即可。故輸入字符型數(shù)據(jù)時,數(shù)據(jù)之間不用分隔符。 (4)在格式說明符的前面指定輸入數(shù)據(jù)所占的列數(shù)時,系統(tǒng)將自動按此列數(shù)來截取所需的數(shù)據(jù)。 (5)如果在格式控制字符串中,含有不屬于格式說明的其他字符,在輸入數(shù)據(jù)時,必須在對應(yīng)位置上原樣輸入這些字符。 (6)如果在% 后有一個 “*”附加說明符,表示跳

18、過它指定的列數(shù)。 (7)在scanf函數(shù)中不使用u說明符,對unsigned型數(shù)據(jù),以d或o、x格式輸入。 (8)在用scanf函數(shù)輸入數(shù)據(jù)時,不能規(guī)定精度。 2022/8/203.1.3 字符輸入、輸出函數(shù)1字符輸入函數(shù)格式: getchar()或getch()調(diào)用函數(shù)時,當(dāng)程序執(zhí)行到 getchar 函數(shù)調(diào)用語句時,將等待輸入,只有當(dāng)用戶輸入字符,并按 Enter鍵后,才接收輸入的第 1 個字符,并在屏幕上回顯該字符,同時送到內(nèi)存的緩沖區(qū),準(zhǔn)備賦給指定的變量。并且對空格符、制表符(Tab 鍵)和回車符(Enter 鍵)都被當(dāng)作有效字符讀入。getch()函數(shù)是立即接收用戶來自鍵盤上的輸入,

19、不把字符回顯到屏幕上。 2字符輸出函數(shù) putchar格式:putchar(ch) 其作用是將參數(shù)代表的字符在標(biāo)準(zhǔn)輸出設(shè)備(通常是顯示器)上加以輸出。參數(shù) ch 可以是字符常量、字符變量或整型表達式,其功能等價于:printf(%c,ch)。 2022/8/203.2 選擇結(jié)構(gòu)程序設(shè)計 分支語句有兩類:一類是 if語句,另一類是 switch語句。條件語句的作用是使程序按某種條件有選擇地執(zhí)行一條或多條語句。其中,條件可以用表達式來描述,如關(guān)系表達式和邏輯表達式。 選擇結(jié)構(gòu)程序中的語句(段)是否執(zhí)行,取決于某個“條件”是否成立。選擇結(jié)構(gòu)的程序又有三種形式:單分支結(jié)構(gòu)、雙分支結(jié)構(gòu)和多分支結(jié)構(gòu)。20

20、22/8/203.2.1 程序設(shè)計簡例【例 6】 輸入 2 個數(shù),如果它們的值不相等,則交換并輸出它們的值;否則,輸出“equal”。 # include void main( ) int a, b, t ; printf(input a, b:n); scanf(d,d, &a, &b); if(a!=b) /*語句 1 是一條復(fù)合語句*/ t=a; a=b; b=t; printf(a=d,b=dn,a,b);elseprintf(equaln); /*語句2*/程序的執(zhí)行結(jié)果1:input a, b:10,12a=12,b=10程序的執(zhí)行結(jié)果2:input a, b:10,10equal

21、 2022/8/20程序設(shè)計簡例【例 7】 輸入 3 個整數(shù),輸出其中的最大值。# include void main( ) int a,b,c,max; /*max中放最大值*/printf(inputa,b,c:n);scanf(ddd,&a,&b,&c); max=a; /*先假設(shè)a是最大的數(shù)*/if (maxb) max=b; /*如果 b 比假設(shè)的最大值大,再假設(shè) b是最大的數(shù)*/if (max0,方程有兩個不等的實根;(2)若 b2-4ac=0,方程有兩個相等的實根;(3)若 b2-4ac0,方程有兩個復(fù)根。 yyn開始a= =0這是一次方程x=c/bdelta=b*b4*a*c輸

22、入a,b,c方程有兩個相等的實根x1,x2=b/(2*a)n方程有兩個虛根n方程有兩個不相等的實根x1=(-b+sqrt(delta)/(2*a)x2=(-b-sqrt(delta)/(2*a)結(jié)束圖 3-1 解一元二次方程的流程示意圖ydelta= = 0delta 02022/8/20程序設(shè)計簡例main()float a,b,c,delta,x1,x2,realpart,imagepart;printf(請輸入 a,b,c:n);scanf(% f,% f,% f,&a,&b,&c);if(fabs(a) = 1e- 6) printf(這是一次方程 x= % fn,- c/b); el

23、se delta= b*b- 4*a*c; if(fabs(delta)1e-6)2022/8/20程序設(shè)計簡例 x1= (- b+ sqrt(delta)/(2*a); x2= (- b- sqrt(delta)/(2*a);printf(有兩個不等的實根:x1= % 8.4f和 x2= % 8.4fn,x1,x2); else realpart= - b/(2*a); imagepart= sqrt(- delta)/(2*a); printf(有兩個虛根:); printf(% 8.4f+ % 8.4fin,realpart,imagepart); printf(% 8.4f- % 8.

24、4fin,realpart,imagepart); 程序運行:請輸入 a,b,c:3.00,4.00,5.00有兩個虛根:-0.6667+ 1.1055i- 0.6667- 1.1055i2022/8/20程序設(shè)計簡例【例 9】 從鍵盤輸入一個月份 (1 12),并顯示該月份的英文名稱。main()int month;printf(Enter a month);scanf(% d,&month);switch(month) /*根據(jù) month 的當(dāng)前取值,做出多分支選擇*/case 1:printf(Januaryn);break; case 2:printf(Februaryn);brea

25、k; case 3:printf(Marchn);break; case 4:printf(Apriln);break; case 5:printf(Mayn);break; case 6:printf(Junen);break; case 7:printf(Julyn);break; case 8:printf(Augusn);break; case 9:printf(Septembern);break; case 10:printf(Octobern);break; case 11:printf(Novembern);break; case 12:printf(Decembern);bre

26、ak; default:printf(Data Error!n);break 2022/8/203.2.2 單分支與雙分支結(jié)構(gòu) 1.單分支結(jié)構(gòu)程序 格式: if (表達式) 語句 1; 假(0)真(0)語句1表達式圖3-2 單分支結(jié)構(gòu) 語句 1 若多于一條,則需用復(fù)合語句。if 語句的功能如圖 3-2 所示。語句中的“表達式”項可以是算術(shù)表達式、關(guān)系表達式或邏輯表達式,甚至可以是任意類型的數(shù)值。 if 語句的執(zhí)行過程是:遇到 if 關(guān)鍵字,首先計算圓括號中的表達式的值,如果表達式的值(或數(shù)值的)值不為 0(真)時,就執(zhí)行其后的語句 1;表達式值為 0(假)時,就跳過其后的語句 1,控制轉(zhuǎn)移到下

27、一條語句。2022/8/20單分支與雙分支結(jié)構(gòu)2.雙分支結(jié)構(gòu)程序格式:if(表達式)語句 1; else 語句 2; 語句 1、語句 2 若多于一條語句,則應(yīng)使用復(fù)合語句。其執(zhí)行過程如圖 3-3所示。 假(0)真(0)語句1表達式圖3-3 雙分支結(jié)構(gòu)語句2該語句遇到關(guān)鍵字 if,首先運算小括號中的表達式,如表達式的值為非 0,則執(zhí)行緊跟其后的語句 1,執(zhí)行完語句 1 后,執(zhí)行 if-else 結(jié)構(gòu)后面的語句;如果表達式的值為 0,則執(zhí)行關(guān)鍵字 else 后面的語句 2,接著執(zhí)行 if-else 結(jié)構(gòu)后面的語句。2022/8/203.2.3 多分支結(jié)構(gòu) 嵌套形式 1 格式: if(表達式 1)

28、if(表達式 2)語句 1; else 語句 2; else 語句 3;1.if-else 語句嵌套結(jié)構(gòu) 執(zhí)行流程如圖 3-4所示,在if-else 語句中包含另一 if-else 語句,即第一個 else與第二個 if結(jié)合,而最后一個 else與第一個 if結(jié)合。假(0)真(0)表達式1圖3-4 嵌套形式1語句3假(0)真 (0)語句1表達式2語句22022/8/20多分支結(jié)構(gòu) 嵌套形式 2 格式: if(表達式 1) if(表達式 2)語句 1 ; else語句 2;語句1語句2假 (0)真 (0)表達式1圖3-5 嵌套形式2假 (0)真 (0)表達式2 執(zhí)行流程如圖 3-5所示,在if-

29、else 語句中包含一個單分支結(jié)構(gòu)復(fù)合語句。即else與第一個 if結(jié)合。因為第二個 if在復(fù)合語句中,復(fù)合語句是一條語句,不能與復(fù)合語句外的 else結(jié)合。如果把去掉,則 else與第二個 if結(jié)合。2022/8/20多分支結(jié)構(gòu) 嵌套形式 3 格式: if(表達式 1)語句 1; else if(表達式 2)語句 2; else語句 3; 執(zhí)行流程如圖 3-6所示,在if-else 語句的else后緊跟另一個if-else 語句。C 語言規(guī)定:else總是與它前面最近的同一復(fù)合語句內(nèi)的不帶 else 的 if結(jié)合。在 if語句嵌套形式 2中可以看到,else與 if在同一復(fù)合語句內(nèi)才能結(jié)合。

30、圖3-6 嵌套形式3語句3語句1假(0)真(0)表達式1假(0)真(0)表達式2語句2 嵌套形式語句結(jié)構(gòu)執(zhí)行過程是:從上到下逐一對 if 后面的表達式進行運算。當(dāng)某一個表達式的值為真(非 0) 時,就執(zhí)行緊跟其后的相關(guān)子句中的語句,而后面的其余部分均被跳過。當(dāng)有 n 個 if 語句,就有 n+1 個分支。2022/8/20多分支結(jié)構(gòu)2switch 語句switch 語句的格式:switch (表達式) case 常量表達式 1: 語句組 1; break;case 常量表達式 2: 語句組 2; break; case 常量表達式 n: 語句組 n; break; default: 語句組 n

31、+1;break; 2022/8/20多分支結(jié)構(gòu)表達式常量表達式1語句組1break常量表達式2語句組2breakdefault語句組n+1break常量表達式n語句組nbreak圖 3-7 switch 語句2022/8/20多分支結(jié)構(gòu)注意 (1)switch 關(guān)鍵字后面的表達式,可以是任意合法的表達式。 (2)一定要用圓括號把 switch 后面的(表達式)括起來。否則會給出出錯信息。 (3)所有 case 子句后所列的常量表達式值都不能相同,且每個 case 關(guān)鍵字后面的常量表達式的類型,必須與 switch 關(guān)鍵字后面的表達式類型一致。 (4)break 語句的作用是退出 switch

32、 語句。如果“語句組i”的后面沒有安排 break 語句,那么執(zhí)行完后,會繼續(xù)往下執(zhí)行。(5)default 可以省略。如果有它,其位置不一定放在整個語句的最后。2022/8/20多分支結(jié)構(gòu)(6)一定要用花括號將 switch 里的 case、default 等括起來。在case后面中雖然包含一個以上執(zhí)行語句,但可以不必用花括弧括起來,會自動順序執(zhí)行本case后面所有的執(zhí)行語句。當(dāng)然加上花括弧也可以。(7)執(zhí)行 switch 語句時,首先計算其后的表達式的值,然后自上而下順序?qū)ふ乙粋€ case 后面的常量與該值相匹配,找到后按順序執(zhí)行此 case 后面的所有語句,包括后續(xù)的 case 子句,而

33、不再進行判斷。如果所有 case 中的常量值都不能與 switch 后面的表達式的值相等,就執(zhí)行default 關(guān)鍵字后面的語句;若既沒有相匹配的 case,也沒有 default 關(guān)鍵字,則直接跳過 switch語句。 2022/8/20多分支結(jié)構(gòu)3if 語句與 switch 語句的區(qū)別 if 語句的嵌套形式和 switch 語句都能實現(xiàn)多分支選擇,在某種場合也可以互換替代,但 if 語句適應(yīng)于各種條件的選擇,能夠計算關(guān)系或邏輯表達式;switch 語句只適用于檢驗表達式與哪個值相等的情形。 2022/8/203.3 循環(huán)結(jié)構(gòu)for 循環(huán)語句while 循環(huán)語句do-while 循環(huán)語句 c

34、ontinue/break 語句goto 語句和語句標(biāo)號 2022/8/203.3.1 程序設(shè)計簡例i=1,s=0i 100s=s+1i+假真圖3-8【例 10】計算 1+2+3+99+100。# includestdio.hmain( )int s,i;s=0; /*累加和的變量初值為0 */ i=1; /*累加數(shù)從1開始 */loop:if(i=100) /*累加數(shù)不大于100 */s= s+ i; /*進行累加* / i+; /*產(chǎn)生下一個累加數(shù)*/goto loop;/*使程序流程轉(zhuǎn)到if語句,以便繼續(xù)累加下一個數(shù)*/ printf(s=1+2+100= % d n,s);/*輸出累加

35、* /程序運行結(jié)果:s=1+2+ +100=50502022/8/20程序設(shè)計簡例【例 11】輸入任意一個大于等于2的自然數(shù)n,判斷該數(shù)是否是素數(shù)并輸出相應(yīng)的結(jié)果。真真真假假假開始輸入ntag=1,i=2ini=i+1tag=0,breaktag=1n輸出是素數(shù)輸出不是素數(shù)圖3-9結(jié)束n%i=0# includestdio.hmain( )int i,n,tag;printf(請輸入一個大于2的自然數(shù)n:);scanf(% d,&n );tag=1;/*若標(biāo)志變量 tag等于 0,n不是素數(shù),若 tag不等于 0,則 n是素數(shù)。*/for( i=2;i n;i+ ) /*i循環(huán)中分別檢測n能否

36、被 i整除,i=2,3,n-1 */if( n% i=0 )tag=0;break;/* n能被 i整除,n不是素數(shù),令tag=0 */if(tag=1 )printf(% d 是素數(shù)n,n);else printf(% 不是素數(shù) n,n);2022/8/20程序設(shè)計簡例【例 12】用遞推法求菲波拉契(Fibonacci)數(shù)列的前 20項。main( )long f,f1,f2;int i;f1 = f2 = 1;printf(% 10ld% 10ld,f1,f2);i=3;while(i=20)/*產(chǎn)生第 3到 20項*/f= f1+ f2;/*遞推出第 i項*/printf(% 10ld,

37、f);if( i% 4=0 )printf(n);/*每行輸出 4個數(shù)換行*/f1= f2;f2= f;/*為下一步遞推做準(zhǔn)備*/i=i+1 ;運行程序,輸出結(jié)果是: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 9871597 2584 4181 67652022/8/20程序設(shè)計簡例【例 13】將100 元人民幣換成面值 1 元、2 元、5 元的鈔票,給出所有可能的兌換方案。#include main( ) int i,j,k,n=0; printf(給出所有可能的兌換方案:n); for(i=0;i=100;+i) /*第一層(最外層)循環(huán)*/ f

38、or(j=0;j=50;+j) /*第二層(中間層)循環(huán)*/ for(k=0;k=20;+k) /*第三層(最內(nèi)層)循環(huán)*/ if (i*1+j*2+k*5=100) printf(方案%8d: %8d(1)%8d(2)%8d(5)n, +n,i,j,k); 2022/8/20程序設(shè)計簡例【例 14】求自然對數(shù)底的近似值,公式為:e=1+1/1!+1/2!+1/n!+。#include main( ) int i=1; double e=1.0,u=1.0; while (u1e-6) /* while 循環(huán)語句*/u=u/i; e=e+u; i+; printf(ne=%12.10f,e);

39、 i=1;e=1.0,u=1.0; do /*do while 循環(huán)語句*/ u=u/i; e=e+u; i+; while (u1e-6); printf(ne=%12.10f,e); for(i=1,e=1.0,u=1.0;u1e-6;+i) /* for循環(huán)語句*/ u=u/i; e=e+u; printf(ne=%12.10f,e); 2022/8/20程序設(shè)計簡例【例 15】找出兩個自然數(shù)平方之和的所有三位數(shù)。#include stdio.h#include math.hmain ( ) int k,j,m,n,flag;for (n100;n1000; n) /*第一層(最外層)循

40、環(huán)*/ ksqrt(1.0*n);/*第一層(最外層)循環(huán)復(fù)合句開始*/ flag0; j1; while(jk)&(flag0) /*第二層(中間層)循環(huán)*/ m1; /*第二層(中間層)循環(huán)復(fù)合句開始*/ while(mk)&(m*m!nj*j) mm1;/*第三層(最內(nèi)層)循環(huán)*/ if (m*mj*jn) flag1; printf(%d%d*%d%d*%dn,n,j,j,m,m); jj1; /*第二層(中間層)循環(huán)復(fù)合句結(jié)束*/ /*第一層(最外層)循環(huán)復(fù)合句結(jié)束*/2022/8/203.3.2 當(dāng)型循環(huán)與直到型循環(huán) 一“當(dāng)型”循環(huán)在執(zhí)行循環(huán)語句時,首先判斷循環(huán)控制表達式是否為“真

41、”,若為“真”,則反復(fù)執(zhí)行循環(huán)體。若為“假”,則結(jié)束循環(huán)。如圖 3-10所示。圖3-10假真循環(huán)體表達式1while語句格式: while(表達式) 語句(循環(huán)體部分)功能:當(dāng)表達式的值為真時,執(zhí)行 while語句中的循環(huán)體。(1)循環(huán)體如果包含一個以上的語句,則必須用花括弧括起來,以復(fù)合語句的形式出現(xiàn),否則 while 語句范圍只到while后面第一個分號處。2022/8/20當(dāng)型循環(huán)與直到型循環(huán)(2)在循環(huán)體中應(yīng)有使循環(huán)趨向于結(jié)束的語句,即設(shè)置修改循環(huán)條件的語句。(3)while語句先判斷表達式的值,然后執(zhí)行循環(huán)體中的語句,如果表達式的值一開始為假 (值為 0),則不執(zhí)行循環(huán)體,直接執(zhí)行循

42、環(huán)體以外的語句。表達式是控制循環(huán)的條件,它可以是任何類型的表達式。2for語句格式:for (表達式 1;表達式 2;表達式 3)語句功能:首先計算表達式 1 的值;其后檢測表達式 2 的值,若其值為“真”,則執(zhí)行循環(huán)體語句,執(zhí)行完畢后,再計算表達式 3,至此完成了一次循環(huán);然后,再次測試表達式 2 的值是否為“真”,若為“真”,繼續(xù)執(zhí)行循環(huán)體語句,直到計算表達式 2的值為 0,即為“假”,則終止循環(huán),執(zhí)行 for語句下面的一個語句。如圖 3-11所示圖3-11假循環(huán)體真表達式2表達式1表達式32022/8/20當(dāng)型循環(huán)與直到型循環(huán)(1)for語句中條件測試總是在循環(huán)開始時進行;如果循環(huán)體部分

43、是多個語句組成的,則必須用左、右花括號括起來,使其成為一個復(fù)合語句。(2)for語句中,表達式 1通常是為循環(huán)變量賦初值的表達式;表達式2是控制循環(huán)的表達式;表達式 3通常是改變循環(huán)變量值的表達式。表達式1和表達式3既可以是一個簡單的表達式,也可以是逗號表達式。(3)for 語句的表示形式相當(dāng)靈活,可以部分或全部省略,但 “;”不能省略,如 for (;)。2022/8/20當(dāng)型循環(huán)與直到型循環(huán)二“直到型”循環(huán)格式: do 語句(循環(huán)體部分) while(表達式);(分號必不可少)功能:先執(zhí)行語句,后判斷表達式的值。它的執(zhí)行過程是:先執(zhí)行一次指定的語句,然后判斷表達式的值,當(dāng)表達式的值為非零(

44、“真”)時,返回重新執(zhí)行該語句,如此反復(fù),直到表達式的值等于 0為止,此時循環(huán)結(jié)束。如圖 3-12所示。 圖3-12真假循環(huán)體表達式2022/8/20當(dāng)型循環(huán)與直到型循環(huán)(1)do while語句的表達式是任意表達式,是控制循環(huán)的條件。(2)先執(zhí)行后判斷。因此,循環(huán)體至少執(zhí)行一次,直到表達式為“假”才退出循環(huán)。因此,在循環(huán)體語句中一定要有改變表達式的值的操作,最終使其表達式的值變?yōu)?0,結(jié)束循環(huán)。否則將成為“死”循環(huán)。(3)如果 do while語句的循環(huán)體部分是多個語句組成的話,則必須用左右花括號括起來,使其形成復(fù)合語句。(4)在關(guān)鍵字 while 的小括號的后面,一定要加分號“;”,千萬不

45、能忘記,它表示 do while語句到此結(jié)束。2022/8/20當(dāng)型循環(huán)與直到型循環(huán)三goto 語句格式:goto 語句標(biāo)號;功能:程序執(zhí)行到 goto語句時,轉(zhuǎn)到語句標(biāo)號指定的語句去執(zhí)行。 (1)使用goto語句時,需要預(yù)先指定一個有標(biāo)號的可執(zhí)行語句作為目的位置,這個有標(biāo)號的語句必須與 goto 語句在同一個函數(shù)內(nèi)。語句標(biāo)號必須用標(biāo)識符表示,不能用整數(shù)作為標(biāo)號。(2)與 if語句一起構(gòu)成循環(huán)結(jié)構(gòu)。從結(jié)構(gòu)化程序設(shè)計角度考慮,大多數(shù)現(xiàn)代的編程方法都認(rèn)為 goto 語句是有害的結(jié)構(gòu),因此不提倡使用 if和 goto語句構(gòu)造循環(huán)。(3)goto語句為無條件轉(zhuǎn)向語句,會跳過程序中的一段代碼并轉(zhuǎn)到一個指

46、定的目的位置。2022/8/203.3.3 各種循環(huán)語句的比較(1)4種循環(huán)語句均可以用來處理同一問題,一般情況下它們可以互相代替。但一般不提倡用 goto語句和if語句構(gòu)成的循環(huán)。(2)while和 do while循環(huán),只在 while后面指定循環(huán)條件,在循環(huán)體中包含反復(fù)執(zhí)行的操作語句,包括使循環(huán)趨于結(jié)束的語句 (如 i+ + ,或 i= i+ 1等)。 for循環(huán)可以在表達式 3中包含使循環(huán)趨于結(jié)束的語句,甚至可以將循環(huán)體中的操作全部放到表達式 3中。因此 for語句的功能更強,凡用 while循環(huán)能完成的,用 for循環(huán)都能實現(xiàn)。(3)while語句和do while語句只有一個表達式,用于控制循環(huán)是否進行。for語句有三個表達式,不僅可以控制循環(huán)是否進行,而且能為循環(huán)變量賦初值及不斷修改循環(huán)變量的值。 for語句比 while和 do while語句功能更強,更靈活。for語句中三個表達式可以是任何合法的C語言表達式,而且可以部分省略或全部省略,但其中的兩個分號不能省略。 2022/8/20各種循環(huán)語句的比較(4)用while和 do while循環(huán)時,循環(huán)變量初始化的操作應(yīng)在 while和 do while語句之前完成。for語句可以在表達式

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論