全套課件-《C#語(yǔ)言程序設(shè)計(jì)》-李繼武_第1頁(yè)
全套課件-《C#語(yǔ)言程序設(shè)計(jì)》-李繼武_第2頁(yè)
全套課件-《C#語(yǔ)言程序設(shè)計(jì)》-李繼武_第3頁(yè)
全套課件-《C#語(yǔ)言程序設(shè)計(jì)》-李繼武_第4頁(yè)
全套課件-《C#語(yǔ)言程序設(shè)計(jì)》-李繼武_第5頁(yè)
已閱讀5頁(yè),還剩688頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

C#語(yǔ)言程序設(shè)計(jì)

1.1

.NET平臺(tái) 1、底層操作系統(tǒng) 這部分包括微軟提供的幾種操作系統(tǒng)Windows2000、WindowsXP、Windows2003等。1.1

.NET平臺(tái) 2、.NET企業(yè)服務(wù)器

MicrosoftSQLServer2000 MicrosoftExchange2000 MicrosoftBizTalkServer2000 MicrosoftApplicationCenter2000 MicrosoftMobileServer1.1

.NET平臺(tái) 3、.NET框架

.NET框架包含兩個(gè)主要部分:公共語(yǔ)言運(yùn)行庫(kù)(CommonLanguageRuntime,CLR)和.NET框架類庫(kù)(FCL)。1.1

.NET平臺(tái) 4、VisualStudio.NET集成開(kāi)發(fā)環(huán)境 它是微軟耕耘多年的開(kāi)發(fā)工具,在構(gòu)建基于Windows平臺(tái)的各種程序時(shí),它為程序員提供了非常出色的開(kāi)發(fā)環(huán)境。1.2.NET框架

1.2.1公共語(yǔ)言運(yùn)行庫(kù)(CLR) 公共語(yǔ)言運(yùn)行庫(kù)(CLR)為執(zhí)行用.NET語(yǔ)言編寫(xiě)的代碼提供了一個(gè)運(yùn)行環(huán)境。它管理.NET代碼的執(zhí)行,包括對(duì)內(nèi)存和對(duì)象生存期的管理。具體來(lái)說(shuō),CLR主要負(fù)責(zé)以下幾種任務(wù):1.2.NET框架

1、創(chuàng)建和執(zhí)行托管代碼 用.NET框架編寫(xiě)的代碼就是托管代碼,它在CLR的控制下運(yùn)行。為了利用CLR的功能,我們首先選擇一種面向CLR的編程語(yǔ)言,比如C#或VB.NET,然后利用該語(yǔ)言進(jìn)行軟件開(kāi)發(fā),開(kāi)發(fā)完的程序?qū)⒈痪幾g成微軟中間語(yǔ)言(MicrosoftIntermediateLanguage,簡(jiǎn)稱MSIL)。在執(zhí)行MSIL之前,由.NET框架的即時(shí)(Just-In-Time)編譯器將MSIL轉(zhuǎn)換成適合特定CPU結(jié)構(gòu)的本地代碼。

1.2.NET框架

2、自動(dòng)內(nèi)存管理 我們?cè)谟肅++進(jìn)行軟件開(kāi)發(fā)時(shí),對(duì)內(nèi)存的使用完全由程序員來(lái)決定,內(nèi)存的申請(qǐng)和釋放也完全由程序員自己來(lái)做。實(shí)踐表明,程序員在使用完內(nèi)存后常常忘記了釋放內(nèi)存,從而造成內(nèi)存泄漏,為程序的穩(wěn)定性埋下了隱患。

CLR提供了一種垃圾回收機(jī)制。也就是說(shuō),程序員只管申請(qǐng)內(nèi)存,不管釋放內(nèi)存。CLR后臺(tái)有一個(gè)專門的垃圾回收線程,它會(huì)按照自己的算法不定時(shí)地檢查它托管的內(nèi)存,如果發(fā)現(xiàn)沒(méi)有引用的對(duì)象在占據(jù)內(nèi)存,它就會(huì)把內(nèi)存收回。

1.2.NET框架

3、跨語(yǔ)言的互操作性 所謂跨語(yǔ)言的互操作性就是指用一種語(yǔ)言編寫(xiě)的代碼同用另一種語(yǔ)言編寫(xiě)的代碼進(jìn)行交互操作的能力,這種能力有助于提高代碼的重用性,提高軟件的開(kāi)發(fā)效率。 所有面向CLR的編程語(yǔ)言都必須支持通用語(yǔ)言規(guī)范(CommonLanguageSpecification,簡(jiǎn)稱CLS),CLS是支持.NET的編譯器的最低標(biāo)準(zhǔn)集,它可以確保多種語(yǔ)言的互操作性。

1.2.NET框架

1.2.2.NET框架的類庫(kù)

.NET框架類庫(kù)(FCL)通過(guò)提供可以繼承的基類為開(kāi)發(fā)者提供支持。開(kāi)發(fā)者在自己的應(yīng)用程序中可以使用一套分層次的.NET類,這些類由被稱為命名空間的容器組織起來(lái),能夠?yàn)殚_(kāi)發(fā)者提供可重復(fù)使用的基本功能或者高級(jí)功能。

1.2.NET框架

.NET框架類庫(kù)(FCL)包括如下內(nèi)容:

1、系統(tǒng)框架服務(wù)

2、ADO.NET組件

3、XML數(shù)據(jù)組件

4、WindowsForms組件

5、WebFoms組件1.3VisualStudio.NET 1.3.1VisualStudio.NET簡(jiǎn)介

VisualStudio.NET是微軟開(kāi)發(fā)的針對(duì).NET平臺(tái)的集成開(kāi)發(fā)環(huán)境,它包含一套完整的開(kāi)發(fā)工具,可以開(kāi)發(fā)桌面應(yīng)用程序、ASP.NETWeb應(yīng)用程序、XMLWebservices和移動(dòng)應(yīng)用程序。該環(huán)境包含VisualBasic.NET、VisualC++.NET、VisualC#.NET和VisualJ#.NET四種編程語(yǔ)言,并允許它們共享工具,這有助于創(chuàng)建混合語(yǔ)言解決方案。1.3VisualStudio.NET 1.3.2用VisualStudio.NET開(kāi)發(fā)C#應(yīng)用程序

VisualStudio.NET(本書(shū)簡(jiǎn)稱VS.NET)是微軟針對(duì).NET平臺(tái)提供的集成的開(kāi)發(fā)環(huán)境,它為開(kāi)發(fā)人員提供了功能強(qiáng)大的調(diào)試器和各種各樣的設(shè)計(jì)器,下面我們通過(guò)一個(gè)案例來(lái)學(xué)習(xí)VS.NET開(kāi)發(fā)程序的基本步驟。本章小結(jié)

本章詳細(xì)介紹了.NET平臺(tái)的主要內(nèi)容,重點(diǎn)闡述了公共語(yǔ)言運(yùn)行庫(kù)(CLR)和.NET框架類庫(kù)的工作原理,對(duì)VisualStudio.NET集成開(kāi)發(fā)工具進(jìn)行了介紹,并通過(guò)一個(gè)案例演示了通過(guò)VS.NET開(kāi)發(fā)程序的基本步驟,希望學(xué)生重點(diǎn)熟悉VS.NET開(kāi)發(fā)程序的基本步驟。

第2章C#語(yǔ)言基礎(chǔ)

本章主要介紹了C#語(yǔ)言的基本元素、基本數(shù)據(jù)類型及基礎(chǔ)語(yǔ)法規(guī)范,這是深入學(xué)習(xí)C#語(yǔ)言高級(jí)特性的先決條件。由于C#語(yǔ)言的語(yǔ)法規(guī)則與其他高級(jí)語(yǔ)言相比并沒(méi)有很大差別,所以,讀者(特別是熟悉C/C++/Java的讀者)可以快速通過(guò),并注意體會(huì)C#語(yǔ)言的獨(dú)有之處。

2.1基本數(shù)據(jù)類型

程序處理的對(duì)象是各種各樣的數(shù)據(jù),因此,我們必須讓計(jì)算機(jī)了解需要處理什么樣的數(shù)據(jù),以及采用哪種方式進(jìn)行處理,按什么格式進(jìn)行保存等等。比如,在編碼程序中需要處理單個(gè)字符,在定購(gòu)票系統(tǒng)需要打印貨幣金額,在科學(xué)運(yùn)算中我們需要不同精度的小數(shù),這些都是不同的數(shù)據(jù)類型。每一種編程語(yǔ)言都有它所支持的數(shù)據(jù)類型,不同的編程語(yǔ)言提供的數(shù)據(jù)類型不盡相同。C#語(yǔ)言的數(shù)據(jù)類型可以分為兩大部分:值類型和引用類型。數(shù)據(jù)類型分類如圖2-1所示。

字符類型

值類型數(shù)據(jù)類型

引用類型

sbytebyteshortushortintuintlong

類委托數(shù)組接口

簡(jiǎn)單類型

結(jié)構(gòu)類型

枚舉類型

整數(shù)類型

布爾類型

實(shí)數(shù)類型Floatdoubledecimalz2.1.1值類型

在具體講解各種數(shù)據(jù)類型之前,我們先提一下變量的概念,在下一節(jié)我們將對(duì)變量做進(jìn)一步的討論。從用戶角度來(lái)看,變量就是存儲(chǔ)信息的基本單元;從系統(tǒng)角度來(lái)看,變量就是計(jì)算機(jī)內(nèi)存中的一個(gè)存儲(chǔ)空間。值類型的變量其內(nèi)含為變量的值本身,C#語(yǔ)言的值類型可以分為以下幾種:簡(jiǎn)單類型(Simpletypes)結(jié)構(gòu)類型(Structtypes)枚舉類型(Enumerationtypes)簡(jiǎn)單類型,有時(shí)人們也稱為內(nèi)置數(shù)據(jù)類型,是C#語(yǔ)言中提供的、無(wú)法再分解的一種具體類型。從計(jì)算機(jī)的表示角度來(lái)看,這些簡(jiǎn)單類型可以分為整數(shù)類型、實(shí)數(shù)類型、字符類型和布爾類型。

整數(shù)類型

顧名思義,整數(shù)類型的變量的值為整數(shù)。數(shù)學(xué)上的整數(shù)可以從負(fù)無(wú)窮大到正無(wú)窮大,但是由于計(jì)算機(jī)的存儲(chǔ)單元是有限的,所以計(jì)算機(jī)語(yǔ)言提供的整數(shù)類型的值總是在一定的范圍之內(nèi)。根據(jù)變量在內(nèi)存中所占的二進(jìn)制位數(shù)不同和是否有符號(hào)位,C#語(yǔ)言中整數(shù)類型分八種:字節(jié)型(sbyte)、無(wú)符號(hào)字節(jié)型(byte)、短整型(short)、無(wú)符號(hào)短整型(ushort)、整型(int)、無(wú)符號(hào)整型(uint)、長(zhǎng)整型(long)、無(wú)符號(hào)長(zhǎng)整型(ulong)。所占的二進(jìn)制位數(shù)不同,表示的數(shù)值的取值范圍也不同,所占的二進(jìn)制位數(shù)越多,表示的數(shù)值的取值范圍越大。比如說(shuō)8位整數(shù),它可以表示2的8次冪個(gè)數(shù)值,即256個(gè)不同的數(shù)值,如果用來(lái)表示有符號(hào)8位整數(shù)(sbyte),其取值范圍就是在-128到127之間,而如果用來(lái)表示無(wú)符號(hào)8位整數(shù)(byte),其取值范圍就是在0到255之間。具體各整數(shù)類型及其取值范圍如表2-1所示。表2-1整數(shù)類型及其取值范圍數(shù)據(jù)類型特征取值范圍示例sbyte有符號(hào)8位整數(shù)在-128到127之間sbyteval=16;byte無(wú)符號(hào)8位整數(shù)在0到255之間byteval=16;short有符號(hào)16位整數(shù)在-32,768到32,767之間shortval=16;ushort無(wú)符號(hào)16位整數(shù)在0到65,535之間ushortval=16;int有符號(hào)32位整數(shù)在-2,147,483,648到2,147,483,647之間intval=16;uint無(wú)符號(hào)32位整數(shù)在0到4,294,967,295之間uintval1=16;uintval2=16U;long有符號(hào)64位整數(shù)在-9,223,372,036,854,775,808到9,223,372,036,854,775,807之間longval1=16;longval2=16L;ulong無(wú)符號(hào)64位整數(shù)在0到18,446,744,073,709,551,615之間ulongval1=16;ulongval2=16U;ulongval3=16L;ulongval4=16UL;

實(shí)數(shù)類型

數(shù)學(xué)中的實(shí)數(shù)不僅包括整數(shù),而且包括小數(shù)。在C#語(yǔ)言中實(shí)數(shù)類型包括單精度浮點(diǎn)類型(float)、雙精度浮點(diǎn)類型(double)和十進(jìn)制類型(decimal)。它們的差別主要在于取值范圍和精度不同。計(jì)算機(jī)對(duì)浮點(diǎn)數(shù)的運(yùn)算速度大大低于對(duì)整數(shù)的運(yùn)算,在對(duì)精度要求不是很高的情況下,我們最好采用float型,如果對(duì)精度要求很高時(shí),我們應(yīng)該采用double型,但這樣將會(huì)占用更多的內(nèi)存單元,處理速度也會(huì)相對(duì)較慢。Decimal型的取值范圍比double型的范圍要小的多,但它更精確,非常適合金融和貨幣方面的計(jì)算。具體各實(shí)數(shù)類型及其取值范圍與精度如表2-2所示。表2-2實(shí)數(shù)類型及其取值范圍與精度數(shù)據(jù)類型特征取值范圍示例float單精度浮點(diǎn)類型在正負(fù)1.5×10-45

到3.4×1038

之間,精度為7位數(shù)floatval=6.18F;double雙精度浮點(diǎn)類型在正負(fù)5.0×10-324

到1.7×10308之間,精度為15到16位數(shù)doubleval=6.18;decimal十進(jìn)制類型在1.0×10-28到7.9×1028的之間,精度為28至29位有效數(shù)字decimalval=6.18M;

字符類型

除了數(shù)字以外,計(jì)算機(jī)處理的信息,主要就是字符了。在C#語(yǔ)言中字符類型采用國(guó)際上公認(rèn)16位Unicode字符集表示形式,用它可以來(lái)表示世界上大多種語(yǔ)言。其取值范圍為'\u0000'到'\uFFFF',即0到65535。對(duì)于一個(gè)字符類型變量,我們可以采用如下方式對(duì)它進(jìn)行賦值。

charc='H';//字符Hcharc='\x0048';//字符H,十六進(jìn)制轉(zhuǎn)義符(前綴為\x)

charc='\u0048';//字符H,Unicode表示形式(前綴為\u)

charc='\r';//回車,轉(zhuǎn)義字符(用于在程序中指代特殊的控制字符)常見(jiàn)轉(zhuǎn)義字符如表2-3所示。表2-3轉(zhuǎn)義符(EscapeSequences)轉(zhuǎn)義符字符名\'單引號(hào)\"雙引號(hào)\\反斜杠\n新行\(zhòng)r回車\t水平tab\v垂直tab

布爾類型

布爾類型是用來(lái)表示“真”和“假”這兩個(gè)概念的。這雖然看起來(lái)很簡(jiǎn)單,但實(shí)際應(yīng)用非常廣泛。布爾類型表示的邏輯變量只有兩種取值:“真”或“假”,主要用來(lái)在程序中做“判斷”和“分支”。在C#語(yǔ)言中,這兩種取值分別采用true和false來(lái)表示。這里需要說(shuō)明的是,在C#語(yǔ)言中,我們不能象在C語(yǔ)言和C++語(yǔ)言中那樣,用0來(lái)表示“假”,其它任何非0的式子都表示“真”。任何整數(shù)類型和布爾類型之間都不能進(jìn)行轉(zhuǎn)換,將任何整數(shù)類型轉(zhuǎn)換成布爾型都是不合法的。

boolx=1;

//錯(cuò)誤,不存在這種寫(xiě)法。

booly=1;//錯(cuò)誤,不存在這種寫(xiě)法。

boolx=true;//正確,可以被執(zhí)行。

結(jié)構(gòu)類型

完成一些常見(jiàn)的數(shù)據(jù)運(yùn)算和文字處理工作,使用前面介紹過(guò)的簡(jiǎn)單類型似乎已經(jīng)足夠了。但是我們會(huì)經(jīng)常碰到一些更為復(fù)雜的數(shù)據(jù)類型。比如,學(xué)生成績(jī)單的記錄中一般包含學(xué)生的學(xué)號(hào)、姓名和成績(jī)。如果按照簡(jiǎn)單類型來(lái)處理,每一條記錄都要存放到三個(gè)不同的變量當(dāng)中,這樣工作量很大,也不夠直觀。有沒(méi)有更好的辦法呢?正如上面的例子,在實(shí)際生活中,我們經(jīng)常把一組相關(guān)的信息放在一起。把一系列相關(guān)的變量組織成為一個(gè)整體的過(guò)程,我們稱為生成結(jié)構(gòu)的過(guò)程。這個(gè)整體的類型就叫做結(jié)構(gòu)類型,每一個(gè)變量稱為結(jié)構(gòu)的成員。結(jié)構(gòu)類型采用struct進(jìn)行聲明,定義學(xué)生成績(jī)單的記錄結(jié)構(gòu)的代碼如下:structStudentScoreList{publicstringid;publicstringname;publicintscore;}StudentScoreLists1;

其中,s1是一個(gè)StudentScoreList結(jié)構(gòu)類型的變量。上面聲明中的public表示對(duì)結(jié)構(gòu)類型的成員的訪問(wèn)權(quán)限,詳細(xì)內(nèi)容參見(jiàn)3.2.2訪問(wèn)修飾符。對(duì)結(jié)構(gòu)成員的訪問(wèn)通過(guò)結(jié)構(gòu)變量名加上訪問(wèn)符“.”號(hào),再跟成員的名稱:

="Tom";

結(jié)構(gòu)類型包含的成員類型可以是任何類型,包括可以是另一種結(jié)構(gòu)類型。

structStudentScoreList{ publicstringid;publicstringname;publicstructScores{publicintmathematics;publicintchinese;publicintenglish;publicintbiology;}}

這里,StudentScoreList這個(gè)結(jié)構(gòu)中又包括了Scores這個(gè)結(jié)構(gòu),Scores結(jié)構(gòu)類型中包括:數(shù)學(xué)成績(jī)(mathematics)、語(yǔ)文成績(jī)(chinese)、英語(yǔ)成績(jī)(english)和生物成績(jī)(biology)四個(gè)成員,分別用來(lái)表示該學(xué)生某此考試的數(shù)學(xué)、語(yǔ)文、英語(yǔ)和生物四門課程的成績(jī)。

枚舉類型

枚舉類型實(shí)際上是為一組在邏輯上密不可分的整數(shù)值提供一個(gè)便于記憶的符號(hào)。枚舉類型采用enum來(lái)進(jìn)行聲明,下面我們來(lái)聲明一個(gè)代表星期的枚舉類型的變量:

enumWeekOfDaySunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday};WeekOfDayday;

編譯系統(tǒng)對(duì)枚舉元素按常量處理,程序中不能對(duì)枚舉元素進(jìn)行賦值操作。枚舉元素作為變量是有值的,編譯系統(tǒng)按照其在枚舉類型定義中的位置順序?qū)λ鼈冞M(jìn)行賦值,默認(rèn)情況下它們的值依次為0、1、2等。枚舉值可以用來(lái)進(jìn)行判斷比較,其比較規(guī)則是按其在定義時(shí)的順序號(hào)進(jìn)行比較。在枚舉中,也可以給元素直接賦值,如下把星期天的值設(shè)為1,其后的元素的值分別為2、3、…。

enumWeekOfDaySunday=1,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday};

另外,需要說(shuō)明的是,為枚舉類型的元素所賦的值的類型限于long、int、short和byte等整數(shù)類型。2.1.2引用類型

C#語(yǔ)言中的另一大數(shù)據(jù)類型是引用類型,引用類型也稱為參考類型。和值類型相比,引用類型的變量不直接存儲(chǔ)所包含的值,而是指向它所要存儲(chǔ)的值。換句話說(shuō),值類型在其內(nèi)存空間中存儲(chǔ)的是實(shí)際數(shù)據(jù),而引用類型在其內(nèi)存空間中存儲(chǔ)的是一個(gè)指針,該指針指向存儲(chǔ)數(shù)據(jù)的另一塊內(nèi)存位置。由此可見(jiàn),值類型的內(nèi)存開(kāi)銷要小,訪問(wèn)速度要快,而引用類型的內(nèi)存開(kāi)銷要大,訪問(wèn)速度稍慢。引用類型的好處在于它具有面向?qū)ο蟮奶卣?。C#語(yǔ)言中的引用類型有四種:類、委托、數(shù)組和接口。本節(jié)主要簡(jiǎn)單介紹一下類,詳細(xì)內(nèi)容參見(jiàn)3.2C#中的類與對(duì)象,其它的引用類型將在后面的章節(jié)中陸續(xù)介紹。

在面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言中,軟件對(duì)象經(jīng)常用于模仿現(xiàn)實(shí)世界中我們身邊的一些的事物,比如狗、桌子、電視和自行車等等。通過(guò)仔細(xì)分析,可以發(fā)現(xiàn)所有對(duì)象都具有兩個(gè)共同特征:狀態(tài)和行為。比如,狗有自己的狀態(tài)(比如名字、顏色、四條腿以及一個(gè)尾巴等等)和行為(比如叫、搖尾巴等等)。同樣自行車也有自己的狀態(tài)(比如當(dāng)前檔位、兩個(gè)輪子等等)和行為(比如剎車、加速、減速以及改變檔位等等)。在C#語(yǔ)言中,我們用變量來(lái)描述對(duì)象的狀態(tài),用操作變量的方法(函數(shù))來(lái)描述對(duì)象的行為。對(duì)象是面向?qū)ο蟪绦蛟O(shè)計(jì)的基礎(chǔ),問(wèn)題求解的過(guò)程就是對(duì)象與對(duì)象之間的相互通信和協(xié)作。

在現(xiàn)實(shí)世界中,你經(jīng)常會(huì)看到相同類型的許多對(duì)象。比如,你的自行車只是現(xiàn)實(shí)世界中許多自行車其中的一輛。把一類對(duì)象的共同特征抽象出來(lái),就形成了類。類是對(duì)象的軟件藍(lán)圖,是對(duì)某種類型的對(duì)象定義變量和方法的原型。比如,我們可以定義一個(gè)自行車類,它包括自行車所共有的特性,有一些狀態(tài)(當(dāng)前檔位、兩個(gè)輪子等等)以及行為(改變檔位、剎車等等),我們可以根據(jù)這個(gè)類(藍(lán)圖)來(lái)制造出不同的許多自行車,每輛自行車的狀態(tài)都是獨(dú)立的并且跟其它自行車不同,這種好處是顯而易見(jiàn)的。這時(shí)候,我們可以說(shuō)你的自行車是自行車類的一個(gè)對(duì)象。類是抽象的,而對(duì)象是具體的,一個(gè)類可以產(chǎn)生很多對(duì)象,類產(chǎn)生對(duì)象的過(guò)程我們稱為實(shí)例化,該對(duì)象稱為該類的一個(gè)實(shí)例。方法(行為)變量(狀態(tài))圖2-2類結(jié)構(gòu)示意圖

方法(行為)變量(狀態(tài))圖2-2類結(jié)構(gòu)示意圖在C#語(yǔ)言中,類是面向?qū)ο缶幊痰幕締挝唬虼?,類是C#語(yǔ)言中最基礎(chǔ)也是最重要的類型,是學(xué)習(xí)和掌握的重點(diǎn)。類是一種特殊的數(shù)據(jù)結(jié)構(gòu),它主要包含數(shù)據(jù)成員(變量)和函數(shù)成員(方法)兩部分,用來(lái)直接映射面向?qū)ο蟪绦蚍治龊驮O(shè)計(jì)中對(duì)象的狀態(tài)和行為。類基本結(jié)構(gòu)如圖2-2所示。類的數(shù)據(jù)成員有常量、域和事件。函數(shù)成員包括方法、屬性、索引指示器、運(yùn)算符、構(gòu)造函數(shù)和析構(gòu)函數(shù)。使用類進(jìn)行程序設(shè)計(jì)會(huì)帶來(lái)很多好處,比如類通過(guò)把數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)方法封裝到一起,從而實(shí)現(xiàn)了對(duì)數(shù)據(jù)的隱藏,保證了數(shù)據(jù)的安全;通過(guò)繼承和派生來(lái)擴(kuò)展基類的功能,從而實(shí)現(xiàn)了代碼重用和設(shè)計(jì)重用。上述內(nèi)容將放在后面章節(jié)中重點(diǎn)講解。類類型采用class進(jìn)行聲明,定義學(xué)生成績(jī)單的類代碼如下:classStudentScoreList{ privatestringid; privatestringname; privateintscore; publicStudentScoreList(stringi,stringn,ints) {id=i; name=n; score=s; } publicvoidDisplay() {Console.WriteLine("學(xué)號(hào):{0}\t姓名:{1}\t成績(jī):{2}",id,name,score); } publicstaticvoidMain() {StudentScoreLists1=newStudentScoreList("20040204","smith",96); s1.Display(); }}

上面定義了StudentScoreList這個(gè)類,其中包括數(shù)據(jù)成員id、name和score;函數(shù)成員StudentScoreList(stringi,stringn,ints)、Display()和Main()。在Main()函數(shù)中還實(shí)例化StudentScoreList類的對(duì)象s1,并訪問(wèn)了該對(duì)象方法Display()。下面我們介紹兩個(gè)經(jīng)常用到的類:(1)object類

object類是所有其它類型的基類,C#語(yǔ)言中的所有類型都直接或間接地從object類中繼承。因此,對(duì)一個(gè)object的變量可以賦予任何類型的值:

floatf=63.8;objectobj1;obj1=f;objectobj2="HelloWorld!";

對(duì)object類型的變量聲明采用object關(guān)鍵字,這個(gè)關(guān)鍵字是在.Net框架結(jié)構(gòu)為我們提供的預(yù)定義的名字空間System中定義的,是類System.Object的別名。(2)string類

C#還定義了一個(gè)基本的類string,表示一個(gè)Unicode字符序列,專門用于對(duì)字符串的操作。同樣,這個(gè)類也是在.Net框架結(jié)構(gòu)的預(yù)定義的名字空間System中定義的,是類System.String的別名。字符串在實(shí)際中應(yīng)用非常廣泛,利用string類中封裝的各種內(nèi)部操作,可以很容易完成對(duì)字符串處理。比如:

stringstr1="How"+"areyou?";//“+”運(yùn)算符用于連接字符串

charc="HelloWorld!"[2];//“[]”運(yùn)算符可以訪問(wèn)string中的個(gè)別字符,c='e'stringstr1="Nicetomeetyou!";stringstr2=@"Nicetomeetyou!";//字符串的另一種表示形式,用@引起來(lái)。

boolb=(string1==string2);//“==”運(yùn)算符用于兩個(gè)字符串比較,b=true

2.2變量和常量

2.2.1變量

變量(Variable)是程序設(shè)計(jì)語(yǔ)言中的名詞,是在程序的運(yùn)行過(guò)程中其值可以發(fā)生變化的量,你可以在程序中使用變量來(lái)容納各種各樣的數(shù)據(jù),并對(duì)它們進(jìn)行讀、寫(xiě)、運(yùn)算等操作。從用戶的角度看,變量是用來(lái)描述一條信息的名稱,在變量中可以存儲(chǔ)各種類型的信息,比如某人的年齡,某人的工資等等。而從系統(tǒng)的角度看,變量就是程序中的基本存儲(chǔ)單元,它既表示這塊內(nèi)存空間的地址,也表示這塊內(nèi)存空間中存儲(chǔ)的數(shù)據(jù)。在C#程序里使用某個(gè)變量之前,必須要告訴編譯器它是一個(gè)什么樣的變量,我們通過(guò)對(duì)變量聲明來(lái)完成。變量聲明的方法如下:

[訪問(wèn)修飾符]數(shù)據(jù)類型變量名[=初始值];

比如:

intage=26;//年齡,一般用整型表示

floatsalary=1200;//工資,一般用浮點(diǎn)型表示也可以同時(shí)聲明一個(gè)或多個(gè)給定類型的變量,比如:

inta=6,b=12,c=24;

可以從下面四個(gè)層面來(lái)理解變量:變量的名字、變量的值、變量的數(shù)據(jù)類型、變量的作用域。(1)變量的名字變量的名字,本質(zhì)上就是存儲(chǔ)這個(gè)變量的內(nèi)存空間的地址,為了使用的方便,我們給這個(gè)地址用一個(gè)助記符表示。比如,上面例子中我們用助記符age來(lái)表示某個(gè)人的年齡所存儲(chǔ)的內(nèi)存空間,用助記符salary來(lái)表示某個(gè)人的工資所存儲(chǔ)的內(nèi)存空間,我們可以通過(guò)助記符age和salary,很方便地完成對(duì)這個(gè)人年齡和工資的訪問(wèn)和修改。在這里,用來(lái)表示變量的名字的助記符可以是任意合法標(biāo)識(shí)符。標(biāo)識(shí)符(Identifier)是C#語(yǔ)言中的重要概念,它是用于標(biāo)記變量、常量、過(guò)程、函數(shù)、結(jié)構(gòu)、類、接口等元素的字符串,并滿足如下簡(jiǎn)單規(guī)則。標(biāo)識(shí)符是由字母和數(shù)字組成的字符串,長(zhǎng)度沒(méi)有限制,但首字符必須為字母、下劃線或@,其后的字符可以是字母、數(shù)字或下劃線。標(biāo)識(shí)符的名字不能使用C#語(yǔ)言中的關(guān)鍵字(見(jiàn)下表)。如果一定要用C#語(yǔ)言中的關(guān)鍵字作為標(biāo)識(shí)符,應(yīng)使用“@”字符作為前綴。標(biāo)識(shí)符中允許使用Unicode轉(zhuǎn)義符。標(biāo)識(shí)符嚴(yán)格區(qū)分字母大小寫(xiě)。

合法標(biāo)識(shí)符舉例:

name_Debug

哈爾濱市

WriteLineMax_Size

雖然C#中的標(biāo)識(shí)符可以是任意滿足以上要求的數(shù)字和字母的組合,但是,為了讓程序具有很好的可讀性,便于程序日后的維護(hù)、修改和升級(jí),我們建議使用如下規(guī)則對(duì)標(biāo)識(shí)符進(jìn)行命名。標(biāo)識(shí)符是由有較明確意義的若個(gè)單詞序列構(gòu)成的,比如:GetMaxValue()表示獲取最大值。對(duì)于一般變量名來(lái)講,單詞序列的第一個(gè)單詞的第一個(gè)字母小寫(xiě),其它單詞的第一個(gè)字母大寫(xiě),比如someVariableName。對(duì)于常量、類名、方法名等來(lái)講,單詞序列的每一個(gè)單詞的第一個(gè)字母都大寫(xiě),比如SomeFunction()。關(guān)鍵字(Keywords),又叫保留字,是C#編譯器本身使用的特定符號(hào)串,每個(gè)關(guān)鍵字都有它的特殊意義,程序設(shè)計(jì)者只能根據(jù)該意義加以使用,不能重新定義,因此標(biāo)識(shí)符不能使用關(guān)鍵字,以免發(fā)生錯(cuò)誤。C#語(yǔ)言的關(guān)鍵字如表2-4所示。表2-4關(guān)鍵字表abstractasbaseboolbreakbytecasecatchcharcheckedclassconstcontinuedecimaldefaultdelegatedodoubleelseenumeventexplicitexternfalsefinallyfixedfloatforforeachgotoifimplicitinintinterfaceinternalislocklongnamespacenewnullobjectoperatoroutoverrideparamsprivateprotectedpublicreadonlyrefreturnsbytesealedshortsizeofstackallocstaticstringstructswitchthisthrowtruetrytypeofuintulonguncheckedunsafeushortusingvirtualvoidvolatilewhile

(2)變量的值變量的值表示變量的名稱所指向的內(nèi)存空間中存儲(chǔ)的內(nèi)容。變量必須先定義后使用,變量使用之前必須被賦值。變量可以在定義時(shí)被賦值,也可以在定義時(shí)不被賦值,在定義時(shí)直接對(duì)變量賦值是良好的編程習(xí)慣。如果在定義時(shí)沒(méi)有賦值,可以在程序代碼中使用賦值語(yǔ)句直接對(duì)變量進(jìn)行賦值。舉例:

intage=26;//定義變量age,并在定義時(shí)直接對(duì)變量賦值,變量的值為26。

intage;//定義變量age,但在定義時(shí)沒(méi)有對(duì)變量賦值,變量沒(méi)有值。

……//其他語(yǔ)句

age=26;//使用賦值語(yǔ)句直接對(duì)變量age進(jìn)行賦值,變量的值為26。變量使用之前必須被賦值,如果使用未賦初始值的變量將會(huì)導(dǎo)致編譯器錯(cuò)誤。舉例:

classVariableTest//變量測(cè)試類

{publicstaticvoidMain() {stringname; Console.WriteLine(name);//使用未賦初始值的變量,會(huì)產(chǎn)生編譯錯(cuò)誤

}}

編譯后,會(huì)產(chǎn)生編譯錯(cuò)誤如下:

ViariableDemo.cs(7,22):errorCS0165:使用了未賦值的局部變量“name”。

對(duì)于一些類中的數(shù)據(jù)成員變量(參見(jiàn)3.2C#中的類與對(duì)象),如果聲明變量的時(shí)候沒(méi)給變量賦初始值,變量會(huì)帶有默認(rèn)的初始值。默認(rèn)初始值如表2-5所示:

2-5變量默認(rèn)初始值表變量類型默認(rèn)初始值任何數(shù)值類型0(0.0)string空字符串objectnullbooleanFalseDate01/01/01午夜(3)變量的數(shù)據(jù)類型變量的數(shù)據(jù)類型,決定了這個(gè)變量可以容納什么類型的數(shù)值,數(shù)值的取值范圍以及什么樣的操作可以被執(zhí)行。比如,變量age,用來(lái)表示某個(gè)人的年齡,人的年齡一定是整型數(shù),可以是28歲,36歲,但絕不可以是28.5歲,36.7歲。但是,變量的數(shù)據(jù)類型只是對(duì)變量數(shù)值大致的限制,比如人的年齡一定是大于0歲的,也一定是小于200歲的,對(duì)于變量數(shù)值更具體的限制,我們將在后面的章節(jié)進(jìn)行討論,參見(jiàn)3.2.8用屬性封裝數(shù)據(jù)。關(guān)于變量的數(shù)據(jù)類型,參見(jiàn)2.1基本數(shù)據(jù)類型。(4)變量的作用域變量的作用域,也叫做變量的生命周期,變量只用在它的生命周期內(nèi)才是有效的,才是可以被訪問(wèn)和使用的,超過(guò)了它的生命周期,它就是沒(méi)有意義的,任何對(duì)它的訪問(wèn)和使用,都會(huì)產(chǎn)生程序編譯錯(cuò)誤。變量的作用域一般是由變量聲明的位置決定的,變量在被定義時(shí)開(kāi)始了它的生命周期,在被定義時(shí)所在的語(yǔ)句塊結(jié)束時(shí)生命周期終止。此外,變量的實(shí)際作用域還和變量的訪問(wèn)修飾符密切相關(guān)。變量的作用域大致分為以下幾種:靜態(tài)變量作用域,實(shí)例變量作用域,方法參數(shù)作用域,局部變量作用域,異常處理參數(shù)作用域。舉例:

publicclassDomainTest{privateinta;//變量a的作用域?yàn)閷?shí)例變量作用域

staticintb;//變量b的作用域?yàn)殪o態(tài)變量作用域

publicintGetA(){returna;}publicvoidSetA(intaa)//變量aa的作用域?yàn)榉椒▍?shù)作用域

{inttemp;//變量temp的作用域?yàn)榫植孔兞孔饔糜?/p>

temp=aa; a=temp;}publicvoidSomeFuction(){

……try{

……}catch(Exceptione)//變量e的作用域?yàn)楫惓L幚韰?shù)作用域

{

……}}}

靜態(tài)變量作用域:帶有“static”修飾符聲明的成員變量為靜態(tài)成員變量。當(dāng)靜態(tài)成員變量所屬類被裝載后,靜態(tài)成員變量生命周期開(kāi)始,直到包含該所屬類的程序運(yùn)行結(jié)束后,靜態(tài)成員變量生命周期結(jié)束。在C#中不存在類似其他語(yǔ)言的全局變量,使用公共靜態(tài)成員變量可以實(shí)現(xiàn)類似的效果。實(shí)例變量作用域:不帶“static”修飾符聲明的變量為實(shí)例成員變量。當(dāng)一個(gè)類的實(shí)例被創(chuàng)建,其實(shí)例成員變量生命周期開(kāi)始,直到該實(shí)例不在被使用且所占用內(nèi)存空間被釋放,其實(shí)例成員變量生命周期結(jié)束。實(shí)例成員變量和該類的具體實(shí)例具有相同的生命周期。方法參數(shù)作用域:方法參數(shù)變量的生命周期只在該方法的語(yǔ)句塊內(nèi)存在,方法被調(diào)用時(shí),它的生命周期開(kāi)始,方法執(zhí)行完畢,它的生命周期結(jié)束。局部變量作用域:局部變量在其被定義的位置,生命周期開(kāi)始,直到該局部變量被定義的語(yǔ)句塊執(zhí)行結(jié)束后,該局部變量的生命周期結(jié)束。異常處理參數(shù)作用域:異常處理參數(shù)變量的生命周期只在錯(cuò)誤處理語(yǔ)句塊內(nèi)(即catch語(yǔ)句塊內(nèi))存在。參見(jiàn)2.5.4異常處理語(yǔ)句。變量的訪問(wèn)修飾符限制了變量的可見(jiàn)性,可以用public|protected|private|internal|protectedinternal等來(lái)限制,如果不使用修飾符,默認(rèn)情況下為private。關(guān)于訪問(wèn)修飾符,參見(jiàn)3.2.2訪問(wèn)修飾符。2.2.2常量

所謂常量(constant),就是在程序執(zhí)行中其值保持固定不變的量,我們一般把它分為直接常量和符號(hào)常量。常量的類型可以是任何一種值類型或引用類型,比如整型常量、浮點(diǎn)型常量、布爾型常量、字符型常量、字符串型常量及對(duì)象引用常量等。直接常量是指把程序中不變的量直接硬編碼為數(shù)值或字符串值,舉例:

12345//整型直接常量

3.6253e2//浮點(diǎn)型直接常量

true//布爾型直接常量

"哈爾濱師范大學(xué)計(jì)算機(jī)系"http://字符串型常量

null//對(duì)象引用常量,它通常用來(lái)表示無(wú)法建立對(duì)象或指不正確的對(duì)象符號(hào)常量是經(jīng)過(guò)聲明的常量,包括常量的名稱和它的值。常量聲明的格式如下:

[訪問(wèn)修飾符]Const數(shù)據(jù)類型常量名[=初始值];

舉例:

constdoublePi;publicconstdoubleE=2.7182818284590452354;

和變量一樣,我們可以同時(shí)聲明一個(gè)或多個(gè)給定類型的常量,比如:

publicconstdoubleX=1.0,Y=2.0,Z=3.0;

符號(hào)常量必須在聲明的時(shí)候賦初始值,而且一旦初始化以后,就不能再修改了,否則會(huì)出現(xiàn)編譯錯(cuò)誤。舉例:

classConstantTest//常量測(cè)試類

{publicstaticvoidMain() { constdoublePi=3.14;//定義符號(hào)常量Pi,并完成了初始化

Pi=3.1415926;//修改常量的初始值,會(huì)產(chǎn)生編譯錯(cuò)誤

}}

編譯后,會(huì)產(chǎn)生編譯錯(cuò)誤如下:

ConstantDemo.cs(7,13):errorCS0131:賦值號(hào)左邊必須是變量、屬性或索引器。符號(hào)常量提供了一種非?;镜珮O為有用的功能,使用符號(hào)常量能夠極大地提高代碼的可讀性和可維護(hù)性,比如,當(dāng)要修改某個(gè)在程序中多次出現(xiàn)的特定值時(shí),我們不需要對(duì)該值出現(xiàn)的每一個(gè)地方逐個(gè)進(jìn)行修改。我們看下面的代碼:

publicfloatGetArea(floatr){return(float)(3.14*r*r);//返回半徑為r的圓的面積

}

在此函數(shù)中,直接常量3.14的含義就不是很清楚,我們把這樣的數(shù)稱為幻數(shù)(magicnumber)。幻數(shù)可以完成單調(diào)乏味的任務(wù),但也很容易把錯(cuò)誤引入代碼,我們應(yīng)該盡量避免使用幻數(shù),而使用符號(hào)常量來(lái)代替。constdoublePi=3.14;//明圓周率π的值

publicfloatGetArea(floatr){ return(float)(Pi*r*r);//返回半徑為r的圓的面積

}

這樣,就可以很清楚地表明圓周率π的值。如果程序中多次用到這個(gè)值,我們每次都在需要的地方用符號(hào)常量Pi來(lái)代替它,當(dāng)我們要修改這個(gè)值的時(shí)候,比如,提高圓周率π的精度,我們只需要修改該常量的聲明即可,constdoublePi=3.14159265;,而不需要修改程序的其它任何地方。

2.3數(shù)組

圖2-3數(shù)組結(jié)構(gòu)示意圖數(shù)組是一種引用數(shù)據(jù)類型,在批量處理數(shù)據(jù)的時(shí)候,我們要使用數(shù)組。數(shù)組由一組類型相同的有序數(shù)據(jù)構(gòu)成,所有數(shù)據(jù)占據(jù)一塊連續(xù)的內(nèi)存空間。數(shù)組按照數(shù)組名、數(shù)據(jù)元素的類型和維數(shù)進(jìn)行描述。數(shù)組名可以是任意合法的標(biāo)識(shí)符。數(shù)組類型可以是任何數(shù)據(jù)類型,包括數(shù)組類型。數(shù)組按維數(shù)可分為一維數(shù)組、二維數(shù)組等。數(shù)組元素通過(guò)索引訪問(wèn),數(shù)組索引從0開(kāi)始。數(shù)組結(jié)構(gòu)示意圖如圖2-3所示。圖2-3數(shù)組結(jié)構(gòu)示意圖2.3.1一維數(shù)組

一維數(shù)組是最基本的數(shù)組類型,其聲明方法如下:數(shù)據(jù)類型[]數(shù)組名;

舉例:

int[]anArray;//聲明一個(gè)整型的一維數(shù)組

float[]anArrayOfFloats;//聲明一個(gè)浮點(diǎn)型的一維數(shù)組

string[]anArrayOfStrings;//聲明一個(gè)字符串型的一維數(shù)組聲明數(shù)組變量時(shí),還沒(méi)有創(chuàng)建數(shù)組,還沒(méi)有為數(shù)組中元素分配任何內(nèi)存空間,因此,聲明數(shù)組后,需要對(duì)數(shù)組實(shí)例化。

anArray=newint[5];anArrayOfStrings=newstirng[10];new運(yùn)算符用來(lái)創(chuàng)建數(shù)組,為數(shù)組中各元素分配內(nèi)存空間,并把它們初始化為默認(rèn)值。在此例中,所有數(shù)組元素都被初始化為零。例如:數(shù)組anArray中包含從anArray[0]到anArray[4]的5個(gè)元素,每個(gè)元素的取值都是零。我們也可以用給定的值對(duì)數(shù)組元素進(jìn)行初始化。舉例:

int[]anArray=newint[]{1,2,3,4,5,6};string[]anArrayOfStrings=newstring[]{"冠軍","亞軍","季軍"};

也可使用下列快捷方式:

int[]anArray={1,2,3,4,5,6};string[]anArrayOfStrings={"冠軍","亞軍","季軍"};

如果在聲明一個(gè)數(shù)組變量時(shí)沒(méi)將其初始化,必須使用new

運(yùn)算符將初始值分配給此變量,否則會(huì)產(chǎn)生編譯錯(cuò)誤。

int[]anArray;anArray={1,2,3,4,5,6};//錯(cuò)誤

anArray=newint[]{1,2,3,4,5,6};//正確下面給出一個(gè)一維數(shù)組應(yīng)用的完整案例:案例:練習(xí)一維數(shù)組的使用方法目標(biāo):掌握一維數(shù)組定義、初始化和遍歷訪問(wèn)的基本方法步驟:圖2-4啟動(dòng)界面

1、啟動(dòng)VisualStudio.NET,界面如圖2-4所示。圖2-4啟動(dòng)界面2、單擊【新建項(xiàng)目】,打開(kāi)【新建項(xiàng)目】對(duì)話框,項(xiàng)目類型選擇為【VisualC#項(xiàng)目】,模板選擇為【控制臺(tái)應(yīng)用程序】,名稱填寫(xiě)為“ArrayOfStringsTest”,位置設(shè)置為“c:\CSharpSamples\chp2”,界面如圖2-5所示。圖2-5“新建項(xiàng)目”窗口3、進(jìn)入VS.NET控制臺(tái)應(yīng)用程序設(shè)計(jì)的主界面,如圖2-6所示。圖2-6控制臺(tái)應(yīng)用程序設(shè)計(jì)主界面

圖2-6控制臺(tái)應(yīng)用程序設(shè)計(jì)主界面4、在代碼設(shè)計(jì)窗口中編輯Class1.cs。在其中的Main(string[]args)函數(shù)體內(nèi)寫(xiě)下如下代碼:

string[]anArrayOfStrings={"Sun","Sat","Mon","Tue","Wed","Thu","Fri"};for(inti=0;i<7;i++){Console.WriteLine(anArrayOfStrings[i]);}

5、按Ctrl+F5編譯并運(yùn)行該程序,效果如圖2-7所示。圖2-7程序運(yùn)行結(jié)果2.3.2二維數(shù)組

具有兩個(gè)維度的數(shù)組是二維數(shù)組,其聲明方法如下:數(shù)據(jù)類型[,]數(shù)組名;

舉例:

int[,]anArray;//聲明一個(gè)整型的二維數(shù)組

float[,]anArrayOfFloats;//聲明一個(gè)浮點(diǎn)型的二維數(shù)組

string[,]anArrayOfStrings;//聲明一個(gè)字符串型的二維數(shù)組聲明數(shù)組變量時(shí),還沒(méi)有創(chuàng)建數(shù)組,還沒(méi)有為數(shù)組中元素分配任何內(nèi)存空間,因此,聲明數(shù)組后,需要對(duì)數(shù)組實(shí)例化:

anArray=newint[2,4];anArrayOfStrings=newstirng[2,4];new運(yùn)算符用來(lái)創(chuàng)建數(shù)組,為數(shù)組中各元素分配內(nèi)存空間,并把它們初始化為默認(rèn)值。在此例中,所有數(shù)組元素都被初始化為零。例如:數(shù)組anArray中包含從anArray[0][0]到anArray[0][3],從anArray[1][0]到anArray[1][3]的共8個(gè)元素,每個(gè)元素的取值都是零。我們也可以用給定的值對(duì)數(shù)組元素進(jìn)行初始化。

舉例:

int[,]anArray=newint[2,4]{{1,2,3,4},{5,6,7,8}};string[,]anArrayOfStrings=newstring[2,2]{{"某甲","某乙"},{"冠軍","亞軍"}};

也可使用下列快捷方式:

int[,]anArray={{0,1,2,3},{1,2,3,4}};string[,]anArrayOfStrings={{"某甲","某乙"},{"冠軍","亞軍"}};

如果在聲明一個(gè)數(shù)組變量時(shí)沒(méi)將其初始化,必須使用new

運(yùn)算符將初始值分配給此變量,否則會(huì)產(chǎn)生編譯錯(cuò)誤。

int[,]anArray;anArray={{1,2},{3,4},{5,6},{7,8}};//錯(cuò)誤

anArray=newint[,]{{1,2},{3,4},{5,6},{7,8}};//正確

案例:一個(gè)2行3列的矩陣A與一個(gè)3行4列的矩陣B做乘積,得到一個(gè)2行4列的矩陣C。目標(biāo):掌握二維數(shù)組定義、初始化和遍歷訪問(wèn)的基本方法步驟:

1、啟動(dòng)VS.NET,新建一個(gè)控制臺(tái)應(yīng)用程序,名稱填寫(xiě)為“MatrixMultiplyTest”,位置設(shè)置為“c:\CSharpSamples\chp2”。

2、在代碼設(shè)計(jì)窗口中編輯Class1.cs。在其中的Main(string[]args)函數(shù)體內(nèi)寫(xiě)下如下代碼://聲明一個(gè)2行3列的二維數(shù)組,用于存放矩陣A,并初始化矩陣Aint[,]matrixA=newint[2,3]{{1,2,3},{4,5,6}};//聲明一個(gè)3行4列的二維數(shù)組,用于存放矩陣Bint[,]matrixB=newint[3,4];//初始化矩陣Bfor(inti=0;i<3;i++){for(intj=0;j<4;j++){matrixB[i,j]=(i+1)*(j+1);}}//聲明一個(gè)2行4列的二維數(shù)組,用于存放矩陣A和矩陣B的乘積

int[,]matrixC=newint[2,4];//計(jì)算矩陣A和矩陣B的乘積for(inti=0;i<2;i++){for(intj=0;j<4;j++){//初始化矩陣CmatrixC[i,j]=0;//計(jì)算矩陣A和矩陣B的乘積,并把值存放在矩陣C中

for(intk=0;k<3;k++){matrixC[i,j]+=matrixA[i,k]*matrixB[k,j];}}}//打印矩陣AConsole.WriteLine("\n********矩陣A********");WriteMatrix(matrixA,2,3);//打印矩陣BConsole.WriteLine("\n********矩陣B********");WriteMatrix(matrixB,3,4);//打印矩陣CConsole.WriteLine("\n********矩陣(AXB)********");WriteMatrix(matrixC,2,4);3、在類Class1中增加一個(gè)成員函數(shù)WriteMatrix(int[,]matrixX,introwCount,intcolumnCount),用于在屏幕上輸出矩陣。其中參數(shù)matrixX為待輸出的矩陣,參數(shù)rowCount為該矩陣的行數(shù),columnCount為該矩陣的列數(shù),代碼如下:

privatestaticvoidWriteMatrix(int[,]matrixX,introwCount,intcolumnCount){for(inti=0;i<rowCount;i++){//逐一打印各行中所有元素

for(intj=0;j<columnCount;j++){Console.Write(matrixX[i,j]+"\t");}//換行

Console.WriteLine();}}4、按Ctrl+F5編譯并運(yùn)行該程序,效果如圖2-8所示。圖2-8程序運(yùn)行結(jié)果

圖2-8程序運(yùn)行結(jié)果2.3.3數(shù)組的一些特性

在C#語(yǔ)言中,數(shù)組為我們提供了一些有用的特性,利用這些特性,我們可以完成一些更高級(jí)的功能。數(shù)組名.Length:返回一個(gè)整數(shù),該整數(shù)表示該數(shù)組的所有維數(shù)中元素的總數(shù)。數(shù)組名.Rank:返回一個(gè)整數(shù),該整數(shù)表示該數(shù)組的維數(shù)。數(shù)組名.GetLength(intdimension):返回一個(gè)整數(shù),該整數(shù)表示該數(shù)組的指定維(由參數(shù)dimension指定,維度從零開(kāi)始)中的元素個(gè)數(shù)。下面是一維數(shù)組初始化的例子:

int[]anArray=newint[6];for(inti=0;i<6;i++)anArray[i]=i+1;

這里采用單重for語(yǔ)句(參見(jiàn)2.5.2循環(huán)語(yǔ)句)對(duì)整個(gè)一維數(shù)組進(jìn)行遍歷,遍歷的同時(shí)完成每一個(gè)數(shù)組元素的賦值。這里的直接常量6,用來(lái)表示一維數(shù)組anArray的長(zhǎng)度,在上面的程序中共出現(xiàn)了兩次。如果不經(jīng)過(guò)仔細(xì)閱讀,我們很難想象for語(yǔ)句中的6究竟代表什么,特別是,如果當(dāng)該數(shù)組的聲名語(yǔ)句和for語(yǔ)句中間還有很多條其它語(yǔ)句的時(shí)候,我們就更難理解6所代表的意思。這里的6,就屬于我們?cè)谇懊嬷v的幻數(shù)(參見(jiàn)2.2.2常量),在程序中我們應(yīng)該盡量避免使用。利用數(shù)組名.Length這個(gè)屬性,可以決定什么時(shí)候終止循環(huán),這樣,我們就可以很容易完成對(duì)數(shù)組的遍歷,而且,程序具有很好地可讀性和可維護(hù)性。

int[]anArray=newint[6];for(inti=0;i<anArray.Length;i++)anArray[i]=i+1;

通過(guò)這種方式,我們可以很輕松地完成對(duì)數(shù)組的遍歷,甚至都不需要知道數(shù)組中究竟有多少個(gè)元素,而且這種方式很安全,不會(huì)出現(xiàn)數(shù)組索引越界的異常。下面是二維數(shù)組初始化的例子:

int[,]anArray=newint[3,4];for(inti=0;i<3;i++){for(intj=0;j<4;j++){anArray[i,j]=(i+1)*(j+1);}}

這里采用雙重for語(yǔ)句(參見(jiàn)2.5.2循環(huán)語(yǔ)句)對(duì)整個(gè)二維數(shù)組進(jìn)行遍歷,遍歷的同時(shí)完成每一個(gè)數(shù)組元素的賦值。這里的直接常量3和4,分別用來(lái)表示二維數(shù)組anArray第一維和第二維的長(zhǎng)度,在上面的程序中共出現(xiàn)了兩次。如果不經(jīng)過(guò)仔細(xì)閱讀,我們很難想象for語(yǔ)句中的3和4究竟代表什么,特別是,如果當(dāng)該數(shù)組的聲名語(yǔ)句和for語(yǔ)句中間還有很多條其它語(yǔ)句的時(shí)候,我們就更難理解3和4所代表的意思。這里的3和4,也屬于我們?cè)谇懊嬷v的幻數(shù)(參見(jiàn)2.2.2常量),在程序中我們應(yīng)該盡量避免使用。利用數(shù)組名.GetLength(0)和數(shù)組名.GetLength(1)這個(gè)方法,可以決定什么時(shí)候終止循環(huán),這樣,我們就可以很容易完成對(duì)數(shù)組的遍歷,而且,程序具有很好地可讀性和可維護(hù)性。int[,]anArray=newint[3,4];for(inti=0;i<anArray.GetLength(0);i++){ for(intj=0;j<anArray.GetLength(1);j++) { anArray[i,j]=(i+1)*(j+1); }}

通過(guò)這種方式,我們可以很輕松地完成對(duì)數(shù)組的遍歷,甚至都不需要知道數(shù)組中究竟有多少個(gè)元素,而且這種方式很安全,不會(huì)出現(xiàn)數(shù)組索引越界的異常。2.4表達(dá)式

表達(dá)式(expression)是可以進(jìn)行運(yùn)算并能夠產(chǎn)生值的式子,是操作數(shù)與運(yùn)算符按照一定的規(guī)則的組合,計(jì)算的結(jié)果稱為此表達(dá)式的值。操作數(shù)是運(yùn)算的對(duì)象,可以是任意常量、變量、方法等等。運(yùn)算符是具體要執(zhí)行的操作,C#語(yǔ)言中提供了大量的運(yùn)算符,參見(jiàn)2.6運(yùn)算符。下面是表達(dá)式的示例:

doublePi=3.1415926;doubler=10.0;doublearea;area=Pi*r*r;

該例中聲明圓周率Pi的值為3.1415926,圓半徑r的值為10.0,圓的面積area為Pi*r*r,式子Pi*r*r就是一個(gè)表達(dá)式,計(jì)算出來(lái)的結(jié)果4712就是表達(dá)式的值。2.5語(yǔ)句

C#程序由一系列的語(yǔ)句構(gòu)成。最常見(jiàn)的語(yǔ)句是簡(jiǎn)單語(yǔ)句,一般一句一行,以分號(hào)結(jié)束。我們前面的大部分程序都是由多個(gè)簡(jiǎn)單語(yǔ)句構(gòu)成的,按照編寫(xiě)的順序執(zhí)行,中途不能發(fā)生任何變化。然而,實(shí)際生活中并非所有的事情都是按部就班地進(jìn)行,程序也是一樣,我們經(jīng)常需要轉(zhuǎn)移或者改變程序執(zhí)行的順序,實(shí)現(xiàn)這些目的的語(yǔ)句叫作流程控制語(yǔ)句。C#語(yǔ)言中常用的流程控制語(yǔ)句及其所用到的關(guān)鍵字如下:條件語(yǔ)句:if,else,switch,case循環(huán)語(yǔ)句:while,do,for,foreach跳轉(zhuǎn)語(yǔ)句:break,continue異常處理語(yǔ)句:try,catch,finally

2.5.1條件語(yǔ)句

當(dāng)程序中需要進(jìn)行兩個(gè)或兩個(gè)以上的選擇時(shí),可以根據(jù)條件判斷來(lái)選擇將要執(zhí)行的一組語(yǔ)句。C#語(yǔ)言中提供的條件語(yǔ)句有if語(yǔ)句和switch語(yǔ)句。if語(yǔ)句

if語(yǔ)句是最常用的條件語(yǔ)句,它根據(jù)布爾表達(dá)式的值來(lái)選擇要執(zhí)行的語(yǔ)句。格式如下:

if(布爾表達(dá)式)嵌入語(yǔ)句1

或if(布爾表達(dá)式)嵌入語(yǔ)句1else嵌入語(yǔ)句2falsetrueAB布爾表達(dá)式值?嵌入語(yǔ)句1嵌入語(yǔ)句2falsetrueA布爾表達(dá)式值?嵌入語(yǔ)句1B圖2-9if語(yǔ)句流程圖

if語(yǔ)句按如下規(guī)則執(zhí)行:首先計(jì)算布爾表達(dá)式,當(dāng)布爾表達(dá)式的值為true時(shí),執(zhí)行if后面的嵌入語(yǔ)句1;為false時(shí),如果有else語(yǔ)句,則執(zhí)行else后面的嵌入語(yǔ)句2,否則執(zhí)行該程序if語(yǔ)句后續(xù)的下一條語(yǔ)句。嵌入語(yǔ)句可以是任意一條合法的C#語(yǔ)句,也可以是一個(gè)語(yǔ)句塊。語(yǔ)句塊是由若干條合法的C#語(yǔ)句構(gòu)成的,并使用{}括起來(lái)。下面的例子用來(lái)對(duì)一個(gè)浮點(diǎn)數(shù)x進(jìn)行四舍五入,結(jié)果保存到一個(gè)整數(shù)y中:

if(x–int(x))>0.5){y=int(x)+1;}else{y=int(x);}

如果if或else之后的嵌套語(yǔ)句只包含一條執(zhí)行語(yǔ)句,則嵌套部分的大括號(hào)可以省略。如果包含了兩條以上的執(zhí)行語(yǔ)句,對(duì)嵌套部分一定要加上大括號(hào)。如果程序的邏輯判斷關(guān)系比較復(fù)雜,通常會(huì)采用條件判斷嵌套語(yǔ)句。if語(yǔ)句可以嵌套使用,即在判斷之中又有判斷。具體形式如下:

if(布爾表達(dá)式){if(布爾表達(dá)式){

…………}else{

…………}

…………}else{if(布爾表達(dá)式){

…………}else{

…………}

…………}

此時(shí)應(yīng)該注意,每一條else語(yǔ)句與離它最近且沒(méi)有其它else語(yǔ)句與之對(duì)應(yīng)的if語(yǔ)句相匹配。比如下面一條語(yǔ)句:

if(x)if(y)F();elseG();

它實(shí)際上應(yīng)該等價(jià)于下面的寫(xiě)法:if(x){if(y){F();}else{G();}}

案例:對(duì)于一個(gè)給定的學(xué)生成績(jī)testscore,判斷testscore屬于哪一級(jí)grade。A級(jí):90~100,B級(jí):80~89,C級(jí):70~79,D級(jí):60~69,F(xiàn)級(jí):0~59。目標(biāo):掌握嵌套if語(yǔ)句進(jìn)行多分支選擇的使用技巧步驟:grade='F'falsefalsefalsefalsetruetruetruetrue開(kāi)始結(jié)束testscore>=90grade='A'testscore>=80grade='B'grade='C'grade='D'testscore>=70testscore>=60圖2-10成績(jī)分等級(jí)程序流程圖

1、對(duì)給定案例進(jìn)行分析2、啟動(dòng)VS.NET,新建一個(gè)控制臺(tái)應(yīng)用程序,名稱填寫(xiě)為“IfElseTest”,位置設(shè)置為“c:\CSharpSamples\chp2”。3、在代碼設(shè)計(jì)窗口中編輯Class1.cs。在其中的Main(string[]args)函數(shù)體內(nèi)寫(xiě)下如下代碼:

inttestscore=76;chargrade;if(testscore>=90){ grade='A';}elseif(testscore>=80) { grade='B'; } elseif(testscore>=70) { grade='C'; } elseif(testscore>=60) { grade='D'; } else { grade='F'; }Console.WriteLine("Grade="+grade);圖2-11程序運(yùn)行結(jié)果

4、按Ctrl+F5編譯并運(yùn)行該程序,效果如圖2-11所示。圖2-11程序運(yùn)行結(jié)果switch語(yǔ)句if語(yǔ)句每次判斷只能實(shí)現(xiàn)兩條分支,如果要實(shí)現(xiàn)多種分支的功能,可以采用switch語(yǔ)句。switch語(yǔ)句根據(jù)一個(gè)控制表達(dá)式的值選擇一個(gè)內(nèi)嵌語(yǔ)句分支來(lái)執(zhí)行。格式如下:

switch(控制表達(dá)式){case常量比較值1:嵌入語(yǔ)句1;case常量比較值2:嵌入語(yǔ)句2;

……

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論