常用數據結構與算法_第1頁
常用數據結構與算法_第2頁
常用數據結構與算法_第3頁
常用數據結構與算法_第4頁
常用數據結構與算法_第5頁
已閱讀5頁,還剩139頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第7章常用數據結構與算法數據結構和算法是程序設計的基石。本章重點講述C#中的幾個主要的數據結構類型:字符串、數組和枚舉。本章還將介紹一些常用算法,如幾種典型排序算法的C#實現。2024/1/132C#程序設計實用教程

7.1字符串

字符串是應用程序和用戶交互的主要方式之一。.NET提供了幾個類來快速實現字符串操作,包括String、StringBuilder等。2024/1/133C#程序設計實用教程

7.1.1靜態(tài)字符串String

System.String是最常用的字符串操作類。下面從各個應用的角度對String類進行詳細的介紹。1.比較字符串比較字符串是指按照字典排序規(guī)那么,判定兩個字符的相對大小。在String類中,常用的比較字符串的方法包括Compare、CompareTo、CompareOrdinal以及Equals。2024/1/134C#程序設計實用教程

7.1.1靜態(tài)字符串String

〔1〕Compare方法Compare方法是String類的靜態(tài)方法,用于全面比較兩個字符串對象。下面使用Compare方法來比較兩個字符串,輸出結果如注釋語句所示。//定義兩個String對象,并對其賦值System.StringstrA="Hello";System.StringstrB="World"; 2024/1/135C#程序設計實用教程

7.1.1靜態(tài)字符串String

//CompareConsole.WriteLine(String.Compare(strA,strB)); //-1Console.WriteLine(String.Compare(strA,strA)); //0Console.WriteLine(String.Compare(strB,strA)); //12024/1/136C#程序設計實用教程

7.1.1靜態(tài)字符串String

〔2〕CompareTo方法CompareTo方法將當前字符串對象與另一個對象做比較,其作用與Compare類似,返回值也相同。CompareTo與Compare相比,區(qū)別在于:CompareTo不是靜態(tài)方法,可以通過一個String對象調用;CompareTo沒有重載形式,只能按照大小寫敏感方式比較兩個整串。2024/1/137C#程序設計實用教程

7.1.1靜態(tài)字符串String

CompareTo方法的使用如下代碼所示:

//定義兩個String對象,并對其賦值

System.StringstrA="Hello";System.StringstrB="World";

//CompareToConsole.WriteLine(strA.CompareTo(strB)); //-12024/1/138C#程序設計實用教程

7.1.1靜態(tài)字符串String

〔3〕Equals方法Equals方法用于方便地判定兩個字符串是否相同,有兩種重載形式:publicboolEquals(string)publicstaticboolEquals(string,string)如果兩個字符串相等,Equals()返回值為True;否那么,返回False。Equals方法的使用如下代碼所示://EqualsConsole.WriteLine(String.Equals(strA,strB)); //falseConsole.WriteLine(strA.Equals(strB)); //false2024/1/139C#程序設計實用教程

7.1.1靜態(tài)字符串String

〔4〕比較運算符String支持兩個比較運算符“==〞、“!=〞,分別用于判定兩個字符是否相等和不等,并區(qū)分大小寫。下例中,使用“==〞、“!=〞對“Hello〞和“World〞進行比較。//==和!=Console.WriteLine(strA==strB); //falseConsole.WriteLine(strA!=strB); //true2024/1/1310C#程序設計實用教程

7.1.1靜態(tài)字符串String

2.定位字符和子串定位子串是指在一個字符串尋找其中包含的子串或者某個字符,在String類中,常用的定位子串和字符的方法包括StartWith/EndsWith、IndexOf/LastIndexOf以及IndexOfAny/LastIndexOf。

2024/1/1311C#程序設計實用教程

7.1.1靜態(tài)字符串String

〔1〕StartWith/EndsWith方法StartWith方法可以判定一個字符串對象是否以另一個子字符串開頭,如果是返回True;否那么返回False。其定義為: publicboolStartsWith(stringvalue)其中,參數value即待判定的子字符串。//StartWithConsole.WriteLine(strA.StartsWith("He"));//trueConsole.WriteLine(strA.StartsWith("She"));//false另外,EndsWith方法可以判定一個字符是否以另一個子字符串結尾。2024/1/1312C#程序設計實用教程

7.1.1靜態(tài)字符串String

〔2〕IndexOf/LastIndexOf方法IndexOf方法用于搜索一個字符串,某個特定的字符或子串第一次出現的位置,該方法區(qū)分大小寫,并從字符串的首字符開始以0計數。如果字符串中不包含這個字符或子串,那么返回-1。定位字符:intIndexOf(charvalue)intIndexOf(charvalue,intstartIndex)intIndexOf(charvalue,intstartIndex,intcount)2024/1/1313C#程序設計實用教程

7.1.1靜態(tài)字符串String

定位子串:

intIndexOf(stringvalue)intIndexOf(stringvalue,intstartIndex)intIndexOf(stringvalue,intstartIndex,intcount)在上述重載形式中,其參數含義如下:

Value:待定位的字符或者子串。

startIndex:在總串中開始搜索的起始位置。

Count:在總串中從起始位置開始搜索的字符數。

2024/1/1314C#程序設計實用教程

7.1.1靜態(tài)字符串String

下例在“Hello〞中尋找字符“l(fā)〞第一次出現的位置。//IndexofConsole.WriteLine(strA.IndexOf('l')); //2同IndexOf類似,LastIndexOf用于搜索在一個字符串中,某個特定的字符或子串最后一次出現的位置,其方法定義和返回值都與IndexOf相同。2024/1/1315C#程序設計實用教程

7.1.1靜態(tài)字符串String

〔3〕IndexOfAny/LastIndexOfAnyIndexOfAny方法功能同IndexOf類似,區(qū)別在于,可以搜索在一個字符串中,出現在一個字符數組中的任意字符第一次出現的位置。2024/1/1316C#程序設計實用教程

7.1.1靜態(tài)字符串String

下例在“Hello〞中尋找字符“l(fā)〞第一次和最后一次出現的位置。//IndexofAny|LastIndexOfAnychar[]anyOf={'H','e','l'};Console.WriteLine(strA.IndexOfAny(anyOf)); //0Console.WriteLine(strA.LastIndexOfAny(anyOf)); //3同IndexOfAny類似,LastIndexOfAny用于搜索在一個字符串中,出現在一個字符數組中任意字符最后一次出現的位置。2024/1/1317C#程序設計實用教程

7.1.1靜態(tài)字符串String

3.格式化字符串Format方法用于創(chuàng)立格式化的字符串以及連接多個字符串對象。Foramt方法也有多個重載形式,最常用的為:publicstaticstringFormat(stringformat,paramsobject[]args);其中,參數format用于指定返回字符串的格式,而args為一系列變量參數。

2024/1/1318C#程序設計實用教程

7.1.1靜態(tài)字符串String

//FormatnewStr="";newStr=String.Format("{0},{1}!",strA,strB);Console.WriteLine(newStr); //Hello,World!在format參數中包含一些用大括號括起來的數字,如{0}、{1},這些數字分別一一對應于args參數數組中的變量。在生成結果字符串時,將使用這些變量代替{i}。需要說明的是,這些變量并不要求必須為String類型。

2024/1/1319C#程序設計實用教程

7.1.1靜態(tài)字符串String

例如,想要輸出一定格式的時間字符串,便可以使用Format方法,如下面代碼所示。newStr=String.Format("CurrentTime={0:yyyy-MM-dd}",System.DateTime.Now);Console.WriteLine(newStr); //形如:2023-09-19其中,格式字符串“yyyy-MM-dd〞指定返回時間的格式形如“2023-09-19〞。2024/1/1320C#程序設計實用教程

7.1.1靜態(tài)字符串String

4.連接字符串〔1〕Concat方法Concat方法用于連接兩個或多個字符串//ConcatnewStr="";newStr=String.Concat(strA,"",strB);Console.WriteLine(newStr); //“HelloWorld"2024/1/1321C#程序設計實用教程

7.1.1靜態(tài)字符串String

〔2〕Join方法Join方法利用一個字符數組和一個分隔符串構造新的字符串。常用于把多個字符串連接在一起,并用一個特殊的符號來分隔開。Join方法的常用形式為:publicstaticstringJoin(stringseparator,string[]values);其中,參數separator為指定的分隔符,而values用于指定所要連接的多個字符串數組。2024/1/1322C#程序設計實用教程

7.1.1靜態(tài)字符串String

下例用“^^〞分隔符把“Hello〞和“World〞連起來。//JoinnewStr="";String[]strArr={strA,strB};newStr=String.Join("^^",strArr);Console.WriteLine(newStr); //"Hello^^World"2024/1/1323C#程序設計實用教程

7.1.1靜態(tài)字符串String

〔3〕連接運算符“+〞String支持連接運算符“+〞,可以方便地連接多個字符串。例如,下例把“Hello〞和“World〞連接起來。//+newStr="";newStr=strA+strB;Console.WriteLine(newStr); //"HelloWorld"2024/1/1324C#程序設計實用教程

7.1.1靜態(tài)字符串String

5.分隔字符串使用Split方法可以把一個整串,按照某個分隔符,分裂成一系列小的字符串。例如,把整串,按照某個分隔符,分裂成一系列小的字符串。例如,把整串“Hello^^World〞按照字符“^〞進行分裂,可以得到3個小的字符串,即“Hello〞、“〞〔空串〕和“World〞。Split方法最常用的形式為:publicstring[]Split(paramschar[]separator);其中,參數separator數組包含分隔符。2024/1/1325C#程序設計實用教程

7.1.1靜態(tài)字符串String

//SplitnewStr="Hello^^World";char[]separator={'^'};String[]splitStrings=newString[100];splitStrings=newStr.Split(separator);inti=0;while(i<splitStrings.Length){ Console.WriteLine("item{0}:{1}",i,splitStrings[i]); i++;}輸出結果如下:

Item0:HelloItem1:Item2:World2024/1/1326C#程序設計實用教程

7.1.1靜態(tài)字符串String

6.插入和填充字符串String類包含了在一個字符串中插入新元素的方法,可以用Insert方法在任意插入任意字符。

Insert方法用于在一個字符串的指定位置插入另一個字符串,從而構造一個新的串。Insert方法最常用的為:

publicstringInsert(intstartIndex,stringvalue);其中,參數startIndex用于指定所要插入的位置,從0開始索引;value指定所要插入的字符串。2024/1/1327C#程序設計實用教程

7.1.1靜態(tài)字符串String

下例中,在“Hello〞的字符“H〞后面插入“World〞,構造一個串“HWorldello〞。//InsertnewStr="";newStr=strA.Insert(1,strB);Console.WriteLine(newStr); //"HWorldello"2024/1/1328C#程序設計實用教程

7.1.1靜態(tài)字符串String

7.刪除和剪切字符串String類包含了刪除一個字符串的方法??梢杂肦emove方法在任意位置刪除任意長度的字符。也可以使用Trim/TrimeEnd/TrimStart方法剪切掉字符串中的一些特定字符。

2024/1/1329C#程序設計實用教程

7.1.1靜態(tài)字符串String

〔1〕Remove方法Remove方法從一個字符串的指定位置開始,刪除指定數量的字符。最常用的形式為:publicstringRemove(intstartIndex,intcount);其中,參數startIndex用于指定開始刪除的位置,從0開始索引;count指定刪除的字符數量。下例中,把“Hello〞中的“ell〞刪掉。//RemovenewStr="";newStr=strA.Remove(1,3);Console.WriteLine(newStr); //"Ho"2024/1/1330C#程序設計實用教程

7.1.1靜態(tài)字符串String

〔2〕Trim/TrimStart/TrimEnd方法假設想把一個字符串首尾處的一些特殊字符剪切掉,如去掉一個字符串首尾的空格等,可以使用String的Trim()方法。其形式如下: publicstringTrim() publicstringTrim(paramschar[]trimChars)其中,參數trimChars數組包含了指定要去掉的字符,如果缺省,那么刪除空格符號。下例中,實現了對“@Hello#$〞的凈化,去掉首尾的特殊符號。2024/1/1331C#程序設計實用教程

7.1.1靜態(tài)字符串String

//TrimnewStr="";char[]trimChars={'@','#','$',''};StringstrC="@Hello#$";newStr=strC.Trim(trimChars);Console.WriteLine(newStr); //"Hello"另外,同Trim類似,TrimStart和TrimEnd分別剪切掉一個字符串開頭和結尾處的特殊字符。

2024/1/1332C#程序設計實用教程

7.1.1靜態(tài)字符串String

8.復制字符串String類包括了復制字符串方法Copy和CopyTo,可以完成對一個字符串及其一局部的復制操作。2024/1/1333C#程序設計實用教程

7.1.1靜態(tài)字符串String

〔1〕Copy方法假設想把一個字符串復制到另一個字符數組中,可以使用String的靜態(tài)方法Copy來實現,其形式為:publicstringCopy(stringstr);其中,參數str為需要復制的源字符串,方法返回目標字符串。下例中,把strA字符串“Hello〞復制到newStr中。//CopynewStr="";newStr=String.Copy(strA);Console.WriteLine(newStr); //"Hello"2024/1/1334C#程序設計實用教程

7.1.1靜態(tài)字符串String

〔2〕CopyTo方法CopyTo方法可以實現Copy同樣的功能,但功能更為豐富,可以復制字符串的一局部到一個字符數組中。其形式為:publicvoidCopyTo(intsourceIndex,char[]destination,intdestinationIndex,intcount);其中,參數sourceIndex為需要復制的字符起始位置,destination為目標字符數組,destinationIndex指定目標數組中的開始存放位置,而count指定要復制的字符個數。2024/1/1335C#程序設計實用教程

7.1.1靜態(tài)字符串String

下例中,把strA字符串“Hello〞中的“ell〞復制到newCharArr中,并在newCharArr中從第2個元素開始存放。//CopyTochar[]newCharArr=newchar[100];strA.CopyTo(2,newCharArr,0,3);Console.WriteLine(newCharArr); //〞llo"2024/1/1336C#程序設計實用教程

7.1.1靜態(tài)字符串String

9.替換字符串想要替換一個字符串中的某些特定字符或者某個子串,可以使用Replace方法來實現,其形式為:publicstringReplace(charoldChar,charnewChar);publicstringReplace(stringoldValue,stringnewValue);其中,參數oldChar和oldValue為待替換的字符和子串,而newChar和newValue為替換后的新字符和新子串。下例把“Hello〞通過替換變?yōu)椤癏ero〞。//ReplacenewStr=strA.Replace("ll","r"); Console.WriteLine(newStr); //Hero2024/1/1337C#程序設計實用教程

7.1.1靜態(tài)字符串String

10.更改大小寫String提供了方便轉換字符串中所有字符大小寫的方法ToUpper和ToLower。下例首先把“Hello〞轉換為“HELLO〞,然后再變?yōu)樾懶问健癶ello〞。//ToUpper|ToLowernewStr=strA.ToUpper(); Console.WriteLine(newStr); //HELLOnewStr=strA.ToLower();Console.WriteLine(newStr); //hello2024/1/1338C#程序設計實用教程

7.1.1靜態(tài)字符串String

補充:提取子串利用字符串的提取子串方法Substring,就可從一個字符串中得到子字符串。Substring方法有兩個參數,第一個參數指出從第幾個位置開始截取,第二個參數指出共提取幾個字符。截取以后的子串是另外一個字符串,而不是原來的字符串截短,原來的字符串不變。2024/1/1339C#程序設計實用教程

7.1.1靜態(tài)字符串String

usingSystem;classSubString{publicstaticvoidMain()

{stringstrOriginal="IlovesChina!";stringstrSub=strOriginal.Substring(2,12);Console.WriteLine("strOriginal:"+strOriginal);Console.WriteLine("strSub:"+strSub);stringstrTemp;for(inti=0;i<strOriginal.Length;i+=2)

{strTemp=strOriginal.Substring(i,1);Console.Write(strTemp);

}

}}2024/1/1340C#程序設計實用教程

7.1.1靜態(tài)字符串String

程序運行結果如下:2024/1/1341C#程序設計實用教程

7.1.1靜態(tài)字符串String

11.String小結本節(jié)介紹了最常用的String類,并從比較、定位子串、格式化、連接、分裂、插入、刪除、復制、大小寫轉換10個方面介紹了其方法和應用。之所以稱String對象為靜態(tài)串,是因為一旦定義一個String對象,就是不可改變的。在使用其方法〔如插入、刪除操作〕時,都要在內存中創(chuàng)立一個新的String對象,而不是在原對象的根底上進行修改,這就需要開辟新的內存空間。如果需要經常進行串修改操作,使用String類無疑是非常消耗資源的,這時需要使用StringBuilder類。2024/1/1342C#程序設計實用教程

7.1.2動態(tài)字符串StringBuilder

與String類相比,類可以實現動態(tài)字符串。此外,動態(tài)的含義是指在修改字符串時,系統(tǒng)不需要創(chuàng)立新的對象,不會重復開辟新的內存空間,而是直接在原StringBuilder對象的根底上進行修改。2024/1/1343C#程序設計實用教程

7.1.2動態(tài)字符串StringBuilder

1.聲明StringBuilder串StringBuilder類位于命名空間System.Text中,使用時,可以在文件頭通過using語句引入該命名空間:usingSystem.Text;聲明StringBuilder對象需要使用new關鍵字,并可以對其進行初始化。如以下語句聲明了一個StringBuilder對象myStringBuilder,并初始化為“Hello〞: StringBuildermyStringBuilder=newStringBuilder("Hello");2024/1/1344C#程序設計實用教程

7.1.2動態(tài)字符串StringBuilder

2.設置StringBuilder容量StringBuilder對象為動態(tài)字符串,可以對其設置好的字符數量進行擴展。另外,還可以設置一個最大長度,這個最大長度稱為該StringBuilder對象的容量〔Capacity〕。2024/1/1345C#程序設計實用教程

7.1.2動態(tài)字符串StringBuilder

有兩種方式來設置一個StringBuilder對象的容量?!?〕使用構造函數StringBuilder構造函數可以接受容量參數,例如,下面聲明一個StringBuilder對象sb2,并設置其容量為100。//使用構造函數StringBuildersb2=newStringBuilder("Hello",100);2024/1/1346C#程序設計實用教程

7.1.2動態(tài)字符串StringBuilder

〔2〕使用Capacity讀/寫屬性Capacity屬性指定StringBuilder對象的容量。例如下面語句首先一個StringBuilder對象sb3,然后利用Capacity屬性設置其容量為100。//使用Capacity屬性StringBuildersb3=newStringBuilder("Hello");sb3.Capacity=100;2024/1/1347C#程序設計實用教程

7.1.2動態(tài)字符串StringBuilder

3.追加操作追加一個StringBuilder是指將新的字符串添加到當前StringBuilder字符串的結尾處,可以使用Append和AppendFormat來實現這個功能?!?〕Append方法下例中,把一個StringBuilder字符串“Hello〞追加為“HelloWorld!〞。//AppendStringBuildersb4=newStringBuilder("Hello");sb4.Append("World!");Console.WriteLine(sb4); //"HelloWorld!"2024/1/1348C#程序設計實用教程

7.1.2動態(tài)字符串StringBuilder

〔2〕AppendFormat方法AppendFormat方法可以實現對追加局部字符串的格式化,可以定義變量的格式,并將格式化后的字符串追加在StringBuilder后面。2024/1/1349C#程序設計實用教程

7.1.2動態(tài)字符串StringBuilder

4.插入操作StringBuilder的插入操作是指將新的字符串插入到當前的StringBuilder字符串的指定位置,如“Hello〞變?yōu)椤癏eeeello〞??梢允褂肧tringBuilder類的Insert方法來實現這個功能,常用形式為:publicStringBuilderInsert(intindex,objectvalue);其中,參數index指定所要插入的位置,并從0開始索引,如index=1,那么會在原字符串的第2個字符之前進行插入操作;同Append一樣,參數value并不僅是只可取字符串類型。2024/1/1350C#程序設計實用教程

7.1.2動態(tài)字符串StringBuilder

下例中,把一個StringBuilder字符串“Hello〞通過插入操作修改為“Heeeello〞。//InsertStringBuildersb6=newStringBuilder("Hello");sb6.Insert(2,"eee");Console.WriteLine(sb6); //"Heeeello"2024/1/1351C#程序設計實用教程

7.1.2動態(tài)字符串StringBuilder

5.刪除操作StringBuilder的刪除操作可以從當前StringBuilder字符串的指定位置,刪除一定數量的字符,例如把“Heeeello〞變?yōu)椤癏ello〞。可以使用StringBuilder類的Remove方法來實現這個功能,常用形式為:publicStringBuilderRemove(intstartIndex,intlength);其中,參數startIndex指定所要刪除的起始位置,其含義同Insert中的index相同;length參數指定所要刪除的字符數量。2024/1/1352C#程序設計實用教程

7.1.2動態(tài)字符串StringBuilder

下例中,把一個StringBuilder字符串“Heeeello〞通過刪除操作修改為“Hello〞。//RemoveStringBuildersb7=newStringBuilder("Heeello");sb7.Remove(2,2); //在〞He〞后面刪除個字符Console.WriteLine(sb7); //"Hello!"2024/1/1353C#程序設計實用教程

7.1.2動態(tài)字符串StringBuilder

6.替換操作StringBuilder使用Replace方法來實現替換操作,例如把“Hello〞變?yōu)椤癏ero〞,就需要使用替換操作,將“l(fā)l〞替換為“r〞。這同String類的Replace方法非常類似,其常用形式包括:publicStringBuilderReplace(charoldChar,charnewChar);publicStringBuilderReplace(stringoldValue,stringnewValue);其中,參數oldChar和oldValue為待替換的字符和子串,而newChar和newValue為替換后的新字符和新子串。2024/1/1354C#程序設計實用教程

7.1.2動態(tài)字符串StringBuilder

下例把“Hello〞通過替換為“Hero〞。//ReplaceStringBuildersb8=newStringBuilder("Hello");sb8=sb8.Replace("ll","r"); Console.WriteLine(sb8); //Hero2024/1/1355C#程序設計實用教程

7.1.2動態(tài)字符串StringBuilder

7.與String比較可以看出StringBuilder與String在許多操作上是非常相似的。而在操作性能和內存效率方面,StringBuilder要比String好得多。而另一方面,String類提供了更多的方法,可以使開發(fā)能夠更快地實現應用。在兩者的選擇上,如果應用對于系統(tǒng)性能、內存要求比較嚴格,以及經常處理大規(guī)模的字符串,推薦使用StringBuilder對象;否那么,可以選擇使用String。2024/1/1356C#程序設計實用教程

7.2數組

數組的作用非常強大,數據也是根本數據結構之一,是編程實現過程中必不可少的要素之一。2024/1/1357C#程序設計實用教程

7.2.1數組的概念

數組〔Array〕是一種數據結構,一個數組由假設干個類型相同的數組元素的變量,這些變量可以通過一個數組名和數組下標〔或者稱為索引〕來訪問。C#中的數組下標是從零開始,數組中的所在元素都具有相同的類型。在數組中,每一個成員叫做數組元素,數組元素的類型稱為數組類型,數組類型可以是C#中定義的任意類型,其中也包括數組類型本身。如果一個數組的類型不是數組類型,稱之為一維數組。如果數組元素的類型是數組類型,就稱之為多維數組,也就是說,數組定義可以嵌套。2024/1/1358C#程序設計實用教程

7.2.1數組的概念

無論是一維數組還是多維數組,每個維的下標都是從0開始,結束于這個維的數組長度減1。數組被用于各種目的,因為它提供了一種高效、方便的手段將相同類型的變量合成一組。例如,可以用數組保存一個月中每天的溫度記錄,貨物平均價格的記錄。數組的主要優(yōu)點是,通過這樣的一種方式組織數據使得數據容易被操縱。例如,有一個數組,它包括選定的一組學生的數學成績,操作該數組,很容易計算其平均數學成績。而且數據以這樣的方式組織數據,會很容易實現對數據的排序。2024/1/1359C#程序設計實用教程

7.2.1數組的概念

在實際使用數據的過程中,一般是先確定數據類型,然后根據實際情況確定數組的長度。C#中的數組是由System.Array類派生而來的引用對象,因此可以使用Array類的方法來進行各種操作。另外,數組常常用來實現靜態(tài)的操作,即不改變其空間大小,如查找、遍歷等。數組也可以實現動態(tài)的操作、如插入、刪除等,但不推薦使用,而應盡量使用集合來代替。2024/1/1360C#程序設計實用教程

7.2.2System.Array類

System.Array類是C#中各種數組的基類,其常用屬性和方法的簡單說明如表7-1所示。2024/1/1361C#程序設計實用教程

7.2.3一維數組

由具有一個下標的數組元素所構成的數組就是一維數組,一維數組是簡單的數組。例如:為了記錄50個銀行儲蓄用戶的賬號,就可以使用一個長度為50的一維數組來處理。一維數組比較直觀,使用起來相對容易。2024/1/1362C#程序設計實用教程

7.2.3一維數組

1.一維數組的定義數據在使用前使用先進行定義。定義一維數組的格式如下:

數據類型[]數組名:其中數組類型為各種數據類型,它表示數據元素的類型;數組名可以是C#合法的標識符;在數組名與數據類型之間是一組空的方括號。例如:char[]charArr;//定義了一個字符型的一維數組int[]intArr;//定義了一個整型一維數組string[]strArr;//定義了一個字符串類型一維數組在定義數組后,必須對其進行初始化才能使用;初始化數組有兩種方法,即動態(tài)初始化和靜態(tài)初始化。2024/1/1363C#程序設計實用教程

7.2.3一維數組

2.動態(tài)初始化動態(tài)初始化需要借助new運算符,為數組元素分配內存空間,并為數據元素賦初始值。動態(tài)初始化數組的格式如下:

數組名=new數據類型[數組長度];在C#中,可以將數組定義與動態(tài)初始化合在一起,格式如下:

數據類型[]數組名=new數據類型[數組長度];2024/1/1364C#程序設計實用教程

7.2.3一維數組

例如: int[]intArr=newint[5];上面的語句定義了一個整型數組,它包含從intArr[0]到intArr[4]這5個元素。New運算符用于創(chuàng)立數組,并用默認值對數據元素進行初始化。在本例中,所有數組元素的值都被初始化為0。當然,用戶也可以為其賦予初始化值,程序代碼如下: int[]intArr=newint[5]{3,6,9,2,10};此時數組元素的初始化值就是大括號中列出的元素值。2024/1/1365C#程序設計實用教程

7.2.3一維數組

定義其他類型的數組的方法是一樣的,如下面的語句用于定義一個存儲10個字符串元素的數組,并對其進行初始化: string[]strArr=newstring[10];在本例中,strArr數組中所有數組元素的初始值都為“〞。2024/1/1366C#程序設計實用教程

7.2.3一維數組

3.靜態(tài)初始化靜態(tài)初始化數組時,必須與數組定義結合在一起,否那么程序就會報錯。靜態(tài)初始化數組的格式如下: 數據類型[]數據名={元素1[,元素2…]};用這種方法對數組進行初始化時,無須說明數組元素的個數,只需按順序列出數組中的全部元素即可,系統(tǒng)會自動計算并分配數組所需的內存空間。例如:int[]intArr={3,6,9,2,10};string[]strArr={“English〞,〞Maths〞,〞Computer〞,〞Chinese〞};2024/1/1367C#程序設計實用教程

7.2.3一維數組

4.關于一維數據初始化的幾點說明〔1〕動態(tài)初始化數組時,可以把定義與初始化分開在不同的語句中者,例如:int[]intArr;//定義數組intArr=newint[5];//動態(tài)初始化,初始化元素的值均為0或者intArr=newint[5]{3,6,9,2,10};此時,在newint[5]{3,6,9,2,10}這條語句中,方括號中表示數組元素個數的“5〞可以省略,因為后面大括號中已列出了數組中的全部元素。2024/1/1368C#程序設計實用教程

7.2.3一維數組

4.關于一維數據初始化的幾點說明〔2〕靜態(tài)初始化數組必須與數組結合在一條語句中,否那么程序就會出錯?!?〕在數組初始化語句中,如果大括號中已明確列出了數組中的元素,即確定了元素個數,那么表示數組元素個數的數值〔即方括號中的數值〕必須是常量,并且該數值必須與數組元素個數一致。2024/1/1369C#程序設計實用教程

7.2.3一維數組

5.訪問一維數組中的元素在C#中是通過數組名和下標值來訪問數組元素的。在訪問數組元素時,其下標可以是一個整型常量或整型表達式。例如,下面的數組元素的下標都是合法的:

intArr[3],strArr[0],intArr[j],strArr[2*i-1]在實際的程序設計中,也可能導致下標值超越正常取值范圍。如果下標越界,將會拋出一個System.IndexOutOfRangeException的異常。2024/1/1370C#程序設計實用教程

7.2.3一維數組

【例7-1】給定8個數:8、7、6、5、4、3、2、1,將這些數存在數組中,并將其按從小到大的順序輸出。〔1〕定義一個數組,如數組名為QueArrey,并將其用給定的數進行初始化?!?〕遍歷數組,將8個數中最小的數找出來,與第1個位置上的數對調。其方法是:先找出存放最小的數組元素的下標,將其存放在變量temp中,然后將QueArray[0]和QueArray[temp]中的數對調,使QueArray[0]中存放的是8個數中最小的數?!?〕再從第2個數到第8個數中找出最小的數,并按步驟〔2〕中的方法,將最小的數與第2個位置上的數對調,使QueArray[1]中存放的是第2小的數?!?〕依次類推,完成整個排序過程,并輸出結果。2024/1/1371C#程序設計實用教程

7.2.3一維數組

程序代碼如下:usingSystem;

namespaceArraySort{classArraySort{staticvoidMain(){inti,j,temp,m;int[]QueArray=newint[]{8,7,6,5,4,3,2,1};for(j=0;j<QueArray.Length;j++){temp=j;2024/1/1372C#程序設計實用教程

7.2.3一維數組

for(i=j+1;i<QueArray.Length;i++)//從j的下一個元素起開始比較{if(QueArray[i]<QueArray[temp])//比較數組元素temp=i;//使temp為較小的數的下標}if(temp!=j){/*交換QueArray[temp]和QueArray[j]的值,從而可以從所比較的數組元素中獲得較小的婁賦給QueArray[j]*/m=QueArray[j];QueArray[j]=QueArray[temp];QueArray[temp]=m;}}2024/1/1373C#程序設計實用教程

7.2.3一維數組

Console.WriteLine("輸出排序后的結果:");for(j=0;j<QueArray.Length;j++)Console.Write("{0}",QueArray[j]);}}}執(zhí)行該程序后,程序輸出結果如下:123456782024/1/1374C#程序設計實用教程

7.2.3一維數組

注意:〔1〕除了可以顯式地指出數組長度之外,更好的做法是使用System.Array類的Length屬性,數組的Length用于獲取數組所包含的全部元素的個數?!?〕上面所用的排序方法是一種常規(guī)的方法,在C#中,對數組進行排序還有更高效的方法;可以使用Array類的Sort方法完成這個功能。Sort方法有多種的重載方法,常用的形式如下: publicstaticvoidSort(Arrayarray);2024/1/1375C#程序設計實用教程

7.2.3一維數組

【例7-2】給定8個數:8、7、6、5、4、3、2、1,將這些數存在數組中,利用Array類的Sort方法將其按從小到大的順序輸出。usingSystem;

namespaceSortArray{classSortArray{staticvoidMain(){int[]QueArray=newint[]{8,7,6,5,4,3,2,1};//定義數組

//輸出原始數組Console.WriteLine("原始數組:");for(inti=0;i<QueArray.Length;i++)Console.Write("{0}->",QueArray[i]);Console.WriteLine();//進行換行

Array.Sort(QueArray);//對數組排序

//輸出排序后的數組Console.WriteLine("排序以后的數組:");for(inti=0;i<QueArray.Length;i++)Console.Write("{0}->",QueArray[i]);}}}2024/1/1376C#程序設計實用教程

7.2.3一維數組

for(inti=0;i<QueArray.Length;i++)Console.Write("{0}->",QueArray[i]);Console.WriteLine();//進行換行

Array.Sort(QueArray);//對數組排序

//輸出排序后的數組Console.WriteLine("排序以后的數組:");for(inti=0;i<QueArray.Length;i++)Console.Write("{0}->",QueArray[i]);}}}2024/1/1377C#程序設計實用教程

7.2.3一維數組

6.查找元素在數組中查找元素,一是從整個數組中尋找到與給定值相同的元素來,可以使用Array類的BinarySearch方法完成這個功能。二是判定數組中是否含有一個特定的元素,可以用Contains方法來實現?!?〕BinarySearch方法BinarySearch使用二進制搜索算法在一維的排序Array中搜索算法,注意必須是已經排序的數組。如果找到給定的值,那么返回其下標;否那么,返回一個負整數。常用形式如下: publicstaticintBinarySearch(Arrayarray,objectvalue);其中,參數array為待搜索的數組,value為待尋找的元素值。2024/1/1378C#程序設計實用教程

7.2.3一維數組

【例7-3】給定8個數:8、7、6、5、4、3、2、1,將這些數存在數組中,利用Array類的BinarySearch方法返回其中的元素5的下標。usingSystem;

namespaceBinarySearch{classBinarySearch{staticvoidMain(){//定義數組int[]myArr={8,7,6,5,4,3,2,1};

//對數組排序Array.Sort(myArr);

2024/1/1379C#程序設計實用教程

7.2.3一維數組

//搜索inttarget=5;intresult=Array.BinarySearch(myArr,target);//4Console.WriteLine("{0}的下標為{1}",target,result);//4Console.ReadLine();}}}2024/1/1380C#程序設計實用教程

7.2.3一維數組

〔2〕Contains方法Contains方法可以確定某個特定值的否包含在數組中,返回一個bool值。Array類的這個方法實際上是對IList接口中方法的實現,常用形式如下:boolIList.Contains(objectvalue);其中,參數value代表所要驗證的元素值。2024/1/1381C#程序設計實用教程

7.2.3一維數組

【例7-4】判定學生數組arrSname中是否包含“趙六〞。usingSystem;

namespaceContains{classContains{staticvoidMain(){//定義數組string[]arrSname={"大寶","張三","李四","趙六","趙二","麻子"};

2024/1/1382C#程序設計實用教程

7.2.3一維數組

//判定是否含有某值stringtarget="趙六";boolresult=

((System.Collections.IList)arrSname).Contains(target);Console.WriteLine("包含{0}?{1}",target,result);//True}}}2024/1/1383C#程序設計實用教程

7.2.3一維數組

7.把數組作為參數將數組作為參數傳遞可以將初始化的數組傳遞給方法。例如:int[]myArray=newint[]{1,3,5,7,9};PrintArray(myArray);也可以直接將一個初始化過的數組作為參數進行傳遞。例如下面的代碼等價于上面數組傳遞。PrintArray(newint[]{1,3,5,7,9});2024/1/1384C#程序設計實用教程

7.2.3一維數組

【例7-5】演示把一個初始化后字符串數組作為參數傳遞給PrintArray方法。usingSystem;

namespaceParameter{classParameter{staticvoidPrintArray(string[]strArr){for(inti=0;i<strArr.Length;i++)Console.Write("{0}",strArr[i]);Console.WriteLine();}2024/1/1385C#程序設計實用教程

7.2.3一維數組

staticvoidMain(){string[]WeekDays=newstring[]{"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};PrintArray(WeekDays);//把數組作為參數}}}在上面的例子中,主函數Main把定義好的數組WeekDays作為參數傳遞給方法PrintArray,PrintArray方法把接收到的數組元素一個個地打印出來。2024/1/1386C#程序設計實用教程二維數組

在C#中,多維數組可看作是數組的數組,即高維數組。多維數組中的每一個元素本身也是一個低維數組,因此多維數組的定義、初始化和元素訪問與一維數組都非常相似。在多維數組中,二維數組是最簡單也是最常用的數組,本節(jié)主要介紹二維數組。2024/1/1387C#程序設計實用教程二維數組

1.二維數組的定義二維數組的一般語法格式如下:

數據類型[,]數組名其中數據類型為數組中元素的類型,可以是前面定義的各種數據類型;數組名可以是C#中合法的標識符;數組的每一維是用逗號隔開的。例如:char[,]charArr;//定義一個字符型二維數組int[,]intArr;//定義一個整型二維數組2024/1/1388C#程序設計實用教程二維數組

定義多維數組與二維數組的方法相同,只是要根據定義數組的維數確定方括號中的逗號的個數,一般定義一個n(n≥2)維數組,需要的逗號個數是n-1。例如,下面語句定義的是一個三維數組: String[,,]stringArr;//定義一個字符串型三維數組2024/1/1389C#程序設計實用教程二維數組

2.二維數組的初始化二維數組包括兩種初始化方法,即:動態(tài)初始化和靜態(tài)初始化。動態(tài)初始化二維數組的格式如下:

數組名=new數據類型[數組長度1,數組長度2];其中,數組長度1和數組長度2可以是整型的常量或變量,它們分別表示數組第一維和第二維的長度。2024/1/1390C#程序設計實用教程二維數組

也可以將二維數組的定義與動態(tài)初始化合并在一條語句中,格式如下: 數據類型[,]數組名=new數據類型[數組長度1,數組長度2];例如: int[,]intArr=newint[3,2];上例中new運算符用于創(chuàng)立數組,并默認對數組元素進行初始化。在上例中,所有數組元素的值都被初始化為0。2024/1/1391C#程序設計實用教程二維數組

上面的語句定義一個二維數組,其中第1維的長度為3,第2維的長度為2。在二維數組中,第1維常常稱為行,第2維也稱為列。這樣,一個二維數組就同一個二維表格相對應起來了??梢赃@樣理解二維數組:如果只給出二維數組的第1維下標,以一維數組來看二維數組,那么這樣的數組中所代表的是另一個一維數組。2024/1/1392C#程序設計實用教程二維數組

在動態(tài)初始化二維數組時,也可以直接為其賦予初始化值,如下所示: int[,]intArr=newint[,]{{1,2},{3,4},{5,6}};它表示的數組元素的值如表7-2所示。二維數組也可以進行靜態(tài)初始化。例如,下面的語句定義一個2行3列的double類型二維數組,并對其進行靜態(tài)初始化。double[,]doubleArr=new{{1.2,2.3,3.4},{4.5,5.6,6.7}};2024/1/1393C#程序設計實用教程二維數組

二維數組可以進行靜態(tài)初始化。例如,下面的語句定義一個2行3列的double類型二維數組,并對其進行靜態(tài)初始化。 double[,]doubleArr=new{{1.2,2.3,3.4},{4.5,5.6,6.7}};靜態(tài)初始化二維數組時,也必須與數組定義結合在一條語句中,否那么程序就會報錯。而動態(tài)初始化數組時,它們可以分開在不同的語句中。2024/1/1394C#程序設計實用教程二維數組

3.訪問二維數組的元素二維數組也是通過數組名和下標值來訪問數組元素的,二維數組的下標值也是從0開始的。與一維數組不同的是,二維數組需要兩個下標才能唯一標識一個數組元素,其中第1個下標該元素所在的行,第2個下標表示該元素所在的列。如intArr[2,0]代表數組名為intArr的二維數組中位于第3行、第1列的元素。根據二維數組的特點,訪問二維數組中的元素通常需要一個二重循環(huán)。2024/1/1395C#程序設計實用教程二維數組

【例7-6】通過二重循環(huán),將1到16的數賦給二維數組,然后顯示數組的內容。程序代碼如下:usingSystem;

namespaceTwoArr{classTwoArr{staticvoidMain(){inti,j;2024/1/1396C#程序設計實用教程二維數組

int[,]intTwoArray=newint[4,4];for(i=0;i<4;i++){for(j=0;j<4;++j){intTwoArray[i,j]=(i*4)+j+1;Console.Write(intTwoArray[i,j]+"");}Console.WriteLine();}}}}2024/1/1397C#程序設計實用教程二維數組

該程序執(zhí)行后,輸出結果如圖7-1所示:2024/1/1398C#程序設計實用教程二維數組

【例7-7】4個學生4門功課的考試成績?yōu)槿绫?-3所示:現要求出每位學生的平均成績和每門課程的平均成績。分析:可以用一個二維數組存儲學生的成績,二維數組的每一行存儲的是一個學生各門功課的成績,每一列表示的是某一門功課的各個學生考試成績。將某個考生各門功課的成績相加,然后除以課程門數,即為該學生的平均成績??梢远x一個一維數組,用于存儲學生的總成績,然后輸出學號及與其對應的平均成績;同樣可以定義一個一維數組,用于存儲每門課程的平均成績。2024/1/1399C#程序設計實用教程二維數組

程序代碼如下:usingSystem;

namespaceStudentScore{classAveScore{staticvoidMain(){constintPupil=4;//學生人數constintClass=4;//考試科目數int[]Ave=newint[4];//定義一個一維數組存儲學生的總成績int[]ClassAver=newint[4];//定義一個存儲每門課程平均成績的一維數組intSum=0;

2024/1/13100C#程序設計實用教程二維數組

//定義二維數組存儲學生成績int[,]Score={{78,90,85,85},{89,85,90,98},{78,90,89,99},{90,97,98,90}};for(inti=0;i<Pupil;i++){for(intj=0;j<Class;j++){Ave[i]+=Score[i,j];//每位學生成績總分的統(tǒng)計ClassAver[j]=ClassAver[j]+Score[i,j];//每門平均成績的統(tǒng)計}}2024/1/13101C#程序設計實用教程二維數組

for(intk=0;k<Pupil;k++){Console.WriteLine("學生{0}的平均成績?yōu)?{1}",k+1,Ave[k]/4.0);}Console.WriteLine();for(intk=0;k<Class;k++){ClassAver[k]/=Pupil;Console.WriteLine("課程{0}的平均成績?yōu)?{1}",k+1,ClassAver[k]);}}}}2024/1/13

溫馨提示

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

評論

0/150

提交評論