第3章控制結構(選擇循環)_第1頁
第3章控制結構(選擇循環)_第2頁
第3章控制結構(選擇循環)_第3頁
第3章控制結構(選擇循環)_第4頁
第3章控制結構(選擇循環)_第5頁
已閱讀5頁,還剩40頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第三章

控制結構C語言的語句1、控制語句2、函數調用語句3、表達式語句4、空語句5、復合語句本章內容:if語句多路分支語句循環控制語句3.1程序的三種基本結構(1)順序結構(2)選擇結構(3)循環結構§1

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

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

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

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

if語句if-else結構:

if(表達式)語句1;

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

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

#include<stdio.h>main(){charc1,c2;c1=getchar();//未判斷接收數據是否符合要求!c2=c1+32;printf(“c1=%c,c2=%c”,c1,c2);}如:表示整數x(X用scanf輸入的整數;)同時能夠被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的嵌套結構:1(x>0)

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

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

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

復合語句:用{}括起來的多條語句,構成一條復合語句。§1

if語句在使用if語句的嵌套時,應注意的是:else總是與它上面最近的、同一復合語句內的if相匹配!例如:

if()if()語句1;

elseif()語句2;

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

elseif()語句2;

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

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語句條件運算符:是C中唯一的一個三目運算符。它的一般形式為:

表達式1?表達式2:表達式3執行過程:先求解表達式1的值,若為非0,則求解表達式2的值并將之作為整個表達式的值;若為0,則求解表達式3的值并將之作為整個表達式的值。

看下面這個表達式:

max=((a>b)?a:b) 則它的作用相當于以下兩條語句的作用: if(a>b)max=a; elsemax=b;注意:條件運算符的優先級大于賦值語句而小于算術運算符,而其結合方向為“右結合”。因此,語句 (a>b)?a-b:a+b(a>b)?(a-b):(a+b)§2

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

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

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

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

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

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

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

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

case常量表達式2:語句2;:case常量表達式n:語句n;default:語句n+1;}說明:1.執行順序:先計算表達式的值;當該值與某一個case后的常量表達式的值相等時,就執行此case后的語句。若所有的case值與表達式的值均不匹配,則執行default后的語句。2.執行完一個case語句后,并不會跳過其它的case語句,而是順序執行它下面的case語句。若想終止switch結構的執行,可以用一個break語句來中斷switch結構的執行。3.各case值應互不相同,各case和default的出現次序不會影響結果。§2

switch語句例:從鍵盤上接收一個成績,輸出對應的等級#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);}當多種情況執行同一條語句時:

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

循環語句While循環語句Do–while循環語句For循環語句循環結構和選擇結構一樣是程序設計中的另一種基本結構,它的特點主要是把復雜問題中大量的相似的操作用循環結構來處理,只需編寫很少的語句,讓計算機反復的執行多次,從而大大提高程序的編寫效率。

本章提要:§3.1

while語句1)while循環

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

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

§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);}循環次數sum值i值

0(初值)011次循環132次循環45

……退出循環101§3.1

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

§3.2

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

§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循環與do-while循環的區別:

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

結果:11§3.3

for語句for循環:for循環是C中使用得最多的循環語句,因為它充分體現了C的靈活多變、功能強大的特點。形式為:for(表達式1;表達式2;表達式3)語句;執行過程:先求解表達式1的值。(只執行一次)求解表達式2的值,若其值為真,則執行for后的語句,執行完畢后轉至3)。若表達式2的值為假,則循環結束。求解表達式3的值轉至2)處繼續循環。For(循環變量初值;循環條件;循環變量增值){循環體語句}§3.3

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

通常,表達式1用于進行一些初始化工作;表達式2用于判斷循環條件是否成立;表達式3則用于循環變量的增量。§3.3

for語句對for循環的幾點說明:

for中的三個表達式可以省略其中的任意一個,甚至全部,但對應的分號卻不能省。例如:for(;;)……三個表達式可以是任意的,并不一定有何內在的關聯。如:for(i=1;i<100;j++)也一樣能編譯通過。這也是很多時候造成死循環的原因之一。例:求所有的水仙花數(所謂的水仙花數,是這樣的一個三位數:這個數等于它的各個位的立方之和。如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

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

§3.4

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

外層

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

循環

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

printf(“\n”);

}結果:i=1j=1i=1j=2i=1j=3i=2j=1i=2j=2i=2j=3內層循環的循環控制變量變化一遍外層循環控制變量變化一次.for(a=1;a<=10;a++){for(b=0;b<=5;b++)

……}外循環執行了10次,內循環執行6次循環正常結束時,內循環執行了10×6=60次內層循環的循環控制變量變化一遍外層循環控制變量變化一次.§3.4

循環的嵌套例:打印乘法九九表.

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

循環的嵌套程序的結果為:

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”);} }注意循環控制變量的初值和終值.§3.4

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

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

…..9*1=9§3.5

break和continue語句1、break語句

可以用于從循環體內跳出循環體,提前退出循環。

使用形式:break;

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

使用形式:continue;區別:break是結束整個循環過程。

continue是終止本次循環。§3.5

break和continue語句例:把100__200之間不能被3整除的數輸出。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使用循環時常見錯誤(1)誤將“=”作為等號使用。 這是最常見的死循環之一,例如:

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

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

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

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

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

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

思路:求階乘與求累加的運算處理過程類似,只要將“+”變為“*”。設置:乘數i

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

,每次循環令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整除的數,以十個數為一行的形式輸出,最后輸出一共有多少個這樣的數。分析:1:循環范圍;2、被7整除;

3:每行輸出10個這樣的數;

4:總計數滿足條件的數個數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】判斷輸入的某個數m是否為素數。若是素數,輸出“YES”,若不是,輸出“NO”。

思路:素數是指只能被1和它本身整除的數,如5、7、11、17、…等。

分別用2、3、…,m-1嘗試能否整除整數m。如果m能被某個數整除,則m就不是素數。這是一種窮舉算法設除數為j

溫馨提示

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

評論

0/150

提交評論