C程序的流程設計_第1頁
C程序的流程設計_第2頁
C程序的流程設計_第3頁
C程序的流程設計_第4頁
C程序的流程設計_第5頁
已閱讀5頁,還剩8頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、 C語言程序設計電子教案 13第三章 C程序的流程設計一、教學的目的與要求掌握順序、選擇、循環三類程序流程控制語句,以及轉移語句,能夠正確使用它們編程。二、重點與難點:if語句中的條件表達式,if語句中if-else的匹配關系,if語句的嵌套;switch語句的控制流程,switch語句的嵌套;三種循環語句的格式和功能,循環嵌套的使用;轉移語句的使用。三、教學內容第一節 算法1、算法的概念為解決某一個問題而采取的方法和步驟,就稱為算法。2、算法的性質有窮性:一個算法應包含有限的操作步驟一個初始:此動作序列只有一個初始動作確定性:算法中的每一個步驟都應當是確定性的,僅有一個后繼動作。有一個或多個

2、輸出:序列終止表示問題得到解答或問題沒有解答,沒有輸出的算法是沒有意義的。第二節 選擇型程序設計1、if 語句的形式 if(條件表達式) 語句 if(條件表達式) 語句1 else 語句 2 注意:if語句中的條件表達式一般為邏輯表達式或關系表達式,但也可以是任意的數值類型(包括整型、實型、字符型、指針類型),例如下列語句也是合法的。 if(a) printf(“%d” ,a);在if語句中,分號是語句的結束標志。在if和else后面可以只含一個內嵌的操作語句,也可以有多個操作語句,此時用花括號將幾個語句括起來成為一個復合語句。例1:以下不正確的if語句形式是( )。A)if(x>y&a

3、mp;&x!=y);B)if(x=y) x+=y;C)if(x!=y) scanf(“%d”,&x) else scanf(“%d”,&y);D)if(x<y) x+;y+;答案:C詳解:scanf(“%d”,&x)末尾應加分號,因為分號是語句不可缺少的部分。例2:已知int x=10,y=20,z=30;以下語句執行后x,y,z的值是( )。if(x>y)z=x;x=y;y=z; 答案:x,y,z的值分別是:20 30 30 詳解:在此語句中,條件x>y為假,所以只執行x=y;y=z;兩條語句。例3、以下不正確的語句是( )A)if(x>

4、;y);B)if(x=y)&&(x!=0) x+=y;C)if(x!=y) scanf(“%d”,&x);D)if(x<y)x+;y+;答案:D詳解:分號是語句結束的標志,y+的末尾無分號,所以y+不是合法的語句。2、if 的嵌套 if(條件1) if(條件2) 語句1 else 語句2 else if(條件3) 語句3 else 語句4例4:以下程序的輸出結果是( )main( )int a=100,x=10,y=20,ok1=5,ok2=0;if(x<y)if(y!=10)if (!ok1)a=1;else if(ok2) a=10; printf(“%

5、dn”,a); 答案:100詳解:把10、20、5、0分別給變量x、y、ok1、ok2賦值,執行條件語句后a值沒有改變,所以a值仍是原值100。3、switch結構switch語句是多分支選擇語句,其形式如下:switch(表達式)case 常量表達式1:語句1case 常量表達式2:語句2default:語句n+1注意:1、switch后面括弧內的“表達式”,可以是整型表達式或字符型表達式,也可以枚舉型數據。2、當表達式的值與某一個case后面的常量表達式的值相等時,就執行此case后面的語句,若所有的case中的常量表達式的值都沒有與表達式的值匹配的,就執行default后面的語句。3、每

6、一個case的常量表達式的值必須互不相同,否則就會出現互相矛盾的現象。4、執行完一個case后面的語句后,流程控制轉移到下一個case繼續執行,直到遇到break語句或執行完為止。5、default可以放在case語句的后面,也可以放在case語句的前面。例5:運輸公司對用戶計算運費,距離越遠,每公里運費越低。設每公里每噸貨物的基本運費為p,貨物重為w,距離為s,折扣為d,則總運費f計算公式為f=p*w*s(1-d),編寫程序。公里數s與折扣率d的標準如下:(此程序可用ifelse來完成,也可以用switch來完成)。s<250km d=0250s<500 d=0.05500s&l

7、t;1000 d=0.0751000s<2000 d=0.12000s<3000 d=0.153000s d=0.2 main()int s;float p,w,d,f;printf(“請輸入每公里每噸貨物的基本運費”);scanf(“%f”,&p);printf(“請輸入貨物重”);scanf(“%f”,&w);printf(“請輸入公里數”);scanf(“%f”,&s);switch(int)(s/250) case 0: d=0; break; case 1: d=0.05; break; case 2: case 3: d=0.075; break

8、; case 4: case 5:case 6: case 7: d=0.1; break; case 8: case 9:case 10: case 11: d=0.15; break; default: d=0.2; f=p*w*s(1-d); printf(“基本運費是:%f”,f);詳解:1、多個case可共用一組執行語句,必須寫成如下的形式:case 4: case 5:case 6: case 7: d=0.1; break;case后面只能有一個常量,把上式改寫成case 4,5,6,7: d=0.1; break;的形式是錯誤的。2、switch后面括弧內的“表達式”必須是整型

9、表達式或字符型表達式,也可以是枚舉型數據,對于swith來說,關鍵是把原始數據轉換為易表達的形式。例6:請讀以程序寫出程序的輸出結果。#include<stdio h>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; printf(“a=%d,b=%d”,a,b);答案:a=2,b=1詳解:此程序是switch的嵌套結構,在此程序中break跳出內層switch結構,接著執行外層switch的case 2后的

10、語句。例7:寫出下面程序的運行結果是( )main()int i;for(i=1;i<=5;i+) switch(i%5) case 0: printf(“*”); break; case 1: printf(“#”); break; default: printf(“n”); case 2: printf(“&”); 答案:#& & &*詳解:default可放在case語句的前面,也可以放在case語句的后面,當i%5不等于0,1,2時,將執行default后的語句printf(“n”);執行完成后沒有break,將繼續執行case 2后的語句prin

11、tf(“&”);第三節 循環型程序設計1、while語句while語句用來實現”當型”循環結構,其一般形式如下:while(條件表達式) 循環體語句例8:設有程序段: int k=10; while(k=0) k=k-1; 循環體執行( )次。 答案:0答案解析:在此程序的while結構中,條件表達式k=0的結果永遠為0即為假,所以循環執行的次數為0。例9:下面程序段的運行結果是( )x=y=0; while(x<15) y+,x+=+y; printf(“%d,%d”,y,x); 答案:8,20 例10、設有程序段 t=0;while(printf(“*”) t+;if(t&g

12、t;3) break; 循環執行( )次答案:4答案解析:while結構中的條件表達式printf(“*”)的值為輸出數據的個數,在此例中,printf(“*”)的結果為1,即為真。2、do-while語句do-while語句的特點是先執行循環體,然后判斷循環條件是否成立,其一般形式為:do循環體語句while(條件表達式); 例11、若有如下語句 int x=3; do printf(“%dn”,x-=2); while(-x);則上面程序段輸出結果是( )。答案:1 例12、以下程序段循環執行幾次。x=-1;do x=x*x; while(!x);答案:1例13、下面程序的運行結果是( )

13、main( )int y=10;doy-; while(-y);printf(“%dn”,y-);答案:0 3、for語句C語言中的for語句使用最為靈活,不僅可以用于循環次數已經確定的情況,而且可以用于循環次數不確定而只給出循環結束條件的情況,它完全可以代替while語句,其一般形式為:for(表達式1;表達式2;表達式2) 語句說明:for語句一般形式中的“表達式1”可以省略,此時應for語句之前給循環變量賦初值。注意省略表達式1時,其后的分號不能省略。如果表達式2省略,即不判斷循環條件,循環無終止地進行下去。表達式3也可以省略,但此時程序設計者應另外設法保證循環正常結束。可以省略表達式1

14、和表達式3,只有表達式2,即只給循環條件,在這種情況下,完全等同于while語句。3個表達式都可省略,如:for( ; ; ) 語句,相當于while(1) 語句,即不設初值,不判斷條件(認為表達式2為真值),循環變量不增值。無終止地執行循環體。表達式1可以是設置循環變量初值的賦值表達式,也可以是與循環變量無關的其他表達式。for(sum=0;i<=100;i+) sum=sum+i;表達式一般是關系表達式(如i<=100)或邏輯表達式(如a<b && x<y),但也可以是數值表達式或字符表達式,只要其值為非零,就執行循環體。例14、若i為整型變量,則以

15、下循環執行次數是( )。for( i=2 ;i!=0 ; ) printf(“%d”,i-);答案:2例15、以下不是無限循環的語句是( )A)for(y=0,x=1;x>+y;x=i+) i=x;B)for(;x+=i)C)while(1)x+;D)for(i=10;i-) sum+=i;答案:A例16、執行語句for( i=1 ; i+<4 ; ); 后變量i的值是( )答案:4例17、下面程序段的功能是計算1000!的末尾含有多少個零。請填空。for(k=0,i=5;i<=1000;i+=5)m=i;while( )k+;m=m/5;答案:m%5!=04、break與c

16、ontinue在break語句可以使流程跳出switch結構,繼續執行switch語句下面的一個語句。實際上,break語句還可以用來從循環體內跳出循環體,即提高結束循環,接著執行循環下面的語句。break語句的一般形式為:break;continue語句只結束本次循環,而不是終止整個循環的執行。continue語句的一般形式為:continue;例18、下列程序的運行結果是( )。 main( ) int i,j,x=0; for(i=0;i<2;i+) x+; for(j=0;j<=3;j+) if(j%2) continue; x+; x+; printf(“x=%dn”,x

17、);答案:例19、下面程序的運行結果是( )main( ) int k=0;char c=A; do switch(c+) case A:k+;break; case B:k-; case C:k+=2;break; case D:k=k%2;continue; case E:k=k*10;break; default:k=k/3; k+;while(c<G);printf(“k=%dn”,k);答案:5、循環的嵌套 一個循環體中又包含另一個完整的循環結構稱為循環的嵌套。內嵌的循環中還可嵌套循環,這就是多層循環。6、舉例:求和問題例20、s=1+2+.+100例21、s=1!+2!+ +

18、100!例22、e=1+1/1!+1/2!+1/3!+ 精確到10-6例23、s=1-1/3!+1/5!-1/7!+. 精確到10-6#include “math.h”main( ) long t; double s; for(s=0,t=1,i=0;fabs(1/t)>=1e-6;i+) t=(-1)*t*i; s=s+1/t;printf(“%lf”,s);例24、有一分數序列:2/1,3/2,5/3,8/5,13/6,21/13,.求出這個數列的前20項之和main() int s=0, f1=1,f2=2; for(I=1;I<=20;I+) s=s+f2/f1; f2=f

19、1+f2; f1=f2-f1; printf(“%d”,s);例25、打印九九表main( )int i,j; for(i=1;i<=9;i+) for(j=1;j<=9;j+) printf(“%2d*%2d=%2d”,i,j,i*j); printf(“n”);例26、打印出下列圖形 main( )int i,j;for(i=1;i<=5;i+) for(j=1;j<=5+fabs(i-3);j+) printf(“ ”);for(j=1;j<=5-2*fabs(i-3);j+) printf(“”);printf(“n”); 例27、打印出下列圖形 例28、

20、兔子繁殖問題main( ) int i,f1,f2,f3; for(i=3;i<=12;i+) f3=f1+f2;f1=f2;f2=f3;printf(“%d”,f3);例29、求最大公約數、最小公倍數。main( )int r,u,v,m,n;scanf(“%d,%d”,&m,&n);m=u;n=v;if(u<v) r=u;u=v;v=r;while(u!=0)r=u%v;u=v;v=r;printf(“最大公約數是:%d,最小公倍數是”,v,m*n/v);例30、sn=a+aa+aaa+aaa,從鍵盤輸入a及n后,求sn方法一:main()int n,a;lon

21、g s;scnaf(“%d%d”,&n,&a);for(i=1;i<=n;i+) s=s*10+i*a; printf(“%ld”,s); 方法二:main()int n,a;long s,t=0;scnaf(“%d%d”,&n,&a);for(i=1;i<=n;i+) t=t*10+as=s+t; printf(“%ld”,s); 例31、給出一個不多于5位的正整數,要求求出它是幾位數分別打印出每一位數逆序打印此數據。main( )long a; int i=0;s=0;printf(“它的每一位數:”);While(a!=0) i=i+1; x=

22、a%10; a=a/10; s=s*10+x; printf(“%d ”,x);printf(“n”);printf(“它是%d位數n”,i);printf(“它的逆序是%dn”,s); 例32、輸出1100之間每位數的乘積大于每位數的和的數 main() int n,k=1,s=0,m; for(n=1;n<=100;n+) k=1;s=0; m=n; while(m!=0) k=k+m%10;s=s+m%10;m=m/10;if(k>s) printf(“%d”,n);例33、猴子吃桃問題,猴子第一天摘下若干桃子,當即吃了一半,還不過癮又多吃了一個,第二天又將剩下的桃子吃掉一半

23、,又多吃了一個,以后每天都吃前一天剩下的半多一個,到第10天,再吃桃時只剩下一個桃子,求第一天共摘下多少了桃。 main() int i,s=1; for(i=9;i<=1;i-) s=2*s+1;printf(“第一天共摘下%d個桃子”,s);例34、準備客票:某鐵路線上共有10個車站,問需要準備幾種車票。main()int i,j,s=0; for(I=1;I<=9;I+) for(j=I+1;j<=10;j+) s=s+1; printf(“需要準備%d”,2*s); 例35、有1020個西瓜,第一天賣一半多兩個,以后每天賣剩下的一半多兩個,問幾天以后能賣完。 main

24、( ) int day=0,s=1020; while(s<=0) s=s/2-2; day+; printf(“%d”,day);例36、從三個紅球、五個白球、六個黑球中任意取出八個球,且其中必須有白球,輸出所有可能的方案。main()int red,white,black; for(white=1;white<=5;white+) for(red=0;red<=3;red+) for(black=0;black<=6;black+) if(white+red+black=8) printf(“%d個紅球,%d個白球,%d個黑球”,red,white,black);例37、二分迭代法二分迭代法的思想是:先取f(x)=0的兩個粗略解x1與x2。若f(x1)與f(x2)符號相反,則方程f(x)=0在區間(x1,x2)中至少有一個根。While(fabs(x1-x2)>=1

溫馨提示

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

評論

0/150

提交評論