第3章控制結(jié)構(gòu)(選擇循環(huán))_第1頁
第3章控制結(jié)構(gòu)(選擇循環(huán))_第2頁
第3章控制結(jié)構(gòu)(選擇循環(huán))_第3頁
第3章控制結(jié)構(gòu)(選擇循環(huán))_第4頁
第3章控制結(jié)構(gòu)(選擇循環(huán))_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第三章

控制結(jié)構(gòu)C語言的語句1、控制語句2、函數(shù)調(diào)用語句3、表達(dá)式語句4、空語句5、復(fù)合語句本章內(nèi)容:if語句多路分支語句循環(huán)控制語句3.1程序的三種基本結(jié)構(gòu)(1)順序結(jié)構(gòu)(2)選擇結(jié)構(gòu)(3)循環(huán)結(jié)構(gòu)§1

if語句if語句是非順序執(zhí)行語句,它根據(jù)判斷給定條件的結(jié)果(真或假)來選擇執(zhí)行相應(yīng)的操作。有三種形式:最簡形式:if(表達(dá)式)語句;

其執(zhí)行過程是:先求解表達(dá)式的值,若為真(非0),則執(zhí)行if后的語句。若為假(0),就跳過整個(gè)if語句。例:求一個(gè)整數(shù)的絕對值。

#include<stdio.h>main(){inta;scanf(“%d”,&a);

if(a<0)a=-a;printf(“a的絕對值是%d\n”,a);}注:在C中,所有的非0值都是作為真處理的,因此,在if后的表達(dá)式就絕不限于只是邏輯表達(dá)式。另外在具體使用中,一定要注意“=”和“==”的區(qū)別!§1

if語句if-else結(jié)構(gòu):

if(表達(dá)式)語句1;

else語句2;執(zhí)行過程:先求解表達(dá)式的值,若為真(非0),則執(zhí)行語句1,否則,執(zhí)行語句2。例:接收一個(gè)字符,若為大寫,則將之轉(zhuǎn)換為小寫,否則,轉(zhuǎn)換為大寫。

#include<stdio.h>main(){charc;scanf(“%c”,&c);if(c>=‘a(chǎn)’&&c<=‘z’)c-=32;elsec+=32;printf(“%c”,c);}對比:從鍵盤接收一個(gè)大寫字符,將它改寫成小寫字符輸出

#include<stdio.h>main(){charc1,c2;c1=getchar();//未判斷接收數(shù)據(jù)是否符合要求!c2=c1+32;printf(“c1=%c,c2=%c”,c1,c2);}如:表示整數(shù)x(X用scanf輸入的整數(shù);)同時(shí)能夠被3,5,7整除,輸出“YES”否則,輸出“No”#include<stdio.h>main(){inta;

}scanf(“%d”,&a);if((a%3==0)&&(a%5==0)&&(a%7==0))printf(“YES”);

elseprintf(“No”);§1

if語句If的嵌套結(jié)構(gòu):1(x>0)

先看這個(gè)例子:y=0(x=0)-1(x<0)

這時(shí)用前面的兩種if結(jié)構(gòu)顯然不能直接求解,而必須使用if的嵌套。例如,對于上例,我們可以寫出如下的程序片斷:if(x>0)y=1;elseif(x==0)y=0;elsey=-1;if嵌套語句的一般形式是:

if(表達(dá)式1)語句1;elseif(表達(dá)式2)語句2;else(表達(dá)式3)語句3;:

復(fù)合語句:用{}括起來的多條語句,構(gòu)成一條復(fù)合語句?!?

if語句在使用if語句的嵌套時(shí),應(yīng)注意的是:else總是與它上面最近的、同一復(fù)合語句內(nèi)的if相匹配!例如:

if()if()語句1;

elseif()語句2;

else語句3;if()if()語句1;

elseif()語句2;

else語句3;因此,在使用if的嵌套時(shí),一定要注意所寫語句有無二義性的問題。考慮前面的那個(gè)函數(shù)的例子,能否寫成以下形式:

y=0;y=0;if(x>=0)if(x>=0)if(x>0)y=1;===》{if(x>0)y=1;}elsey=-1;elsey=-1;§1

if語句條件運(yùn)算符:是C中唯一的一個(gè)三目運(yùn)算符。它的一般形式為:

表達(dá)式1?表達(dá)式2:表達(dá)式3執(zhí)行過程:先求解表達(dá)式1的值,若為非0,則求解表達(dá)式2的值并將之作為整個(gè)表達(dá)式的值;若為0,則求解表達(dá)式3的值并將之作為整個(gè)表達(dá)式的值。

看下面這個(gè)表達(dá)式:

max=((a>b)?a:b) 則它的作用相當(dāng)于以下兩條語句的作用: if(a>b)max=a; elsemax=b;注意:條件運(yùn)算符的優(yōu)先級大于賦值語句而小于算術(shù)運(yùn)算符,而其結(jié)合方向?yàn)椤坝医Y(jié)合”。因此,語句 (a>b)?a-b:a+b(a>b)?(a-b):(a+b)§2

switch語句使用if-else語句,在某些具體問題的處理上顯得過于繁鎖。例如,對學(xué)生成績進(jìn)行等級評定,可以寫出以下程序:

if(成績>=90)等級=‘優(yōu)’;

if(成績<90&&成績>=80)等級=‘良’;

if(成績<80&&成績>=70)等級=‘中’;

if(成績<70&&成績>=60)等級=‘合格’;

if(成績<60)等級=‘不合格’;當(dāng)然,這樣寫出的程序,其執(zhí)行效率是比較低的,更改后為:if(成績>=90)等級=‘優(yōu)’;elseif(成績>=80)等級=‘良’;//成績<90 elseif(成績>=70)等級=‘中’;//成績<80 elseif(成績>=60)等級=‘合格’;//成績<70elseif(成績<60)等級=‘不合格’;//成績<60這樣修改后又使程序的可讀性降低?!?

switch語句C中提供了多路分支語句,形式是:

switch(表達(dá)式)注意:表達(dá)式的值只能是整形、字符型{case常量表達(dá)式1:語句1;

case常量表達(dá)式2:語句2;:case常量表達(dá)式n:語句n;default:語句n+1;}說明:1.執(zhí)行順序:先計(jì)算表達(dá)式的值;當(dāng)該值與某一個(gè)case后的常量表達(dá)式的值相等時(shí),就執(zhí)行此case后的語句。若所有的case值與表達(dá)式的值均不匹配,則執(zhí)行default后的語句。2.執(zhí)行完一個(gè)case語句后,并不會跳過其它的case語句,而是順序執(zhí)行它下面的case語句。若想終止switch結(jié)構(gòu)的執(zhí)行,可以用一個(gè)break語句來中斷switch結(jié)構(gòu)的執(zhí)行。3.各case值應(yīng)互不相同,各case和default的出現(xiàn)次序不會影響結(jié)果?!?

switch語句例:從鍵盤上接收一個(gè)成績,輸出對應(yīng)的等級#include<stdio.h>voidmain(){intcj;chargrade;

printf(“請輸入成績:”);

scanf(“%d”,&cj);cj=cj/10;switch(cj)//此處不能加;{case10:grade=‘A’;break;case9:grade=“A”;break;case8:grade=“B”;break;case7:grade=“C”;break;case6:grade=“D”;break;default:gread=“E”;}

printf(“該生等級為%c”,grade);}當(dāng)多種情況執(zhí)行同一條語句時(shí):

swtich(cj){case10:case9:grade=‘A’;break;}例子從鍵盤輸入一個(gè)字符,判斷該字符是英文字母是,顯示“yes”,否則,現(xiàn)在”No”.#include<stdio.h>{charc;c=getchar();if(c>=‘a(chǎn)’&&c<=‘z’||c>=‘A’&&c<=‘Z’)printf(“yes”);elseprintf(“No”);}§3

循環(huán)語句While循環(huán)語句Do–while循環(huán)語句For循環(huán)語句循環(huán)結(jié)構(gòu)和選擇結(jié)構(gòu)一樣是程序設(shè)計(jì)中的另一種基本結(jié)構(gòu),它的特點(diǎn)主要是把復(fù)雜問題中大量的相似的操作用循環(huán)結(jié)構(gòu)來處理,只需編寫很少的語句,讓計(jì)算機(jī)反復(fù)的執(zhí)行多次,從而大大提高程序的編寫效率。

本章提要:§3.1

while語句1)while循環(huán)

形式:while(表達(dá)式)語句;

執(zhí)行過程:當(dāng)表達(dá)式的值為真(非0)時(shí)執(zhí)行while后語句,直到為假時(shí)退出循環(huán)。(先判斷后執(zhí)行)注意:(1)循環(huán)體的語句部分若超過一句,應(yīng)用花括號括起來。(2)循環(huán)體中應(yīng)有一條語句修改循環(huán)條件的值,使它趨進(jìn)于假最終退出循環(huán)體.否則會出現(xiàn)死循環(huán).(3)循環(huán)體中的語句常用以處理重復(fù)多次動作的操作.

§3.1

while語句例:求1+3+5+……+99=?

#include<stdio.h> main(){inti=1,sum=0;while(i<100){sum=sum+i;i=i+2;}printf(“%d”,sum);}循環(huán)次數(shù)sum值i值

0(初值)011次循環(huán)132次循環(huán)45

……退出循環(huán)101§3.1

while語句注意:main(){inti=1,sum=0;while(i<100)sum=sum+i;i=i+2;printf(“%d”,sum);}死循環(huán)

§3.2

do-while語句do-while循環(huán)形式為:do循環(huán)體語句while(表達(dá)式);執(zhí)行過程:先執(zhí)行一次循環(huán)體語句,再判斷表達(dá)式的值;若其值為真(非0),則返回重新執(zhí)行該語句,如此反復(fù),直到表達(dá)式的值為假(0)時(shí)循環(huán)結(jié)束。(先執(zhí)行后判斷)注意:當(dāng)循環(huán)體超過一條語句時(shí)用{}括起來構(gòu)成復(fù)合語句.先執(zhí)行后判斷,循環(huán)體至少執(zhí)行一次.表達(dá)式為假時(shí)退出循環(huán).

§3.2

do-while語句例:求1+3+5+……+99=?

#include<stdio.h> main()

{inti=1,sum=0;do{sum=sum+i;i=i+2;} while(i<100);printf(“%d”,sum);}§3.2

do-while語句while循環(huán)與do-while循環(huán)的區(qū)別:

用while循環(huán)和do-while循環(huán)編同一程序時(shí),程序結(jié)構(gòu)非常相似;但因while循環(huán)是“先判斷后執(zhí)行”,而do-while循環(huán)則是“先執(zhí)行后判斷”,因此它們的區(qū)別在于:while循環(huán)的循環(huán)體至少執(zhí)行0次,do_while的循環(huán)體至少執(zhí)行1次。#include<stdio.h>main(){inti=11,sum=0;while(i<=10){sum=sum+i;i++;}printf(“sum=%d\n”,sum);}結(jié)果:0#include<stdio.h>main(){inti=11,sum=0;do{sum=sum+i;i++;}while(i<=10);printf(“sum=%d\n”,sum);}

結(jié)果:11§3.3

for語句for循環(huán):for循環(huán)是C中使用得最多的循環(huán)語句,因?yàn)樗浞煮w現(xiàn)了C的靈活多變、功能強(qiáng)大的特點(diǎn)。形式為:for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語句;執(zhí)行過程:先求解表達(dá)式1的值。(只執(zhí)行一次)求解表達(dá)式2的值,若其值為真,則執(zhí)行for后的語句,執(zhí)行完畢后轉(zhuǎn)至3)。若表達(dá)式2的值為假,則循環(huán)結(jié)束。求解表達(dá)式3的值轉(zhuǎn)至2)處繼續(xù)循環(huán)。For(循環(huán)變量初值;循環(huán)條件;循環(huán)變量增值){循環(huán)體語句}§3.3

for語句例如,從1到100求和的例子:for(sum=0,i=1;i<=100;i++) sum=sum+i;

通常,表達(dá)式1用于進(jìn)行一些初始化工作;表達(dá)式2用于判斷循環(huán)條件是否成立;表達(dá)式3則用于循環(huán)變量的增量?!?.3

for語句對for循環(huán)的幾點(diǎn)說明:

for中的三個(gè)表達(dá)式可以省略其中的任意一個(gè),甚至全部,但對應(yīng)的分號卻不能省。例如:for(;;)……三個(gè)表達(dá)式可以是任意的,并不一定有何內(nèi)在的關(guān)聯(lián)。如:for(i=1;i<100;j++)也一樣能編譯通過。這也是很多時(shí)候造成死循環(huán)的原因之一。例:求所有的水仙花數(shù)(所謂的水仙花數(shù),是這樣的一個(gè)三位數(shù):這個(gè)數(shù)等于它的各個(gè)位的立方之和。如153=13+53+33)

#include<stdio.h> voidmain(){inti,gw,sw,bw; for(i=100;i<1000;i++){gw=i%10;bw=i/100;sw=(i/10)%10; if(i==gw*gw*gw+sw*sw*sw+bw*bw*bw) printf(“%5d”,i); } }§3.4

循環(huán)的嵌套循環(huán)的嵌套:就是在一個(gè)循環(huán)體內(nèi)又包含有循環(huán)。一般來說,內(nèi)嵌了幾層循環(huán),就稱之為幾重循環(huán),如:二重循環(huán)、三重循環(huán)等。特點(diǎn):For,while,do_while三種循環(huán)之間可以互相嵌套.內(nèi)外層之間不能交錯(cuò)且內(nèi)外控制變量必須不同.循環(huán)體不允許由循環(huán)體外轉(zhuǎn)入循環(huán)體內(nèi).

§3.4

循環(huán)的嵌套格式:for(i=1;i<=2;i++)

外層

{for(j=1;j<=3;j++)

循環(huán)

printf(‘‘i=%dj=%d”,i,j);內(nèi)層循環(huán)體

printf(“\n”);

}結(jié)果:i=1j=1i=1j=2i=1j=3i=2j=1i=2j=2i=2j=3內(nèi)層循環(huán)的循環(huán)控制變量變化一遍外層循環(huán)控制變量變化一次.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í)行了10×6=60次內(nèi)層循環(huán)的循環(huán)控制變量變化一遍外層循環(huán)控制變量變化一次.§3.4

循環(huán)的嵌套例:打印乘法九九表.

1*1=11*2=2……1*9=9……9*1=19*2=2……9*9=81#include<stdio.h> main() {inti,j; for(i=1;i<10;i++) {for(j=1;j<10;j++)printf(“%d*%d=%2d”,i,j,i*j);printf(“\n”);} }§3.4

循環(huán)的嵌套程序的結(jié)果為:

1*1=12*1=22*2=43*1=33*2=63*3=9…….

#include<stdio.h> main() {inti,j; for(i=1;i<10;i++) {for(j=1;j<=i;j++)printf(“%d*%d=%2d”,i,j,i*j);printf(“\n”);} }注意循環(huán)控制變量的初值和終值.§3.4

循環(huán)的嵌套思考:要打印九九表如下,該如何修改程序?

1*1=11*2=2……….1*9=92*1=22*2=4……2*8=16

…..9*1=9§3.5

break和continue語句1、break語句

可以用于從循環(huán)體內(nèi)跳出循環(huán)體,提前退出循環(huán)。

使用形式:break;

注意:break只能用于循環(huán)語句和switch語句中。2、continue語句其作用是結(jié)束本次循環(huán),即跳過循環(huán)體下面還未執(zhí)行的語句;回到循環(huán)開頭的條件判斷處,重新判斷是否再次執(zhí)行循環(huán)。

使用形式:continue;區(qū)別:break是結(jié)束整個(gè)循環(huán)過程。

continue是終止本次循環(huán)?!?.5

break和continue語句例:把100__200之間不能被3整除的數(shù)輸出。Main(){intn;for(n=100;n<=200;n++){if(n%3==0)continue;printf(“%d”,n);}}Main(){intn;for(n=100;n<=200;n++){if(n%3==0)break;printf(“%d”,n);}}輸出:100101§3.6使用循環(huán)時(shí)常見錯(cuò)誤(1)誤將“=”作為等號使用。 這是最常見的死循環(huán)之一,例如:

while(a=1){……}(2)忘記用花括號括起循環(huán)中的多條語句。如:a=1;

while(a<=10)printf(“a=%d\n”,a); a++;(3)在不該加分號的地方加了分號。如:

for(i=1;i<10;i++);sum=sum+i;§3.6使用循環(huán)時(shí)常見錯(cuò)誤(4)循環(huán)變量沒有改變。例如:

i=1; while(i<10) sum=sum+i;(5)對變量的變化范圍認(rèn)識不夠。如:

for(i=0;i<40000;i++){……}(6)輸入有誤。如:

for(i=1;i<10;i++)for(j=1;j<10;i++){……}注意:本章不要求內(nèi)容:位運(yùn)算,goto,exit().示例【例1】求n!,即計(jì)算p=1×2×3×…×n的值。

思路:求階乘與求累加的運(yùn)算處理過程類似,只要將“+”變?yōu)椤?”。設(shè)置:乘數(shù)i

,初值為1,終值為n(n是循環(huán)控制終值,需要從鍵盤輸入)累乘器p

,每次循環(huán)令p=p*i程序:main(){inti,n;longp;

p=1;printf("Entern:");scanf("%d",&n);for(i=1;i<=n;i++)

p=p*i;printf("p=%ld\n",p);}思考:如何輸出1!,2!,…,n!?如何求s=1!+2!+…+n!?示例【例2】把100~200之間能被7整除的數(shù),以十個(gè)數(shù)為一行的形式輸出,最后輸出一共有多少個(gè)這樣的數(shù)。分析:1:循環(huán)范圍;2、被7整除;

3:每行輸出10個(gè)這樣的數(shù);

4:總計(jì)數(shù)滿足條件的數(shù)個(gè)數(shù)main(){intn,j=0;for(n=100;n<=200;n++)

{if(n%7!=0)continue; printf("%6d",n);

j++;

if(j%10==0)printf("\n");

}printf("\nj=%d\n",j);}【例3】判斷輸入的某個(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

溫馨提示

  • 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

提交評論