C#程序設(shè)計教程(第5版) 課件 第4章 結(jié)構(gòu)化程序設(shè)計_第1頁
C#程序設(shè)計教程(第5版) 課件 第4章 結(jié)構(gòu)化程序設(shè)計_第2頁
C#程序設(shè)計教程(第5版) 課件 第4章 結(jié)構(gòu)化程序設(shè)計_第3頁
C#程序設(shè)計教程(第5版) 課件 第4章 結(jié)構(gòu)化程序設(shè)計_第4頁
C#程序設(shè)計教程(第5版) 課件 第4章 結(jié)構(gòu)化程序設(shè)計_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第4章結(jié)構(gòu)化程序設(shè)計上節(jié)復(fù)習(xí):

1.數(shù)據(jù)類型 int、double、char、bool、string

2.變量 變量名、變量的類型、作用域和生存周期

3.運算符和表達(dá)式

++/--、條件表達(dá)式、優(yōu)先級內(nèi)容提要:算法、流程圖結(jié)構(gòu)化程序的三種基本結(jié)構(gòu)

異常處理目的要求:理解算法掌握選擇語句、循環(huán)語句和異常處理語句的使用重點難點:選擇語句、循環(huán)語句

算法和流程圖、異常處理4.1.1結(jié)構(gòu)化程序設(shè)計的概念及算法的概念結(jié)構(gòu)化程序設(shè)計是進(jìn)行以模塊功能和處理過程設(shè)計為主的詳細(xì)設(shè)計的基本原則,其主要觀點是采用自頂向下、逐步求精及模塊化的程序設(shè)計方法結(jié)構(gòu)化程序設(shè)計方法具有結(jié)構(gòu)清晰,可讀性強,易查錯等特點結(jié)構(gòu)化程序設(shè)計有三種基本結(jié)構(gòu),即:順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)4.1.1結(jié)構(gòu)化程序設(shè)計的概念及算法的概念算法是為解決一個特定問題而采取的確定的有限的步驟例:交換兩個變量A、B的值具體算法描述為:將變量A的值賦給中間變量將變量B的值賦給變量A將中間變量存放的值賦給變量B也可以寫成:C←AA←BB←C從上面可以看出算法實際上是用自然語言或其他方式描述一個計算機程序,而編寫程序就是把某種描述的算法通過程序設(shè)計語言重新對其進(jìn)行描述4.1.1結(jié)構(gòu)化程序設(shè)計的概念及算法的概念一個算法應(yīng)該具有的特點:有窮性:執(zhí)行若干步驟后能終止確定性:每個計算步驟都精確定義,無二義有效性:有效地執(zhí)行,并能得到確定的結(jié)果輸入:輸入信息是算法所需的初使數(shù)據(jù)輸出:沒有輸出的算法是沒有意義的4.1.2流程圖為了讓算法清晰,易懂,需要選擇一種好的描述方法。算法的描述方法有自然語言、傳統(tǒng)流程圖、N-S圖符號名稱說明

起始框表示算法的開始和結(jié)束

處理框表示完成某種操作,如初使化或運算賦值等

判斷框表示根據(jù)一個條件成立與否,執(zhí)行不同操作

輸入輸出表示數(shù)據(jù)的輸入、輸出操作

數(shù)據(jù)流表示程序執(zhí)行時的流向4.1.2流程圖傳統(tǒng)流程圖N-S流程圖4.1.2流程圖N-S流程圖4.2順序結(jié)構(gòu)4.2.1順序結(jié)構(gòu)的概念順序結(jié)構(gòu)的程序設(shè)計是最簡單的,它是按照解決問題的順序?qū)懗鱿鄳?yīng)的語句,它的執(zhí)行順序是自上而下,依次執(zhí)行。例:計算圓的周長和面積。usingSystem;classCircle{staticvoidMain(){constdoublePI=3.141;doubleR,L,S;Console.Write("請輸入圓的半徑值:");R=double.Parse(Console.ReadLine());L=2*PI*R;S=PI*R*R;Console.WriteLine("圓的周長為:{0}",L);Console.WriteLine("圓的面積為:{0}",S);}}練習(xí):1.下列程序運行后,輸出的結(jié)果是()。doublex=17.9;inty=3;y=(int)x%5;Console.WriteLine(y);2.若x=10,y=20,z=0,則表達(dá)式

"((m=(x>y)?x:y)>z)?m:z"的值為()。2204.3選擇結(jié)構(gòu)4.3.1選擇結(jié)構(gòu)的概念選擇結(jié)構(gòu)是一種常用的主要基本結(jié)構(gòu),是程序根據(jù)所給定條件為真或假,而決定從各實際可能的不同操作分支中執(zhí)行某一分支的相應(yīng)操作4.3選擇結(jié)構(gòu)4.3.2條件語句1.If

語句語法形式:if(布爾類型值或布爾類型表達(dá)式){

語句塊;}說明:如果表達(dá)式的值為true,則執(zhí)行后面if語句所控制的語句;如果表達(dá)式的值為false,則不執(zhí)行if語句控制的語句,而直接跳轉(zhuǎn)執(zhí)行后面的語句。例:計算下面公式中的b的值。2a+1(a≤100)b=

a(a>100)usingSystem;classvalue{staticvoidMain(){Console.Write("請輸入a的值:");inta=int.Parse(Console.ReadLine());intb=a;if(a<=100){ b=2*a+1;}

Console.WriteLine("b={0}",b);}}例:輸入三個數(shù),將它們從大到小排序inta,b,c,t=0;Console.Write("請輸入第一個數(shù):");a=int.Parse(Console.ReadLine());Console.Write("請輸入第二個數(shù):");b=int.Parse(Console.ReadLine());Console.Write("請輸入第三個數(shù):");c=int.Parse(Console.ReadLine());if(a<b)//本條件語句實現(xiàn)a>=b{t=a;a=b;b=t;}if(a<c)//本條件語句實現(xiàn)a>=c{t=a;a=c;c=t;}if(b<c)//本條件語句實現(xiàn)b>=c{t=b;b=c;c=t;}Console.WriteLine("排序結(jié)果為:{0},{1},{2}",a,b,c);4.3選擇結(jié)構(gòu)2.if…else語句語法:if(布爾類型值或布爾類型表達(dá)式){

語句塊1;}else{

語句塊2;}說明:如果表達(dá)式的值為true,則執(zhí)行if語句所控制的語句塊1;如果表達(dá)式的值為false,則執(zhí)行else語句所控制的語句塊2。例:輸入一個數(shù),對該數(shù)進(jìn)行四舍五入。usingSystem;classValue{

staticvoidMain(){Console.WriteLine("請輸入a的值:");doublea=double.Parse(Console.ReadLine());intb;if(a-(int)a>=0.5){b=(int)a+1;}else{b=(int)a;}Console.WriteLine("{0}進(jìn)行四舍五入后的值為:{1}",a,b);}}在if…else語句中可以嵌套使用多層if…else語句,如:if(表達(dá)式1)if(表達(dá)式2)if(表達(dá)式3)

……

語句1;else

語句2;else

語句3;else

語句4;在使用這種結(jié)構(gòu)時,要注意else和if的配對關(guān)系,其原則是:從第1個else開始,一個else總和它上面離它最近的可配對的if配對。例:inta=int.Parse(Console.ReadLine());if(a>0){if(a<20)a=2*a;if(a>100)a=a-50;elsea=a+10;//這個else與if(a>100)相配}elsea=-a;//這個else與if(a>0)相配Console.WriteLine("a=",a);練習(xí):1.若intm,n,r;則以下正確的是()A.if(m<>n)r--;B.if(m==n)r--;C.if(!m)r--;D.if(m=<n)r--;2.程序改錯。if(x=1)y+=5;else;y+=10;[思考與練習(xí)]

1.為鐵路編寫計算運費的程序。假設(shè)鐵路托運行李,規(guī)定每張客票托運費的計算方法是:行李重量不超過50kg時,每千克0.25元;超過50kg而不超過100kg時,其超過部分每千克0.35元;超過100kg時,其超過部分每千克0.45元。(編寫完整的程序,上機實現(xiàn))分析:托運費的分段函數(shù)是什么?答:設(shè)行李重量為w公斤,應(yīng)付托運費為x元,則托運費的分段函數(shù)是:(1)w<=50時,x=0.25*w(2)50<w<=100時,x=0.25*50+0.35*(w-50)(3)w>100時,x=0.25*50+0.35*50+0.45*(w-100)doublew,x=0;Console.Write("請輸入重量");w=double.Parse(Console.ReadLine())if(w<=50)x=0.25*wif(w>50&&w<=100)x=0.25*50+0.35*(w-50);if(w>100)x=0.25*50+0.35*50+0.45*(w-100)Console.WriteLine("運費為{0}",x);//不能寫成:50<w<=1004.3選擇結(jié)構(gòu)3.elseif語句elseif語句是if語句和if…else語句的組合,其一般形式如下:if(布爾類型值或布爾類型表達(dá)式1)

語句塊1;elseif(布爾類型值或布爾類型表達(dá)式2)

語句塊2;

[elseif(布爾類型值或布爾類型表達(dá)式n-1)

語句塊n-1;]

[else

語句塊n;]例:編寫一個實現(xiàn)如下函數(shù)值的程序-1,x<0f(x)=0,x=01,x>0usingSystem;classTest{staticvoidMain(){Console.Write("請輸入x的值:");doublex=double.Parse(Console.ReadLine());inty;if(x>0)y=1;elseif(x==0)y=0;elsey=-1;Console.WrteLine("f(x)={0}",y);}}4.3選擇結(jié)構(gòu)4.3.3分支語句

格式:switch(表達(dá)式){case常量表達(dá)式1:語句塊1;break;case常量表達(dá)式2:語句塊2;break;……[default:語句塊n;break;]}注意:1.表達(dá)式可以是整形、字符串、枚舉、布爾類型2.case后面的常量表達(dá)式必須和switch后面的類型匹配3.兩個或更多的case語句可以共用同一程序代碼編程:查詢學(xué)生姓名,輸入一個字符,如輸入"k"時,顯示Kate;輸入"m"時,顯示Mary;輸入"r"時,顯示Rose;輸入"T"時,顯示Tom;輸入其他字符時,顯示OtherStudents。

Console.Write("Enteracharacter:");charName=(char)Console.Read();switch(Name){ case'k':Console.WriteLine("Kate.");break;case'm':Console.WriteLine("Mary.");break;case'r':Console.WriteLine("Rose.");break;case'T':Console.WriteLine("Tom.");break;default:Console.WriteLine("Otherstudents.");break;

}例:usingSystem;classDemo{publicstaticvoidMain(){Console.Write("enteri=");inti=int.Parse(Console.ReadLine());switch(i){ case1: case2:case3: Console.WriteLine("iis1,2or3."); break; case4: Console.WriteLine("iis4."); break; }}}[思考與練習(xí)]1.以下程序運行時,輸出結(jié)果是什么?inty=1,x;if(y!=0)x=5;elseif(y<0)x=4;elsex=3;Console.WriteLine("x={0}",x);x=54.4循環(huán)結(jié)構(gòu)

循環(huán)是指在指定的條件下多次重復(fù)執(zhí)行一組語句。被重復(fù)執(zhí)行的一組語句稱為循環(huán)體。

采用循環(huán)結(jié)構(gòu)可以解決一些按一定規(guī)則重復(fù)執(zhí)行的問題。例如,統(tǒng)計一個班幾十名學(xué)生,甚至全校幾千名學(xué)生的學(xué)期成績,如求平均分、不及格人數(shù)等。4.4.1循環(huán)結(jié)構(gòu)的概念循環(huán)結(jié)構(gòu)按其循環(huán)體是否嵌套從屬的子循環(huán)結(jié)構(gòu),可分為單循環(huán)結(jié)構(gòu)和多重循環(huán)結(jié)構(gòu)。4.4循環(huán)結(jié)構(gòu)4.4.2while語句和do-while語句1.while語句語法格式:while(條件表達(dá)式){循環(huán)體}例:寫出下列程序的運行結(jié)果usingSystem;classSumw{staticvoidMain(){intn=1;while(n<6){Console.WriteLine("n={0}",n);n++;}}}例:使用while語句,編程計算1+2+…+1000。usingSystem;classSumw{staticvoidMain(){inti=1,sum=0;while(i<=1000){sum+=i;i++;}Console.WriteLine("1+2+…+1000={0}",sum);}}例:使用while語句,編程計算10的階乘值。usingSystem;classValue{staticvoidMain(){inti=10;longx=1;while(i>0){x*=i;i--;}Console.WriteLine("10!={0}",x);}}結(jié)果:[思考與練習(xí)](1)如果要實現(xiàn)sum=1+2+3+…+10,怎樣修改程序?(2)如果要實現(xiàn)sum=30+31+32+…+50,怎樣修改程序?while(i<=10)inti=30;While(i<=50)例:寫出下列程序的運行結(jié)果。

usingSystem;classexample{staticvoidMain(){inti=1,j,s=0;while(i<=3){j=1;while(j<=2){s++;j++;}i++;}Console.WriteLine("s={0}",s);}}循環(huán)語句允許嵌套,即while語句里面還可以再套while語句。結(jié)果:1.下列程序所計算的數(shù)學(xué)式是()inta=0,i=2;while(i<100){a+=i;i+=2;}A.a=1+2+4+…+98B.a=1+2+4+…+100C.a=2+4+6+…+98D.a=2+4+6+…+100

練習(xí):C2.以下程序段的循環(huán)次數(shù)為()inti=0,j=0;while(i<3){while(j<2)j++;i++;}練習(xí):54.4循環(huán)結(jié)構(gòu)2.do-while語句語法格式:do{循環(huán)體;}while(條件表達(dá)式);例:寫出下列程序的運行結(jié)果。usingSystem;classTestDoWhile{staticvoidMain(){intx,y=0;do{x=y++;Console.WriteLine(x);}while(y<5);}}4.4循環(huán)結(jié)構(gòu)do…while執(zhí)行過程while執(zhí)行過程例:編程利用do-while語句實現(xiàn)100以內(nèi)的能被5整除的數(shù)累加usingSystem;classEvenSum{staticvoidMain(){inti=5,esum=0;do{esum+=i;i+=5;}while(i<=100);Console.WriteLine("esum={0}",esum);}}例:使用do-while語句,編程計算1!+2!+……+10!。usingSystem;classSum{staticvoidMain(){inti=1,j;longm,sum=0;do{m=1;j=1;do{m*=j;j++;}while(j<=i);sum+=m;i++;}while(i<=10);Console.WriteLine("1!+2!+……+10!={0}",sum);}}練習(xí):1.while語句循環(huán)結(jié)構(gòu)和do...while語句循環(huán)結(jié)構(gòu)的區(qū)別在于()A.while語句的執(zhí)行效率較高B.do...while語句編寫程序較復(fù)雜C.無論條件是否成立,while語句都要執(zhí)行一次循環(huán)體D.do...while循環(huán)是先執(zhí)行循環(huán)體,后判斷條件表達(dá)式是否成立,而while語句是先判斷條件表達(dá)式,再決定是否執(zhí)行循環(huán)體D4.4循環(huán)結(jié)構(gòu)4.4.3for語句和foreach語句1.for語句

語法格式:

for(表達(dá)式1;表達(dá)式2;表達(dá)式3){循環(huán)體;}例:使用for循環(huán)語句,編程輸出1~20的每個奇數(shù)的平方。usingSystem;classsquare{staticvoidMain(){ints;for(inti=1;i<20;i+=2){s=i*i;Console.Write("{0}\t",s);}}}

for語句的幾點說明:(1)如果對循環(huán)變量在for語句前已賦初值,則在for語句中可省略表達(dá)式1,但要保留其后的分號。

...

inti=1;

for(;i<=20;i++)

...4.4循環(huán)結(jié)構(gòu)4.4循環(huán)結(jié)構(gòu)(2)for語句可以省略表達(dá)式2,即不判斷表達(dá)式條件是否成立,循環(huán)將一直進(jìn)行下去,但應(yīng)保留表達(dá)式2后面的分號。此時,需要在循環(huán)體中添加跳出循環(huán)的控制語句。例:for(inti=1;;i++){s=i*i;Console.WriteLine("{0}\t",s);if(i==10)break;}4.4循環(huán)結(jié)構(gòu)(3)for中可以省略表達(dá)式3。此時應(yīng)在循環(huán)體中添加改變循環(huán)變量值的語句,以結(jié)束循環(huán)。例:for(inti=1;i<=10;){s=i*i;Console.WriteLine("{0}\t",s);i++;}4.4循環(huán)結(jié)構(gòu)(4)for語句中的3個表達(dá)式可同時省略。inti=1;for(;;){s=i*i;Console.WriteLine("{0}\t",s);

i++;

if(i==10)

break;}例:用for語句輸出10!的值:usingSystem;classTest{

staticvoidMain(){

inti=1;

longm=1l;for(i=1;i<=10;i++) {m*=i; } Console.WriteLine("{0}!={1}",i-1,m);}}例:利用for循環(huán)嵌套語句,求1!+2!+3!+...+10!的和。usingSystem;classMultiSum{staticvoidMain(){longs=0,m=1;for(inti=1;i<=10;i++){m=1;for(intj=1;j<=i;j++)m*=j;s=s+m;}Console.WriteLine("1!+2!+3!+...+10!={0}",s);}}4.4循環(huán)結(jié)構(gòu)2.foreach語句----遍歷高手foreach語句用于列舉集合中的每一個元素,并且通過執(zhí)行循環(huán)體對每一個元素進(jìn)行操作。foreach語句只能對集合中的元素進(jìn)行循環(huán)操作。foreach語句的一般語法格式如下:foreach(數(shù)據(jù)類型標(biāo)識符in表達(dá)式){循環(huán)體}例:usingSystem;classTest{staticvoidMain(){double[]Array={16,12,31,8,21};int[]intArray={1,2,3};foreach(intiinintArray) { Console.WriteLine(Array[i]); }}}練習(xí):1.以下程序段的循環(huán)次數(shù)為()int[]a=newint[]{1,2,3,4,5};foreach(intiina)Console.WriteLine(i);A.0B.4C.5D.62.以下程序運行后,變量a的值為()inta=100;for(intj=10;j>0;j-=2)a-=j*3;A.100B.16C.13D.10CD4.4循環(huán)結(jié)構(gòu)4.4.4跳轉(zhuǎn)語句

跳轉(zhuǎn)語句用來改變程序的執(zhí)行順序1.break語句----跳出當(dāng)前在switch語句中,break用來使程序流程跳出switch語句,繼續(xù)執(zhí)行switch后面的語句;在循環(huán)語句中,break用來從當(dāng)前所在的循環(huán)內(nèi)跳出。語法格式:break;編程:任意給定一個整數(shù)n,判定其是否為素數(shù)。usingSystem;classPrime{staticvoidMain(){Console.Write("輸入n的值:");inti=1,n;n=int.Parse(Console.ReadLine());while(++i<n){if(n%i==0){

Console.WriteLine("{0}不是素數(shù)",n);break;}}if(i==n)

Console.WriteLine("{0}是素數(shù)",n);}}4.4循環(huán)結(jié)構(gòu)2.continue語句----跳出本次循環(huán)continue語句用于循環(huán)語句中。continue語句并不是跳出當(dāng)前的循環(huán),它只是終止一次循環(huán),接著進(jìn)行下一次循環(huán)是否執(zhí)行的判定。語法格式:

continue;1.intx=0,y=0;2.for(inti=1;i<10;i++)do{Console.Write(i+"

");{if(i%2==0)x=x+1;continue;if(x%2!=0)Console.WriteLine();continue;}y=y+1;}while(x<=10);Console.WriteLine("y={0}",y);寫出下列程序段的運行結(jié)果:結(jié)果:結(jié)果:用continue語句編程:輸出100以內(nèi)所有能被7整除的數(shù)usingSystem;classOutput{publicstaticvoidMain(){for(intj=1;j<=100;j++){if(j%7!=0)continue;Console.Write("{0}\t",j); }}}3.goto語句----指哪打哪goto語句是無條件跳轉(zhuǎn)語句。當(dāng)程序流程遇到goto語句時,就跳到它指定的位置。語法格式:

goto標(biāo)簽;

例:gotoend;

end:a=i+8;

標(biāo)簽必須和goto用在同一個方法中。4.4循環(huán)結(jié)構(gòu)例:usingSystem;classTest{staticvoidMain(){gotoH;W:Console.WriteLine("world");gotoX;H:Console.Write("Hello,");gotoW;X:Console.WriteLine("Goodbye!");}}注意:goto語句這種無條件跳轉(zhuǎn)程序執(zhí)行流程的功能,破壞了

程序的可讀行,現(xiàn)在已不提倡使用goto語句。4.5.1異常處理的概念異常:就是程序運行時發(fā)生的錯誤或某種意想不到的狀態(tài)。如溢出、被零除、數(shù)組下標(biāo)超出界限以及內(nèi)存不夠等。C#為常見的程序錯誤定義了許多標(biāo)準(zhǔn)的異常,如除0錯誤(divide-by-zero)、訪問越界(index-out-of-range)等。C#通常在兩種情況下產(chǎn)生異常:(1)在C#語句和表達(dá)式的處理過程中激發(fā)了某個異常的條件,使得操作無法正常結(jié)束,引發(fā)異常。(2)throw語句拋出異常。

4.5異常處理例如:當(dāng)企圖除以0(即除數(shù)是0)時,就會產(chǎn)生一個DivideByZeroException異常。usingSystem;classNotHandled{ staticvoidMain(){inta=0,b=5;

Console.WriteLine("Beforeexceptionisgenerated.");

b=b/a;

//產(chǎn)生除0異常}}當(dāng)程序有異常發(fā)生時,C#運行系統(tǒng)會捕獲到它,這時C#運行系統(tǒng)報告錯誤,并結(jié)束程序。例如:usingSystem;classNotHandled{staticvoidMain(){int[]nums=newint[4];Console.WriteLine("Beforeexceptionisgenerated.");

nums[7]=10;

//產(chǎn)生數(shù)組越界訪問異常

}

}4.5.2異常的處理捕獲異常并處理的好處是不用把那些令人討厭的系統(tǒng)默認(rèn)的異常消息提示給用戶,而且能使產(chǎn)生異常的應(yīng)用程序繼續(xù)執(zhí)行。在C#中用四個關(guān)鍵字:try、catch、throw、finally來管理C#異常處理。4.5異常處理1.使用try和catch語句來捕獲異常異常處理的核心是try和catch。但這兩個關(guān)鍵字必須配合使用,不可以單獨用catch。當(dāng)try中的一個異常被拋出時,它被相應(yīng)的catch語句捕獲,該語句然后處理異常。4.

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論