c-程序設(shè)計教程第3章_第1頁
c-程序設(shè)計教程第3章_第2頁
c-程序設(shè)計教程第3章_第3頁
c-程序設(shè)計教程第3章_第4頁
c-程序設(shè)計教程第3章_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第3章

選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)

3.1一個簡單的選擇結(jié)構(gòu)程序3.2if語句——二分支選擇語句3.3switch語句——多分支選擇語句3.4一個簡單的循環(huán)結(jié)構(gòu)程序3.5while語句和do…while語句3.6for語句和foreach語句3.7跳轉(zhuǎn)語句

本章內(nèi)容【例3.1】

構(gòu)造一個C#控制臺應(yīng)用程序,使之實現(xiàn)下列分段函數(shù)的功能:3.1一個簡單的選擇結(jié)構(gòu)程序——分段函數(shù)的實現(xiàn)創(chuàng)建一個控制臺應(yīng)用程序PiecewiseFunction:3.1一個簡單的選擇結(jié)構(gòu)程序——分段函數(shù)的實現(xiàn)3.1.1創(chuàng)建C#控制臺應(yīng)用程序運(yùn)行該程序,從鍵盤上輸入一個數(shù)值數(shù)據(jù),如-3.14:

3.1一個簡單的選擇結(jié)構(gòu)程序——分段函數(shù)的實現(xiàn)3.1.2選擇結(jié)構(gòu)解析如果x>0,則f=1如果x=0,則f=0如果x<0,則f=-1選擇結(jié)構(gòu)3.1一個簡單的選擇結(jié)構(gòu)程序——分段函數(shù)的實現(xiàn)3.1.2選擇結(jié)構(gòu)解析(續(xù))選擇結(jié)構(gòu)主要有:單入口雙分支單入口三分支(如上面的if語句實現(xiàn)的選擇結(jié)構(gòu))單入口多分支(三個或三個以上的分支)對于這些選擇結(jié)構(gòu),除了可以利用if語句來實現(xiàn)以

外,還可以用switch語句來完成。3.2if語句——二分支選擇語句為表述方便,我們將if語句分為三種類型:if…語句if…else…語句if…elseif…else…語句3.2if語句——二分支選擇語句3.2.1if…語句if…語句是最簡單的一種if語句,其語法格式如下:if(布爾表達(dá)式)語句塊說明:該語句的作用是:如果括號中布爾表達(dá)式的值為true,則

執(zhí)行后面的語句塊(語句塊是指放在大括號“{”和“}”之間

的語句序列),否則什么都不做。如果語句塊僅由一條語句組成,那么大括號“{”和“}”可以

省略?!癷f(布爾表達(dá)式)”和“語句塊”可以放在一行上,也可以分在

兩行上?!癷f”后面括號中的表達(dá)式的返回值必須為布爾類型,即返回

true或false,這一點(diǎn)與C/C++不同;此外,關(guān)鍵字“if”后面

沒有“then”。3.2if語句——二分支選擇語句3.2.1if…語句(續(xù))if…語句的流程圖如下圖所示。3.2if語句——二分支選擇語句3.2.1if…語句(續(xù))【例3.2】

從鍵盤上輸入兩個整數(shù),然后輸出較大的整數(shù)。經(jīng)過該語句后x總是保存了它們當(dāng)中的最大者3.2if語句——二分支選擇語句3.2.2if…else…語句if…else…語句是一種二分支選擇語句,其語法格式如下:if(布爾表達(dá)式)語句塊1else語句塊2說明:該語句的作用是:如果括號中布爾表達(dá)式的值為true,則執(zhí)行后面的語句塊1,否則執(zhí)行語句2。也就是說,不管布爾表達(dá)式的值為true還是為false,語句塊1和語句塊2必有其中之一被執(zhí)行。3.2if語句——二分支選擇語句3.2.2if…else…語句(續(xù))【例3.3】

編寫一個窗體應(yīng)用程序,使之能夠?qū)o定的實數(shù)進(jìn)行四舍五入。創(chuàng)建C#窗體應(yīng)用程序Rounding,界面如下圖:3.2if語句——二分支選擇語句3.2.2if…else…語句(續(xù))雙擊“四舍五入”按鈕,在生成的button1_Click函數(shù)中添加下列代碼:在if語句中利用了int的強(qiáng)制數(shù)據(jù)轉(zhuǎn)換功能:對浮點(diǎn)數(shù)向下取整,如3.14和3.54在進(jìn)行int強(qiáng)制轉(zhuǎn)換后都得到3。于是根據(jù)x-(int)x的差值來決定是“舍”還是“入”。在“舍”和“入”之間的選擇正是利用了if…else…語句來實現(xiàn)。3.2if語句——二分支選擇語句3.2.3if…elseif…else…語句if…elseif…else…語句的語法格式如下:if(布爾表達(dá)式1)語句塊1elseif(布爾表達(dá)式2)語句塊2…elseif(布爾表達(dá)式n)語句塊nelse語句塊n+1說明:該語句的作用是:先計算布爾表達(dá)式1,如果其值為true,則執(zhí)行語句塊1;否則計算布爾表達(dá)式2,如果布爾表達(dá)式2的值為true,則執(zhí)行語句塊2;…;否則計算布爾表達(dá)式n,如果布爾表達(dá)式n的值為true,則執(zhí)行語句塊n;否則(所有布爾表達(dá)式的值均為false)執(zhí)行語句塊n+1。一旦有語句塊被執(zhí)行,執(zhí)行后程序都跳出整個if語句,而不再去計算其他表達(dá)式,更不會再執(zhí)行其他語句塊。默認(rèn)情況下,else總是與前面最近的if相匹配。最后面的“else”和“語句塊n+1”可以省略,要根據(jù)實際需要取舍。3.2if語句——二分支選擇語句3.2.3if…elseif…else…語句(續(xù))【例3.4】編寫一個控制臺應(yīng)用程序,使之能夠?qū)W(xué)生成績從百分制轉(zhuǎn)化為等級制。創(chuàng)建控制臺應(yīng)用程序Grade:staticvoidMain(string[]args){

Console.Write("請輸入分?jǐn)?shù):");doublescore=Convert.ToDouble(Console.ReadLine());stringgrade;if(score>100||score<0){

Console.Write("輸入的分?jǐn)?shù)不合法,請核查!");

Console.ReadLine();return;}

3.2if語句——二分支選擇語句3.2.3if…elseif…else…語句(續(xù))【例3.4】編寫一個控制臺應(yīng)用程序,使之能夠?qū)W(xué)生成績從百分制轉(zhuǎn)化為等級制。if(score>=90)grade="優(yōu)秀";elseif(score>=80)grade="良好";elseif(score>=70)grade="中等";elseif(score>=60)grade="及格";elsegrade="不及格";

Console.Write("成績等級為:{0}!",grade);

Console.ReadLine();}利用了if…elseif…else…語句來實現(xiàn)成績從百分制到等級制的轉(zhuǎn)化3.3switch語句

——多分支選擇語句switch語句的語法格式如下:switch(表達(dá)式){case常量表達(dá)式1:語句塊1;break;case常量表達(dá)式2:語句塊2;break;…case常量表達(dá)式n:語句塊n;break;default:語句塊n+1;break;}說明:switch語句的工作原理是:先計算“switch”后面的表達(dá)式的值,然后從上到下依次判斷該值是否等于“case”后面的常量表達(dá)式的值,如果等于某個常量表達(dá)式的值,如等于常量表達(dá)式i的值,則執(zhí)行對應(yīng)的語句塊i;執(zhí)行語句塊i后,如果碰到break語句,則跳出switch語句。表達(dá)式的類型必須是整型、字符型(char)、字符串型(string)或者枚舉型以及能夠隱士轉(zhuǎn)換為上述類型的任何一種數(shù)據(jù)類型。表達(dá)式不能為浮點(diǎn)型;表達(dá)式的類型必須與常量表達(dá)式的類型相匹配。switch語句中的default部分可以省略。switch語句中,最后的break語句是不能省略的。3.3switch語句

——多分支選擇語句【例3.5】

對于例3.4中關(guān)于將學(xué)生成績從百分制轉(zhuǎn)化為等級制的問題,也可以使用switch語句來解決。創(chuàng)建控制臺應(yīng)用程序Grade2:

staticvoidMain(string[]args){

Console.Write("請輸入分?jǐn)?shù):");doublescore=Convert.ToDouble(Console.ReadLine());stringgrade;if(score>100||score<0){

Console.Write("輸入的分?jǐn)?shù)不合法,請核查!");

Console.ReadLine();return;}

3.3switch語句

——多分支選擇語句switch((int)(score/10)){case10:case9:grade="優(yōu)秀";break;case8:grade="良好";break;case7:grade="中等";break;case6:grade="及格";break;default:grade="不及格";break;}

Console.Write("成績等級為:{0}!",grade);

Console.ReadLine();}switch語句

3.4一個簡單的循環(huán)結(jié)構(gòu)程序

——等差數(shù)列求和3.4.1創(chuàng)建C#控制臺應(yīng)用程序【例3.6】

構(gòu)造一個C#控制臺應(yīng)用程序,使之能夠計算下列等差數(shù)列的前n項之和,n從鍵盤輸入:1,3,5,7,9,…創(chuàng)建控制臺應(yīng)用程序ArithProg:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceArithProg{classProgram{

3.4一個簡單的循環(huán)結(jié)構(gòu)程序

——等差數(shù)列求和3.4.1創(chuàng)建C#控制臺應(yīng)用程序staticvoidMain(string[]args){

Console.Write("n=");

intn=int.Parse(Console.ReadLine());

inti=1; //循環(huán)控制變量

intsum=0; //累加器

while(i<=n){sum=sum+(2*i-1);i++;}Console.Write("1+3+5+...+{0}={1}",2*n-1,sum);

Console.ReadLine();}}}3.4一個簡單的循環(huán)結(jié)構(gòu)程序

——等差數(shù)列求和3.4.2循環(huán)結(jié)構(gòu)解析staticvoidMain(string[]args){

Console.Write("n=");

intn=int.Parse(Console.ReadLine());

inti=1;

intsum=0; //累加器

while(i<=n){sum=sum+(2*i-1);i++;}Console.Write("1+3+5+...+{0}={1}",2*n-1,sum);

Console.ReadLine();}}}while語句循環(huán)條件表達(dá)式

循環(huán)控制變量3.5while語句和do…while語句3.5.1while語句while語句屬于當(dāng)型循環(huán)語句,其語法格式如下:while(條件表達(dá)式)循環(huán)體{

語句序列;}說明:條件表達(dá)式的返回值必須布爾類型。該語句的功能是:先計算條件表達(dá)式的值,值為true時,會執(zhí)行

循環(huán)體中的語句;然后再計算表達(dá)式的值,如果仍然為true,則

繼續(xù)執(zhí)行循環(huán)體中的語句;不斷重復(fù)這個過程,直到條件表達(dá)式

的值為false時才退出while語句,執(zhí)行while語句后面的語句。如果循環(huán)體由多條語句組成,則必須用大括號“{”和“}”將這些語

句括起來;如果僅由一條語句組成,則大括號可以省略。3.5while語句和do…while語句3.5.1while語句(續(xù))【例3.7】

用while語句對下列無窮級數(shù)求和:分析:(1)該級數(shù)可以寫成:,顯然各項的分母構(gòu)成

了一個等差數(shù)列,因此可以用循環(huán)語句來控制;(2)設(shè)定循環(huán)終止條件:計算機(jī)程序不可能真正求一個無窮級

數(shù)的和,而只能求其前面有限項的和。這樣,循環(huán)的終止

條件可以設(shè)為求前面n項的和,或當(dāng)某一項的值小于給定

的閥值。這里,我們?nèi)『笳摺?.5while語句和do…while語句3.5.1while語句(續(xù))staticvoidMain(string[]args){doublet=2;

inti=1;doublesum=0;while(t>0.000001){t=1.0/i;sum=sum+t;i++;}Console.Write("1+1/2+1/3+...+1/{0}={1}",i-1,sum);

Console.ReadLine();}while語句循環(huán)控制變量(各項分母)累加器累加器3.5while語句和do…while語句3.5.2do…while語句do…while語句屬于直到型循環(huán)語句,其語法格式如下:do循環(huán)體{

語句序列;}while(條件表達(dá)式)說明:功能:先無條件地執(zhí)行一次循環(huán)體,再計算條件表達(dá)式的值,

如果其值為true,則繼續(xù)執(zhí)行循環(huán)體;然后再次計算條件表達(dá)式

的值,如果該值還是為true,則繼續(xù)執(zhí)行循環(huán)體,直到條件表達(dá)

式的值為false時才終止循環(huán),執(zhí)行do…while語句后面的語句。當(dāng)條件表達(dá)式的值一開始就為false時,do…while語句會執(zhí)行一

次循環(huán)體,而while語句則不會執(zhí)行循環(huán)體。這是它們的區(qū)別。3.5while語句和do…while語句3.5.2do…while語句(續(xù))【例3.8】

用do…while語句計算1~100之間所有整數(shù)的和。staticvoidMain(string[]args){

intn=100;

inti=1;

intsum=0; do{sum=sum+i;i++;}while(i<=n);Console.Write("1+2+3+...+{0}={1}",n,sum);

Console.ReadLine();}do…while語句3.6for語句和foreach語句3.6.1for語句for語句也使用頻率非常高一種循環(huán)語句;多用于:在循環(huán)次數(shù)已經(jīng)知道,或用于訪問數(shù)組的情況;實際上,for語句的使用方法十分靈活,其功能也十分強(qiáng)大。可以說,凡是使用while語句的地方都可以使用for語句替代。3.6for語句和foreach語句3.6.1for語句(續(xù))for語句的語法格式如下:for(表達(dá)式1;表達(dá)式2;表達(dá)式3)循環(huán)體{

語句序列;}說明:表達(dá)式1和表達(dá)式3可以是任意一種表達(dá)式,表達(dá)式2必須是布爾類型表

達(dá)式,或能夠隱式轉(zhuǎn)換為布爾類型的值。功能:先計算表達(dá)式1,然后計算表達(dá)式2,如果表達(dá)式2的值為false,

則退出該for循環(huán),執(zhí)行for語句后面的語句;如果表達(dá)式2的值為true,

則執(zhí)行循環(huán)體中的語句,接著計算表達(dá)式3,然后又計算表達(dá)式2,如果

表達(dá)式2的值仍然為true,則重復(fù)上面執(zhí)行循環(huán)體、計算表達(dá)式3的過

程,直到表達(dá)式2的值為false時才退出for循環(huán)。表達(dá)式1和表達(dá)式3可以省略,也可以根據(jù)需要將它們分別放在for語句之

前和for循環(huán)體內(nèi);表達(dá)式2一般不可省略,否則會導(dǎo)致死循環(huán),除非循

環(huán)體中有break語句。3.6for語句和foreach語句3.6.1for語句(續(xù))【例3.9】

從鍵盤輸入由若干字符構(gòu)成的一個字符串,用for語句統(tǒng)計字符串中大寫英文字母、小寫英文字母、數(shù)字字符和其他字符的個數(shù)。分析:大寫英文字母和小寫英文字母的ASCII碼值分別分布在65~90和97~122,數(shù)字字符的分布在48~57。于是,結(jié)合if,我們就可以用for語句統(tǒng)計各類字符的個數(shù)。3.6for語句和foreach語句3.6.1for語句(續(xù))staticvoidMain(string[]args){

int

lowerNum=0; //小寫字母個數(shù)

int

upperNum=0; //大寫字母個數(shù)

int

numeralNum=0; //數(shù)字個數(shù)

int

otherNum=0; //其他字符個數(shù)

stringline=Console.ReadLine();char[]chars=line.ToCharArray();

int

lineLen=chars.Length; //獲取字符數(shù)組chars的長度

for(inti=0;i<lineLen;i++){

int

ascii=(int)chars[i]; //獲取字符的ASCII碼值

if(ascii>=65&&ascii<=90)upperNum++; //統(tǒng)計大寫字母

elseif(ascii>=97&&ascii<=122)lowerNum++; //統(tǒng)計大寫字母

elseif(ascii>=48&&ascii<=57)numeralNum++; //統(tǒng)計數(shù)字字符

elseotherNum++; //統(tǒng)計其他字符

}

Console.WriteLine("大寫字母個數(shù):{0}",upperNum);

Console.WriteLine("小寫字母個數(shù):{0}",lowerNum);

Console.WriteLine("數(shù)字字符個數(shù):{0}",numeralNum);

Console.WriteLine("其他字符個數(shù):{0}",otherNum);

Console.ReadLine();}do…while語句循環(huán)控制變量循環(huán)條件表達(dá)式3.6for語句和foreach語句3.6.2foreach語句foreach語句多用于:對于集合類型中的元素,有時候不在乎元素的下標(biāo),或者根本就沒有下標(biāo)時,foreach語句來處理這些元素就顯得更為自然。foreach語句的語法格式如下:foreach(數(shù)據(jù)類型變量in集合表達(dá)式){

語句序列;}說明:作用:取出集合表達(dá)式中的每一個元素并保存到變量中,

每保存一次變量后執(zhí)行一次循環(huán)體,集合表達(dá)式中有多少

個元素就有多少次變量保存和循環(huán)體執(zhí)行操作。不能更改變量的值,只能引用。集合表達(dá)式的類型必須為集合類型3.6for語句和foreach語句3.6.2foreach語句(續(xù))【例3.10】

將學(xué)生的記錄信息(包括學(xué)號和姓名)保存到Hashtable類的實例中,然后用foreach語句篩選學(xué)號為奇數(shù)的學(xué)生。分析:Hashtable是命名空間System.Collections中的一個容器,它類似于數(shù)組(屬于一種集合類型),但比數(shù)組功能強(qiáng)大得多。它支持任何類型的key/value鍵值對,可以對其進(jìn)行元素添加和刪除、數(shù)據(jù)清空等操作。3.6for語句和foreach語句3.6.2foreach語句(續(xù))usingSystem.Collections;

//必須引入System.Collections命名空間,才能使用Hashtable類staticvoidMain(string[]args){

Hashtableht=newHashtable();//創(chuàng)建一個Hashtable實例

ht.Add(201001,"張趙剛");//在哈希表實例中添加學(xué)生記錄

ht.Add(201002,"李斯");ht.Add(201003,"王智高");ht.Add(201004,"蒙恬");ht.Add(201005,"趙高");

Console.WriteLine("學(xué)號為奇數(shù)的學(xué)生:");

Console.WriteLine("------------------------");

Console.WriteLine("學(xué)號姓名");

foreach(int

stuidinht.Keys){if((stuid+1)%2==0)

Console.WriteLine(stuid+""+ht[stuid]);}

Console.ReadLine();}foreach語句3.7跳轉(zhuǎn)語句3.7.1break語句和continue語句break語句是跳出循環(huán)體,終止循環(huán)語句continue語句結(jié)束本次循環(huán)而提前進(jìn)入下一輪循環(huán),整個循環(huán)語句仍在執(zhí)行break語句和continue語句一般都是帶條件的3.7跳轉(zhuǎn)語句3.7.1break語句和continue語句【例3.11】break語句的應(yīng)用舉例:判斷一個正整數(shù)是否為素數(shù)。分析:在數(shù)學(xué)上我們已經(jīng)知道,如果正整數(shù)n不被區(qū)間(1,n)中的任何整數(shù)整除,則n是素數(shù)。因此,用循環(huán)結(jié)構(gòu)依次檢查(1,n)中的整數(shù),一旦出現(xiàn)其中的整數(shù)整除n,則跳出循環(huán)結(jié)構(gòu),表明n不是素數(shù);如果所有這樣的整數(shù)都不整除n,則表明n是素數(shù)。3.7跳轉(zhuǎn)語句3.7.1break語句和continue語句staticvoidMain(string[]args){strings;

Console.Write("n=");

intn=int.Parse(Console.ReadLine());

inti;

if(i==1)s="整數(shù)"+n.ToString()+"是素數(shù)!";elses="整數(shù)"+n.ToString()+"不是素數(shù)!";

Console.Write(s);

Console.ReadLine();}for(i=(int)System.Math.Sqrt(n);i>1;i--)if(n%i==0)break;

break語句for(i=n-1;i>1;i--)

if(n%i==0)break;數(shù)學(xué)上可以證明,如果

溫馨提示

  • 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

提交評論