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

下載本文檔

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

文檔簡(jiǎn)介

第三章

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

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

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

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

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

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

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

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

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

#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語(yǔ)句If的嵌套結(jié)構(gòu):1(x>0)

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

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

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

復(fù)合語(yǔ)句:用{}括起來(lái)的多條語(yǔ)句,構(gòu)成一條復(fù)合語(yǔ)句。§1

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

if()if()語(yǔ)句1;

elseif()語(yǔ)句2;

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

elseif()語(yǔ)句2;

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

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ǔ)句條件運(yùn)算符:是C中唯一的一個(gè)三目運(yùn)算符。它的一般形式為:

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

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

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

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

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

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

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

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

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

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

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

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

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

printf(“請(qǐng)輸入成績(jī):”);

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(“該生等級(jí)為%c”,grade);}當(dāng)多種情況執(zhí)行同一條語(yǔ)句時(shí):

swtich(cj){case10:case9:grade=‘A’;break;}例子從鍵盤(pán)輸入一個(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)語(yǔ)句While循環(huán)語(yǔ)句Do–while循環(huán)語(yǔ)句For循環(huán)語(yǔ)句循環(huán)結(jié)構(gòu)和選擇結(jié)構(gòu)一樣是程序設(shè)計(jì)中的另一種基本結(jié)構(gòu),它的特點(diǎn)主要是把復(fù)雜問(wèn)題中大量的相似的操作用循環(huán)結(jié)構(gòu)來(lái)處理,只需編寫(xiě)很少的語(yǔ)句,讓計(jì)算機(jī)反復(fù)的執(zhí)行多次,從而大大提高程序的編寫(xiě)效率。

本章提要:§3.1

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

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

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

§3.1

while語(yǔ)句例:求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語(yǔ)句注意:main(){inti=1,sum=0;while(i<100)sum=sum+i;i=i+2;printf(“%d”,sum);}死循環(huán)

§3.2

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

§3.2

do-while語(yǔ)句例:求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語(yǔ)句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語(yǔ)句for循環(huán):for循環(huán)是C中使用得最多的循環(huán)語(yǔ)句,因?yàn)樗浞煮w現(xiàn)了C的靈活多變、功能強(qiáng)大的特點(diǎn)。形式為:for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語(yǔ)句;執(zhí)行過(guò)程:先求解表達(dá)式1的值。(只執(zhí)行一次)求解表達(dá)式2的值,若其值為真,則執(zhí)行for后的語(yǔ)句,執(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)體語(yǔ)句}§3.3

for語(yǔ)句例如,從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.3

for語(yǔ)句對(duì)for循環(huán)的幾點(diǎn)說(shuō)明:

for中的三個(gè)表達(dá)式可以省略其中的任意一個(gè),甚至全部,但對(duì)應(yīng)的分號(hào)卻不能省。例如:for(;;)……三個(gè)表達(dá)式可以是任意的,并不一定有何內(nèi)在的關(guān)聯(lián)。如:for(i=1;i<100;j++)也一樣能編譯通過(guò)。這也是很多時(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)。一般來(lái)說(shuō),內(nèi)嵌了幾層循環(huán),就稱(chēng)之為幾重循環(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語(yǔ)句1、break語(yǔ)句

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

使用形式:break;

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

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

continue是終止本次循環(huán)。§3.5

break和continue語(yǔ)句例:把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í)常見(jiàn)錯(cuò)誤(1)誤將“=”作為等號(hào)使用。 這是最常見(jiàn)的死循環(huán)之一,例如:

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

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

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

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

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)算處理過(guò)程類(lèi)似,只要將“+”變?yōu)椤?”。設(shè)置:乘數(shù)i

,初值為1,終值為n(n是循環(huán)控制終值,需要從鍵盤(pá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ù)滿(mǎn)足條件的數(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論