




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第五章 基本語句,前面已介紹了順序結構,本章介紹選擇結構和循環(huán)結構。 C語言中,基本語句包括下列語句: (1)賦值語句 (2)條件語句 (3)循環(huán)語句 (4)轉移語句 (5)函數語句,5.1 賦值語句,5.1.1 簡單賦值語句,運算符加上“=”,語句格式:r=v;,5.1.2 特殊賦值語句,5.1.3 連續(xù)賦值語句,例5.2 從鍵盤輸入一個任意的小寫字母,將其轉換成大寫字母輸出。,main() char ch,chep; int bu; printf(“please input a little letter:”); scanf(“%c”, ,5.2 條件語句和分支選擇結構,C語言中有三類選擇
2、語句:,(1) 條件語句(if語句),(2) 條件賦值語句,(3) 開關語句(switch語句),5.2.1 條件語句(if語句),1、 if的三種形式,功能: 當表達式值非0時, 執(zhí)行語句A,否則不執(zhí)行語句A.,例如: if (xy) printf( %d, x);,形式1 if(表達式) 語句A,其流程圖:,例5.5 計算y=|x|,絕對值計算公式如下:,main() float x; printf(“please input x:”) ; scanf(“%f”,可將其改為:,形式2 if(表達式) 語句A else 語句B,功能: 表達式為非0,執(zhí)行語句A 表達式為0,執(zhí)行語句B,例:
3、if(xy) printf(%d, x); else printf(%d, y);,例5.6 用鍵盤輸入3個數(a、b、c),確定其中最大值。,設max為a、b中最大者, 公式如下:,main() float a,b,max; printf(“please input a,b,c:”) ; scanf(“%f%f%f”,再令max為max和c中最大者,此時公式如下:,假設a就是三個數的最大者,并且始終讓a中存放三個數中的最大者,計算過程如下:,先找a、b中真正大者,并存于a中,公式如下:,main() float a,b,c; printf(“please input a,b,c:”) ; s
4、canf(“%f%f%f”,再找a和c中的大者并存于a中,此時公式如下:,形式3 if(表達式1) 語句1,else if (表達式2) 語句2,else if (表達式3) 語句3, ,else if(表達式n) 語句n,else 語句n+1,流程:,表達1,表達2,表達3,表達n,語句1,語句2,語句3,語句n,語句n+1,語句1, 0,= 0,= 0, 0, 0, 0,如: if (3) printf(o.k); if (a),1. 表達式可以是邏輯、關系,甚至是算術表達式。,2. 上述形式中的語句必須以分號結束,3. 上述形式中的語句可以是由 括起來的復合語句。此時,在 外可以不用分號
5、.,注意的問題:,main ( ) float a, b, t; scanf(%f, %f, ,補充例1 輸入兩個實數,按代數值由大到小次序輸出這兩個數。,3.2 , 3.60 3.60 , 3.20,運行情況如下:,例5.7 輸入三個數,按從大到小順序輸出。,main ( ) float a, b, c,t; scanf(%f,%f,%f, ,if (bc) t=b; b=c; c=t; printf(%5.2f, %5.2f, %5.2f, a, b, c); ,運行情況如下:,3,7,1 7.00, 3.00, 1.00,5.2.2 條件賦值語句,格式如下:,例5.9 用條件賦值語句編寫
6、程序,找三個數中最大者。,main ( ) float a, b, c,max; printf(“please input a,b,c:”); scanf(%f,%f,%f, ,5.2.3 if語句的嵌套,if (表達式1),內嵌if,else,內嵌if,注意: else總是與它上面的最近的未配對的if 配對.,一般形式,在上述形式的if語句中, 又可以是if語句稱為嵌套。,if (表達式2) 語句1,if (表達式3) 語句3,else 語句2,else 語句4,例: if ( ),if ( ) 語句2 else 語句3,if ( ) if ( ) 語句1 else ,所以:必要時加 .,i
7、f ( ) 語句1 else,補充例2 有一函數,y=,1 (x0),編一程序,輸入一個x值,輸出y值。,有以下幾種寫法,請判斷哪些是正確的?,程序1: main ( ) int x, y; scanf(d, ,if (x0) y= 1; else if (x= =0) y=0; else y=1; printf (x=%d, y=%dn, x, y); ,程序2:將上面程序的if語句改為: if (x=0) if (x0) y=1; else y=0; else y= 1;,程序3: 將上述if語句改為: y= 1; if (x! =0) if (x0) y=1; else y=0;,程序4
8、: y=0; if (x=0) if (x0) y=1; else y= 1;,5.2.3 switch語句,1、語句形式:,switch (表達式) case 常量1: 語句1; case 常量2: 語句2; case 常量3: 語句3; . case 常量n: 語句n; default : 語句n+1; ,根據表達式的不同值,選擇不同的程序分支,又稱開關語句。,數值型 或 字符型,常量表達式的值必須互不相同,否則執(zhí)行時將出現(xiàn)矛盾,即同一個開關值,將對應多種執(zhí)行方案。,2、語句執(zhí)行流程:,指語句的最后一條是否為break,簡單語句或復合語句,case語句出 現(xiàn)的次序并 不影響執(zhí)行 結果。,例
9、3:假設用0、1、2.6分別表示星期日、星期一.星期六?,F(xiàn)輸入一個數字,輸出對應的星期幾的英文單詞。如果輸入3,輸出“Wednesday”。,#include stdio.h void main() int n; scanf(%d, ,程序運行情況如下: 3 Wednesday Thursday Friday Saturday error,在“switch”語句中,“case 常量表達式”只相當于一個語句標號,表達式的值和某標號相等則轉向該標號執(zhí)行,但不能在執(zhí)行完該標號的語句后自動跳出整個switch 語句,因此會繼續(xù)執(zhí)行所有后面語句的情況。,為此,語言提供了一種break語句,其功能是可以跳
10、出它所在的switch語句。,將上面的例3修改如下:,#include stdio.h void main() int n; scanf(%d, ,程序運行情況如下: 3 Wednesday,3、說明,多個case語句可以共用一組執(zhí)行語句。,switch(grade) case A: case B: case C:printf(grade=60n);break; default:printf(grade60); ,各case和default子句的先后順序可以變動,而不會影響程序執(zhí)行結果。,default語句可以省略不用。,case和default與其后面的常量表達式間至少有一個空格。,swit
11、ch語句可以嵌套,break語句只跳出它所在的switch語句。,如 case B:,例4 企業(yè)發(fā)放的獎金根據利潤提成。從鍵盤輸入當月利潤,求應發(fā)放獎金總數?,利潤x x=10 10x20 20x40 40x60 60x100 100x,(int )x/10,常量 0,1 1,2 2,3,4 4,5,6 6,7,8,9,10 10以上,用這種方法轉換后,n出現(xiàn)了在不同區(qū)域有重復數字的情況。解決的方法有很多,其中一種是可以采用當x為10的整數倍時,將計算出的n值減1。,使用switch解題的關鍵,通過分析找到表達式,將問題分成幾種情況。,#include stdio.h void main()
12、float x,y; int n; scanf(%f, ,程序如下:,程序舉例,例1 寫一程序,輸入年號,判斷是否為閏年。,1. 算法: 根據閏年的判斷條件, 當年號能被4整除但不能被100整除時,它為閏年。, 當年號能被100整除又能被400整除時,它為閏年。,設用變量year表示年號,leap為待置值變量,當year為閏年:leap1, 否則leap0.,2. 流程圖,leap%400=0,leap1,leap=0,打印非閏年,打印是閏年,結束,leap,yes,No,yes,No,A,3. 程序:,main ( ) int year, leap; scanf(%d, else leap=
13、0;,else leap=1; else leap=0; if (leap) printf(%d is, year); else printf(%d is not, year); printf (a leap yearn); ,運行情況如下:,2000 2000 is a leap year,1989 1989 is not a leap year,上述條件也可用一個邏輯表達式表示: if ( ( year%4=0),例2 給一個不多于4位的正整數,求出它是幾位數,逆序打印出各位數字。,#include stdio.h void main() int x,a,b,c,d; /*a,b,c,d代
14、表千位、百位、十位、個位*/ scanf(%d, ,例3 任意輸入三個數,判斷能否構成三角形?若能構成三角形,是等邊三角形、等腰三角形還是其它三角形?,#include stdio.h void main() float a,b,c; scanf(%f,%f,%f, ,課堂練習,1.main() int x=1,y=0,a=0,b=0; switch(x) case 1: switch(y) case 0:a+;break; case 1:b+;break; case 2: a+;b+;break; case 3: a+;b+; printf(“a=%d,b=%dn”,a,b); ,結果: a
15、=2,b=1,2.程序填空: 以下程序判斷輸入的整數能否被3或7整除. main() int x,f=0; scanf( “%d”, ,在C語言中可以用以下語句來實現(xiàn)循環(huán): 1. 用goto語句和if語句構成循環(huán); 2. 用while語句; 3. 用do-while語句; 4. 用for語句。,循環(huán):就是在給定的條件成立時反復執(zhí)行某一程 序段,被反復執(zhí)行的程序段稱為循環(huán)體。,5.3 循環(huán)語句,S=1+2+3+100,0,S,1,2,100,S+1,S,S+2,S,S+100,S,作100次加法,S+i,S,累加器,計數器,1、語句形式: goto 語句標號;,例如: goto label; l
16、abel: .,語句標號用標識符表示,它的定名規(guī)則與變量名相同。,5.3.1 goto語句及與if語句構成循環(huán),2、語句執(zhí)行流程: 在程序執(zhí)行過程中,如果遇到goto語句,則程序執(zhí)行流程無條件地轉向語句標號后的語句繼續(xù)執(zhí)行。,3、說明,語句標號僅僅對goto 語句有效,對其它語句不影響。,同一個程序中,不允許有同名標號。,goto語句通常與條件語句配合使用??捎脕韺崿F(xiàn)條件轉移、構成循環(huán)、跳出循環(huán)體等功能,main ( ) int i, sum=0; i=1; loop: if (i=100) sum=sum+i; i+; goto loop; printf(%d, sum); ,運行結果如下:
17、 5050,例: 求,main ( ) int sum=0, i=1; loop: sum=sum+i; i + +; if (i=100) goto loop; printf (sum=%d , sum); ,本例相當于當型循環(huán),若改為直到型:,5.3.2 while語句,真(非零),循環(huán)體,假(零),1、while 語句的形式: while (表達式) 循環(huán)體;,2 、 while 語句 常稱為“當型”循環(huán)語句。,3、說明:,先判斷表達式,后執(zhí)行語句。,表達式同if語句后的表達式一樣,可以是任何類型的表達式。,循環(huán)體多于一句時,用一對 括起。,while循環(huán)結構常用于循環(huán)次數不固定,根據是
18、否滿足某個條件決定循環(huán)與否的情況。,i=1; s =0; while (i=100) s=s+i; i+; printf(“n1+2+3+100=%d”,s);,循環(huán)變量的初始化 (循環(huán)先導語句),累加器的初始化,循環(huán)控制條件,累加,修改循環(huán)變量,循環(huán)語句的三要素,循環(huán)次數不固定的循環(huán)語句,例5.18 計算,當s最接近且不大于10000為止。,main ( ) int i, s; s=i=0; while(s+i*i=10000) s=s+i*i; i+; printf(%d, s); ,運行結果如下: 9455,輾轉相除法的自然語言表述: 不斷地用除數作為被除數,余數作為除數再求余數,直到余
19、數為0,此時除數即為所求最大公約數。,例5.19 利用輾轉相除法計算兩個數的最 大公約數。,main ( ) int m,n,r; printf(please input two data:); scanf(%d%d, ,運行結果如下: please input two data:34 12 The max common facter is:2,#include stdio.h void main() int x; scanf(%d,【補充 例1】輸入一系列整數,判斷其正負號,當輸入0時,結束循環(huán)。,輸入數據,為第一次判斷做準備,while(x!=0),判斷是否結束, if(x0) print
20、f( + ); else printf( - ); scanf(%d, ,判斷正負號,修改循環(huán)變量的值,#include stdio.h void main() char ch;int num=0; ch=getchar();,【補充 例2】 統(tǒng)計從鍵盤輸入的一行字符的個數(以回車鍵作為輸入結束標記)。,while(ch!=n),判斷是否輸入結束,num+; ch=getchar(); ,printf(num=%dn,num); ,注意,表達式在判斷前,必須要有明確的值。,循環(huán)體中一般有改變條件表達式的語句。,while (表達式)后面沒有分號。,5.3.3 do-while語句,1、 do-
21、while的形式: do 循環(huán)體; while (表達式);,2、 do-while語句 常稱為“直到型”循環(huán)語句。,真(非零),循環(huán)體,假(零),main ( ) int i, sum=0; i=1; do sum=sum+i; i+; while (i=100); printf(%d,sum); ,例:用do-while語句求,3、說明:,先執(zhí)行語句,后判斷表達式。,第一次條件為真時,while,do-while等價;第一次條件為假時,二者不同。,計算公式為:,例5.21 輸入若干個正整數,求其和,直到所輸 入數大于10為止(該數不在求和之列)。,用while語句編寫的程序如下:,main
22、 ( ) int x, s=0; printf(“please input first integer:); scanf(“%d“, ,用do-while語句編寫的程序如下:,main ( ) int x, s=0; printf(“please input first integer:); scanf(“%d“, ,注意,在if、while語句中,表達式后面都沒有分號,而在do-while語句的表達式后面則必須加分號。,do-while和while語句相互替換時,要注意修改循環(huán)控制條件 。,5.3.4 for語句,1、for的形式: for (初始表達式1;條件表達式2;循環(huán)表達式3) 循環(huán)
23、體 ;,表達式1:用于循環(huán)開始前為循環(huán)變量設置初始值。,表達式2:控制循環(huán)執(zhí)行的條件,決定循環(huán)次數。,表達式3:循環(huán)控制變量修改表達式。,循環(huán)體語句: 被重復執(zhí)行的語句。,表達式3,計算表達式1,循環(huán)體,零,非零,for的下一條語句,2、執(zhí)行過程,for(i=1;i=100;i+) sum=sum+i;,例如:,它相當于以下語句: i=1; while (i=100) sum=sum+i; i+; ,表達式1;,while(表達式2),表達式3;,3、 說明,三個表達式都可以是逗號表達式。,三個表達式都是任選項,都可以省略,但要注意省略表達式后,分號間隔符不能省略。,4. for語句中表達式省
24、略的形式,(1)for語句一般形式中的“表達式1”可以省略;此時應在for語句之前給循環(huán)變量賦初值 如: sum=0;i=1; for ( ; i=100;i+) sum=sum+i;,(2)表達式2省略,即不判斷循環(huán)條件,循環(huán)無終止地進行下去; 如: for(sum=0,i=1;i+) if(i100) break; sum=sum+i; ,(3)表達式3也可以省略,但此時應保證循環(huán)能正常結束如: for(sum=0,i=1;i=100;) sum=sum+i; i+; ,(4) 可以省略表達式1和表達式3,只有表達式2,如: i=1; sum=0; for (;i=100;) sum=su
25、m+i; i+; ,i=1;sum=0; while (i=100) sum=sum+i; i+; ,相當于,while (1) 循環(huán)體; 即不設初值,不判斷條件,循環(huán)變量不增值。無終止地執(zhí)行循環(huán)體。,(5)三個表達式都可省略,如 for ( ; ; ) 循環(huán)體;,如: sum=0,i=1; for(;) if(i100) break; sum=sum+i; i+; ,相當于,(6)循環(huán)體為空語句 對for語句,循環(huán)體為空語句的一般形式為: for (表達式1;表達式2;表達式3) ; 如:for(sum=0,i=1;i=100;sum+=i, i+) ;,表達式2可以是關系表達式,也可以是數
26、值表達式或字符表達式。只要值0.即執(zhí)行循環(huán)體. for (i=0; (c=getchar( )!=n; i+=c);,(1)在進入累加前先給累加器賦初值(一般為0); (2)用循環(huán)語句實現(xiàn)累加; for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量改變規(guī)律) (3)循環(huán)體語句的設計。 累加器當前值=累加器原值+循環(huán)變量當前值 ;,典型例題分析,例: 求累加和1+2+3+1000,基本方法:,屬于“累加器”類型問題。,累加器賦初值,求偶數和 2+4+6+100,參考程序:,void main() long int k,s;,s=0;,for(k=1;k=1000;k+) s=s+k;,printf( s=
27、%ld ,s); ,累加,思考,(1)給累乘器賦初值,一般為1; (2)用循環(huán)語句實現(xiàn)累乘; for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量改變規(guī)律) (3)循環(huán)體設計。 累乘器當前值=累乘器原值*循環(huán)變量當前值;,例: 求累乘積。 如:123.100,基本方法:,屬于“累乘器”類型問題。,累乘器賦初值,求n!=1 2 3 n,參考程序:,void main() double s=1;,int k;,for(k=1;k=100;k+) s=s*k;,printf( s=%lf ,s); ,累乘,思考,1.break語句,(1) 語句形式: break;,(2)作用: 1.結束break所在的 sw
28、itch語句。 2.結束當前循環(huán),跳出break所在的循 環(huán)結構。,5.3.5 break語句和continue語句,【例】 求300以內能被17整除的最大的數。,#include stdio.h void main() int x,k; for(x=300;x=1;x-) if(x%17=0) break; printf(x=%dn,x); ,(1)語句形式: continue;,(2)語句作用: 結束本次循環(huán)。,2、continue 語句,(3)語句執(zhí)行流程: continue語句可以結束本次循環(huán),即不再執(zhí)行循環(huán)體中continue 語句之后的語句,轉入下一次循環(huán)條件的判斷與執(zhí)行。,【例】
29、 求300以內能被17整除的所有整數。,#include stdio.h void main() int x,k; for(x=1;x=300;x+) if(x%17!=0) continue; printf(%dt,x); ,while(條件) 語句A; break; 語句 B; ,真,語句B,條件,語句A,break,假,結束循環(huán),4、break語句與continue語句的區(qū)別,至此位置,while(條件) 語句A; continue; 語句 B; ,真,語句B,條件,語句A,continue,假,結束循環(huán),至此位置,#include stdio.h void main() int a,
30、b; for(a=1,b=1; a=10) break; if(b%3=1) b+=3; continue; printf(%dn,a); ,【例5】 分析以下程序的運行結果。,程序運行結果: 4,在循環(huán)體語句中又包含有另一個完整的循環(huán)結構的形式,稱為循環(huán)的嵌套。如果內循環(huán)體中又有嵌套的循環(huán)語句,則構成多重循環(huán)。,5.3.6 循環(huán)的嵌套,嵌套在循環(huán)體內的循環(huán)體稱為內循環(huán),外面的循環(huán)稱為外循環(huán)。,while 、do-while、for三種循環(huán)都可以互相嵌套。,循環(huán)語句之間的關系,真,真,外循環(huán)初始條件,內循環(huán)初始條件,內循環(huán)體,外循環(huán)條件,假,內循環(huán)條件,假,內循環(huán)循環(huán)條件,外循環(huán)循環(huán)條件,循環(huán)
31、結束,二重循環(huán)嵌套結構執(zhí)行流程,例:輸出圖形:,* * * *,編程分析:,采用雙重循環(huán),一行一行輸出。,每一行輸出步驟:一般3步。 1)光標定位,3)每輸完一行光標換行(n),2)輸出圖形。 例如本題:共4行,若行號用k表示,則每一行有2*k-1個*號。,#include stdio.h void main() int k1,k2; for(k1=1;k1=4;k1+) putchar(t); for(k2=1;k2=k1;k2+) putchar(b);,for(k2=1;k2=k1*2-1;k2+) putchar(*);,putchar(n);, ,定位(還可以用空格的方法),輸出,幾
32、種循環(huán)的比較,1. 對于同一問題, 四種循環(huán)可相互替代。但不提倡用goto.,2. for循環(huán)功能強于while, dowhile.但若不是明顯地給出循環(huán)變量初終值(或修改條件),則應用while 或do while.以增強程序的結構化和可讀性。,3. 要防止無限循環(huán)死循環(huán)。,4. 循環(huán)過程中,為了結束本次循環(huán)或跳出整個循環(huán)。分別要用到continue和break語句。,5.3.7 循環(huán)結構程序設計舉例,【例5-1】 求,#include stdio.h void main() float s=0,f1=2,f2=1,f=1,t,n; /*累加器賦初值*/ for(n=1;n=10;n+) s
33、=s+f*f1/f2; /*累加器當前值=累加器原來的值+新的要加的數據*/ f=f*(-1);t=f2;f2=f1;f1=f1+t; /*為求下一個要加的數據做準備*/ printf(“s=%fn”,s);必考 我的弱點 ,【例5-2】輸入任意一個整數,將其逆序輸出,例如輸入1234,輸出4321我的弱點。,include stdio.h void main() long y,n; scanf(%ld, ,【例5-3】求Fibonacci數例: 1, 1, 2, 3, 5, 8, 前40個數。,程序要點:, 每輸出4個數時換行。, f1=f1+f2; f2=f1+f2; 交替的結果正好為一序列,規(guī)律: F1=1, F2=1 Fn=Fn 1 + Fn 2 (n2),程序如下:,main ( ) long int f1, f2; int i; f1=1; f2=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 自助辦稅終端管理辦法
- 福建商品條碼管理辦法
- 工作紀律獎懲管理辦法
- 室外體育業(yè)態(tài)管理辦法
- 肥胖危害健康課件
- 路政內業(yè)培訓課件
- 公司培訓課件怎么寫
- 肝臟磁共振檢查技術課件
- 肝硬化課件中醫(yī)
- 甘肅禮縣中考數學試卷
- 閥桿推力、操作扭矩及-美國太平洋算法-閘閥、截止閥
- 全國各省市縣-一覽表
- 暑假假期安全教育 家長會課件
- 02SG518-1-門式剛架輕型房屋鋼結構(含04年修改)
- 2021年徐州市小學教師業(yè)務能力測試數學試題
- 四川省成都市泡桐樹小學六年級小升初語文測試卷(8套試卷帶答案解析)
- 2023-2024年全科醫(yī)學(正高)考試高頻題庫(歷年考點版)帶答案解析
- 2023年浙江省鎮(zhèn)海中學自主招生數學試卷及答案
- -衛(wèi)生資格-正高-臨床醫(yī)學檢驗-正高-章節(jié)練習-臨床血液檢驗-試題(案例分析題)(共408題)
- 多級離心泵故障分析與處理
- YY/T 0870.2-2019醫(yī)療器械遺傳毒性試驗第2部分:體外哺乳動物細胞染色體畸變試驗
評論
0/150
提交評論